読者です 読者をやめる 読者になる 読者になる

usbaspをatmega328pと青色LEDでつくる

移転しました。


久しぶりにAVRに書き込みをすることに。winavrを入れたら開発環境が全部入っていてすぐ書き込みができるようになりました。(昔秋月で買ったatmega88vが220円の袋に入っていましたが、今ググったら150円に値下がりしていました。)

しかし、この写真の、昔作ったAVRライタはFT232RL(USBシリアル変換)+ponyser(シリアルAVRライタ)USBaspを作りました。

USBasp以外にもいろいろ書き込みハードやソフトがあるようですが、個人で作成されているためそちらは触る気がおきませんでした。オープンソースでだれでも開発に参加できる、というふうではなくてオリジナルの開発者が自分のホームページで公開しているというだけだと、その人の仕事が忙しくなったとかで保守ができなくなることはよくありますので。

そういう意味では、USBaspはGNUGPLv2のもとファームソースが公開されているUSB AVRライタですし、デファクトスタンダード(と私は勝手思っている)でこちらもGNUGPLv2な書き込みソフトavrdudeから使えるというのは良いです。avrdudeはwindowsからでも使えますし、ubuntu gnu/linuxならapt-getでインストールできるのも楽です。さらにavrdudeは、WinAVRgoogle:winavrに標準で入っていて、programmers notepadという開発環境からAVR studio風にボタンひとつでコンパイル・ダウンロード(orプログラム)ができます。

さて、手元の部品で作成するにあたり3.3Vツェナー(Zener)ダイオードがありませんので、代わりに青色発光ダイオードの順方向電圧を使うことにしました。そんな電圧が不安定そうな(I-V特性が悪そうな)ものでよいのか、と思いましたが(定電圧)ツェナーダイオードのデータシートを読むと発光ダイオードの順方向とたいして不安定さは変わらず、十分代用できるように思えます。
その話題はここでも議論されています。http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2Fnews25a#nc0d3993
実際に青色ダイオード(型番不明2種類)のI-V特性を測定してみますと、こんな感じでした。(なお緑色ダイオードは多くが~2.0 Vでしたが、一種類だけ青色ダイオード相当の3.0 Vのものがありました。)

@100 Ohm
Vin Vout
テープ青led
5.30 3.355
5.0 3.319
4.7 3.263
4.48 3.235
4.24 3.173
4.03 3.143
3.77 3.084
3.50 3.013
3.21 2.919
3.02 2.840
2.87 2.762
2.44 2.42
0.916 0.88

3mm青
2.796 2.731
3.036 2.866
3.280 2.989
3.562 3.088
3.979 3.206
4.365 3.295
4.548 3.320
4.761 3.359
5.020 3.401
5.377 3.459


例えばルネサスの定電圧ダイオードのデータシートはこちらにありましたが、3.0 Vのダイオードで比較的リニアーなI-V特性のところを読むと、2 mA@3.0 V, 10 mA@3.5 V -> dV/dI = 0.063 mA で、LEDとくらべてたいして変わりません。
http://japan.renesas.com/products/discrete/diode/constant/Documentation.jsp

USBスレーブコントローラとしてAVRのatmega88vを12MHzにオーバークロックして使うつもりでいましたが、ヒューズビット(Hfuse)0xddをGUI経由で書き込みしたところ、GUIソフトが十六進表記を理解せず、Hfuse最上位ビットがプログラム(0)されてしまい、RESETピンがIOピンになってしまいました。高電圧パラレルライタを持っていないので、つまりatmega88vは死んでしまいました。
他にはatmega328pという大容量版があったのでこれを使うことにしました。88用のファームを書いたところ、動作しませんでした。そこで、ファームウェアソースコードから384p用にコンパイルしなおしました。Makefileのターゲットをatmega328にしてmakeしただけです。

TARGET=atmega328
HFUSE=0xdd
LFUSE=0xff

そしてhfuse, lfuseは88と同じはずなので、これも0xdd, 0xffと書き込みました。
作成されたmain.hexを書き込んだところ、無事windowsに認識されました。
青色ダイオードの電圧を測ると、5 VをAVRがかけた時も、PCから3.3 Vが入った時も、~3.0 Vとなっており、ツェナーダイオードの代わりとして無事使えることが分かりました。

なお抵抗は68Ω ->100Ωとしています。2.2 kオームプルアップ抵抗は、1.5 kΩが正しいのでは?と思いますが、どちらもないので、1 kΩを差しています。3.3 kΩを並列するのが良いかもしれません。プルアップが強すぎると、データラインをGNDに落とすときに負荷が大きくなりますので。
クロックについては、USBはNRZIを情報の符号方法に使っていて、わりと正確なクロックが必要なので、10年前にデジットで買った水晶をさしています。
RESETピンのプルアップは、データシートを見ると実は内部プルアップされているので、外部でわざわざつけなくてもよいと思う。

プルアップされている方のデータラインの青色ダイオードが強く光っています。


基板に載せました。

余っている蛇の目基板がなかったので、すでに使っている基板の端を割って使いました。

これをPCに差すと認識します。
しかし、avrdude 5.1で使おうとすると、このようなエラーが出て動いてくれません。

error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc

どうもwindows の64 bit系のOSだと、署名されていないドライバはそのままでは使えないようです。そこでここで書かれているように、PCの再起動をしてwindows起動中にF8を押して出てくるメニューのところで、「ドライバの署名を強制しない」を選びました。
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=788666
そしたら無事使えるようになりました。
しかし、再起動すると無効になるので、起動のたびにこれをしないといけないのがめんどい。ということで、ドライバを作りなおしました。
最新のlibusb-win32をダウンロードして(ver. 1.2.6) usbaspを接続した状態で、bin/inf-wizard.exeを実行します。usbaspの装置情報を読み取って、勝手にinfファイルを作ってインストールしてくれます。これだと署名が無効といわれず、無事使うことができます。

 trying to connect to device...

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.04s

avrdude: Device signature = 0x1e950f
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed

         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "C:\data\ele\avr\tmp\led.hex"
avrdude: writing flash (934 bytes):

Writing | ################################################## | 100% 4.48s



avrdude: 934 bytes of flash written
avrdude: verifying flash memory against C:\data\ele\avr\tmp\led.hex:
avrdude: load data flash data from input file C:\data\ele\avr\tmp\led.hex:
avrdude: input file C:\data\ele\avr\tmp\led.hex contains 934 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 4.05s



avrdude: verifying ...
avrdude: 934 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

ターゲットのCLKが1MHzなので、slowモードで書き込みしていますが1 kB を、5 sec程度で読み書きできています。この速度だったら、いつもslowモードでも良さそうな気もする...