メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

PukiWiki最新記事
[ リロード ]   [ ソース ]  [ トップ | インデックス | 単語検索 | ご意見、ご感想 ]

Counter: 22519, today: 2, yesterday: 5

Arduino UNOへのブートローダーの書き込みとATmega328P-PUの単体動作

Arduino UNOで動かしたプログラム (スケッチ)やハードをそのままマイコンだけ(ATmega328P-PU)
とりだして単体動作させたいことがありますが、Arduino UNOなら特別なAVRライターなしで簡単?にできます。
今回は、Arduino UNOで動作したサーボコントロールのスケッチをATmega328P-PUにアップロードして
単体で動かしてみました。

メリットとして、
●3.3V動作せさることができ、3.3VインターフェースのSDカードやRaspberry Piなどと直接つなぐことが出来る。
●Arduino UNOが約2500円に対して、単体動作だとATmega328P-PU (約250円)と家にある?数個の部品を追加するだけ。
●Aruino UNOをパソコンと切り離して動作させるには7V〜12VのバッテリーやACアダプターなどが必要だけど、
ATmega328P-PUの単体動作ならなら1.8V〜5.5Vなので乾電池などでも動作させられ消費電力も小さい。
などです。

ATmega328P-PUへブートローダーを書き込む

まずは、購入したATmega328P-PUにブートローダーを書き込みます。
このブートローダーの書き込みでオリジナルのATmega328P-PUと同じようにArduino UNOに挿して使うことができるようになります。

普通は、以下のようにArduino UNOとATmega328P-PUのみを接続してブートローダーを書き込むようですが、
一度失敗すると書き込めなくなってしまうので(初期状態では内部クロックだが、書き込み後に外部クロックに切り替わる)、
最初からクリスタルまたはセラロックを接続しておきます。
クリスタルだと、コンデンサーの接続も必要で面倒ですが、セラロック(16MHz)ならピンに半田付けしておくことで、
ブレッドボードに挿せばすぐに発振回路として動作するのでとても便利です。ただし、ピン配置がマイコンと異なるので
セラロックの足をひねって絶縁した上でピンに半だ付けします(ブートローダーの書き込みで一番大変な作業(笑))。細かな作業でイモ半田になってしまいました・・・

  セラロック  

あとは、以下の図のように配線します(左図はarduino.ccより)。

  Arduino配線   Arduino、ブレッドボード配線  

クリスタル部分(左図のブレッドボードの右下部分)がセラロックに変更することで部品と配線がかなり減ってます。
1番ピン(リセットピン)のプルアップ抵抗はつないでません。

optifix.zipを以下のサイトよりダウンロードして解凍&一部修正。
http://arduino.cc/forum/index.php/to­pic,28733.0.html

以下のサイトがわかりやすいです。
http://www.hiramine.com/physicalcomp­uting/arduinocompatibleboard/03_writ­ebootloader.html

ブートローダー付きのATmega328P-PUができたら、オリジナルのものと置き換えてスケッチを書き込みます。
念のため、Arduino UNOにサーボをつないで動かしてみます。
オリジナルのものと同じ動作であればブートローダーの書き込みと自分で作成したスケッチの書き込みが共にOKです。

ATmega328P-PUの単体動作

確認ができたら、ATmega328P-PUを再びはずしてブレッドボードに載せます。
先ほどと同様に、セラロックをつなぎ、リセット回路 (抵抗(1KΩ)、タクトスイッチ)と電源にはセラミックコンデンサー(0.1μF)を入れます。
回路図は省略しますが、リセット端子を1KΩでプルアップして、タクトスイッチでグランドに落としてリセットしています。

そうなんです。以下の部品を追加するだけです。

セラロック 16MHz (秋月で40円)
抵抗 1KΩ(1円?)
タクトスイッチ (秋月で10円)
セラミックコンデンサー 0.1μF (10円?)

これで準備が整いました。たったこれだけの回路でブレッドボードのATmega328P-PUはArduino UNOのように動作します。マイコン以外で言えば基板が一番高いと思われますが、作ろうとしている回路と同じ基板に載せれば十分です。

Arduino UNOの回路図のピン配置とATmega328P-PUのピン配置をみてサーボのコントロールする信号ピン(今回は15番ピン)に接続します。

Arduino UNOの回路図
http://arduino.cc/en/uploads/Main/Ar­duino_Uno_Rev3-schematic.pdf

ATmega328P-PUのピン配置

  ATmega328P-PU ピン配置   ATmega328 ピン配置2  

実際にサーボをつないで動作させるところ

  Arduino サーボコントロール  

電圧と最大動作周波数

せっかく単体動作させるならACアダプタによる電源などではなく乾電池などで動作させられると手軽でいいです。

ATmega328Pのデータシートの電気的特性をみると、
1.8V@4MHz(〜5.5V), 2.7V@10MHz(〜5.5V), 4.5V@20MHz(〜5.5V)で動作可能です。
さらに詳しくみていくと、
各電圧での最大周波数は以下のようになります。

  電圧 vs 最大周波数  

ここで、黒字はデータシートからの値で赤字は計算値です。

電圧を下げていくと周波数を下げないと動きませんが、周波数を下げれば
このマイコンは1.8Vでも動作し、乾電池2本(3V)なら8MHzの外付けクロックでも動かせます。
もちろん、マイコンが動作してもセンサーなど他の外付けの回路が動作しないと困りますが・・・
8MHz, 3.3V動作のATmega328Pは消費電流が約4mAととても消費電力が小さいです。

実際に電池2本をつないでATmega328Pを動かしてみたところ
問題が発生!
乾電池2本(3.25V)では、8MHzどころか16MHzでも正常に動いたのですが(結構マージがありそう)、
ニッケル水素電池のエネループ2本(2.73V)ではなぜか8MHzでも動作しません。
どうみても16MHz 3.25Vで動作するなら8MHz 2.73Vでも動作するはず・・・

データシートをさらにみると、
BODLEVEL ヒューズ (VBOT) 設定というのがあって、
低電圧の検出をしてリセットする回路があり、
Arduino UNOの設定値は、このBODLEVEL2〜0というヒューズビットが101。つまり、
2.7V以下(標準2.7V, 最小2.5V, 最大2.9V)に電圧が下がるとリセットがかかってしまいます。
つまり、乾電池の場合はリセットがかからず正常動作。エネループはリセットがかかって動作しないという現象とも合います。
検索すると、ほとんどの人はATmega328Pは2.7V付近までしか動作しないものと勘違いしてるような・・・
でも、確認してみないと自分が勘違いしている可能性もある (笑)
これらのヒューズビットを「111」に設定すればこのリセットはかからず1.8Vまで
下げられるはずです(未確認)。

以上、かなり言葉足らずの説明不足でわかりにくいかもしれませんが、手順だけはつかめると思います。

   

ページコメント
投稿された内容の著作権はコメントの投稿者に帰属します。

トラックバック [ トラックバック(0) ]
トラックバック URL: http://myboom.mkch.net/modules/pukiwiki/tb/160