2014/1/19版

Arduino入門
光永 法明
http://n.mtng.org/ele/arduino/
•
•

本資料は講義等のために筆者が作成したものに加
筆修正したものです。
誤り、改良点があればお知らせください。

•

著作権は放棄しませんが、個人での利用や、学校
(授業・地域向けイベント)や社内、自分たちで
実施する勉強会で使うのはご自由にどうぞ。

•

有料の講習会等の場合の利用は別途ご相談くださ
い。有料の講習会を実施する方には、本資料の内
容ぐらいは自分で作成いただきたいので。
最初の一歩
• Arduino IDEを起動してサンプルを動かすま
でです
• 画面は Windows 版です
• Arduino IDE は http://arduino.cc/ から入手し
ます。今の時点では 1.0.x系を推奨します。
• Windows では USB シリアルのドライバが
必要です。
• その場合には Arduino IDE に付属のドライ
バを次のスライドのようにインストール
します
ドライバのインストール
Arduino ボードを USB ケーブルで PC につないだときに、
ドライバがインストールされていなければ
• 参照をクリックし、Arduino IDEに含まれる
フォルダ drivers → FTDI USB Drivers を指定
する
Arduino IDEを起動する
• Arduino(.exe)を
ダブルクリッ
ク
• ダウンロード
したZIPファイ
ルを展開して
おくこと
ファイル→
スケッチの例→
01.Basics→
Blinkを開く
ツール→マイコンボード→Arduino…ATmega16
を選択する(使っている物に合わせる)
ボードを変えなければ
PCにつき1回すればOK
ツール→シリアルポートの中の適切なものを
選択する(おおよそ番号の一番大きいものでよい
Uploadをクリック
クリックするとスケッチの
コンパイルが始まる。
コンパイルが終わると
転送が始まり、
ArduinoのTX, RXの
LEDが点滅する。
点滅が終了すると
Arduinoがリセットされ
スケッチが動く。
エラーの場合は
ボード、
シリアルポート、
スケッチを
確認する。
今動かしたスケッチを読もう
• Blink サンプルのスケッチを読んでみま
しょう
• そのための解説をします
Arduino 言語のお約束
• 基本的には、マイコンへの命令が並んで
います。
• マイコンは一文ずつ順に命令を実行しま
す。
• 一文の終わり(。)は;です
• 右の部分は次のように読みます
ledピンをHIGHにせ
digitalWrite(led, HIGH);
よ。
delay(1000);
1000ms(1秒)待て。
digitalWrite(led, LOW);
ledピンをLOWにせよ。 delay(1000);
Arduinoのスケッチ(プログラ
ム)
void setup()
{
}
void loop()
{
}

setup関数
最初に1回だけ実行する文を
並べる(初期化など)

loop関数
繰り返し実行する文を
並べる(最後の文が実行したら
最初の文に戻る)
スケッチのお約束
• 文の終わりは ;
• 空白は好きなだけ入れていい(全角空白は
ダメ)
• 改行も空白の一種として扱われる
– 以下は同じ文

a = 2 + 3;
a=2
+3;
• 大文字と小文字、半角と全角を区別する
スケッチのお約束
• // から行末まではコメント
• /* と */ で囲まれた間はコメント
• コメント:人が読むためのものでプログ
ラムの一部ではない
関数とは?
• 文をまとめたもの
• Arduinoのスケッチを書く
→loop関数とsetup関数をつくる
• あらかじめよく使う機能について関数が
用意されている
すぐに使える関数
• pinMode, digitalWrite, analogWrite, delay
pinMode(13, OUTPUT); // 13ピンを出力
に設定する
digitalWrite(13, HIGH); // 13ピンの出力
をHIGHにする
analogWrite(3, 100); // 3ピンのPWM出力
を100/255にする
delay(100); // 100ミリ秒待つ
Blinkスケッチ

/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000);
// wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000);
// wait for a second
}

Arduino IDEで開くと
色分けされている

コメント、定数、setup, loo
関数を探してみよう
ここまでのまとめ
• Blink スケッチを読めましたか?

• 点滅の間隔を変えるにはどうしたらいい
でしょう?
• 337拍子で、LEDを点滅させてみよう
• 次ページ以降は、もう少し細かな約束
(文法)です。
四則演算
•
•
•
•

+, ー, ×, ÷, (, )は +, -, *, /, (, )
計算の基本は整数
% であまりを求められる
計算式の = は変数への代入を意味する
– a = b + 3; は、今のbの値に3を足した値がaに入
る
– 次の行にb = 4 があっても、aは変化しない

• i ++, ++ i は i=i+1とほぼ同じ
• i--, -- i は i=i-1とほぼ同じ
比較演算
• >, <, ≧, ≦, =は>, <, >=, <=, ==
• 成立するとき値が真(1)にしないとき偽(0)にな
る
• 2つの値しか比較できない
• 二つの比較式をならべるとき、かつ、または
を &&, || で表す
• ! は否定(~でない)を表す
式
値
式
値
例)
a>b 偽
a>1 && a<2
偽
a=1
a==b 偽
a>=1 && a<=2 真
a<b 真
!(a<b)
偽
b=2
a>1 || b==2 真
のとき a>=b 偽
a<=b

真

a>0 && b>0

真
定数
•
•
•
•

10進数(整数):普通に書いていい (123)
16進数:あたまに0xをつける (0x123)
2進数:あたまにBをつける (B1010)
10進数(浮動小数点): . をつける (123.0,
1.23)
• 10進数(指数表現): eを使う(2.4e5 = 2.4×105)
• デジタル入出力: HIGH, LOW
• デジタル入出力の向き: INPUT, OUTPUT
• 真と偽: true, false
変数
• 名前を自分で決められる
• 長さは任意
• 英文字で始まり、英数字や_を使ってよい
例)

a, b, a1, a2, a3, a4, LEDpin, LED_pin1

• 使う前に宣言が必要
• 変数の「型」によって扱える値(範囲)が違う(早見表参照)
– 型: char, int, short, long, float, double など

• 宣言は型<空白>名前;または型<空白>名前1,名前2,…; と
する
– int a;
– int a, b;
など

• 変数の初期値は不定(心配なら代入する)
int a; a = 0;
int a=2;
など
配列変数
• 数列(a1, a2, a3, …)のようなもの
• 大きさを宣言してから使う
int a[10];

• 型はなんでもいい
• 添え字は0から始まるので大きさが10なら、添え字
は0から9になる
• 宣言した大きさを超えて使おうとするとうまく動作
しない
• 添え字に[]をつけて使う
a[0] = a[1];
a[i+1] = a[i] + 1;
制御文
• while文
while(条件式)
式A;

• for文
for(式1; 条件式; 式3)
式A;
• if文
if (条件式)
式A;
else
式B;
while文
while(条件式)
式A;

• 条件式が成り立つ(真)間、式Aを実行
• 最初に成り立っていなければ、式Aを実行し
ない
例)
while (digitalRead(3) == HIGH)
;
3番ピンがHIGHの間待つ。3番ピンにスイッチ
をつけている回路では、スイッチが押される
for文
for(式1; 条件式; 式3)
式A;
• 式1を実行し、
• 条件式が成り立つ(真)間、式Aと式3を実行す
る
• 最初に成り立っていなければ、式Aを実行しな
い
例)
for (int i=0; i<10; i=i++)
delay(1000);
最初にiを0にする。i<10が成り立っているので、
1000ms待ち、iに1を足す。またi<10が成り立って
if文
if(条件式)
式A;
else
式B;
• 条件式が成り立つ(真)なら式Aを成り立たない(偽)なら式Bを実行
する
• else から先を省略してもいい
例)
if (digitalRead(2) == LOW)
digitalWrite(13, HIGH);
else
digitalWrite(13,LOW);
2番ピンのスイッチが押されたら13番ピンのLEDを点灯し、そうでな
ければ消灯する
Arduio に回路をつなごう
• ここからは Arduino に回路をつなぐ例を紹
介します
• 具体的な部品の選定は解説していません
ピンの機能とつながる回路の例
• デジタル入力 (0[V]/5[V])
– スイッチ,デジタル回路

• デジタル出力 (0[V]/5[V])
– LED,トランジスタやドライバを介してリレー,DCモータ,ソレ
ノイドなど
– デジタル回路

• アナログ入力 (0~5[V]を0~1023で表す)
– 抵抗分圧を使ってポテンショメータ(ボリューム),感圧セン
サなど
– 0から5[V]の範囲で電圧を出力するセンサの回路

• マトリクスLED
– 8×8のマトリクスLED

•

PWM 出力 (高速にON/OFF, ON/OFFの比:0から255
明るさやモータの速度を制御できる)
– LED,トランジスタやドライバを介してモータなど

• R/Cサーボ
– ラジコン用のサーボモータ
デジタル/PWM出力(0V or 5V,
最大10mAから20mA)の使用例
デジタル回路

例:LED, 圧電スピーカ

tone()を使う
digitalWrite()や
analogWrite()を使う
デジタル/PWM出力の増幅例
例:トランジスタ、
トランジスタ+リレー、
FETによる、モータや
他の回路の電源の制御
トランジスタ+リレー

digitalWrite() を使う

トランジスタでモータ

digitalWrite()や
analogWrite()を使う

MOS FET+リレー

digitalWrite() を使う

MOS FETでモータ

digitalWrite()や
analogWrite()を使う
デジタル/PWM出力の増幅例
例:モータドライバICによる
模型用モータの制御
(正逆回転・ブレーキ)
digitalWrite()や
analogWrite()を使う
R/Cサーボ出力の使用例
Servo s;
s.attach(), s.write()を使う
s は変数名で任意

電源
ラジコンサー
ボ
グラウンド
デジタル入力(0V or 5V)の使用例
デジタル回路

digitalRead()を使う

電源が異なる
デジタル回路
アナログ入力(0[V]から5[V])の使用
例 ポテンショメータ(ボリューム)
例:温度センサIC,
アナログ回路
(電圧出力の
センサなど)

analogRead()を使う
アナログ入力(0[V]から5[V])の使用
例
~抵抗値が変化するセンサ~
analogRead()を使う

例:CdS, 照度センサ, サーミスタ
例題を動かしてみよう
• 動かす前にスケッチを読んで何が起こるか予
想しよう
• 少し変えて動作を確かめ、保存してみよう
• 01.Basics
– BareMinimum
– Blink

• 02.Digital
– BlinkWithoutDelay
• millis()関数は何?早見表、日本語リファレンスを読んで
みよう
例題を動かしてみよう
• 動かす前にスケッチを読んで何が起こる
か予想しよう
• 02.Digital
– Button
– toneMelody

• 03.Analog
– Fading
– AnalogInput (CdSと10kΩ抵抗を使う)
スイッチに反応させる
const int SWpin=2
void setup()
{
pinMode(13, OUTPUT)
if (digitalRead(SWpin) ==LOW)
digitalWrite(13, HIGH);
}

void loop()
{
}
スイッチに反応させる
const int SWpin=2
void setup()
{
}
void loop()
{
pinMode(13, OUTPUT)
if (digitalRead(SWpin) ==LOW)
digitalWrite(13, HIGH);
}
スイッチに反応させる
const int SWpin=2
void setup()
{
pinMode(13, OUTPUT)
}
void loop()
{
if (digitalRead(SWpin) ==LOW)
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
}
アナログ入力(0[V]から5[V])の使用
例 ポテンショメータ(ボリューム)
例:温度センサIC,
アナログ回路
(電圧出力の
センサなど)

analogRead()を使う
センサに反応させる
CdSは明るいほど抵抗値が下がる
→明るいほどアナログ入力の値が
下がる
どうやって決める?

if (analogRead(CDSpin) < 100) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
シリアルモニタ
ArduinoとPCの間でシリアル通信をして
今の値を表示する
(Arduino→PC, PC→Arduinoの両方が出来る)

ここに表示される

通信速度
ArduinoからPCへ送信
void setup()
{
Serial.begin(9600);
}

通信速度、単位はbps (bit per second)
9600, 19200, 38400, 115200など
数値が大きいほど速い。シリアルモニタの
設定をこれにあわせること。

シリアル通信に関係するもの(シリアルライブラリ)にはつく

引数を人に読める形で表示して改行する
void loop()
{
Serial.println(analogRead(A0));
delay(1000);
引数はアナログ入力の値
}
ほかにも表示形式がある。リファレンスマニュアル参照のこと。
const int LEDpin=13;
void setup()
{
pinMode(LEDpin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
Serial.println(analogRead(A0));
if (analgoRead(A0) < 100)
digitalWrite(LEDpin, HIGH);
else
digitalWrite(LEDpin, LOW);
delay(1000);
}
明るくなると点滅が速くなる
const int LEDpin=13;
void setup()
{
pinMode(LEDpin, OUTPUT);
}
void loop()
{
digitalWrite(LEDpin, HIGH);
if (analgoRead(A0) < 100)
delay(100);
else
delay(500);
digitalWrite(LEDpin, LOW);
if (analgoRead(A0) < 100)
delay(100);
else
delay(500);

}

2段階で点滅の間隔が変わる
もっと細かくするには?
明るくなると点滅が速くなる
const int LEDpin=13;
void setup()
{
pinMode(LEDpin, OUTPUT);
}
void loop()
{
int a = analogRead(A0);
digitalWrite(LEDpin, HIGH);
delay(a);
digitalWrite(LEDpin, LOW);
delay(a);
}

アナログ入力の値(0~1023)
の長さ[ms]の間隔で点滅
明るくなると点滅が速くなる
const int LEDpin=13;
void setup()
{
pinMode(LEDpin, OUTPUT);
}
void loop()
{
int a = analogRead(A0);
digitalWrite(LEDpin, HIGH);
delay(a);
digitalWrite(LEDpin, LOW);
delay(a);
}

アナログ入力の値を元に計算や
比較をすれば色々出来る
もっと速く点滅
int a = analogRead(A0) / 2;
2乗に比例
int a = analogRead(A0);
a = a*a / 1000;
速くなりすぎないように制限する
if (a<100)
a = 100;
暗くなると速くなるようにする
a = 1023 – a;
過去を覚えておく
const int LEDpin=13;
int oA0 ;
void setup()
{
pinMode(LEDpin, OUTPUT);
oA0 = analogRead(A0);
}

abs() は絶対値を求める関数

void loop()
{
int a = analogRead(A0);

以前の値oA0とA0の差が大
きいときにLEDを点灯

if (abs(a – oA0)>100)
digitalWrite(LEDpin, HIGH);
delay(1000);
}
digitalWrite(LEDpin, LOW);
delay(100);

人が通りがかったり、手を
かざしたときに反応といっ
た応用が出来る

oA0 = a;
}
平均値をとる
const int LEDpin=13;
int oA0[3] ;
void setup()
{

pinMode(LEDpin, OUTPUT);
}
void loop()
{
int a = analogRead(A0);
int avg;
avg = (oA0[0] + oA0[1] + oA0[2] + A0)/4;
if (avg>100)
digitalWrite(LEDpin, HIGH);
}
digitalWrite(LEDpin, LOW);
oA0[0] = oA0[1];
oA0[1] = oA0[2];
oA0[2] = a;
delay(1000);
}

4回の平均を求める例
過去の値を配列にいれてお
く
ノイズの除去、細かい変化
の無視をしたいときに使う
順に覚えている前の値をず
らしていく

平均を求めたり、記憶をず
らすのにforループを使うこ
とも多い
関数
millis関数:リセットからの経過時間[ms]
数学関数: abs, sin, cos, tan, log などが使える
角度の単位はラジアン、logの底はe
乱数: random, randomSeed
最初に一回randomSeedで初期化
あとはrandomを使う

ほかにも関数がある。制約や注意事項も含めリファレンスマニュアル参照のこと。
乱数を使う
const int LEDpin=13;

乱数をアナログ入力の値で
初期化

void setup()
{
pinMode(LEDpin, OUTPUT);
randomSeed(analogRead(A0));
}
void loop()
{
int t = random(100, 1000);
digitalWrite(LEDpin, HIGH);
delay(t);
digitalWrite(LEDpin, LOW);
delay(t);
}

乱数といっても計算で求め
るので、randomSeedに与え
る値が同じなら、random関
数を呼び出した回数が同じ
ならrandom関数の返す値は
同じ
左の例では100から999の間
の値がtに入る
tone関数
• ブザーをならせる
tone(2, 1000);
// 2ピンに1000Hzを出す
noTone(2);
// やめる
tone(2, 1000, 100); // 2ピンに1000Hzを100ms出す

toneMelody のpitches.hを使う(コピーする)と
tone(2, NOTE_C4, 100);
// (4オクターブ目のド)といった記号を使える

• toneMelody では、配列に音の高さと長さを覚えている
• forループで順に処理
• また4→250ms, 8→125ms となるように1000をその音の音符の分で割っている
(4分音符なら4,8分音符なら8)
int noteDurations[] = { 4, 8, 8, 4,4,4,4,4 };
int noteDuration = 1000/noteDurations[thisNote];
サーボライブラリ
• ラジコンサーボを扱う
• スケッチの先頭に次の1行が必要
#include <Servo.h>
• 使いたいサーボの数だけ宣言が必要
Servo s1, s2;

• attachでピンを指定する
s1.attach(2);
s2.attach(3);
• writeで角度(おおよそを指定する0から180)
s1.write(10);
s2.write(200);

制約や注意事項も含めリファレンスマニュアル参照のこと
例題を動かしてみよう
• 動かす前にスケッチを読んで何が起こる
か予想しよう
• 少し変えて動作を確かめ、保存してみよ
う
• Servo
– Sweep
– Knob
参考リンク
• Arduino.cc
http://www.arduino.cc/

• Arduino 日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/

• Arduino のすすめ
http://n.mtng.org/ele/arduino/

• エレキジャックのArduino関連web記事
http://www.eleki-jack.com/FC/

• MAKE blog の Arduino 関連記事
http://jp.makezine.com/blog/arduino/

• Arduino 便利メモ
http://ndesign.ifdef.jp/a/a_m.html

Arduino 入門