步驟1:你需要什么?
零件:
為了構(gòu)建這個(gè)機(jī)器人,你需要在Ebay上購(gòu)買一些物品。你可以自己制造一些傳感器,但你必須看到它值得你的時(shí)間 - 沒有必要重新發(fā)明輪子。所以這里是清單:
HMC5883L數(shù)字羅盤Ebay(1);
Arduino Uno或兼容的Ebay(2);
2WD汽車底盤Ebay(3);
HC-06藍(lán)牙模塊(可選)Ebay(4);
2個(gè)雙H橋(將需要其中兩個(gè))Ebay(5);
Arduino Uno Ebay原型盾(6) );
5V Ebay(7)以上的可充電電池;
I2C LCD顯示器1602(可選)Ebay(8) ;
3超聲波傳感器HC-SR04(至少)Ebay(9);
超聲波傳感器固定支架或類似物(可選)Ebay(10);
兩片丙烯酸到機(jī)器人的制作層;
額外的12V電機(jī)Ebay(11);
一堆黃銅支座墊片Ebay(12);
Carpet Sweeper Ebay( 13);
Optocoupler Ebay(14);
而且,如果你想要一個(gè)photoelec用于檢測(cè)墻壁的三位一體傳感器:
紅外傳感器Ebay(15);
步驟2:焊接Eletronics
您需要什么知道:
在開始焊接之前,您需要觀察上圖。您可以使用3到6個(gè)超聲波傳感器。如果使用3,則必須將一個(gè)放在機(jī)器人前面,另外兩個(gè)放置120度。前面的那個(gè)將在物體靠近時(shí)檢測(cè)到物體,另外兩個(gè)物體將指向機(jī)器人的后部。他們兩個(gè)都會(huì)找到距離較近的物體(后面)的距離,所以“ SweeperBot ”可以決定,如果在找到一堵墻之后,它會(huì)更多回到它的右側(cè),或更左側(cè)。那是因?yàn)椋?dāng)然,如果在找到一堵墻之后機(jī)器人直接向后移動(dòng),它將總是直線前進(jìn),并且永遠(yuǎn)不會(huì)清理整個(gè)房間。
如果你想要更多的讀數(shù),更多信息,以及機(jī)器人檢測(cè)來(lái)自側(cè)面的物體,以及檢測(cè)其后面的物體,您可以使用所有6種可能的傳感器。為避免障礙而可能使用的一種控制方法是潛在字段,它可以充分利用所有這些信息。但是我還沒有實(shí)現(xiàn)這個(gè)。
還在寫關(guān)于聲納的內(nèi)容,另外需要注意的是,使用我將提供的代碼如下,你可以只使用一個(gè)連接到所有六個(gè)它們作為觸發(fā)引腳,這意味著您將使用相同的命令一起觸發(fā)所有6個(gè)觸發(fā)引腳。這樣您就可以避免使用更多5根線來(lái)觸發(fā)它們。通常,使用此傳感器的標(biāo)準(zhǔn)庫(kù),您將無(wú)法這樣做,因?yàn)槊總€(gè)傳感器都會(huì)與另一個(gè)傳感器有問題。但是,每個(gè)傳感器都有自己的回波(引腳和接線),因?yàn)樗鼈兊淖x數(shù)不同,每個(gè)傳感器都會(huì)向Arduino發(fā)送不同的信號(hào)。
HC-SR04聲納的另外兩個(gè)引腳是正面和正面。這兩個(gè)與所有其他電子設(shè)備相同:指南針,顯示屏和藍(lán)牙。指南針將通過I2C(IIC)進(jìn)行通信,將SDA和SCL連接到Arduino上的SDA和SCL。藍(lán)牙將其發(fā)送器引腳和接收器引腳連接到微控制器的數(shù)字0和1引腳。注意它們的配置是通過軟件完成的,如果你切換這些引腳,藍(lán)牙將無(wú)法與設(shè)備配對(duì)。顯示器還將在與羅盤相同的引腳上連接I2C,因?yàn)槭褂肐2C,Arduino可以使用相同的引腳同時(shí)控制多個(gè)器件。
相對(duì)于H橋,您必須連接使能A和將B啟用到正極引腳(在它旁邊,只需使用跳線),否則電機(jī)不會(huì)運(yùn)行。然后,將每個(gè)電機(jī)連接到H橋的正極和負(fù)極(帶螺釘?shù)膫?cè)面引腳),并且用螺釘保留的三個(gè)連接器是:接地,它將連接到arduino和所有其他設(shè)備,包括電池,正極9V-12V,完全來(lái)自電池,5V輸出,將提供所有其他不是直流電機(jī)的設(shè)備。剩余的連接器是兩對(duì)邏輯信號(hào),用于控制每個(gè)電機(jī)的方向和功率。
PINOUT:
HMC5883L數(shù)字羅盤;
PIN 0 - SDA 》》》 Arduino模擬引腳A4;
PIN 1 - SCL 》》》 Arduino模擬引腳A5;
PIN 2 - GND 》》》 GND;
PIN 3 - VCC 》》》 VCC 5V;
HC-06藍(lán)牙;
PIN 0 - RX 》》》 Arduino數(shù)字引腳0;
PIN 1 - TX 》》》 Arduino數(shù)字引腳1;
PIN 2 - GND 》》》 GND;
PIN 3 - VCC 》》》 VCC 5V;
第一個(gè)雙H橋;
PIN 0 》》》 Arduino Digital Pin 4;
PIN 1 》》》 Arduino Digital Pin 5;
PIN 2 》》》 Arduino Digital Pin 6;
PIN 3 》》》 Arduino Digital Pin 7;
啟用A 》》》 VCC;
啟用B 》》》 VCC;
電源》》》電池正極9 - 12V;
GND 》》》電池GND和Arduino GND;
+ 5V OUT 》》》 Arduino VCC;
第二雙H橋;
PIN 0 》》》 Arduino Digital Pin 3;
PIN 1 》》》 GND;
PIN 2 》》》未連接;
PIN 3 》》》未連接;
啟用A 》》》 VCC;
啟用B 》》》 GND;
電源》》》電池正極9 - 12V;
GND 》》》電池GND和Arduino GND;
+ 5V OUT 》》》未連接;
I2C LCD顯示1602;
引腳0 - GND 》》》 Arduino GND;
引腳1 - VCC 》》》 Arduino VCC;
引腳2 - SDA 》》》 Arduino模擬引腳A4;
針腳3 - SCL 》》》 Arduino模擬針腳A5;
6超聲波傳感器HC-SR04;
引腳0 - VCC 》》》 Arduino VCC;
引腳1 - 觸發(fā)》》》 Arduino數(shù)字引腳2;
Pin 2 - Echo 》》》連接Arduino數(shù)字引腳8,9,10,11,12和13;
引腳3 - GND 》》》 Arduino GND。
步驟3:安裝機(jī)器人
讓超聲波傳感器彼此之間以相等的角度固定例如,如果您使用六個(gè),則將第一個(gè)放在機(jī)器人前面,將其他放置在距離它60度的位置。使用丙烯酸板作為機(jī)器人的層,因此更容易安裝并使部件就位。擰緊所有層,將電池放在電機(jī)上方,但放在電子設(shè)備下面。這樣你就可以降低它的重心,從而使它更穩(wěn)定。
將所有正極導(dǎo)線和接地針也焊接在一起。我用傳感器的所有引腳和另外5個(gè)直流電機(jī)引腳制作了一個(gè)連接器,因此在安裝和拆卸時(shí)更容易理解。在H橋上方放置一層最后一層并將Arduino放在那里。我在微控制器上方使用了Prototyping Shield,因?yàn)樗菀缀附硬⒐潭ㄖ改厢槪@是需要特別注意的部分。沒有必要將它放在機(jī)器人的中心,但它需要遠(yuǎn)離大的金屬部件,如電機(jī)和電池。
可以將直流電機(jī)安裝在一起。地毯清掃車有許多不同的方式,但有些比其他更好。因?yàn)槲抑挥幸粋€(gè)掃地機(jī),我的嘗試中有點(diǎn)難看。我發(fā)現(xiàn)將電機(jī)的軸線粘在清掃器的軸線上非常困難,通常在工作幾分鐘后,它們會(huì)斷裂,特別是因?yàn)闆]有辦法將它們正確對(duì)齊。所以我取下了電動(dòng)機(jī)的減速軸,并將一個(gè)小齒輪粘在掃地機(jī)的軸上。然后我把馬達(dá)的齒輪放在一起接觸,一切都像魅力一樣。但是,我希望我有一臺(tái)3D打印機(jī),事情會(huì)更簡(jiǎn)單,也更專業(yè)。
第4步:代碼
圖書館:
“SweeperBot”使用Wire,I2Cdev,TimerOne(用于中斷),Adafruit傳感器,HMC5883和LCD庫(kù)。您可以下載Zip文件,其中包含Arduino的代碼和所有庫(kù)。還包含適用于Windows Phone的藍(lán)牙項(xiàng)目。
WINDOWS PHONE 8.1代碼:
通過控制機(jī)器人的項(xiàng)目Windows Phone中的藍(lán)牙改編自互聯(lián)網(wǎng)上的示例。它改為有四個(gè)按鈕,每個(gè)方向一個(gè)。上,下,左,右。每個(gè)按鈕都會(huì)向機(jī)器人發(fā)送一個(gè)字母,分別是U,D,L和R.當(dāng)機(jī)器人收到這些信件時(shí),它會(huì)生成以下內(nèi)容之一:
U - 機(jī)器人將方向設(shè)置為直接前進(jìn);
D - 機(jī)器人將轉(zhuǎn)向背部直行;
L - 機(jī)器人將將方向設(shè)置為與當(dāng)前“正在觀察”的位置完全相差90度;
R - 機(jī)器人將方向設(shè)置為與其正好相差90度目前正在“尋找”;
機(jī)器人處理這些命令的方式可以通過Arduino上的代碼進(jìn)行更改。可以添加更多按鈕來(lái)轉(zhuǎn)動(dòng)機(jī)器人,或者停止它,甚至可以讓它向后移動(dòng)。這段代碼只是一個(gè)例子。也可以為其他設(shè)備制作類似的程序,例如用于IOS的Androids和。您必須發(fā)送機(jī)器人的唯一信件是這些字母 - U,D,L或R.
private async void RedButton_Click_1(object sender, RoutedEventArgs e) {
string command = “U”;
await connectionManager.SendCommand(command);
}
private async void GreenButton_Click_1(object sender, RoutedEventArgs e) {
string command = “L”;
await connectionManager.SendCommand(command);
}
private async void YellowButton_Click_1(object sender, RoutedEventArgs e) {
string command = “R”;
await connectionManager.SendCommand(command);
}
private async void RedButton_Copy_Click(object sender, RoutedEventArgs e) {
string command = “D”;
await connectionManager.SendCommand(command);
}
要將此代碼部署到Windows Phone,您需要Visual Studio和開發(fā)人員解鎖電話。這可以按照此鏈接上的說明進(jìn)行。
ARDUINO代碼:
在簡(jiǎn)歷中,主要邏輯是機(jī)器人如下:
在6個(gè)可能的傳感器中找到距離更近的物體的距離;
機(jī)器人處理距離的行為,并用向量X,Y指向所需方向(但是,如果從智能手機(jī)收到消息,則步驟2由設(shè)備發(fā)送的指示代替);
數(shù)字羅盤給出了機(jī)器人的方向,以控制其輪子;
來(lái)自羅盤的信息X‘,Y’被歸一化為空間[-1,1];
期望方向的矢量與實(shí)際方向之間的交叉產(chǎn)物發(fā)現(xiàn)它們之間的誤差;
PID方法計(jì)算兩個(gè)車輪(2WD)的每個(gè)直流電機(jī)的PWM(功率);
中斷激活PWM;
隨著項(xiàng)目的發(fā)展,我發(fā)現(xiàn)GitHub上可用的超聲波傳感器標(biāo)準(zhǔn)庫(kù)與電機(jī)的PWM激活相沖突,因?yàn)樗麄兌际褂孟嗤挠?jì)時(shí)器。由于這個(gè)項(xiàng)目使用5個(gè)引腳配置三個(gè)直流電機(jī)的PWM(這是唯一可能的,因?yàn)榈靥呵鍜咂髦晦D(zhuǎn)向一個(gè)方向),而傳感器更多7個(gè),微控制器必須不斷檢查收到了閱讀,無(wú)法使用互聯(lián)網(wǎng)上提供的資料。
因此,為避免沖突,只配置了定時(shí)器1中斷。通過這種中斷,Arduino可以檢查每個(gè)傳感器上是否有讀數(shù):如果沒有,它會(huì)為每個(gè)傳感器增加一個(gè)變量,它將用作參數(shù)來(lái)查找到物體的距離。
void callback() { //callback is the interruption name
noInterrupts();
//if no reading, increases variable sonarCount[n], where n is the number of sensor
if ((sonar[0] == 1) && (digitalRead(ECHO))) sonarCount[0]++;
//if there is readind on that sensor, sonar[n] = 2 accuses object found
if ((sonar[0] == 1) && (!digitalRead(ECHO)) && (sonarCount[0] 》 0)) sonar[0] = 2;
此外,在此中斷期間,它會(huì)向電機(jī)投入全部電量。如果有一定數(shù)量的中斷超過了PWM_R或PWM_L變量的數(shù)量,那么它對(duì)該給定電機(jī)的效力為零。
if (PWMCount == 0) {
if (PWML) { //if pwm left is positive then turn to a certain way
digitalWrite(MOTOR + 2, HIGH);
digitalWrite(MOTOR + 3, LOW);
} else { //else turn to the other side the left motor
digitalWrite(MOTOR + 2, LOW);
digitalWrite(MOTOR + 3, HIGH);
}
(。..)
if (PWMCount 》= abs(PWM_L)) { //if the counter equals the power we want
digitalWrite(MOTOR + 2, LOW); //shut down both pins of this motor
digitalWrite(MOTOR + 3, LOW);
}
(。..)
PWMCount++; //increases counter
if (PWMCount == 250) PWMCount = 0; //if counter equals maximum value we want
Timer1.attachInterrupt(callback); //250 equals 100% power
}
在主循環(huán)期間,機(jī)器人繼續(xù)搜索障礙和計(jì)算路線以避免它們或改變它的路徑。如果開發(fā)人員想要配置潛在字段控制方法,或者更改機(jī)器人的行為,他只需要使用更好的obst()函數(shù)。該程序的其他部分是必要的,不需要更改。當(dāng)機(jī)器人通過藍(lán)牙接收消息時(shí),它會(huì)停止避開障礙物,只是聽取用戶輸入。
void loop() //main loop
{
lcd.clear(); //clears previous messages on lcd
delay(10);
search(); //search obstacles and saves the distance value to each sensor
readings(); //reads compass and calculates the error from its desired direction
calcPWM(); //calculates the PWM for each motor based on PID
if (!mensagem) { //message from Bluetooth? if not, continue doing this
obst(); //here is where the robot defines its behavior
} //and where it defines the direction it want to go
(。..)
從代碼的所有部分開始,所有部分都是非常基本的,唯一的一個(gè)這里要注意的有趣功能是讀數(shù)()。在其中,機(jī)器人獲取數(shù)字羅盤上當(dāng)前位置的值X,Y和Z.那么,如何將讀數(shù)轉(zhuǎn)化為讓機(jī)器人知道它看哪個(gè)方向的東西?
首先得到原始值:
double rawX = event.magnetic.x;
double rawY = event.magnetic.y;
double rawZ = event.magnetic.z;
然后檢查是否機(jī)器人在正確的平面上。這可以通過查看Z(垂直軸)是否具有某個(gè)小范圍之間的值來(lái)實(shí)現(xiàn)
if ((rawZ 》 Zprim + 10) || (rawZ 《 Zprim - 10)) return; //if not right, return
現(xiàn)在是時(shí)候?qū)和Y值標(biāo)準(zhǔn)化為[ - 之間的空間 - 1,1],以便從這些值計(jì)算sin()和cos()。
//Ymin, Ymax, Xmin and Xmax are obtained when the calibration occurs
vector[1] = ((rawY) - ((Ymax + Ymin) / 2)) / ((Ymax - Ymin) / 2);
vector[0] = ((rawX) - ((Xmax + Xmin) / 2)) / ((Xmax - Xmin) / 2);
我們現(xiàn)在使vectorOBJ [n]成為一個(gè)雙向向量,指向計(jì)劃中的位置,我們想要機(jī)器人去。因此,要找到兩個(gè)向量之間的誤差,我們必須在它們之間產(chǎn)生交叉積。結(jié)果值是另一個(gè)向量,但與兩者垂直,向上或向下,取決于其符號(hào)。
error = (vectorOBJ[0] * vector[0] + vectorOBJ[1] * vector[1]) /
(sqrt(vectorOBJ[0] * vectorOBJ[0] + vectorOBJ[1] * vectorOBJ[1])
* sqrt(vector[0] * vector[0] + vector[1] * vector[1]));
error = (acos(error)) * 180 / PI; //from rad to degrees
//find out the way the result vector is pointing
sentido = vector[0] * vectorOBJ[1] - vector[1] * vectorOBJ[0];
if (sentido 》 0) error = -error;
步驟5:結(jié)論
最終詞匯
焊接后,安裝機(jī)器人并將代碼部署到Arduino和手機(jī),您仍然需要配置其許多屬性。例如,代碼上的正PWM值可能會(huì)轉(zhuǎn)動(dòng)輪子使機(jī)器人向后移動(dòng),而不是向前移動(dòng)。也許正面將一個(gè)電機(jī)轉(zhuǎn)向一側(cè)而另一個(gè)轉(zhuǎn)向另一側(cè)。在這種情況下,只需切換電機(jī)端子上的電線,這很好。
也許您必須更改變量read而不是X和Y,也許您的指南針計(jì)劃將使用X和Z,或Y和Z.取決于您如何放置和配置數(shù)字指南針。也許名為0(零)的傳感器不會(huì)在機(jī)器人前面,你必須以不同方式連接或配置它們。
畢竟,你可能已經(jīng)完成了你的機(jī)器人。您可以根據(jù)需要更改其行為,但我可以保證它將起作用,或者至少代碼將會(huì)起作用。機(jī)器人將正確讀取指南針,將計(jì)算他前進(jìn)的位置,他想要去的方向,為每個(gè)電機(jī)提供多少功率,以及看每個(gè)傳感器的障礙物有多遠(yuǎn)。剩下大量的ROM內(nèi)存,所以你可以按照自己的意愿實(shí)現(xiàn)不同的策略。
再次,正如我在之前的Instructable(鏈接)中所寫,這是關(guān)于帶藍(lán)牙和紅外遙控的鬧鐘,我還有其他一些我想和你們分享的項(xiàng)目。如果有人喜歡這個(gè),請(qǐng)?jiān)谶@里發(fā)表評(píng)論并關(guān)注我,因?yàn)槲铱赡軙?huì)再寫一篇關(guān)于我為Windows Phone(或任何其他平臺(tái))制作的帶有數(shù)字指南針,加速度計(jì)和藍(lán)牙的智能手表(再次 - “ 藍(lán)牙“ )一切都更好。抱歉英文不好。
責(zé)任編輯:wv
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28557瀏覽量
207692 -
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5844瀏覽量
170787
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論