2009年2月20日金曜日

BLINKM ICSPアダプタ

USB-BLINKMの実験をしている最中に、BLINKMのAVR Tiny45を書き換える作業が面倒になったので簡単なICSP用のアダプタを作ってみた。機能は最低限で、

  • AVR USBISP mkIIの6pinのコネクタ
  • BLINKM(ICSP用の補助ピンを2本増やしたもの)
  • 外部電源5V
をつなげるだけだ。最初はブレッドボードに挿して個別に配線していたのだが、これを作っただけでずいぶん作業が楽になった。

部品の配置図と配線図のメモを残しておく。これも秋月の16穴基板を2枚つかって作ったので、8x4穴に収まるようになっている。

USB-BLINKM

BLINKMはthingmが作成・販売しているインテリジェントフルカラーLEDだ。1cm角くらいの基板に、明るいRGB LEDとAVR Tiny45が載っていて、I2Cインターフェイスで外部に接続できる。I2Cはデイジーチェーンできるので、たくさんLEDを使うときには大変便利だ。Arduinoなどから簡単に扱えるので様々なメディア作品で利用されている。


先週からいきなり始めてみた「AVRを使ってみる」という活動だが、ふと机の横に転がっていたBLINKMを眺めるとAVR Tiny45が目についた。ちょうどAVR Tiny85で遊んでいたところだった(その話はまた今度)ので、「Blinkmを単純にLED付きのAVRとして使えるんじゃないか?」と思い立った。実際にやってみたのが今回のエントリの「USBに直接つながるBLINKM」だ。i2cのデイジーチェーンできるという利点は無くなってしまうけれど、USBならどんなPCにも大体ついているので、一個だけ使う場合には逆にお手軽になる(と期待している)。今回は、ハードウェア部分について書いてみることにする。








BLINKMの回路図

BLINKMを裏返して眺めてみると、実装されている部品はLEDと電流制限用の抵抗(x3)とAVR TINY45とデカップリング用のコンデンサくらいだ。とりあえずI2Cの接続用にでている4pinがどこにつながっているかと、LEDがどのIOにつながっているかがわかれば良いとおもって回路を追ってみた。というわけでわかったのが左の図に示す回路図。大変都合の良いことに、i2cのdata/clockの線がPB0/PB2につながっている。

あと実際のBLINKMには実装されていないけれど、ISCPに必要な信号線を出すためのパターンも実装されていて、reset/misoは簡単に外部に引き出せる。
AVRでソフトウェア的にUSBを実現するコードとしてobject development社が公開しているAVRUSBがあるが、USBの信号線の一本をINT0に接続することが推奨されている。PB0/PB2が出ているのがどうして都合が良いかというと、PB2はINT0だからだ。ちょうどTINY85でAVRUSBを試していたところだったので、すぐに「ほとんど外付け回路無しでUSB化できそうだ」という予想ができた。


BLINKM-USBブリッジ回路

というわけで、BLINKMの4pinコネクタからUSBのAコネクタに変換するための外部回路を書いてみる。基本的にAVRUSBのリファレンス回路のツェナーダイオードを使うやつと同じ。
USB1.1の仕様ではD-信号線を1.5Kオームでプルアップすると、low speed (1.5Mbps)デバイスだと認識する。そのためのプルアップ抵抗が一本、信号線の電圧をクリッピングするためのツェナーが2本、あと信号線のシリーズ抵抗(68オーム)が2本、だけの簡単な回路になる。実際にはVccラインに保護用に500mA以下(LEDだけだったら300mA程度で十分)のポリヒューズを一本と、0.1uF程度のセラミックコンデンサを実装しておけば良い。
ポリヒューズが無ければ直結するという方法もあるが、何か間違ったときにPC側のUSBポートやUSBホストコントローラを焼いちゃうかもしれないのでおすすめしない。デカップリング用コンデンサはなくてもいいから、過電流の保護はちゃんとやっておこう。

BLINKM-USBブリッジの実装

思い立ってから、最初の実験を含めて3つほど実装したけど、一番小さくなったやつを紹介しておく。USBもBLINKMも両方とも4pinのコネクタだったので、秋月の16穴スルーホール基板をつかって実装したくなった。10枚買えば一枚10円、100枚だと一枚5円というお手頃価格だし、基板を加工する手間も省ける。

右の図が実体配線図。部品面から見た図になっている。斜め配線&一つの穴に2本部品がはいっているというお行儀の悪い実装になっているけれどなんとか収まったので良しとしよう。


部品はだいたい秋葉原で揃う。3.6Vのツェナーダイオードは千石電商で100本入りをかった。これはどこでも売っているはず。68オームと2Kオームのチップ抵抗(1608)は鈴商で売っている。チップ抵抗なら千石でもあるはずなんだけど、68オームは置いていなかった。一番面倒なのが面実装のポリスイッチ(ポリヒューズ)だ。容量の小さいものなら秋月で扱っているらしいけど0.1Aは小さすぎる。探してもなかったのでチップワンストップで、Tyco Electronics Raychem PSR-27313-050を調達して使った。まあ、千石のB1で売っているポリスイッチを裏にがんばって貼り付けても大丈夫なのでそこまでしなくても平気だとはおもう。

実際に制作したものは右の写真のとおり。BLINKMはUSBコネクタ側にLEDが向くように差し込む。USBコネクタを差し込むと、ちょっと余裕が出るくらいの長さになるので、これがこの方法でつなげる場合に一番短くなる実装方法だろう。





USB-BLINKMのソフトウェア

もちろん、今回つくった回路で電気的にUSBコネクタにさせるようになったとしても、AVRのソフトウェアを書かないと動かない。I2C-USBブリッジではなく、BLINKMにのっているTINY45に直接USBを処理してもらわないといけないからだ。

次回のエントリでは、AVRUSBについて説明してみる予定。


2009年2月19日木曜日

ブレッドボードでArduino

「AVRのATMEGA168があればArduino互換ボードが作れる」ということだけを教えてもらって始めたところ、いくつかはまったのでメモ。

  • AVRISP MKIIでは外部電源が無いと書けない
  • 買ってきたばかりのATMEGA168は外部クロックで動くモードになっているので、クロックを供給してあげないと書けない
  • AVRにはヒューズというものがあって、クロックなどの動作モードはそこに書く。ヒューズのビットマップはチップごとに違うので仕様書を参照
とりあえずfirmware(bootloader)を書くまでに超えないといけなかったのはこのくらい。前のエントリーのarduino用シリアルアダプタ(2) を作っただけでは「ブレッドボードでArduino」には到達できなかった。とりあえずクロックを供給するために、その辺にあったセラロック(20MHz)をつなげてみた。DIPのATmega168のクロック周りのピン配置はGND-XTAL1-XTAL2の順番だが、セラロック(負荷容量内蔵)のピン配置はOSC0-GND-OSC1になっていてブレッドボードに挿すには都合が悪い。写真のようにGNDとOSC0のピンをひねって順番を入れ替えたものを作っておいた。これも今後たくさん使うようなものでは無いけれど、一個くらい持っていても損はしないだろう。

で、次にはまったのがこのいい加減に選んだ20MHzという速度だった。
  • Arduinoのブートローダーはクロック周波数によって違う
普通のArduinoは16MHzで動作するらしい。16MHz以外のクロックをつかって標準的なブートローダーを書き込んでもシリアル通信のタイミングが合わなくて通信できない。解決方法は2つで、
  • 供給しているクロックに対応したブートローダーを作成して書き込む
  • 内部クロック(8MHz)で動作する用にヒューズを書き換えて、8MHz用のブートローダー(lilypad 8MHz用)などを書き込む
のどちらかをやらないといけない。

とくにArduinoのknow-howが無い状態で始めてしまったので「こんなところではまるなよ」と言われそうだけど、しょうがない。おかげで最初にLEDの点滅プログラムを動かせた時には、すでにブートローダーのソースを読み終わっているというArduinoの思想とはちょっと離れたスタートになってしまった。

arduino 用シリアルアダプタ(2)

単に機会が無くていままでAVRを使うことは無かったのだが、共同執筆者のCUEと秋葉原で会ったときに「AVRつかったことないんだ」と言われてしまったので、その場の勢いでATMEGA168とATTINY85を購入してしまった。さて、帰ろうかとおもったときにふと違和感を感じた。「あれ?これってどうやってプログラムを書き込むんだ?」。今までAVRをさわったことのない私に何らかの開発環境があるわけがない。結局、さらにATMELのAVRISP MKIIを秋月で4000円で購入するはめになった。

というわけで、何となくAVRと戯れることになったで、最近の週末プロジェクトについて書いてみようと思う。

Arduino用シリアルアダプタ

右も左もわからなかったのだが、AVRといえばArduinoがはやっているらしいし、CUEもさわっているみたいだったのでその辺から攻めてみた。せっかくATMEGA168を買ってしまった手前Arduinoを更に買うのももったいなかったので、ブレッドボードで実験してみることにする。CUEがやっていたシリアルアダプタが便利そうだったので、こちらでも作ってみた。

たくさんつくるものでもないし、必要そうな機能は全部実装した。
  • USB-AVR間のシリアル通信
  • DTRを用いたオートリセット
  • 手動リセットスイッチ
  • シリアル通信のTX/RXのステータスLED
  • AVRISP MK2をAVRにつなげるためのICSPの6ピンコネクタ
AVRISP MKIIはターゲットとなるAVRに電源が供給されていないと書き込めないので、USB給電で全部書き込むためにはICSPコネクタが手元にあった方が、ブレッドボード上のAVRを扱うときに都合がよい。

これで、こんな感じにブレッドボード上にArduino互換の環境をすぐに準備できるようになった。AVRISP MKIIをつなげないといけないのはブートローダを書き込む最初の一回だけで、Arduinoを使うのならそれ以降に接続する必要はない。

まあ、Arduino以外でブレッド ボードにのったAVRを使うこともあるだろうから、つけて良かったと感じている。


とりあえず基板のレイアウトを書いておいた紙を記録用に載せておく。接続図とかは自明だからいらないよね。






(補足:2009/02/19 19:54)
自分でも忘れそうだから、配線図を書き下した。参考までに載せておく。RX/TXのLEDは割愛。




2009年1月29日木曜日

arduino 用シリアルアダプタ


arduinoの場合には作品制作にPCは必須ではない、というよりPCからコントロールする作品ならば、プログラムが一種類ですむgainerのほうがより簡単に扱えるし、PGAや静電容量センサーが使えて便利なことがおおい。arduinoの本領はgainerでは動作しないようなデバイスを動かす場合や、マイコン単体で動作する作品をつくる場合だろう。

そのため、gainerの時と違ってUSBシリアルをすべてのボードに同梱する必要はなく、プログラムの書き込みやデバッグ時のためだけに使えるようにすればよい。
そこで、USBシリアルアダプタを作品のブレッドボードに差し込みやすい形で作ることにした。まず最初に試作してみたのが、L型ヘッダをつかい、縦に基板を差し込む方法である。Decemiela についているリセット端子と同様の回路(抵抗とコンデンサ)をつけることで、自動リセットにも対応している。
上からみた配線図はこのよ
うになる。電源ラインの取り回しにモジュールの6ピンのところを通してあるが、ここはソケットのピンを抜いておいて、通電しないようにしてある。もちろん、ジャンパとして表面をまわしてもよいだろう。0.1uFのコンデンサと10KΩの抵抗で通信用のラインを横切っているので、裏面にはジャンパが飛ばないようになっている。

この方法ならブ
レッドボードに部品が少々のっていても大丈夫であるとおもったが思ったよりもL型コネクタに厚みがありほとんど部品がない状態でなければ刺せない。
よってこのままでは使えないので、ケーブルをつかってのばすことを考えた。よくやる手ではケーブルの先にピンヘッダをハンダ付けするのだが、今日はイマイチうまくいかなかったので新しい方法を試してみた。





もともと千石電商で売られているヘッダピンとブレッドボードを結ぶジャンパケーブルを分解する。これはエクステン
ションのようになっていて、1ピンのソケットと、1ピンのピンヘッダがそれぞれ圧着されている、簡単にいえばジャンパワイヤーの延長コード状のものだ。(図)ピンヘッダがついた部品をブレッドボードにさすのに利用するワイヤーだが、これを使ってシリアルのヘッダを延長することにした。

もちろん、そのまま5本のケーブルをさすのでもかまわないのだが、ここは専用ケーブルとするためにも、ヘッダを分解し、1x8列の枠を使って再構成することとした。一度ささっている圧着ヘッダを抜くためには、細いマイナスドライバを用いるのがいい。ソケットのプラスチックのひっかかりがある部分をすこしこじって、ひっぱればケーブルを抜くことが出来る。両側のケーブルを抜くと、このように金具だけになったケーブルが出来上がる。これを5本用意して8列ソケットの両側から、3本、2本とさす。延長なのでクロスする部分がないようにフラットに両側のソケットを実装すれば完成である。

これを使うことで1列の隙間があればブレッドボード上のarduinoに書き込みを行うことが出来る。
もちろん、延長ケーブルの配線でクロスさせるなら、もっと簡単にラインを引っ張りだせた、というのは言うまでもないが、直接させることを目標にしたというのが今回の工作の主眼なのでそこは問わないことにしよう。


なんにせよ、これで格安arduino環境が整い、ブレッドボード上に低コストで作品を作ることが出来るようになったわけだ。





2009年1月28日水曜日

ブレッドボードで arduino/88

one chip Arduino clone というのを Make blogなどで発見した。制作記事を読むとATMega88 をつかって 内部発振で動くらしい。ということで、何度か試したもののあまり巧くいってないarduino clone作りであるがこれはさっそく真似せねば!と思い、ブレッドボード上に実装してみた。これは速報のonechip arduinoの前に行った実験だが、報告の前後が逆になっている。
 
最近のArduinoは通常 Atmega168 を 16MHzで駆動しているが、one chip arduino は日本の誇る秋月電子で格安に販売されている Atmega 88 を使い、内部発振で駆動しているため発振子も必要なくなっている。このチップに最低限の回路としてステータス表示用のLEDと動作きりかえのためのリセットスイッチを実装したのがone chip arduino だ。実装部品は思ったよりも少なく、gainerと違い、シリアルポートもオプションなのでたしかにワンチップの上に載せられるくらいの部品しか存在しない。

これをベースにワンチップ化の前に、さらにシンプルになるように配慮しながらブレッドボードに組み立ててみることとした。

そのまえに、まずAVRをarduinoとして動作させるのに必要なブートローダをAtmega88に書き込んだ。
仕事でAVRを使っているグループがいるのもあり、手元にたまたま STK500が転がっていたので、kosakaさんのページ
を参考に STK500をarduinoに登録した。
さすが純正品ということで当たり前だが、なんのトラブルもなく書き込みを行えた。ブートローダは各チップに一度だけ書けばいいので、チップを買ってきたらまとめて作っておくのがよいだろう。


秋月電子で一番安いブレッドボードの上でこれを組み立てることとして、
配線を行った。この ブレッドボードでの最大の問題は、電源ラインが左右に分離しているところであり、このため通常はやらないパーツの上をとびこえる配線が1カ所だけ入っている。


なお、もう1つ大きいブレッドボードの場合には、電源ラインが2本づつ入っているので、左右をちゃんとつなぎ込めば、無様な真似をしなくても作ることが出来る。余白に回路を作ることを考えると、実はこちらのほうがよいのかもしれない。

実際に利用するスケッチを書き込むためには、USBシリアルの変換アダプタが必要だ。秋月のUSBシリアル変換モジュールにコンデンサと抵抗でリセット回路を組み合わせた書き込み用ボードを作成した。L字型のコネクタを使うことで、直接ブレッドボードにさせるのを狙ったが、微妙にスペースが足りずに干渉しやすいことが判ったので、延長ケーブルでつないでいる。
こちらに関してはのちほど別の記事でお伝えしようとおもう。

arduinoも思ったよりも簡単に作ることが出来たので、これでパソコンとの連携が必要ない作品を作る場合はarduinoを使ってもいいかもしれないと思えてきた。パソコンを使う場合で、機能が収まる場合には、arduinoよりもgainerのほうが開発コストが低いと思われるので、gainerの意味がなくなったという訳ではない。とくにgainerの派生物としてAVRと組み合わせた ginger/peper は秀逸で、USBをソフトウェア実装してあるため、USB接続をする先まで考えても、コストが安いことと、実装面積が小さくていいことの2つから便利に使えそうである。


実は先にAtmega168 をつかった Diecimila互換機もブレッドボード上に実装してみた。こちらはマルツで買ったAtmega168と秋月で買った16MHz のセラロック(セラミック発振子)を配線してあるだけでほかは大きな違いはない。高速処理が必要ならばこちらもやってみるといいだろう。ただし、本気で高速処理を考えるならば、普通にAVRGCCをつかってC言語でプログラムをかいたほうがいいのは言うまでももない。

2009年1月26日月曜日

速報 one chip arduinoを作ってみた

ちょっと時間ができたので one chip arduinoを真似してチップ上に無理矢理実装というのをやってみた。

コンデンサの数を減らし、書き込みはヘッダピンがなくてもブレッドボードでやればいいじゃないかということで、極力パーツを省略することで、さらにパーツの少ないすっきりとしたものが出来上がった。この先は表面実装用のパーツとシール基板を使えば、もっとすっきりしたものが出来上がるだろう。

ビフォーアフターは以下のとおり。














書き込みはこのように、USBシリアルアダプタを使ってブレッドボード上で行うこととした。このシリアルアダプタの話はまた今度しようとおもう。シリアルアダプタの中にリセット用の回路を組んであるので、リセットスイッチを押さなくても書き込みは可能である。