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).

fig1

インストールする前に,コントロールパネル > プログラムと機能 を確認し,古い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)が橙に点滅するはず.

ポートの確認

Arduinoが接続されているポートを確認する.プログラムの転送に必要.コントロールパネル > デバイスマネージャー > ポート (COMとLPT) を見る(Fig. 2).

fig2

Arduino Uno (COM4)

等と記載があるはず.COMの後ろの数字はポート番号で,PCによって違うので注意すること.

[発展]シリアルポートのプロパティ

右クリック > プロパティを見てみよう.ポートの設定 のタブに,

  • ビット/秒
  • データビット
  • パリティ
  • ストップビット
  • フロー制御

とある.これらはシリアルポート通信の一般的な設定項目である.詳細は割愛するので各自調べてもらいたい.通信がうまくいかない場合にまずチェックするべき箇所である.

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に示す各線で示す配線がなされている.

fig3

まず赤色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になる.

fig4

この回路をブレッドボードを使って配線する.配線は色も考えて選ぶべきである.一般的に,赤が電源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になる.

fig5

出力が無いと意味がない.ここでは,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である.

fig6

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);
}

ツール > シリアルモニタ を開くと,数値が送られてきているのがわかる.可変抵抗を回転させると,数値が変化することがわかる.

やってみよう

シリアルモニタの右下にある通信速度を変えてみる.プログラム側で指定している速度と,敢えて異なる値に設定すると,何が起こるだろうか.