ブレッドボードを使った arduino流 ものづくり...

28
2002.11.27- 2015.7.7 ブレッドボードを使った Arduino流 ものづくり (ATmega328P版)[pdf ] (ATtiny4313版はこちら) 小山智史(弘前大学教育学部) 目次 0. 準備 1. デジタル出力(1): 光るものを作る(LEDの点滅) 2. デジタル入力: スイッチ操作できるものを作る(LEDのオンオフ) 3. アナログ出力: LEDの明るさを変える 4. デジタル出力(2): 数字を表示する 5. アナログ入力: アナログ値をデジタル表示する 6. 感じるものを作る 7. 音の出るものを作る 8. 動くものを作る 9. 応用例 私達の身近にある家電機器の多くにコンピュータが内蔵されており、このようなコンピュータは「マイコン」と呼ばれます。マ イクロコンピュータあるいはマイクロコントローラの略です。マイコンにはメーカーが開発したプログラムが書き込まれていま す。リモコンの中に入っているマイコンには、押したボタンに応じて決まったパターンで赤外線をオンオフするプログラムが 書き込まれています。このプログラムはマイコン製造時に書き込まれ、後から書き換えることはできませんが、フラッシュメモリ (電気的に書き換え可能なプログラムメモリ)を搭載したマイコンを使えば、私達もさまざまな機器を作ることができます。 マイコンを使った機器を設計・製作するには、電子回路、論理回路、コンピュータの仕組み、プログラミングなど広範囲の 知識が要求されます。これは大変なことではありますが、一方ではこれらのことを学ぶ格好の教材であるということを意味し ています。 このテキストでは、AVRマイコン(ATmega328P)[1]を使った実習を行いながら、「マイコンをつかったものづくり」について学 習します。また、最近注目されているArduino[2]の開発環境(Arduino IDE)を使います(またはArduino IDEは使わずに行い ます)。例題の多くは、ArduinoIDEに用意されている「スケッチの例」をそのまま、あるいは多少アレンジして取り上げていま す。 ☆ コンピュータの仕組みを学びたい方は「AVRマイコンで学ぶコンピュータの仕組み」[3]を参考にしてください。 ☆ ブレッドボードを初めて使う方は、「ブレッドボードの使い方」[4]をご覧ください。 ☆ AVRライターはHIDaspx(ヒダピオ)またはArduinoISPを使います。「AVRライター」[5]をご覧ください。 ☆ ここでは複雑な電子回路は登場していませんが、電気回路の最低限の知識は前提としています。必要な場合はこちらの 資料[6]を参考にしてください。 ☆ このテキストは実習時に適宜解説や補足を行うことを前提にしています。自学自習には適していないかもしれません。 1

Upload: others

Post on 20-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

2002.11.27- 2015.7.7

ブレッドボードを使った Arduino流 ものづくり (ATmega328P版)[pdf] (ATtiny4313版はこちら)

小山智史(弘前大学教育学部)目次

0. 準備1. デジタル出力(1): 光るものを作る(LEDの点滅)2. デジタル入力: スイッチ操作できるものを作る(LEDのオンオフ)3. アナログ出力: LEDの明るさを変える4. デジタル出力(2): 数字を表示する5. アナログ入力: アナログ値をデジタル表示する6. 感じるものを作る7. 音の出るものを作る8. 動くものを作る9. 応用例

 私達の身近にある家電機器の多くにコンピュータが内蔵されており、このようなコンピュータは「マイコン」と呼ばれます。マ

イクロコンピュータあるいはマイクロコントローラの略です。マイコンにはメーカーが開発したプログラムが書き込まれていま

す。リモコンの中に入っているマイコンには、押したボタンに応じて決まったパターンで赤外線をオンオフするプログラムが

書き込まれています。このプログラムはマイコン製造時に書き込まれ、後から書き換えることはできませんが、フラッシュメモリ

(電気的に書き換え可能なプログラムメモリ)を搭載したマイコンを使えば、私達もさまざまな機器を作ることができます。

 マイコンを使った機器を設計・製作するには、電子回路、論理回路、コンピュータの仕組み、プログラミングなど広範囲の

知識が要求されます。これは大変なことではありますが、一方ではこれらのことを学ぶ格好の教材であるということを意味し

ています。

 このテキストでは、AVRマイコン(ATmega328P)[1]を使った実習を行いながら、「マイコンをつかったものづくり」について学

習します。また、 近注目されているArduino[2]の開発環境(Arduino IDE)を使います(またはArduino IDEは使わずに行い

ます)。例題の多くは、ArduinoIDEに用意されている「スケッチの例」をそのまま、あるいは多少アレンジして取り上げていま

す。

☆ コンピュータの仕組みを学びたい方は「AVRマイコンで学ぶコンピュータの仕組み」[3]を参考にしてください。

☆ ブレッドボードを初めて使う方は、「ブレッドボードの使い方」[4]をご覧ください。

☆ AVRライターはHIDaspx(ヒダピオ)またはArduinoISPを使います。「AVRライター」[5]をご覧ください。

☆ ここでは複雑な電子回路は登場していませんが、電気回路の 低限の知識は前提としています。必要な場合はこちらの

資料[6]を参考にしてください。

☆ このテキストは実習時に適宜解説や補足を行うことを前提にしています。自学自習には適していないかもしれません。

1

Page 2: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

0. 準備

1. Arduino 1.6.5-r2(Windows ZIP file)をダウンロードし、マウスの右クリックで[すべて展開]します(時間がかかります)。

2. 「c:/arduino」フォルダを作成し、この中に上で展開したArduino-1.6.5-r2フォルダの中のArduino-1.6.5-r2フォルダを移動します。

3. c:/arduino/Arduino-1.6.5-r2/arduino.exeのショートカットを作り、デスクトップまたはスタートメニューに置きます。

4. hardware-1.6.5.zipを解凍し、展開したhardwareフォルダをArduino-1.6.5-r2/hardwareに上書きします。これにより以下のことが行

われます。

◦ hardware/arduino/avrフォルダのboards.txtとprogrammers.txtとplatform.txtを差し替え。

◦ hardware/tools/avr/binフォルダにhidspx-2012-0326[4]のhidspx.exeとhidspx.iniとfuse_j.txtを追加(HIDaspx / HIDapio ライ

タ用)。

◦ hardware/tools/avr/binフォルダにcat.exeとrm.exeとtest.exeを追加(Arduino-1.0.6より)

◦ hardware/tools/avr/binフォルダにArduinoISP328.bat, HIDapio328.bat, HIDaspx328.bat, arduino.batを追加(コマンドライン

操作用)。

5. W5200を搭載したEthernetモジュール(Wiz820ioなど)を使う場合は、hardwareフォルダと一緒に解凍されたlibrariesフォルダを

Arduino-1.6.5-r2/librariesに上書きします。これにより以下のことが行われます。

◦ libraries/Ethernet/srcフォルダのEthernet.hを差し替え

◦ libraries/Ethernet/src/utilityフォルダのw5100.cppとw5100.hを差し替え(実際にW5200を使う時にw5100.hの24行目を有効

にする)

6. ArduinoIDEを利用する場合

◦ AVRライタにArduinoISPを使う場合は、[ツール][ボード]で「ArduinoISP - ATmega328P」を選択します。また、[ツール][ポー

ト]でポートを選択します。なお、初回はドライバの組み込みを行う必要があります。

◦ AVRライタにHIDapioを使う場合は、 [ツール][ボード]で「HIDapio - ATmega328P」を選択します。

7. ArduinoIDEを利用しない場合は、AVRライタに合わせてarduino-1.6.5-r2/hardware/tools/avr/binフォルダのArduinoISP328.bat

またはHIDapio328.batのショートカットを作り、名前を「Arduino」としてc:/arduinoフォルダやデスクトップにおきます。少しパソコン

の操作に慣れた方であれば、この方法が軽快です。また、ArduinoISPよりもHIDapioの方が書き込みが高速です。

2

Page 3: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

1. デジタル出力(1): 光るものを作る(LEDの点滅)

1.1 LEDの点滅

 はじめの一歩、「Lチカ」です。以下の回路を組み立ててください。なお、AVRマイコンにはArduinoピン番号を記したラベルを貼ってお

きます(テプラファイル)。

回路図実体配線図

 以下のプログラムは、Arduino IDE の [スケッチの例][01.Basics][Blink] の正味の部分を抜粋したものです。「//」以下行末まではコメ

ントですので、入力しなくても構いません。

Blink.ino: ArduinoIDE [スケッチの例][01.Basics][Blink]

int led=13; // 変数ledに13を代入する void setup(){ // { }内をはじめに1度だけ実行する pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // { }内を繰り返し実行する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(1000); // 1秒(1000ms)待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(1000); // 1秒(1000ms)待つ }

 ArduinoIDEを利用する場合は、Arduinoを起動し、下図のように上記のプログラムを入力し、マイコンに書き込んで動作を確かめてくだ

さい。また、c:/arduinoフォルダにBlinkという名前で保存してください。すると、そのフォルダにBlinkフォルダが作られ、中にBlink.inoとい

うファイルが作られます。

ArduinoIDEを利用する場合の表示画面

 ArduinoIDEを利用しない場合は、下図のようにメモ帳等でc:/arduinoフォルダにBlink.inoを作成し、そのファイルアイコンを「Arduino」

にドラッグ&ドロップすると、プログラムが書き込まれます。

3

Page 4: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

ArduinoIDEを利用しない場合のドラッグ&ドロップ操作

 以下、プログラムの内容について簡単に説明します。

• 1行目で整数型の変数「led」に13を代入します。

• 2~4行目の setup(){ } の中(ここでは3行目)は電源投入後に1度だけ実行され、ここでは「pinMode(led,OUTPUT)」でledピン(13ピ

ン)を出力に設定しています。

• 5~10行目のloop(){ } の中は繰り返し実行されます。

• 6行目の「digitalWrite(led,HIGH)」はledピンにHIGH(高い電圧)を出力します。

• 7行目の「delay(1000)」は1秒(1000ms)待ちます。

• 8行目の「digitalWrite(led,LOW)」はledピンにLOW(低い電圧)を出力します。

• 9行目の「delay(1000)」は1秒(1000ms)待ちます。

• 以下、6~9行目が繰り返されます。

 この例のように、Arduinoのプログラムは以下のように作ります。なお、Arduinoではプログラムのことをスケッチと呼びますが、このテキス

トでは一般的な「プログラム」という言葉を使います。

1. プログラム全体を通して使う変数を冒頭に定義します(この例では1行目)。変数はデータ(値)を入れる入れ物のことです。中に入

れるデータによって入れ物の大きさは異なります。データの型については付録1を参照してください。

2. setup(){ }の中に、電源投入後に1度だけ実行したいプログラムを記載します(この例では2~4行目)。

3. loop(){ }の中に、繰り返して実行したいプログラムを記載します(この例では5~10行目)。

4. 各行の「//」以降はコメントとなります。また、この例にはありませんが、「/* */」で囲まれた箇所は改行も含めてコメントとなります。

5. HIGHやLOWやOUTPUTは「組み込み定数」で、あらかじめ値が定義されています(付録1)。

6. pinMode()やdigitalWrite()はあらかじめ用意された「組み込み関数」です(付録1)。関数を独自に定義することもできます。

(練習) LEDを0.5秒点灯、0.5秒消灯を繰り返すようにプログラムを変更しなさい。また、0.2秒点灯、1.8秒消灯を繰り返すように変更しな

さい。

1.2 LEDを高速に点滅させる

 LEDの点灯時間と消灯時間を変更してみます。

 7行目と9行目を「delay(1000)」→「delay(100)」→「delay(20)」→「delay(10)」→「delay(1)」と変えて、点滅の様子を確認してください。

「delay(10)」の時は10ms点灯、10ms消灯を繰り返し、50Hzの点滅になります。「delay(20)」(25Hz)の時は点滅しているのがわかりますが、

「delay(10)」(50Hz)では点滅を感じなくなります。人間の目が感じる「点滅のちらつき」はフリッカと呼ばれ、高速の点滅(50~60Hz)ではち

らつきを感じなくなります。

 通常の蛍光灯は100Hz(50Hzの2倍)で点滅しますが、蛍光管の状態によっては発光にムラが生じ50Hzで点滅し、その場合はちらつき

が気になることがあります。インバーター式の蛍光灯はちらつきを抑えるために超高速(数10kHz)で点滅させています。また、ブラウン管

テレビが毎秒30フレーム(実際にはインターレースで60Hzのフリッカ)、映画のフィルムが毎秒24フレーム(実際には同じフレームを2度映

すことで48Hzのフリッカ)になっているのは、このような目の特性を考慮してのことです。

4

Page 5: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

2. デジタル入力: スイッチ操作できるものを作る(LEDのオンオフ)

2.1 スイッチが押されている時にLEDを点灯する

 スイッチと抵抗を追加し、下図の回路にします。

 以下のプログラムは、buttonピンがHIGHならば(スイッチが押されていれば)LEDを点灯し、LOWならばLEDを消灯します。

 8行目で、「digitalRead(button)」でbuttonピン(2ピン)がHIGH(高い電圧)かLOW(低い電圧)かを読み取り、HIGHであれば9行目が実行

され、そうでなければ11行目が実行されます。

Button.ino: ArduinoIDE [スケッチの例][02.Digital][Button]

int button=2; // 変数buttonに2を代入する int led=13; // 変数ledに13を代入する void setup(){ pinMode(button, INPUT); // buttonピンを入力にする(この行はなくても良い) pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ if(digitalRead(button)==HIGH){//buttonピンがHIGHならば digitalWrite(led, HIGH); // ledピンにHIGHを出力する }else{ // そうでなければ digitalWrite(led, LOW); // ledピンにLOWを出力する } }

2.2 スイッチ操作で交互に点灯・消灯する

 以下のプログラムは、スイッチを押すと交互にLEDが点灯・消灯します。

 11行目は、現在のbuttonピンの状態(HIGHまたはLOW)を読み取り、buttonStateに代入します。12行目で、それがlastState(直前の

buttonの状態)と違っていて、かつそれがHIGHなら、ledState(ledの状態)を反転します。13行目でledStateをledピンに出力します。

Debounce.ino: ArduinoIDE [スケッチの例][02.Digital][Debounce] の簡易版

int button=2; // 変数buttonに2を代入する int led=13; // 変数ledに13を代入する int ledState=HIGH; // 変数ledStateをHIGHにする(現在の点灯状態) int buttonState; // 現在のbuttonの状態 int lastState; // 直前のbuttonの状態 void setup(){ pinMode(button, INPUT); // buttonピンを入力にする pinMode(led, OUTPUT); // ledピンを出力にする } void loop(){ // 以下を繰り返す buttonState=digitalRead(button); // buttonピンを読みbuttonStateに代入 if(buttonState!=lastState && buttonState==HIGH) ledState=!ledState; // それが前の状態と違いかつHIGHならledStateを反転 digitalWrite(led, ledState);// ledピンにledStateの値を出力 lastState=buttonState; // lastStateを更新する delay(10); // チャタリングを考慮し少し待つ }

 15行目の「delay(10)」がないと、しばしば誤動作してしまいます。それは、スイッチを押した時に、ごく短い時間にその接点がオンになっ

たりオフになったりするからです。スイッチを離した時も同様です。スイッチによって異なりますが、10ms程で落ち着きます。この現象は

「チャタリング」と呼ばれます。

(練習) 15行目のdelay(10)を極端に長くし、例えば待ち時間が2秒になるようにして、どのような動作になるか調べなさい。

2.3 スイッチを4回押すと点灯する

 以下のプログラムは、スイッチ操作4回に一度LEDが点灯します。

 上の例ではledStateを記憶し、スイッチが押されるとその値を反転させていましたが、ここではCounterにスイッチが押された回数を記

憶します。12行目で、buttonState(現在のbuttonの状態)がlastState(直前のbuttonの状態)と違っていて、かつそれがHIGHなら、

Counterの値に1を足しこみます。14行目で、「Counter%4==0」がtrueつまりCounterの値を4で割った余りが0であればledにHIGHを出力

し、そうでなければLOWを出力します。

StateChangeDetection.ino: ArduinoIDE [スケッチの例][02.Digital][StateChangeDetection] (シリアル通信に関係する行を除き、loop()

の 後に「delay(10)」を挿入)

int button=2; // 変数buttonに2を代入する

5

Page 6: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

int led=13; // 変数ledに13を代入する int Counter=0; // 変数Counter(スイッチ操作回数)を0にする int buttonState; // 現在のbuttonの状態 int lastState=0; // 直前のbuttonの状態 void setup(){ pinMode(button, INPUT); // buttonピンを入力にする pinMode(led, OUTPUT); // ledピンを出力にする } void loop() { // 以下を繰り返す buttonState=digitalRead(button); // buttonピンを読みbuttonSteteに代入 if(buttonState!=lastState && buttonState==HIGH) Counter++; // それが前の状態と違いかつHIGHならCounterの値に+1 lastState=buttonState; // lastStateを更新する if(Counter%4==0) digitalWrite(led, HIGH); // Counterの値が4の倍数ならledピンにHIGHを出力し else digitalWrite(led, LOW); // そうでなければledピンにLOWを出力 delay(10); // チャタリングを考慮し少し待つ }

(練習) 14行目の「Counter%4==0」の箇所を「Counter%7==0」や「Counter%4!=0」などに変えて、どのような動作になるか調べなさい。

2.4 プルアップ抵抗

 話を2.1のButton.inoに戻しましょう。以下にプログラムと回路図を再掲します。

Button.ino: ArduinoIDE [スケッチの例][02.Digital][Button]

int button=2; // 変数buttonに2を代入する int led=13; // 変数ledに13を代入する void setup(){ pinMode(button, INPUT); // buttonピンを入力にする(この行はなくても良い) pinMode(led, OUTPUT); // ledピンを出力にする } void loop(){ if(digitalRead(button)==HIGH){//buttonピンがHIGHならば digitalWrite(led, HIGH); // ledピンにHIGHを出力する }else{ // そうでなければ digitalWrite(led, LOW); // ledピンにLOWを出力する } }

 このスイッチ入力の箇所をピックアップした図が下図(1)です。マイコンの入力信号はスイッチがオンの時にHIGH(高い電圧)、オフの時

にLOW(低い電圧)となります。

 ここで、抵抗とスイッチを入れ替えると(2)のようになります。こうすると、マイコンの入力信号はスイッチがオンの時にLOW、オフの時に

HIGHとなります。このように接続した時の抵抗を「プルアップ抵抗」といいます。「高い電圧に引っ張り上げるための抵抗」という意味で

す。プログラムは変えていませんから、スイッチを押せば消灯、離せば点灯します。押した時に点灯させるためには以下の箇所を書き換

えます。

if(digitalRead(button)==HIGH){ // buttonピンがHIGHならば(スイッチが押されていれば)

  ↓

if(digitalRead(button)==LOW){ // buttonピンがLOWならば(スイッチが押されていれば)

こうすると、スイッチを押せば点灯し、離せば消灯します。

 実は、プルアップ抵抗はマイコンの中に用意されていて、

pinMode(button, INPUT_PULLUP);

とするとそれが有効となり、外部に抵抗をつなぐ必要がなくなります(以下のプログラムの4行目)。図の(3)はこの様子を示したものです。

(1)前出の入力回路 (2)スイッチと抵抗を逆に接続 (3)マイコン内蔵の抵抗を利用

 抵抗をひとつ省略できただけですが、回路は下図のようにシンプルになります。

6

Page 7: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

Button.ino: ArduinoIDE [スケッチの例][02.Digital][DigitalInputPullup]

int button=2; // 変数buttonに2を代入する int led=13; // 変数ledに13を代入する void setup(){ pinMode(button, INPUT_PULLUP); // buttonピンをプルアップ入力にする pinMode(led, OUTPUT); // ledピンを出力にする } void loop(){ if(digitalRead(button)==LOW){// buttonピンがLOWならば digitalWrite(led, HIGH); // ledピンにHIGHを出力する }else{ // そうでなければ digitalWrite(led, LOW); // ledピンにLOWを出力する } }

(練習) 上記のようにスイッチを接続した時、2.2の「スイッチ操作で交互に点灯・消灯する」ようにDebounce.inoを修正しなさい。

(練習) 上記のようにスイッチを接続した時、2.3の「スイッチを4回押すと点灯する」ようにStateChangeDetection.inoを修正しなさい。

(練習) 2個の押しボタンスイッチを使い、一方のスイッチを押すとLEDが点灯し、もう一方のスイッチを押すと消灯するようにしなさい。

2.5 スイッチが押されるとLEDを3秒点灯する

 以下のプログラムは、スイッチが押されるとLEDを3秒点灯します。

3sec.ino:

int button=2; // 変数buttonに2を代入する int led=13; // 変数ledに13を代入する void setup(){ pinMode(button, INPUT_PULLUP);// buttonピンをプルアップ入力にする pinMode(led, OUTPUT); // ledピンを出力にする } void loop(){ if(digitalRead(button)==LOW){ // buttonピンがLOWならば digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(3000); // 3秒待つ }else{ // そうでなければ digitalWrite(led, LOW); // ledピンにLOWを出力する } }

7

Page 8: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

3. アナログ出力: LEDの明るさを変える

 これまでは、LEDが点灯するか消灯するかでした。しかし、点灯時の明るさを変化させたいこともあります。

3.1 LEDの明るさを変える

1.2ではLEDの点灯時間と消灯時間を変えてどのように見えるかを確認しました。ここでは7行目と9行目を「delay(1)」にしてみます。

Blink.ino: ArduinoIDE [スケッチの例][01.Basics][Blink] (7行目と9行目を1000→1に変更)

int led=13; // 変数ledに13を代入する void setup(){ // { }内をはじめに1度だけ実行する pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // { }内を繰り返し実行する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(1); // 1ms待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(1); // 1ms待つ }

 既に経験したように、点灯と消灯を高速に切り替えると、私達の目は点滅を認識できなくなります。代わりに、常時点灯している場合よ

りも少しだけ暗く感じます。「平均的に」半分の明るさになるからです。下図左は、この時のledピンの出力の波形を示したものです。8行

目のLOWをHIGHにすれば常時点灯となりますから、LEDの明るさを比較してみてください。私達の目は、明るさが半分になっても、

「ちょっと暗くなった」ぐらいにしか感じません。

 次に、7行目はそのままにして9行目を「delay(9)」としてみてください。こうすることにより、1ms点灯、9ms消灯を繰り返すようになり、明る

さはより暗く感じられます。この時の波形が上図中央です。

 HIGHとLOWの時間が等しい時「デューティ比50%」、常時HIGHの時「デューティ比100%」、HIGHが1msでLOWが9msなら「デューティ

比10%」といいます。この技術は「パルス幅変調(PWM)」と呼ばれ、モータのスピードコントロールや、デジタルオーディオアンプなどにも

利用されています。

8

Page 9: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

 さて、Arduinoでは analogWrite( ) という関数が用意されていて、

analogWrite(led, val)

とすると、ledピンにアナログ値val(0~255)が出力されます。正確に言えば、0/255~255/255のデューティ比で上記のようなPWM信号が

出力されます。ただし、アナログ出力できるピンは限られているため(付録1)、LEDを接続するピンを 13→9 に変更しています。

pwm.ino:

int led=9; // 変数ledに9を代入する void setup(){ // { }内をはじめに1度だけ実行する analogWrite(led, 10); // ledピンにアナログ値10を出力する } void loop(){ } // { }内は空

(練習) 3行目の「10」を0~255の間でいくつか変えて、LEDの明るさを観察しなさい。また、その時の波形をオシロスコープで観察して

記録しなさい。

(練習) ボタンを押す度に「消灯→暗い→明るい→消灯→...」の動作をするプログラムを作りなさい。

3.2 LEDの明るさを連続的に変える

 デューティ比を連続的に変化させれば、下図のように任意の波形を表すことができます。

 以下は、デューティ比を0%から100%まで少しずつ変化させるプログラムです。暗い状態から次第に明るくなり、その後次第に暗くなり、

これを繰り返します。プログラムの6行目でbrightnessの値をアナログ出力し、7行目でbrightnessの値をfadeAmountだけプラスします。

Fade.ino: ArduinoIDE [スケッチの例][01.Basics][Fade]

int led=9; // 変数ledに9を代入する int brightness=5; // 変数brightnessに5を代入する int fadeAmount=5; // 変数fadeAmountに5を代入する void setup(){ } void loop(){ // 以下を繰り返す analogWrite(led, brightness); // ledピンにbrightnessの値をアナログ出力する brightness=brightness+fadeAmount; // brightnessの値にfadeAmountの値を足し込む if(brightness==0 || brightness==255) // brightnessの値が0または255だったら fadeAmount=-fadeAmount; // fadeAmountの符号を逆にする delay(30); // 30ms待つ }

(練習) スイッチを押すとLEDがだんだん明るくなり、スイッチを離すだんだん暗くなるプログラムを作りなさい。

9

Page 10: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

4. デジタル出力(2): 数字を表示する

4.1 7セグメントLEDに数字を表示する

 数字表示LED(7セグメントLED)に数字を表示してみます。下図の回路を組み立ててください。

 以下のプログラムは、数字表示LEDに「5」を表示するものです。1~3行目はchar型の配列を定義していて、LED[0]には0x3f, LED[1]

には0x06, ..., LED[6]には0x67が入ります。6行目でその値を参照し、PORTDに出力しています。

 このプログラムはピンの扱いがArduino風ではありません。Arduinoのピン番号は、マイコン本来のポート毎の番号 PB0~PB7, PD0~

PD6, PA0,PA1 に通し番号を独自に割り振ったものです。この例では、LEDに接続された7本の信号線に一度に値を出力できるので、

Arduino風ではないこの方法をとりました。

Count.ino:

char LED[]={ // 配列LEDに値を入れる 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67 }; void setup(){ DDRD=0x7f; // PD0~PD6を出力にする PORTD=LED[5]; } void loop(){ }

 PD0~PD6はLEDのa~g>のセグメントに接続されていて、それぞれ 1 を出力した時に点灯する回路となっています。下表は、各数字

を表示する際にPD0~PD6の各々に何を出力すればよいかと、PORTDに出力すべき2進数値と16進数値を示したものです。

数字 PD6(g) PD5(f) PD4(e) PD3(d) PD2(c) PD1(b) PD0(a) 16進0 0 1 1 1 1 1 1 0x3F

1 0 0 0 0 1 1 0 0x06

2 1 0 1 1 0 1 1 0x5B

3 1 0 0 1 1 1 1 0x4F

4 1 1 0 0 1 1 0 0x66

5 1 1 0 1 1 0 1 0x6D

6 1 1 1 1 1 0 1 0x7D

7 0 1 0 0 1 1 1 0x27

8 1 1 1 1 1 1 1 0x7F

9 1 1 0 0 1 1 1 0x67

(練習) 表示する数字を他の数字に変更してみなさい。

10

Page 11: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

4.2 数字表示をカウントアップする

 表示される数字を1秒毎にカウントアップするには次のようにします。ポイントは配列を参照する9行目のLED[i]です。

Countup.ino:

char LED[]={ // 配列LEDに値を入れる 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67 }; void setup(){ DDRD=0x7f; // PD0~PD6を出力にする } void loop(){ for(int i=0;i<10;i++){ PORTD=LED[i]; delay(1000); } }

 以下は、スイッチを押すと数字表示がカウントアップするプログラムです。

ButtonCountup.ino:

int button=8; // 変数buttonに8を代入する int count=0; // 変数countに0を代入する char LED[]={ // 配列LEDに値を入れる 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67 }; void setup(){ pinMode(button, INPUT_PULLUP); // buttonピンをプルアップ入力にする DDRD=0x7f; // PD0~PD6を出力にする } void loop(){ if(count<9&&digitalRead(button)==LOW){//countが9未満でbuttonがLOWなら count++; // countの値をプラス1する delay(300); // チャタリングを考慮して少し待つ } PORTD=LED[count]; }

(練習) 数字表示が9~0にカウントダウンするプログラム Countdown.ino を作りなさい。

(練習) Countup.ino を、1秒毎ではなく10ms毎に高速でカウントアップするようにしなさい。また、スイッチが押されるとカウントを停止する

ようにしなさい。

(練習) 1秒毎に「H」「E」「L」「L」「O」を表示し、その後3秒間消え、再びこれを繰り返すプログラムを作りなさい。また、「E」「r」「r」「o」「r」

の表示にしてみなさい。また、自分の名前を表示できるか工夫してみなさい。

11

Page 12: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

5. アナログ入力: アナログ値をデジタル表示する

5.1 アナログ値の入力

 analogRead(A0)は、A0ピンの電圧(0~3V)に応じて0~1023の値が返ってきます。以下のプログラムはこれを利用し、ボリュームの値に

応じてLEDの点滅時間が変化します。

AnalogInput.ino: ArduinoIDE [スケッチの例][03.Analog][AnalogInput]

int led=13; // 変数ledに13を代入する void setup(){ pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // 以下を繰り返す int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(val); // valの値だけ待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(val); // valの値だけ待つ }

5.2 アナログ値に応じてオンオフ

 以下のプログラムは、ボリュームのアナログ値(0~1023)が400未満の時にLEDを点灯します。

AutoLight.ino:

int led=13; // 変数ledに13を代入する void setup(){ pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // 以下を繰り返す int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する if(val<400) digitalWrite(led, HIGH); // valが400未満ならledピンをHIGH else digitalWrite(led, LOW); // そうでなければLOW }

5.3 アナログ値の数字表示

 以下のプログラムは、ボリュームのアナログ値(0~1023)に応じて、0~9の数字を表示させます。

AnalogDigital.ino

char LED[]={ // 配列LEDに値を入れる 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67 }; void setup(){ DDRD=0x7f; // PD0~PD6を出力にする } void loop(){ int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入 val=val/103; // valの値を103で割る(0~9の値になる) PORTD=LED[val]; // val(0~9)に応じたPD0~PD6をPORTDに出力 }

(練習) ボリュームのアナログ値(0~1023)に応じて、LEDの明るさを変えなさい。

12

Page 13: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

6. 感じるものを作る

 感じるもの、それが「センサ」です。

6.1 センサとしてのスイッチ

 押しボタンスイッチやスライドスイッチは、操作用のスイッチですが、センサとしてもたくさん活躍しています。例えば、CD/DVDデッキや

コピー機やプリンタなど動きを伴う機器には、所定の位置に来たがどうかを検知するために、マイクロスイッチが必ずといっていいほど使

われています。このような使われ方をするスイッチを「リミットスイッチ」と呼ぶこともあります。

9.6のモーターカーでは車の先端にマイクロスイッチを使いました。ふたつの金属片を接触させるだけでスイッチ(センサ)となるので、オ

リジナルのスイッチを作ることも難しくはありません。所定の水位になったかどうかを検知するピンポン球を使った浮力スイッチ、傾けると

金属ボールが移動する傾斜スイッチなど、用途に応じて工夫するのも楽しいでしょう。

6.2 明るさセンサ(CDS)

5.1のボリュームの代わりに明るさセンサ(CDS)をつないでみましょう。明るくなるほどCDSの抵抗値が低くなり、A0ピンの電圧は高くなり

ます。一定以下に暗くなるとLEDが点灯します。プログラムは5.1と同様です。ただし、7行目の「400」の値は適切な値に変更する必要が

あります。

AutoLight.ino:

int led=13; // 変数ledに13を代入する void setup(){ pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // 以下を繰り返す int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する if(val<400) digitalWrite(led, HIGH); // valが400未満ならledピンをHIGH else digitalWrite(led, LOW); // そうでなければLOW }

 境界値付近ではledが点灯したり消灯したり不安定になるので、これを避けるためには、以下のように「ヒステリシス特性」を持たせま

す。8行目はledが消灯(ledStateがOFF)している時に400以下の明るさになったらledを点灯(ledStateをON)し、9行目はledが点灯

(ledStateがON)している時に500以上の明るさになったらledを消灯(ledStateをOFF)します。

Hysteresis.ino:

int led=13; // 変数ledに13を代入する int ledState=LOW; // 変数ledStateにLOWを代入する void setup(){ pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // 以下を繰り返す int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する if(ledState==LOW && val<400) ledState=HIGH; else if(ledState==HIGH && val>=500) ledState=LOW; if(ledState==LOW) digitalWrite(led, LOW); // ledStateがLOWならledピンをLOW else digitalWrite(led, HIGH);// そうでなければHIGH }

(練習) 8行目の400と9行目の500の値を変えて、適切な値をみつけなさい。

13

Page 14: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

6.3 温度センサ(サーミスタ)

 CDSの代わりに温度センサ(サーミスタ)をつないでみましょう。温度が高くなるほどサーミスタの抵抗値が低くなり、A0ピンの電圧は高く

なります。温度がある値以上になるとLEDが点灯します。プログラムは上と同様です。ただし、7行目の「400」の値は適切な値に変更する

必要があります。

AutoLight.ino:

int led=13; // 変数ledに13を代入する void setup(){ pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // 以下を繰り返す int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する if(val<400) digitalWrite(led, HIGH); // valが400未満ならledピンをHIGH else digitalWrite(led, LOW); // そうでなければLOW }

(練習) ヒステリシス特性を持たせた Hysteresis.ino でその動作を確かめなさい。また、400と500の値を変えて、適切な値をみつけなさ

い。

6.4 明るさの計測(数字表示)

 以下のプログラムは、明るさを0~9の数字で表示させます。プログラムは上と同様です。

AnalogDigital.ino

char LED[]={ // 配列LEDに値を入れる 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67 }; void setup(){ DDRD=0x7f; // PD0~PD6を出力にする } void loop(){ int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入 val=val/103; // valの値を103で割る(0~9の値になる) PORTD=LED[val]; // val(0~9)に応じたPD0~PD6をPORTDに出力 }

14

Page 15: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

6.5 温度の計測(数字表示)

 以下のプログラムは、温度を0~9の数字で表示させます。プログラムは上と同様です。ただし、A0ピンの電圧は温度が変化してもあま

り大きく変化しません。このような場合は、9行目を例えば以下のように変更します。220~280の値valが0~9に変換されます。

val=val/30;  ↓ val=map(val, 220,280, 0,9);

AnalogDigital.ino

char LED[]={ // 配列LEDに値を入れる 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67 }; void setup(){ DDRD=0x7f; // PD0~PD6を出力にする } void loop(){ int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入 val=val/30; // 0~9の値になるようにvalの値を30で割る PORTD=LED[val]; // val(0~9)に応じたPD0~PD6をPORTDに出力 }

6.6 音センサ

 以下のプログラムは、音を検知したらLEDを3秒点灯するもので、2.5と同様です。ここでは、コンデンサマイク(ECM)を音センサとして

使っています。

 ECMからD2に与えられる信号は下の波形のように、通常は1.5Vよりも少し高い電圧になっていて、「HIGH」の入力とみなされます。マ

イクが音を感じるとその電圧を中心に波形が現れます(下図)。この値が1.5V(電源電圧の2分の1)よりも低くなると「LOW」の入力とみなさ

れます(スイッチオンに相当)。感度はコンデンサマイクに依存し、図の波形は手を叩いた時のものです。音声で敏感に動作させるには

増幅回路が必要となります。また、コンデンサマイクに接続されている8.2kΩの抵抗値はマイクによっては変える必要があります。

3sec.ino:

int button=2; // 変数buttonに2を代入する int led=13; // 変数ledに13を代入する void setup(){ pinMode(button, INPUT_PULLUP);// buttonピンをプルアップ入力にする pinMode(led, OUTPUT); // ledピンを出力にする } void loop(){ if(digitalRead(button)==LOW){ // buttonピンがLOWならば digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(3000); // 3秒待つ }else{ // そうでなければ digitalWrite(led, LOW); // ledピンにLOWを出力する } }

(練習) 4.2のスイッチの代わりに音センサを接続し、手をたたくとカウントアップするようにしなさい(プログラムはButtonCountup.ino)。

15

Page 16: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

7. 音の出るものを作る

 ここではブザー音で電子オルゴールを作ってみましょう。仕組みに興味のある方は「電子オルゴールの仕組み」[7]、和音など音にこだ

わる方は「私だけの電子オルゴール」[8]を参考にしてください。

7.1 音を出す

 Blink.inoで、LEDと同じ箇所に圧電ブザー(Bzz)を接続し、「1秒ごとにLEDを点滅させるプログラム」Blink.inoを実行してください。する

とブザーからカチカチと音が聞こえます。ここで、点灯時間と消灯時間を以下のように変えてみましょう。変更箇所は7行目と9行目です。

Blink.ino: ArduinoIDE [スケッチの例][01.Basics][Blink] (7行目と9行目を1000→1に変更)

int led=13; // 変数ledに13を代入する void setup(){ // { }内をはじめに1度だけ実行する pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // { }内を繰り返し実行する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(1); // 1ms待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(1); // 1ms待つ }

 この時の波形は下図のように500Hzの矩形波となり、聞こえるのは500Hzの音です(といっても倍音成分が含まれていますが)。

(練習) オシロスコープでトーン信号の波形を観測しなさい。また、WaveGeneなどの信号発生ソフトを用い、パソコンで500Hzの矩形波を

出し、音を比べてみなさい。マイコンの内蔵クロックはそれほど正確ではありませんので多少の音程の違いがあるかもしれません。

7.2 音程を変える

 Arduinoでは、指定した周波数の音を、指定した時間、出力するtone()という関数が利用できます。以下は時報の音を出すプログラム

です。

Tone.ino:

int bzz=13; // 変数bzzに13を代入する void setup(){ tone(bzz, 784, 200); // bzzピンに784Hzの音を200ms出力する(ポッ) delay(600); // 600ms待つ tone(bzz, 784, 200); // bzzピンに784Hzの音を200ms出力する(ポッ) delay(600); // 600ms待つ tone(bzz, 784, 200); // bzzピンに784Hzの音を200ms出力する(ポッ) delay(600); // 600ms待つ tone(bzz, 1046, 1200); // bzzピンに1046Hzの音を1200ms出力する(ポーン) delay(1200); // 1200ms待つ noTone(bzz); // toneを終了 } void loop(){ }

16

Page 17: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

7.3 楽譜を演奏する

 以下のプログラムは、配列として記述した楽譜情報を参照しながら演奏します。NOTE_C4などの周波数値はpitches.hファイルで定義

されています。

toneMelody.ino: ArduinoIDE [スケッチの例][02.Digital][toneMelody] (bzzPin 8→13に変更)

#include "pitches.h" // pitches.hファイルを読み込む int bzz=13; // 変数bzzに13を代入する int melody[]={ // 楽譜データ(音階) NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4 }; int noteDurations[]={ 4,8,8,4,4,4,4,4 }; // 楽譜データ(音符) void setup(){ for(int thisNote=0; thisNote<8; thisNote++){ int noteDuration = 1000/noteDurations[thisNote]; tone(bzz, melody[thisNote],noteDuration); int pauseBetweenNotes = noteDuration*1.30; delay(pauseBetweenNotes); noTone(bzz); // toneを終了 } } void loop(){ }

 楽譜はさまざまな表現方法が考えられます。以下は、少し長い曲を演奏するプログラムです。

playNote.ino:

const PROGMEM int16_t notes[]={ // 楽譜データ #define C 262 #define D 294 #define E 330 #define F 349 #define G 392 #define A 440 #define B 494 #define c 523 #define d 587 #define e 659 #define f 698 #define g 784 #define R 1 // Rest R,D,D,B,A,G,D,R, R,D,D,B,A,G,E,R, R,E,E,c,B,A,F,R, R,d,d,d,c,A,B,R, R,D,D,B,A,G,D,R, R,D,D,B,A,G,E,R, R,E,E,c,B,A,d,d, d,d,e,d,c,A,G,R, d,R, B,B,B,R, B,B,B,R, B,d,G,A,B,R,R,R, c,c,c,c,c,B,B,B, B,A,A,B,A,R, d,R, B,B,B,R, B,B,B,R, B,d,G,A,B,R,R,R, c,c,c,c,c,B,B,B, d,d,c,A,G,R, g,R,0 }; int Tempo=300; // 変数Tempoに300を代入する int bzz=13; // 変数bzzに13を代入する void setup(){ pinMode(bzz, OUTPUT); // bzzピンを出力にする } void loop(){ // 以下を繰り返す for(int i=0;;i++){ // 楽譜データを順に int note=pgm_read_word(&notes[i]); // 変数noteにひとつ読み if(note==0) break; // noteが0なら1曲演奏終了 else if(note!=R) tone(bzz, note, Tempo); // noteがR(休符)でもなければ // bzzピンにnote[Hz]の周波数の音をTempo[ms]出力する delay(Tempo*1.1); // Tempoだけ待つ } delay(Tempo*8); // しばらくしてから演奏を繰り返す }

(練習) 音階を拡張し、好きな曲の電子オルゴールを作りなさい。

17

Page 18: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

7.4 楽器を作る

 以下のプログラムは、ボタンを押すと、ボリュームで決まる音程で、ドレミ...の音を出します。0~1023のアナログ値をmap関数を使って0

~11の値に変換し、notes[ ]配列の周波数を参照しています。

Instrument.ino:

int bzz=13; // 変数bzzに13を代入する int button=2; // 変数buttonに2を代入する // ド レ ミ ファ ソ ラ シ ド レ ミ ファ ソ int notes[]={262, 294, 330, 349, 392, 440, 494, 523, 587, 659, 698, 784}; void setup(){ pinMode(bzz,OUTPUT); // bzzピンを出力にする pinMode(button, INPUT_PULLUP); // buttonピンをプルアップ入力にする } void loop(){ // 以下を繰り返す if(digitalRead(button)==LOW){ // buttonがLOWなら int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する val=map(val, 0,1023, 0,11); // valを0~11の値に変換する int note=notes[val]; // noteにvalに対応する周波数を代入する tone(bzz,note,200); // noteを200ms delay(200); // 200ms待つ } }

(練習) ボリュームの代わりに明るさセンサで音程が変わるようにしなさい。また、必要ならば音階を拡張しなさい。

7.5 しゃべるものを作る

 音声合成LSI(ATP3011F4)を使ってスピーカから合成音声を出します。

Talk.ino:

void setup(){ Serial.begin(9600); // 9600bpsで通信を開始 while(1){ Serial.write('?'); // '?'を送信する delay(300); // 300ms待つ if(Serial.available()>0&&Serial.read()=='>')break; } // '>'がきたらwhile終了 } void loop(){ // 以下を繰り返す Serial.println("ju'nbi/o'-kei");//「準備OK!」 delay(2000); // 2秒待つ }

(練習) 10行目を変えて、違う言葉をしゃべらせてみなさい。

7.6 音で遊ぶ

 音センサと楽譜の演奏を組み合わせ、「合いの手」楽器を作ってみます。

MicTone.ino:

#define SOuL 207 #define RAL 220 #define RAuL 233 #define SIL 247 #define DO 262 #define DOu 277 #define RE 294 #define REu 311 #define MI 330 #define FA 349 #define FAu 370 #define SO 392 #define SOu 415 #define RA 440 #define RAu 466 #define SI 494 #define DOH 523 #define DOuH 554 #define REH 587 #define REuH 622 #define MIH 659 #define FAH 698 #define FAuH 740 #define SOH 784 #define R 0 // Rest #define Tempo 100 #define L1 32*Tempo #define L2_ 24*Tempo

18

Page 19: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

#define L2 16*Tempo #define L4_ 12*Tempo #define L4 8*Tempo #define L8_ 6*Tempo #define L8 4*Tempo #define L16 2*Tempo #define L32 1*Tempo int mic=2; int bzz=13; int b(int note, int tempo){ if(note>0){ tone(bzz, note, tempo); delay(tempo*1.1); return 0; }else{ unsigned long lastmillis=millis(); int s=0; while(millis()<lastmillis+tempo) if(digitalRead(mic)==LOW) s=1; return s; } } void setup(){ pinMode(mic, INPUT_PULLUP); pinMode(bzz, OUTPUT); } void loop(){ for(;;){ b(R,1000); // 1秒待つ while(digitalRead(mic)==HIGH); // チョ(音を待つ) b(R,L8); if(!b(R,L4)) continue; // チョイ if(b(R,L8)) continue; // の if(!b(R,L4)) continue; // チョイ if(b(R,L8)) continue; b(SIL,L16);b(RAL,L16);b(SOuL,L16);b(RAL,L32);// シラソ#ラ if(!b(R,L4)) continue; // チョン(ド) b(0,L32); b(RE,L16);b(DO,L16);b(SIL,L16);b(DO,L32); // レドシド if(!b(R,L4)) continue; // チョン(ミ) b(0,L32); b(FA,L16);b(MI,L16);b(REu,L16);b(MI,L16); // ファミレ#ミ b(SI,L16);b(RA,L16);b(SOu,L16);b(RA,L16); // シラソ#ラ b(SI,L16);b(RA,L16);b(SOu,L16);b(RA,L32); // シラソ#ラ if(!b(R,L4)) continue; // チョン(ド) b(0,L32); b(RA,L8);b(DOH,L8); // ラド b(SI,L8);b(RA,L8);b(SO,L8);b(RA,L8); // シラソラ b(SI,L8);b(RA,L8);b(SO,L8);b(RA,L8); // シラソラ b(SI,L8);b(RA,L8);b(SO,L8);b(FAu,L16); // シラソファ# if(!b(R,L4)) continue; // チョン(ミ) b(DO,L16);b(MI,L16);b(SO,L16); b(SO,L16);b(R,L16);b(MI,L16);b(SO,L4); } }

(練習) 違うメロディーやリズムにしてみなさい。

19

Page 20: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

8. 動くものを作る

 これまでの例では、マイコンの出力ピンにLEDや圧電ブザーを接続しました。AVRマイコンは 大20mAの電流を流すことができるの

で、この範囲であれば直接接続できます。この章では、モータなど大きな電流が流れる素子を駆動する例を紹介します。大きな電流が

流れる回路を制御する場合は、「電流が流れる経路」を意識することが回路の誤動作を防ぐことにつながります。

8.1 リレーの駆動

 さまざまな機器をオンオフ制御したい場合は、「リレー」が も汎用性に富んでいます。ただし、ここでは交流100Vの機器ではなく、電

池で動作する機器のみを考えます。おもちゃやラジオなど、制御対象の電圧や電流や極性などを気にせずに接続することができます。

その際、「BDアダプタ」と組み合わせると、簡単に接続できるかもしれません(BDアダプタは製作も容易です)。

 下図に2種類のリレーSS1A05(5V 10mA 接点容量0.5A), Y14H-1C-3DS(3V 50mA 接点容量1A)を使った回路例を示します。マイコン

に逆電圧がかからないよう、リレーに並列にダイオードを入れます。

Blink.ino: ArduinoIDE [スケッチの例][01.Basics][Blink] (7行目と9行目を1000→1に変更)

int led=13; // 変数ledに13を代入する void setup(){ // { }内をはじめに1度だけ実行する pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // { }内を繰り返し実行する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(1); // 1ms待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(1); // 1ms待つ }

(練習) 上の回路を組み立て、電池で動くオモチャをつないで、Blink.inoの動作を確かめなさい。また、2.2を参考に、スイッチを押すと

交互に動作・停止するようにしてみなさい。

20

Page 21: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

8.2 DCモータの駆動

 DCモータ(小型の直流モータ)は大きな電流が流れるので、マイコンに直接接続することはできず、トランジスタやFETを使って駆動し

ます。「ミニドラムマシン」では、バチを動かすのにDCモータを使い、2SC2120で駆動しました。赤外線リモコン自動車ではDCモータを

2SK3142で駆動しました。

 モータのオンオフだけでなく、正転逆転させたい場合は、Hブリッジ回路の専用IC(例えばTA7291P)を使います。ザリガニロボットや自

律走行台車ではTA7257Pを使いました。IC内部での電圧降下が少なくないので注意が必要です。

Blink.ino: ArduinoIDE [スケッチの例][01.Basics][Blink] (7行目と9行目を1000→1に変更)

int led=13; // 変数ledに13を代入する void setup(){ // { }内をはじめに1度だけ実行する pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // { }内を繰り返し実行する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(1); // 1ms待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(1); // 1ms待つ }

 回転数を制御したい場合は、PWMを組み合わせます。ただし、アナログ出力できるピンは限られているため(付録1)、接続するピンを

13→9 に変更しています。

Fade.ino: ArduinoIDE [スケッチの例][01.Basics][Fade]

int led=9; // 変数ledに9を代入する int brightness=5; // 変数brightnessに5を代入する int fadeAmount=5; // 変数fadeAmountに5を代入する void setup(){ } void loop(){ // 以下を繰り返す analogWrite(led, brightness);// ledピンにbrightnessの値をアナログ出力する brightness=brightness+fadeAmount;// brightnessの値にfadeAmountの値を足す if(brightness==0 || brightness==255)//brightnessの値が0または255だったら fadeAmount=-fadeAmount; // fadeAmountの符号を逆にする delay(30); // 30ms待つ }

8.3 振動モータの駆動

Midiコントローラ「ジングルベル」では、振動モータFM34F(100mA以下)を使い、「鈴」を鳴らました。2SC2120( 大800mA)や2SC735な

ど、少し多目に電流を流せるトランジスタを使っています。

Blink.ino: ArduinoIDE [スケッチの例][01.Basics][Blink] (7行目と9行目を1000→1に変更)

int led=13; // 変数ledに13を代入する void setup(){ // { }内をはじめに1度だけ実行する pinMode(led, OUTPUT); // ledピン(13ピン)を出力にする } void loop(){ // { }内を繰り返し実行する digitalWrite(led, HIGH); // ledピンにHIGHを出力する delay(1); // 1ms待つ digitalWrite(led, LOW); // ledピンにLOWを出力する delay(1); // 1ms待つ }

21

Page 22: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

8.4 サーボモータの駆動

 サーボモータは5Vで動作しますが、4.5Vでも支障なく動作しますので、ここではそのようにします。

Sweep.ino: ArduinoIDE [スケッチの例][Servo][Sweep.ino]

#include <Servo.h> // Servo.hを読み込む Servo myservo; int pos=0; // 変数posに0を代入する(角度) void setup(){ myservo.attach(9); // 9ピンをサーボモータに接続する } void loop(){ // 以下を繰り返す for(pos=0; pos<180; pos+=1){ // posを0~179まで1度ずつ変える myservo.write(pos); // サーボモータをposの位置にする delay(15); // 少し待つ } for(pos=180; pos>=1; pos-=1){// posを180~1まで1度ずつ変える myservo.write(pos); // サーボモータをposの位置にする delay(15); // 少し待つ } }

Knob.ino ArduinoIDE [スケッチの例][Servo][Knob.ino]

#include <Servo.h> // Servo.hを読み込む Servo myservo; void setup(){ myservo.attach(9); // 9ピンにサーボモータを接続する } void loop(){ // 以下を繰り返す int val=analogRead(A0); // valにA0ピンのアナログ値(0~1023)を代入する val=val*179/1023; // valの値を0~179にする myservo.write(val); // サーボモータをvalの位置にする delay(15); // 少し待つ }

(練習) ボリュームの代わりに明るさセンサを使い、明るさで位置が変わるようにしなさい。

8.5 高輝度LEDの駆動

 それほど大電流ではなく、しかし駆動する素子がたくさんある場合は専用のドライバICを使うと便利です。「交通安全教室用信号機」で

は、高輝度LED(12V 60mA)を駆動するために、専用のドライバIC TD62083( 大500mA)を使っています。

22

Page 23: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

9. 応用例

9.1 赤外線リモコン

 テレビなどのリモコンは、ボタンを押すと赤外線LEDが「決められたタイミングで点滅」するように作られています。どのように点滅してい

るかは、リモコン受光器に向けてリモコンのボタンを押し、受光器の信号をオシロスコープで観測するとわかります。

 実際に観測してみると、各社テレビのリモコン信号は以下のようになっています。図の着色した部分が信号が「オン」の箇所で、「オン」

とは「赤外線LEDを13μs点灯し、13μs消灯し、これを一定時間繰り返す」ことです。また、「オフ」とは「一定時間消灯する」ことです。こ

れを参考に、赤外線LEDを点滅させるプログラムを作ればよいわけです。

電源 ON/OFF 40 bf 12 edチャンネルUP 40 bf 1b e4チャンネルDOWN40 bf 1f e0ボリュームUP 40 bf 1a e5ボリュームDOWN 40 bf 1e e1

東芝製テレビのリモコン信号

電源 ON/OFF 02 20 80 00 3d bdチャンネルUP 02 20 80 00 34 b4チャンネルDOWN02 20 80 00 35 b5ボリュームUP 02 20 80 00 20 a0ボリュームDOWN 02 20 80 00 21 a1

パナソニック製テレビのリモコン信号

電源 ON/OFF 8f 12 16 d1チャンネルUP 8f 12 11 a1チャンネルDOWN8f 12 12 91ボリュームUP 8f 12 14 f1ボリュームDOWN 8f 12 15 e1

シャープ製テレビのリモコン信号

電源 ON/OFF 95 0チャンネルUP 90 0チャンネルDOWN91 0ボリュームUP 92 0ボリュームDOWN 93 0

SONY製テレビのリモコン信号

23

Page 24: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

 以下の回路とプログラムは、Upボタンを押すと各社リモコンの「チャンネルアップ」信号が次々出力され、Downボタンを押すと各社リモ

コンの「チャンネルダウン」信号が次々出力されます。実際には各社の信号を出す必要はありません。

Remocon.ino:

int led=13, UpButton=1, DownButton=5; void f38kHz(int n){ // 26μs × n周期 volatile char i; int j; for(j=0;j<n;j++){ digitalWrite(led, HIGH); i=0;i++; // 13μs点灯 digitalWrite(led, LOW); i=0; // 13μs消灯 } } void tx1(){f38kHz(300/26); delayMicroseconds(1800);}// 「1」の赤外線信号 void tx0(){f38kHz(300/26); delayMicroseconds(700);} // 「0」の赤外線信号 void sx1(){delayMicroseconds(600);f38kHz(1200/26); }// 「1」の赤外線信号(SONY) void sx0(){delayMicroseconds(600);f38kHz(600/26); } // 「0」の赤外線信号(SONY) void txbyte(uint8_t data){ // 1バイトのdataの赤外線信号 if(data&0x01) tx1(); else tx0(); // ビット0 if(data&0x02) tx1(); else tx0(); // ビット1 if(data&0x04) tx1(); else tx0(); // ビット2 if(data&0x08) tx1(); else tx0(); // ビット3 if(data&0x10) tx1(); else tx0(); // ビット4 if(data&0x20) tx1(); else tx0(); // ビット5 if(data&0x40) tx1(); else tx0(); // ビット6 if(data&0x80) tx1(); else tx0(); // ビット7 } void sxbyte(uint8_t data){ // 1バイトのdataの赤外線信号(SONY) if(data&0x01) sx1(); else sx0(); // ビット0 if(data&0x02) sx1(); else sx0(); // ビット1 if(data&0x04) sx1(); else sx0(); // ビット2 if(data&0x08) sx1(); else sx0(); // ビット3 if(data&0x10) sx1(); else sx0(); // ビット4 if(data&0x20) sx1(); else sx0(); // ビット5 if(data&0x40) sx1(); else sx0(); // ビット6 if(data&0x80) sx1(); else sx0(); // ビット7 }

void setup(){ pinMode(led, OUTPUT); pinMode(UpButton, INPUT_PULLUP); pinMode(DownButton, INPUT_PULLUP);

} void loop(){ if(digitalRead(UpButton)==LOW){ // UpButtonが押されると f38kHz(9000/26); delayMicroseconds(4500); // 東芝TVチャネルUP txbyte(0x40); txbyte(0xbf); txbyte(0x1b); txbyte(0xe4); tx0(); delay(100); // ******************************* 少し時間をおいて f38kHz(3600/26); delayMicroseconds(1600); // パナソニックTVチャネルUP txbyte(0x02); txbyte(0x20); txbyte(0x80); txbyte(0x00); txbyte(0x34); txbyte(0xb4); tx0(); delay(100); // ******************************* 少し時間をおいて f38kHz(3600/26); delayMicroseconds(1600); // パナソニックBDチャネルUP txbyte(0x02); txbyte(0x20); txbyte(0xb0); txbyte(0x00); txbyte(0x34); txbyte(0x84); tx0(); delay(100); // ******************************* 少し時間をおいて txbyte(0x8f); txbyte(0x12); delay(42); // シャープTVチャネルUP txbyte(0x11); txbyte(0xa1); tx0(); delay(100); // ******************************* 少し時間をおいて f38kHz(2500/26); sxbyte(0x90); sx0();sx0();sx0();sx0(); delay(27);//SONY TVチャネルUP f38kHz(2500/26); sxbyte(0x90); sx0();sx0();sx0();sx0(); delay(27); f38kHz(2500/26); sxbyte(0x90); sx0();sx0();sx0();sx0(); delay(1000); }else if(digitalRead(DownButton)==LOW){ // DownButtonが押されると f38kHz(9000/26); delayMicroseconds(4500); // 東芝TVチャネルDOWN txbyte(0x40); txbyte(0xbf); txbyte(0x1f); txbyte(0xe0); tx0(); delay(100); // ******************************* 少し時間をおいて f38kHz(3600/26); delayMicroseconds(1600); // パナソニックTVチャネルDOWN txbyte(0x02); txbyte(0x20); txbyte(0x80); txbyte(0x00); txbyte(0x35); txbyte(0xb5); tx0(); delay(100); // ******************************* 少し時間をおいて f38kHz(3600/26); delayMicroseconds(1600); // パナソニックBDチャネルDOWN txbyte(0x02); txbyte(0x20); txbyte(0xb0); txbyte(0x00); txbyte(0x35); txbyte(0x85); tx0(); delay(100); // ******************************* 少し時間をおいて txbyte(0x8f); txbyte(0x12); delay(42); // シャープTVチャネルDOWN txbyte(0x12); txbyte(0x91); tx0(); delay(100); // ******************************* 少し時間をおいて f38kHz(2500/26); sxbyte(0x91); sx0();sx0();sx0();sx0();delay(27);//SONY TVチャネルDOWN f38kHz(2500/26); sxbyte(0x91); sx0();sx0();sx0();sx0();delay(27); f38kHz(2500/26); sxbyte(0x91); sx0();sx0();sx0();sx0(); delay(1000); } }

24

Page 25: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

9.2 押しボタン信号機

 押しボタン信号機の制御プログラムです。

Signal.ino:

int buttonPin=2; int RPin=16, YPin=15, GPin=14, RRPin=10, GGPin=9, buttonMemo; void carsig(int r, int y, int g){ digitalWrite(RPin,r); digitalWrite(YPin,y); digitalWrite(GPin,g); } void mansig(int r,int g){digitalWrite(RRPin,r); digitalWrite(GGPin,g);} void setup(){ pinMode(RPin, OUTPUT); pinMode(YPin, OUTPUT); pinMode(GPin, OUTPUT); pinMode(RRPin,OUTPUT); pinMode(GGPin,OUTPUT); pinMode(buttonPin,INPUT_PULLUP); carsig(LOW,LOW,HIGH); mansig(HIGH,LOW); // 車青・歩赤 } void loop(){ int button=digitalRead(buttonPin); if(button!=buttonMemo && button==LOW){ delay(4000); carsig(LOW,HIGH,LOW); delay(4000); // 車黄4秒 carsig(HIGH,LOW,LOW); mansig(LOW,HIGH); // 車赤・歩青16秒 delay(16000); for(int i=0;i<8;i++){ // 歩青点滅8秒 mansig(LOW,HIGH); delay(500); mansig(LOW,LOW); delay(500); } mansig(HIGH,LOW); delay(4000); // 歩赤4秒 carsig(LOW,LOW,HIGH); // 車青 } buttonMemo=button; }

 以下は歩行者用の「カッコー」の音を付け加えた例です。

Signal.ino:

int bzz=11; // 変数bzzに11を代入する int button=2; // 変数buttonに2を代入する int RPin=16; // 変数RPinに16を代入する int YPin=15; // 変数YPinに15を代入する int GPin=14; // 変数GPinに14を代入する int RRPin=10; // 変数RRPinに10を代入する int GGPin=9; // 変数GGPinに9を代入する int lastState=0; // 直前のbuttonの状態 void carsig(int r, int y, int g){ // 関数定義 digitalWrite(RPin, r); // RPinピンにrを出力する digitalWrite(YPin, y); // YPinピンにyを出力する digitalWrite(GPin, g); // GPinピンにgを出力する } void mansig(int r, int g){ // 関数定義 digitalWrite(RRPin, r); // RRPinピンにrを出力する digitalWrite(GGPin, g); // GGPinピンにgを出力する } void setup(){ pinMode(bzz, OUTPUT); pinMode(RPin, OUTPUT); pinMode(YPin, OUTPUT); pinMode(GPin, OUTPUT); pinMode(RRPin,OUTPUT); pinMode(GGPin,OUTPUT); pinMode(button,INPUT_PULLUP); carsig(LOW, LOW, HIGH); mansig(HIGH,LOW); // 車青・歩赤 } void loop(){ int i, Tempo=200, button=digitalRead(buttonPin), e=659, c=523; if(button!=buttonMemo && button==LOW){ delay(4000); carsig(LOW,HIGH,LOW); delay(4000); // 車黄4秒 carsig(HIGH,LOW,LOW); mansig(LOW,HIGH); // 車赤・歩青 for(i=0;i<5;i++){ // カッコー16秒 tone(bzzPin, e, Tempo/2); delay(Tempo*2.5); tone(bzzPin, c, Tempo); delay(Tempo*5.5); tone(bzzPin, e, Tempo/2); delay(Tempo); tone(bzzPin, e, Tempo/2); delay(Tempo); tone(bzzPin, c, Tempo); delay(Tempo*6); } for(i=0;i<8;i++){ // 歩青点滅8秒 mansig(LOW,HIGH); delay(500); mansig(LOW,LOW); delay(500); } mansig(HIGH,LOW); delay(4000); // 歩赤4秒

25

Page 26: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

carsig(LOW,LOW,HIGH); // 車青 } buttonMemo=button; }

 また、以下はこれを発展させた本格的な「交通安全教室用信号機」です。高輝度LED(12V 60mA)を駆動するために、専用のドライバ

IC TD62083( 大500mA)を使っています。

(参考資料)

[1] ATmega328P データシート

[2] Arduino, http://www.arduino.cc

[3] AVRマイコンで学ぶコンピュータの仕組み, http://siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/avrtext.htm

[4] ブレッドボードの使い方, http://siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/bb.htm

[5] AVRライター, http://siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/avrwriter.htm

[6] グラフで考える直流回路, http://siva.cc.hirosaki-u.ac.jp/usr/koyama/lecture/it/elec.htm

[7] 電子オルゴールの仕組み, http://siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/hoso3.htm

[8] 私だけの電子オルゴール, http://siva.cc.hirosaki-u.ac.jp/usr/koyama/mymelo/

26

Page 27: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

(付録1) Arduinoのプログラム(スケッチ)の仕様の抜粋(ATmega328P版)

(1) 使用できるピン(ATmega328Pの場合)

種類 ピン番号

デジタル出力ピン0~21(ただし14~19はA0~A5と同一ピン)

デジタル入力ピン

アナログ出力ピン 3, 5, 6, 9, 10, 11

アナログ入力ピン A0~A5

(2) データの型

型 サイズ 値

charint8_t

1バイト -128~127

unsigned charuint8_tbyte

1バイト 0~255

intint16_t

2バイト -32768~32767

unsigned intuint16_t

2バイト 0~65535

longint32_t

4バイト -21474836480~2147483647

unsigned longuint32_t

4バイト 0~4294967295

float 4バイト 3.4028235E+38~-3.4028235E+38

(3) 組み込み定数

定数名 内容

HIGH, LOW デジタル出力するまたはデジタル入力されたピンの状態

OUTPUT, INPUT, INPUT_PULLUP pinMode()で設定するデジタルピンの入出力

A0~A5 アナログpin

DDRB, PORTB, PB0~PB7 ATmega328P固有のポートおよびビット指定

DDRD, PORTD, PD0~PD7 ATmega328P固有のポートおよびビット指定

(4) 組み込み関数

関数名 内容

pinMode(pin, OUTPUT) pinをOUTPUTにする(OUTPUT, INPUT, INPUT_PULLUP)

digitalRead(pin) pinの値を読んでHIGHまたはLOWの値を返す

digitalWrite(pin, HIGH) pinにHIGHを出力する(値はHIGHまたはLOW)

analogRead(A0) A0ピンのアナログ値を読み、0~1023の値を返す

analogWrite(pin, value) pin(7,11,12,13のいずれか)にvalue(0~255)を出力する

map(val, fromL,fromH, toL,toH) fromL~fromHの値val(整数)をtoL~toHの値に変換する

delay(t) t[ms]待つ

delayMicroseconds(t) t[μs]待つ

tone(pin, freq, t) pinにfreq[Hz]の矩形波信号をt[ms]出力する

noTone() tone()を終了する

Serial.begin(speed) speed[bps]でシリアル通信を開始する

Serial.available() 受信した文字数を返す

Serial.read() 受信した1文字を返す

Serial.write(c) cを送信する

Serial.print(s) 文字列sを送信する

Serial.println(s) 文字列sと改行を送信する

27

Page 28: ブレッドボードを使った Arduino流 ものづくり …siva.cc.hirosaki-u.ac.jp/usr/koyama/avr/arduino328.pdf2002.11.27- 2015.7.7 ブレッドボードを使ったArduino流

(付録2) 使用する主な部品

部品表

名称 概観 備考

ブレッドボード EIC-301 秋月 190円

ブレッドボード ジャンパーワイヤ 15cm 秋月 10本 300円

ブレッドボード ジャンパーワイヤ EIC-J-S 秋月 250円

LED 秋月 10個 120円

赤外線LED 秋月 10個 100円

数字表示LED C-551SR 秋月 40円

圧電スピーカー 秋月 2個 100円

コンデンサマイク 秋月 4個 100円

プッシュスイッチ DS-660R-C 千石 84円

抵抗 1/4W 100Ω, 220Ω, 1kΩ, 10kΩ 秋月 100本 100円

CDS(光センサ) 秋月 30円

サーミスタ(温度センサ) 秋月 50円

AVRマイコン(ATmega328P) 秋月 250円

電池ケース(単3×2本 スイッチ付) 秋月 60円

サーボモーター GWS-PICO 秋月 800円

振動モーター 秋月 2個 100円

2SC2120 秋月 20個 200円

リレー SS1A05 秋月 5個 280円

リレー Y14H-1C-3DS 秋月 80円

ベニア板(4.5cm×15cm)ブレッドボード電池ケースを貼り付けます。

[email protected]

28