Arduino一覧

クロウラー準備

 無限軌道のクロウラー。ホントは上にものをつかむギミックが乗るののだけど、そこは省いた形。

 今夜は2階建てにして、XBee、モータドライバと電池を載せて遊んでみた。動画は無し。
DSC_0447

 この週末お休みで、XBeeとモータドライバの間にATmega328Pを挟んだ感じでコマンドコントロール系に変更します。ついでに、加速度・地磁気センサの値を受信してログ保管。
 XBee&ATmega328Pは2011年12月のMake: Tokyo Meeting 07で仕入れてきたアルシオーノを組み立てて使ってみます。せっかく買ったので使わないと。制御系の電源は3.3Vで行くのでクリスタルは手持ちの8MHzに取り替えます。距離センサは手持ちに3.3V対応のVCNL4000が1つだけあるので搭載してみようかな。という感じです。
 コンデンサマイクを複数置いて、”手を叩いた方向へ進む”とかもやってみたいです。

 他は、多分自宅のリビングでは走行不可能な、ボールキャスターとタイヤ2つによるメカも仕入れました。でも、やはりキリムの床では進まないかも知れない。


pinMode(Pin, INPUT_PULLUP);

 朝、なにげにRSSリーダでチェックしていたら、スイッチサイエンスさんのブログにこんなエントリーが

 はい、知りませんでした。先週作ったXBeeラジコンの送信機も、同じような回路。内部プルアップ抵抗を使って、ボタンを押してないときはHIGH,ボタンを押すとGNDに直結してLOWという感じ。
 自分が書いたコード自体も、

pinMode(LeftUP, INPUT);
digitalWrite(LeftUP, HIGH);

昔からある手法の、ピンをINPUT指定しておきながらdigitalWriteでHIGH出力すると、内部プルアップ抵抗がオンになるというもの。
これが、

pinMode(LeftUP, INPUT_PULLUP);

の1行にまとめられるので、お得です(笑)


Arduino UNO & USB HOST SHIELDのキーボードコンバータ運用テスト開始

20130421_03

 USキーボード対応も出来たので、Arduino UNO版もいれ変えました。シールドのdigital5ピンからGNDにジャンパ入れてUSモードです。
 で、問題がないか確かめるために自宅で運用を開始してみます。このブログエントリー自体も、すでにこの変換機を通してます。OS側の変換ドライバは止めてます。この無線キーボードはCAPS,NUMLOCKなどのLEDが無いので、UNOのソフトはLED対応はしてないバージョンです。今のところレスポンスなども特に問題は無さそうです。


Arduino Mega ADKでキーボードキー配列コンバータ(ややハマったが解決)

20130404_01

 昨日デバッグしてて使いづらいなと思ったので、思い切ってArduino ADKを手に入れました。
 Arduinoならではのシリアルからプログラムを流しこむのはシリアル担当のチップATmega8U2をUSB HID用に書き換えてるのでできません。なので、ISPプログラミングなのですが、USB HOSTシールドがISPピンを専有してしまって繋げない。昨日は何度シールドを抜いたりはめたりしたことやら。(ピンソケットは出てるので、D10-D10,VCC,GND使えばよかったかも。)

 で、本日届いたADK。キーコード変換機にしてはオーバースペックです。
 昨日のコードをATmega2560 or Mega ADKでリコンパイルしてISPで焼いてみたが・・・。OSC did not start.の悲しい文字がコンソールに。あ、UNOではSoftwareSerialにしてたコンソールのシリアルはSerial1にしてます。Mega ADKはハードウエアシリアルが4個ありますので。Serial0がHIDデータ送信用。

 結局google様に頼ったら、USB HOST SHILED 2.0のライブラリのavrpins.hのの最初の方
#if defined(__AVR_ATmega1280__) || (__AVR_ATmega2560__)のなかの
コメントされてる#define BOARD_MEGA_ADKを有効にしたら無事動作。
うちはATmega1280やATmega2560のチップは今回購入したMega ADKしか無いのでOK。

 ほんでもって、身を持って検証ってことで、コード変換をUS配列→US配列のパススルー。但し、CAPS Lockでは ALT+ チルダを送るようにしてつかって見ることにした。

 しかし、ADKが高いから、Arduino + USB HOST SHIELDにする人はあっても、逆にArduino + USB HOST SHIELDの用途でADKを買う人はそうはおらんかも。


Arduino UNOの8U2のHIDでキーコード変換機

 昨夜の続きです。

 Arduino Leonardoで動作確認したプログラムをArduino UNO with HID用に書き換え。
 基本的に、Leonardo専用のKeyboardオブジェクトのKeyboard.sendReportのところをSerial.writeに書きかえるだけ。引数はどちらもuint8_tの8byteのHIDキーコード配列なので。あと、デバッグ出力がSerialなので、SoftwareSerialへ書き換え。

20130403_01 debug console
 SerialをHID役のATmega8U2との通信に使ってますから、SoftwareSerialを使ってモニタリングしています。
で、なんか動作が変。別電源も与えているから電源ではないと思いたいけど。SoftwareSerialのモニターではUSBホストからのキーコードも、変換後のキーコードも正しく出力されている。しかし、出力先のPCでは変な状態のコードが届いてるようでエディタを開いてカーソルを置いておいてもコントロールコードが行くとヘモヘモになります。
 ATmega8U2との接続を9600bpsから57600bpsとかにあげたらうんともすんとも。Arduino-keyboard-0.3.hexのサイトにソースも公開されていたのみてみると、9600bps固定。でもキーボードならそれくらいの速度でも大丈夫なはず。
 対処療法的に、USB HIDの8byteのデータを一気に送るのではなく、1byteづつ送るようにしたら、とりあえず安定した模様。変な動作をしてたのは、どっかのタイミングでATmega328Pから送ったデータとATmega8U2が受け取ったデータがずれて、ずれたまま動作していたからと思う。シリアル無手順だし一度ずれたらなおしようもない。
 今回いろいろすったもんだやってたので、LUFAというAVRでUSBをやってるプロジェクトも見つけられた。サンプルにHIDホストもあったので、AVRを2つ使って受けと送りを担当させて、両者をi2cなりSPIでつなぐのもありかなぁと思ったりしてます。USBホスト倶楽部というちょっと記事は古いけど参考になるサイトも見つけました。 USBホストってもつなぐのはUSB HIDキーボードに限定してしまえば結構いけるのかも。キーボードだと速度も遅めですからね。


ArduinoUnoでHID

 Arduino UNOでUSB-UART変換をしてるサブチップであるATmega8U2(UNO rev3はATmega16U2)。こいつを書き換えてHIDデバイスとして振る舞わせる作戦。先人が居るのでATmega8U2のファームはある。これを使ってキーボードキーコード変換を試してみます。
 LeonardoだとUSBのシリアルデバイスとしてのクラスタイプも通知してしまうので面倒かと、杞憂かな?

 未来形なのは、明日は休日出勤の振り替えでお休みにしましたから。明日のプロトタイピングで足りないパーツが有っても、速攻発注しておけば次の日曜日の休みには間に合いますから(米digikeyに発注しても間に合うかも)。鉛筆問題は結構死活問題なので進ませます。

 で、Arduino UNOのATMega8U2をHID対応に書き換え。この辺り、DFUモードにするというWeb記事が多いですが、UNOのR2以降はサブチップのISPピンが基板にありますのでそのままISPで焼けました。メインのATmega328PにもISP経由ででテストプログラムを書き込みして、アウト側の部分はテスト完了。意外とすんなり。今夜はここまで。

 あとは明日USBホスト側からもらったキーコードを変換かませるようにATmega328Pのプログラムを書き換えて、テストです。USBホストがシールドなので、デバッグしつつのプログラム再投入の為のISPのケーブル接続が面倒ですね。あと、入力側と出力側は別PCに繋がないとアカンね。シリアルコンソールとか使っているとキーボードで売ったものが、同じアプリにHID出力として打ち込まれてわけわからなくなる。