AVR 遊び
一つ上に移動AVR 遊びその1
オシゴトの関係で AVR マイコンをいじることになりました。最初は「PIC とナニが違うんだ?」なんて思っていましたが、PIC に比べ後発だけあって PIC に比べてアーキテクチャが洗練され、コンパイラとの相性もバッチリ。 gcc 標準サポートということでこれからマイコンを始めるには AVR の方がオススメなよーです。
プログラム開発環境は gcc でやるにしても出来上がったプログラムをどーやってチップに書き込むかが問題(と、言っても1万数千円出せばチップメーカーの開発キットが手に入るんですが、どれだけ使うかワカランモンにマン単位の金は出せないというのと、人に軽く薦めるにはちょっと躊躇われる額だなぁと(わらい))。と、いうことでインターネットで調査してみたところ、D-Sub 25pin コネクタ(パラレルに接続) + 抵抗4本で出来るらしいけど、どーもケーブルを長くすると動作が不安定になるらしく、ちょっと不安ということで、信号線に3ステートバッファを入れた「バッファ版」を作ることにしました。
パラレルライタの元ネタ
http://www.harbaum.org/till/lcd2usb/avrisp.gif
バッファ無しタイプはコチラ
http://www.bsdhome.com/avrdude/
そんなワケで完成したのがコレです。
左側リボンケーブルがパラレルポートに繋がるケーブルで、手前左側のチップが3ステートバッファー。手前右側にあるチップが書き込み対象(ターゲット)の AVR マイコン(ATmega48)です。
ちなみに、奥側にある子基板は電源回路です。
ちゃんと基板に組めばいいのに、ナゼかブレッドボードで組んでいます(わらい
と、いうことで開発環境の完成です♪
・・・んっ、Mac にはパラレルポートなんて無いのにどーやって繋いだかって?
ちっ、バレたか(ぉぃ
と、いうことで実は玄箱へのオマージュマシン馬鹿箱(あくまで NAS です(わらい)に繋いで、Mac からは ssh で馬鹿箱に入ってそこから AVR ライタを制御していました。
やはり、レガシーフリーなマシンでスクラッチから開発環境を整えるのは難しいようで...
馬鹿箱では Debian 4.0 を使っているのですが、書き込み環境さえ完成させれば、AVR 用の gcc や書き込みソフトはパッケージ化されているのをインストールするだけなので、至って簡単でした。
ちなみに、ファームウェアの書き込みにはコレを使いました。
http://savannah.nongnu.org/projects/avrdude/
- カテゴリ
- AVR 遊び
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/avr001/tbping
Mac で AVR 遊びがしたーい
前のエントリではNASボックスの Linux マシンで開発を始めたワケですが、やっぱ普段使っている Mac ちゃんで開発したーい。
と、言うことで早速調査開始。
- MacAVR ( http://www.harbaum.org/till/macavr/index.shtml )
- そのものズバリの Mac で AVR マイコンを開発したいヒト向け TIPS 。AVR の開発にはナニが必要かが分かります。ココに書いてあるモノを一通り揃えれば開発は出来るみたい。
- Embedded Development with Xcode ( http://www.macdevcenter.com/pub/a/mac/2005/01/21/embedded.html )
- Mac OS X 付属の X Code を使って組み込み系を開発するヒト向け TIPS。ワタシはまだこの段階に達していないので、ちゃんと読んでいないけど、一部ちょっと情報が古いかなーってのがあるものの、今後お世話になりそうな予感。X Code で開発しようなんて考えようともしてませんでしたわ(ばき
- AVRDUDE - AVR Downloader/UploaDEr ( http://www.nongnu.org/avrdude/ )
- オープンソースな AVR ファームウェア書き込み(読み出し)ソフト。このソフトが登場する以前は uisp と言うものが使われていたよーですが、開発が止まって何年もたつので、AVRDUDE に世代交代したのかも。
- USBasp - USB programmer for Atmel AVR controllers ( http://www.fischl.de/usbasp/ )
- USB 接続な AVR ライタ。コレならレガシーフリーなパソコンでも安心してファームウェアの書き込みが出来ます。プラットフォームはWindows、MacOS X、Linux に対応、avrdude 5.2 以降に対応してます。あちこちで紹介されているので、オープンソース系開発環境ではメジャーな存在みたいです。ただし、このライタでは AVR マイコンを使っており、ライタのファームウェアの書き込みをどーするのかという「ニワトリが先かタマゴが先か」状態に...(ばき)。ただし、「ニワトリ...」の問題が何とかなれば(パソコンを借りるとか)ワンチップで出来て非常にシンプルなのでオススメ。
- Cypress EZ-USB で USB CDC ACM もどき ( http://homepage.mac.com/nand/hacks/pucomdev.html )
- Ez-USB(USBインターフェース内蔵 USB ターゲット用マイコン)を使って AVR などの ISP (In System Programming)対応マイコンのライタを作ろうという計画。Ez-USB は Mac OS X 付属の Developer CD にファームウェア書き込みツールがバンドルされていて(コンパイラはオープンソースなマイコン用コンパイラ sdcc が使えるけど自分でインストールしなければならない)、書き込みも USB で行えるため、先述の USBasp で起きたような「ニワトリ...」の問題は発生しないので期待したのだけど、志半ばで開発が止まってしまったみたい...残念。 あと、記事で使われている Ez-USB は今ではちょっと入手が難しいってのも残念な点(後継品が秋月で見掛けた気がするので、それが使えたらちょっと良いかも)。
と、言う感じでした。やっぱ Mac で組み込み系は結構大変だわ。これが Windows だったら開発ソフトはチップベンダー純正の IDE が無料で手に入るし、ライタも純正 IDE に対応したライタなんてのもあるようなのでラクチンなんだろうなぁと(ばき
などとグチってもしゃーないけど、ライタさえ何とかなれば Mac でも開発できることが分かりました。ということでライタなワケですが、どーも、Ez-USB がダメとなると「ニワトリ...」の問題はどーにもならないよーなので、USBasp を作ることにします。
| 図記号 | 定格値 | 数量 |
|---|---|---|
| IC1 | ATmega8 または 48 | 1 |
| R1,R2 | 68Ω | 2 |
| R3 | 2.2kΩ | 1 |
| R4,R5,R7 | 1kΩ | 3 |
| R6 | 10kΩ | 1 |
| C1 | 4.7uF 電解 | 1 |
| C3 | 0.1uF 積層セラミック | 1 |
| C4,C5 | 22pF セラミック | 2 |
| LED1 | 緑 LED | 1 |
| LED2 | 赤 LED | 1 |
| D1,D2 | 3.6V ツェナーダイオード | 2 |
| Q1 | 12Mhz 水晶振動子 | 1 |
| X1 | USB コネクタ(B) | 1 |
| J1,J2,J3,X2 | 2x10 ピンヘッダ(切って使用) | 1 |
| − | ユニバーサル基板の切れ端 | 1 |
| - | ジャンパピン | 3 |
その他、配線用のラッピングワイヤ(または UWE 線)やらハンダなんてのもありますが割愛。ヒトによっては 28pin の IC ソケット。この中で一番入手が難しいのは AVR マイコン(ATmega8 または 48)かも...(ぉぃ)。AVR も人気が出てきたとは言えアキバ界隈では PIC が優勢で AVR はまだ肩身が狭いです。今のところ アキバ界隈で AVR マイコンが充実している店は IT プラザとマルツでした。ただし、秋月でも少ないながらも扱いがあり、秋月で手に入るモデルは秋月で買った方が安かったです(ATtiny2313 ATmega64,128 など)。
組み立てる際のポイントは、USB コネクタのピン接続を間違えないようにすること位で、あとは接続しているところは繋がっていて、絶縁されているべきところは絶縁されていれば動くと思います(ばき
そんなワケで製作例としてワタシの作品をば。写真下側にある物体は、大きさの比較用の電池です。
そして裏から見た図。
これを見ればどの程度の難易度か大体の感じは掴めるのではないでしょーか?
ハードウェアが組み上がったところで、ファームウェアの書き込みです。USBasp の J2 と J1 にジャンパピンを差し込み、次にパラレル接続ライタの ISP ケーブルを USBasp の X2 に繋ぎ、USBasp とパソコンを USB ケーブルで繋ぎ(USBasp と パラレル接続ライタに電源を供給するため)
、これで書き込み準備は完了。というのが普通の手順ですが、ワタシは、パラレル接続ライタと USBasp に乗せるマイコンをブレッドボード上で組んだので、あとは avrdude を走らせればファームウェアが書き込まれるようになってるハズ。
書き込みの準備が出来たら avrdude でファームウェアを書き込みます。と、その前にパラレル接続ライタの場合(シリアルでもそーかもだけど)、パラレルポートのデバイスファイル(/dev/parport0)を読み書き出来るようにパーミッションを変更します。パラレルポートが使えるようになったところで avrdude でファームウェアの書き込みを行います。
avrdude の起動時に必須のパラメータは、ターゲットの種類の略号(manページ参照)と AVR ライタの種類(${HOME}/.avrduderc にデフォルトを設定すれば省略可能)です。今回使用したターゲットは ATmega48 なので、略号は m48 、製作したライタは STK-200 なので、略号は stk200 (/etc/avrdude.conf 参照)ですので、起動に成功するとこんな感じになるです。
isi@BakaBako:~/usbasp.1.2006-12-29/bin/firmware$ avrdude -c stk200 -p m48
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9205
avrdude: safemode: Fuses OK
avrdude done. Thank you.
isi@BakaBako:~/usbasp.1.2006-12-29/bin/firmware$
こんなメッセージが出れば成功ですので、ファームウェアの書き込みを行います。”-U"オプションで指定し、<メモリの種類>:<モード(r=読み込み,w=書き込み)>:<ファイル名>:<a(ファイルフォーマット自動判別)>となります。
isi@BakaBako:~/usbasp.1.2006-12-29/bin/firmware$ avrdude -c stk200 -p m48 -U flash:w:"./usbasp.atmega48.2006-12-29.hex":a
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9205
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 "./usbasp.atmega48.2006-12-29.hex"
avrdude: input file ./usbasp.atmega48.2006-12-29.hex auto detected as Intel Hex
avrdude: writing flash (3394 bytes):
Writing | ################################################## | 100% 1.94s
avrdude: 3394 bytes of flash written
avrdude: verifying flash memory against ./usbasp.atmega48.2006-12-29.hex:
avrdude: load data flash data from input file ./usbasp.atmega48.2006-12-29.hex:
avrdude: input file ./usbasp.atmega48.2006-12-29.hex auto detected as Intel Hex
avrdude: input file ./usbasp.atmega48.2006-12-29.hex contains 3394 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 1.42s
avrdude: verifying ...
avrdude: 3394 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done. Thank you.
isi@BakaBako:~/usbasp.1.2006-12-29/bin/firmware$
これで、プログラムメモリの書き込みは終了ですので、次にフューズデータの書き換えを行います。フーズデータとは、ハードウェアの動作モードを(クロックや電源電圧、I/O ポートなど)設定するための領域です。今回 USBasp の README に書かれている値をターゲットに書き込んでやりますが、データの量が2バイトと少ないので、対話モードで書き込むことにしました("-t" オプション)。
isi@BakaBako:~/usbasp.1.2006-12-29/bin/firmware$ avrdude -c stk200 -p m48 -tこれで、ターゲットへの書き込み操作は全て終了。USB ケーブルで Mac と繋いでみます。と言っても Windows とは違い Mac の場合、新しい USB デバイスを繋いでもフンともスンとも言わないので、 Apple の開発キットにある「USB Prober」でチェックします。するとこんな感じになりました♪
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9205
avrdude>
avrdude> write hfuse 0000 0xdd
>>> write hfuse 0000 0xdd
avrdude> write lfuse 0000 0xff
>>> write lfuse 0000 0xff
avrdude> quit
>>> quit
avrdude: safemode: Fuses OK
avrdude done. Thank you.
isi@BakaBako:~/usbasp.1.2006-12-29/bin/firmware$

と、いうことでちゃんと動いたよーです♪
つーことで、完成〜♪
...たぶん(ばき
USBasp で書き込みテストをして成功したら完成なんだろーけど、もう疲れました(ばき
つーか、このブログ書くのが一番疲れた(ぉぃ
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
Mac で AVR 遊び成功♪
前回のエントリでは、ハードウェアが完成したところで力尽きて終了しちゃったので、今回はその続きでありんす(わらい
うかうかしていたら、何だかんだとあれから一週間も経っているではないか(ばき
前回のエントリで見付けた MacAVR を参考に...と、その前に何となく Fink Commander を覗いていたら、 AVR 用 gcc である avr-gcc と AVR 用の Binutils ( avr-binutils )を見付けちゃったので、そのまま Fink でインストールしてみました。 ちなみに、 2007.06.24現在のバージョンはそれぞれ、gcc が 3.3.2-1 で avr-binutils が 2.14-1 でした。
これでコンパイル環境が揃ったので(たぶん)、プログラム(フューズデータ)書き込みソフトウェアの avrdude のインストールをします。こちらはどーも、Fink には無いよーで、 MacAVR を参考にソースからコンパイルしてみることに...
すると、サイトにはこんな記述が
The usbasp enabled version of avrdude uses the libusb to access the usbasb hardware. I therefore installed libusb for macos from the fink project.
USB なライタ、USBasp を使うには libusb を Fink でインストールする必要があるよーですので、インストールしました。ちなみに 2007.06.24 の時点でのバージョンは 0.1.12-1010 でした。
avrdude のインストールの準備が整ったので、最新版である 5.4 のソースをダウンロードして、./conigure、make、make install とナニゴトも無く進み「いぇーい、楽勝ぢゃーん」と余裕ぶっこいて起動して愕然としました(ばき
bakabon-86air:~/desktop/avrdude-5.4 isi$ ./avrdude -c usbasp -p m8 -t
avrdude: error: no usb support. please compile again with libusb installed.
bakabon-86air:~/desktop/avrdude-5.4 isi$
えーっ、さっき libusb ちゃーんとインストールしたぢゃーん。
と悪態つきつつさっきの続きを読んでみると(最初から全部読めって?)、こんな記述が(ばき
Since the avrdude configure script didn't find libusb under /sw/lib and /sw/include i made two symbolic links from /sw/include/usb.h to /usr/include/usb.h and from /sw/lib/libusb.a to /usr/lib/libusb.a. Avrdude compiled fine afterwards.
どーやら、./confugure スクリプトのサーチパスには /sw ディレクトリは含まれていないよーですので、記述に従いシンボリックリンクを張ることにしました。
bakabon-86air:~/desktop/avrdude-5.4 isi$ ln -s /sw/include/usb.h /usr/include/usb.h
bakabon-86air:~/desktop/avrdude-5.4 isi$ ln -s /sw/lib/libusb.a /usr/lib/libusb.a
と、こんな感じにヤッたところで再びビルト♪
・・・そして失敗(ばき
この時点でもー嫌気が差したので、Mac を放り出して 馬鹿箱(あくまで NAS です(わらい) でAVR遊びしてました(ばき
ひとしきり、 LED をピコピコさせたりなどして遊んで(何日も遊んでました)ほとぼりが冷めたのでもう一度調査開始。すると、どーも、gcc、binutils、avr-libc(そーいれば、Fink には無かった)、avrdude 、libusb の全てが Darwin Ports でインストール可能で、しかもこっちの方がバージョンが新しいみたいです。
最新ではないものの、avr の開発環境はバージョンによって大きく仕様が変わるようで、馬鹿箱 でAVR 遊びしているときも、コンパイルできないソースがあったりしましたので、今までインストールしたソフトをご破算にして Darwin Ports でインストールし直しました。
bakabon-86air:/opt/local super_isi$ sudo port install avr-gcc
Password:
---> Fetching avr-binutils
---> Attempting to fetch binutils-2.16.1.tar.bz2 from http://ftp.gnu.org/gnu/binutils
---> Verifying checksum(s) for avr-binutils
---> Extracting avr-binutils
---> Configuring avr-binutils
---> Building avr-binutils with target all
---> Staging avr-binutils into destroot
---> Packaging tgz archive for avr-binutils 2.16.1_0
---> Installing avr-binutils 2.16.1_0
---> Activating avr-binutils 2.16.1_0
---> Cleaning avr-binutils
---> Fetching avr-gcc
---> Attempting to fetch gcc-4.0.2.tar.bz2 from http://ftp.gnu.org/gnu/gcc/gcc-4.0.2/
---> Verifying checksum(s) for avr-gcc
---> Extracting avr-gcc
---> Configuring avr-gcc
---> Building avr-gcc with target all
---> Staging avr-gcc into destroot
---> Packaging tgz archive for avr-gcc 4.0.2_0
---> Installing avr-gcc 4.0.2_0
---> Activating avr-gcc 4.0.2_0
---> Cleaning avr-gcc
bakabon-86air:/opt/local super_isi$
bakabon-86air:/opt/local super_isi$ sudo port install avr-libc
---> Fetching binutils
---> Verifying checksum(s) for binutils
---> Extracting binutils
---> Applying patches to binutils
---> Configuring binutils
---> Building binutils with target all
---> Staging binutils into destroot
---> Packaging tgz archive for binutils 2.16.1_0
---> Installing binutils 2.16.1_0
---> Activating binutils 2.16.1_0
---> Cleaning binutils
---> Fetching avr-libc
---> Attempting to fetch avr-libc-1.4.4.tar.bz2 from http://savannah.nongnu.org/download/avr-libc/
---> Verifying checksum(s) for avr-libc
---> Extracting avr-libc
---> Configuring avr-libc
---> Building avr-libc with target all
---> Staging avr-libc into destroot
---> Packaging tgz archive for avr-libc 1.4.4_0
---> Installing avr-libc 1.4.4_0
---> Activating avr-libc 1.4.4_0
---> Cleaning avr-libc
bakabon-86air:/opt/local super_isi$
bakabon-86air:/opt/local super_isi$ sudo port install avrdude
---> Fetching libusb
---> Attempting to fetch libusb-0.1.12.tar.gz from http://downloads.sourceforge.net/libusb
---> Verifying checksum(s) for libusb
---> Extracting libusb
---> Configuring libusb
---> Building libusb with target all
---> Staging libusb into destroot
---> Packaging tgz archive for libusb 0.1.12_0
---> Installing libusb 0.1.12_0
---> Activating libusb 0.1.12_0
---> Cleaning libusb
---> Fetching avrdude
---> Attempting to fetch avrdude-5.3.1.tar.gz from http://savannah.nongnu.org/download/avrdude/
---> Verifying checksum(s) for avrdude
---> Extracting avrdude
---> Applying patches to avrdude
---> Configuring avrdude
---> Building avrdude with target all
---> Staging avrdude into destroot
---> Packaging tgz archive for avrdude 5.3.1_0
---> Installing avrdude 5.3.1_0
---> Activating avrdude 5.3.1_0
---> Cleaning avrdude
bakabon-86air:/opt/local super_isi$
2007.06.24 現在のDarwinports でのバージョンはこんな感じです。
| avr-gcc | 4.0.2_0 |
| avr-binutils | 2.16.1_0 |
| avr-libc | 1.4.4_0 |
| avrdude | 5.3.1_0 |
| libusb | 0.1.12_0 |
Mac で AVR 遊びファイナル・・・かな?
前回のエントリ で終了するつもりでしたが、オシゴトのソースがコンパイルできないというトラブルが発生したため。再びコンパイル環境を見直すことにしました。
ということで、まずは実際に出たエラーの抜粋をば。
hoge.c:139:14: error: invalid suffix "b00000011" on integer constant
対象の行を見ると、0b00000011 と書かれたコードを発見。 C 言語のルールでいけば、数値の先頭に ”0(ゼロ)" が付けば8進数、"0x "が付けば16進数ですので、"0b" はバイナリ、つまり2進数だろうと予想したのですが、いかんせん C 言語は高校時代にちょとっと触っただけの初心者で自身が無く、 C 言語の入門書(確か「改訂版 プログラミング言語 C」)を調べてみたのですが、ANSI C には規定されていないようでした。そんなワケで、これは gcc もしくは AVR版 gcc の独自仕様で、ワタシが使っているバージョンは古く(3.2 だか 3.3)、新しいバージョン(4.x)でサポートしているのだろうと思い、Ports や Fink でのお気楽インストールではなく、gcc のソースを落としてきて手動でコンパイルとインストールに挑戦してみることにしました。
とは言え make 一発で全て上手く行くとも思えず(えっ、README 読めって?)、検索してみるとこんなサイトを発見しました。
MiniPOV v3 Installing the software
http://www.ladyada.net/make/minipov3/software.html#macosx
これを読んでみると、gcc から avrdude まで必要なソフトが全部入れられそうで、紹介されているソフトのバージョンも比較的新しいということで、せっかくなら全て最新版にしようと思い、今までインストールしたソフトを全て消して、新たにインストール開始。
XCode のダウン道路&インストール
AVR 用 gcc (avr-gcc)をコンパイルするためのコンパイラを使うため、Apple の開発者向けサイトから XCode の最新版をダウン道路してインストール。もちろん、すでに最新版にしているヒトは不要な作業。データサイズが900MB 以上あるので、一連の作業でもっとも時間が掛かったかも(わらい
- 「ターミナル」&「テキストエディタ」の設定の設定
- 「ターミナル」を起動し、使用するシェルをデフォルトの bash から csh に変更?ナゼに変更する必要があるのかナゾ。ワタシは bash のままで作業しましたが特に問題なかったでので、多分作者のシュミではないかと。次に「テキストエディタ」の設定。ファイルの保存形式をデフォルトのリッチテキスト形式からプレインテキスト形式に変更します(ただし、テキスト編集も vi や Emacs でやるヒトは不要)。
- ~/.cshrc または ~/,bashrc の変更と作業ディレクトリの作成
- csh なヒトは ~/.cshrc、bash なヒトは ~/.bashrc を変更/作成し、PATH に ” /usr/local/bin ”を追加する。設定が終わったら、新しいウィンドウをもう一つ開き、正しく設定されているか echo $PATH と入力して /usr/local/bin が表示されることを確認。次にここからは元ネタには無い作業ですが、ホームディレクトリが落としてきたファイルやらでグチャグチャになるのがイヤなので、作業用ディレクトリを作成して、カレントディレクトリをそこへ移動します(以降、~/avr/ で作業)。ということで、これで準備完了。
- binutils のダウン道路&インストール
- 近所のミラーサイトから binutils のソースをダウン道路して、作業ディレクトリに展開。binutils のディレクトリに移り ./configure --target=avr を実行。./configure スクリプトが終わったところで、make を実行し、sudo make install を実行してインストール。
- gcc のダウン道路&インストール
- 近所のミラーサイトから gcc のソースをダウン道路して、作業用ディレクトリに展開。 作業用ディレクトリ(~/var/)で mkdir avrgcc-4.2 (名前はご自由に)とやって、gcc 用作業ディレクトリを作成し、cd avrgcc-4.2 と入力してカレントディレクトリをそこに移す。../gcc-4.2.0/configure --target=avr --enable-languages=c --disable-libssp を実行。../gcc-4.2.0/configure スクリプトが終わったところで、make CC="cc -no-cpp-precomp" を実行。時間が掛かるのでサンドイッチを食べに行く...だって元ネタにそー書いてあるんだもん(ばき
サンドイッチを食べ終わったらmakeが終わったら、sudo make install を実行。 - avr-libc のダウン道路&インストール
- http://download.savannah.gnu.org/releases/avr-libc/ からソースをダウン道路して、 作業用ディレクトリに展開。 avr-libc のディレクトリにカレントディレクトリを移して、./configure --host=avr を実行。./configure が終わったところで、 make & sudo make install を実行。
- libusb のインストール
- libusb に関しては、調べたところ前回 Ports で入れたものが最新のバージョンであるようなので、/opt/local/lib と /opt/local/include にある libusb 関連のファイルへのシンボリックリンクを /usr/local/lib と /usr/local/include に置いた。
- avrdude のダウン道路&インストール
- http://download.savannah.gnu.org/releases/avrdude/ からソースをダウン道路して、作業用ディレクトリに展開。avrdude のディレクトリにカレントディレクトリを移して、./configure を実行。 ./configure が終わったところで、 make & sudo make install を実行。
こんな感じで全てのソフトを最新にしたところで、件のソースをコンパイル...がーん、また同じエラーぢゃーん(泣
オシゴトのソースを書いたヒトは Windows 環境のようで、コンパイラは WinAVR。WinAVR は gcc-avr を Windows に移植したものですが、普通の gcc とはちと違うのかしら?ということで、その2進数らしいものを16進数にしてその時はコンパイルを通してヨシとしたわけですが、やはり気になり調べてみると、" 0b " プリフィックスは、パッチで対応しているという情報を見付けました。
Implement binary constants with a "0b" prefix
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23479
どーやら、0b プリフィックスはまだ本家には取り込まれていない機能だったよーですので、このパッチをダウン道路し、こんな感じで
cd ~/var/gcc-4.2.0
patch -p1 < ../patch-0b-with-testsuite.diff
パッチ当てをしたあとは先述したgcc のインストールと同じ方法で再インストールしました。
そして、件のソースをコンパイル...
いぇーーーーい、上手く行ったぜー♪
ってなワケで、よーやくコンパイル&書き込み環境が完成いたしましたー。
従って、インストールの流れとしましては
| XCode のインストール |
| ↓ |
| 「ターミナル」のカスタマイズ |
| ↓ |
| binutils のインストール |
| ↓ |
| 0b パッチ当て |
| ↓ |
| gcc インストール |
| ↓ |
| avr-libc のインストール |
| ↓ |
| libusb のインストール |
| ↓ |
| avrdude のインストール |
以上、みなさま長い間お付き合いいただきありがとーございました(わらい
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/avr004/tbping
はじめてのArduino

今ギョーカイで話題の(何の業界だよ(゚o゚)\バキ) Arduino( http://www.arduino.cc/ ) を遅ばせながらワタクシも組んでみました、ブレッドボードで♪
ここ1,2年ずっとArduinoの存在は知っていて、Make:Blog で盛り上がってるのを見て使ってみようとは思っていたのですが、毎度のことのようにワタシの怠惰な性格が災いして、部品を用意しただけで完成した気になって半年?1年?ほど放置プレイしていたのですが、沖縄からオシゴトで横浜に滞在している友人(とワタシは信じている(゚o゚)\バキ)鴨澤氏が「呑み屋で酒呑みながら Arduino を組たーい」と突然言いだし、部品以外は何も準備していないワタシも居酒屋で電子工作なんてシュールでオモロイと軽い気持ちで承諾したのをきっかけにプロジェクトが始動しました(わらい
そんなワケで、Mac とブレッドボード以外、必要なブツを何も持っていない鴨澤氏をナビゲートし部品を揃えるところからスタート。たまたま印刷してあった Arduino Diecimila の回路図( http://www.arduino.cc/en/uploads/Main/Arduino-Diecimila-schematic.pdf )を元にパーツを揃えることに。と言っても全部揃えても組むのが面倒なので必要最低限に押さえていきます。
| ATmega168 | 1 | マルツパーツ |
| USB - シリアル変換(AE-UM232R) | 1 | 秋月電子 |
| 16MHz セラロック | 1 | 同上 |
| 1kΩ抵抗 | 3 | 千石電商’ |
| 10kΩ抵抗 | 2 | 同上 |
| LED(赤) | 1 | 秋月電子 |
| タクトスイッチ | 1 | 同上 |
結局、鴨澤氏の友人のケータイが電波が入ると言うことでネットで調べたりしたものの、その前にワタシが酔っぱらってきて使い物にならなくなったため、その日は失敗に終わってしまいました(゚o゚)\バキ
とまーヒジョーに情けない結果に終わってしまったので、家に帰りちゃんと(?)調べ直しました。
上の写真のように USB-シリアル(TTL)変換アダプタによる ISP 接続に挑戦してみました(RS232 側の端子の数字は D-Sub 9pin の場合のpin番号)...
んー、どうにもこうにも AVR が ISP モードに切り替わってくれません(泣)。もっとも、パラレルポートを使った STK-200 モドキを使えば簡単かつ速く(書き込み速度)できるのですが、いかんせん Mac にはパラレルポートは無いため繋ぐことすら不可能(USB - パラレル変換って手もありそうだけど、ワタシが調べた限りでは Mac OS 以外を含めても事例が見付からなかったです。)。

ということで、USB - シリアル(TTL)変換基板から手持ちの USB - RS-232 変換ケーブル挑戦することにしました。ちなみに今回は、手持ちのツェナーダイオードが 3.0V のモノと 3.6V のモノしかなかったので電源電圧を USB から失敬していた 5V から 独立電源の 3.3V に変更してますが、もしこれからヤル場合は 5V のツェナーダイオードにして電源も USB から取った方がラクにできます。
接続が完了したところで、avrdude で接続実験...今度は上手く繋がったようです。どーも、USB - シリアル(TTL)変換基板の制御信号出力を反転させればいいような気がしますが、その辺の設定は Windows 用設定ソフトでやるようで、Mac や Linux などからは出来ないみたい。
つーことで、接続の確認が出来たところで、Arduino Bootloader と一緒に落としてきた Makefile を書き換えてから、make してみました。
Makefile 変更前
# enter the parameters for the avrdude isp tool
ISPTOOL = stk500v2
ISPPORT = usb
ISPSPEED = -b 115200
Makefile 変更後
# enter the parameters for the avrdude isp tool
ISPTOOL = dasa
ISPPORT = /dev/cu.PL2303-0000103D #USB-シリアル変換アダプタのデバイスファイル名
ISPSPEED = -b 115200
Bootloader の書き込みコマンド(Arduino Diecimila の場合)
hoge:Bootloader isi$ make TARGET=diecimila isp
これで、一応書き込み出来るのですが...それにしても遅せぇーーーー!(゚o゚)\バキ
Bootloader のデータ量は 15kB 程なのですが、1時間経っても2%位しか進んでいないです(ぉぃ
このままでは全部書き込みが終わるのに1日仕事になりそーだし、そんなに待ってられん、つーことでシリアルでの書き込みは中断して、Makefile を書き換え、以前作った USBasp で書き込むことにします。
Makefile を USBasp 用に書き換えたところ。
# enter the parameters for the avrdude isp tool
ISPTOOL = usbasp
ISPPORT = usb
ISPSPEED =
今度は4,5分で無事書き込みが終了♪早速ブレッドボードに USB-シリアル(TTL)変換基板と ATmega168 を載せ簡易版 Arduino を組み立てて動かしてみました。
ところが、プログラム書き込みに失敗。つーか、↓回路図写真中央の赤丸部分(右下の赤丸ぢゃないよん)は何なんだろう?
R2,R3 ってことは抵抗だろうなー、と思いテキトーに(1k,4.7k,10k とかそんな感じ)抵抗を入れていたのですが、よく分からず。つーか、Arduino Software が通信タイムアウトエラー出すまでずっとリセット状態のままぢゃない?つまり、ブートローダーが起動してない状態のままですから当然通信なんてしてくれないワケでして、ならばいっそのこと R2,R3 のことは無視しして何も繋がずに、Arduino Software の Upload ボタンをクリックしたらソッコーでリセットボタンを押す作戦に変更し、再挑戦...
おっ、今度は上手く行ったぞ♪
どーやら、予想的中したみたいっす♪ということで何も繋がないで正解みたい。つーか、マニュアルにはそー書いてあるのかしらねー(ちゃんと読めよ<ヲレ)?
それにしても、この方法は面倒くさいし、ちょっとダサ過ぎやしないか?なんかこーもうちょっとスマートにしたいところ。R2,R3 はUSB-シリアル変換(TTL)の RTS,DTR に繋がっていて、それらの端子はシリアル通信を開始すると H→L になるので、これを上手いこと使えば書き込み時にリセットボタンを押す必要もなくなるのではないか?
つーことで、R2 のところに抵抗ではなく、0.1uF のコンデンサを入れてやることにして、0.1uF のコンデンサが充電される間の短い時間だけリセットが掛かるようにしたところ上手く行きました♪
成功して気をよくしたワタシは「ああ、ヲレってスーパーハッカーぢゃねー?」なんて調子に乗ってたら、Arduino のサイトにある Hacking コーナーに同じネタがあってガッカリしました(ばき

そんなワケで、回路を理解できたところで、コイツをユニバーサル基板に組み上げて、isiduino (ぉぃ)にしてみました。ATmega168が乗った親基板に 秋月 USB-シリアル(TTL)変換基板が乗った親子亀構成で、ケチなワタシは変換基板を外せるようにしています。
と、一応完成したのですが、各端子に信号名がないので使いにくいです。まー調べれば良いんだけど、それでは何のために基板にしたのかワカランしねー。でも、変換基板を外せるってのはいいよねー(誰に言ってるんだ?)。変換基板は Gainer とかでも使い回しできそうだしね♪
2008.04.01 訂正
2枚目の手描き回路図にあるツェナーダイオードの表記が間違ってました。正解はコチラ。
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
Arduinoで液晶遊び

前回のエントリーで作った isiduino でナニしようかとあれこれ考えていたところ、秋月で買ってきた液晶モジュール(SC1602BS-B)を発見したのでコイツを動かしてみようとゆーことにしました。そこで、まずはモジュールに付いてきたマニュアルを見ながらテキトーに isiduino に接続。あとは、初期化コードを送ったり表示データを送ったりして表示させるんだけど、マニュアル見てたら面倒になってきた(ぉぃ
そんなワケで、Arduino のサイト にサンプルコードでも無いかと探り入れたらやっぱりありました♪
サンプルコードと言うか、ライブラリ化されてました♪
Arduino Liquid Crystal Library LCD Interface
http://www.arduino.cc/en/Tutorial/LCDLibrary
サイトの指示に従い結線をやり直した後、ダウンロードしたファイルを” /<インストールしたディレクトリ>/arduino-xxxx/lib\targets/libraries/ ”にコピー・・・んっ?そんなディレクトリねーぞ(わらい)。どーも後のバージョン( arduino-0010 )でディレクトリ構成が変わってしまったよーです。つーことで、イロイロいじってみたところ、” /<インストールしたディレクトリ>/arduino-xxxx/hardware/libraries/ ”にコピーするとヨロシイよーなので、そこにコピー。

コピーした後、Arduino Software を起動し、[Sketch → Import Library]の順でクリックすると、 上のスクリーンショットのように ”LiquidCrystal” と表示されるようになり、これで使えるようになるハズ・・・
あれれ、メッセージウィンドウに何かエラーが出てるし(゚o゚)\バキ
#インデントが入っている行は前の行の続き
LiquidCrystal.cpp:8: error: declaration of C function 'void pinMode(int, int)' conflicts with
/arduino-0010/hardware/cores/arduino/wiring.h:74: error:
previous declaration 'void pinMode(uint8_t, uint8_t)' here
LiquidCrystal.cpp:9: error: declaration of C function 'void digitalWrite(int, int)' conflicts with
/arduino-0010/hardware/cores/arduino/wiring.h:75: error:
previous declaration 'void digitalWrite(uint8_t, uint8_t)' here
LiquidCrystal.cpp:10: error: declaration of C function 'int digitalRead(int)' conflicts with
/arduino-0010/hardware/cores/arduino/wiring.h:76: error:
previous declaration 'int digitalRead(uint8_t)' here
エラー内容を見てみると、どーも呼び出している関数の引数の型があってないよーです。バージョンが新しくなって、型を変えたよーで、具体的には、pinMode,digitalWrite,digitalRead 関数の引数が int 型(確か16bit...だっけ?)から uint8_t 型(8bit)に変わってました。
ということで、Liquid Crystal ライブラリのソース(LiquidCrystal.cpp)を変更します。
変更前extern void pinMode(int, int);変更後
extern void digitalWrite(int, int);
extern int digitalRead(int);
extern void pinMode(uint8_t, uint8_t);
extern void digitalWrite(uint8_t, uint8_t);
extern int digitalRead(uint8_t);
これで、エラーもなくArduino Software が起動できるようになり、Liquid Crystal ライブラリが使えるようになりました♪
と言うことで、早速以下のよーなコードを書いて(実際にはライブラリに付いてきたサンプルコードを改造)動作実験♪
#include <LiquidCrystal.h> //include LiquidCrystal library
LiquidCrystal lcd = LiquidCrystal(); //create a LiquidCrystal object to control an LCD
char string1[] = "Hello World!"; //variable to store the string "Hello World!"
void setup(void){
lcd.init(); //initialize the LCD
lcd.printIn(string1); //send the string to the LCD
}
void loop(void){
}
・・・ありり?フンともスンとも言わないぞ(゚o゚)\バキ
そもそも、端子に信号名書いてないから、どこにナニが繋がってるのよく分からず、ちゃんと繋がってるのかすらアヤシイです(ぉぃ
とゆーことで、どこにナニが繋がってるのかを確かめるべくマルチメーターでチェケラしてみると・・・
1カ所イモハンダになってました(ぉぃ
問題の箇所をハンダし直して、もう一度挑戦すると、今度はちゃんと表示しました♪
でも、何か1行しか出てません。件の LCD Library のページ見ても1行しか出てないし、試しに1行分(16文字)以上の文字を出してみても、入りきれない分がちょん切れるだけで2行目にはナニも出ません。そんなワケで、液晶に付いてきたデータシートで確認してみると、初期化の時に2行表示にするか、1行表示にするか決めるよーで、ライブラリの初期化コードでは 1行表示モードに設定されているよーなので、LiquidCrystal.cpp のソースにある初期化コードを変更してみることにしました。
ちなみに、ライブラリのソースをいじった後は、Arduino Software を再起動するか、ライブラリのオブジェクトファイルを消してやってからぢゃないと変更内容は反映されないよーです(ワタシは後者で対応。make みたいに、ファイルの変更を検査してコンパイルしてくれればいいんだけど...)。
変更前(22行目)
#define init1 0x30
変更後
#define init1 0x38
すると、今度はちゃんと2行表示モードになりました♪
でも、この液晶には改行とゆー概念はないよーで(普通無いモノなの?)、行の途中で改行したいときは行の終わりまでスペースを入れなきゃならんの?などと思ったのですが、マニュアルで表示開始位置を決められるよーで、改行したくなったら表示開始位置を決めるコマンドを送ってやることで改行することが出来るようになるようです。
表示開始設定コマンド(2進数)
1xxxxxxx # x=開始位置アドレス7bit(先頭の1bitがコマンド)
今回買った液晶では 01000000b(16進では 40h)が2行目の先頭のアドレス(位置)になりますので、Arduino Software のコードでは以下のよーになります。
<オブジェクト>.commandWrite(0xC0);
そんなワケで先のコードを使って今度は2行表示のプログラムを作ってみました。
#include <LiquidCrystal.h> //include LiquidCrystal library
LiquidCrystal lcd = LiquidCrystal(); //create a LiquidCrystal object to control an LCD
char string0[] = "Hello World!"; //variable to store the string "Hello!"
char string1[] = "Hoge Hoge";
void setup(void){
lcd.init(); //initialize the LCD
lcd.printIn(string0);
lcd.commandWrite(0xC0);
lcd.printIn(string1); //send the string to the LCD
}
void loop(void){
}
上のコードを実行するとこんな感じに♪

とゆーことで、成功しました♪
それにしても、改行するだけのために、いちいちコード書くのはイヤだ。普通のプログラム言語みたいに、文字列中に ”¥n" があったら改行して欲しいっす。ライブラリのソースいじれば出来るんだけど(もちろんプログラム本体のソースいじっても良いんだけど、ライブラリに有った方が使い回し効くし)、でも今回はもう面倒なのでパス(ぉぃ
その代わりと言うか何というか、この液晶は一応、JIS X0201 に準拠しているので SJISの文字コードを送ってやればニホン語も表示可能です。と言っても2バイト文字は扱えないので、半角カタカナだけですが(゚o゚)\バキ
ということで、早速ニホン語のメッセージを書き込んで・・・と、行きたいところですが、どーも、Arduino Software は IM に対応してないらしくて(ATOK がダメなだけ?)、日本語を入力しようとしても受け付けてくれません。そこで、Arduino Software を一旦終了して、ソースファイルをテキストエディタで編集してからもう一度 Arduino Software で開くということをやって何とか入力(表示はちゃんと出来ました)(゚o゚)\バキ
#include <LiquidCrystal.h> //include LiquidCrystal library
LiquidCrystal lcd = LiquidCrystal(); //create a LiquidCrystal object to control an LCD
char string0[] = "コンニチハ セカイ";
char string1[] = "Hello World!"; //variable to store the string "Hello!"
void setup(void){
lcd.init(); //initialize the LCD
lcd.printIn(string0);
lcd.commandWrite(0xC0);
lcd.printIn(string1); //send the string to the LCD
}
void loop(void){
}
見事に文字化けしてますね♪
そしてこの様子を見て、「あっ、これ UTF-8 ぢゃねーかーっ!」とやっと気付きました(ぉぃ
そこでもう一度テキストエディタで開いて SJIS に変換した後にもう一度 Arduino Software で開くと、今度は IDE の方で文字化け♪まぁ、これは当然なんですが、文字化けした状態でコンパイルしようとするとエラー出まくり、問題の文字列をコメントアウトにしてもコンパイルエラーで、問題の文字列を消さないとダメでした。結局、今のところ一文字一文字チマチマと JIS コードに変換して書き込んでいくしか無さそうです。
JIS コードに変換したところ
char string0[] = {0xBA,0xDD,0xC6,0xC1,0xCA,0xA0,0xBE,0xB6,0xB2}; //"コンニチハ セカイ" JIS X0201 charactor code
すると、一番最初の写真のよーになります。
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/arduino-lcd/tbping
フルカラーPOVその1
Make: Japan 誌の仕事がきっかけで MiniPOV3 キット(http://www.ladyada.net/make/minipov3/index.html)と言うものを知り、感銘を受けたワタシはキットを買わずに(だって、送料とか高いぢゃん(゚o゚)\バキ←ケチすぎヲレ)、毎度のユニバーサル基板でサクッ(と言うほど仕事早くないですが(ぉぃ)と作ったわけですが、何かもの足らない。やっぱただ書いてあるとおりに作って出来上がりではちょっと味気ない。と言うことでとりあえずブレッドボードで RGB (赤・緑・青) LED を使って24bitフルカラーとまでは行かないまでもそれっぽいのが出来ました♪
動いたのはいいんですが、動作を確認したところで満足しちゃってそのまま数ヶ月放置(゚o゚)\バキブレッドボードに刺さりっぱなしにしていた LED の端子の色が変わっててしまうほどの放置っぷりでした(ぉぃ
ちゃんと正式に組まないまま放置するってのはスゲー邪魔なんだけど組むの面倒くせぇという気持ちと、完全にバラしてご破算にするのもなんだか惜しいなぁという気持ちの間で葛藤していたわけですが(「葛藤」とか書くとなんか高尚なモノっぽくなって良いね(ぉぃ)、この前参加した「Make: Tokyo Meeting」で刺激されて、ようやく決心が付いた次第。
とはいえ、出展者の方達のよーなスゲーのは全然無理なので、ユルユルになる予定ですが(゚o゚)\バキ
ただ、「 POV のフルカラー版でーす♪」だけではやっぱ弱いなぁつーことで、イロイロ考えてみたのですが、アイデアが浮かんでは消えを繰り返すばかりで進展がないので、とりあえず POV 部だけ組むことにしました。コイツを色んなモノにくっつけて実験できればアイデアも固まるだろうというのが狙いでし。
ユニバーサル基板をテキトーな大きさに切り、LED と ATtiny2313V を取り付けたところ。 LED の位置を合わせやすいように基板の縁に LED を配置してみました(毎度のことですが、写真をクリックすると大きな写真が見れます)。
LED の電流制限用 抵抗を配置したところ。 3色 LED それぞれの LED の動作電圧や輝度が違うのでLEDに付いてきたマニュアルをみたりブレッドボードで組んで動かしてみながら調整したんだけど、だんだん面倒臭くなって結局テキトーなところで切り上げちゃいました(゚o゚)\バキ
ちなみに裏側はこんな感じ。
他の部品も付けたところ...なんですが、LED の電流値を計算すると最大(8個の LED をフルに点灯)した場合、AVR の最大出力電流(40mA)を超えることが判明したので(ブレッドボードで組んでいたときは良く動いてたもんだ(゚o゚)\バキ)、トランジスタ1石のバッファを3色分設けることにしました。
ちなみに裏側はこんな感じ。
まだどーするか決まってないけど、不安定な電源でも使えるように急遽3端子レギュレーターを実装することにしました。何時買ったのか分からないけど低ドロップタイプの 4805 が出てきたのでソイツを採用。LED とは言えそれなりに電気食いそう(高負荷になりそう)なので、ヒートシンクを付けると重くなるし邪魔なので、基板用銅箔テープにレギュレータの放熱フィンを半田付けしたものを両面テープで基板に貼り付けてみました(銅箔テープ自体にも糊が付いてるけど、導電性の糊で基板のパターンとショートしそうだったので両面テープで絶縁)。
基板表側に銅箔テープを貼ってしまったため、もう部品を差し込むスペースが無くなってしまい、表面実装用のパーツやらラジアルタイプのパーツを表面実装したりしてるところ(゚o゚)\バキ
だいぶポンコツらしく、これぞハックって感じがしてイイでしょ?(そうか?
そして、いよいよ ISP 端子に AVR ライタを繋ぎ、プログラムを転送...あれれ、ターゲットが繋がってないだとー。と基板見ると、ISP 端子の配線が左右反対だし(基板を裏返して半田付けするので間違えやすいけど、超絶に初歩的なミス)(゚o゚)\バキ
あとから設計変更したトランジスタ回路も間違ってるしでハチャメチャでした(゚o゚)\バキ
とゆーことで、これらのミスを全部直して再びプログラム転送♪
・
・
・
動作しまへん(゚o゚)\バキ
とりあえず、ソースを見てみるとあれれ、参考にしていた回路図とプログラムの内容が一致してないぞ(「一致してない」と言うのは、プログラムの中で使っている I/O ポートやレジスタの設定と、回路図のポート名が一致してないということ)。
やはり数ヶ月のブランクというのは思っていたよりも大きかったようです。ということで、もう疲れたので続きはまた次回〜。
・・・数ヶ月後?(ぉぃ)
- カテゴリ
- AVR 遊び
-
フルカラー POV(ヘルメット)
- 固定リンク
- ¦
- コメント (2)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-001/tbping
フルカラーPOVその2
そんなワケで、あれからプログラム見直してみたのですが、確かにプログラムもヘンだったのですが、それ以上に基板の方がミスりまくりでワケワカな状態になってました(゚o゚)\バキ
そんなワケで当然直すわけですが(プログラムの方で修正するって手もあるけど)、直そうとしてるところを間違えて、正しい方を間違った繋ぎ方につなぎ替えたりして、どんどん動作がハチャメチャになっていくのが楽しかったけど、バイオリズム的に何かを作ってはいけない周期だったのかも(゚o゚)\バキ
そんなこんなで、動くようになった回路とコードはこんな感じ...はいいけど、すげーハズカシイかもー。ダメ出ししたらキリがない感がアリアリと(゚o゚)\バキ
まずは回路図。PD0〜 PD5 と PA0 〜 PA1 でドットパターンを出力し、PB2 〜 PB4 で色信を決定(実際の電流の向きは、色出力 → ドットパターン出力となる)。最大8個の LED を 10mA 以上の電流で点灯するので、そのままでは PB ポートの出力電流の最大定格値(40mA)を超えてしまうので、トランジスタでバッファするように慌てて変更(゚o゚)\バキ
そのため、明るさを合わせようと抵抗の値を調整(図中 RR,RG,RB)をしたけど、トランジスタが間に入ったことで最適値からズレてしまいいました(゚o゚)\バキ
ソースコード (Ver.0.000001 ぐらい?)
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
// 表示データ・色データテーブル(構造体)
struct imageElement {
unsigned char imgChar;
unsigned char imgRed;
unsigned char imgGreen;
unsigned char imgBlue;
} const imageTab[] PROGMEM = {
{ 0b10000000, 1, 1, 2 },
{ 0b01000000, 0, 10, 0 },
{ 0b00100000, 0, 25, 0 },
{ 0b00010000, 0, 50, 0 },
{ 0b00001000, 100, 0, 0 },
{ 0b00000100, 0,128, 0 },
{ 0b00000010, 0,180, 0 },
{ 0b00000001, 0,255, 0 },
{ 0b00000000, 0, 0, 0 }, // 表示データの終わりを示すレコード
}; // (imgChar = 0 であれば、最初に戻る)
int main(void) {
uint8_t j = 0;
DDRB = 0xFF; // 各ポートの入出力設定(出力に設定。)
DDRD = 0xFF;
DDRA = 0xFF;
while (1) {
if(pgm_read_byte(&imageTab[j].imgChar) == 0) j = 0; // imgChar = 0 のレコードを見付け
// たら、最初のレコードから始める
PORTD = ~(pgm_read_byte(&imageTab[j].imgChar)>>2); // imgChar (ドットパターン)の出力
PORTA = ~(pgm_read_byte(&imageTab[j].imgChar));
for(int flash=0; flash < 5; flash++){ // 1ステップ点灯サイクルループ
for(int pwm=0; pwm < 255;pwm++){ // PWM 1パルス作成ループ
PORTB = 0b00000000;
// 色設定値 > カウンタ値(カウンタの最大値 = PWMの分解能)であれば、LED 点灯。
if(pgm_read_byte(&imageTab[j].imgRed) > pwm) PORTB = (PORTB | 0b00000100)
else PORTB = (PORTB | 0b00000000);
if(pgm_read_byte(&imageTab[j].imgGreen) > pwm) PORTB = (PORTB | 0b00001000)
else PORTB = (PORTB | 0b00000000);
if(pgm_read_byte(&imageTab[j].imgBlue) > pwm) PORTB = (PORTB | 0b00010000)
else PORTB = (PORTB | 0b00000000);
}
}
j++;
}
}
AVR の PWM の使い方が分からなかったのでソフトウェアで PWM ってます。1サイクル 256階調の分解能がある...ハズ(゚o゚)\バキ
そのまま見る分には、これでも使えないことはないけど、POV のようにブンブン振り回して残像を見るようなブツにはちょっと動作が遅すぎました。やはりハードウェア PWM 使った方が良さそうです。アセンブリで書けばソフトウェア PWM でも実用に耐えるモノになるのかもしれんけど、ハードウェアあるんだし、ハードウェアに任せた方がプロセッサに他の仕事もさせられるし。
と言うことで、PWM のお勉強して出直してきまっす。
- カテゴリ
- AVR 遊び
-
フルカラー POV(ヘルメット)
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-002/tbping
フルカラーPOVその3
今回は、基板いぢりとかプログラミングはお休みして、近所の DIY 屋で買ってきた980円ヘルメットの天辺をリューターでチョン切ってみました。チョン切ると言ってもワタシが持っているリューターではパワー不足ですぐに回転が止まっちゃてなかなか大変でしたが(゚o゚)\バキ
左の写真は、切り取った記念に被ってみたところ。ヘルメット内のアタマを固定するバンドを外した状態のまま被ってみたので、カリメロみたいになるかと思ったんですけど、期待ほどカリメロ度が高くなくてガッカリ(゚o゚)\バキ
カリメロ度はともかく今回の工程は切る作業よりも、切る場所を決める方が大変でした。ヘルメットの底面はカーブしてるから普通に置いただけでは前のめりになっちゃうし、曲面に切る位置をフェルトペンで書いたのですが、何かズレてるわで、もう最後はエイヤでテキトーに線引いちゃいました。当然、リューターで切った直後はバリはもちろんですが、フェルトペンで書いた線が曲がっていたので切り口も曲がっていまして、切った後はベランダに紙ヤスリを敷いてその上にヘルメットを押し当ててゴリゴリと削って平らにしました(゚o゚)\バキ
やっぱ、せめてトースカンぐらい有った方が良かったかも・・・
- カテゴリ
- AVR 遊び
-
フルカラー POV(ヘルメット)
- 固定リンク
- ¦
- コメント (1)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-003/tbping
フルカラーPOVその4
エレキはちょっとお休みして、今回はメカっぽいことをやりました。昔からワタシは、こういった工作が苦手で、精度の悪い工作に散々泣かされました(゚o゚)\バキ
左の写真は今回製作した動作実験用のプロトタイプっつーか、ワシが作るモンってみんなプロトタイプ止まりだけど(゚o゚)\バキ
モーターはなんと懐かしのマブチモーター♪
子供の頃は、130 とか 140 といった低価格・ローパワー(出力が)なモノしか買えませんでしたが、(年齢と腹回りだけは(゚o゚)\バキ)オトナになった今はカネにモノを言わせて(笑)、一番ハイグレードな 540 をチョイスしました♪
最終的には電池駆動の予定ですが、実験中はAC電源で使いたいつーことで、秋月で買ってきた可変スイッチング電源キットを ATX 電源に接続し、9〜4V で使うことに。
そして完成〜♪工作精度の悪さが災いしてスゴイ爆音と振動で動きます♪特にモーター側のプーリの穴をドリルで揉んで穴を広げたのですが、失敗して芯がズレまくったのがかなり効いてます(゚o゚)\バキ
でもその爆音が結構カッチョエエーので記念にビデオに撮ってみました(左の写真をクリックするとビデオが見れます)(゚o゚)\バキ
それにしても、これをアタマの上に載っけて動かすのはイヤだなぁ(なぞ
- カテゴリ
- AVR 遊び
-
フルカラー POV(ヘルメット)
- 固定リンク
- ¦
- コメント (1)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-004/tbping
Re:フルカラーPOVその4
ArduinoでDACのじっけん
Arduino に使われている AT mega168 には DAC が無い。analogWrite という関数があるからてっきり DAC を内蔵しているのかと思ったら、PWM 出力だったのね(http://www.arduino.cc/en/Reference/AnalogWrite)(゚o゚)\バキ
LED とかモーターとか動かすには良いんですけど、490Hz までしか出ないので、ちょっと音声とか扱うにはちょっと遅すぎるので DAC を繋いでみようというオハナシ。
早速秋月電子と言う名の部品箱から DAC を取り出し(買ってくるとも言う(゚o゚)\バキ)接続。とりあえず、こんな感じで繋いでみました。0 〜 7 がデータ、9 で DAC 内部のラッチを制御して出力したデータをアナログに変換。
そしてアナログ出力のキホンと言えばやはりサイン波。ということで sin() 関数を使ってサイン波を生成して、DAC から出力してみたのが左の写真。なんかすげー遅いんですけど...ウェイトを一切入れずに出してみたのですが、5.2Hz しか出てません(゚o゚)\バキ
しかもどっかで間違っているみたいで、今回使った DAC は 2.56V がフルスケールなので、2.56Vp-p なハズが、1.7V 位しか出て無いし(゚o゚)\バキ しかも360°で1サイクル終わるはずがなんか途中でチョン切れてるし(ぉぃ
つーことで、余りにもハズカシイことになりそうなので、今回はソース無しってことで(ぉぃ
でもよくよく考えると、8bit 程度の精度で、しかもデータラインを他の周辺機器と共有しないのであれば、抵抗ラダー式の簡易DACで十分ですわねー。
MAKE:It - Proto-DAC shield for Arduino
http://blog.makezine.com/archive/2008/05/makeit_protodac_shield_fo.html
大体、パラレル接続だとピン数を大量に使ってしまうので DAC を繋ぐんだったらシリアル接続がいいですね。
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/arduino-dac/tbping
フルカラーPOVその5
あれから(前回のエントリから)、沖縄旅行したり、自宅サーバーぶっ壊しちゃったり、シゴトでテンパってみたり、ダラダラしてみたり(ぉぃ)と、忙しくてちっとも進んでませんが、細々としたものを時系列無視して(どれが何時やったのかもー覚えてないんですもの(゚o゚)\バキ)、書いておきます。

回転板の固定
今まで、お試し版つーことで、両面テープで固定していましたが、スゲー外しにくくて回転板が割れそうなので、ネジで固定できるよう、プーリと回転板(透明アクリル円盤)に穴を開けて回転板を取り付けました。
写真の各ネジ穴に番号が振ってあるのは、番号を合わせないと穴の位置がズレるからでし(゚o゚)\バキ
プーリ中心部は窪んでいて、ネジで固定する際、回転板とプーリの間に隙間が出来てしまい完全にネジ止めすることが出来ないので、蛍光緑色のアクリル板を丸く切り抜いたものを2枚重ねてスペーサーにしました。色はたまたま在庫していたモノを使っただけで、色に意味は無いのですが、ワタシの工作精度の悪さが凄く目立ってイヤンな感じ(ぉぃ

Full Color POV 回転板に固定
Full Color POV 基板に塩ビ製「足」を接着し、回転板に固定。モノは試しと、この状態でモーターを回してみましたが、机の上で大暴れ。それこそ、飛び上がらんとばかりにバタバタしてました(゚o゚)\バキ
やっぱ重量バランスが悪いとダメだったみたい(当たり前)。流石にいくら手抜きでもバランス用ウェイトを入れないとシャレにならないよーです。

バランスウェイト製作
重量バランスを取るため、モノは試しと手元にある魚釣り用のオモリを Full Color POV 基板の取り付け位置の反対側にガムテで貼り付けてみたのですが、こりゃまたエラいことに・・・
最初は踏ん張るものの、回転が乗ってきた瞬間「スパーンッ!」とどっかに飛んでいってしまいました(゚o゚)\バキ
遠心力ってのはスゴいねぇー(ぉぃ
遠心力のチカラを知りすぎて小便チビりそーになったところで(゚o゚)\バキ、ちゃんと取り付けることにしました。
石膏と整髪料のキャップを使って型を作り、その中に前出のオモリ(と言っても同型品。先に使ったのは行方不明(゚o゚)\バキ)を入れて型の中でヒートガンを使ってオモリを熔かそうとしましたが、一応熔けるものの熱量が足りないみたいで、熔けきらないうちに固まってしまい上手く行かず、カセットコンロと、使い古しのお玉でオモリを熔かしてから型に流し込んで作りました。せっかく、Full Color POV の方は鉛フリーで作ったのに、こんなに鉛を大量投入しちゃったら、鉛 Fully になっちゃうねー(寒

型から抜いた鉛 Fully (もーええっちゅーの)なウェイトにタップでネジを切り、ウェイトの位置を調整できるように回転板にスリット状の穴を開けて取り付けました。
そして、この状態で回してみると、先ほどのように飛んでいきそうな振動は無くなりましたが、回転を止めてみると、どんなにネジを締めてもウェイトは一番外周に移動してしまうようです。
うーむ、スリット状に穴を開けたのは失敗だったかな?
またもや遠心力のパワーに負けてしまいました(゚o゚)\バキ
そんなワケで、ウェイトを入れて回したときのムービーでし(入れる前のも欲しかったけど、それどころぢゃ無かった(゚o゚)\バキ)。
ウェイトがずれて、静止状態でバランスとっても意味がなかったりしますが、無いよりはマシになりました...
が、それにしても、勢いが随分弱くなったなー。可変電源のボリュームを全開にしても絞り切っても回転の仕方が変わらないし、コールドスタートも時々失敗するわと何かヘン。
負荷が増えてるのはよく分かるんだけど...と電圧計で、電源の出力電圧を調べてみると2.5V 位しか出てない。しかもボリュームの位置が何処にあろうが電圧は一定(定格が、4〜9V なので低すぎ)。どーも、可変電源の定格オーバーの電流が必要みたいです。要は電源のパワー不足。プーリ比を変えて低回転で少ないトルクで駆動すればいいんでしょうけど、売られていたプーリで一番デカいのと小さいものの組み合わせで組んでるので、ちょっとそれもムリっぽい...さぁどーしよ?
PWM コントローラーの製作
電源の容量不足ということで、ATX 電源の 12V を PWM でスイッチングしてモーターをブン回そうということで、左図のような回路を考えてみました。
ボリュームで PWM の制御量を設定したのをPWM出力でパワーFETを駆動するだけなんですが、それだけではちょっとマイコンも宝の持ち腐れ状態ですので、オマケとして、7セグLEDとフォトインタラプタを使って回転数(rpm)を表示するようにしようかなと思った次第。
AT 互換機のマザーボードから抜き取ったパワーFETのフィン(ヒートシンク)を生基板にベタっと半田付け。こうすることで、電極とヒートシンクの2つの役割を果たしてもらおうって作戦。続いてリード端子側は、手持ちのストライプパターンのユニバーサル基板を小さく切って、写真のように生基板に接着した上にリード端子を半田付け。こうすることで、リードが不用意に曲がって下の生基板とショートしないようにしました。
その他、電源や GND 端子も生基板の切れ端を下の大きな生基板に接着してから半田付けします。こういう実装方法はよく超高周波回路で使われていましたけど(島基板なんて言い方してたっけ?)、最近見なくなりましたねぇ。
最後にマイコン基板です。と言うかブレッドボードですが。
左の黒いコネクタが刺さっている基板は、ワタシが以前製作した Arduino 互換機の isiduino です。
もう少し余裕が出来るかと思ったのですが、isiduino の I/O 端子の数が足りなくなるということで外付けICの数が増えてしまい、ギリギリのサイズになってしまいました。まー、もっとも設計にあったチップを買ってきて使えばもう少しマシになるんでしょうが、手持ちのパーツで何とかしようとしたのでこんなもんかな?
あと、ブレッドボードが小さいため、LED に必要な電流制限用の抵抗が入って無いので、LED がすげー眩しい...ってそんな呑気な話ではなく(゚o゚)\バキ
消費電力がバカデカくなって居るようで、LED を点灯した状態だとプログラムの書き込みに失敗します(゚o゚)\バキ(゚o゚)\バキ
あと、LED も定格オーバーで動作させていますので、よい子の皆さんはマネしないようにお願いします(ぉ
そーゆーことで、一応それっぽいのがほぼ完成しました。まだ、フォトインタラプタや先に作った FET 回路(島基板)とも繋いでませんが、ブレッドボードが動作するかどうか確認するために以下のコードを動かしてみました。
char X = 0;
char SegmentFont[11] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67, 0x00};
char DispValue[4];
char digit10 = 0;
char digit100 = 0;
char digit1000 = 0;
int n,m;
int Value = 0;
void setup(){
DDRD=0xFF; //7セグLEDのセグメント出力端子(ポート)の設定:出力
DDRB=0xFF; //7セグLEDのケタ出力端子(ポート)の設定:出力
pinMode(11,INPUT); //フォトインタラプタの入力端子設定:入力
}
void loop(){
delay(1);
Value = analogRead(0); //ボリューム入力端子からアナログ値を入力
//入力値をバイナリからBCDに変換し、LED のセグメントに変換
n = Value;
m = n % 1000;
digit1000 = (n - m) / 1000;
if (digit1000 == 0) digit1000 = 10; //0の場合、ブランク
DispValue[3] = SegmentFont[digit1000];
n = m % 100;
digit100 = (m - n) / 100;
if ((digit1000 == 10) && (digit100 == 0)) digit100 = 10; //上位のケタが0の場合、ブランク
DispValue[2] = SegmentFont[digit100];
m = n % 10;
digit10 = (n - m) / 10;
if ((digit100 == 10) && (digit10 == 0)) digit10 = 10; //上位のケタが0の場合、ブランク
DispValue[1] = SegmentFont[digit10];
DispValue[0] = SegmentFont[m];
//7セグLEDへの出力
PORTD = DispValue[X];
PORTB = X;
X++;
if ( X > 0x03 ) { //7セグLEDの全てのケタが表示したときの動作
X = 0x00; //1ケタ目に戻す
}
}
ボリュームで設定した値を7セグLEDに表示するとゆーシロモノで、isiduino(Arduino)の A/D コンバータの分解能は10bitですので、最大が1023になります。ただ、ブレッドボード使っているのと、電源があっぷあっぷだったり、外付けのボリュームの抵抗値が高いせいか、最下位のケタがふらついてしまいます。
でも、とりあえず動いているみたい(ぉぃ
- 固定リンク
- ¦
- コメント (2)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-005/tbping
Re:フルカラーPOVその5
Re:フルカラーPOVその5
最終的には電池駆動にしますんでご安心を。と言うか、どの程度の充電池が必要なのかも判ってなかったり(゚o゚)\バキ
フルカラーPOVその6
Arduino で割り込み処理するには
前回のエントリで製作した(と言ってもブレッドボードの仮組だけど)PWM コントローラ兼回転数表示機ですが、回転数を数えるのに基準時間の間にフォトインタラプタのスリットに何回遮光板が通ったかで計測するワケですが、そうなると割り込み処理が必要だなと、Arduino のサイトにあるリファレンス(http://www.arduino.cc/en/Reference/HomePage)を見てもそれっぽいのがどーも見あたらない。「ひょっとして、Arduino には割り込みって無いの?」ということで渋々ポーリングで処理しようということで Arduino Software を起動して書き始めたわけですが、各ステップの動作時間(使用クロック数)がワカランではないか(当たり前)。最悪コンパイラが出したコードを見ながらタイミングをきめれば良いんだけど、そんな馬鹿なという思いが強くなっていったところで、「誰か勝手に作ってるんぢゃないの?」と思いググってみると、なんと、Arduino のサイトに解説があるではないか(゚o゚)\バキ
ということで、Arduino で割り込み使う方法はコチラ(http://www.arduino.cc/en/Reference/AttachInterrupt)。まったくどこに目をつけていたんだ<ワタシ
とよく見ると結構深い階層にあったみたい。ちょっと探しにくいなぁ...というか最初から組み込まれてるライブラリやら関数はリファレンスのページのトップに置いておいていいんぢゃない?<関係者各位
どーも、リファレンスによると、外部割り込みはデジタル入出力ピンの 2 番と 3 番のみが使えるようで、前回組んだ回路を変更(プログラムも変更)しなければならないようです。attachInterrupt 関数の使い方はこんな感じ(だと思う(゚o゚)\バキ)。
attachInterrupt(interrupt, function, mode)
- interrupt(割り込み入力ピン)
- 割り込み入力のピンを 0 または 1 に設定。
- 0:デジタル入出力2番ピン
1:デジタル入出力3番ピン
- function(関数名)
- 割り込み発生時に起動する関数名を設定。
- mode(割り込みトリガモード)
- 割り込みトリガ発生の信号レベルを設定。
- LOW:ローレベルの時にトリガ。
CHANGE:信号レベルが変化した時にトリガ(立ち上がり立ち下がり関係なしに)
RISING:ローレベルからハイレベルに立ち上がった時にトリガ
FALLING:ハイレベルからローレベルに立ち下がった時にトリガ
という具合。外部割り込み二つしかないのー、とかなり不安になる仕様だけど、そんな大規模なもん作るわけでもないだろうからこれでいいのかな?と、釈然としないモノを感じつつカウンター部を割り込みで処理するプログラムを書いてみました。
char X = 0;
char SegmentFont[11] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67, 0x00};
char DispValue[4];
char digit10 = 0;
char digit100 = 0;
char digit1000 = 0;
int n,m;
int Value = 0;
void setup(){
DDRD=0xFF;
DDRB=0xFF;
pinMode(2,INPUT); //割り込みに使用するピン(2番)を入力に設定
attachInterrupt(0, count, FALLING); /*デジタル入出力ピン1 H→L になったら
count 関数を起動*/
}
void loop(){
delay(1);
//Value = analogRead(0);
/////////// 前回のエントリと同じ内容のため中略)///////////
PORTD = DispValue[X] & 0xFB; /*割り込みピン(2番。セグメントc)をマスクし
LEDセグメント出力*/
PORTB = X | (DispValue[X] & 0x04); /*セグメントcの出力を10番ピンに割り当て、
桁データ出力と合成して出力*/
X++;
if ( X > 0x03 ) {
X = 0x00;
}
}
void count(){ //割り込みイベント処理関数
Value++; //カウンタ値を1up
pinMode(2,OUTPUT); /*入力ピンを出力に切り替えると割り込みが掛からなくなる
らしい?(゚o゚)\バキ*/
delayMicroseconds(10000); /*10msecウェイト(チャタリング防止...なるのか?)
msec単位であれば、通常delay()なのだが、割り込み
処理で使うと固まってしまうみたい*/
pinMode(2,INPUT); //入力に戻す(割り込み許可)
}
と、まぁ、こんな感じです。あと必要なのはタイマ割り込みですが、これはまた次回にということで、ごきげんよー(ぉぃ
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-006/tbping
フルカラーPOVその7
前回のエントリーで宿題にしていたタイマー割り込みを使ってみました。
いつものように、Arduino のリファレンスページ(拡張版:http://www.arduino.cc/en/Reference/Extended)でそれっぽいエントリーを探してみたもののちっとも見付からず、「タイマー割り込みなんて、組み込み系では真っ先に必要とされるハズなのになんでねーのよー」と釈然としないままライブラリのページ(http://www.arduino.cc/en/Reference/Libraries)を捜索してやっと発見・・・えー、なんで標準装備してないんだ?
とゆーことでライブラリのページにあった MsTimer2 (http://www.arduino.cc/playground/Main/MsTimer2)を使ってみることにしました。
MsTimer2 のページからライブラリのソース(http://www.arduino.cc/playground/uploads/Main/MsTimer2.zip)をダウン道路したら展開し、/{Arduino Software が入ったディレクトリ}/arduino-0011/hardware/libraries/ に展開して出来たフォルダごとコピーしてから、 Arduino Software を再起動し(ソフトウェア起動時にインストールされたライブラリをコンパイルするため)、Program Notification area (黒地のエリア)にエラーが出ていなければ準備完了。
このライブラリでインストールされる関数はこんな感じ。
- MsTimer2::set(設定時間(ms), 割り込み処理関数名)
- ・タイマ割り込みの設定。
- 設定時間(ms) :設定時間(符号無しlong型)をミリ秒単位で設定。
割り込み処理関数名:割り込み発生時に実行する関数名を設定。
- MsTimer2::start()
- ・タイマ割り込み有効化
- MsTimer2::stop()
- ・タイマ割り込み無効化
使い方がなんかイマイチ洗練されていない気がしますがまぁいいか(ぉぃ
とりあえず、こんな感じで使ってみました(重要な点だけコメント入れてます)。
#include <MsTimer2.h> //標準ライブラリぢゃないので、ヘッダファイルをインクルード
//////////////////////////中略///////////////////////////
int Value = 0;
int count =0;
void setup(){
DDRD=0xFF;
DDRB=0xFF;
pinMode(2,INPUT);
attachInterrupt(0, counter, FALLING); //外部割り込みの設定(前回のエントリ参照)。
MsTimer2::set(1000, flash); /*タイマ割り込みの設定 1000ms
割り込み処理関数=flash */
MsTimer2::start(); //タイマ割り込みイネーブル
}
void loop(){
//////////////////////////中略///////////////////////////
}
void counter(){ //外部割り込み発生時の処理。
count++; //カウンタを1up
}
void flash(){ //タイマ割り込み発生時の処理。
Value = count * 60; //サンプリング期間が1secなので、分速に変換するため60倍に
count = 0; //カウンタクリア
}
ソフトウェアが出来たところで、ハードウェアを取り付けます。と言ってもお試しなので、超テキトー(゚o゚)\バキ
フォトインタラプタの遮光板をどーしよーかなーと、パーツ屋を覗いていたらギアを発見。こいつにスリットを入れて遮光板にすることにしました。
んー、我ながら凄くゼータク(゚o゚)\バキ
でまー、写真のように金ノコで切り込み入れたはいいけど曲がってるし(笑)。
つーか、やってる途中で気付いたけど、スリットぢゃなくて、歯車の歯を検出させれば手間も掛からないし精度も高かった気がする(゚o゚)\バキ(゚o゚)\バキ
まだ仮止めなので、ユニバーサル基板の切れ端の先端にフォトインタラプタを両面テープで固定したものを 006P 電池の上にセロハンテープで取り付けました(゚o゚)\バキ
フォトインタラプタへの配線は、見ての通り空中配線でし(もっと拡大して見たーい)。
無負荷状態で電源も絞りきった状態で 1860rpm で回ってる模様。
その後、ボリュームを上げて2500rpm ほどまで上げましたが、やかましいのでそれ以上上げるのはやめました(゚o゚)\バキ
ちなみに回転台の下にタオルを敷いているのは回転中、振動が激しくてウルサイからでし(笑)。
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-007/tbping
フルカラーPOVその8
いぇーい♪
やっとこさ動作までこぎ着けました。何だかんだと半年も掛かってしまいました(゚o゚)\バキ
しかも表示が上下逆だし(゚o゚)\バキこの辺はご愛敬ってことで(ぉぃ
しかし、まだ完成じゃないんです。
POV に電力を供給する給電部がまだ出来ていません。ですので、今回はターンテーブルに 006P を両面テープで貼り付けて対応してます(゚o゚)\バキ
これでタダでさえバランス悪くて不安定なターンテーブルがさらに不安定になってムチャ恐いっす(゚o゚)\バキ
動画も撮影してみました。何か知らんけど自鯖にアップロード出来なかったので YouTube で(゚o゚)\バキ
どーも、うまく残像を撮ることが出来ません。難しい。
9/22 追記: 自鯖アップできました。あれからビデオ撮り直しました。撮影時のフレームレートを 30fps→15fps に変更したらちょっとマシになったかな(左の写真をクリックしてねん)?
それと、 POVのプログラムのデータテーブルを変更して上下正しくなるようにしました)。
前回までからの変更点は、POV 回路(AT tiny2313)のプログラムを全面改訂しました。と言うことでそのソースコード。
#include <avr/io.h> // this contains all the IO port definitions
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
// 表示データ・色データテーブル(構造体)
struct imageElement {
unsigned char imgChar;
unsigned char imgRed;
unsigned char imgGreen;
unsigned char imgBlue;
} const imageTab[] PROGMEM = {
{ 0b11111111, 255, 255, 255},
{ 0b11111111, 255, 255, 255},
{ 0b00001110, 255, 255, 255},
{ 0b00111100, 255, 255, 255},
{ 0b11110000, 255, 255, 255},
//----------------中略----------------
{ 0b00001110, 255, 255, 255},
{ 0b11011111, 255, 255, 255},
{ 0b11011111, 255, 255, 255},
{ 0b00001110, 255, 255, 255},
{ 0b00000000, 255, 255, 255},
{ 0b00000000, 0, 0, 0},// 表示データの終わりを示すレコード(imgChar = 0 であれば、最初に戻る)
};
void setup(void){
///////////// I/O ポートの設定と出力データの初期化/////////////
DDRB = 0b00011100; //PB2(OC0A),PB3(OC1A),PB4(OC1B) Output Setting
DDRA = 0b11111111;
DDRD = 0b11111111;
PORTB = 0x00;
PORTA = 0x00;
/////////////////////////////////////////////////////////
//////////// 8ビットタイマ・カウンタの設定/////////////
TCNT0 = 0x00; //カウンタ値クリア
TCCR0A = 0b10000001; //タイマ・カウンタの動作設定
TCCR0B = 0b00000001; /*OCR0A PWM,フェーズ・コレクト(TOP=FF)
OCR0B ノーマル(PWMナシ)
プリスケーラなし*/
OCR0A = 0x00;
OCR0B = 0x00;
///////////////////////////////////////////////////
//////////// 16ビットタイマ・カウンタの設定/////////////
TCNT1H = 0x00; //カウンタ上位バイトクリア
TCNT1L = 0x00; //カウンタ下位バイトクリア
TCCR1A = 0b10100001; //
TCCR1B = 0b00000001; /*OCR1A PWM,フェーズ・コレクト(TOP=FF)
OCR1B PWM,フェーズ・コレクト(TOP=FF)
プリスケーラなし*/
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
///////////////////////////////////////////////////
//////// 16/8ビットタイマ・カウンタの割り込み設定 ///////
TIMSK = 0b00000010; //8ビットカウンタ(TCNT0)オーバーフロー割り込みイネーブル
///////////////////////////////////////////////////
}
int ontime=10; //LED点灯時間(パルス数)
int col=0; //表示データのアドレス(カラム)
int x=0;
SIGNAL( SIG_OVERFLOW0 ) {
if(x == ontime){
PORTD = ~(pgm_read_byte(&imageTab[col].imgChar)>>2); // imgChar (ドットパターン)の出力
PORTA = ~(pgm_read_byte(&imageTab[col].imgChar));
OCR0A = pgm_read_byte(&imageTab[col].imgRed); //カラー出力の出力(PWM値)
OCR1AH = 0x00; //レジスタOCR1(A/B)1は16bitなので、
OCR1AL = pgm_read_byte(&imageTab[col].imgGreen); //上位下位2回に分けてアクセス。
OCR1BH = 0x00;
OCR1BL = pgm_read_byte(&imageTab[col].imgBlue);
x = 0;
// imgChar,imgRed,imgGreen,imgBlue がレコードが全て0なら、最初のレコードから始める
if((pgm_read_byte(&imageTab[col].imgChar) | pgm_read_byte(&imageTab[col].imgRed) |
pgm_read_byte(&imageTab[col].imgGreen) | pgm_read_byte(&imageTab[col].imgBlue)) == 0){
col = 0;
}
else{
col++;
}
}
x++;
}
int main(void){
setup(); //初期化
sei(); //割り込みイネーブル
while(1);
}
- カテゴリ
- AVR 遊び
-
フルカラー POV(ヘルメット)
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/fullcolor-pov-008/tbping
Arduino を ATmega88 に移植してみました
isiduino mini 誕生
ある日、いつものように秋月電子をうろついてると ATmega88 が 250円で売られているのを発見。「んー、これが168だったら isiduino (自作 Arduino 互換機)に使えるのに...」と口惜しい思いをしつつも、Arduino 化せずにそのまま使えばいいやと購入して帰ったのですが、ATmega88 と 168 の違いは単純にフラッシュメモリの容量だけであとは全く同じ(ちなみにラインナップはこんな感で、ATmega48=4kB,88=8kB,168=16kB,328=32kB となっている)。ワタシが書く Arduino のスケッチなんて3kB満たないのが普通なんだから、ATmega88に移植しても問題ないだろう(Arduino Diecimila を移植した場合、ブートローダーに 2kB 程使うので、約6kB使用可能)つーことで移植に挑戦してみました。
ブートローダーの移植
まず、ATmega168 用のブートローダーのソースが入ったフォルダ(atmega168)をコピーし、「atmega88」にリネーム。コピーしたフォルダを開き、ソースのファイル名も紛らわしくなるので、「ATmegaBOOT_88.c」に変更。それに合わせて Makefile も編集。Makefile で指定しているソースファイル名を変更し、ターゲットのプログラムサイズもATmega88に合わせて変更(0x2000-0x800=0x1800だけど、ちょっと欲張って(゚o゚)\バキ 0x1900 にした)。こんな感じに。
プログラム名の変更。
# program name should not be changed... ←...まぁ気にしない気にしない(゚o゚)\バキ
PROGRAM = ATmegaBOOT_88
ターゲット(チップ種類)の変更と、領域(フラッシュメモリの容量)の設定。
MCU_TARGET = atmega88
LDSECTION = --section-start=.text=0x1900
そして、ATmegaBOOT_88.c (ブートローダーのソース)を変更。と言ってもプリプロセッサの条件文をいじるだけですが(゚o゚)\バキ
例えば、
#elif defined __AVR_ATmega168__
こんな行はこんな風にします
#elif defined __AVR_ATmega168__ || __AVR_ATmega88__
ただし、以下の部分(178行目〜181行目)は書き換えちゃダメよん。
#elif defined __AVR_ATmega168__
#define SIG2 0x94
#define SIG3 0x06
#define PAGE_SIZE 0x40U //64 words
それは、上記の行のすぐ上には↓こんな感じに既に ATmega88 用のコードがあるから
#elif defined __AVR_ATmega88__
#define SIG2 0x93
#define SIG3 0x0a
#define PAGE_SIZE 0x20U //32 words
と言う具合にソースコードを変更したら、いよいよコンパイル。と Arduino Software を起動して・・・と、行きたいところですが、どーも Arduino Software からはブートローダーのコンパイルはやってくれない模様。ということで、コマンドラインで、 make することに。
Macintosh:atmega88 isi$ make diecimila
ワタシの場合、Arduino を使う前は C でプログラムしていたので、avr 用の gcc (gcc 4.3, avr-libc 1.6.2)を予めインストールしてあったのでそのままコンパイルできましたが、無い場合は、Arduino Software が gcc をもっているので(<インストールしたディレクトリ>/arduino-0012/hardware/tools/avr/bin にあります)ソレを使えば別途インストールする必要はありません...と、今試してみたらこんなエラーが(途中改行入れてます)(゚o゚)\バキ
/Users/isi/Applications/arduino-0012/hardware/tools/avr/bin/../lib/gcc/avr/4.3.0/../../../../avr/bin/ld:
address 0x20a6 of ATmegaBOOT_88_diecimila.elf section .text is not within region text
どーも、コンパイラ(リンカ?)のバージョンによってはエラーになっちゃうみたいっす。ちなみにこのエラーの対処方法は、Makefile のケチった部分を 0x1800 にすればOK。
MCU_TARGET = atmega88
LDSECTION = --section-start=.text=0x1800
ユーザー領域は減っちゃいますが、これで使えるようになります。もし、ケチケチ路線でイキたいのであれば、AVR MacPack()なり WinAVR なりAVR用のgcc と avr-libc をインストールしましょう(ソースを弄るって手もあるけどいっか(ぉぃ)。
ということで、ブートローダーのコンパイルが終わると、ATmegaBOOT_88_diecimila.hex ファイルが出来上がりますので、コイツを ATmega88 に書き込みます。書き込みには前回のエントリでセットアップした USBaspを使います。ですが、このままでは Arduino Software からは今回作ったブートローダーの情報が登録されていないので、Arduino Software を起動する前に、 Diecimila,Lilypad などArduino ボードの種類を設定・登録する。 <インストールしたディレクトリ>/arduino-0012/hardware/boards.txt に以下に示すリストを追加して今回移植したブートローダーを登録します。
isiduino.name=isiduino mini
isiduino.upload.protocol=stk500
isiduino.upload.maximum_size=6400
isiduino.upload.speed=19200
isiduino.bootloader.low_fuses=0xff
isiduino.bootloader.high_fuses=0xdd
isiduino.bootloader.extended_fuses=0x00
isiduino.bootloader.path=atmega88
isiduino.bootloader.file=ATmegaBOOT_88_diecimila.hex
isiduino.bootloader.unlock_bits=0x3F
isiduino.bootloader.lock_bits=0x0F
isiduino.build.mcu=atmega88
isiduino.build.f_cpu=16000000L
isiduino.build.core=arduino
Arduino Software を起動し、ボード選択メニューを開くと今回移植したブートローダー isiduino mini (isiduino はワタシが自作した Arduino 互換機のシリーズ名)がメニューに現れるのでそれを選択します。
ちなみに、並び順は boards.txt の何処に書いても勝手にソートされてしまうよーです。
ハードウェアの製作
今回ボードを作らず、必要なシステムにチップのまま組み込んでしまおうということで、USB - シリアル変換は別体にし、プログラム変更するときだけ USB - シリアル変換を繋ぐ方式にしました。こーすることで小型化することができ、大量に作ってもコストが掛からないようになりました。と言うことで、前作の isiduino より小型化(フラッシュ容量も小型化(゚o゚)\バキ)したので、isiduino mini と命名しました。
写真はブレッドボード上に組んだ(と言っていいのか?)isiduino。右上のフラットケーブルで USB - シリアル変換に接続します。ちなみに、このブレッドボードの配線間違ってます。さて何処でしょう?(゚o゚)\バキってクイズにしちゃってますが、撮り直すの面倒なだけだったりします(ぉぃ
これが、USB - シリアル変換部。写真左側のコネクタが USB で右側がシリアル。シリアル端子には Tx・Rx 以外にも制御に使うリセットとケーブルから電源を供給するために電源とGNDの5端子となっています。
isiduino mini の全ての回路図はコチラ。
最後に、ハードウェアが完成したところで、USBasp を繋ぎ、Arduino Software を起動し、ブートローダーを書き込みます。方法は、Arduino Software を起動し、メニューバーの「Tools」→「Board」→「isiduino mini」とクリック(ドラグ)しターゲット(書き込み先)を設定。次に「Tools」→「Burn Bootloader」→「w/ USB asp」をクリックすると、書き込み開始します。
core ライブラリの書き換え
ブートローダーの書き込みも終わり、いよいよスケッチ(ユーザープログラム)が書けるぜー♪と、カリカリとコードを書いてソースを「Compile」すると大量のエラーが出てガッカリさせられます。初心者のヒトだったら自分のコードが間違ってるんぢゃないかなんて思ってしまいそーですが、ご安心を、書いたコードが原因ではなく、Arduino のコアになるコード(ライブラリ)が移植したチップに対応してないのが原因です。
ということで、エラーになっているコードを修正しましょー。エラーメッセージを見ると、 <インストールしたディレクトリ>/arduino-0012/hardware/cores/arduino/ 以下に入っているファイルが悪さしてるよーですので、まずはエラーの出ているコードを開いてみると、ブートローダーのソースを直したときの方法と同じ方法で対処できるのが分かると思います。ブートローダーの時と違うのは、ファイルがいくつにもまたがると言うところ。面倒ですが、やっていることは単純ですので、検索やシェルスクリプトを上手く使えば簡単に修正可能です(ワタシはスクリプトではなく検索・置換でやりました)。
ソースの修正が終わったところでもう一度コンパイルしてみてエラーが出ないことを確認して終了。
ということで、どれだけのヒトが必要なのかと言うか、ワタシ以外の誰が使うんだって感じだけど、今回弄ったファイルどもを纏めたものをコチラにアップしておきます。
最後に、この方法を使えば最新チップでフラッシュメモリ 32kB 版 ATmega328 や 4kB 版の ATmega48 にも移植可能だと思います...って、328 はすでにやってるよーですね。
『Arduino Hacks』
http://www.ladyada.net/library/arduino/bootloader.html
ということで早速落としてきてチェックすると、あれれブートローダーしかねぇーや(゚o゚)\バキ
おっかしーなぁ、通常版 Arduino (Diecimila など)としてプログラムを書き込むのかな?フラッシュメモリが増えたからデータロガーに良いぞなんて書いてあるから、プログラム領域よりもストレージが目的なんだろうか?それともワタシが根本的なところで間違えてるのか(゚o゚)\バキ
- 固定リンク
- ¦
- コメント (2)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://isi.kicks-ass.net/blog/isi/bakilog-2.0/isiduino-mini/tbping
Re: Arduino を ATmega88 に移植してみました
Re: Arduino を ATmega88 に移植してみました
移植した後に気付きましたが、今回は Diecimila を移植したので16MHz のクリスタル付けてますけど、LilyPad を移植すればクリスタルも不要(AVR 内蔵 CR 発振器がクロックになる)ですね。まぁ速度は Diecimila の半分の 8MHz だし、精度も悪いのでまいっかって感じ。
Eclipse で AVR 開発
ワタシは普段 AVR を C で開発するときは、普段 Mac を使っている関係でソースコードを Xcode で書いてコンパイルするときは、Makefile を手で書いてから「ターミナル」で make コマンドを叩いてコンパイル→チップの書き込みって感じですげー面倒。で、いつも「Xcode でコード書きからコンパイル、デバッグまでできたらなぁ」などと思っていたワケだけど、Make: のブログをみていたら、やはり同じ事を考えていた人はいるよーで、Eclipse で AVR を開発しようというというプロジェクトが紹介されていました。
『Make: Online : Programming AVRs with Eclipse』
http://blog.makezine.com/archive/2009/05/programming_avrs_with_eclipse.html
ワタシは普段 Mac 使っているので Xcode で開発と思ったわけですが、Xcode に対応させるより Eclipse に対応させた方が対応プラットホーム(OS)が多くて沢山のヒトがハッピーなれるわな。AVR と言えば、Arduino が有るわけだけど、Arduino は扱いやすくなってる反面、対応チップが制限されちゃったり(ブートローダー係やらライブラリの関係で)するので、Eclipse を使って C で開発できるというのは大きいなと。
それにしても、最近ワタシが使っているアプリケーションソフトのオープンソース率がどんどん上がっていって、Firefox/Thunderbird に gcc に OOo 、そして Arduino ...もー、Mac ぢゃなくてもいいんぢゃねー、って感じになりつつある気がしてきた(゚o゚)\バキ
・・・おっと忘れてた(゚o゚)\バキ、そーいれば、iLife は超使いまくってるな。



続編、待ってます~
期待させてしまってドーモスミマセン(゚o゚)\バキ
小出して焦らすシュミは無いのですが、こうしないとワタシのモチベーションの維持が出来ないモノで...(ぉぃ
あまり期待せずに、生暖かく見守っていただければと思います。もちろんツッコミ大歓迎ですよん<ALL