Arduino 入門

58
Arduino 入入 入入 入入 http://n.mtng.org/ele/arduino/ • 入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入• 入入 入入入入入入入入入入入入入入入入 、。 • 入入入入入入入入入入入 入入入入入入入入 入入入 入入入 入入入入入入 、、( 入入 入入入入 入入入入入入入入入入入入入入入入入入入入入入入入入 )、。 • 入入入入入入入入入入入入入入入入入入入入入入入 入入入入入入入入入入 入入入入 入入入入入入入入入入入入入入入入入入入入入入入入 、。 2014/1/19 入

description

Arduino を使った講義等で使っている資料を基に加筆修正したものです。

Transcript of Arduino 入門

Page 1: Arduino 入門

Arduino 入門

光永 法明http://n.mtng.org/ele/arduino/

• 本資料は講義等のために筆者が作成したものに加筆修正したものです。

• 誤り、改良点があればお知らせください。

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

• 有料の講習会等の場合の利用は別途ご相談ください。有料の講習会を実施する方には、本資料の内容ぐらいは自分で作成いただきたいので。

2014/1/19 版

Page 2: Arduino 入門

最初の一歩• Arduino IDE を起動してサンプルを動かすまで

です• 画面は Windows 版です• Arduino IDE は http://arduino.cc/ から入手し

ます。今の時点では 1.0.x 系を推奨します。• Windows では USB シリアルのドライバが必

要です。• その場合には Arduino IDE に付属のドライバ

を次のスライドのようにインストールします

Page 3: Arduino 入門

ドライバのインストールArduino ボードを USB ケーブルで PC につないだときに、ドライバがインストールされていなければ

Page 4: Arduino 入門
Page 5: Arduino 入門

• 参照をクリックし、 Arduino IDE に含まれるフォルダ drivers → FTDI USB Drivers を指定する

Page 6: Arduino 入門

Arduino IDE を起動する• Arduino(.exe) を

ダブルクリック

• ダウンロードした ZIP ファイルを展開しておくこと

Page 7: Arduino 入門

ファイル→スケッチの例→01.Basics→Blink を開く

Page 8: Arduino 入門

ツール→マイコンボード→ Arduino…ATmega168を選択する(使っている物に合わせる)

ボードを変えなければPC につき 1 回すれば OK

Page 9: Arduino 入門

ツール→シリアルポートの中の適切なものを選択する(おおよそ番号の一番大きいものでよい)

Page 10: Arduino 入門

Upload をクリッククリックするとスケッチのコンパイルが始まる。コンパイルが終わると転送が始まり、Arduino の TX, RX のLED が点滅する。点滅が終了するとArduino がリセットされスケッチが動く。

エラーの場合はボード、シリアルポート、スケッチを確認する。

Page 11: Arduino 入門

今動かしたスケッチを読もう• Blink サンプルのスケッチを読んでみま

しょう• そのための解説をします

Page 12: Arduino 入門

Arduino 言語のお約束• 基本的には、マイコンへの命令が並んで

います。• マイコンは一文ずつ順に命令を実行します。• 一文の終わり(。)は;です• 右の部分は次のように読みます

digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000);

led ピンを HIGH にせよ。1000ms(1 秒 ) 待て。led ピンを LOW にせよ。1000ms(1 秒 ) 待て。

Page 13: Arduino 入門

Arduino のスケッチ(プログラム)

void setup(){}

void loop(){}

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

loop 関数繰り返し実行する文を並べる(最後の文が実行したら最初の文に戻る)

Page 14: Arduino 入門

スケッチのお約束• 文の終わりは ;• 空白は好きなだけ入れていい ( 全角空白は

ダメ )• 改行も空白の一種として扱われる– 以下は同じ文

a = 2 + 3;a = 2 +3;

• 大文字と小文字、半角と全角を区別する

Page 15: Arduino 入門

スケッチのお約束• // から行末まではコメント• /* と */  で囲まれた間はコメント• コメント:人が読むためのものでプログ

ラムの一部ではない

Page 16: Arduino 入門

関数とは?• 文をまとめたもの• Arduino のスケッチを書く → loop 関数と setup 関数をつくる

• あらかじめよく使う機能について関数が用意されている

Page 17: Arduino 入門

すぐに使える関数• pinMode, digitalWrite, analogWrite, delay

pinMode(13, OUTPUT); // 13 ピンを出力に設定する

digitalWrite(13, HIGH); // 13 ピンの出力を HIGH にする

analogWrite(3, 100); // 3 ピンの PWM出力を 100/255 にする

delay(100); // 100ミリ秒待つ

Page 18: Arduino 入門

/* 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, loop関数を探してみよう

Blink スケッチ

Page 19: Arduino 入門

ここまでのまとめ• Blink スケッチを読めましたか?• 点滅の間隔を変えるにはどうしたらいい

でしょう?• 337拍子で、 LED を点滅させてみよう

• 次ページ以降は、もう少し細かな約束(文法)です。

Page 20: Arduino 入門

四則演算• + , ー , ×, ÷, ( , )は +, -, *, /, (, )• 計算の基本は整数• % であまりを求められる• 計算式の = は変数への代入を意味する– a = b + 3; は、今の b の値に 3 を足した値が a に

入る– 次の行に b = 4 があっても、 a は変化しない

• i ++, ++ i は i=i+1 とほぼ同じ• i--, -- i は i=i-1 とほぼ同じ

Page 21: Arduino 入門

比較演算• > , < , , , ≧ ≦ =は >, <, >=, <=, ==• 成立するとき値が真 (1) にしないとき偽 (0) になる• 2 つの値しか比較できない• 二つの比較式をならべるとき、かつ、またはを &&,

|| で表す• ! は否定(~でない)を表す例)a=1b=2のとき

式 値a>b 偽

a==b 偽a<b 真

a>=b 偽a<=b 真

式 値a>1 && a<2 偽

a>=1 && a<=2 真!(a<b) 偽

a>1 || b==2 真a>0 && b>0 真

Page 22: Arduino 入門

定数• 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

Page 23: Arduino 入門

変数• 名前を自分で決められる• 長さは任意• 英文字で始まり、英数字や _ を使ってよい

例) 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;など

Page 24: Arduino 入門

配列変数• 数列 (a1, a2, a3, …) のようなもの• 大きさを宣言してから使う

int a[10];• 型はなんでもいい• 添え字は 0 から始まるので大きさが 10 なら、添え字は

0 から 9 になる• 宣言した大きさを超えて使おうとするとうまく動作し

ない• 添え字に [] をつけて使う

a[0] = a[1];a[i+1] = a[i] + 1;

Page 25: Arduino 入門

制御文• while 文

while(条件式 )式 A;

• for 文for(式 1; 条件式 ; 式 3)

式 A;• if 文

if (条件式 )式 A;

else式 B;

Page 26: Arduino 入門

while 文while(条件式 )

式 A;• 条件式が成り立つ(真)間、式 A を実行• 最初に成り立っていなければ、式 A を実行しない例 )

while (digitalRead(3) == HIGH);

3 番ピンが HIGH の間待つ。 3 番ピンにスイッチをつけている回路では、スイッチが押されるまで待つ。

Page 27: Arduino 入門

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 が成り立っているので、繰り返す。結果として 1000ms×10 回待つ。

Page 28: Arduino 入門

if 文if(条件式 )式A;else式B;

• 条件式が成り立つ (真 ) なら式A を成り立たない (偽 ) なら式B を実行する

• else から先を省略してもいい例 )

if (digitalRead(2) == LOW)digitalWrite(13, HIGH);elsedigitalWrite(13,LOW);

2 番ピンのスイッチが押されたら 13 番ピンの LED を点灯し、そうでなければ消灯する

Page 29: Arduino 入門

Arduio に回路をつなごう• ここからは Arduino に回路をつなぐ例を紹介します

• 具体的な部品の選定は解説していません

Page 30: 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 サーボ– ラジコン用のサーボモータ

Page 31: Arduino 入門

デジタル /PWM出力 (0V or 5V, 最大 10mA から 20mA) の使用例

デジタル回路例: LED, 圧電スピーカ

digitalWrite() やanalogWrite() を使う

tone() を使う

Page 32: Arduino 入門

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

digitalWrite() やanalogWrite() を使う

digitalWrite() を使う

digitalWrite() やanalogWrite() を使う

digitalWrite() を使う

トランジスタ+リレー MOS FET+リレー

トランジスタでモータ MOS FET でモータ

Page 33: Arduino 入門

デジタル /PWM出力の増幅例例:モータドライバ IC による模型用モータの制御(正逆回転・ブレーキ)

digitalWrite() やanalogWrite() を使う

Page 34: Arduino 入門

R/C サーボ出力の使用例

ラジコンサーボ

電源

グラウンド

Servo s;

s.attach(), s.write() を使う

s は変数名で任意

Page 35: Arduino 入門

デジタル入力 (0V or 5V) の使用例

デジタル回路

電源が異なるデジタル回路

digitalRead() を使う

Page 36: Arduino 入門

アナログ入力 (0[V] から 5[V]) の使用例アナログ回路(電圧出力のセンサなど)

例:温度センサ IC, ポテンショメータ(ボリューム)analogRead() を使う

Page 37: Arduino 入門

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

例: CdS, 照度センサ , サーミスタ analogRead() を使う

Page 38: Arduino 入門

例題を動かしてみよう• 動かす前にスケッチを読んで何が起こるか予想

しよう• 少し変えて動作を確かめ、保存してみよう• 01.Basics– BareMinimum– Blink

• 02.Digital– BlinkWithoutDelay

• millis() 関数は何?早見表、日本語リファレンスを読んでみよう

Page 39: Arduino 入門

例題を動かしてみよう• 動かす前にスケッチを読んで何が起こる

か予想しよう• 02.Digital– Button– toneMelody

• 03.Analog– Fading– AnalogInput (CdS と 10kΩ抵抗を使う )

Page 40: Arduino 入門

スイッチに反応させるconst int SWpin=2

void setup(){

pinMode(13, OUTPUT)if (digitalRead(SWpin) ==LOW)

digitalWrite(13, HIGH);}

void loop(){}

Page 41: Arduino 入門

スイッチに反応させるconst int SWpin=2

void setup(){}

void loop(){

pinMode(13, OUTPUT)if (digitalRead(SWpin) ==LOW)

digitalWrite(13, HIGH);}

Page 42: Arduino 入門

スイッチに反応させるconst int SWpin=2

void setup(){

pinMode(13, OUTPUT)}

void loop(){

if (digitalRead(SWpin) ==LOW)digitalWrite(13, HIGH);

elsedigitalWrite(13, LOW);

}

Page 43: Arduino 入門

アナログ入力 (0[V] から 5[V]) の使用例アナログ回路(電圧出力のセンサなど)

例:温度センサ IC, ポテンショメータ(ボリューム)analogRead() を使う

Page 44: Arduino 入門

センサに反応させる

CdS は明るいほど抵抗値が下がる→ 明るいほどアナログ入力の値が 下がる

if (analogRead(CDSpin) < 100) {digitalWrite(13, HIGH);

} else {digitalWrite(13, LOW);

}

どうやって決める?

Page 45: Arduino 入門

シリアルモニタ

通信速度

Arduino と PC の間でシリアル通信をして今の値を表示する( Arduino→PC, PC→Arduino の両方が出来る ) ここに表示される

Page 46: Arduino 入門

Arduino から PC へ送信void setup(){

Serial.begin(9600);}

void loop(){

Serial.println(analogRead(A0));delay(1000);

}

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

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

引数を人に読める形で表示して改行する

引数はアナログ入力の値

ほかにも表示形式がある。リファレンスマニュアル参照のこと。

Page 47: Arduino 入門

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

}

Page 48: Arduino 入門

明るくなると点滅が速くなる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段階で点滅の間隔が変わる

もっと細かくするには?

Page 49: Arduino 入門

明るくなると点滅が速くなる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] の間隔で点滅

Page 50: Arduino 入門

明るくなると点滅が速くなる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;

Page 51: Arduino 入門

過去を覚えておくconst int LEDpin=13;int oA0 ;

void setup(){

pinMode(LEDpin, OUTPUT);oA0 = analogRead(A0);

}

void loop(){

int a = analogRead(A0);

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

}digitalWrite(LEDpin, LOW);delay(100);

oA0 = a;}

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

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

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

Page 52: Arduino 入門

平均値をとる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 ループを使うことも多い

Page 53: Arduino 入門

関数

millis 関数:リセットからの経過時間 [ms]数学関数 : abs, sin, cos, tan, log などが使える

角度の単位はラジアン、 log の底は e乱数 : random, randomSeed

最初に一回 randomSeed で初期化あとは random を使う

ほかにも関数がある。制約や注意事項も含めリファレンスマニュアル参照のこと。

Page 54: Arduino 入門

乱数を使う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 に入る

Page 55: Arduino 入門

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];

Page 56: Arduino 入門

サーボライブラリ• ラジコンサーボを扱う• スケッチの先頭に次の 1 行が必要

#include <Servo.h>• 使いたいサーボの数だけ宣言が必要

Servo s1, s2;

• attach でピンを指定するs1.attach(2);s2.attach(3);

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

制約や注意事項も含めリファレンスマニュアル参照のこと。

Page 57: Arduino 入門

例題を動かしてみよう• 動かす前にスケッチを読んで何が起こる

か予想しよう• 少し変えて動作を確かめ、保存してみよう• Servo– Sweep– Knob

Page 58: Arduino 入門

参考リンク• 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