Arduino 入門
-
Upload
mitunaga -
Category
Technology
-
view
134.417 -
download
1
description
Transcript of Arduino 入門
Arduino 入門
光永 法明http://n.mtng.org/ele/arduino/
• 本資料は講義等のために筆者が作成したものに加筆修正したものです。
• 誤り、改良点があればお知らせください。
• 著作権は放棄しませんが、個人での利用や、学校(授業・地域向けイベント)や社内、自分たちで実施する勉強会で使うのはご自由にどうぞ。
• 有料の講習会等の場合の利用は別途ご相談ください。有料の講習会を実施する方には、本資料の内容ぐらいは自分で作成いただきたいので。
2014/1/19 版
最初の一歩• 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…ATmega168を選択する(使っている物に合わせる)
ボードを変えなければPC につき 1 回すれば OK
ツール→シリアルポートの中の適切なものを選択する(おおよそ番号の一番大きいものでよい)
Upload をクリッククリックするとスケッチのコンパイルが始まる。コンパイルが終わると転送が始まり、Arduino の TX, RX のLED が点滅する。点滅が終了するとArduino がリセットされスケッチが動く。
エラーの場合はボード、シリアルポート、スケッチを確認する。
今動かしたスケッチを読もう• Blink サンプルのスケッチを読んでみま
しょう• そのための解説をします
Arduino 言語のお約束• 基本的には、マイコンへの命令が並んで
います。• マイコンは一文ずつ順に命令を実行します。• 一文の終わり(。)は;です• 右の部分は次のように読みます
digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000);
led ピンを HIGH にせよ。1000ms(1 秒 ) 待て。led ピンを LOW にせよ。1000ms(1 秒 ) 待て。
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 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 スケッチ
ここまでのまとめ• 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=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 真
定数• 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 が成り立っているので、繰り返す。結果として 1000ms×10 回待つ。
if 文if(条件式 )式A;else式B;
• 条件式が成り立つ (真 ) なら式A を成り立たない (偽 ) なら式B を実行する
• else から先を省略してもいい例 )
if (digitalRead(2) == LOW)digitalWrite(13, HIGH);elsedigitalWrite(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, 圧電スピーカ
digitalWrite() やanalogWrite() を使う
tone() を使う
デジタル /PWM出力の増幅例例:トランジスタ、トランジスタ+リレー、FET による、モータや他の回路の電源の制御
digitalWrite() やanalogWrite() を使う
digitalWrite() を使う
digitalWrite() やanalogWrite() を使う
digitalWrite() を使う
トランジスタ+リレー MOS FET+リレー
トランジスタでモータ MOS FET でモータ
デジタル /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]) の使用例~抵抗値が変化するセンサ~
例: CdS, 照度センサ , サーミスタ analogRead() を使う
例題を動かしてみよう• 動かす前にスケッチを読んで何が起こるか予想
しよう• 少し変えて動作を確かめ、保存してみよう• 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);
elsedigitalWrite(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);}
void loop(){
Serial.println(analogRead(A0));delay(1000);
}
通信速度、単位は bps (bit per second)9600, 19200, 38400, 115200 など数値が大きいほど速い。シリアルモニタの設定をこれにあわせること。
シリアル通信に関係するもの(シリアルライブラリ)にはつく
引数を人に読める形で表示して改行する
引数はアナログ入力の値
ほかにも表示形式がある。リファレンスマニュアル参照のこと。
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);
}
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 を点灯
人が通りがかったり、手をかざしたときに反応といった応用が出来る
平均値をとる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