Arduino、ミニソナーロボット:3ステップ

Arduino、ミニソナーロボット:3ステップ

目次:

Anonim

このプロジェクトでは、私は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)。

}