电子发烧友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次下载  |  免费