Comments
Description
Transcript
テキスト
Arduinoをはじめよう オープンソースハードウェア入門 ~ Arduino(アルドゥイーノ)始めてみませんか? A’ワーク創造館 共立電子産業株式会社 株式会社チアーズ ■Arduino とは・・・ Arduino(アルドゥイーノ)は、AVRマイコン、入出力ポートを備えた基板、 C++ 言語風のArduino言語とそれの統合開発環境から構成されるシステム。 Arduinoはスタンドアロン型のインタラクティブデバイス開発だけでなく、ホス トコンピュータ上のソフトウェア(例えば、Adobe Flash、Processing、Max/ MSP、PureData、SuperCollider)で制御することもできる。 組み立て済みの基板を購入することもできるが、オープンソースハードウェ アであり、ハードウェア設計情報のEAGLEファイルは無料で公開されており、 誰でも自分の手で Arduino を組み立てることができる。 http://arduino.cc/ Arduinoプロジェクトは2005年にイタリアで始まり、当時入手可能であった他 の学生向けのロボット製造用コントロールデバイスよりも安価なプロトタイピ ング・システムを製造することを目的にスタートした。 設計グループは多くの競合製品よりも遥かに安価で簡単に使用できるプラッ トフォームの開発に成功した。 Arduinoボードは、2008年10月までに5万ユニット以上が、2011年2月で約 15万台販売されている。 Arduinoプロジェクトは2006年度のアルス・エレクトロニカ賞において名誉言 及を受けている。 wikipediaより Arduino(マイコンボード)とは簡単に言えば「電気を流すor電気を流さない」 「ON・OFF」をすごく早いスピードで制御する事が出来るボードです。 この「ON・OFF」というのはPCやiPhoneなどデジタル機器ではすべての基 本となる技術となっており、どんなに高度なスマホやスーパーコンピューター でも「スイッチをただON・OFF しているだけ」とも言えます。 ちょっと難しい話になってきたので現実的な話を。 Arduinoはyoutubeに掲載されているようなかなり高度な実用的な作品など を作る事も出来ますが、「千里の道も一歩から」ということわざ通り、今回は プログラムで言う所の「Hello World」にあたるLEDチカチカ( 通称Lチカ) から スタートしましょう。 まずはソフトウェアのインストールを行います。 http://arduino.cc/en/Main/Softwareを開き、お使いのPCに適したソフトを ダウンロードして下さい。 ダウンロードが完了しましたらデスクトップに解凍して下さい。 インストールが完了しましたらソフトを立ち上げてみましょう。 環境が整いましたのでプログラミング&回路作成を開始します。 部品の説明 • 抵抗 用途としては電気信号を流れにくくする部品です。単位はオーム(Ω) で表します。値が大きいほど電気が流れにくくなります。 • LED 最近は照明などにも使用されるようになった発光素子です。 発光させるには足が長い方を(+)短い方を(−)の電極と接続 させます。 • タクトスイッチ 電子工作で使用する一般的なスイッチです。 押している間「ON」になり離すと「OFF」になります。 • マルチカラーLED この一つのLEDの中に3個のLED(赤・青・緑)のLEDが入ってい ます。足の配置は一番足の長い端子を左から2番目にした状態で 左から「赤・−端子・青・緑」の順番になっています。(逆に+端子が共 通になっているLEDもあります) • 温度センサー 3本の足は左から電源の(+)・センサーアウト・電源の(-)という足配 置になっています。センサーはICの中に入っておりこのICだけで温 度のデータを取得することが出来ます。 LESSON1 Lチカ(LEDチカチカ) 通常電子回路を構築する場合は下記のようなユニバーサル基板と言われる 基板の上に部品をはんだ付けして作っていくのですが、基板の場合は一度 はんだ付けをすると修正が大変です。(やけども怖い・・・) そこで、今回は「ブレッドボード」という簡単に回路が構成出来る便利アイテム を使って電子回路を作っていきます。 ブレッドボードは下記の通りの部分がすべて繋がっており、部品を刺すだけで 回路が構築出来るので、今後の為にも使い方を覚えておいて下さい。 では、下記の図通りに配線していって下さい。 ブレッドボード ユニバーサル基板 Arduinoの13番ピンには1KΩの抵抗があらかじめ入っているので、直接つな ぐこともできますが、別の回路を取り付けることも考慮してブレッドボードを経 由して接続します。 図1 Lチカ つぎに、プログラムを入力していきます。 空白部分に次ページに書かれている呪文の ような文章を書き込んでいって下さい。 (解説は後ほど行います) 書き込みが終わりましたら左上の「検証」 のボタンを押して下さい。 動かない場合は「プログラムミス」もしくは 「シリアルポート設定ミス」のどちらかです。 下の黒色部分に赤い文字でエラーメッセージ が出た方は講師まで連絡お願いします。 // LESSON1:Lチカ(LEDチカチカ) // とりあえずLED をピカピカしてみましょう #define LED 13 // LED をデジタル13 ピンに接続 void setup() { pinMode(LED,OUTPUT); // デジタルピンを出力に設定 } void loop() { digitalWrite(LED, HIGH); // LED 点灯 delay(500); // 0.5秒維持 digitalWrite(LED, LOW); // LED を消す delay(500); // 0.5秒維持 } 簡単にプログラムを説明。 void setup() この中にArduinoがどんな風に動くべきなのか、ピンはどういう風に機能す べきなのかを宣言していきます。 void loop() 繰り返し実行する事を書いていきます。 この中に書いた内容をArduinoは電源を切るまでひたすら繰り返します。 どんなに難しい事をやっていてもArduinoのプログラムは大きく分けてこの二 つの中になにを入れるかで決まります。 // の後ろに書いてある言葉は「コメント」と言いプログラムには関係無い、プ ログラムの解説を書いていきます。ささっとプログラム書きたい時はコメント を書かない事もありますが、後で見た時に「あれ?これ何のプログラムだ?」 となる事があるので、プログラムを書く際はコメント書く事をオススメします。 では、次に簡単な応用問題。 LED 点灯2 秒 ↓ LED 消灯2 秒 ↓ LED 点灯1 秒 ↓ LED 消灯1 秒 が続くプログラムを作ってみましょう。 出来た方を 押してプログラムを保存しておきましょう。 LESSON2 タクトスイッチでLEDのON/OFF制御 次にタクトスイッチを使って、LEDをON/OFFしてみましょう。 「押している間点灯」ということを試します。 タクトスイッチが押されている状態を検知して制御します。 長 図2 タクトスイッチでLED制御 // LESSON2:タクトスイッチでLEDのON/OFF制御 // スイッチを押している間点灯 #define LED 13 //LED が接続されたピン #define SW 2 //スイッチが接続されたピン int swState = LOW; //スイッチの状態を保持する変数 void setup(){ pinMode(LED,OUTPUT); //LED が接続されたピンを出力に設定 pinMode(SW,INPUT); //スイッチが接続されたピンを入力に設定 } void loop(){ swState = digitalRead(SW); //スイッチの状態を取得 if(swState==HIGH){ //スイッチが押されていたら digitalWrite(LED,HIGH); //点灯に設定 }else{ //それ以外だったら(押されていなかったら) digitalWrite(LED,LOW); //消灯に設定 } } if文(条件文)の説明をします。 if(swState==HIGH){ digitalWrite(LED,HIGH); }else{ digitalWrite(LED,LOW); } という処理が出てきました。 if(条件){ 条件が成立しているときの処理 }else{ その他の条件のときの処理 } という意味になります。 If文の条件で、「同じ場合」という条件を表現したい場合は、「==」を使います。 「同じではない場合」という条件を表現したい場合は、「!=」を使います。 次にタクトスイッチを押すたびに、LEDのON/OFFが切り替わるプログラムを 考えてみてください。 1.タクトスイッチを押して離す ↓ 2.LED点灯 ↓ 3.タクトスイッチを押して離す ↓ 4.LED消灯 ↓ ※1に戻る LESSON3 PMW(パルス幅変調)でのLED制御 次はLEDをじんわり明るくしたり、じんわり暗くするプログラムを作成してみま す。 このじんわりなLED制御にはPWM(パルス幅変調)制御という方式でコント ロールしていきます。 Arduinoのアナログ出力は、PWMを使った擬似的なアナログ出力です。 デジタルピンの3、5、6、9、10、11番をアナログ出力用のピンとして利用でき ます。 長 図3 PWM出力 // LESSON3:PWM(パルス幅変調)でのLED制御 //PWM でLED をじんわりじんわり #define LED 9 //LED が接続されたピン int i = 0; // カウント用 void setup(){ pinMode(LED, OUTPUT); // LED のピンの出力に設定 } void loop(){ for (i = 0; i < 255; i ++) { //0 から254 までループ analogWrite(LED, i); //LED の明るさをセット delay(10); //10 ミリ秒停止 } for(i = 255; i > 0; i--) { // 255 から1 まで analogWrite(LED, i); delay(10); } } ここで一番難しい部分はfor文(ループ文)だと思います。 for (i=0 ; i<255; i++) {}を例とします。 「i=0」 ループカウンタの初期値を設定 「i<255」 ループ条件の設定 ※この条件が成立している間はずっと繰り返す ※i<=255 「=」を付けるとi=266になった場合にループから抜けます。 「i++」 ループ毎のループカウンタの増減設定 ※1づつ足したい場合、 i++ (i=i+1でも同じ意味) ※1づつ引きたい場合、 i-- (i=i-1でも同じ意味) ※2づつ足したい場合、i=i+2 という事を表しています。 前ページまでのプログラムを見て、何を条件にループを回して、 どういう条件になったらループから抜けて次の処理に移るプログラムを 書こうとしているか、把握してください。 この値を変えてループ文を増やしていけばランダムに光るLEDが完成します。 LESSON4 温度センサーの信号をPCに表示させる LM35「温度センサーIC」の回路を作り温度を計測します。 図4 温度計測回路 //Lesson4 温度センサーの信号をPCに表示させる float temp; int tempPin = 0; void setup() { Serial.begin(9600); } void loop() { temp = analogRead(tempPin); temp = (5.0 * temp * 100.0)/1024.0; Serial.print("TEMPRATURE = "); Serial.print(temp); Serial.println("度"); delay(1000); } LM35はICの内部の温度センサーが内蔵されています。 3本の足は左から「電源のプラス側」「温度によって電圧が変化する出力端 子」「電源のマイナス」という構成になっています。 ■シリアルモニタ 各種センサーからどのような値を取得できているか確認するために、シリア ルモニタを使用します。 プログラムのデバッグ用にも使いますのでしっかり覚えてください。 PC上のArduinoIDE(開発環境)とArduinoボードをシリアルポートでつない でプログラムを書き込んでいるのですが、同じ経路を利用して、 Arduino ボード側で取得した値をPC上に表示させます。 // PC上で設定したシリアル通信の速度を指定します。 Serial.begin(9600); // シリアルモニタに文章(テキスト)を表示させます。 Serial.print("TEMPRATURE = "); // シリアルモニタに値を表示させます。 Serial.print(temp); // 最後に改行を入れて表示させます。 Serial.println("度"); ※「Serial.println」と「 Serial.print」は、改行があるかないかだけの違いです。 組み合わせてわかりやすくシリアルモニタに表示させてください。 LESSON5 マルチカラーLEDコントロール LEDにはかならず抵抗を入れて下さい。抵抗を入れないと最悪LEDが破壊 されてしまう可能性があります。 図5 マルチカラーLEDコントロール回路 void setup() { pinMode( 9,OUTPUT) ; // 赤LED接続のピン(9番)をデジタル出力に設定 pinMode(10,OUTPUT) ; // 青LED接続のピン(10番)をデジタル出力に設定 pinMode(11,OUTPUT) ; // 緑LED接続のピン(11番)をデジタル出力に設定 digitalWrite( 9,LOW) ; digitalWrite(10,LOW) ; digitalWrite(11,LOW) ; } void loop() { digitalWrite( 9,HIGH) ; // 赤LEDを点灯 digitalWrite(10,LOW) ; delay(300) ; digitalWrite(11,HIGH) ; // 緑LEDを点灯 digitalWrite( 9,LOW) ; delay(300) ; digitalWrite(10,HIGH) ; // 青LEDを点灯 digitalWrite(11,LOW) ; delay(300) ; } Lesson1のLEDが3つ増えた回路&プログラムになるので各LEDを順に光ら せることが出来ました。 しかし、紫やオレンジなど中間色を出す為には各LEDを同時に点灯させるこ とが必要です。その為に次のプログラムが必要になります。 void setup() { } void loop() { int H ; int R , G , B ; /* HSVのH値を0-360で回します */ for (H=0 ; H<=360 ; H++) { /* HSVのH値を各LEDのアナログ出力値(0-255)に変換する処理 */ if (H <= 120) { /* H値(0-120) 赤-黄-緑 */ R = map(H,0,120,255,0) ; // 赤LED R←→G G = map(H,0,120,0,255) ; // 緑LED G←→R B=0; } else if (H <= 240) { /* H値(120-240) 緑-水色-青 */ //次のページへ G = map(H,120,240,255,0) ; // 緑LED G←→B B = map(H,120,240,0,255) ; // 青LED B←→G R=0; } else { /* H値(240-360) 青-紫-赤 */ B = map(H,240,360,255,0) ; // 青LED B←→R R = map(H,240,360,0,255) ; // 青LED R←→B G= 0 ; } /* RGBLEDに出力する処理 */ analogWrite(9,R) ; // 9番ピンから赤LEDの出力 analogWrite(11,G) ; // 11番ピンから緑LEDの出力 analogWrite(10,B) ; // 10番ピンから青LEDの出力 delay(100) ; } } LESSON6 温度センサーとマルチカラーLEDを 組み合わせて温度によってLEDの色 が変化する照明を作る LEDの色によって抵抗の値が違います。 間違えた場合最悪LEDが破壊されることもありますので注意して回路を作っ て下さい。 図6 温度センサー&マルチLED回路 float tempC; int tempPin = 0; int redPin = 9; int greenPin = 11; int bluePin = 10; int blueTemp = 0; int greenTemp = 0; int redTemp = 0; void setup() { Serial.begin(9600); //opens serial port, sets data rate to 9600 bps } void loop() { tempC = analogRead(tempPin); tempC = (5.0 * tempC * 100.0)/1024.0; Serial.println((byte)tempC); // 次ページへ if(tempC<0){ analogWrite(bluePin, 255); }else if(tempC>0&&tempC<=15){ blueTemp= map(tempC, 0, 15, 255, 0); Serial.print("blueTemp1="); Serial.println(blueTemp); analogWrite(bluePin, blueTemp); }else if(tempC>15){ analogWrite(bluePin, 0); Serial.println("blueTemp2=0"); } if(tempC<5){ analogWrite(greenPin, 0); }else if(tempC>5&&tempC<=10){ greenTemp = map(tempC, 5, 10, 1, 254); Serial.print("greenTemp1="); Serial.println(greenTemp); analogWrite(greenPin, greenTemp); //次ページへ }else if(tempC>10&&tempC<=30){ greenTemp = map(tempC, 10, 30, 255, 0); Serial.print("greenTemp2="); Serial.println(greenTemp); analogWrite(greenPin, greenTemp); }else if(tempC>30){ analogWrite(greenPin, 0); Serial.println("greenTemp3=0"); } if(tempC<15){ analogWrite(redPin, 0); }else if(tempC>=15){ redTemp= map(tempC, 15, 35, 1, 255); Serial.print("redTemp1="); Serial.println(redTemp); analogWrite(redPin, redTemp); }else if(tempC>35){ analogWrite(redPin, 255); Serial.println("redTemp2=255"); } delay(200); } LED を光らすだけの場合と違い、動くモノを作るという事は本当は結構大変 なことです。 しかし、ライブラリが充実しているArduino は、「こんなものを作りたいな」と 漠然としたものを作る時にかなり便利です。 また、自分がひらめいた「作りたいなという作品」は大体先人が同じような物 を考え作っている場合が多々あります。 ということは、最初からプログラムを構築するのでは無く、なにか作る前に ネットで検索→同じようなものを二つ三つ見つけ、それをうまく合わせて自分 なりの作品を作る方がゴールが近くなります。 販売できる製品レベルのモノをいきなり作ろうとすると難しいですが、プロトタ イプレベルであれば、割りと簡単に作れる環境が整ってきています。 「こんなモノがあったらいいな」と思うことがあれば、ぜひチャレンジしてみてく ださい。 あなたもすでにメーカーズの一員です! Arduino 関連のサイトは多くなったと言ってもまだまだ日本語の情報は少な いです。 英語サイトも色々漁ってみて下さい。 とこんな感じに簡単にマイコンを使って色々なものを作る事が出来ます。 C言語初めての方は大変だったかもしれませんが、C言語は現代のプログラ ムでは基本言語となっており、勉強しておくと役に立つ事が多々ありますの で、ぜひC言語も勉強してみて下さい。 Arduino 日本語リファレンスはこちら http://www.musashinodenpa.com/arduino/ref/ 本日はありがとうございました。 ここからは時間が残れば自由時間とします。 赤外線センサーや基板など色々パーツはありますので、ネットや本で回路& プログラムを探したり、自由にArduinoで遊んでみて下さい。 【参考】タクトスイッチを押すたびに、LEDのON/OFFが切り替わるプログラム #define LED 13 #define SW 2 int swState = LOW; int ledState = LOW; void setup(){ pinMode(LED, OUTPUT); pinMode(SW, INPUT); } void loop(){ swState = digitalRead(SW); delay(100); if(swState==HIGH){ ledState = !ledState; swState = LOW; } if(ledState==HIGH){ digitalWrite(LED, HIGH); }else{ digitalWrite(LED, LOW); } }