2017年01月17日 | 公開。 |
ATmega328Pには、8MHzのクロック信号を発生するためのCR発振器を内蔵しています。これを利用すると、水晶振動子やセラミック発振子を使わずに、ATmega328Pを8MHzのクロックで動作させる事ができます。ただし、内蔵CR発振器を利用すると、周波数の精度が悪く、最大で10%の誤差が生じます。
水晶振動子、セラミック発振子、および内蔵CR発振器を使った場合の周波数精度は、それぞれ、0.1%、1%、10%程度となっています。(水晶振動子やセラミック発振子を使った場合の周波数精度は、正確にはそれぞれのデータシートを参照してください。)
内蔵CR発振器は、周波数精度が悪いので、正確なタイミングが要求される用途には利用できません。しかし、電子サイコロなら、10%程度、動作速度に誤差が出ても、全く問題がありませんので、内蔵CR発振器を利用できます。
内蔵CR発振器を利用する場合のArduino互換機の基本回路を図32に示します。
水晶振動子を使う場合の回路(図7)と比較すると、ATmega328P-PUの9番ピンと10番ピンに接続されていた水晶振動子と2つの22pFのコンデンサがなくなっている事が分かります。
この様に、空きピンが2つ増えたので、これらの空きピンもI/Oピンとして利用でき、digitalRead関数やdigitalWrite関数で信号の入出力ができます。
内蔵CR発振器を利用してArduino互換機を組む場合のATmega328P-PUのピン接続は、図33の様になります。
この図を見て分かる様に、9番ピンと10番ピンがそれぞれD20、D21のI/Oピンとして使えます。
内蔵CR発振器を利用したArduino互換機を内蔵した電子サイコロの回路は、図32の回路に7個のLEDとそれぞれの電流制限抵抗、そしてスイッチを1個追加すればできます。その結果できた回路図を図34に示します。
この回路図の基板の写真を写真26と写真27に示します。
写真26を水晶発振子を使った基板の写真(写真11)と比較すると、水晶振動子と2個の22pFのコンデンサがなくなり、部品点数が減っている様子が分かります。
内蔵CR発振器を使った場合は、リスト2に示すスケッチを利用します。
void display(int n)
{
switch(n) {
case 0:
digitalWrite(2,LOW );
digitalWrite(3,LOW );
digitalWrite(4,LOW );
digitalWrite(5,HIGH);
break;
case 1:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,LOW );
digitalWrite(5,LOW );
break;
case 2:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,LOW );
digitalWrite(5,HIGH);
break;
case 3:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,HIGH);
digitalWrite(5,LOW );
break;
case 4:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
break;
case 5:
default:
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW );
break;
} // switch
} // display
void setup()
{
// used pins
pinMode( 2,OUTPUT ); // LED A
pinMode( 3,OUTPUT ); // LED B
pinMode( 4,OUTPUT ); // LED C
pinMode( 5,OUTPUT ); // LED D
pinMode( 6,INPUT_PULLUP); // switch
// unused pins
pinMode( 0,INPUT_PULLUP);
pinMode( 1,INPUT_PULLUP);
pinMode( 7,INPUT_PULLUP);
pinMode( 8,INPUT_PULLUP);
pinMode( 9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(13,INPUT_PULLUP);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);
pinMode(A4,INPUT_PULLUP);
pinMode(A5,INPUT_PULLUP);
pinMode(20,INPUT_PULLUP);
pinMode(21,INPUT_PULLUP);
display(0);
} // setup
void loop()
{
static int pip=0;
delay(8);
if(digitalRead(6)==LOW) {
pip++;
if(pip>=6) pip=0;
display(pip);
} // if
} // loop
リスト2は、Arduino Uno版のスケッチ(リスト1)とほとんど一緒ですが、setup関数に次の2行が追加されている点だけ異なります。
pinMode(20,INPUT_PULLUP);
pinMode(21,INPUT_PULLUP);
この部分は、新たにD20とD21がI/Oピンとして使えるようになったため、これらのピンを入力モードにし、内蔵プルアップ抵抗を有効にしています。
注:未使用のI/Oピンは、pinMode関数でINPUT_PULLUPかOUTPUTに指定するべきです。デフォルトのINPUTのままにしておくと、入力電圧が確定せず、マイコンの消費電流が増加したり、最悪の場合マイコンがラッチアップするなどのトラブルの発生の可能性があります。
リスト2のスケッチをATmega328Pに書き込む方法について説明します。Arduino Uno用ブートローダライタシールドを使う場合とArduino用ブートローダ/スケッチライタを使う場合のスケッチの書き込み方を、順に説明します。
Arduino Uno用ブートローダライターシールドを使う場合のスケッチの書き込み方法について説明します。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
まず、ATmega88/88V/168P/328PサポートファイルをArduino IDEにインストールしてください。インストール方法は、ATmega88/88V/168P/328PにArduinoのブートローダを書き込むの記事に説明があります。
次に、前のページで説明した、8MHz水晶振動子・3V動作の場合のスケッチの書き込み方と手順9以外は同様の方法でスケッチを書き込んでください。
Arduino IDE 1.0.Xをお使いの場合、手順9ではツール→マイコンボードメニューでATmega328P(8MHz/INT OSC)を選んでください。(図35参照)
Arduino IDE 1.6.X、1.7.X、または1.8.Xをお使いの場合は、手順9では、まずツール→ボードメニューでATmega328Pを選び(図36参照)、次にツール→Clockメニューで8MHz/INT OSCを選んでください(図37参照)。
Arduino用ブートローダ/スケッチライタを使う場合のスケッチの書き込み方法について説明します。
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタ(完成品) | |
税抜き小売価格 | 3600円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | Arduino用ブートローダ/スケッチライタ(完成品)サポートページ |
まず、ATmega88/88V/168P/328PサポートファイルをArduino IDEにインストールしてください。インストール方法は、ATmega88/88V/168P/328PにArduinoのブートローダを書き込むの記事に説明があります。
次に、Arduino用ブートローダ/スケッチライタの製作(7)に書いてある説明に従って、スケッチを書き込んでください。
ただし、手順8ではATmega328P(8MHz/INT OSC)を選択してください。
Arduino IDE 1.0.Xを使っている場合は、ツール→マイコンボードメニューでATmega328P(8MHz/INT OSC)を選択します。
Arduino IDE 1.6.X、1.7.Xまたは1.8.Xを使っている場合は、まずツール→ボードメニューでATmega328Pを選び(図39参照)、次にツール→Clockメニューで8MHz/INT OSCを選びます(図40参照)。
スケッチがATmega328P-PUに書き込めたら、ICソケットに差し込んで、電子サイコロを動作させてみます。今回は、単3アルカリ電池2本を接続して、3Vで動作させました。
写真28に示す様に、水晶振動子やセラミック発振子なしに、電子サイコロ基板が動作します。
次のページでは、メモリ容量の小さいマイコンを用いてコストダウンする方法について解説します。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタ(完成品) | |
税抜き小売価格 | 3600円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | Arduino用ブートローダ/スケッチライタ(完成品)サポートページ |