[コラム]イライラ棒ゴールモジュールの紹介

イライラ棒モジュールの一つである、ゴールモジュールの説明です。


外観

外観は以下のような感じです。

コースの形から、ゴールモジュールであることが明白です。

裏面は以下のようになってます。


基板類や配線が色々あります。


コースの説明

コース全体は以下のようになっています。


このモジュールに入ってきた後、文字"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コメント

  • 1000 / 1000