[コラム]イライラ棒ゴールモジュールの紹介
イライラ棒モジュールの一つである、ゴールモジュールの説明です。
外観
外観は以下のような感じです。
コースの形から、ゴールモジュールであることが明白です。
裏面は以下のようになってます。
基板類や配線が色々あります。
コースの説明
コース全体は以下のようになっています。
このモジュールに入ってきた後、文字"G"の下のコースを進むと、フォトインタラプタが棒の通過を検知します。
そのタイミングでコース中央の障害物がサーボで動くようになります。
中央の障害物が動くことで、タイミングがうまく合えば、文字"O"の下のコースを進むことができます。
最後のゴール手前にはマイクロスイッチが設置されています。
このスイッチでゴールを検知します。
基板周りの説明
裏の基板周りは以下のようになっています。
部品数はだいぶ少ないです。
電源は9V電池からとっているため、5Vをマイコンボードに供給するために、DC-DCコンバータを搭載しています。
このDC-DCコンバータはモジュール作成時にそこらへんに落ちていた物を使っており、恐らく今回の用途に対してはオーバースペックです。
他のモジュールと同様にスレーブアドレス設定用スイッチが付いています。
プログラム周りの説明
制御プログラムは以下GitHubに置いています。
工夫したところ
制御内容は比較的単純なので、プログラムはシンプルです。
しいて工夫したところをあげるとすれば、サーボの制御でしょうか。
サーボを常に動作させつつ、コース接触やゴール検知など、他の処理も行わないといけません。
そのため、サーボ制御部分は定期的に制御用関数を呼んで、呼び出しタイミングに合った角度に動かします。
サーボ部分はiraira_goal_main.inoの以下の関数を定期的に呼び出して制御を行っています。
----------------------------
/**
* @brief サーボ動作制御処理
* @param None
* @return None
* @details 一定時間ごとにこの関数を呼んでサーボを制御する
*/
void control_servo_move(void){
float angle = DEF_ANGLE_SERVO_MOVE;
int fixed_time = millis() % CYCLE_TIME_SERVO_MOVE;
if(fixed_time < HALF_CYCLE_TIME_SERVO_MOVE){
angle = (MAX_ANGLE_SERVO_MOVE - MIN_ANGLE_SERVO_MOVE) *
((float)fixed_time / HALF_CYCLE_TIME_SERVO_MOVE) + MIN_ANGLE_SERVO_MOVE;
}else{
angle = (MIN_ANGLE_SERVO_MOVE - MAX_ANGLE_SERVO_MOVE) *
((float)fixed_time / HALF_CYCLE_TIME_SERVO_MOVE - 1.0) + MAX_ANGLE_SERVO_MOVE;
}
servo.write(int(angle));
return;
}
----------------------------
Arduinoの組み込み関数であるmillis()を使って時刻を取得し、取得した時刻に応じた角度にサーボを動かしています。
この関数は最小角度MIN_ANGLE_SERVO_MOVEから最大角度MAX_ANGLE_SERVO_MOVEまで周期CYCLE_TIME_SERVO_MOVE[ms]で行ったり来たりさせます。
0コメント