Arduino(アルドゥイーノ)とは,マイコン(AVRマイコン),入出力ポートを備えた基板から構成されるシステムです.Arduino言語を使って利用します.プログラムソース(ArduinoやProcessingではプログラムのソースのことを「スケッチ」と言うことがあります)をパソコン上で開発し,USBケーブルを介して書き込みます.USBを介してパソコンから給電できる他,電池など外部電源を利用してArduino単体で動作させることも可能です.Arduino言語の関数の詳細は,下記サイトを参考にしてください.英語サイトでは,Arduinoを使う際のドライバなどがダウンロードできます. Arduino基板
Arduino基板の外観をFig.1に示します.大きく分けて,デジタル出力ピン,アナログ入力ピン,電源部の3つのパートからなります.デジタル出力ピンの中には,PWM信号を用いて電圧の大きさを0~5Vの範囲で変更できる機能を持っているピンもあります(3番ピン,13番ピンなど数字の後に~が書かれているピンです).電源部にはGNDがある他,5V,3.3Vなどを出力することができます(今回は,センサに対する電源として5Vを利用します.多くの市販のセンサでは,5Vや12Vで動作するように設計されています).ArduinoのマイコンにはUSBケーブルを介してプログラムを書き込みます.Arduino本体には,USBを介してパソコンから給電できるので,今回はこれを利用します.USBケーブルを介してパソコンと通信(シリアル通信)することも可能です.
Arduinoは,Fig.2のエディタを利用して作成します(少しバージョンが古いですが授業ではこれを使います).プログラムのソースは,エディット領域に打ち込みます.エディタにプログラムを入力後,verifyボタンを押すことでスケッチの文法をチェックします.プログラムに文法的な間違いがあればエラーとその内容が,エディタ領域の下,コンソールの上の部分に表示されます.ソースを確認後,パソコンとArduino本体をUSBケーブルでつなぎ,uploadボタンを押すことで,ソースの内容をArduinoに書き込むことができます.書き込みがうまくいけば,Arduinoがスケッチ通りに動作します.
Arduinoの文法
Arduinoの文法は,C言語の文法に似ています.以下に,主な規則を列挙します.
- 文章はアルファベットと数字と記号を使って書く. C言語とほぼ同様の記号が使用できる.大文字と小文字は区別される.
- 命令を区切るためにスペースを利用する.
- 文末はセミコロンで終わる.
- 文章は上から順番に実行される.
- 選択ではif文が使用できる. switch文も使用できる.
- 繰り返しではfor文が使用できる. while文も使用できる.
- コメントには// と/* */が使える. // は その行の // の後に書かれている文章がコメントになり,実行されない./* */ は/* と */の間に挟まれた文章すべてが実行されない.
- 整数型ではintが,小数型ではfloat,doubleが,文字型ではcharが使用できる.
- 関数を使用/作成することができる.使用/作成ルールはC言語と同じである(ただし,プロトタイプ宣言はいらない).
- 配列を使用することができる.
- setup関数とloop関数が必要である.
Arduinoを動作させる
ここでは,Arduinoの基本動作を確認します.PWM信号を利用した出力およびアナログ入力の例を示します.また,回路を容易に作成するツールとして,ブレッドボードの使い方,抵抗のカラーコードを確認します.
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センサを利用する
いろいろなセンサを使ってみる
「センサの値を使ってLEDを点灯」のプログラムを使って,いろいろなセンサの値を取得してみましょう.書き込むプログラムは変更する必要がありません(本当は取得するセンサの電圧によって少々書き直した方が正確ですが,ここでは,どのようなセンサがあるかに重点を置きます).
赤外線センサ
赤外線センサを利用して距離を計測することができます.回路は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); }
シリアル通信を行う
ここでは,Arduinoを使用してシリアル通信を行います.給電に使用しているUSBを通信線として利用して,通信を行います.
シリアル通信(送信)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 .