1 開発ツールのインストール
最初に,現在,Arduinoは内部分裂しており,アメリカのArduino LLC(ウェブサイトは http://www.arduino.cc/)と,イタリアのArduino SRL(ウェブサイトは http://www.arduino.org/)の二社がある.
詳細はこちら: http://mag.switch-science.com/2015/04/07/arduino-v-arduino/
日本では,Arduino SRLがArduinoの商標を登録しているので,Arduino SRLの商品しか販売できない.よって手元のArduino UnoにもURLとしてarduino.orgが載っている.
さしあたっては,http://arduino.org/downloads からarduino-1.7.3.org-windows.exeをダウンロードする(Fig. 1).
インストールする前に,コントロールパネル > プログラムと機能 を確認し,古いArduinoの開発環境がインストールされている場合は,アンインストールしておくこと.
ダウンロードしたarduino-1.7.3.org-windows.exeを実行する.引き続いて,デバイスドライバのインストール ウィザードが実行されるので,こちらも進める.更に,Atmel USB Driver Package Setupも実行されるので,これも進める.特に難しいところは無い.
なおリファレンスマニュアルやサンプルなどは,arduino.ccにしか無い模様.http://www.arduino.cc/en/Reference/HomePage を参照.
2 Arduinoの接続
Arduino UnoをUSBポートに接続する.USBは電源の供給とPCとの通信に使用される.
ボード上のLED(ON)が緑に常時点灯する.
また電源を入れるとArduinoに書き込まれているプログラムが実行される.
開封直後のArduinoの場合,LED(L)が橙に点滅するはず.
ポートの確認
[発展]シリアルポートのプロパティ
右クリック > プロパティを見てみよう.ポートの設定 のタブに,
- ビット/秒
- データビット
- パリティ
- ストップビット
- フロー制御
とある.これらはシリアルポート通信の一般的な設定項目である.詳細は割愛するので各自調べてもらいたい.通信がうまくいかない場合にまずチェックするべき箇所である.
3 出力: LEDを光らせる
まず開発ツールを立ち上げる.Win+Qでarduinoを検索する.Windowsではよく使うツールをタスクバーにピン留めしておくと便利.
ソースコードを入力する.
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
setup()は起動時に一度だけ実行される関数で,初期化の処理を記述する.loop()は繰り返し実行される関数で,メインの処理を記述する.自動的に繰り返し実行されるので,中でfor(;;)やwhile(1)といった無限ループを組む必要はないし,組んではいけない.13はピン番号,1000は待ち時間(単位:msec).
メニューの ツール > ボード で Arduino Uno を選択する.
同じく ツール > ポート で,先程確認したCOMポートを選択する.
上に並んでいるボタンの,一番左端のボタン(チェックマーク)でプログラムに文法的誤りがないか検証し,右隣のボタン(右向き矢印)で書き込みを行う.
フォントサイズを変える
デフォルト状態でのフォントサイズが小さくて見辛い場合は,ファイル > 環境設定 で変更することができる.設定したら再起動すること.再起動しないとカーソル位置がずれる.
やってみよう
LED点滅する速さやパターンを変えてみよう.
4 わかりやすいプログラムへの書き換え
LEDピン番号,点滅速度(msec)を変数に定義すると,見通しがよくなる.
const int led_pin = 13; const int period_on = 1000; const int period_off = 1000; void setup() { pinMode(led_pin, OUTPUT); } void loop() { digitalWrite(led_pin, HIGH); delay(period_on); digitalWrite(led_pin, LOW); delay(period_off); }
constは定数であることを示す接頭語である.
一見,タイプ量が増えるが,よいことがある.
- 出力ピンの番号が変わっても,1箇所変更するだけで済む.
- 数字は見ても意味がわからないが,変数だと名前から意味がわかる.
- constを付けることで,これが変更できない値であることがわかる.
- ソースコード内で定義する場所が固まっているので,修正時にソースコードをあちこち眺める必要がない.
5 出力: 外付けLEDを点滅させる
ブレッドボードに回路を組んでみる.ブレッドボードは,裏側で穴同士が接続されている.裏側にはFig. 3に示す各線で示す配線がなされている.
まず赤色LEDを点灯させる.一般的には,LEDには適正な印加電圧が決まっている.正確な性能はLEDのスペックシートを見る必要があるが,大概,赤や緑は2Vと思っていてよい.
一方,Arduinoの出力ピンには,5Vの電圧が出力されている.したがって,LEDを直結すると,必要以上の電圧がかかり,寿命が短くなり,場合によっては破損する.
よって,LEDにかかる電圧を下げないといけない.そのために,電流制限抵抗を,LEDと直列に接続する.
電流制限抵抗Rの定め方:
LEDに流す電流をI,LEDの適正電圧をV,電源電圧をVccとする.
Vcc = RI + V
より,
R = (Vcc – V)/I
となる.
ここでは,LEDに30mAの電流を流すとすると,
Vcc = 5, V = 2, I = 0.03 より,R = 100
よって,100[ohm]の抵抗を接続すればよい.
割愛するが,抵抗のカラーコードの読み方も知っておこう.抵抗値や精度がわかる.
また,抵抗には方向が無いが,LEDには方向(極性)がある.LEDは,足の長い方がアノード(A),短い方がカソード(K)である.
電流はアノードからカソードに流れる.つまり,アノードの方に電圧の高い側を接続する.
回路図はFig. 4になる.
この回路をブレッドボードを使って配線する.配線は色も考えて選ぶべきである.一般的に,赤が電源Vcc,黒がグランドGNDである.
const int led_pin = 2; const int period_on = 1000; const int period_off = 1000; void setup() { pinMode(led_pin, OUTPUT); } void loop() { digitalWrite(led_pin, HIGH); delay(period_on); digitalWrite(led_pin, LOW); delay(period_off); }
やってみよう1
パッケージに入っているもう一種類の抵抗,10k[ohm]を接続したら,どうなるか.
流れる電流を計算してみる.
RI = Vcc – V より,I = 3.0 / 10k = 0.3mA
やってみよう2
電圧の向きを逆に接続してしまったら,どうなるか.
やってみよう3
赤と緑の二つのLEDを別々の周期で光らせたい.どうすればよいか.
6 デジタル入力: スイッチがOnの間だけ,LEDを光らせる.
次に入力を試してみる.
まず,ピンは入力にも出力にも使える.ここでは,先程まで出力に使っていた2番ピンを入力に使い,スイッチのOn/Offを検出する.setup()内でピンの設定を変更する必要がある.
さてスイッチであるが,足が4本ある.スイッチを押すと,どことどこが導通するのか,何とかして調べる.テスターを使うか,適当な回路を組んでみよう.
そして,このスイッチを2番ピンとGNDの間に接続する…それでよいのか?
スイッチを押した瞬間に,5VとGNDの間が抵抗無しの状態で接続される.これはまずい.
よって,抵抗とスイッチを直列に接続し,抵抗の電圧降下を計測することで,スイッチのOn/Offを検知する.
このとき,抵抗には100[ohm]を使うか,10k[ohm]を使うべきか?
回路図はFig. 5になる.
出力が無いと意味がない.ここでは,13番,すなわち,本体に装着されているLEDピンを使い,スイッチがOnならばLEDを点灯させ,Offならば消灯するようにする.
const int button_pin = 2; const int led_pin = 13; const int wait = 30; int button_state; void setup() { pinMode(button_pin, INPUT); pinMode(led_pin, OUTPUT); } void loop() { button_state = digitalRead(button_pin); digitalWrite(led_pin, button_state); delay(wait); }
やってみよう
ボタンが押されたら,LEDの点灯状態が切り替わるようにしてみよう.
7 アナログ出力: 外付けLEDをぼわっと光らせる(アナログ出力)
これまでの試した出力はデジタル出力で,0か1(実際には0Vか5V)が出力される.
アナログ出力を使うと,ぼわっと光らせることができる.アナログと言っても,実際はPWMという,デジタルのOn/Offの比率に従って高速に電圧を切り替えているのである.
Arduino Unoは,PWM出力できるピンが限られている.~マークが入っているピンがPWMに対応している.ここでは3番ピンを使ってみる.回路図はFig. 4のD2をD3に変更しただけだから省略.
analogWrite()関数を用いて0から255の値を設定することで,アナログ出力ピンの電圧を変えることができる.
const int led_pin = 3; const int wait = 5; int val; int dir; void setup() { pinMode(led_pin, OUTPUT); val = 0; dir = 1; } void loop() { analogWrite(led_pin, val); delay(wait); val += dir; if (val > 255) { val = 255; dir = -1; } else if (val < 0) { val = 0; dir = 1; } }
8 アナログ入力: 可変抵抗の値を知る
アナログ入力ピンは,Arduino Unoの場合6本あり,それぞれA0からA5の名前が付いている.アナログ入力ピンとGNDの間の電圧を,0から1023の値として得ることができる.0Vの場合が0,5Vの場合が1023である.このような,電圧をデジタル値に変換することを,A/D変換(Analog Digital Conversion)と呼ぶ.
可変抵抗(ボリューム)は,その名の通り,抵抗値を変えることのできる抵抗である.足が3本あり,両端の間の抵抗は一定で,回転されると中央の足と他のいずれかの足との間の抵抗が変わる.Arduinoでその抵抗値(の相対変化)を取得し,値に合わせて,LEDの明るさを
変えてみる.
回路図はFig. 6である.
const int sensor_pin = A0; const int led_pin = 3; const int wait = 30; void setup() { pinMode(led_pin, OUTPUT); } void loop() { int val = analogRead(sensor_pin); analogWrite(led_pin, val / 4); delay(wait); }
やってみよう
明るさではなく,点滅速度を変えるように変更する.
9 シリアル通信: アナログ入力の値を表示する
これまではArduino単体で完結した処理を行ってきた.ここでは,ArduinoとPCの間での通信を必要とする処理を行う.
ArduinoとPCとの間は,USBケーブルを介したシリアル通信と呼ばれる通信方式で接続される.シリアル通信は,Serialライブラリを用いて行う.
前にやった可変抵抗の値に合わせてLEDの明るさを変えるプログラムと回路を流用し,可変抵抗の値をシリアル通信を用いてPCに送ってみる.
const int sensor_pin = A0; const int led_pin = 3; const int wait = 30; void setup() { pinMode(led_pin, OUTPUT); Serial.begin(9600); } void loop() { int val = analogRead(sensor_pin); analogWrite(led_pin, val / 4); delay(wait); Serial.println(val); }
ツール > シリアルモニタ を開くと,数値が送られてきているのがわかる.可変抵抗を回転させると,数値が変化することがわかる.
やってみよう
シリアルモニタの右下にある通信速度を変えてみる.プログラム側で指定している速度と,敢えて異なる値に設定すると,何が起こるだろうか.