前回使用したライントレースプログラムを解説します。
関連:
ライントレース関連記事一覧ライントレースの動きは
・ラインの真上に居るときは直進
・ラインの右側に寄ったときは右旋回
・ラインの左側に寄ったときは左旋回
が基本となります。
これをセンサーとモーターの動きで表すと
・右センサー
ON、 左センサー
ON の時:右モータ
ON、 左モータ
ON・右センサー
ON、 左センサー
OFFの時:右モータ
ON、 左モータ
OFF・右センサー
OFF、左センサー
ON の時:右モータ
OFF、左モータ
ON・右センサー
OFF、左センサー
OFFの時:右モータ
OFF、左モータ
OFFセンサーが両方OFFの状態は元々決めていませんでしたが、止めておくことにします。
これを整理するととても簡素になります。
・
右センサーが
反応しているとき、
右モーターが
回る・
左センサーが
反応しているとき、
左モーターが
回る基本的にはこれだけです。
速度調整さえうまくできればマイコン無しでも動かすことができます。
※2019/06/23誤記修正ちなみに
・片方のクローラーを止めてもう
片方だけ回す旋回方法を
新地旋回 信地旋回・それぞれのクローラーを
反対方向に動かす旋回方法を
超新地旋回 超信地旋回と言います。
模型では大したことありませんが、重機でやると地面がえぐれて後で整地するのが大変です。
また、ベルト部分を履帯と呼びますが、重機で新地旋回をやると履帯が痛みます。
台から落ちない制御(簡易版)
ライントレースを応用するとロボット相撲の様な台から落ちない制御を行うことができます。
ライントレースでは台の白い部分と黒い部分で判定を分けていました。
台から落ちない制御の場合、台(の白い部分)と台の無い部分で判定を分けます。
フォトリフレクタは赤外線の反射の強弱で出力が変わります。
赤外線が反射する物が何もない場合出力は一番小さくなります。
つまるところセンサ感度は変更せずそのまま使えます。
センサーの配置は少し変える必要があります。
台の端を走行させる状態を考えてみます。
ライントレースのセンサーの位置では台から落ちそうか判定できません。
そこでセンサーの位置を履帯より外側に出しておく必要があります。
加工が得意な人はアルミ材やプラ板などを任意に加工してください。
加工に慣れていない人はユニバーサルプレート2枚セットの余り材やロングユニバーサルアーム等が良いでしょう。
台から落ちない動作
動作を考えてみます。
何もない場所でまっすぐ進むのはそのまま
台から落ちそうなとき、台から離れる様に動く必要があります。
これを整理すると
・
右センサーが
反応しているとき、
左モーターが
回る・
左センサーが
反応しているとき、
右モーターが
回るとなります。
前回のプログラムからの修正点は
#include "iodefine.h"
#include "io_setup.h"
#include "intMTU.h"
#include "ADConv.h"
#define SENS_THRESHOLD 800 //判定値#define PWM_MAX 400 //PWM出力void main(void){
short sens_R=0,sens_L=0;
short sens_R_on=0,sens_L_on=0; short pwm_out_L=0,pwm_out_R=0; hardware_setup();
//汎用IOの初期化 init_MTU();
//PWM機能の初期化 init_ADC();
//AD変換機能の初期化 while(1){
check_ai();
//AD変換を実行 sens_R=get_ai(0);
//AD変換値を取得 sens_L=get_ai(1);
//AD変換値を取得 sens_R_on=(sens_R>SENS_THRESHOLD)? 1:0; sens_L_on=(sens_L>SENS_THRESHOLD)? 1:0; pwm_out_R=(sens_L_on==0)?0:PWM_MAX; pwm_out_L=(sens_R_on==0)?0:PWM_MAX; set_pwm( PWM_PE0 , pwm_out_R); //PWM出力 set_pwm( PWM_PE1 , pwm_out_L); //PWM出力 }
// end while}
ようは左右にセンサーをひっくり返しただけ。
これでとりあえず台から落ちなくはなります。
だがしかし・・・
次回:
台から落ちない制御