色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
創作
電子發燒友網>電子資料下載>電子資料>使用Arduino和Android設備控制Roomba機器人

使用Arduino和Android設備控制Roomba機器人

2023-06-29 | zip | 0.00 MB | 次下載 | 免費

資料介紹

描述

第 1 步:物料清單

  • iRobot Create2
  • 按鈕

第 2 步:Roomba Create2

?
?
?
?
pYYBAGN7H9-AMGnTAADq2pSSIGo367.jpg
?
1 / 2
?

Roomba 是一款差速驅動機器人,帶有 2 個輪子和一個前腳輪。它的速度高達 500 毫米/秒,并且可以被命令向上或向后移動。

對于信號化,我們可以用四個 7 段顯示器和 5 個 LED 來計數(見圖):

  • 干凈的
  • 碼頭
  • 警告/檢查
  • 污垢/碎片

作為內部傳感器,我們有:

  • 碰撞檢測器(前面 2 個)

對于編程,應使用文檔:iRobot? Create? 2 ??Open Interface (OI) 。Roomba 可以設置為 3 種模式:

被動模式:

  • 在發送啟動命令或任何一種清潔模式命令(例如,Spot、Clean、Seek Dock)時,OI 進入被動模式。當 OI 處于被動模式時,您可以使用任何傳感器命令請求和接收傳感器數據,但不能將執行器(電機、揚聲器、燈、低邊驅動器、數字輸出)的當前命令參數更改為其他參數.

安全模式:讓您可以完全控制 Roomba,但以下與安全相關的情況除外:

  • 充電器插入并通電。
  • 檢測車輪掉落(在任何車輪上)。
  • 向前移動(或以小轉彎半徑向后移動,小于一個機器人半徑)時檢測懸崖。
  • 如果在 OI 處于安全模式時出現上述安全相關情況之一,Roomba 會停止所有電機并恢復到被動模式。

完整模式:

  • 當 OI 處于安全模式時,您可以完全控制 Roomba、其所有執行器以及所有與安全相關的條件,因為完整模式會關閉懸崖、車輪掉落和內部充電器安全功能。

第 3 步:串行連接

?
?
?
?
poYBAGN7H-KAUWvpAADOYiwKOfk511.jpg
?
1 / 3
?

對于 Roomba 和 Arduino 之間的通信,將使用串行端口。默認情況下,Roomba 以 115,200 波特率進行通信,但為??了與 Arduino 通信,我們將其切換為 19,200。

設置 Roomba 波特率的方法有 2 種:

  • 關閉 Roomba 電源時,在燈熄滅后繼續按住清潔/電源按鈕。大約 10 秒后,Roomba 會播放一段下降音高的曲子。Roomba 將以 19,200 波特率進行通信,直到處理器失去電池電量或通過 OI 明確更改波特率。
  • 使用波特率更改引腳(Mini-DIN 連接器上的引腳 5)更改 Roomba 的波特率。打開 Roomba 后,等待 2 秒,然后將波特率更改脈沖低 3 次。每個脈沖應持續 50 到 500 毫秒。Roomba 將以 19200 波特率進行通信,直到處理器失去電池電量或通過 OI 明確更改波特率。

上圖顯示了 Arduino 應如何連接到 Roomba Mini-DIN 連接器

第 4 步:啟動 Roomba

對 Roomba 進行編程時必須做的第一件事是:

  • “喚醒”機器人
  • 定義模式(安全或完整)

我們可以“喚醒”它,向 Mini-DIN 引腳 5(檢測設備輸入)發送一個低電平脈沖,如下面的函數所示:

void wakeUp (void)
{
  setWarningLED(ON);
  digitalWrite(ddPin, HIGH);
  delay(100);
  digitalWrite(ddPin, LOW);
  delay(500);
  digitalWrite(ddPin, HIGH);
  delay(2000);
} 

要啟動 Roomba,必須發送 2 個代碼:“START”[128] 和模式,在我們的例子中為“SAFE MODE”[131]。如果您想要“完整模式”,則應發送代碼 [132]。

void startSafe()
{  
  Roomba.write(128);  //Start
  Roomba.write(131);  //Safe mode
  delay(1000);
} 

第 5 步:打開 LED 和顯示屏

?
?
?
?
pYYBAGN7H-SAat-8AAEm2fHLbpQ221.jpg
?
1 / 2
?

打開 LED

如簡介所述,Roomba 有 5 個 LED:

  • 電源/清潔(雙色紅/綠和強度控制)
  • 點(綠色,固定強度)
  • 碼頭(綠色,固定強度)
  • 警告/檢查(橙色,固定強度)
  • 污垢/碎片(藍色,固定強度)

可以使用代碼 [139] 命令所有 LED。要控制電源 LED,您必須向 Roomba 發送兩個數據字節:“顏色”和“強度”。

顏色:

  • 綠色 = 0
  • 橙色 = 128
  • 紅色=255

強度:

  • 低=0
  • 最大=255

函數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 點亮一半強度,您可以調用如下函數:

setPowerLED (128, 128);

要打開剩余的 4 個 LED,必須使用以下功能:

setDebrisLED(ON);
setDockLED(ON); 
setSpotLED(ON); 
setWarningLED(ON);

上述所有函數的代碼都與此類似:

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);
} 

基本上區別在于:

debrisLED = enable;

必須更改啟用其他每個 LED(spotLED、dockLED、warningLED )。

發送消息顯示

Roomba 有四個 7 段顯示器,您可以使用它們以兩種不同的方式發送消息:

  • 代碼 [163]:數字 LED 原始(數字)
  • 代碼 [164]:數字 LED ASCII(字母和特殊代碼的近似值)

顯示數字非常容易。您必須在要顯示的 4 位數字之后發送代碼 [163]。函數:setDigitLEDs(byte digit1, byte digit2, byte digit3, byte digit4)為您執行此操作:

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”,必須調用函數:

setDigitLEDs(1, 2, 3, 4);

使用代碼 [164],可以發送 ASCII 的近似值。函數setDigitLEDFromASCII(byte digit, char letter)對我們這樣做:

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);
} 

為了簡化,我創建了一個新函數來同時發送 4 位數字:

void writeLEDs (char a, char b, char c, char d)
{
  setDigitLEDFromASCII(1, a);
  setDigitLEDFromASCII(2, b);
  setDigitLEDFromASCII(3, c);
  setDigitLEDFromASCII(4, d);
} 

例如,要顯示“STOP”,您必須調用該函數:

writeLEDs ('s', 't', 'o', 'p');

第 6 步:移動 Roomba

?
pYYBAGN7H-mASY2PAAGcnynLrnc172.jpg
?

對于移動性,Roomba 有 2 個獨立的直流電機,可通過編程以高達 500 毫米/秒的速度運行。有幾個命令可用于驅動機器人。主要有:

  • 代碼 [137]:驅動器 ==> 必須發送 +/- 速度(以 mm/s 為單位)和 +/- 半徑(以 mm 為單位)
  • 代碼 [145]:直接驅動 ==> 必須以 mm/s 為單位發送左/右速度(+ 表示前進,- 表示后退)
  • 代碼 [146]:驅動 PWM ==> 必須為左右輪發送 +/- PWM 數據

以下是這 3 個選項的代碼:

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);
} 

請注意,“clamp”功能定義了允許輸入的最大值和最小值。該函數在文件rombaDefines.h 中定義:

#define clamp(value, min, max) (value < min ? min : value > max ? max : value)

使用上面的代碼,可以創建更簡單的函數來驅動 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);
} 

請注意,要轉向角度,必須針對給定速度專門計算“延遲”參數。下面是一些可用于測試電機的示例:

turnCW (40, 180);  // spin clockwise 180 degrees and stop
driveWheels(20, -20); // spin 
driveLeft(20); // turning left

為了測試電機,最好添加一個外部按鈕(在我的情況下連接到 Arduino 引腳 12),因此您可以將代碼下載到 Arduino,啟動 Roomba,但在按下按鈕之前停止執行。通常,對于電機測試,您可以在代碼的設置部分進行。

例如,請看下面的簡單 Arduino 代碼(注意代碼使用了之前開發的函數和定義):

#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 步:通過藍牙控制 Roomba

?
?
?
?
poYBAGN7H-uAGQYNAADqQYIa_VA091.jpg
?
1 / 3
?

為了完成項目的第一部分,讓我們在我們的 Arduino 上安裝一個藍牙模塊 (HC-06)。上圖顯示了如何做到這一點。通常 HC-06 出廠設置波特率為 9,600。將其更改為 19,200 以兼容 Arduino-Roomba 通信速度非常重要。您可以向模塊發送 AT 命令(AT+BAUD5,其中“5”是 19,200 的代碼)。

如果您對 HC-06 的工作原理有任何疑問,請查看我的教程通過藍牙 / Android / Arduino 連接“東西”

為了控制 Roomba,我們將使用我開發的通用應用程序來控制移動機器人,使用 MIT AppInventor 2:“MJRoBot BT 遠程控制”。該應用程序可以通過以下鏈接從 Google 商店免費下載:應用程序:MJRoBot BT 遠程控制。

該應用程序有一個簡單的界面,允許您以文本模式或直接通過預編程按鈕(每次按下按鈕,發送一個字符)向 BT 模塊發送命令:

  • w:前鋒
  • s:向后
  • d: 對
  • 一:左
  • f:停止
  • p:開/關(第一部分未使用)
  • m:手動/自動(用于在安全模式下發現懸崖等障礙物時重新啟動 Roomba)
  • +:速度 +
  • -: 速度 -

如有必要,您還可以將其他命令作為文本發送。還有一個文本窗口,用于顯示從 BT 模塊接收到的消息。此功能在測試階段非常重要,可以像“串行監視器”一樣使用。

代碼的loop()部分將“監聽”藍牙設備,并根據收到的命令采取行動:

void loop() 
{
   checkBTcmd();  // verify if a comand is received from BT remote control
   manualCmd ();
}

函數checkBTcmd()如下所示:

void checkBTcmd()  // verify if a command is received from BT remote control
 { 
    if (BT1.available()) 
    { 
      command = BT1.read();
      BT1.flush();
    }
 }

一旦收到命令,函數manualCmd()將采取適當的行動:

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 步:結論

此處使用的完整 Arduino 代碼和相關文檔可以在我的GITHUB:Roomba_BT_Ctrl中找到。

請注意,并非所有 Roomba 執行器都對本教程進行了評論。還有其他用于清潔的電機,用于日程安排的其他 LED、按鈕、傳感器等。

我在我的程序中創建的幾個函數基于 Dom Amato 開發的 Create 2 庫。您可以在以下位置下載完整的庫:https ://github.com/brinnLabs/Create2 。

我的目的是保持簡單,并為您提供一個開始使用 Roomba 的平臺。將來,我會假裝發布其他教程,使用 Raspberry-Pi,將 Roomba 連接到互聯網,讀取其傳感器等。

一如既往,我希望這個項目可以幫助其他人在電子和機器人這個激動人心的世界中找到自己的道路!

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 日韩专区亚洲国产精品| 小夫妻天天恶战| 欧美黑人巨大xxxxx| 久久人妻少妇嫩草AV無碼| 久久这里只有精品国产精品99| 久久精品无码成人国产毛| 久久久精品3d动漫一区二区三区| 后入式狂顶免费视频| 久久久97人妻无码精品蜜桃| 恋夜影院安卓免费列表uc| 欧美日韩免费播放一区二区| 日日噜噜大屁股熟妇| 污污内射在线观看一区二区少妇 | 最近的2019中文字幕HD| 2019香蕉在线观看直播视频| QVOD理论| 国产一区二区内射最近更新| 久久久久久久电影| 日本视频久久| 亚洲男同tv| 啊好深啊别拔就射在里面| 国产视频成人| 免费国产成人高清在线看软件| 涩涩免费网站| 诱咪youmiss| 成人在线观看视频免费| 精品国产人妻国语| 日本一二三区在线视频| 亚洲熟女片嫩草影院| 成年人视频在线免费看| 精品手机在线1卡二卡3卡四卡| 热中文热国产热综合| 亚洲野狼综合网站| 国产不卡视频在线| 男男gaygay拳头| 亚洲视频不卡| 高清无码中文字幕在线观看视频| 久久伦理影院| 性刺激欧美三级在线现看中文| 办公室中文BD| 欧美高清vivoesosexo10|