はじめに
近年車の安全機構も進歩してきまして、距離検知のセーフティブレーキを実装している車とかも多々見られるようになりましたね。今年の初旬には国連で日本を含む40か国が自動ブレーキ(AEBS*1)の義務化に合意されたことは記憶にも新しいと思います。一斉義務化は2020初頭に行われるとの話で適応範囲は新車の乗用車や小型車*2なのですが、、、
ミニ四駆が適応に含まれていない!!
これはゆゆしき事態です。私が小さいころにはマグナムトルネード!!とか叫びながら、カーブをぶち抜いて爆走していたものです。
このような状況が現代でまかり通る事は無いと思い、“自動ブレーキの適応範囲をミニ四駆まで広げる”事を声を大にして言いたいと思います。
・
・
・
なーんて、そんな茶番は冗談として今回は測長センサを用いて障害物手前で停止する魔改造ミニ四駆をつくってみましょう!!
<<備考>>
*1 AEBS(Advanced Emergency Braking System)とはエアバックや緊急時のタイヤロック(ABS)などに続く先進的なブレーキシステムの事です。昨日はメーカーにより異なりますが基本的には【障害物を回避する動作を取る】です。
*2 商用のトラックやバスなどの大型車に対する適応に関しては2014以降の新車に関しては義務化されている模様です。
設計構想
どのように距離を検知するですが、今回は超音波センサ(HC-SR04)を使用してみましょう。欲を言ったらレーザーセンサですがお金が、、、ということで格安5個セットで約1000円の超音波センサを使いますね。
HC-SR04の原理は簡単に言うとやまびこですね。超音波を出して帰ってくるまでの時間を計算して距離を出す単純な原理です。精度良く計測するには温度補正をする必要がありますが今回は行っていません。

モーターの制御にはみんな大好き東芝製のTA7291Pです。ちょっとAmazonでの入手性が悪い*3ので他に選定ができる方は替えて頂いてもOKです。

また、障害物に近づいたら光って危険を知らせるLEDインジケータをつけようと思います。見た目は見逃しがちですが大事です。危険を視認できることに意義がありますね。LED以外にも圧電ブザーを取り付けるのも面白いかもしれません。
動力なのですが、今回はLiPo(リチウムイオンポリマー電池)を使っていきたいと思います。このLiPoを使用する場合は出力の定格が4V程度なので5V昇圧回路を追加しています。あとLiPoを使用するときの注意点なのですが、専用のチャージャーを使いましょうね!一般的に普及しているLiPoですが過充電・過放電・衝撃にめっぽう弱いです。取り扱いを間違えるとアボーーンなので気をつけましょうね。
回路に関しては下記にFritzingで書いたイメージを添付いたします。おそらくめちゃくちゃ見ずらいと思います。ごめんなさいm(__)m
※回路中の電池の部分は1CのLipoと5V昇圧回路に置き換えていただければと思います。
<<備考>>
*3 筆者Amazonのプライム会員でありヘビーユーザーなので殆どの部品調達はAmazonです。稀に欲しいものがない場合には秋月さんを利用する感じです。最近では中国からの輸入品を選定すれば目が飛び出るほど安いものが送料無料で手に入るのでいい時代になったと思いました。(届くまでに1カ月とかざらですが)
実装
実装編ですね。今回は見た目をスッキリさせたいのでPCB基板を使用した半田付けによる実装を行っています。半田こてなのですがだいたい40Wくらいあれば十分かと思います。半田はダイソーのはんだを愛用しています。
それと、今回はモーターを使用するのでモータードライバにヒートシンクをつけると安心です。
試してみればわかりますが、ドライバアレイ単体で使用するとかなりアッチッチになるのでご注意ください。
では、魔改造後のミニ四駆の写真です。

次は制御編なのですがPID制御を使用しましょう。PIDは比例, 積分, 微分の頭文字を取った自動制御分野で最もポピュラーな制御方式でそれなりの安定もしますね。PID制御についての詳しい説明は今回は省きますが、別の機会で掘り下げられたらと思います。
で、このPID制御係数の設定が非常に難しくトライアンドエラーに頼ることが多いのです。
参考にスケッチを載せますが無保証でお願いいたします。
| 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | float Kp=3.0;//比例係数 float Ki=0.1;//積分係数 float Kd=0.03;//微分係数 float distance = 0;//測定距離 float Target = 15;//停止距離 float dt, preTime; float P=0, I=0, D=0, preP; int trig = 3; // 出力ピン int echo = 2; // 入力ピン int led  = 4;//LEDインジケーター volatile int pwm = 0;//速度制御 int out1 = 11;//出力1 int out2 = 12;//出力2 void setup() {   Serial.begin(9600);   pinMode(led, OUTPUT);   pinMode(trig,OUTPUT);   pinMode(out1, OUTPUT);   pinMode(out2, OUTPUT);   pinMode(echo,INPUT);   delay(5000);   } void loop() {   digitalWrite(trig,LOW);   delayMicroseconds(1);   digitalWrite(trig,HIGH);   delayMicroseconds(11);   digitalWrite(trig,LOW);   int t = pulseIn(echo,HIGH);   distance = t*0.017;   if(distance>100){     distance=0;   }   Serial.print(distance);   Serial.println(" cm");   PID();   if(P>0){     P_rotation(pwm);//正転開始     digitalWrite(led,LOW);   }else{     Brake();     digitalWrite(led,HIGH);    }   Serial.println(pwm); } void PID(){   dt = (micros() - preTime) / 1000000;   preTime = micros();   P  = distance - Target;   I += P * dt;   D  = (P - preP) / dt;   preP = P;   pwm = Kp * P + Ki * I + Kd * D;   if(pwm>255){     pwm=255;   } } void P_rotation(int pwm){   analogWrite(out1, pwm);   digitalWrite(out2, LOW); } void Brake(){   digitalWrite(out1, HIGH);   digitalWrite(out2, HIGH); } | 
おそらくミニ四駆ごとのギア構成や摩擦抵抗、電源電圧などで変わってくると思うので、スケッチ中のKp, Ki, Kdを動かしてみながらトライアンドエラーしてみるといいかもしてません。
動作デモ
ここまで来たら後は動かすだけです。
下に動作デモを載せましたので参考にご覧ください。
今回はミニ四駆を魔改造して自動ブレーキを実装させました。
これでちびっ子たちの安全は守られましたね。めでたしめでたし。
次のステップとして【停止】ではなく障害物からの【任意の距離で停止】を目標にしてみますか。
ではでは~

 
  
  
  
  

コメント