Make一覧

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

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マスタコントローラ化の下準備

20130328_01

 家のいろんなデバイスのデータを集中的に取得してネットにアップロードする自作デバイスを「マスターコントローラ」と呼んでいます。現状、mbedで動かしているのですが、mbedも高いので他のマイコンにしたいかなとか思って。

 sanguinoでのwiz820io動作が見通しがついたので、他にGLCDやXBeeを配置したプロトタイプをブレッドボードでやってみます。今夜は配置しただけです。GLCDはむかーし買ってあったTG12864B-02WWBVを今回初めて使います。センサー類のデータを何処かに(i2cのEEPROMとか?書き換え回数的にEEPROMは無理だなぁ、SPIなSRAMか。)保存しておいて、時系列グラフ表示するとか考えてます。当然各センサの現在値も表示させます。ATmega644(SRAM 4Kbyte)でやるつもりなのだけど、やっぱATmega1284P(SRAM 16Kbyte)かなぁ。

 ブレッドボード上のGLCDの置き方がだいぶもったいない置き方ですが、まぁこれでも想定の回路は作れますので。はみ出してると引っ掛けてピン曲げたりとかもありますから。

 wiz820ioは0x2000バイト以上の受信をするとハングするバグが有るようですが、その前にソケットをcloseすれば良いとか。TCP/IPに関してはこのガジェットはクライアントなので、都度開け閉めするから大丈夫ですかね。

 オプショナル開発として、今XBeeで無線経由でデータを取得しているガイガーカウンタとエーハイムフィルターは有線接続に切り替えるかも。インターフェイスはi2cかな。wiz820ioとは当時に使わないだろうからSPIでも良いけど、SSが必要になるから躊躇している。


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で遊ぼう!別館さんから毎度頂いてます。ありがとう。


集合抵抗に変えました

20130322_02

 7セグLEDのアノード側の電流制限抵抗を集合抵抗にしました。スッキリ。aitendoさんでちょうどコンデンサマイクを買う必要があったので、ついでに。
 他は更に小さめな4桁の7セグLED@150円とか。74HC595@50円もいくつか追加。

 この集合抵抗、8抵抗のDIPが5個で100円なので秋月などのの100個100円の抵抗と比べるとコスパは悪いのですが、ブレッドボードでの取り回しが楽なので買ってみました。残念なのは抵抗値のバリエーションが少ないことかな。
 ふと、16ピンのDIPのICソケットを使って好きな値の抵抗を固定すればええじゃんと思った。確かに。出来れば丸ピンのソケットが良いですね。


sanguinoの準備

20130321_01

 準備ってか並べただけですね。

 ブートローダは焼いてあったはずなので、配線とIDE環境の準備をすれば試せるはずです。

 最初はDHCPで取得したIPアドレスをUARTに流すとか、httpクライアントとしてどっかのhtmlをUARTに流すとかかな。デジタルピンはSPIとUARTを除くと20本。アナログピンをデジタルに回せばさらに8本なので12桁の7セグLEDをシフトレジスタ無しでまかない切れるはずですね。