昨日届いたArduino(右)

受け取って1時間で速攻で動作チェックした。

Wiring & Arduino

左はWiring。

Wiringは結構使った事がある。proce55ingの様に手軽に電子工作を「スケッチ」できる、難しいC言語とかを書かなくても簡単に赤外線やサーボの制御ができたりするツール。最近、avr-libcなどのよりローレベルなライブラリを読み込む事ができるようになって面白い。

ただし、16bitタイマ2つと8bitタイマ1つがWiringに占有されているので、タイマ処理(スレッドの様なもの)が使えない。また、外部入力やUSART受信など全ての割り込みが使えないので、1つのloop()メソッドの中で全てを処理しなければならなくなる。例えば、delay()で停止中にセンサからの入力があっても受け取ることができないのが弱点。ただ、そういう時はCPUを増やす(Wiring/Arudinoを2つ使う)という技でどうにかなる。

s.h.log: WiringでできることWiringタグ

Arduinoは、Wiringをベースに、マイコンや部品を人間の手で実装できる物に変えたもので、これも同じくスケッチツール。(部品が大きくてはんだづけしやすく、安い物を使っている)

性能も、できる事も全く同じで、ただしArduinoの方がピンが少ない(つまり制御できるLEDとかが少ない、まあマルチプレクサとかで工夫すればどうにでもなるが)

今学期SAをやってるインタラクションデザインの教材でもあるので、とりあえずよく使う機能を試してみた。



■動かしてみた

とりあえず、

1秒毎にUARTで w を送信し続け、LEDを点滅させる

また、UARTで受信した文字をエコーする

というのを作ってみた。

SourceCode(Arduino 0005 Alpha)

■技術的なこと

まずグローバルで変数を宣言しておく。

charled=13;//基盤上LED

booleanled_state=true;//on/off

charrecvData;//シリアルで受信した変数

みんな16bitのint使いたがるけど、俺は節約家なので8bitのcharにする。8bit以上のレジスタはADCのインプット値ぐらいしかないので。

setup()メソッドの中身は、グローバルの変数宣言の次に、一回だけ実行される。

voidsetup()

{

pinMode(led,OUTPUT);

Serial.begin(9600);

}

LEDのピン13は基盤上に実装されたチップLEDにつながっている。このピン13を出力方向に向ける。これは良くデバッグに使う。

loop()の中身は、setup()の次に実行される。ずっとループして繰り返し実行される。

voidloop()

{

while(Serial.available()){

recvData=Serial.read();

Serial.print(recvData);

}

Serial.println(“w”);

digitalWrite(led,led_state=!led_state);//LEDピコピコ



delay(1000);

}

■さらに動かしてみた

0.1秒毎に ADC0 の値をシリアル通信で送る

4で割って、10bitを8bitにする

というのを作った。

SourceCode(Arduino 0005 Alpha)

■さらに技術的なこと

AD変換でアナログ値を取って、シリアル通信で送る。多くのセンサーがアナログ値をマイコンに出力してくれるので、これを覚えておくと色々できる。

いくつかはアンプを通さないと電圧が弱くて駄目だけど、加速度センサ ACA302距離センサ GP2D12などはアンプが内蔵されているのでそのまま簡単に使える。

というわけでAD変換のコード解説

グローバル変数宣言

intad;

AD値は10bitで返ってくるので、intで受け取ろう。

シリアル通信は普通の速度で。

voidsetup()

{

Serial.begin(9600);

}

ADC 0ピンから読んで、変数に格納する。

voidloop()

{

ad=analogRead(0);

Serial.println(ad/4);

delay(100);

}

ただし、シリアル通信で送信できるのは8bitまで。AD値は10bit。

なので、そのままSerial.print()してしまうと上位2bitが飛んで変な値になる。

こういう時は

・上位2bit/下位8bitを2回に分けて送信し、PC側で連結する

・マイコン側で、AD値が0~50の時は’a’を送る/51~100の時は’b’を送るの様に、プロトコルを決める

・Stringにして送信して、PC側で数値に直す

・4で割ると、10bitの最大値1023が8bitの最大値255に納まる。ただし精度は4分の1になる

のどれかで対処する。