資料介紹
描述
第 1 步:物料清單
- iRobot Create2
- Arduino UNO
- 藍(lán)牙模塊HC-06
- 按鈕
第 2 步:Roomba Create2
Roomba 是一款差速驅(qū)動(dòng)機(jī)器人,帶有 2 個(gè)輪子和一個(gè)前腳輪。它的速度高達(dá) 500 毫米/秒,并且可以被命令向上或向后移動(dòng)。
對(duì)于信號(hào)化,我們可以用四個(gè) 7 段顯示器和 5 個(gè) LED 來(lái)計(jì)數(shù)(見(jiàn)圖):
- 干凈的
- 點(diǎn)
- 碼頭
- 警告/檢查
- 污垢/碎片
作為內(nèi)部傳感器,我們有:
- 懸崖探測(cè)器(前面4個(gè))
- 碰撞檢測(cè)器(前面 2 個(gè))
- 車(chē)輪編碼器
對(duì)于編程,應(yīng)使用文檔:iRobot? Create? 2 ??Open Interface (OI) 。Roomba 可以設(shè)置為 3 種模式:
被動(dòng)模式:
- 在發(fā)送啟動(dòng)命令或任何一種清潔模式命令(例如,Spot、Clean、Seek Dock)時(shí),OI 進(jìn)入被動(dòng)模式。當(dāng) OI 處于被動(dòng)模式時(shí),您可以使用任何傳感器命令請(qǐng)求和接收傳感器數(shù)據(jù),但不能將執(zhí)行器(電機(jī)、揚(yáng)聲器、燈、低邊驅(qū)動(dòng)器、數(shù)字輸出)的當(dāng)前命令參數(shù)更改為其他參數(shù).
安全模式:讓您可以完全控制 Roomba,但以下與安全相關(guān)的情況除外:
- 充電器插入并通電。
- 檢測(cè)車(chē)輪掉落(在任何車(chē)輪上)。
- 向前移動(dòng)(或以小轉(zhuǎn)彎半徑向后移動(dòng),小于一個(gè)機(jī)器人半徑)時(shí)檢測(cè)懸崖。
- 如果在 OI 處于安全模式時(shí)出現(xiàn)上述安全相關(guān)情況之一,Roomba 會(huì)停止所有電機(jī)并恢復(fù)到被動(dòng)模式。
完整模式:
- 當(dāng) OI 處于安全模式時(shí),您可以完全控制 Roomba、其所有執(zhí)行器以及所有與安全相關(guān)的條件,因?yàn)橥暾J綍?huì)關(guān)閉懸崖、車(chē)輪掉落和內(nèi)部充電器安全功能。
第 3 步:串行連接
對(duì)于 Roomba 和 Arduino 之間的通信,將使用串行端口。默認(rèn)情況下,Roomba 以 115,200 波特率進(jìn)行通信,但為??了與 Arduino 通信,我們將其切換為 19,200。
設(shè)置 Roomba 波特率的方法有 2 種:
- 關(guān)閉 Roomba 電源時(shí),在燈熄滅后繼續(xù)按住清潔/電源按鈕。大約 10 秒后,Roomba 會(huì)播放一段下降音高的曲子。Roomba 將以 19,200 波特率進(jìn)行通信,直到處理器失去電池電量或通過(guò) OI 明確更改波特率。
- 使用波特率更改引腳(Mini-DIN 連接器上的引腳 5)更改 Roomba 的波特率。打開(kāi) Roomba 后,等待 2 秒,然后將波特率更改脈沖低 3 次。每個(gè)脈沖應(yīng)持續(xù) 50 到 500 毫秒。Roomba 將以 19200 波特率進(jìn)行通信,直到處理器失去電池電量或通過(guò) OI 明確更改波特率。
上圖顯示了 Arduino 應(yīng)如何連接到 Roomba Mini-DIN 連接器
第 4 步:?jiǎn)?dòng) Roomba
對(duì) Roomba 進(jìn)行編程時(shí)必須做的第一件事是:
- “喚醒”機(jī)器人
- 定義模式(安全或完整)
我們可以“喚醒”它,向 Mini-DIN 引腳 5(檢測(cè)設(shè)備輸入)發(fā)送一個(gè)低電平脈沖,如下面的函數(shù)所示:
void wakeUp (void)
{
setWarningLED(ON);
digitalWrite(ddPin, HIGH);
delay(100);
digitalWrite(ddPin, LOW);
delay(500);
digitalWrite(ddPin, HIGH);
delay(2000);
}
要啟動(dòng) Roomba,必須發(fā)送 2 個(gè)代碼:“START”[128] 和模式,在我們的例子中為“SAFE MODE”[131]。如果您想要“完整模式”,則應(yīng)發(fā)送代碼 [132]。
void startSafe()
{
Roomba.write(128); //Start
Roomba.write(131); //Safe mode
delay(1000);
}
第 5 步:打開(kāi) LED 和顯示屏
打開(kāi) LED
如簡(jiǎn)介所述,Roomba 有 5 個(gè) LED:
- 電源/清潔(雙色紅/綠和強(qiáng)度控制)
- 點(diǎn)(綠色,固定強(qiáng)度)
- 碼頭(綠色,固定強(qiáng)度)
- 警告/檢查(橙色,固定強(qiáng)度)
- 污垢/碎片(藍(lán)色,固定強(qiáng)度)
可以使用代碼 [139] 命令所有 LED。要控制電源 LED,您必須向 Roomba 發(fā)送兩個(gè)數(shù)據(jù)字節(jié):“顏色”和“強(qiáng)度”。
顏色:
- 綠色 = 0
- 橙色 = 128
- 紅色=255
強(qiáng)度:
- 低=0
- 最大=255
函數(shù)setPowerLED (byte setColor, byte setIntensity)做到了:
void setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4)
{
Roomba.write(163);
Roomba.write(digit1);
Roomba.write(digit2);
Roomba.write(digit3);
Roomba.write(digit4);
}
例如,要將橙色的 POWER LED 點(diǎn)亮一半強(qiáng)度,您可以調(diào)用如下函數(shù):
setPowerLED (128, 128);
要打開(kāi)剩余的 4 個(gè) LED,必須使用以下功能:
setDebrisLED(ON);
setDockLED(ON);
setSpotLED(ON);
setWarningLED(ON);
上述所有函數(shù)的代碼都與此類(lèi)似:
void setDebrisLED(bool enable)
{
debrisLED = enable;
Roomba.write(139);
Roomba.write((debrisLED ? 1 : 0) + (spotLED ? 2 : 0) + (dockLED ? 4 : 0) + (warningLED ? 8 : 0));
Roomba.write((byte)color);
Roomba.write((byte)intensity);
}
基本上區(qū)別在于:
debrisLED = enable;
必須更改啟用其他每個(gè) LED(spotLED、dockLED、warningLED )。
發(fā)送消息顯示
Roomba 有四個(gè) 7 段顯示器,您可以使用它們以?xún)煞N不同的方式發(fā)送消息:
- 代碼 [163]:數(shù)字 LED 原始(數(shù)字)
- 代碼 [164]:數(shù)字 LED ASCII(字母和特殊代碼的近似值)
顯示數(shù)字非常容易。您必須在要顯示的 4 位數(shù)字之后發(fā)送代碼 [163]。函數(shù):setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4)為您執(zhí)行此操作:
void setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4)
{
Roomba.write(163);
Roomba.write(digit1);
Roomba.write(digit2);
Roomba.write(digit3);
Roomba.write(digit4);
}
例如,要顯示“1、2、3、4”,必須調(diào)用函數(shù):
setDigitLEDs(1, 2, 3, 4);
使用代碼 [164],可以發(fā)送 ASCII 的近似值。函數(shù)setDigitLEDFromASCII(byte digit, char letter)對(duì)我們這樣做:
void setDigitLEDFromASCII(byte digit, char letter)
{
switch (digit){
case 1:
digit1 = letter;
break;
case 2:
digit2 = letter;
break;
case 3:
digit3 = letter;
break;
case 4:
digit4 = letter;
break;
}
Roomba.write(164);
Roomba.write(digit1);
Roomba.write(digit2);
Roomba.write(digit3);
Roomba.write(digit4);
}
為了簡(jiǎn)化,我創(chuàng)建了一個(gè)新函數(shù)來(lái)同時(shí)發(fā)送 4 位數(shù)字:
void writeLEDs (char a, char b, char c, char d)
{
setDigitLEDFromASCII(1, a);
setDigitLEDFromASCII(2, b);
setDigitLEDFromASCII(3, c);
setDigitLEDFromASCII(4, d);
}
例如,要顯示“STOP”,您必須調(diào)用該函數(shù):
writeLEDs ('s', 't', 'o', 'p');
第 6 步:移動(dòng) Roomba
對(duì)于移動(dòng)性,Roomba 有 2 個(gè)獨(dú)立的直流電機(jī),可通過(guò)編程以高達(dá) 500 毫米/秒的速度運(yùn)行。有幾個(gè)命令可用于驅(qū)動(dòng)機(jī)器人。主要有:
- 代碼 [137]:驅(qū)動(dòng)器 ==> 必須發(fā)送 +/- 速度(以 mm/s 為單位)和 +/- 半徑(以 mm 為單位)
- 代碼 [145]:直接驅(qū)動(dòng) ==> 必須以 mm/s 為單位發(fā)送左/右速度(+ 表示前進(jìn),- 表示后退)
- 代碼 [146]:驅(qū)動(dòng) PWM ==> 必須為左右輪發(fā)送 +/- PWM 數(shù)據(jù)
以下是這 3 個(gè)選項(xiàng)的代碼:
void drive(int velocity, int radius)
{
clamp(velocity, -500, 500); //def max and min velocity in mm/s
clamp(radius, -2000, 2000); //def max and min radius in mm
Roomba.write(137);
Roomba.write(velocity >> 8);
Roomba.write(velocity);
Roomba.write(radius >> 8);
Roomba.write(radius);
}
//---------------------------------------------------------------
void driveWheels(int right, int left)
{
clamp(right, -500, 500);
clamp(left, -500, 500);
Roomba.write(145);
Roomba.write(right >> 8);
Roomba.write(right);
Roomba.write(left >> 8);
Roomba.write(left);
}
//---------------------------------------------------------------
void driveWheelsPWM(int rightPWM, int leftPWM)
{
clamp(rightPWM, -255, 255);
clamp(leftPWM, -255, 255);
Roomba.write(146);
Roomba.write(rightPWM >> 8);
Roomba.write(rightPWM);
Roomba.write(leftPWM >> 8);
Roomba.write(leftPWM);
}
請(qǐng)注意,“clamp”功能定義了允許輸入的最大值和最小值。該函數(shù)在文件rombaDefines.h 中定義:
#define clamp(value, min, max) (value < min ? min : value > max ? max : value)
使用上面的代碼,可以創(chuàng)建更簡(jiǎn)單的函數(shù)來(lái)驅(qū)動(dòng) Roomba:
/---------------------------------------------------------------
void turnCW(unsigned short velocity, unsigned short degrees)
{
drive(velocity, -1);
clamp(velocity, 0, 500);
delay(6600);
drive(0,0);
}
//---------------------------------------------------------------
void turnCCW(unsigned short velocity, unsigned short degrees)
{
drive(velocity, 1);
clamp(velocity, 0, 500);
delay(6600);
drive(0,0);
}
//---------------------------------------------------------------
void driveStop(void)
{
drive(0,0);
}
//---------------------------------------------------------------
void driveLeft(int left)
{
driveWheels(left, 0);
}
//---------------------------------------------------------------
void driveRight(int right)
{
driveWheels(0, right);
}
請(qǐng)注意,要轉(zhuǎn)向角度,必須針對(duì)給定速度專(zhuān)門(mén)計(jì)算“延遲”參數(shù)。下面是一些可用于測(cè)試電機(jī)的示例:
turnCW (40, 180); // spin clockwise 180 degrees and stop
driveWheels(20, -20); // spin
driveLeft(20); // turning left
為了測(cè)試電機(jī),最好添加一個(gè)外部按鈕(在我的情況下連接到 Arduino 引腳 12),因此您可以將代碼下載到 Arduino,啟動(dòng) Roomba,但在按下按鈕之前停止執(zhí)行。通常,對(duì)于電機(jī)測(cè)試,您可以在代碼的設(shè)置部分進(jìn)行。
例如,請(qǐng)看下面的簡(jiǎn)單 Arduino 代碼(注意代碼使用了之前開(kāi)發(fā)的函數(shù)和定義):
#include "roombaDefines.h"
#include
// Roomba Create2 connection
int rxPin=10;
int txPin=11;
SoftwareSerial Roomba(rxPin,txPin);
//---------------------------------------------
void setup()
{
Roomba.begin(19200);
pinMode(ddPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // connected to Arduino pin 12 and used for "starting"
delay(2000);
wakeUp (); // Wake-up Roomba
startSafe(); // Start Roomba in Safe Mode
while (digitalRead(buttonPin)) { } // wait button to be pressed to continous run code
turnCW (40, 180); //test Roomba spin clock-wise 180 degrees and stop
}
//---------------------------------------------
void loop()
{
}
第 7 步:通過(guò)藍(lán)牙控制 Roomba
為了完成項(xiàng)目的第一部分,讓我們?cè)谖覀兊?Arduino 上安裝一個(gè)藍(lán)牙模塊 (HC-06)。上圖顯示了如何做到這一點(diǎn)。通常 HC-06 出廠設(shè)置波特率為 9,600。將其更改為 19,200 以兼容 Arduino-Roomba 通信速度非常重要。您可以向模塊發(fā)送 AT 命令(AT+BAUD5,其中“5”是 19,200 的代碼)。
如果您對(duì) HC-06 的工作原理有任何疑問(wèn),請(qǐng)查看我的教程:通過(guò)藍(lán)牙 / Android / Arduino 連接“東西” 。
為了控制 Roomba,我們將使用我開(kāi)發(fā)的通用應(yīng)用程序來(lái)控制移動(dòng)機(jī)器人,使用 MIT AppInventor 2:“MJRoBot BT 遠(yuǎn)程控制”。該應(yīng)用程序可以通過(guò)以下鏈接從 Google 商店免費(fèi)下載:應(yīng)用程序:MJRoBot BT 遠(yuǎn)程控制。
該應(yīng)用程序有一個(gè)簡(jiǎn)單的界面,允許您以文本模式或直接通過(guò)預(yù)編程按鈕(每次按下按鈕,發(fā)送一個(gè)字符)向 BT 模塊發(fā)送命令:
- w:前鋒
- s:向后
- d: 對(duì)
- 一:左
- f:停止
- p:開(kāi)/關(guān)(第一部分未使用)
- m:手動(dòng)/自動(dòng)(用于在安全模式下發(fā)現(xiàn)懸崖等障礙物時(shí)重新啟動(dòng) Roomba)
- +:速度 +
- -: 速度 -
如有必要,您還可以將其他命令作為文本發(fā)送。還有一個(gè)文本窗口,用于顯示從 BT 模塊接收到的消息。此功能在測(cè)試階段非常重要,可以像“串行監(jiān)視器”一樣使用。
代碼的loop()部分將“監(jiān)聽(tīng)”藍(lán)牙設(shè)備,并根據(jù)收到的命令采取行動(dòng):
void loop()
{
checkBTcmd(); // verify if a comand is received from BT remote control
manualCmd ();
}
函數(shù)checkBTcmd()如下所示:
void checkBTcmd() // verify if a command is received from BT remote control
{
if (BT1.available())
{
command = BT1.read();
BT1.flush();
}
}
一旦收到命令,函數(shù)manualCmd()將采取適當(dāng)?shù)男袆?dòng):
void manualCmd()
{
switch (command)
{
case 'm':
startSafe();
Serial.print("Roomba in Safe mode");
BT1.print("Roomba BT Ctrl OK - Safe mode");
BT1.println('\n');
command = 'f';
playSound (3);
break;
case 'f':
driveStop(); //turn off both motors
writeLEDs ('s', 't', 'o', 'p');
state = command;
break;
case 'w':
drive (motorSpeed, 0);
writeLEDs (' ', 'g', 'o', ' ');
state = command;
break;
case 'd':
driveRight(motorSpeed);
writeLEDs ('r', 'i', 'g', 'h');
break;
case 'a':
driveLeft(motorSpeed);
writeLEDs ('l', 'e', 'f', 't');
break;
case 's':
drive (-motorSpeed, 0);
writeLEDs ('b', 'a', 'c', 'k');
state = command;
break;
case '+':
if (state == 'w')
{
motorSpeed = motorSpeed + 10;
if (motorSpeed > MAX_SPEED)
{
motorSpeed = MAX_SPEED;
}
command = 'w';
} else {command = state;}
break;
case '-':
if (state == 'w')
{
motorSpeed = motorSpeed - 10;
}
if (motorSpeed < MIN_SPEED )
{
motorSpeed = MIN_SPEED;
}
Serial.println(motorSpeed);
command = state;
break;
}
}
第 8 步:結(jié)論
此處使用的完整 Arduino 代碼和相關(guān)文檔可以在我的GITHUB:Roomba_BT_Ctrl中找到。
請(qǐng)注意,并非所有 Roomba 執(zhí)行器都對(duì)本教程進(jìn)行了評(píng)論。還有其他用于清潔的電機(jī),用于日程安排的其他 LED、按鈕、傳感器等。
我在我的程序中創(chuàng)建的幾個(gè)函數(shù)基于 Dom Amato 開(kāi)發(fā)的 Create 2 庫(kù)。您可以在以下位置下載完整的庫(kù):https ://github.com/brinnLabs/Create2 。
我的目的是保持簡(jiǎn)單,并為您提供一個(gè)開(kāi)始使用 Roomba 的平臺(tái)。將來(lái),我會(huì)假裝發(fā)布其他教程,使用 Raspberry-Pi,將 Roomba 連接到互聯(lián)網(wǎng),讀取其傳感器等。
一如既往,我希望這個(gè)項(xiàng)目可以幫助其他人在電子和機(jī)器人這個(gè)激動(dòng)人心的世界中找到自己的道路!
?
- 制作Arduino控制的機(jī)器人
- Arduino控制的Delta機(jī)器人
- Roomba Pine紫外燈機(jī)器人開(kāi)源
- DIY Arduino藍(lán)牙控制機(jī)器人
- 藍(lán)牙控制的Arduino機(jī)器人
- 建造Roomba類(lèi)型的功能機(jī)器人
- Arduino藍(lán)牙控制的機(jī)器人汽車(chē)
- 通過(guò)WiFi使用Android設(shè)備控制機(jī)器人汽車(chē)
- 可用Android通過(guò)藍(lán)牙進(jìn)行控制的機(jī)器人汽車(chē) 0次下載
- 基于Arduino UNO的語(yǔ)音控制機(jī)器人 6次下載
- 基于DSP和PC的農(nóng)業(yè)機(jī)器人控制系統(tǒng) 17次下載
- 機(jī)器人PID控制概述 27次下載
- Arduino教學(xué)機(jī)器人的使用教程免費(fèi)下載 37次下載
- Arduino開(kāi)發(fā)機(jī)器人經(jīng)典書(shū)籍推薦Arduino開(kāi)發(fā)實(shí)戰(zhàn)指南:機(jī)器人卷
- 機(jī)器人設(shè)計(jì)教程之機(jī)器人控制和決策子系統(tǒng) 23次下載
- 如何使用PLC控制機(jī)器人 794次閱讀
- 如何使用Arduino制造一個(gè)自動(dòng)平衡機(jī)器人 4429次閱讀
- 基于PIC單片機(jī)和PSC控制器實(shí)現(xiàn)機(jī)器人控制系統(tǒng)的設(shè)計(jì) 3699次閱讀
- dfrobotArcBotics 六足機(jī)器人套件簡(jiǎn)介 1873次閱讀
- dfrobotDevastator履帶機(jī)器人移動(dòng)平臺(tái)簡(jiǎn)介 1515次閱讀
- 機(jī)器人控制系統(tǒng)分類(lèi)_機(jī)器人控制系統(tǒng)有哪些 2.6w次閱讀
- 工業(yè)機(jī)器人技術(shù)應(yīng)用 5176次閱讀
- 機(jī)器人控制器有哪些類(lèi)型_機(jī)器人控制器發(fā)展 1.1w次閱讀
- 關(guān)于工業(yè)機(jī)器人智能控制的四種控制方式 6336次閱讀
- 協(xié)作機(jī)器人的起源_為什么需要協(xié)作機(jī)器人 8127次閱讀
- 移動(dòng)機(jī)器人控制系統(tǒng)設(shè)計(jì)與仿真 3433次閱讀
- 機(jī)器人控制系統(tǒng)的基本單元與機(jī)器人控制系統(tǒng)的特點(diǎn)分析 1w次閱讀
- 機(jī)器人的運(yùn)動(dòng)控制的介紹和如何將機(jī)器人的運(yùn)動(dòng)控制分成4種任務(wù) 1w次閱讀
- 基于PLC的機(jī)器人伺服運(yùn)動(dòng)控制系統(tǒng)設(shè)計(jì)詳解 1.5w次閱讀
- 掃地機(jī)器人的工作原理詳解 10.5w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多