先週くらいから体調を落としていた、金魚の桜東錦のさくらちゃん。一昨日夜から治療水槽にいれたりしていたのだが、環境がかわってかえって状態が良くなくなってしまった。
今朝起きてみたら、もう動きませんでした。残念だ、
「2013年03月」一覧
キーボード配列変換機テスト
手持ちのデバイスでテスト。Sparkfunの新しい方のUSB HOSTシールドとArduino microにて。
なんかうまく動かない。
Arduino microをやめて秋月のArduino互換機で試してもおかしい。キーボードを変えてみたら文字コードを受信するようになった。それまでは場所が狭いからテンキーレスのUSキーで試していたのだった。
でも、Arduino microに戻すとうんともすんとも。なんでだ?
今朝方緊急発注しておいたArduino Leonardoと、白い基板の本家と同じ回路であろうUSB HOSTシールドが届いた。SparkfunのUSB HOSTシールドは電源周りとか微妙なのです。で、届いたこいつらで試したらUSキーボードのキーコードをサクサク受信。同じように会社から日本語キーボードのノートPCを貸与されて困っていた人の記事のコードもサクッと動いた。一安心。
あとは、自分用のカスタマイズ。自分がいじれるPCではのどかをインストールしてCAPSロックをIMEのトグルに、SHIFT+CAPSLOCKをCAPSLOCKにしているのでその対応をすればOK。しかしうちにはキーコードを検証する日本語キーボードはツレのPCにしかないのだった。
完成まではもう少し。で、ツレから日本語キーボードを借りて、キーコードを調べてとかして、なんとか自分の使えるようなものができたっぽい。
明日は早朝か日曜なのに仕事です。っかなんでこんなことしないといかんのかなぁ。しっかりしてくださいよ>親会社。手に馴染んだ万年筆を使いたいけど、会社が文具量販店のボールペンの配給だけでなく使用を強要するというような感じなのですかね。
うまく行ったら、基板起こして小型化して頒布とかするかも。ってか同じようなことはMakeTokyoMeeting2012の時にやったらしい方が要るんだよね。その時は我が身にこんな事が振りかかるとは思ってなかったのでスルーしてたのに。今だったら速攻で頒布受けてる。
まぁ、英語キーボードを使おうなんて、プログラムを書かない、最初から日本語キーボードしか使ったことが無い人ならまったく気にもならないことですから。海外旅行して気づくくらいかな。
sanguinoマスタコントローラ化の下準備
家のいろんなデバイスのデータを集中的に取得してネットにアップロードする自作デバイスを「マスターコントローラ」と呼んでいます。現状、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テスト
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だけどムチ打ちますねぇ。ちょっと検討してみます。