超聲波中級實踐篇--三點定位
最近博主發現超聲波這個玩意還是挺實用的,因此不慌不忙搞了一個定位的專案,接下來僅供參考!
1. 作業程序

(每一個位置各3個超聲波,角度范圍最高可達到45度,如果想要效果更好,可以考慮增加數量或者加電機或舵機使其掃描,根據圖更改上面的數值!
實驗材料:
- Arduino mega 2560 X1
- RS04超聲波傳感器 X1
- 杜邦線 若干
- 面包板 X1
- USB下載線 X1
- 紙巾 1包(建議初學者準備,因為看不懂看久了可能會冒冷汗的,嘻嘻嘻)
2. 接線方法
下面trigpin和echopin為發射和接收的引腳,需要更改的話直接改二維陣列里的數字
* 所有正極接到mega的5v引腳上,
* 所有負極接到mega的gnd引腳上,
* 三個超聲波0的TrigPin依次接到22,24,26口
* 三個超聲波0的EchoPin依次接到23,25,27口
* 三個超聲波1的TrigPin依次接到28,30,32
* 三個超聲波1的EchoPin依次接到29,31,33
* 三個超聲波2的TrigPin依次接到34,36,38
* 三個超聲波2的EchoPin依次接到35,37,39
* 注意:根據實際更改上面Lx,Ly,size of thing的值
* 注意:測量范圍不能太小(超聲波反應不過來),太大(超過測量范圍),角度不能太偏(超聲波模塊限制)
* 反饋:打開arduino ide的串口監視器,3行3列的數為9個超聲波測量值,輸出x,y值為計算所得值,若出現單個超聲波值一直為0.00,請考慮硬體故障,
3.代碼
float cm[3][3];
int TrigPin[3][3] = {{22,24,26},{28,30,32},{34,36,38}};
int EchoPin[3][3] = {{23,25,27},{29,31,33},{35,37,39}};//雙數發,單數收
float target_cm[3];
float p = 0;
int y = 0;
int x = 0;
void setup()
{
Serial.begin(9600); //設定波特率
for(int i = 0;i<3;i++)
for(int j = 0;j<3;j++)
{
pinMode(TrigPin[i][j], OUTPUT);
pinMode(EchoPin[i][j], INPUT);
}
}
void loop()
{
for(int i = 0;i<3;i++)
for(int j = 0;j<3;j++)
{
digitalWrite(TrigPin[i][j], LOW); //低高低電平發一個短時間脈沖去TrigPin
delayMicroseconds(2); // delayMicroseconds在更小的時間內延時準確
digitalWrite(TrigPin[i][j], HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin[i][j], LOW); //通過這里控制超聲波的發射
cm[i][j] = pulseIn(EchoPin[i][j], HIGH) / 58.0; //將回波時間換算成cm
cm[i][j] = (int)(cm[i][j] * 100.0) / 100.0; //保留兩位小數
//delay(50);
}
/
Serial.println();
Serial.println();
for(int i = 0;i<3;i++)
{
for(int j = 0;j<3;j++)
{
Serial.print(cm[i][j]);
Serial.print(" ");
}
Serial.println();
}
Serial.println();
Serial.println();
//
for(int i = 0;i<3;i++)
{
target_cm[i] = cm[i][0];
for(int j = 0;j<3;j++)
{
if(cm[i][j] > 0 && cm[i][j] <= 350 && target_cm[i] >= cm[i][j])
target_cm[i] = cm[i][j]; //取最小值
}
Serial.println(target_cm[i]);
}
y = 0;
x = 0;
if( target_cm[0]> 0 && target_cm[1]> 0 && target_cm[2]> 0)
{
int a = target_cm[0] +size_of_thing;
int b = target_cm[1] +size_of_thing;
int c = target_cm[2] +size_of_thing;
p = (a+b+Lx)/2.0;
int S = (int)(sqrt(p*(p-a)*(p-b)*(p-c)));
int h = 2*S/a;
y = h;
x = (int)(sqrt((a*a) - (y*y)));
Serial.print("x = ");
Serial.print(x);
Serial.print(" ");
Serial.print("y = ");
Serial.println(y);
}
else
{
Serial.println("請放在指定位置");
}
}
4.實驗現象
自己動手豐衣足食,想學習的自己購買電子元器件測驗,實踐出真理!哈哈哈哈!
5.總結
有志者,事竟成!遇到困難不要慌,先把手機掏出來,三銘學長一直伴您同行!
加油!有問題請留言,第二次發博客,技術一般般,嘻嘻嘻,不要見怪,將就看!
本賬戶為了改善各種網站上Arduino 元器件資料示例太多不方便查找的問題,在這里你只需要搜索傳感器名稱或者元器件名稱就可以了,同時博主會經常發表案例,以供學習參考使用!有需要關注一下哈,真的對你有幫助的!
謝謝關注!未完,待續......,敬請期待!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172770.html
標籤:其他
