マイコン一覧

やっぱ頭がいい人は違う

 1byteのデータのビットをMSB<->LSBでさかさまにする方法を探していた。ArduinoのshiftOut()だとMSBFIRSTとLSBFIRSTが選べる。けどこれをハードウエアSPIに置き換えたら選べない気がする。(と思ってたが、Arduinoだと選べる。mbedは指定でき無さそう。)

 で、探していると、javaのIntegerクラスのreverseというメソッドが引っかかった。その解説ページもあった。隣同士を入れ替えて、次は2つまとめて隣同士を入れえて、その次は4つまとめてとなり同士を入れ替えて。みたいな感じでbyteなら完了。Integerクラスの実装は32bitの様でもう1こ処理があります。

8bit版を所望していたので、ちょっと削ってみて、Cなので>>>演算子はないので>>に置き換えてみて

byte i = 0b10010111;

i = (i & 0x55) << 1 | (i >> 1) & 0x55;
i = (i & 0x33) << 2 | (i >> 2) & 0x33;
i = (i & 0x0f) << 4 | (i >> 4) & 0x0f;

上記を0bで書くと

i = (i & 0b01010101) << 1 | (i >> 1) & 0b01010101;
i = (i & 0b00110011) << 2 | (i >> 2) & 0b00110011;
i = (i & 0b00001111) << 4 | (i >> 4) & 0b00001111;

 とかで実際にreverse出来ました。すごいなぁ。頭が硬いとループ回したり、変換配列つくったりしてしまう。ただ、Cの場合は算術シフトと論理シフトは実装次第なので、全検証してみないとわからんですね。シフト演算子はわかってしまえば超ベンリかつ速いので下手なループかますより良いですね。
 で、「>>」はArduinoはavrgccなのでunsignedは論理シフト、signedの時は算術シフトみたいです。
 mbedでも大丈夫そう(byteはunsigned intに変えましたが)。ただ、mbedのコンパイラ 0bが通らないみたいでコンパイルエラーでて5分悩んだ。というか0b使えるのはGCCだけなのかも。

 mbedのコンパイラ。インストールしなくて楽ちんなのでオンラインコンパイラをずっとつかっていたけど、そろそろオフラインコンパイラも導入してみても良いかも。プログラムソースのExportをする際にzipファイル以外にいくつかパターンが選択できるのだけど、あれがオフラインコンパイラへのソースだったのかと。


マトリクスLED初回テスト


 動画は2のn乗-1を300ミリ秒毎にシフトしてるだけです。(音はYoutubeが薦めてきたのを適当に採用)

 この数日いじってたマトリクスLEDのシフトレジスタを用いたドライブ。TC74HC595APとかTD62083APGを適当にブレッドボードに配置したのでジャンプワイヤがえらいことになってますが。今回マイコンはArduinoProMini5Vですが、まぁ動いてます。Webサイトでのハードも絡む直接的な情報量だとArduinoの方がmbedより多いかな。なんとなくArduinoユーザのほうがハード寄り、mbedユーザはソフト寄りな感じがする。自分がラズベリーパイを食わないのもこの当たりのバランスかな。でもソフトはそのArduinoをベースにしてmbedに移せば良いし。5Vと3.3Vだけ気をつけて。

 シフトのwaitを外すと、こんな風。
20130218_01
 まぁ、ダイナミック点灯ですね。座学と実際に自分で光らせてみるとではやはり体験に差が出ますね。

 Webで関連サイトを見てるとArduinoベースだとshiftOut()が遅ようですが、最終的にはmbedにするので、まぁ大丈夫でしょう。駄目なら横方向はSPIを使うまでだ。
なんせシフトレジスタを使えばシリアル、クロック、ラッチの3本の線で大量のLEDをドライブできるので面白いですね。

 次のお試しは8×8を2個連結です。明日aitendoさんからちょっと小ぶりの100円の8x8LEDが届く予定なので、それで実験ボードを作ります。到着予定のLEDは2.5mmピッチのワイヤだけど無理やり2.54mmピッチのブレッドボードに入れます。8ピンx2だからなんとかなるはず。


大量のマトリックスLED到着

20130213_01

 秋月さんからマトリックスLEDが到着。全部に説明書が入ってるし、静電気防止ボックスに入っているからから大きな袋です。一時期似たようなのを100円で売ってた時があるみたいだけど、1個200円です。12個で2,400円。でもVFDだと桁が一桁違いますから。aitendoさんだと1個190円で買えます。けど今回はAVR Dragon用のZIFソケットやATmega168Pも買ったので。
 正直な話、コレとコレのパーツを買うので送料を考慮して一番安いのは何処だろうと計算してくれるサービスがあったら良いね。パーツの種類はとても多いので大変ですが。在庫との兼ね合いもあるし。

20130213_02

20130213_03

 マトリックスLEDは横長基板に配置して行く予定。1枚で4個くらい刺さりそう。っても2枚しかこの基板買ってないけどね。同じ基板をもう1枚在庫で持ってたのです。これで12個行けそうです。

 んでもって、シフトレジスタは別の店で頼んだので、明日到着予定。まだ遊べません。まぁ、1個あたり8+8の16pin使ったドライブで遊んで見ることは可能。ATmega168Pも10個調達したのでマトリックスLED1個毎に1マイコンでDotsduinoみたいに扱うことも可能ではある。やり方はいろいろあるですね。

 これで夏までいろいろ遊べそうだ。っかもうパーツ(あんまり)買えません。


ニュース電光板の前途多難とXBeeのCyclicSleep時の送信先(未検証)

 
 「マトリックスLEDを並べて電光掲示板を作ろう」なんて軽く考えて(かつLED発注して)しまったが。恵梨沙フォントですら60Kbyteくらいあるわけで。どうするかね。美咲フォントって7×7のもあるようだけど、一部記号は8×8になる様で、文字間の見やすさは改善されるけどデータサイズ的には8×8で同じかなと。気分で切り替えるとして。あー、恵梨沙フォントの名の元となった恵梨沙さんは偶然今日が誕生日のようですね。

 mbedならフラッシュ領域においてLocalFileSystemでfseekアクセスするか、i2cやSPIのEEPROMを使うか。 ただ、表示するネタのニュースや天気予報を今時のWebAPIでGetしてくるとすると、文字コードはUTF8な訳で。文字コードとフォントデータの結びつけにこれまたデカいテーブルが必要になるのでは?と。フォントデータをあらかじめUTF8で配置したりするとどでかいデータになってしまうし。検索したらLocalFileSystemでfseekしてる例はあったね。こういうのやるのはアジア圏だけだしねぇ。こういう時128 or 256個で文字が収まる圏がうらやましいかな。

なら、いっそAWSのサーバ上で、

  1. ニュースサイトのWebAPIから取得。
  2. JSONかXMLなので欲しい情報を抽出。
  3. UTF8からSJISに変換。
  4. SJISのコードでフォントデータ引当。
  5. フォントデータをmbedへ返信。

などと、やらせて、表示すべきフォントのバイナリーデータだけもらって、マイコン側はスクロール表示処理のみ担当するのも有りかなと思った。スクロールはリングバッファみたいなのを作るか、ハードウエアでやるか?でもマイコンのソフトでやったほうが表示方法変えられて良いかなと思う。

 あと三連休初日のXBee関連でやり残したことがある。

 CyclicSleepで入力ポートの値を定期的に送信する場合、送信先はそのPANのコーディネータ(親)だけだと思い込んでいた。
 でも、アドレス指定も出来そうなので、同一PANのルータとかにも送れるんじゃないかと思うわけで。そうすれば、XBeeが1個浮く。

 まだ、開いているXBeeは3つ以上あるので、擬似環境でテストしてみようと思う。但し期限は未定です。


雨センサーをマスタコントローラへつなげる

20130209_01

 上記の図の事をやるべく午後作業。

 肝は異なるPANIDのXBee2つをゲートウエイする事。
 ATmega328PにはUARTは1つしかないので、それはRAINセンサのpushを受けるXBeeに使う。
で、もう一つマスタコントローラからのデータ要求を受けるXbeeはソフトウエアシリアルにて実装。xbee-arduinoのライブラリのRelease 0.4 (beta)でソフトウエアシリアルに対応してる。
 で、いろいろ試行錯誤した挙句、Aruduino1.0以降の標準ソフトウエアシリアルでは動かす事が出来なかった。xbee-arduinoのRelease 0.4で使用推奨のAltSoftSerial Libraryを使って無事正常動作。このAltSoftSerialはピンが8,9と決め打ちだが、他のピンは別途Aruduino1.0以降のSoftwareSerialでの併用が可能。それはデバッグ用のコンソールに使用した。printfデバッグを馬鹿にする人がいるけど、printfすら出来ない環境だと、1ポートにLEDつないで点滅パターンで判断とかしたり苦労するので、printfが出来るのは大事。Arduinoだとprintfではなくprintだけど。
 AVR Dragonも購入したのでdebug wireでのデバッグも試してみたいですね。

20130209_02

 基本的な動作は確認出来たので、実機に移すべくベランダ気象センサの実機のソフトウエアを変更です。雨センサのコーディネータのXBeeは、今はXBeePROにRPSMAアンテナを付けて室内にあったのだけど、ベランダに設置になって距離も近くなるのでチップアンテナのXBeeに入れ替えたい。コーディネータを入れ替えるので雨センサ系のXBee ネットワークの再構築作業も入ります。って然るべきコマンドをXBeeに送るだけだと思うけど。
 でも、よくわかららなくてPAN IDを変更しました(苦笑)。コーディネータのリセット方法は今後の課題だなぁ。あと、PushタイプのioSampleで、送信先をコーディネータでなく特定のアドレスのXBeeへ送る方法が無いか調べたい。そうすれば1つのネットワークにまとめられて、気象センサ兼ゲートウェイのXBeeも1つで済むから。

 んで、夜にマスターコントローラのmbedのプログラムを改修して対応しました。これにて一旦落着ですね。雨センサの精度はおいておいて。結露センサを買うか、転倒ますにするか。転倒ますだと大掛かりかつ常にカウントしてないと行けないのでそのIC類の電源をどう確保するかが鍵です。

 次はクリスマスイルミの基板作成に戻ります。


XBeeのテスト用コマンド送信機

20130208_01

 最初はProcessingとxbee-apiライブラリで考えてましたが、javaがめんどくさい。
なので、mbedでサクッと自前のコードを元にちょちょいと書き換えて作成完了。
 自分的にはjavaはなぜか鬼門だなぁ。言語云々でなく経験レベルの違いだと思う。
C, C++, PHP, Rubyとかは大丈夫です。