「Arduinoを始めたいんだけど何をどうしたらいいか分からない」というかたのために、Arduinoを初めて使う時に必要なもの(ハードウェア、ソフトウェア)と、簡単な実例集を示します。
この資料は以下のイベントと連動しています。
必要なハードウェア
まず以下のハードウェアを用意します。
- Arduino本体(Arduino UNO R3)
- Arduino本体とPCを接続するUSBケーブル(* 1)
- LEDやセンサーなどのパーツ
- Arduinoとパーツを接続するためのケーブル(* 2)
- ブレッドボード
(*1) コネクタの形状はArduino側はType B、PC側は機種によってType AやType Cに分かれます。一部の新しいMacはType Cでそれ以外のMacやLinux PC・Windows PCはType Aが多いですが、お使いのPCのUSBがどのタイプなのかについてはWikipediaを参照して下さい。
(*2) このケーブルのことをジャンパワイヤと呼びます。ジャンパワイヤは両端にピンが出ている「オス – オス」と呼ばれるものを用意します。色によって機能や性能に違いはないので好きな色を使えばいいでしょう。
これらのハードウェアはそれぞれ個別に購入してもいいですが、よく分からない場合はArduino本体とケーブルと数種類のパーツがセットになった「Arduinoをはじめようキット」などを購入するのがいいでしょう。
店舗で購入するなら以下の3店舗が定番です。ネット通販でも購入できます。
関連資料・記事
ちなみにArduinoには純正品だけでなく互換機も含めたくさんの種類がありますが、以降の説明ではごく一般的に使われていてネットや書籍での情報も豊富なArduino UNO R3(R3はリビジョン3の意)を使用します。
上記の「Arduinoをはじめようキット」にもArduino UNO R3が同梱されています。
- Arduino (Wikipedia)
必要なソフトウェア
次にソフトウェアですが、Arduinoの制御に必要なのはarduino.ccが提供しているArduino IDE(無償)という開発環境です。
使用するPCのOS(macOS/Linux/Windows)に合ったArduino IDEを以下からダウンロードし、インストーラの指示に従ってインストールします。
参考書籍
Arduinoの解説本は数多く出版されていますが、僕的には以下の2冊がオススメです。
とっつきやすさ
- 「みんなのArduino入門」
より深堀りした内容と豊富な事例がほしい場合 - 「実践Arduino! 電子工作でアイデアを形にしよう」
ArduinoとPCの接続
ハードウェアとソフトウェアが揃ったらまずはArduinoとPCを接続してみましょう。
最低限必要なものはArduino本体と先ほどArduino IDE(以下 IDE)をインストールしたPC、そして両者をつなぐUSBケーブルです。
このケーブルを使ってPCからArduinoに電力を供給したりプログラムを送り込んだり、逆にArduinoで取得したセンサーデータをPC側で受信したりします。
流れとしてはまず最初にPC上でIDEを起動しておいて、次にArduinoとPCをUSBケーブルでつなぎます。
数秒〜数十秒待つとArduinoがシリアルデバイスとして認識されるので、続いてIDEで以下の作業を行います。
- [ツール] > [ボード]から[Arduino/Genuino UNO]を選択
- [ツール] > [シリアルポート]から先ほど認識させたArduinoのシリアルデバイスを選択
これでIDEからArduinoを制御することができるようになります。
IDEには初めからいろいろなサンプルプログラムが同梱されています。Arduinoの世界ではIDEで使用するプログラムのことを『スケッチ』と呼ぶので覚えておくとよいでしょう。
それでは実際にIDEを使ってArduinoを制御していきましょう。
内蔵LEDを光らせてみよう
まずは最も簡単な内蔵LEDを光らせるところから。これは先ほどの接続以外に特別な結線などは必要ありません。プログラムもIDEにサンプルプログラムとして用意されているのでIDEでそれを選択するだけでOKです。
IDEで[ファイル] > [スケッチ例] > [01.Basics] > [Blink]を選択してスケッチを表示し、画面左上のチェックボタン(✓)をクリックしてスケッチをマイコンが理解できるデータに変換(この行為をコンパイルと呼びます)してから隣の右矢印ボタン(→)をクリックすればスケッチがArduinoに書き込まれて内蔵LEDが点滅します。
LEDがチカチカするので通称「Lチカ」と呼ばれ、電子工作で一番最初に行う入門的な作業になります。
LEDを光らせてみよう(Lチカ)
内蔵LEDの点滅に成功したら次はArduinoにLEDを接続して点滅させてみましょう。
用意するものは以下の5点です。
- ブレッドボード
- LED
- 抵抗(330Ω)
- Arduino本体とブレッドボードをつなぐジャンパワイヤ2本
LEDを扱う上で最初に一つ注意すべきことがあります。LEDは弱い電流で動作しますが、Arduinoからの電流をそのままLEDに流すと流量が多すぎてLEDが壊れてしまうので途中に抵抗というものを挟んで電流を弱める必要があります。
抵抗には電流をどのくらい弱くするかによって様々な値のものがあって単位はΩ(オーム)で表します。値(抵抗値)が大きくなればなるほど流れる電流を弱めることができます。ここでは深く考えずに330Ωの抵抗を使用します。(それより大きな値でも構いません)
抵抗の説明はこのくらいにして、ブレッドボードにLEDを刺しましょう。
LEDにはプラスとマイナスの極があって、ピンの長いほうがプラス、短いほうがマイナスです。(それぞれ『アノード』『カソード』と呼びます)
ブレッドボードは長辺の両端に「+」と「-」と書かれた線がありますが、この線に沿って電気的に内部で一列につながっています。その内側は逆に中心に向かって電気的に内部で一列につながっています。
ブレッドボードにLEDを刺す場合は右の写真のように電気的につながっていない場所(4の列と5の列)にプラスとマイナスを刺すようにします。
ここではプラス(ピンの長いほう)が右側になるように刺します。そしてプラスの線(4の列)上に抵抗を刺しておきます。抵抗に向きはありません。
ブレッドボード上の接続が終わったらArduino本体とつなげましょう。
Arduino側で使用するピンは電源を取るピン(ここでは7番ピンを使用)と、電流を逃がすアースとしてのGND(グランド)と書かれたピンの2ヶ所です。
この7番ピンにジャンパワイヤ(ここでは赤)を刺し、もう片方をブレッドボード上のLEDのプラス側(抵抗の反対側の1の列)に刺します。
そしてGNDピンにジャンパワイヤ(ここでは黒)を刺し、もう片方をブレッドボード上のLEDのマイナス側の線(5の列)上に刺します。
以上で接続は終わりです。
あとはLチカを行うスケッチを書いてArduinoに送り込めばLEDがチカチカします。
Lチカのスケッチは一から書く必要はなく、先ほど内蔵LEDを光らせた時のものを少し変更して使用できます。
「/*」〜「*/」
で囲まれた部分や 「//」
で始まる文章はコメントなので無視して構いません。
このスケッチはArduinoの内蔵LEDをLチカさせるためのものなので、LEDのピンの指定を内蔵LED(LED_BUILTIN)から先ほどLEDを接続した7番ピン(7)に変えて✓をクリック(コンパイル)し、→をクリックすればスケッチがArduinoに書き込まれてLEDが点滅します。
void setup() { pinMode(7, OUTPUT); } void loop() { digitalWrite(7, HIGH); delay(1000); digitalWrite(7, LOW); delay(1000); }
ここで少しスケッチの構造について説明しておきます。スケッチをよく見ると、
void setup() { . . . }
と
void loop() { . . . }
という2つの塊があり、一つ一つの塊を関数と呼びます。
setup()はプログラムが動き出して一回だけ実行される関数なのでここには初期設定などを書いておき、loop()は繰り返し実行される部分なのでここにメインの処理を書きます。
スケッチはArduinoに書き込まれたあと電源を切る(= USBケーブルを抜く)か他のスケッチを書き込むまで無限に動き続けるので途中で終了するという概念がありません。電源を切っても再度電源を入れ直すと以前書き込んだスケッチがまた動き始めます。
Arduinoはセンサーからデータを取得し続けたり何かのデータを出力し続けるといった用途に使うことが多いのでこのような構造になっています。
さて今回のLチカを行うスケッチの処理内容ですが、まずsetup()中のpinMode()で7番ピンを出力用(OUTPUT)に設定しています。入出力機器をつなぐポートはINPUTかOUTPUTのモードを持つので明示的に宣言することが大切です。
void setup() { pinMode(7, OUTPUT); }
続いてloop()中のdigitalWrite()で先ほどモードを宣言した7番ピンの電圧レベルを高(HIGH)に設定すると、7番ピンからアース(GND)に向かって電流が流れ、LEDが点灯します。
次のdelay()で1000ミリ秒(= 1秒)待ってから7番ピンの電圧レベルを低(LOW)に設定すると電流が流れなくなってLEDが消灯します。
さらに1000ミリ秒待ってループの先頭に戻るので結果として1秒おきにLEDが点滅し続けるという動きになります。
void loop() { digitalWrite(7, HIGH); delay(1000); digitalWrite(7, LOW); delay(1000); }
温度センサーで室温を測ってみよう
Lチカがうまくいったら次は温度センサーを使って室温を測ってみましょう。
ここでは簡単に扱える「LM61BIZ」という温度センサーを使います。
関連資料・記事
先ほどのLチカ用の接続を全て取り外し、温度センサーを刻印面を前にしてブレッドボードに刺したあと3本のピンを左からそれぞれArduinoの5V(赤)、A0ピン(白)、GND(黒)につなぎます。
そして以下のようなスケッチを書いてコンパイルし、Arduinoに書き込みます。
センサーから取得したデータを温度に変換するには以下のようにちょっとした計算が必要になりますが、最初はあまり深く考えずコピペして使い、おいおい動作原理を覚えていけばよいでしょう。
void setup() { // シリアルポートを9600bpsに設定 Serial.begin(9600); } void loop() { // A0ピンからセンサーデータを取得 int val = analogRead(0); // 取得したセンサーデータ(0〜1023)を電圧(0〜5000)に変換 float volt = map(val, 0, 1023, 0, 5000); // このセンサーの計測範囲の電圧(300〜1600)を温度(-30〜100)に変換 float temp = map(volt, 300, 1600, -30, 100); // 温度を出力 Serial.println(String(temp)); // 1000ミリ秒(1秒)待つ delay(1000); }
計測した温度はIDEの[ツール] > [シリアルモニタ]で確認できます(左)。
また[ツール] > [シリアルプロッタ]でグラフとしても確認できます(右)。
この状態で温度センサーに手を触れると徐々に温度が上がっていくのが確認できると思います。
このように結果が視覚化されると分かりやすいですよね。
光センサーで明るさを測ってみよう
温度センサーに続いて光センサーを使ってみます。
光センサーは通称CdSセルと呼ばれます。ここでは「GL5528」というCdSセルを使います。
関連資料・記事
CdSセルはまわりが暗いとセンサー自体の抵抗値が大きくなり、まわりが明るいと抵抗値が低くなる性質を持っています。
これを利用して、写真のようにCdSセルの片方に5Vからの線(赤)、もう片方に10KΩの抵抗を挟んだうえでGND行きの線(黒)と抵抗値をA0ピンで取得する線(白)をそれぞれつなぎます。
そして以下のようなスケッチを書いてコンパイルし、Arduinoに書き込みます。取得した明るさは0〜1023の範囲の値になります。
int val = 0; void setup() { Serial.begin(9600); } void loop() { val = analogRead(0); Serial.println(val); delay(500); }
サーボモーターを使ってみよう
Arduinoは動くものも操作できます。ここではサーボモーターを操作してみましょう。
サーボモーターは数百円で購入できる安価な「SG90」というものを使います。このサーボモーターの可動範囲は0〜180度(半回転)です。
結線のしかたは簡単で、サーボモーターの3つの信号線をそれぞれ以下のようにつなげばOKです。
- オレンジ(制御) -> Arduinoの9番ピンへ
- 赤(電源) -> Arduinoの5Vへ
- 茶(GND) -> ArduinoのGNDへ
スケッチもIDEにサンプルが用意されているので[ファイル] > [スケッチ例] > [Servo] > [Sweep]を選択してスケッチを表示し、コンパイルして実行すればサーボモーターが回転し始めます。
#include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); } void loop() { for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); delay(15); } for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } }
スケッチの中身を見るとまず0度から180度まで1度ずつモーターを回していって、
for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); delay(15); }
次は逆に180度から0度まで1度ずつモーターを戻していくという単純な作りです。
for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); }
ロボットを作るならサーボモーターは欠かせないパーツですね。
このように一つ一つの機能は単純ですが、それらをつないでプログラミングをすればいろいろな用途に使うことができます。
参考サイト
- Arduino (Wikipedia)
- Arduino技術情報 (Qiita)
- Arduino関連情報 (Device Plus)
- Arduino記事一覧 (Think IT)
- エレクトロニクス豆知識 (ROHM)