No Such Blog or Diary
デバイス「石」
ただの石でしか無いUSB Pet Rock を「石」というデバイス名で認識されるようにしたかった.ただそれだけ.
結果:デバイスドライバがインストールされるまでの間は「石」と表示される程度になった.そして放っておくと「Ich bin ein Stein.」と打ち続けるという.
石が勝手にキー入力するように&余計なデバイスドライバいらないようにとHIDキーボードとして動くように作ったせいで,ドライバインストール後はデバイスマネージャなどで「HIDキーボード」と表示されてしまう.どうにか出来ないかなぁ… 自前でドライバ書いてゼロインストールとかいう手もあるけどそこまでやるのも面倒だし.
以下,作成メモ.
材料費:USB Pet Rock が 1180円,ATTiny85 が 300円,抵抗(68Ωx2, 2.2kΩx1)・ツェナーダイオード(3.6Vx2)・電解コンデンサ(10μF)が50円,その他USBケーブルとかソケットとか240円位.
ファームウェア部:USBの通信にV-USBを使用.HIDキーボードとして動かす部分はEasyLoggerというサンプルをベースにした.
回路図:stone.pdf .左のLEDは生存確認用なので必要ない.ATTiny85は無駄がなくていい.
嵌りどころ:PROGMEMで確保した定数配列の読み込みには pgm_read_word_near を使わないとアドレスがズレる.USBデバイスの名前はUTF16だけどリトルエンディアンとビッグエンディアンで間違えた….
動画が上手く撮れないという… http://www.nicovideo.jp/watch/sm9813974
つか色々とやるのが面倒になってきた.
- Comments: 0
- TrackBack (Close): -
加速度のロガー?
宅配中の荷物の扱いがどうなっているのかが少々気になる.
で,センサで加速度を測定し続けるロガーでも作ってみようかなと.センサ自体は秋月とかで1000円程度で手に入るらしい.けど 2G までしか計測できないらしいので衝撃を記録するのは難しいかも.とりあえず適当に作って実験してから考えよう.ログを取る部分には AVR でも使うか.
- Comments: 0
- TrackBack (Close): -
雨の中秋葉へ
ビデオ会議風に輪講をやってもらえると非常にありがたいのだが… そうも行かないので雨風の中秋葉原へ.途中2回ほど傘がおちょこになりかなり濡れる羽目になった.毎週金曜日だけは晴れてほしいものだ.どうでもいいけどUSB-シリアルケーブルが3500円もして高いなぁと思う.自前で作れば AVR+α とケーブル代で安くなりそう.ドライバ書くのが面倒だけど.
- Comments: 0
- TrackBack (Close): -
AVR版USBテープリーダ完成?
データの読み込みまで出来るハード&ソフトが完成.バスパワーでもセルフパワーでも動く.整流用でないショットキーバリアダイオードを電源の逆流防止に入れてて挙動がおかしかったりもしたが,整流用のにしたらちゃんと動くようになった.やはり電流量に応じた物を使わないといけません.あとは,機器の方から能動的にデータを送れるようになると良いのだが… PCからポーリングしまくるとその処理のせいでマイコンの動作が重くなるのでよろしくないので.でもどうやればいいかまだ良くわからない.ついでに,PWMでモータをコントロールする部分もつけたので後はテープ送りの工作をすれば完璧.さすがにバスパワーだとやばいかもしれないけど…
- Comments: 0
- TrackBack (Close): -
libusb-win32 を使ってみる
USBデバイスのハード部分が出来上がったので次はソフト部分.どうやら libusb-win32 というフリーのライブラリがあるようなので利用してみる.とりあえず inf ファイル作っとかないとデバイスが使えないので libusb-win32-device-bin-0.1.10.1.tar.gz とかの中にある inf-wizard.exe で生成.プログラム自体は AVR USB のサンプルコードを参考に作成.無事エコーテスト成功.あとはしつこくポーリングするか受信待ちが出来るなら待ちをしてやればおわる.
libusb を使ったプログラムの流れ(簡易版)は以下のとおり.何より先に usb_init(); して libusb を初期化.んで,usb_find_busses(); usb_find_devices(); でデバイスを探して,
for(bus=usb_get_busses(); bus; bus=bus->next){ for(dev=bus->devices; dev; dev=dev->next){
のネストループで全デバイスを走査する.走査時に,dev->descriptor.idVendor, dev->descriptor.idProduct をチェックして,ベンダIDとプロダクトIDがマッチしたら handle = usb_open(dev); で開けてみて,
usb_control_msg(handle, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + dev->descriptor.iVendor, 0x0409, buffer, sizeof(buffer), 1000); usb_control_msg(handle, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + dev->descriptor.iProduct, 0x0409, buffer, sizeof(buffer), 1000);
でベンダやプロダクト名を確認する(同一IDに複数のデバイスがあってプロダクト名で識別しないとならないので面倒.usb_get_string でいい気もする).
外れたら usb_close(dev); しとく.
デバイスが見つかったら usb_control_msg でデータのやり取りを.
他の endpoint 開いたほうがいいけど… そんな余裕は無い.
- Comments: 0
- TrackBack (Close): -
Tiny2313一匹目死亡?
反応が無い,屍のようだ.ISPでほとんど0しか反応が返ってこない.何が原因だったのか特定できてないのが少々不安だけれどもとりあえずまた殺してもいいように秋葉で二つほど購入してきた.プログラムメモリが足りないような気がするので無駄な出費となるかも知れないが…
- Comments: 0
- TrackBack (Close): -