_SKU_DFR0305_RoMeo_BLE控制器V1.0_兼容Arduino - jimaobian/DFRobotWikiCn GitHub Wiki

RoMeo BLE V1.0

概述

RoMeo BLE控制器继承了RoMeo控制器的所有功能并在其基础上增加了蓝牙4.0无线通信功能,可以说是蓝牙4.0和Arduino激烈碰撞并完美融合

的众多结晶之一,所以容我将它描述为携带了蓝牙4.0基因又兼容Arduino的专为机器人应用而设计的控制主板,受益Arduino开源平台,因此受到成千上万

的开放源码的支持,并可以很容易地扩展arduino模块。

集成2路直流电动机驱动器和无线插座,给出了一个更简单容易的方式开始你的机器人项目。

性能描述

  • BLE芯片: TI CC2540
  • 传输距离: 空旷地带70m以�
  • 支持蓝牙远程更新Arduino程序
  • 支持蓝牙HID
  • 支持iBeacons
  • 支持AT指令配置BLE
  • 支持串口透�
  • 支持主从机切换
  • 支持通过usb更新BLE芯片程序
  • 微处理器:ATmega328P
  • 引导装载程序:Arduino UNO
  • 14 通道数字 I/O
  • 6 PWM 通道 (Pin11,Pin10,Pin9,Pin6,Pin5,Pin3)
  • 8通道10位模拟输入
  • USB接口
  • 自动切换输入电源
  • ICSP下载程序接口
  • 串行接口TTL电平
  • 支持AREF
  • 具有排母和排针接口
  • 具有APC220射频模块插座
  • 具有3组I2C接口
  • 2路2A电流的H桥马达驱动接口
  • 模拟5键输入
  • 直流电源:USB供电或外部5V〜23V直流。
  • DC输出:5V/3.3V直流电源输出
  • 尺寸:94x80mm

管脚定义

Fig1: RoMeo BLE Pin Out 上面的图片显示RoMeo BLE控制器上所有的I/O线和连接器,其中包括:

  • 电源:使用USB供电或电机电源供电,当使用电机电源供电时将图中电源切换开关拨到ON,电机电源供电通过板载DC-DC电源转换输出稳定5V电压,将控制板上5V电源电流输出能力提高到2A,而USB供电时5V最大输出电流只有500mA,当接入电机时,需要接入电机电源才能使电机驱动部分正常工作。
  • 电机电源输入端子(5V to 23v)
  • 一个非稳压伺服电源输入端子(5V至20V)
  • 一个串行的APC220模块接口
  • 两个直流电动机的接线端子 -电机电流可高达2A
  • 一个I2C/TWI接口的SDA,SCL,5V,GND
  • 内部连接到一个模拟端口,8个模拟输入 - 输入电源电压
  • 一个通用的I/O端口和13个I/O线 - 4,5,6,7可用于控制马达
  • 一个复位按键
  • 五个按键输入
  • 启用/禁用电机控制跳线
  • 启用/禁用按键功能开关
  • 启用/禁用电机电源开关

| 注意:使用USB口调试电机的时候,请关闭电机开关! |

控制器应用

电源

这是RoMeo控制器与主机控制器通信的最重要步骤之一。你必须确保你接通电源的电力终端使用正确的极性。反接会损坏RoMeo控制器。 “人为造成损坏我们将不负责保修,可以提供有偿维修。请确保你使用正确适用的电源。否则,后果自负!”

从USB电源: 只需插上USB线,RoMeo控制器就能够工作。请注意,USB只能提供500毫安的电流。它应该能够满足大多数需求,比如LED背光应用。然而,它是没有足够的功率推动直流电动机或伺服。

电机电源输入: 你可以从Motor Power In的接线柱端子连接线,标示“M_VIN”为电源正,当电机电源小于12V时,控制器可以和电机共用一个电源,Power In Selection 开关拨到ON;当电机电源大于12V时,Power In Selection 开关必须拨到OFF,同时控制器需要单独供电。

| 注意:最大供电电压不能超过24V直流 |

软件

RoMeo BLE控制器可以使用编程环境Arduino IDE 0022及以上。 您可以在Arduino.cc下载,请选择“硬件”的Arduino UNO“。

RoMeo BLE配置

伺服电源外接接口

由于大多数舵机电流大于USB电源可提供的电流。所以设计有1个独立的舵机供电接线端口(Servo Power)。

当Servo Power端口接电源大于5V时,数字口电源将自动断开控制器的5V供电。

电机控制针跳线

电机控制针跳线,将分配用于电机控制引脚为数字口4,5,6,7。

拔掉跳线将释放数字口,电机控制器将被禁用。

使用教程

新功能速递

RoMeo BLE是RoMeo的升级,在其基础上添加了新的元素-蓝牙4.0,使得RoMeo BLE在继承了RoMeo家族强大的电机驱动能力的基础上又具备了蓝牙4.0无线通信的能力,在机器人控制板的路上越走越远,越来越完善。RoMeo BLE具有更强大的电压电流吞吐能力,电压输入范围拓宽到5V-23V,电流输出能力达到2A,从而使控制板可以适应更多需求。Sheild接口增加了I2C,IOREF,AREF口,能兼容更多的Sheild模块。按键也替换成了舒适稳定的按钮,而按钮使能也由跳线方式改为了开关,使得控制板使用起来简单方便。

新功能实验室

下面来做一个BLE-Link与RoMeo BLE蓝牙通信的小实验,通过这个实验我们大概能了解到如何驾驭它的新功能-蓝牙4.0无线传输。

  • 1.实验效果预览:电脑通过BLE-Link向RoMeo BLE发送蓝牙无线数据指令,RoMeo BLE收到指令后根据指令开或关指示灯L。
  • 2.硬件准备:BLE-Link一枚,RoMeo BLE一个,电脑一台,micro USB线一根。
  • 3.软件准备:串口调试助手,Arduino编译器。
  • 4.实际操作:
    • 第一步:将两个蓝牙设备分别配置为主机和从机(蓝牙的通信需建立在主机和从机之间),这里我们将BLE-Link配置为主机,RoMeo BLE配置为从机。具体操作首先将BLE-Link通过USB线连接到电脑,BLE-Link被识别为串口设备,打开串口调试助手(这里以BLE-Link中的固件为V1.8版为例),发送+++到BLE-Link,当返回Enter AT Mode表示进入AT指令模式,然后向BLE-Link发送AT+SETTING=DEFCENTRAL(记得选中新行发送),当返回OK表示BLE-Link已被设置为蓝牙主机。然后我们把RoMeo BLE设为从机,首先将RoMeo BLE连接电脑,同样打开串口调试助手,发送+++并进入AT指令模式,再发送AT+SETTING=DEFPERIPHERAL(记得选中新行发送),返回OK表示RoMeo BLE 被设置为蓝牙从机。
    • 第二步:RoMeo BLE上的Arduino程序,该程序用于解析数据指令来开或关指示灯L。
      • 代码如下:
int led = 13;         // 定义LED为 pin 13
char rcv_buf[10];     //接收指令数组
void setup()
{
  pinMode(led, OUTPUT);    // 设置数字端口13为输出模式
  Serial.begin(115200);   // 设置串口波特率为115200
}

void loop()
{
  int data_len=0;
  while(1)
  {
    while(Serial.available())
    {
       rcv_buf[(data_len++)%10] =Serial.read();       // 当串口有数据时,将数据读出存放到接收数组
    }
    if(rcv_buf[data_len-2]== '\r' && rcv_buf[data_len-1]=='\n')      // 遇到指令结束标志符,结束串口读取
       break;
  }
  if ((data_len==4)&&(!strncmp(rcv_buf,"ON",2)))      // 发送的指令为ON时,打开L指示灯
  {
       digitalWrite(led, HIGH);                       // 将D13引脚置高,使指示灯L点亮
       Serial.println("LIHGT ON");                  // 返回指示灯已经打开报告信息
  }else if((data_len==5)&&(!strncmp(rcv_buf,"OFF",3)))   // 发送的指令为OFF时,关闭L指示灯
  {
       digitalWrite(led, LOW);                      // 将D13引脚置低,使指示灯L熄灭
       Serial.println("LIHGT OFF");                // 返回指示灯已经关闭报告信息
  }
}
  • 第三步:将BLE-Link和电脑连接,RoMeo BLE也上电运行,等待几秒后两个蓝牙设备会自动连接,连接上后两个设备上的LINK灯会变亮提示已连接,即表示两个设备可进行无线通信了,然后打开电脑上的调试助手,在发送框输入ON并选中新行发送(开灯指令)点击发送,此时指令从串口发出,在经由BLE-Link通过蓝牙发送给RoMeo BLE,RoMeo BLE收到指令后由Arduino程序解析,然后打开L指示灯。当发送OFF并新行发送时,RoMeo BLE关掉L灯。

按钮

RoMeo BLE集成了5个按键S1~S5,通过模拟口7控制。使用模拟按键需要时,如下图中所示,把开关拨到"ON"状态。

Ble_romeo_key.png

演示代码1:

int potPin = 7;       //定义输入模拟口7
int ledPin = 13;      //定义LED 为Pin13
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);  //设置LED Pin13为输出
}

void loop() {
  val = analogRead(potPin);    //读模拟口
  digitalWrite(ledPin, HIGH);  //点亮LED
  delay(val);                //延时
  digitalWrite(ledPin, LOW);   //关闭LED
  delay(val);                //延时
}

程序功能:分别按住S1到S5键,会看见LED闪烁的频率不同,这因为按键接入电阻不同,分到模拟口的电压就不同,AD采集到的数据也就不同。

演示代码2:

int adc_key_val[5] ={50, 200, 400, 600, 800 };        //定义一个数组 存放模拟键值比较值
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

void setup(){
  pinMode(13, OUTPUT);  //LED13用来测试是否有按键按下
  Serial.begin(9600); //波特率为9600bps
}

void loop(){
  adc_key_in = analogRead(7);    // 读取模拟口7的值
  digitalWrite(13,LOW);
  key = get_key(adc_key_in);  //调用判断按键程序

  if (key != oldkey){   // 判断是否有新键按下
      delay(50);  // 延时去抖
      adc_key_in = analogRead(7);    // 再次读模拟口7
      key = get_key(adc_key_in);    //调用判断按键程序
      if (key != oldkey)    {
        oldkey = key;
        if (key >=0){
          digitalWrite(13,HIGH);
          switch(key){          // 确认有键按下,就通过串口发送数组相应字符
             case 0:Serial.println("S1 OK");
                    break;
             case 1:Serial.println("S2 OK");
                    break;
             case 2:Serial.println("S3 OK");
                    break;
             case 3:Serial.println("S4 OK");
                    break;
             case 4:Serial.println("S5 OK");
                    break;
          }
        }
      }
  }
  delay(100);
}

// 该函数判断是哪个按键被按下,返回该按键序号
int get_key(unsigned int input){
    int k;
    for (k = 0; k < NUM_KEYS; k++){
      if (input < adc_key_val[k]){     //循环对比比较值,判断是否有键按下,有返回键号
            return k;
      }
   }
   if (k >= NUM_KEYS)k = -1;  //  //没有键按下k =-1
   return k;
}

程序功能:打开IDE串口助手,波特率选择9600,分别按下S1~S5,会看见IDE串口助手里显示按键对应的字符串。

button5_Romeo.png

按键1-5使用范例


char msgs[5][15] = {
  "Right Key OK ",
  "Up Key OK    ",
  "Down Key OK  ",
  "Left Key OK  ",
  "Select Key OK" };
char start_msg[15] = {
  "Start loop "};
int  adc_key_val[5] ={
  30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
void setup() {
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat
  Serial.begin(9600);

  /* Print that we made it here */
  Serial.println(start_msg);
}

void loop()
{
  adc_key_in = analogRead(7);    // read the value from the sensor
  digitalWrite(13, HIGH);
  /* get the key */
  key = get_key(adc_key_in);    // convert into key press
  if (key != oldkey) {   // if keypress is detected
    delay(50);      // wait for debounce time
    adc_key_in = analogRead(7);    // read the value from the sensor
    key = get_key(adc_key_in);    // convert into key press
    if (key != oldkey) {
      oldkey = key;
      if (key >=0){
        Serial.println(adc_key_in, DEC);
        Serial.println(msgs[key]);
      }
    }
  }
  digitalWrite(13, LOW);
}
// Convert ADC value to key number
int get_key(unsigned int input)
{
  int k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }
  if (k >= NUM_KEYS)
    k = -1;     // No valid key pressed
  return k;
}

双直流电动机调速

RoMeo BLE上集成了2路电机驱动,这是为了让机器人爱好者节约大量制作硬件的时间,而把开发重点放在软件上。电机驱动电路采用L298芯片,峰值电流可达2A。当使用电机驱动时,又会涉及到电源供电问题,如下图所示的接线方法,M_VIN接正极,GND接负极。还有就是记得把开关拨到"ON"端。

Romeo_motor.png

PWM控制模式
引脚 功能
4 电机1方向控制
5 电机1PWM控制
6 电机2PWM控制
7 电机2方向控制

PWM模式

电机驱动电路控制端使用短路跳线选通,用的时候接通,不用就断开。

Motor_11.jpg

演示代码:

int E1 = 5;     //定义M1使能端
int E2 = 6;     //定义M2使能端
int M1 = 4;    //定义M1控制端
int M2 = 7;    //定义M1控制端
void stop(void){                 //停止
       digitalWrite(E1,LOW);
       digitalWrite(E2,LOW);
}

void advance(char a,char b){           //前进
       analogWrite (E1,a);             //PWM调速
       digitalWrite(M1,HIGH);
       analogWrite (E2,b);
       digitalWrite(M2,HIGH);
}
void back_off (char a,char b) {          //后退
       analogWrite (E1,a);
       digitalWrite(M1,LOW);
       analogWrite (E2,b);
       digitalWrite(M2,LOW);
}
void turn_L (char a,char b) {           //左转
       analogWrite (E1,a);
       digitalWrite(M1,LOW);
       analogWrite (E2,b);
       digitalWrite(M2,HIGH);
}
void turn_R (char a,char b) {           //右转
       analogWrite (E1,a);
       digitalWrite(M1,HIGH);
       analogWrite (E2,b);
       digitalWrite(M2,LOW);
}

void setup(void) {
    int i;
    for(i=6;i<=9;i++)
    pinMode(i, OUTPUT);
    Serial.begin(19200);      //设置串口波特率
}

void loop(void) {
   if(Serial.available()>0){
     char val = Serial.read();
     if(val!=-1){
          switch(val){
             case 'w'://前进
                     advance (255,255);   //PWM调速
                     break;
             case 's'://后退
                     back_off (255,255);
                     break;
             case 'a'://左转
                     turn_L (255,255);
                     break;
             case 'd'://右转
                     turn_R (255,255);
                     break;
            }
          delay(40);
       }
      else stop();
   }
}

程序功能:串口输入"w","s","a","d",电机会有相应的动作。

PLL控制模式

Romeo BLE也支持PLL相位锁相环]]控制模式。

  • 实际使用效果为:
    • 启动控制引脚输出高电平电机才能启动,为低电平时则电机禁止启动;
    • 方向控制引脚pwm信号为中位值时(约100左右,不同电机需要测试得出),电机停止;
    • 方向控制引脚pwm信号偏离中位值越多速度越大;
    • 方向控制引脚pwm信号大于中位值正转,小于中位值则反转。
引脚 功能
4 电机1启用控制
5 电机1方向控制
6 电机2方向控制
7 电机2启用控制

"PLL模式"

Romeov11xxx.png

演示代码:

//Standard DLL Speed control

int E1 = 4;     //M1 Speed Control
int E2 = 7;     //M2 Speed Control
int M1 = 5;    //M1 Direction Control
int M2 = 6;    //M1 Direction Control

///For previous Romeo, please use these pins.
//int E1 = 6;     //M1 Speed Control
//int E2 = 9;     //M2 Speed Control
//int M1 = 7;    //M1 Direction Control
//int M2 = 8;    //M1 Direction Control

//When m1p/m2p is 127, it stops the motor
//when m1p/m2p is 255, it gives the maximum speed for one direction
//When m1p/m2p is 0, it gives the maximum speed for reverse direction

void DriveMotorP(byte m1p, byte m2p) {    //Drive Motor Power Mode

  digitalWrite(E1, HIGH);
  analogWrite(M1, (m1p));

  digitalWrite(E2, HIGH);
  analogWrite(M2, (m2p));

}

void setup(void) {
  int i;
  for(i=4;i<=7;i++)
    pinMode(i, OUTPUT);
  Serial.begin(19200);      //Set Baud Rate
}

void loop(void) {
  if(Serial.available()){
    char val = Serial.read();
    if(val!=-1){
      switch(val){
      case 'w'://Move Forward
        DriveMotorP(0xff,0xff); // Max speed
        break;
      case 'x'://Move Backward
        DriveMotorP(0x00,0x00);
        ; // Max speed
        break;
      case 's'://Stop
        DriveMotorP(0x7f,0x7f);
        break;
      }
    }
  }
}

程序功能:串口输入"w","x","s",电机会有相应的动作。

串口端口的使用

RoMeo BLE和RoMeo的串口相同,只是增加了一个蓝牙4.0无线透传的串口。蓝牙相关的指令设置请参考。

Arduino语言提供了几个函数[http://wiki.dfrobot.com.cn/index.php/Serial.begin() Serial.begin ()]、[http://wiki.dfrobot.com.cn/index.php/Serial.read() Serial.read()]、[http://wiki.dfrobot.com.cn/index.php/Serial.print() Serial.print()]、[http://wiki.dfrobot.com.cn/index.php/Serial.println() Serial.println()],实现串口的通讯操作,下面做个串口输入通讯的实验,通过USB接口和RoMeo串口通讯,将USB电缆插到USB口上并与电脑连接。

RoMeo BLE与手机连接示例

RoMeo BLE的手机连接示例请参考Bluno手机连接示例Bluno 手机连接示例

通过BLE进行无线编程

RoMeo BLE无线编程下载请参考Bluno 无线编程下载Bluno 无线编程下载

通过AT指令配置BLE设备

RoMeo BLE AT 命令的配置方式也与Bluno相同,请参考Bluno AT 命令:Bluno AT 命令表

部分AT指令列表指令:

<CR+LF> 即回车+换行,所有的AT指令都是以windows下的回车作为结束符

不要把“<CR+LF>”这几个字符当做AT指令的一部分

1. "AT+FSM" 设置BLE芯片工作模式

AT+FSM=FSM_TRANS_USB_COM_BLE<CR+LF> 设置USB转串口模式,开启BLE功能。
AT+FSM=FSM_HID_USB_COM_BLE_AT<CR+LF> 设置USB转串口模式,开启BLE HID功能
AT+FSM=?<CR+LF> 查询当前BLE芯片的工作模式(默认:FSM_TRANS_USB_COM_BLE)

2. "AT+ROLE" 设置BLE芯片主从机状态

AT+ROLE=ROLE_CENTRAL<CR+LF> 设置BLE工作在主机状态下
AT+ROLE=ROLE_PERIPHERAL<CR+LF> 设置BLE工作在从机状态下
AT+ROLE=?<CR+LF> 查询当前BLE芯片的主从机状态。 (默认值为ROLE_PERIPHERAL)

3. "AT+MIN_INTERVAL" 设置BLE芯片最小通信间隔,以毫秒为单位

AT+MIN_INTERVAL=10<CR+LF> 对于PC和Android,建议设为为10。
AT+MIN_INTERVAL=20<CR+LF> 对于iOS设备,建议设置为20。
AT+MIN_INTERVAL=?<CR+LF> 查询当前BLE芯片的通信间隔。 默认值为10

4. "AT+MAX_INTERVAL" 设置BLE芯片最大通信间隔,以毫秒为单位

AT+MAX_INTERVAL=10<CR+LF> 对于PC和Android,建议设为为10。
AT+MAX_INTERVAL=40<CR+LF> 对于iOS设备,建议设置为40。
AT+MAX_INTERVAL=?<CR+LF> 查询当前BLE芯片的通信间隔。 默认值为10

5. "AT+UART" 设置物理串口波特率

AT+UART=115200<CR+LF> 设置物理串口波特率为115200
AT+UART=?<CR+LF> 查询当前BLE芯片物理串口的波特率。 默认值为115200

6. "AT+BIND" 设置BLE芯片绑定蓝牙地址

AT+BIND=0x0017ea9397e1<CR+LF> 设置BLE芯片绑定的蓝牙地址为0x0017ea9397e1
AT+BIND=?<CR+LF> 查询当前BLE芯片绑定蓝牙地址。 默认值为0x000000000000

7. "AT+CMODE" 设置BLE芯片连接模式

AT+CMODE=UNIQUE<CR+LF> 设置连接模式为指定蓝牙地址连接模式(指定蓝牙地址由BIND命令设置,见"AT+BIND" )
AT+CMODE=ANYONE<CR+LF> 设置连接模式为任意蓝牙地址连接模式(不受BIND命令设置地址的约束,见"AT+BIND")
AT+CMODE=?<CR+LF> 查询当前BLE芯片连接模式。 默认值为ANYONE

8. "AT+MAC"查询BLE芯片MAC地址

AT+MAC=?<CR+LF> 查询当前BLE芯片MAC地址

9. "AT+NAME" 设置和查询当前设备名称

AT+NAME=DFBLEduinoV1.0<CR+LF> 设置模块名称为“DFBLEduinoV1.0”。ascii码形式,小于等于13字节
AT+NAME=?<CR+LF> 查询当前模块名称, 默认值为DFBLEduinoV1.0

10. "AT+RESTART" 重启BLE芯片

AT+RESTART<CR+LF> 重启BLE芯片

升级RoMeo BLE上的BLE固件(AT+VERSION查询版本)

RoMeo BLE升级固件的方法和Bluno相似,请参考Bluno的Wiki中"升级Bluno上的BLE固件"章节(这是链接)

A. 串口监视器的串口输入

演示代码:

int ledPin = 13;
int val;
void setup() {
  pinMode(ledPin, OUTPUT);     //定义 L灯端口为输出
  Serial.begin(9600);             //初始化串口并设置波特率为9600
}

void loop() {
  val = Serial.read();             //读串口数据
  if (-1 != val) {                 //判断数据有效
      if ('A' == val) {              //判断数据 为 A
          digitalWrite(ledPin, HIGH);    //L灯亮
          delay(500);
          digitalWrite(ledPin, LOW);    //L灯灭
       }
   }
}

程序功能:使用IDE的串口助手发送字母“A”,RoMeo接收到后判断是不是“A”,如果是,则让L灯闪烁一下,否则不进行任何操作。

也可以配合BLE-LINK做蓝牙无线收发,BLE-LINK设置为主机,然后和RoMeo BLE配上对,即可使用IDE的串口助手收发。

B. 串口监视器的串口输出

演示代码:

void setup() {
  Serial.begin(9600);             //初始化串口并设置波特率为9600
}

void loop() {
  Serial.print("Hello!");           //串口向外发送字符串
Serial.println(" DFRobot");      //串口向外发送字符串 ,并带回车
  delay(1000);                  //延时
}

程序功能:RoMeo BLE从串口间隙性的发送字符串“Hello! DFRobot”。下面用IDE的串口助手观察结果。注意:代码的波特率与串口波特率保持一致

Serial_123.png

C. RoMeo串口无线数传(APC220)实验

RoMeo BLE的串口无线数传(APC220)实验请参考RoMeo V2串口无线数传(APC220)实验

相关文档

File:nextredirectltr.png购买RoMeo BLE控制器 兼容arduino (Arduino UNO) (SKU:DFR0305)

老版本

Romeo V2 Romeo V1

File:nextredirectltr.png如有更多疑问,可登陆我们的论坛与我们进行交流,您的宝贵意见将我们不断进步的阶梯! 点击进入论坛

category: Product Manual category: DFR Series category: Motor Controllers category: MicroControllers category: source

⚠️ **GitHub.com Fallback** ⚠️