



Arduinoの文法

- 文章はアルファベットと数字と記号を使って書く. C言語とほぼ同様の記号が使用できる.大文字と小文字は区別される.
- 命令を区切るためにスペースを利用する.
- 文末はセミコロンで終わる.
- 文章は上から順番に実行される.
- 選択ではif文が使用できる. switch文も使用できる.
- 繰り返しではfor文が使用できる. while文も使用できる.
- コメントには// と/* */が使える. // は その行の // の後に書かれている文章がコメントになり,実行されない./* */ は/* と */の間に挟まれた文章すべてが実行されない.
- 整数型ではintが,小数型ではfloat,doubleが,文字型ではcharが使用できる.
- 関数を使用/作成することができる.使用/作成ルールはC言語と同じである(ただし,プロトタイプ宣言はいらない).
- 配列を使用することができる.
- setup関数とloop関数が必要である.
Arduinoを動作させる

LEDを点滅(抵抗なし)
下記プログラムではアナログ13ピンから電圧を5V→0V→5V→0V→...のように,5Vと0Vを1秒間隔で繰りかえし出力します.LED(発光ダイオード)を点滅させるには,LEDを基板にFig.3のように配置します.LEDの足の短い方をGND側に差し込みます.プログラムにはsetup関数とloop関数が必要です.Fig.4にArduinoを使用する際の,プログラムの構造を示します.setup関数は,Arduinoに電源を入れた(もしくはプログラムを書き換えた)ときの最初に1度だけ行われる関数です.その後は,loop関数の内容を繰り返し続けます.下記プログラムでは,setup関数内のpinMode関数で13番ピンを出力モードに設定し,その後,digitalWrite関数を使って13番ピンに出力を行っています(HIGHは5Vを,LOWは0Vを示しており,PWM信号を利用して電圧を出力しています).ハードウェアを扱いますので,実行にかかる時間を気にする必要があります.delay関数は,その間プログラムが止まります(電圧はそのまま出力されるので,下記のプログラムでは,プログラムが止まっている間一定の電圧を出力し続けています).delay関数の単位はミリ秒です.


void setup() { pinMode(13, OUTPUT); } void loop(){ digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
ブレッドボードの使い方
ここでは,回路を容易に作成するツールとして,ブレッドボードの使い方を確認します.ブレッドボードは,ソルダーレスボードとも呼ばれます.回路作成するための素子にはんだ付けすることなく,回路を作成することができます.
Fig.5にブレッドボードの外観を示します.図のようにブレッドボードには,たくさんの穴が開いてます.この穴に,電子部品についているリード線や,ジャンパ線(ジャンプワイヤ)を挿していくことで回路を作成します.それぞれの穴は,その奥に端子が組み込まれており,いくつかの穴同士がその内部でつながっています.図の赤枠で囲んである組はすべて内部でつながっています.ただし,違う赤枠同士の内部ははつながっていませんので,これを利用して回路を組み立てていきます.

抵抗のカラーコード
抵抗の表面にはカラーコードが書かれていることがあり,この色を頼りに,抵抗の大きさを判断します.今回使用する抵抗は,330Ωと10kΩです.Fig.6に今回使用する抵抗を示します.カラーコードの詳細は,下記のサイト(日本アマチュア無線連盟技術研究所)を参考にしてください.


Fig.6 抵抗
LEDを点滅(抵抗あり)
「LEDを点滅(抵抗なし)」の項では,基板本体に直接LEDを配置しましたが,本来は適切な大きさの抵抗を配置し,過度に大きな電流が流れないようにする必要があります.ブレッドボードと抵抗を使って,Fig.7のような回路を組み立ててください.この回路では,3番ピンから出力しますので,Arduinoに書き込むプログラムを下記のように変更してください.
void setup() { pinMode(3, OUTPUT); } void loop(){ digitalWrite(3, HIGH); delay(1000); digitalWrite(3, LOW); delay(1000); }

Fig.7 LEDを点灯させる(抵抗あり)
センサの値を使ってLEDを点灯
センサの値をアナログ入力を使って,取得します.取得した値の大きさに応じて,LEDの光量を変更させます.センサとして,CdSセルを利用します(No.1の袋に入っています).CdSセルは,センサに入る光量によって出力する電圧が変化するセンサです.以下にプログラムを示します.コメント文は書く必要がありません.回路は,Fig.8(a)のように組み立て,変化した電圧値をアナログ入力から取得します.実際は,この回路を実現するために,ブレッドボードを利用し,Fig.8(b)のように組み立てます.変数valueは,グローバル変数として定義させています.analogRead関数を使って,変数valueにアナログ0番ピンの値を代入しています.
int value = 0; //入力値の変数を用意し,0に設定 void setup(){ pinMode(3, OUTPUT); } void loop(){ //ANALOG INの0番ピンを読み取りvalueに代入 value = analogRead(0); //アナログ出力(PWM)の3番ピンを出力とし //valueを4で割った値を入れる analogWrite(3, value/4); delay(100); //100mse = 0.1秒ループにする }

(a)配線

(b)ブレッドボードを利用 Fig.8 CdSセンサを利用する
いろいろなセンサを使ってみる

赤外線センサ
赤外線センサを利用して距離を計測することができます.回路はFig.9を参考にしてください.コンデンサは,足が長い方がプラス(赤のケーブルとつなぐ)です.

超音波センサ
超音波センサを利用して距離を計測することができます.回路はFig.10を参考にしてください.

接触位置センサ
接触位置センサを利用して直線上で触れた位置を計測することができます.回路はFig.11を参考にしてください.

感圧センサ
感圧センサを利用してセンサにかかる圧力を計測することができます.回路はFig.12を参考にしてください.

曲げセンサ
曲げセンサを利用して曲がり具合を計測することができます.今回使用するセンサでは,片方向の曲げを測定できます.回路はFig.13を参考にしてください.

傾きセンサ
傾きセンサを利用して傾きを計測することができます.回路はFig.14を参考にしてください.

温度センサ
温度センサを利用して温度を計測することができます.回路はFig.15を参考にしてください. 接続を間違えると,センサが破損するので十分注意すること.

シリアルモニタでセンサの値を観察する
計測した値を観察するために,シリアル通信を利用するプログラムを示します. 以下のプログラムでは,A0番ピンからセンサの値を取得し,通信しています.Serial.begin(9600);で速度9600bpsでシリアル通信を開始します.Serial.println(val);でセンサで取得したデジタル値をシリアル通信で送信しています(ここでは,valは0から255の値です). 取得するセンサの種類は問いませんが,前節を参考に,赤外線センサを利用してみましょう.送信した値はArduino IDEのシリアルモニタという機能で観察することができます(「upload」の近くにあるボタンです).プログラム書き込み後,シリアルモニタで値を観察してみましょう.
int val; //読み取り値の変数を用意 void setup(){ Serial.begin(9600); } void loop(){ //アナログ入力0番ピンの値を読み取り(0~1023) //4で割った値を変数valに入れる(0~255) val = analogRead(0)/4; //LED点灯 analogWrite(3, val); //シリアルでvalを送信(BYTEフォーマット) Serial.println(val); delay(100); }
シリアル通信を行う

シリアル通信(送信)1
以下に,Arduinoを利用してシリアル通信(送信)を行うプログラムを示します.実験では,「Arduinoでシリアル通信(送信)を実行する(プログラムを書き込む)」→「Processingでシリアル通信(送信)を実行する」の順番で実行します.以下のプログラムでは,A0番ピンからセンサの値を取得し,通信しています.Serial.begin(9600);で速度9600bpsでシリアル通信を開始します.Serial.write(val);でセンサで取得したデジタル値をシリアル通信で送信しています(ここでは,valは0から255の値です).取得するセンサの種類は問いません.前節を参考に,赤外線センサなどを利用してみましょう.
int val; //読み取り値の変数を用意 void setup(){ Serial.begin(9600); } void loop(){ //アナログ入力0番ピンの値を読み取り(0~1023) //4で割った値を変数valに入れる(0~255) val = analogRead(0)/4; //valを4で割った値を入れる analogWrite(3, val); //シリアルでvalを送信(BYTEフォーマット) Serial.write(val); delay(100); }
シリアル通信(送信)2
以下に,Arduinoを利用して2個の値を送信するプログラムを示します.2個の値を送信するために,Serial.write()関数を2回使います.下のプログラムでは,アナログピンを使って2個のセンサ値を獲得し,その2個の値を送信しています.1個目の値はA0ピンを,2個目の値はA1ピンを使用しています.それぞれのセンサに5Vの電源とGNDが必要であることに注意して配線を組み立ててください.Processing側のプログラムは,Processingの項目「シリアル通信(受信)3」を参考にしてください.
int val; //読み取り値の変数を用意 int val2; void setup(){ Serial.begin(9600); } void loop(){ val = analogRead(0)/4; // 0番ピン val2 = analogRead(1)/4; // 1番ピン //シリアルでvalを送信(BYTEフォーマット) Serial.write(val); Serial.write(val2); delay(100); }
参考文献

- M. Banzi, (船田巧 訳), "Arduinoをはじめよう", オライリージャパン, 2009.
- 小林茂, "Prototyping Lab", オライリージャパン, 2010.
- 田原淳一郎, "Arduinoで始める電子工作", カットシステム, 2010.
- 建築発明工作ゼミ2008, http://kousaku-kousaku.blogspot.jp/2008/07/arduino.html .
