[参考]超音波センサーなど部品説明
sLab-Carで利用する電子部品(超音波センサー、サーボモータ、モータードライバー)について説明しています。
超音波センサー
障害物との距離を測定するのに超音波センサーを利用しています。超音波センサーは超音波(周波数の高い空気の振動)を利用して障害物から反射してくる超音波を受信して、送信してから受信までの時間を測定することで距離を測定します。
【①超音波送信】最初に超音波を10μ秒間送信します。Trig端子をONにすることで超音波を送信できます(音波に比べて10μsecは0.34cm相当と非常に小さいので距離測定には誤差の範囲なので距離計算では省略しています。)
1 2 3 4 5 6 |
// ⑨TrigピンをHIGHに設定 digitalWrite(trigPin, HIGH); // ⑩10μ秒処理を止める(トリガーPinをHIGHで10μ秒送信) delayMicroseconds(10); // ⑪TrigピンをLOWに設定 digitalWrite(trigPin, LOW); |
【②超音波受信】送信後に受信するまでの時間を測るためEcho端子が(LOWから)HIGHになるまでの時間をμ秒で取得できます。
1 2 |
// ⑫超音波を発して物体に当って跳ね返ってきた時間(μ秒)を取得(LOW=>HIGHまでの時間) duration = pulseIn(echoPin, HIGH); |
【③距離計算】音速は340m/sとなるため以下のように計算できます。
1 2 3 4 |
// ⑬取得した時間は往復時間のため2で割る distance = duration / 2; // ⑭測定時間から距離(cm)を算出(音速は340m/s) distance = distance / 1000000 * 340 * 100; |
上記により距離を測定しています。
サーボモータ
サーボモータは超音波センサーを回転させることに利用しています。サーボモータは端子のHIGH時間(パルス幅)により角度を制御することができます。
モータ仕様で「0度:0.5msec, 180度:2.4msec」となっていますので、このパルス幅を元に制御する角度を調整します。
今回、PWM端子を用いてパルス幅を制御しています。
1 2 |
ledcSetup(LEDC_CH, 50, 10); // ch:0, Freq:50Hz, 10bit ledcAttachPin(SERV_PIN, LEDC_CH); // ch:0 |
で制御していますので、50Hz(1周期20msec)を10Bit精度で調整できます。
《制御値》
0度(0.5msec) => 0.5msec / 20msec(50Hz) * 1024(10bit) = 26
90度(2.4msec) => 2.4msec / 20msec(50Hz) * 1024(10bit) = 123
x度の場合 => ( (1.9*x/180) + 0.5 ) / 20 * 1024
【( (1.9*x/180) + 0.5 )は角度x度のパルス幅ms】
となるためプログラムは以下のように制作しています。
1 |
int angleTime = ceil( ( (1.9*angleNum/180) + 0.5 ) / 20 * 1024 ); |
上記のように角度制御しています。
モータードライバー
モータドライバーは直進時に正回転や逆回転させるために利用しています。
①:+入力電圧を接続します。
②:GNDを接続します。
③:①で入力された電圧を5Vに制限して出力しています。今回は超音波センサー(5V動作)の電源として利用しています。
④,⑤:右モータの制御を行います。回転方向は以下のように制御します。
⑥,⑦:左モータの制御を行います。回転方向は以下のように制御します。
【回転方向】
《正回転》制御1:HIGH、制御2:LOW
《逆回転》制御1:LOW、制御2:HIGH
《 停止 》制御1:LOW、制御2:LOW
マイコンのプログラム制御(例)
1 2 3 4 |
digitalWrite(R_WHEEL_IN1, HIGH); digitalWrite(R_WHEEL_IN2, LOW); digitalWrite(L_WHEEL_IN1, HIGH); digitalWrite(L_WHEEL_IN2, LOW); |
上記のようにsLab-Carを制御しています。