***目次***
●配線やピン番号などの写真
●基本のプログラム骨格
●for文(繰り返し)
●関数の定義(何度も出てくるプログラムをまとめてシンプルに!)
●while文(繰り返し)
●if文(条件)
●switch case(場合分け)
●アナログ入力(電圧の読み取り)
●アナログ出力(電圧の出力)
●デジタル入出力(制御、信号受信)
●シリアル通信(PCや液晶とのデータやり取り)
●遅延(msec,usecで待つ)
●数値の型(整数や小数など)
Arduinoは電源回路、基準発振器、USBポート等が同一の基板に 載せられた、大変使いやすいマイコンボードです。 プログラムの書き換えも専用のソフトウェアで簡単に行うことができます。 今回はベーシックなArduino用のプログラム(スケッチ)を作成しました。 ページ内の検索機能で辞書代わりに使っていただければ幸いです。 注意点は文の終わりの";"と大文字と小文字を明確に区別する点です。 参考文献)ISBN978-4-87311-398-2"Arduinoをはじめよう" O'REILLY JAPAN, Massimo Banzi著, 船田 巧 訳 Amazonサイト
まず、Arduinoのボードを購入してください。アマゾン等で売っています。 おそらく、パソコンと接続するUSBケーブルも付属いています。 ソフトはarduinoの 公式ページからダウンロードできます。ソフトをインストールして USBでパソコンとArduinoボードを接続すれば動きます。
プログラムを作るときの骨格の部分です。8番ピンにLEDのアノードを接続し、 LEDのカソードと1kΩ程度の抵抗を接続し、それをグランドに落としてチェックできます。 1秒の周期でLEDを点滅させます。
void setup(){pinMode(8, OUTPUT);} //8番ピンをOUTPUT(出力)に指定。pinMode(8,OUTPUT)でも可能。 void loop() //プログラム本体(ずっと繰り返す。) { digitalWrite(LEDpin8, HIGH); // LEDpin8に5Vを出力。 delay(1000); // 1000msec待つ。 digitalWrite(LEDpin8, LOW); // LEDpin8に0Vを出力。 delay(1000); // 1000msec待つ。 }
教科書通りに書くのならば、以下のように変数LEDpinを用意すればOKです。
int LEDpin = 8; //整数の変数LEDpin8にを代入。 以後、"LEDpin"と入力すると数字の8と同じ働きをする。 void setup() { //ピンの設定などを行う void setup()。 pinMode(LEDpin, OUTPUT); //8番ピンをOUTPUT(出力)に指定。pinMode(8,OUTPUT)でも可能。 } void loop() //プログラム本体(ずっと繰り返す。) { digitalWrite(LEDpin, HIGH); // LEDpinに5 Vを出力。 delay(1000); // 1000msec待つ。 digitalWrite(LEDpin, LOW); // LEDpinに0 Vを出力。 delay(1000); // 1000msec待つ。 }
プログラムの特定部分を10回だけ繰り返したいといった場合にはFor文で記入可能です。 void loopは電源が入っている限り、反復されますのでfor文が一度終わっても、 再度読み込まれることに注意が必要です。以下の例では10回の点滅の後に、 30秒待って、void loopを1回終了し、次の回のvoid loopに入ります。
void loop() //プログラム本体(ずっと繰り返す。) { for (int i=0; i<10; i++){ //整数iを用意して0を代入。i <10となるまで繰り返す。iは1ずつ増やす(i++) digitalWrite(8, HIGH); // LEDpin8に5Vを出力。 delay(300); // 300msec待つ。 digitalWrite(8, LOW); // LEDpin8に0Vを出力。 delay(300); // 300msec待つ。 }//For 文の終わりの位置。 delay(3000); //3sec待つ。 }
void TodaYorozuLED(){ //TodaYorozuLEDという関数を作成します。 digitalWrite(8, HIGH); // LEDpin8に5Vを出力。 delay(300); // 300msec待つ。 digitalWrite(8, LOW); // LEDpin8に0Vを出力。 delay(300); // 300msec待つ。 } void loop() { for (int i=0; i<10; i++){TodaYorozuLED();} //TodaYorozuLEDをi=0からi=9まで10回繰り返す。 delay(3000); }
i++の表現が苦手な方は(私もC言語は使っていません)、 i=i+1としても良いです。
では、単純に繰り返すだけでなく、 whileを用いて特定の条件が満たされてい間はずっと 繰り返す表現を試してみます。 以下のプログラムでは kaisuuという整数を定義し、 LEDを一度点滅させるとkaisuu=kaisuu+1のように kaisuuのカウント数を1増やします。このkaisuuの 値が20よりも小さい(19まで)場合にTodaYorozuLEDを を呼び出します。ですから、以下のプログラムでは点滅は20回限りで、 電源を入れ直すか、resetボタン(Arduinoのボード上のS1)を押すまで、 何の動作もしない一回限りのプログラムとなります。 もちろんkaisuu=kaisuu+1を記述しなければkaisuuの数はずっと0のままですので、 whileのループはずっと繰り返されます。
int kaisuu=0; //kaisuuという変数を定義。 void TodaYorozuLED(){ //TodaYorozuLEDという関数。 digitalWrite(8, HIGH); // LEDpin8に5Vを出力。 delay(300); // 300msec待つ。 digitalWrite(8, LOW); // LEDpin8に0Vを出力。 delay(300); // 300msec待つ。 } void loop() { while (kaisuu < 20 ){ TodaYorozuLED(); kaisuu=kaisuu+1 } }
続いて、if文を使ってみましょう。Arduinoには analogでもdigitalでも入力を受けつけることができます。 これらの入力の状態などにより、 プログラムを動的に変化させることが可能となります。 宣言部と関数部は上と同じです。kaisuuが20より小さければ 実行します。ですから、この例でも、20回だけLEDが点灯します。
void loop() { if (kaisuu < 20 ){ TodaYorozuLED(); kaisuu=kaisuu+1 } delay(300); }
時間の扱い方も含めて、 LEDを点灯させるプログラムを書いてみます。millis();で Arduino電源on後の時間がmsec(ミリ秒)単位で返されます。 1000で割った余りを求めることで、msecの3桁目までを返し、 これが300より小さい期間のみにLEDを点灯してみます。 おおよそ、0.3秒点灯、0.7秒消灯というプログラムです。 int()は()の中を整数に変換します。 TodaYorozuLEDonはLEDをonとする関数、 TodaYorozuLEDoffはoffとする関数です。
int Jikan=0; int Jikan1keta=0; void TodaYorozuLEDon(){ //TodaYorozuLEDonで出力をhighとする。 digitalWrite(8, HIGH); // 8ピンに5Vを出力。 } void TodaYorozuLEDoff(){ //TodaYorozuLEDoffで出力をlowとする。 digitalWrite(8, LOW); // 8ピンに0Vを出力。 } void loop() { Jikan=millis(); //msec単位の時間を求める。 Jikan1keta=Jikan-int(Jikan/1000)*1000; //時間の下の3ケタのみを抽出。1000で割って整数にして、1000を掛ければ、下3桁が除去されます。元の数からこの数を引けば、下3ケタが残ります。 if (Jikan1keta<300){TodaYorozuLEDon();} //下の3ケタが300より小さい時にon。 if (Jikan1keta>=300){TodaYorozuLEDoff();} //下の3ケタが300より大きい時にoff。 }
if文は条件が一つだけですが、
分岐が複数の場合分けを行うときに使うのがswitch case文です。
基本的な構造は以下の通りです。
switch(対象とする変数){
case 値1:
実行文1
break;
case 値2:
実行文2
default:
break;
}
break;により、switch文を終了し、計算時間を節約できます。
break;が無ければ条件に適合するか否かと関係なく、case 1, case2, defaultを一回ずつ検討します。
例文を示すと以下のようになります。jikanの下3ケタが
313になった時にLEDonとして、875になった時にLEDoffとします。
defaultはどの条件にも当てはまらなかったときに実行する命令です。
無くても動きます。このプログラムでは、0-312msecでoff, 313msecから874msecまでon,
874msecから999msecまでoffを繰り返します。
1秒のうちに点灯している時間は874-312=562msecとなります。
実行結果からもわかりますが、このような単純なプログラムではloop()を一周回すのに
必要な時間は1msec以下で、毎回必ずcase 313とcase 875を検出することができます。
void loop() { Jikan=millis(); //msec単位の時間を取得 Jikan1keta=Jikan-int(Jikan/1000)*1000; //下3ケタの数字をJikan1ketaに入力。Jikan1keta=jikan % 1000でも同じでしょうか。 switch (Jikan1keta) //Jikan1ketaの値により場合分けをする。 { case 313: //Jikan1keta=313msecの時に実行。 TodaYorozuLEDon(); break; //switch文を終了して元のループに戻る。 case 875: //Jikan1keta=875msecの時に実行。 TodaYorozuLEDoff(); break; //switch文を終了して元のループに戻る。 default: //上の二つのcaseに当てはまらないときに実行。 break; } }
シリアル通信の設定も簡単です。 液晶や他の機器の制御に使用できますが、 私は主にArduinoの状態を読み取って プログラム(スケッチ)が正しく動いているかを パソコンに転送するために使っています。 上の図のシリアル通信ボタンを押すと、パソコンに 転送されたデータが表示されます。 この機能単独でADコンバーターとして使用することもできますね。
シリアル通信を行うには、Serial.begin(9600)をvoid setup()内に 記入して、シリアル送信したタイミングでSerial.print(値);を 入れます。Serial.println(値);とするとデータ表示後に改行されます。 例文は以下のアナログ入力のところで記載します。
外部の変化や使用者の命令に応じて変化する機器を作成するために、
アナログ入力は非常に重要となります。Arduinoは5 Vを10 bit (1024)分割して、0-1023として読み取ることができます。つまり、
Vinput=AnalogRead*5/1024
となります。実際にアナログ端子1(Analog IN 1)から
電圧を読み取る時にはanalogRead(1)を用います。
例文は以下の通りです。今回は、読み取った値を
シリアつ通信でUSB経由でパソコンに転送します。
int Value1=0; //整数型でValue1を定義。 long Jikan=0; //長整数型でJikanを定義 void loop() { Jikan=millis(); Value1=analogRead(1); //Analog INの0端子を読み取り。 Serial.println("Data send"); //"Data send"と表示。 Serial.println(Jikan); //JikanをPCに転送。 Serial.println(Value1); //Value1をPCに転送(改行付き)。 delay(1000); //1sec待つ }
アナログ読み取りの最高速度を求めるために 以下のプログラムを走らせてみます。
int Value1=0; //整数型でValue1を定義。 long Jikan=0; //長整数型でJikanを定義 long Kaisuu=0;//長整数型でKaisuuを定義 void loop() { Jikan=millis(); while (millis() < Jikan+1000 ){ 読み取りの時間がJikanから1000msec以内の時に繰り返す。 Value1=analogRead(1); //Analog INの1端子を読み取り。 Kaisuu++; } Serial.println("Data Number"); //"Data send"と表示。 Serial.println(Kaisuu); //JikanをPCに転送。 Kaisuu=0; }
アナログ電圧を出力するには analogWrite(pin番号,入力する変数)だけでOKです。 アナログ電圧出力が可能な端子は 3, 5, 6, 9. 10, 11に限られます。 また、入力する変数(電圧の大きさ)は 0-255(8bit)で表され、 0-5Vを256分割した値が最小分解能です。以下の例では 電圧を少しずつ上げていくことで LEDの明るさを制御したプログラムです。
void loop() { for (int i=0; i<255; i++) //{i=0から255まで変化させる。 analogWrite(9,i); //9番端子に電圧5×i/256 Vを出力 delay(20); } }
このページの冒頭から出てきましたが、デジタルの入出力は
以下のように書きます。
digitalWrite(Pin番号,HIGH);
digitalWrite(Pin番号,LOW);
A=digitalRead(Pin番号);
delay(100); //100msec待つ。 delay(1000); //1sec待つ。 delayMicroseconds(100); //100μ秒待つ。
delayMicroseconds()を使用している時間の間は millis()やmicros()といった、Arduinoがonに なってからの合計時間の計測が一時的に停止されますので 注意が必要です。
最後に変数の種類をまとめておきます。 きちんと論理が通っているのにうまくいかない、 という時には変数の型に誤りがあることが多くあります。 最後のbyte型は多数のoutputを同時に制御したりする場合に 良く扱われ(7segや液晶など)、例えばPORTD=B00101101;とすると PORTDの0,2,3,5ピンをHIGH、1,4,6,7ピンをLOWに変更します。
Arduinoの基本文法を 例文で示しました。このページの検索機能を利用してコピーしてご活用いただければ幸いです。
ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 プログラムの二次配布はご遠慮ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2009 TYK