目次:
このプロジェクトでは、私はarduino pro miniを使ってミニソナーロボットを作りたいです。ソナーセンサーまたは超音波センサーは、レーダーまたはソナーと同様の原理で動作します。レーダーまたはソナーは、それぞれ電波または音波からのエコーを解釈することによってターゲットの属性を評価します。能動型超音波センサは高周波音波を発生し、センサによって受信されたエコーを評価し、信号を送信してからエコーを受信するまでの時間間隔を測定して物体までの距離を決定する。
私はこのタイプで最も安い価格の1つであるHC-SR04センサーを使いました。それは4つのピンVcc 5V、Gndと他の2つのトリガー(out)とエコー(in)用のピンを持っています。メカニズムは単純です、いくつかの波のトリガーは、エコーが受け取ります。
必要な部品:
- 1x Arduino Pro mini
- 1xソナーセンサーSR-04(低価格)
- 2×2輪ギアボックスパック+ DCモーター3V〜6V
- 4倍プラスチックホイール
- 1倍のプラスチックボックス(ギアボックスのサイズによって異なります)
- 2倍のダブルバッテリーパックAA
- 単三電池4本(充電式を推奨)
- 1xミニスピーカー
- 1倍LED
- 1倍抵抗470オーム
- 1倍L293D IC
- 1x ICソケット16ピン
- 2倍ピンヘッダ(F&M両タイプ)
- 1xミニスイッチ
- 1xファイバーボードワイヤー+はんだごて+ペンチ+スーパーグルー
機械的な構造からプロジェクトを始めましょう。
用品:
ステップ1:ロボット本体
ギアボックスパックのサイズによってプラスチック製の箱を探す。私はイヤホンボックス(2個)を使いました。接着剤を使用して、図のように部品を取り付けます。
ステップ2:回路
画像のように回路を作ります。誰かがモーターの電源とロジック(micro、ic、…)を使いたくないかもしれません。
実際には、ロジックと高消費部分(モーターのような電気機械装置)のために別々の電源を持つことをお勧めしますが、私はそれがPro-miniのような低電力arduinoのためにそれほど重要ではないと思います。一方、電池が4つしかないので、他の方法は使えません。
ステップ3:コード
私は初心者にも分かりやすいように簡単にコードを書くようにしました。しかし、あなたが何か問題、質問や提案があるならば、私は知っているのが好きです。
いくつかのヒント:
- 最小距離は、衝突を防ぐための停止距離です。ロボットを停止させるための任意のブロックからの最適距離は、ギアボックスの速度によって異なります。
- ロボットは最大距離に戻ります。
- backDistとturnDistはロボットの速度に応じてカスタマイズする必要があります。
- ストップ、メロディー、ランダムな動きを含むランダムな動作が使用されています。
//******************************
// *投稿者:http://blog.mshams.ir *
//******************************
//ピン番号
const byte pinMotor1 = 4、pinMotor2 = 5、pinMotor3 = 6、pinMotor4 = 7。
const byte pinLed = 8、pinTone = 10、pinSonar1 = 11、pinSonar2 = 12。
//サウンド周波数
const int toneFreq = 800。
//ソナー距離
const byte minDistance = 45、maxDistance = 1000。
//モーター状態
constバイトM_STOP = 0、M_GO = 1、M_BACK = 2、M_RIGHT = 3、M_LEFT = 4、M_RIGHT2X = 5、M_LEFT2X = 6。
//ロボットの状態
constバイトR_START = 0、R_DRIVE = 1、R_BLOCK = 2、R_TURN = 3。
//二日酔いを検知
const int hangoverWait = 5000;
//ブロック検出は戻る
const int backDist = 1000、turnDist = 300。
//ランダムな振る舞い
const int randomChance = 300、randomStopWait = 10000、randomTurnWait = 200;
バイト状態= R_START。
int i、カウンタ= 0。
int dist;
void setup(){
randomSeed(analogRead(1));
//モーターピンの初期化
pinMode(pinMotor1、OUTPUT);
pinMode(pinMotor2、OUTPUT);
pinMode(pinMotor3、OUTPUT);
pinMode(pinMotor4、OUTPUT);
pinMode(pinSonar1、OUTPUT);
pinMode(pinSonar2、INPUT);
// init LEDピン
pinMode(pinLed、OUTPUT);
}
void loop(){
スイッチ(状態){
ケースR_START:
モーター(M_GO);
メロディー();
状態= R_DRIVE。
ブレーク;
ケースR_DRIVE:
dist = Pingu();
if(dist <minDistance){
モーター(M_STOP)
state = R_BLOCK;
}
そうでなければ(random(0、randomChance)== 5){
RandomTone();
モーター(M_STOP)
遅延(randomStopWait);
モーター(ランダム(M_BACK、M_LEFT2X + 1))
遅延(randomTurnWait);
モーター(M_GO);
}
ブレーク;
ケースR_BLOCK:
ビープ();
モーター(M_BACK)
遅延(backDist);
モーター(ランダム(M_RIGHT2X、M_LEFT2X + 1))
遅延(turnDist);
state = R_TURN;
ブレーク;
ケースR_TURN:
dist = Pingu();
if(dist> = maxDistance){
モーター(M_STOP)
モーター(M_GO);
ビープ();
状態= R_DRIVE。
}
その他{
カウンタ+ = 1。
if(counter> = hangoverWait){
カウンタ= 0。
モーター(M_STOP)
RandomTone();
state = R_BLOCK;
}
}
ブレーク;
}
}
無効点滅(バイト状態){
digitalWrite(pinLed、state);
}
void Beep(){
点滅(1)。
SpeakTone(2);
SpeakTone(1);
点滅(0)。
}
void Melody(){
点滅(1)。
for(int i = 1; i <10; i ++){
SpeakTone(i);
}
点滅(0)。
}
void RandomTone(){
点滅(1)。
for(int i = 1; i <10; i ++){
SpeakTone(random(1、10));
}
点滅(0)。
}
void SpeakTone(バイトノート){
トーン(pinTone、toneFreq * note);
遅延(100)。
noTone(ピントーン);
}
ボイドモーター(バイト状態){
バイトm1、m2、m3、m4。
スイッチ(状態){
ケースM_STOP:
m1 = m2 = m3 = m4 =ロー。
ブレーク;
ケースM_GO:
m1 =ハイ。
m2 =ロー。
m3 =ハイ。
m4 =ロー。
ブレーク;
ケースM_BACK:
m1 =ロー。
m2 =ハイ。
m3 =ロー。
m4 =ハイ。
ブレーク;
ケースM_RIGHT:
m1 =ハイ。
m2 =ロー。
m3 =ロー。
m4 =ロー。
ブレーク;
ケースM_LEFT:
m1 =ロー。
m2 =ロー。
m3 =ハイ。
m4 =ロー。
ブレーク;
ケースM_RIGHT2X:
m1 =ハイ。
m2 =ロー。
m3 =ロー。
m4 =ハイ。
ブレーク;
ケースM_LEFT2X:
m1 =ロー。
m2 =ハイ。
m3 =ハイ。
m4 =ロー。
ブレーク;
}
digitalWrite(pinMotor1、m1);
digitalWrite(pinMotor2、m2);
digitalWrite(pinMotor3、m3);
digitalWrite(pinMotor4、m4);
}
int Pingu(){
digitalWrite(pinSonar1、LOW)。
delayMicroseconds(5)。
digitalWrite(pinSonar1、HIGH)。
delayMicroseconds(5)。
digitalWrite(pinSonar1、LOW)。
delayMicroseconds(2)。
長時間= pulseIn(pinSonar2、HIGH)。
リターン(期間/ 29/2)。
}