ライントレースカーではじめるAVR入門
手軽で簡単ATMELのAVR

はじめに

おなじみのPICマイコンと並んで、安くて、使いやすいワンチップマイコンにATMELのAVRマイコンがあります。AVRは1命令を1クロックで動作するので、AT90S2313-10の最大動作周波数 10MHzでも10MIPS程度の性能があります。まぁ、実際は2クロック、3クロックの命令があるので、プログラムによっては計算より低くなりますが。一方PICマイコンは1命令を4クロックで動作させるので、同価格帯のPIC16F84Aの最大動作周波数 20MHzでも性能は5MIPS程度です。命令数、処理性能を考えるとAVRに少し劣ります。
そんな高性能なAVRですが、ワンチップマイコンを始めるにあたってPICとAVRのどちらが良いかと迷ったとき、私は先発の強みで情報が充実しているのでPICを選びました。今回はもう一方はどうか?ということでAVRに挑戦してみます。
最近ではAVRの情報もどんどん充実しているので、今から入門するならどちらでも問題ないでしょう。あとは好みの問題です。

↓ATMELのサイト
http://www.atmel.com/

AVRマイコンの選択肢
DIPのAVRを使うなら以下のデバイスから選択します。
AT90S1200-12

プログラム領域512Word、20ピン、0〜12MHzのマイコンです。
とっても安価で、使いやすいです。
他のAVRではスタックをSRAMに自由に確保できるのですが、コレにはSRAMが無いので固定された領域が割り当たります、自分で確保する必要はありません。
高めですが、発振器内臓のAT90S1200Aもあります。
ちょっとした用途ならコレで十分です。

AT90S2313-10
プログラム領域1kWord、20ピン、0〜10MHzのマイコンです。
PIC16F84Aと同価格帯で使い勝手の良いマイコンです。
私的にスタンダードなイメージがあって実験には大抵コレを使います。

AT90S4433-8
プログラム領域2kWord、28ピン、0〜8MHzのマイコンです。
AT90S2313よりプログラム領域、入出力ピンが必要なときに使います。

AT90S8535-8
プログラム領域4kWord、40ピン、0〜8MHzのマイコンです。
他のAVRより倍以上でかいので使うには気が引けます。

必要に応じて、動作スピード、プログラム領域、機能、値段、大きさで選択します。

情報収集と準備。

データシートの日本語翻訳されています。
↓レディオテクニカのサイト
http://homepage1.nifty.com/radio_tech/

各種AVRライタを取り上げられています。
↓MICON・FREAKSのサイト
http://www.tctvnet.ne.jp/~jcl/AVR.htm

MP3プレイヤキット「WAKA-MP3」の生みの親、Chanさんのサイト
↓ELMのサイト
http://elm-chan.org/index_j.html

結構、至れり尽くせり。
ほかにも、検索サイト等でAVRを引くと結構出てきます。

イロイロ調べた結果、今回の製作の手順は以下の通りにします。
1、AVR Studio 3のインストール。
2、AVRライタの製作。
3、ブレッドボードでAVRライタの動作確認。
4、ライントレースカーの製作。

こんなもんですね。

ライタを作成する。

1、AVR Studio 3のインストール
まず、統合開発環境のAVR Studio 3をダウンロードします。AVR Studio 4はAT90S1200などには対応していないので使用しません。

↓ATMELのサイト
http://www.atmel.com/
Microcontrollers>AVR 8-Bit RISC>ASTUDIO3.EXEをダウンロードしてインストールします。
デフォルトでインストールするとC:\Program Files\Atmel\AVR Studio\Appnotesにいろいろなサンプルがあります。ここの各デバイス用のヘッダファイルはI/Oレジスタの名前が定義されています。データシートと同じ名前なのでそのまま流用すると便利です。


2、AVRライタの製作
ライタ用ソフトにPonyProgを利用いました。このソフトはWindowsNTやLinuxにも対応しています。私はWindowsXPで作業しました。
Lanconelli Open Systemsのサイト
http://www.lancos.com/
まだまだ色々なデバイスに対応するみたいなので先が楽しみです。
ライタ回路はISP端子に接続したままでも動作できる↓の回路を組み立てました。

↓ライタの回路図


材料
74HC244
100kΩの抵抗
100nF(104)のコンデンサ
小信号用ダイオード1S1588。
D-SUB25ピンオスコネクタ。
ケーブル少々
ピンヘッダ少々

以上です。ケーブルやピンヘッダなどは使いやすいように配置します。
このケーブルにユニバーサル基盤とソケットを取り付けて、以下のように接続すれば立派なAVRライタボードになります。
GND←GND
VDD←3〜5V
XTAL1←SCK
ISPできない回路を組むときに必要になるかも。

↓組み立てた回路

余っていたユニバーサル基板を切り取って、適当に部品を配置してウレタン線で接続しました。
PCとターゲットにはフラットケーブルを
専用にケーブルを作ったりすると、かさばるし、他に流用できなくなるのでこうしています。
今回は、PCのD-SUB25Pinメスと26Pinヘッダをつなぐ必要がありますが、今回は以下のようにイロイロつなぐことになりました。

 PC
↓↑
D-SUB25ピン・オス-オスのストレートケーブル
↓↑
D-SUB25ピン・メス-26ピンフラットケーブル
↓↑
26ピンヘッダ

D-SUB25ピン・メス-26ピンフラットケーブルは、PCのM/Bのパラレルポート用に秋葉のジャンク屋で安く売っていました。D-SUB25ピン・オス-オスのストレートケーブルは秋月で数百円で販売されています。

3、ブレッドボードでAVRライタの動作確認。
何はなくとも、動作チェックをしなければ完成とはいえません。
おなじみのLED点灯プログラム作って確認します。

サンプル:
led_test.asm
レジスタ定義を流用していて、AVR Studio 3をインストールすると
C:\Program Files\Atmel\AVR Studio\Appnotes\2313def.inc
というファイルがあるので、それをソースと同じ場所にコピーしてください。


AVR Studio3を使う。
プロジェクトを作成してソースを登録するとビルドできます。
Project typeはAVR Assemblerを選択してください。
書き込みデータ形式はIntel Hexファイルで統一します。
AVR Studio3はデフォルトではIntel Hexを出力しないので設定する必要があります。
↓>Project>ProjectSettingsのダイアログボックスのOutput file formatをIntel Intelec 8/MDSに設定してください。

これでビルドすると.hexファイルができます。

PonyProgを使う。
馬の鳴き声を聞いた後に、>Setup>Interface Setupを選んで変更します。
↓以下のようにします。


>Device>AVR microでAT90S2313を選択

あとは>File>Open Device Fileで.hexファイルを開いて、>Command>write Allを実行します。

書き込みを確認する。
ブレッドボードで回路を作るのは面倒だったので、回路を書き込んでからオシロでHi・Lowを見て確認しました。
デバイスはAT90S2313を用いています。スタックポインタの初期化と入出力ピンの方向の初期化をし、出力ピンをHi→Lowを繰り返すだけのプログラムです。
 
・・・まぁ、今回はこれで十分なのですが、寂しいので以前に実験した時は↓のようにやっていました。
↓かなり前のAVRの実験風景。

ブレッドボードにISPするために、タコみたいなコネクタ作ったりして・・・。

書き込みが確認できればOKです。

ライントレースカーを作ってみよう。

何はなくとも、ネタがないと始まりません。
PIC入門にはトラ技誌1997年5月号のTVゲームだったので音系、画像系は避けました・・・となるとネタは限られるですが・・・ちょうど良いことに秋葉の今は亡きツクモ ロボコンマガジン館で見かけたTAMIYAのツインモータギアボックスがなかなか面白そうだったのでコレでマイコンカーを作成することにしました。
さらに、秋月電子通商で三洋のフォトリフレクタSPI-315がなかなか使いやすそうだったので、コレを使ってライントレースカーにしてみました。
実は私が電子工作で物理的に動くものを作るのはコレが初めてだったりします。


4、ライントレースカーの製作。

部品の検討
車体
はモータドライバとマイコンを乗せるスペースがあればどのようなものでもかまいません。模型とかプラモデルをやっている人なら車体や機構にこだわると面白そうです。まぁ、今回は実験目的なので適当にオーソドックスで安価な部品を集めてみました。

↓参考、電子工作の実験室 (PIC、マイコン、ラジコン、EDA、VHDL、CPLD)
http://www.picfun.com/
製作例のラジコン車を参考にしました。

車体材料
TAMIYA ツインモータギアボックス
TAMIYA スポーツタイヤセット
TAMIYA ユニバーサルプレート
小型のキャスタ
0.001μF(102)のセラミックコンデンサ
電池ボックス(単3電池2本)

TAMIYAのキットは500円程度なのですが、店によって200円以上価格差があってちょっとびっくり。

モータドライバは、MOS-FETで相補型Hブリッジを組むのが安上がり・・・かと思ったのですが、モータドライバの専用IC TA7257Pの方が数十円安くあがるのでそっちにしました。TA7257Pは今回のような使い方なら外部部品が不要なくらい手軽で使いやすいDCモータ用のドライバICです。こちらは千石電商で購入しています。

↓東芝セミコンダクターのサイト
http://www.semicon.toshiba.co.jp/
データシートでTA7257Pを検索するとデータシートがダウンロードできます。

フォトリフレクタのSPI-315は赤外線発光ダイオードと赤外フォトトランジスタが組み合わさったものです。赤外線が床等に反射するとフォトトランジスタがONになります。光は白にはよく反射し、黒には吸収される性質があるので、黒いテープを使って1cm以下の距離でフォトトランジスタが確実にOFFになるように抵抗を選びました。結構電流を流しています。

今回の製作は慣れないロボット工作なので、とくに省電力とかスピードを後回しにして、確実に動作することを優先しました。
↓今回作成した回路の回路図。

このほかにAVRのISPコネクタやテスト用にAVRとモータを別電源にするために7805を取り付けています。

組み立て
車体は小学生の夏休みの工作より低いレベルなので、組み立てはあっさり終わりました。
相変わらずネジがどっかいっちゃう事件はありましたけど・・・。
ツインモータギアボックスは標準ギア比58:1のA・Bタイプと低速ギア比203:1のCタイプの3種類あります。まず、Cタイプで実験して速度が欲しくなったらAかBタイプに変更することにしました。
とりあえず、車体とモータドライバと電源はセットでマイコンボードを別にしておいて、色々なマイコンで制御できるようにしておきます。

↓車体を組み立てて、モータドライバを設置。

なんかなつかしい感じがする。

その後、AVRを乗せてた基板を接続して車体が動くかどうか実験しました。

サンプル
cartest.asm
動作テストと同じく、レジスタ定義を流用しています。AVR Studio 3をインストールすると
C:\Program Files\Atmel\AVR Studio\Appnotes\2313def.inc
というファイルがあるので、それをソースと同じ場所にコピーしてください。
コレを動作させると、前進、後退、右回り、左回り、右回転、左回転、大きな右回りをします。

↓動作中、車の上、生け花状態。

残像により、写真でも動いているように見える・・・。
AVRボードは6ピンのISPポートをつけて適当に配置した後、ウレタン線で結線しています。
電源などは線材とコネクタを熱収縮チューブを使って接続線をたくさん作りました。
案の定生け花状態へ・・・。

車体がきちんと動作することを確認したら、センサボードを取り付けます。

サンプル
linecar.asm
くどいようですが、AVR Studio 3をインストールすると
C:\Program Files\Atmel\AVR Studio\Appnotes\2313def.inc
というファイルがあるので、それをソースと同じ場所にコピーしてください。

センサボードはセンサを下に向け、床から1cm以内の距離で固定します。
ラインはとりあえず一般的な幅2cm足らずの黒いビニールテープを用いるので、中央には十分な幅が必要です。また、急カーブ対応するために外側にも一つずつ付け、2つのセンサで方向転換の方法を決定します。

↓センサと抵抗を付けただけの簡易センサボード

向かって左の配置が失敗・・・。
さらに設置方法も簡易、向かって右のネジだけ・・・。これで微妙な高さも調整していたりします。

動かしてみよう
↓線に沿って動いています。

低速ギアなので結構のんびり動きますが、カーブを曲がるには結構微妙なスピードです。
標準ギアにするとちょっと不安、一応曲がりますけど。
この段階では、モーター用とAVR用に電池を分けています。

↓最終形態。

単3電池だけで駆動しています。
まだまだ乗っけるスペースがある・・・。

↓私設のコース。

フローリングの床にビニルテープをはってコースを作りました。
うーん楽しい。メカトロがこんなに面白いものとは思わなかった。
なんか、ほかにも色々挑戦したくなりますね。

↓直角も曲がれます。

私に似たのか、たまに左右に頭を振って悩んだりするけど・・・。

・・・というわけで、AVR入門と言いながら、やってみるとすっかりメカトロがメインになってしまいました。
プログラム自体は非常に簡単なもので済んだせいだと思いますが・・・。
AVRのニーモニックにはまだ馴染んでいないところがありますが、まぁ、慣れの問題なのでこれから十分使用していけるとおもいます。

センサは今回初めて使用しました。このほかにも超音波センサ等を追加して障害物検知とかやってみようかなっと思っています。
・・・でも、ロボット開発って結構場所をとるものなのね〜。

今回学んだこと

・AT90S2313-10の最大動作周波数 10MHz。だけど20MHzでも動く。
  安全かどうかはさておき、オーバークロックでも結構動いてくれます。
・遊ばずにいられるか。
  1から自分でつくると改造するのも自在なので妄想が膨らみます。
  ああっ、あのセンサをつけたい・・・。
・スタックポインタの初期化を忘れずに。
  まさかここからやられるとは・・・。
・入力用レジスタと出力用レジスタは同じとは限らない。
  コレらのせいで思わぬところで時間を・・・、データシートはなめるように・・・。