ここでは,Arduinoを使ってサーボのコントロールおよびセンサからの情報取得を行うプログラム作成を行う.
特別な電気・電子回路を使わず,サーボやセンサをArduinoで扱う演習である.特にサーボに関しては,Servoライブラリが規定されており,サーボに関する知識すらほとんど必要とせず動かすことができる.
Arduinoで重要な関数は以下の二つである.
setup
初期化用関数.一回のみ実行.
loop
実行関数.Arduinoの電源が入っている間,ずっと実行されっぱなし.
Arduino開発環境では上記のふたつの関数をいじることになるが,普通のC言語で全体像をイメージすると以下のようになるのではないかと思われる.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* Arduinoプログラムの倉重のイメージ *
* Arduinoの電源が入った瞬間から,現在 *
* アップロードされているプログラムが *
* 開始し,実行されつづける. *
* *
* イメージなので,setup, loopの定義が *
* ないとか細かいところはスルーで */
/* メインファイル ex. main.c */
#include <stdio.h>
int main(){
/* 各種初期化用関数 */
setup();
while(1){
/* 実行関数 */
loop();
}
return 0;
}
/* ユーザファイル ex. usr.c */
/* ここがarduino開発環境でいじるところ */
void setup(){
}
void loop(){
}
|
その他の詳しい言語リファレンスは, Arduino Language Reference を参考のこと.
Servoライブラリに関しては, Arduino Servo library を参照すること.簡単な概要は以下の通りである.
一度に扱えるサーボ数は
Servoライブラリを使用すると 9番ピンと10番ピンでanalogWrite()(PWM)が使用できない.Megaの場合,11個までなら制限はないが,12個から23個のモータを使用すると 11番ピンと12番ピンで PWMが使用できなくなる.
サーボは信号線・電源線・グランド線の3種類の線を持っている.一般に,それらの線は以下の組み合わせが多い.
信号線
黄色 or オレンジ or 白
電源
赤
グランド
黒 or 茶
最も簡単な接続は,信号線をArduinoの出力ポートに,電源線をArduinoの5Vポートに,グランド線をArduinoのGNDポートに接続する.ただし,Arduinoが扱える電力に限りがあるので,電源線は外部から取るのが望ましい.その場合,グランドはArduinoと外部で共通化する必要がある.
Arduino Servo library ex-Sweep を参考に接続,プログラム作成を行い,サーボを動かしてみる.
Arduino自体にはディスプレイがないため取得したセンサ値を確認することができない.そこで,センサ値に合わせてサーボを動作させることで取得したセンサ値の確認を行う.
一般にセンサには,サーボと同様に信号線・電源線・グランド線の3種類の線を持っている.センサは読み取った値を電圧値として信号線に出力する.よってArduinoで信号を読み取る場合,信号線をアナログ入力ポートに,その電源・グランド線をサーボと同様に接続し,アナログポートの値を取得することとなる.
それぞれのセンサで信号電圧の範囲や必要な電源電圧などは異なる.仕様書を見るかネットで調べること.
データの読取は以下の関数で行う.
analogRead(ピン番号);
要はこれだけ.ただ,ピン番号を変数としておくと(C言語の#defineとかは多分ない),ピン番号変更に対して便利である.
ピン番号としては,以下のものが使える.
アナログピン番号:例. A0 の場合 analogRead(A0)
アナログポートA0
ピン番号:例.14 の場合 analogRead(14)
デジタルポートが0~13(Arduino Uno)あり,その次の番号から割り振られている.14の場合,A0にあたる.
ピン番号(デジタルポート):例.10 の場合 analogRead(10)
デジタルポートは入出力として使用できる.ただし,setup()pinMode(pin3, INPUT); を実行する必要あり.
Arduino Servo library ex-Knob を参考に接続,プログラム作成を行い,センサ値に応じたサーボの動作を実現してみる.ただし,使用するセンサが違うので,センサに合わせてプログラムを変えること.またmap関数を使用すると分かりにくくなるため,出来れば使用しないほうが理解が早いような気がする.