Arduino一覧

キーボード配列変換機テスト

20130330_01

 手持ちのデバイスでテスト。Sparkfunの新しい方のUSB HOSTシールドとArduino microにて。
なんかうまく動かない。
 Arduino microをやめて秋月のArduino互換機で試してもおかしい。キーボードを変えてみたら文字コードを受信するようになった。それまでは場所が狭いからテンキーレスのUSキーで試していたのだった。
 でも、Arduino microに戻すとうんともすんとも。なんでだ?

20130330_02
 今朝方緊急発注しておいたArduino Leonardoと、白い基板の本家と同じ回路であろうUSB HOSTシールドが届いた。SparkfunのUSB HOSTシールドは電源周りとか微妙なのです。で、届いたこいつらで試したらUSキーボードのキーコードをサクサク受信。同じように会社から日本語キーボードのノートPCを貸与されて困っていた人の記事のコードもサクッと動いた。一安心。

 あとは、自分用のカスタマイズ。自分がいじれるPCではのどかをインストールしてCAPSロックをIMEのトグルに、SHIFT+CAPSLOCKをCAPSLOCKにしているのでその対応をすればOK。しかしうちにはキーコードを検証する日本語キーボードはツレのPCにしかないのだった。
 完成まではもう少し。で、ツレから日本語キーボードを借りて、キーコードを調べてとかして、なんとか自分の使えるようなものができたっぽい。

 明日は早朝か日曜なのに仕事です。っかなんでこんなことしないといかんのかなぁ。しっかりしてくださいよ>親会社。手に馴染んだ万年筆を使いたいけど、会社が文具量販店のボールペンの配給だけでなく使用を強要するというような感じなのですかね。
 うまく行ったら、基板起こして小型化して頒布とかするかも。ってか同じようなことはMakeTokyoMeeting2012の時にやったらしい方が要るんだよね。その時は我が身にこんな事が振りかかるとは思ってなかったのでスルーしてたのに。今だったら速攻で頒布受けてる。

 まぁ、英語キーボードを使おうなんて、プログラムを書かない、最初から日本語キーボードしか使ったことが無い人ならまったく気にもならないことですから。海外旅行して気づくくらいかな。


sanguinoでのLANテスト

20130326_01

 sanguinoにWiznetのWiz820ioを接続して、DHCPで取得したIPアドレスをオクテット単位でLEDに表示する実験。
 まずはLEDは使わずに、シリアルコンソールに出力するプログラムで。
 DHCPで取れない。
 おなじWiz820ioをArduinoにつないだらちゃんとIPアドレスがとれるのでWiz820ioの動作不良ではない。

 sanguinoのSPIのライブラリのソースを読んでみても、MISO,MOSI,SCKは大丈夫そう。ただどうもSSが怪しい。どこで指定してるのか?固定か?
libraries/Ethernet/utilityのw5100.hが原因でした。

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  inline static void initSS()    { DDRB  |=  _BV(4); };
  inline static void setSS()     { PORTB &= ~_BV(4); };
  inline static void resetSS()   { PORTB |=  _BV(4); };
#elif defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB162__)
  inline static void initSS()    { DDRB  |=  _BV(0); };
  inline static void setSS()     { PORTB &= ~_BV(0); };
  inline static void resetSS()   { PORTB |=  _BV(0); }; 
#else
  inline static void initSS()    { DDRB  |=  _BV(2); };
  inline static void setSS()     { PORTB &= ~_BV(2); };
  inline static void resetSS()   { PORTB |=  _BV(2); };
#endif

こんな感じでAVRのタイプ別でマクロになってる。sanguinoでもdigital2のピンをssに接続すれば動いたわけですが(あとで再現テストしたらちゃんと元のcodeでもdigital2ピンなら動きました)。SPIのMISO,MOSI,SCKの3セットのピンの横のdigital4を使いたかったのでちょっと書き換え。
最初の行を

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644P__)

に変えて無事目的を達成しました。さすがArduino非公式のsanguinoなのでこういうことは多々あるでしょうね。

 あとはLEDに渡すようにIPアドレス文字列から数値に変換しつつフォント配列を引っ掛けつつで完成。

 ただ、Sanguinoでネットが使えるなら、現在mbedにやらしてるセンサーマスターコントローラをSanguinoに変更しても良いかなと思う。RTCがないとかシリアルが2つしかないとかありますけど、XBeeはSoftwareSerialでも何とかなるし。どうせなら液晶を20×4のキャラクタ液晶から128×64のグラフィック液晶に変えてみたりとか。ARMでなくてAVRだけどムチ打ちますねぇ。ちょっと検討してみます。


今日はsanguinoのテスト

20130324_01

 14:00くらいまでは、昼ごはんを買ってきて食べたり、エーハイムのサブストラットを洗ってみたりしてた。

 その後、Sanguinoのテスト。

 まず配線図をFritzingで描く。実物で配線してみる。Lチカを送る。動かない・・・。

 一旦ATmega644Pのブートローダの焼き直しにかかる。ArduinoIDEが1.0.4に上がっていたのでそれを落として環境を作って、その後sanguino環境に変更。ArduinoUNOでArduinoISPを作成してブートローダを焼き込もうとするのだがエラー。AVRISPmk2とAtmelStudioで同じ事をやってみてもエラー。
 ここで以前失敗した時の記憶がよみがえる。外部クロックをつなげてみたらAtmelStudioがATmega644Pを認識した。そのままArduinoISPに繋ぎ直したら無事ブートローダ書き込み完了。せっかくなのATmega1284Pもブートローダを書き込みしておいた。

 で、再度試してみたがLチカアップロード完了。無事動作。ATmega1284PでもOK。というわけでsanguinoを試せる環境はできました。チップに貼ってるピン記載シートはOpenCVで遊ぼう!別館さんから毎度頂いてます。ありがとう。


シフトレジスタを使わないでやってみる

 午後、遅いお昼を食べに行ってからテスト開始。
 で、○○堂で手に入れた安いブレッドボードでやってたら動作が不安定。午前中のブレッドボードに変えてやりなおし。

 20130320_02

 まず、アノード側の8ピンをシフトレジスタを使わずAVRに直結してテスト。大丈夫ですね。
 実はソフトウエアの部分でちょっとハマりましたけど。演算子の優先順位で。論理演算子って後回しなのね、言語を考えればそうなのだけどもね。ビット演算してるとついやらかすミス。

20130320_03

 つづいて、カソード側のピンもシフトレジスタを使わずにAVRに直結。直結と言ってもシンクドライバをかましてます。LEDを2セットにしたので、Arduino側のピンはAnalog0-5をDigital14-19として使うようにして対応。とりあえず動いてました。

 ただ、12桁表示にはマイコンのピンが足りない。あと空いているのはUARTの2つとSPIの3つ、そしてdigital 13番。全部使えば12桁対応できますが、他のIOが出来ないので表示するべきネタデータが取れないです。動作モードを指定するスイッチすら繋げられない。
 そろそろATmega644Pの出番ですかねぇ。Sanguino系は公式サポートじゃないので試してみるしかないですね。それとも、ATmega168/328系で、せめてカソード側はシフトレジスタ使うかだな。シフトレジスタを使えば12pinが3pinで済むのだから。


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

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類の電源をどう確保するかが鍵です。

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


ちょっと大きめのブレッドボードへ移行

20130114_01

 LEDテスト基板を大きめのブレッドボードへ移設しました。ついでにPCA9685をもう一つ追加。
 2度めの0.65mmピッチのTSSOPのはんだ付け。今回はなんか緊張してしまって手が震えた。ちと斜めってますが、導通は問題なく、短絡も無し。これでEagleで設計してる基板と同等のプロトタイピングができます。
 でも、ネットを見てると、シフトレジスタ使って大量のRGBLEDをコントロールしてる画像があったり、いろいろLEDは遊べそうです。チャーリープレックス(charlieplex)もあるねぇ。

 LEDを全32ピンに接続してみました。このままでは面白く無いのでRGB LEDに変更してみます。

 あと、毎度思うのですが、ブレッドボードの両端の電源とGNDのラインをエレガントに1ピン幅でつなぐパーツが欲しいですね。海外にありそうな気もする。国内にもこういうの(#299 電源ライン連結バー)はあるけど、もう少し幅が狭いと良いのだけども。FusionPCBの基板発注の時端っこで何とかするか。Eagleのフリー版の100mm x 80mmの中で50mm x 80mm位をLED基板で使うとして、残りの部分で面付けして自分でカットで行けるかな。