Arduinoで作った回路の小型化(Arduino互換機の製作)(5)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) (3) (4) (5) (6) (7) (8) (9) 次のページへ
2017年01月17日 公開。

7.内蔵CR発振器でArduino互換機を動かす

7-1.内蔵CR発振器について

ATmega328Pには、8MHzのクロック信号を発生するためのCR発振器を内蔵しています。これを利用すると、水晶振動子やセラミック発振子を使わずに、ATmega328Pを8MHzのクロックで動作させる事ができます。ただし、内蔵CR発振器を利用すると、周波数の精度が悪く、最大で10%の誤差が生じます。

水晶振動子、セラミック発振子、および内蔵CR発振器を使った場合の周波数精度は、それぞれ、0.1%、1%、10%程度となっています。(水晶振動子やセラミック発振子を使った場合の周波数精度は、正確にはそれぞれのデータシートを参照してください。)

内蔵CR発振器は、周波数精度が悪いので、正確なタイミングが要求される用途には利用できません。しかし、電子サイコロなら、10%程度、動作速度に誤差が出ても、全く問題がありませんので、内蔵CR発振器を利用できます。

7-2.内蔵CR発振器を使用する場合のArduino互換機の基本回路

内蔵CR発振器を利用する場合のArduino互換機の基本回路を図32に示します。

図32、内蔵CR発振器を使用する場合のArduino互換機の基本回路
↑ 画像をクリックするとPDFファイルで表示
図32、内蔵CR発振器を使用する場合のArduino互換機の基本回路

水晶振動子を使う場合の回路(図7)と比較すると、ATmega328P-PUの9番ピンと10番ピンに接続されていた水晶振動子と2つの22pFのコンデンサがなくなっている事が分かります。

この様に、空きピンが2つ増えたので、これらの空きピンもI/Oピンとして利用でき、digitalRead関数digitalWrite関数で信号の入出力ができます。

内蔵CR発振器を利用してArduino互換機を組む場合のATmega328P-PUのピン接続は、図33の様になります。

図33、内蔵CR発振器を利用してArduino互換機を組む場合のATmega328P-PUのピン接続
↑ 画像をクリックすると拡大
図33、内蔵CR発振器を利用してArduino互換機を組む場合のATmega328P-PUのピン接続
赤字で示したピンが、I/Oピンとして使えるピン。

この図を見て分かる様に、9番ピンと10番ピンがそれぞれD20、D21のI/Oピンとして使えます。

7-3.内蔵CR発振器を利用した電子サイコロの回路図とスケッチ

内蔵CR発振器を利用したArduino互換機を内蔵した電子サイコロの回路は、図32の回路に7個のLEDとそれぞれの電流制限抵抗、そしてスイッチを1個追加すればできます。その結果できた回路図を図34に示します。

図34、内蔵CR発振器を利用した場合の電子サイコロ
↑ 画像をクリックするとPDFファイルで表示
図34、内蔵CR発振器を利用した場合の電子サイコロ

この回路図の基板の写真を写真26と写真27に示します。

写真26、内蔵CR発振器版の電子サイコロ基板(表面)
↑ 画像をクリックすると拡大
写真26、内蔵CR発振器版の電子サイコロ基板(表面)
写真27、内蔵CR発振器版の電子サイコロ基板(裏面)
↑ 画像をクリックすると拡大
写真27、内蔵CR発振器版の電子サイコロ基板(裏面)

写真26を水晶発振子を使った基板の写真(写真11)と比較すると、水晶振動子と2個の22pFのコンデンサがなくなり、部品点数が減っている様子が分かります。

写真11(再掲)、水晶振動子を使った電子サイコロ基板(参考)
↑ 画像をクリックすると拡大
写真11(再掲)、水晶振動子を使った電子サイコロ基板(参考)

内蔵CR発振器を使った場合は、リスト2に示すスケッチを利用します。

リスト2、内蔵CR発振器を使う場合の電子サイコロのスケッチCOPY
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のままにしておくと、入力電圧が確定せず、マイコンの消費電流が増加したり、最悪の場合マイコンがラッチアップするなどのトラブルの発生の可能性があります。

広告

7-4.スケッチの書き込み方

リスト2のスケッチをATmega328Pに書き込む方法について説明します。Arduino Uno用ブートローダライタシールドを使う場合とArduino用ブートローダ/スケッチライタを使う場合のスケッチの書き込み方を、順に説明します。

7-4-1.Arduino Uno用ブートローダライタシールドを使う場合のスケッチの書き込み

Arduino Uno用ブートローダライターシールドを使う場合のスケッチの書き込み方法について説明します。

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1440円
販売店 スイッチサイエンス
サポートページ

まず、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参照)

図35、"ATmega328P(8MHz/INT OSC)"を選択(Arduino IDE 1.0.Xの場合)
図35、"ATmega328P(8MHz/INT OSC)"を選択(Arduino IDE 1.0.Xの場合)

Arduino IDE 1.6.X、1.7.X、または1.8.Xをお使いの場合は、手順9では、まずツール→ボードメニューでATmega328Pを選び(図36参照)、次にツール→Clockメニューで8MHz/INT OSCを選んでください(図37参照)。

図36、"ATmega328P"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)
図36、"ATmega328P"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)
図37、"8MHz/INT OSC"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)
図37、"8MHz/INT OSC"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)

7-4-2.Arduino用ブートローダ/スケッチライタを使う場合のスケッチの書き込み

Arduino用ブートローダ/スケッチライタを使う場合のスケッチの書き込み方法について説明します。

Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタ(完成品) 商品名 Arduino用ブートローダ/スケッチライタ(完成品)
税抜き小売価格 3600円
販売店 スイッチサイエンス マルツ
サポートページ

まず、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)を選択します。

図38、"ATmega328P(8MHz/INT OSC)"を選択(Arduino IDE 1.0.Xの場合)
図38、"ATmega328P(8MHz/INT OSC)"を選択(Arduino IDE 1.0.Xの場合)

Arduino IDE 1.6.X、1.7.Xまたは1.8.Xを使っている場合は、まずツール→ボードメニューでATmega328Pを選び(図39参照)、次にツール→Clockメニューで8MHz/INT OSCを選びます(図40参照)。

図39、"ATmega328P"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)
図39、"ATmega328P"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)
図40、"8MHz/INT OSC"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)
図40、"8MHz/INT OSC"を選択(Arduino IDE 1.6.X、1.7.X、または1.8.Xの場合)

7-4-3.内蔵CR発振器を使って電子サイコロを動作させてみる

スケッチがATmega328P-PUに書き込めたら、ICソケットに差し込んで、電子サイコロを動作させてみます。今回は、単3アルカリ電池2本を接続して、3Vで動作させました。

写真28に示す様に、水晶振動子やセラミック発振子なしに、電子サイコロ基板が動作します。

写真28、水晶振動子やセラミック発振子なしで動作する電子サイコロ基板
↑ 画像をクリックすると拡大
写真28、水晶振動子やセラミック発振子なしで動作する電子サイコロ基板

次のページでは、メモリ容量の小さいマイコンを用いてコストダウンする方法について解説します。

目次へ  前のページへ (1) (2) (3) (4) (5) (6) (7) (8) (9) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1440円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタ(完成品) 商品名 Arduino用ブートローダ/スケッチライタ(完成品)
税抜き小売価格 3600円
販売店 スイッチサイエンス マルツ
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。