#include <16f648a.h> //ヘッダーファイル読込
#fuses HS,NOWDT //外部振動子使用、ウオッチドッグ不使用
#use delay(clock=10000000) // クロック10MHz
void main()
{
while(1)
{
set_tris_b(0x03); //RB0,RB1は入力モード
output_high(pin_b2); //R-Ry1 R-motor Forward
output_high(pin_b3); //L-Ry2 L-motor Forward
int i ;
while((input(pin_b0)==1)||(input(pin_b1)==1))
{ //両軸を交互に前に運ぶ
output_low(pin_a0); //R-motor on
delay_ms(100);
output_high(pin_a0); //R-motor off
delay_ms(100);
output_low(pin_a1); //L-motor on
delay_ms(100);
output_high(pin_a1); //L-motor off
delay_ms(100);
}
output_low(pin_b2); //R-motor Revers
output_low(pin_b3); //L-motor Revers
for (i=0;i<10;i++) //10回100mSずつモーターに電流を流す
{
output_low(pin_a0);
delay_ms(100);
output_high(pin_a0);
delay_ms(100);
output_low(pin_a1);
delay_ms(100);
output_high(pin_a1);
delay_ms(100);
}
}
}
左右に2つのモーターをつけ、交互に微小時間通電することにより、モーターの軸につけたタイヤで前進させ、障害物に当たると2つのリーフスイッチが同時にオンすることにより逆回転をさせます。電源は単4型のニッケル水素電池4本を使用しています。(写真1)
モーターの正回転はPICのRA0,RA1がローレベルのときPNPトランジスタのQ2,Q4がオンし、上のモーターではVcc-C2-B2-Motor-B1-Q2のループになり、リーフスイッチSW2、SW3が両方オンのときNPNトランジスタのQ1,Q3がオンし、リレーRy1,Ry2が動作し上のモーターではVcc-C2-M2-Motor-M1-Q2のループになり逆回転させます。SW1,SW4は特に必要ないのですが制御基板単体での動作確認用です。リレーのコイルに接続されているダイオードD1,D2はQ1,Q3がオフするときにコイルに発生する逆起電力を吸収するフライホイールダイオードです。
写真2
写真1
モーターはプラモデル用の2モーターユニットを使用します。このモーターの使用最大電圧は3Vのようですが、パルス駆動するので5Vで使用します。ブラシ付きモーターなので多少心配しましたが、過熱の様子もありませんでした。(写真2)
Dutyはプログラム上で25%に設定し、実測も25%になっています。600mSオフ、200mSオンです。Lレベルの時にPNPトランジスタをオンしモーターを動かします。Hレベルの中央が200mSの間、0.2V程下がっていますが、もう一方のモーターがオンしているからです。測定ポイントはPICのRA1です。(写真3)
フロントにリーフスイッチを左右につけます。容量は5Aありますが、電流は0.5mA程度しか流していません。オムロンのSS-5GL-Fです。動作に必要な力は0.16N以下です。人差し指でスイッチを押す力が2N位らしいので、かなりの高感度です。(写真4)
モーターの正逆はリレーで切換え、リレー及びモーターの駆動はパワートランジスタを使用します。手持ちのものを使いましたが容量的には十分余裕がありそうです。
NPNは2SD669でVCBO180V、IC1.5A、PNPは2SA1359でVCBO40V、IC3Aです。リレーはオムロンのG5V-2のDC5V用です。接点容量は2Aです。
制御はPIC16F648Aを使用し外部クロックは10Mです。プログラミングはICSPですので実装のままプログラムできます。右下の3×2のピンソケットがICSP用です。
(写真5)
電池は単4タイプのニッケル水素電池で750mAHが4本です。
全体の接続はこのようになります。
(写真6)