2011/12/04

擬似乱数、rand()もどき

,
Cで乱数を発生させる場合、特に精度を求めなければ、普通はrand() (<stdlib.h>)を使うことになります。が、もっと簡単なのでいい、という場合もあります。探してたら見つかったのでメモです。

これ:PICを使い乱数を発生させてLEDをランダムに光らせたいのですがプログラムがよくわ... - Yahoo!知恵袋

ちなみに、Attiny13Aでstdlib.hのrand()だと780byte程だったのが、上で紹介されてたrand()にしたら400byte弱になりましたとさ。ただまあ、まだ試してはいない←
Read more →

[電子工作]AVRの逆アセンブラ、avr-objdump.exeを使う

,
 AVRの逆アセンブラ、avr-objdumpの話です。

 WinAVRでプログラムを書いていて、「どうしてこんなメモリを喰うんだろう?」と思う時がありました。Cのコードを少し変えただけなのに、です。こんな時は、コンパイル結果である機械語のコードが全く違っていたりするので、確認のためにアセンブリのソースも見ないといけません。となると、逆アセンブラの出番になります。

 …前置きが長いですが、AVRの逆アセンブラ、「avr-objdump.exe」についてのメモです。
 この実行ファイルのオプションを知るには、avr-objdump.exeのmanを見て頂くのが早いです。一応、コマンドラインでただavr-objdumpと入力しても、オプション一覧が出ると思います。下にオプション一覧の画面を貼ってきます。

avr-objdump.exeのオプション一覧

 逆アセンブラを吐き出すためには、一旦C/C++で作成したプロジェクトをMake Allし、できたファイルのうちのオブジェクトファイル(拡張子は.o、大抵main.oとか)が必要です。コマンドラインで、avr-objdump -S main.o とすれば、逆アセンブラのリストがずらーっと並びます。テキストファイルなどにしたい場合は、avr-objdump -S main.o > dump.txtなどとすれば、そのディレクトリの中にdump.txtが作成され、以下のように逆アセンブラが出力されます。

逆アセンブラした結果(サクラエディタで閲覧)

 ちなみに私の場合、_delay_ms()がメモリを消費していたみたいです。直接の原因かは分かりませんが、公式には「The maximal possible delay is 262.14 ms / F_CPU in MHz.」と書かれているので、あまり大きな引数(400とか)にするのは考えものですね… 
Read more →

2011/10/21

[電子工作]TEA5767搭載FMモジュールを、Arduinoから動かす

,
 Arduinoから、aitendoから発売されているTEA5767モジュールを動かしてみました。
 TEA5767はFMレシーバICで、I2C or SPI機能を持つので、スレーブとしてマイコンに接続することができます。しかし、aitendoのモジュールは、最初からI2C専用の設計になっています(PinがSDAとSCLしかない)。なので、今回は、ArduinoからI2C経由で制御します。

 ところでこのモジュール、アンテナ端子がイヤホンのGNDと100Ωで繋がってる気がするんですが、これってどうなんでしょう?ELMさんのMP3プレーヤーの作例では、イヤホンアンテナとするためなのか、RDA5800のアンテナ端子とイヤホンのGNDを1pでつないでるみたいですが。アナログ高周波回路、よくわかりません…

配線

I2Cのバス2本、Vcc、GNDをArduinoに接続します。Arduino Duemilanoveの場合、
SDAはAnalog 4
SCLはAnalog 5
です。

コード

以下にコードを置いておきます。参考程度にどうぞ。
 内容は、指定した周波数を受信するようにさせるだけのシンプルなものです。各パラメータは、データシートのp11-p17あたりが詳しいです。
 設定するPLLの値は、このサイトさんに、周波数との対応表があるので参考にさせて頂きました。

#include <Wire.h>

//82.5 NHK-FM 2772
//81.3 J-WAVE 26DF
//write addr
const int addr = 0b1100000;
const char data1 = 0x27;
const char data2 = 0x72;
const char data3 = 0x10;
const char data4 = 0x36;
const char data5 = 0b00000000;

void setup()
{
  delay(1000);
  
  Serial.begin(9600);
  Wire.begin();
  //Serial.print(Wire.requestFrom(addr, 5));
  Wire.beginTransmission(addr);
  //Wire.send(0b11000000);
  Wire.send(data1);
  Wire.send(data2);
  Wire.send(data3);
  Wire.send(data4);
  Wire.send(data5);
  Wire.endTransmission();
  Serial.print("end");
}

void loop()
{
}

悩んだこと

Wire.beginTransmission(addr);
のaddrは0~127までの値です。I2Cのアドレスは大抵Lower bit(LSB?)が0か1かでRead/Writeの判断をすると思うのですが、この場合その最下位1bitを切り捨て、残り7bitを右シフトさせ0~127の範囲に収めてaddrに指定するみたいです。詳細は公式リファレンスをどうぞ。

「Wire.beginTransmission(addr);はアドレスをI2Cバスに送るか?」
実はここでかなり悩み、時間をとられました。何しろアマチュアなので原因の切り分けがなかなかできません。
日本語リファレンスには、「指定したアドレスのI2Cスレーブに対して送信処理を始めます。」とあります。
実際、TEA5767はI2Cの場合、addr, data[0], data[1], data[2], data[3], data[4]の6byteをたてつづけに送る必要があるみたいですが、Wire.send()を用いてaddrからもう一度送ると、上手く動きません。どうやら、Wire.beginTransmission()では特定のスレーブを受信体制にするために、I2Cバスにaddrを送信すると思うのですが、どうなんでしょう…。
Read more →

2011/09/01

C#でマンデルブロ集合を描いてみた

,






















練習がてら書いてみました。だいたい3時間。
マンデルブロ集合たん綺麗だよ'`ァ,、ァ(*´Д`*)'`ァ,、ァ
マンデルブロ集合は複素数を扱うので、複素数クラスを探したのですが、公式だと.Net Framework4からしかComplexクラスが入ってないので、しょうがないので自分で書きました。ぐぐっても複素数クラスをジェネリック?を使ったりして「如何に上手く作るか」説明してあるサイトはあったのですが、初心者向けの簡単なクラスは見つかりませんでした…(´・ω・`)
正直こういうところは動作が確実な、そして俺でも読める(重要)ライブラリを拝借するのが一番楽で確実と思うですよ?

コードの解説。

1) 色
Wikiには、マンデルブロ集合の周りも発散の速度で色分けしてあります。よって、発散まで(Infinityがtrue)のループ回数で判定してますが、結構シビアです。大抵は殆ど直ぐに発散します。集合の境界あたりは発散までの回数が急激に変わるみたいです。

2) delegate
マルチスレッドじゃないと重くてやってらんねーので、UIを弄るときはマルチスレッド特有の処理が必要です。ここらへん素人なので他のサイトをあたってくだしあ

3) ループ回数
今のところ10000回です。どっかのサイトに10000回って書いてあるのを昔見た気がする、それが全て。

4) 複素数クラス
長くなったので別の投稿にするかもですね。
Complexとある所は全て自分の複素数クラスです。

5) UI
WindowSize : width 480, height 480
Button1 : これを押すとDrawします。
Label1 : ループが何回目かを表示します。
えっと、参考にしてください。

ええと、C#について幾つか今日はじめて知ったことを。
(´ー`)oO(この言語進化するの早すぎだろ…)

1) checked, unchecked
これを書くとOverflowがごにょごにょ こちらのリンク先に詳しい説明がありました。

2) doubleはOverflow Exceptionを投げない
これも上のリンク先に(ry

3) Double.IsPositiveInfinity(), Double.IsNaN()
doubleがOverflowするとInfinityという値を取ります。ここらへんはMSDNのDoubleに詳しく書いてあります。で、それの判定はDouble.IsPositiveInfinity(double d)です。NaNについても同様。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;    //Threadクラスで必要

namespace WindowsFormsApplication43
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Thread t = new Thread(
                delegate()
                {
                    for (int x = 0; x < 480; x++)
                    {
                        //中央は(240, 240)
                        double __x = x;
                        double _x = (__x - 240.0d) / 240.0d;

                        for (int y = 0; y < 480; y++)
                        {
                            double __y = y;
                            double _y = (__y - 240.0d) / 240.0d;

                            Complex v = new Complex(_x, _y);

                            //発散しない
                            if (IsDivergence(v) == -1)
                            {
                                if(this.IsHandleCreated)
                                {
                                    this.Invoke(
                                        (MethodInvoker)delegate()
                                        {
                                            Graphics g = this.CreateGraphics();
                                            g.FillRectangle(Brushes.Black, x, y, 1, 1);
                                            g.Flush();
                                            g.Dispose();
                                            label1.Text = x.ToString();
                                            label1.Show();
                                        });
                                }
                            }
                                //早い発散
                            else if (IsDivergence(v) > 0 && IsDivergence(v) < 40)
                            {
                                if (this.IsHandleCreated)
                                {
                                    this.Invoke(
                                        (MethodInvoker)delegate()
                                        {
                                            Graphics g = this.CreateGraphics();
                                            g.FillRectangle(Brushes.Aqua, x, y, 1, 1);
                                            g.Flush();
                                            g.Dispose();
                                            label1.Text = x.ToString();
                                            label1.Show();
                                        });
                                }
                            }
                                //中くらいの発散速度
                            else if (IsDivergence(v) >= 40 && IsDivergence(v) < 70)
                            {
                                if (this.IsHandleCreated)
                                {
                                    this.Invoke(
                                        (MethodInvoker)delegate()
                                        {
                                            Graphics g = this.CreateGraphics();
                                            g.FillRectangle(Brushes.Blue, x, y, 1, 1);
                                            g.Flush();
                                            g.Dispose();
                                            label1.Text = x.ToString();
                                            label1.Show();
                                        });
                                }
                            }
                                //遅い発散
                            else
                            {
                                if (this.IsHandleCreated)
                                {
                                    this.Invoke(
                                        (MethodInvoker)delegate()
                                        {
                                            Graphics g = this.CreateGraphics();
                                            g.FillRectangle(Brushes.RoyalBlue, x, y, 1, 1);
                                            g.Flush();
                                            g.Dispose();
                                            label1.Text = x.ToString();
                                            label1.Show();
                                        });
                                }
                            }
                        }
                    }
                });
            t.Start();
        }

        private int IsDivergence(Complex initval)
        {
            //初期値
            Complex z = new Complex(0.0d, 0.0d);  //z0 = 0

            for (int i = 0; i < 10000; i++)
            {
                z = z * z + initval;
                //catch (OverflowException ex)
                //{
                    //発散
                //    return true;
                //}

                if (Double.IsPositiveInfinity(z.re) || Double.IsPositiveInfinity(z.im))
                {
                    //発散
                    return i;
                }
                else if (Double.IsNaN(z.re) || Double.IsNaN(z.im))
                {
                    //発散
                    return i;
                }
            }
            //発散してない
            return -1;
        }
    }
}
Read more →

2011/08/13

うつくしい基板

,
Read more →

2011/04/25

フィラメント管 ИВ-9

,
Nixie-tube.comさんから、新商品のフィラメント管 ИВ-9を買ってみました。ニキシー管と違い、4V程度の低電圧でも点灯できるのが魅力的です。しかしなんといっても、今のLEDデバイスにはない、温かな光に魅せられました。
時計にしようかと思っています。


Read more →

2011/04/07

WARNING: Application does not specify an API level requirement!の対処法[Android SDK]

,
タイトルの通りです。Androidアプリを開発しようとしたら、
WARNING: Application does not specify an API level requirement!
とでて、エミュレータでアプリが起動できません。

Google先生によると、AndroidManifest.xmlで<uses-sdk>の値を設定すればいいみたいです。

以下のブログが参考になりました。
はじめてのAndroidを読み始めました - So Many People, So Many Different Ideas
http://d.hatena.ne.jp/skelton_boy/20091007

リファレンスは
<uses-sdk> - ソフトウェア技術ドキュメントを勝手に翻訳
https://sites.google.com/a/techdoctranslator.com/jp/android/guide/manifest/uses-sdk-element

APIレベルの設定は、
1. Android API レベル - ソフトウェア技術ドキュメントを勝手に翻訳
https://sites.google.com/a/techdoctranslator.com/jp/android/appendix/api-levels
を参考にしてください。自分はAndroid 2.2をターゲットにしたアプリ(Hello,worldだけど)をつくっていたので、API Levelは8にしました。
Read more →

2011/03/18

そういえば。見た夢。

,
※長いです><
そういえば。
思い出して、考えれば考えるほど不思議な俺の夢。
殺人犯の異様な多さと、何回も死んでること。でも実際に体験したことはないし、死ぬ時の主観的なイメージがないから、夢で死ぬ瞬間に嫌でも起きるんだよね。
後、よく地図が出る->多分昔からよく地図を見ていたから。
俺の夢内での死因第2位は溺死->表面しか見えなくて、中が見えないことに恐怖感を持ってるから。
よくある:旅館の3階とかはみんな居るのに、何故か階段降りて地下に行くと殺人鬼かなんかがいて追いかけられるって夢->現実でも似たようなこと考えてますんで。

①夢その1

小さな、山にあるお寺にダッシュで登って、帰りは2方向の下りエスカレータがあって、安っぽい看板(薄い群青に黄色文字)でお帰りはこちら。みたいなのがあって。
で、山を降りた所に広場があり、消防隊が構えてて、なんかの模擬演習してて、赤いコーンに黄色と黒の警戒色ロープ貼ってて。
広場の反対側には武家屋敷か平城みたいなのがあって。で、そこにいた車が最新機器を積んでて。
(こっからあやふや)で、そこで危険だよ!という警報がその街に発令されて、怯えて逃げようとして目が覚めた。

②夢その2

また別の夢では、徒歩でしか行けない(モデルが雲取かなんかの実際にある林道、行ったことある。が、三条の湯ではない)、林の中の林道を母が強引に車で行く夢で。何故か行きは事故らなくて。
その林道は倒木などで通行止めになってて、一部の登山者が使う感じで、道は茶色い落ち葉で覆われてて、ところどころに倒木があって。だから林道と周りの林の境が見えなくて。まだつかねーのかなつかねーのかなと思ってて。
で、急なヘアピンカーブがあって、どう考えても曲がりきれなくて落ちてたんだけど、何故か落ちずに進めて。
で、其の次のなんでもないカーブで案の定林に突っ込んでごろんごろんと落下。何故かこの時は第三者視点、車の落ちる様を上から見てた。
で、ここからが奇妙なんだけど、車が落ちたところがコンクリの1m位の石垣?の先が平野になってて、で、そこで車が止まって。
林の無効にはかすかに車が止まってるのが見えて。ようやっと林道の始点に返ってこれた!と思って、車を見たら俺の車じゃなかった…

最近見た夢なんだけど、不思議というか怖い。

あービデオで見たからあのダム湖周りの酷道か?
急なヘアピンカーブなら、黒森鉱泉のあたりもあり

③夢その3

保谷農園(分かる人にはわかるっす)のでかい木のある広いところで、竹で周りを囲んだ、白い、棒高跳びの後着地するマットみたいなのがありまして。
その上で何故か学園祭のタメの飾り付けしてたらなんかの事故があって、で、俺はそのマットの下敷きになり、土埃のなか多分死んだwww夢のなかでwww

なんでって今でも思うが。

④夢その4

小仏峠みたいな、峠越えの地形がありまして。
峠を超えて、神奈川側の方を思い浮かべてと有難や。峠超えてから、さらに本線沿いに進む方はまあまあ人口が多いんだけど、逆方向(⇔峠方向)は凄く寂れていて。
そっち方向のバスに乗ったら案の定俺一人で。で、終点降りると、農家が1件と畑だけという有様で。たしかこの時夕暮れだったと思う。

あ、夢は此処で終わりです。オチ無し。なんかその農家に普通のおばあさんがいて。でも殺人鬼で、ダッシュで帰りのバスに乗ったけどその人も乗ってきて、ってのがなくもない。

⑤夢その5

スキー場の夢。凄く急な斜面を、こんなの無理だろwwwとか思いながら、上から人が降るのを見てた夢もあった。
因みに、その急斜面は60°~位で、モーグルみたいで、コブの前後は90°近くあった。

⑥夢その6

さらに別の夢では。
東京都の山奥にいて。で、そこには古びた家々が並んだ集落があって、ある家の扉を開けると…っつ…うわああああああああああああああああああああ

あ、冗談です。でもその集落が~の下りは本当で。山奥の設定なのに、集落は高井戸にあるっていう脳内設定、らしい。だいたい9軒くらいが集まっていて、集落の入口こそ明るいけれど、集落自体が高い木に囲まれているので薄暗くて。で、俺はその集落を奥に奥に入っていって。あやふやですが、もしかしたら一番奥の家で長老と挨拶したかも。で、その集落のどっかに殺人鬼がいて、それを追って入ったのかな?でも逃げてた気もします。ああ思い出すだけで怖い。

⑦夢その7

ええと、この夢では、東京の山奥なのに、車で帰るときの夢で、変えるときに北側に、木の間からでっかい、綺麗に雪化粧した山が見えました…

⑧夢その8

別の夢では、同じ上の夢に出てきた東京の村のキャンプ場で、でもキャンプ場が林の中で薄暗く、「ここガス溜まってね?」と思った。で、そのキャンプ場の隣に廃屋みたいなのがあって、で、そこに殺人鬼いるんじゃねみたいなことを思って、で、起きたwww

⑨夢その9

船が港についたあたりで、何故か次の瞬間体が港に落ちてて。その港は海が黒く、油がところどころ浮いてたりして汚くて。で、周りの岸壁にコンテナが並んでたりするのを見ながら必死に泳いだ気がする…

⑩夢その10

昼間、廃墟のマンション(中は海軍学校みたいなのだった)にいて、外観は母校の小学校に似た、白で窓の上下に横の出っ張りがあるかんじ。で、歩いてたら木の廊下が崩れていって。気づいたら、その外の窓の下にある出っ張りの上にたってまして。出っ張りは幅が10cmくらいしかなく、落ちたら2~3階下の廃材置き場に落ちて多分死ぬ。という有様で、窓3こ先の、マンション入り口にある寂れた簡易レストハウスの隙間まで歩かないと助からなくて。で、案の定落ちて、その瞬間に起きた。
怖い夢でありました…

⑪夢その11

天竜川みたいに、深い山間を電車が走っている場所での夢。天気が大雨。車が何台も立ち往生してて、並走する道路が冠水とか橋が落下とかで使えなくなったので、何故か近くの駅から線路沿いに歩くことに。確か俺一人。で、鉄橋の橋ってのが、枕木のあいだは隙間なので下に落ちてしまう。だから隣の保線用通路を歩くんだが、下が濁流でめちゃくちゃ怖い。気がついたら吊り橋(すんげー細い)の上にいて、高所恐怖症なので前になかなか進めない。数歩行ったとこで落ちて濁流に飲まれる寸前に起きる。


⑫夢その12
確か増水した川で流された。助かりそうになったことが何回か。3回ぐらい、岸に運良く助かったけど、また流されるってオチ。

⑬夢その13
別の川で、エイト(ボートです)のメンツとして集合場所行こうとしたんだけど、天候の悪化で、川が増水、その川が何故か周りから100m程低いところを流れてて、増水した濁った緑色の濁流の中で、てんやわんやの中流された。終わり。

番外編

因みにアタクシの覚えている最古(多分)の夢は、
赤い原爆みたいなのに追われてて、暗い(空の地平線近くはほのかに赤くなってた)街の中を、一人で走りまわって逃げるというもの。冗談抜きにその当時は衝撃的すぎて怖かった。

長いエントリーですみませぬorz
もし皆さんが不思議な夢を見たら、こんなかんじだったよ!とコメントをいただけると幸いです。
Read more →

2011/03/09

[雑記]Vaio Pを買った

,
※元のタイトルは「ついに ねんがんの Vaio Pを てにいれたぞ!」でした。

 VAIO Pを買いました。で、今日届きました。

感想
・Shiftキー右が小さいのは意外と問題ない。問題なのは、普通なら『半角/全角』があるとこに大きな1キーがあること。慣れるまで時間かかる…
・輝度と音量はFn+F3、F4、F5、F6で頑張って調整する。
・文字の解像度は90dpiから120dpiにして、文字サイズを物理的に大きくしないと、とても目が痛い。
・ドラッグボールのクリックの感度がよすぎて使いにくいので、思いきってクリック無効にしました。大して不便でもないので、このまま使ってみます。

ちなみに、Eclipseを開くと
Vaio PでEclipseを開いたところ。
こんな感じになります。画面も小さいのですが、それ以上に動作がいちいち重いです。やはり、ただでさえ重いEclipseをAtom搭載モバイル機で使うのは、ちょっと無理がありそうです…。
Read more →

[電子工作?]最近したこと、他

,
 小沢電気商会、閉店してしまうのですね。蛍光表示管やらニキシー管やら、貴重なデバイス入手先だったのに…
とりあえず、閉店の話を聞いて行ってみたら、表のショーケースで見つけました!
TCD103D ラインイメージセンサ

この動画で使っていたので、どこで手に入れたんだろう?と疑問に思っていたら、あっさりと棚に鎮座してました。店員さんが、これを買う客は数年ぶりだとかおっしゃってました。

トラ技の付録電源基板
他には、トラ技に昔ついていた電源基板に部品を取り付けるとか。VRが高くて凍結中
カプトンテープを買ったり。
カプトンテープ届いた。
 そういえば。昔、現品.comというジャンク屋がネット通販でありました。どの商品も10円といった格安価格が設定されていました。中にはPCIに挿すタイプの産業用マザーとか、掘り出し物もたくさんあった気がします。生憎、自分はここで買ったことはないですが(当時小学生だった私には、ネット通販はちょっと無理だった)、縦にずらっと並んだ商品リストを、一日中飽きずに眺めていたものです。
 そんな現品.comでしたが、いつの間にかサイトは閉鎖され、今では話すら全く聞きません(2chのスレはありますが)。

 そんな折、小沢電気商会さんの閉店の話を聞きました。小沢電気商会も、軒先のショーケースにはニキシー管や古い真空管などが並んでいて、周りにはジャンク基板などが積まれてたりする、なかなかアレなお店でした。カウンターの奥には、「誰が買うんだ」と思うような古い半導体が大量にあって、古い雑誌記事で指定された部品を探すときに重宝したものです。こういったジャンキーな雰囲気の店構えだったので、ここを訪れることが、秋葉原の楽しみの一つになっていました。なので、閉店と聞いて少し残念に思います。うーん、昨今はマイコンブームですが、ジャンク品に魅力を感じる人は、かえって少なくなったのしょうか?
 ここだけに留まらず、「世界一の電気街」と称していた秋葉原も、秋月電子や千石通商は毎日盛況なものの、個人経営の部品屋が並ぶラジオデパート/ラジオスーパーでは、シャッターが降りているのを見ることが多くなった気がします。個人的には、そういうお店を見て回り、店主さんと会話するのが楽しみでもありました。インターネット通販で何でも揃う時代ですから、「わざわざ秋葉原に行き、頑固な店主に在庫があるか訪ね、歩きながらいろんな店を周って部品を集める」ということをする人なんて、もう少ないということなんでしょうか。

 関係無いですけど、私が最初にハンダ付けしたのは、2色LEDに抵抗2本と電源線を付けただけの、今から考えればお粗末なものでした。それでも、自分の計算した通りの電流値になったり、色の変化を自分の好きにできる(2色LEDですから)のは、とても新鮮でした。どうかあの時の気持ちを忘れないようにしたいです。
Read more →

2011/03/08

[雑記]HDD増設

,
 新しい外付けHDD買いました。

構成
HDD:Seagate SATAⅡ ST31000528AS 1TB 32MBキャッシュ 7200rpm \4380(TSUKUMO eX.)
ケース:玄箱 GW3.5AI-SUP/VB \2180(ビック)


 1TBでも3.5インチ内蔵型は5000円切ってて、安くなったものですね。一昔前は(略。そうそう、TSUKUMOで買ったとき、レシートと共にポイントカードを渡されました。「そんな気軽に発行できるものなのか」と思ったり。
 玄箱ケースの組み立ては10分位で終わります。ただ、HDDを外ケースに収めるときがちょっと怖い。
割り当ての図
割り当ては、500Gごとに1つする予定。パーティション割り当ては初めてだったので、Google先生のお世話になりました。ちなみに、[コンピュータ]を右クリック→[管理]→[記憶域]の[ディスクの管理]で初期化した後、新しいシンプルボリュームを割り当てることができます。

ドライブが増えた
そんなこんなで、新しいドライブが増えました。しかし、代償としてフォーマットに半日取られた。
Read more →