概述
Bluno RoMeo控制器继承了DFRduino 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位模拟I / O
- USB接口
- 自动切换输入电源
- ICSP下载程序接口
- 串行接口TTL电平
- 支持AREF
- 具有排母和排针接口
- 具有APC220射频模块插座
- 具有3个I2C接口
- 2个2A大电流的H桥马达驱动器
- 模拟5键输入
- 直流电源:USB供电或外部5V〜23V直流。
- DC输出:5V/3.3V直流外接电源输出
- 尺寸:90x80mm
管脚定义

上面的图片显示Bluno RoMeo控制器上所有的I/O线和连接器,其中包括:
- 调速电机电源输入端子(5V to 23v)
- 一个非稳压伺服电源输入端子(您提供调节4V至7.2V)
- 一个伺服输入功率选择跳线
- 一个串行的APC220模块接口
- 两个直流电动机的接线端子 -电机电流可高达2A
- 一个I2C/TWI接口的SDA,SCL,5V,GND
- 内部连接到一个模拟端口,8个模拟输入 - 输入电源电压
- 一个通用的I/O端口和13个I/O线 - 4,5,6,7可用于控制马达
- 一个复位按键
- 五个按键输入
- 启用/禁用电机控制跳线
- 启用/禁用按键功能开关
- 启用/禁用电机电源开关
控制器应用
电源
这是RoMeo控制器与主机控制器通信的最重要步骤之一。你必须确保你接通电源的电力终端使用正确的极性。反接会损坏RoMeo控制器。 “人为造成损坏我们将不负责保修,可以提供有偿维修。请确保你使用正确适用的电源。否则,后果自负!”
从USB电源: 只需插上USB线,RoMeo控制器就能够工作。请注意,USB只能提供500毫安的电流。它应该能够满足大多数需求,比如LED背光应用。然而,它是没有足够的功率推动直流电动机或伺服。
电机电源输入: 你可以从Motor Power In的接线柱端子连接线,标示“M_VIN”为电源正,当电机电源小于23V时,控制器可以和电机共用一个电源,Power In Selection 开关拨到ON;当电机电源大于23V时,Power In Selection 开关必须拨到OFF,同时控制器需要单独供电。
“注:最大供电电压不能超过24V直流''。
软件
RoMeo控制器可以使用编程环境Arduino IDE 0022及以上。 您可以在Arduino.cc下载,请选择“硬件”的Arduino UNO“。
Bluno RoMeo配置
伺服电源外接接口
由于大多数舵机电流大于USB电源可提供的电流。所以设计有1个独立的舵机供电接线端口(Servo Power)。
当Servo Power端口接电源大于5V时,数字口电源将自动断开控制器的5V供电。
电机控制针跳线
电机控制针跳线,将分配用于电机控制引脚为数字口4,5,6,7。
拔掉跳线将释放数字口,电机控制器将被禁用。
使用教程
按钮
RoMeo控制器有5个按钮:S1-S5(图2)。 S1 - S5使用模拟输入引脚7
| 引脚 | 功能 | 
|---|---|
| 模拟引脚 7 | 按键 S1-S5 | 
"按键引脚图"
 
演示代码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串口助手里显示按键对应的字符串。
 
按键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;
}
双直流电动机调速
Bluno RoMeo上集成了2路电机驱动,这是为了让机器人爱好者节约大量制作硬件的时间,而把开发重点放在软件上。电机驱动电路采用L298芯片,峰值电流可达2A。当使用电机驱动时,又会涉及到电源供电问题,如下图所示的接线方法,M_VIN接正极,GND接负极。还有就是记得把开关拨到"ON"端。
 
PWM控制模式
| 引脚 | 功能 | 
|---|---|
| 4 | 电机1方向控制 | 
| 5 | 电机1PWM控制 | 
| 6 | 电机2PWM控制 | 
| 7 | 电机2方向控制 | 
PWM模式
电机驱动电路控制端使用短路跳线选通,用的时候接通,不用就断开。
 
演示代码:
    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 (100,100);   //PWM调速
                         break;
                 case 's'://后退
                         back_off (100,100);
                         break;
                 case 'a'://左转
                         turn_L (100,100);
                         break;
                 case 'd'://右转
                         turn_R (100,100);
                         break;
                }
              delay(40);
           }
          else stop();
       }
    }
程序功能:串口输入"w","s","a","d",电机会有相应的动作。
PLL控制模式
Romeo也支持PLL相位锁相环控制模式。
| 引脚 | 功能 | 
|---|---|
| 4 | 电机1启用控制 | 
| 5 | 电机1方向控制 | 
| 6 | 电机2方向控制 | 
| 7 | 电机2启用控制 | 
"PLL模式"
 
演示代码:
    //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",电机会有相应的动作。
串口端口的使用
Bluno RoMeo和RoMeo的串口相同,只是增加了一个蓝牙4.0无线透传的串口。蓝牙相关的指令设置请参考。
Arduino语言提供了几个函数[https://wiki.dfrobot.com.cn/Serial.begin__() Serial.begin ()]、[https://wiki.dfrobot.com.cn/Serial.read__() Serial.read()]、[https://wiki.dfrobot.com.cn/Serial.print__() Serial.print()]、[https://wiki.dfrobot.com.cn/Serial.println__() Serial.println()],实现串口的通讯操作,下面做个串口输入通讯的实验,通过USB接口和RoMeo串口通讯,将USB电缆插到USB口上并与电脑连接。
Bluno RoMe与手机连接示例
Bluno RoMe的手机连接示例请参考Bluno手机连接示例Bluno 手机连接示例
通过BLE进行无线编程
Bluno RoMe无线编程下载请参考Bluno 无线编程下载Bluno 无线编程下载
通过AT指令配置BLE设备
Bluno RoMe AT 命令的配置方式也与Bluno相同,请参考Bluno AT 命令:Bluno AT 命令表
升级Bluno RoMe上的BLE固件(AT+VERSION查询版本)
Bluno RoMe升级固件的方法和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设置为主机,然后和Bluno RoMeo配上对,即可使用IDE的串口助手收发。
B. 串口监视器的串口输出
演示代码:
    void setup() {
      Serial.begin(9600);             //初始化串口并设置波特率为9600
    }
    void loop() {
      Serial.print("Hello!");           //串口向外发送字符串
    Serial.println(" DFRobot");      //串口向外发送字符串 ,并带回车
      delay(1000);                  //延时
    }
程序功能:Bluno RoMeo从串口间隙性的发送字符串“Hello! DFRobot”。下面用IDE的串口助手观察结果。注意:代码的波特率与串口波特率保持一致。
 
C. RoMeo串口无线数传(APC220)实验
Bluno RoMeo兼容APC220无线数传模块和DF-BluetoothV2蓝牙模块。
APC220无线数传模块的通信信道是半双工的,可以完成一点对一点,一点对多点的通讯。这二种方式首先需要设1个主站,其余为从站,所有站点都必须设置一个唯一的地址。通信的协调由主站控制,主站采用带地址码的数据帧发送数据或命令,所有从站全部都接收,并将接收到的地址码与本机地址码比较,地址不同则将数据丢掉,不做响应,若地址码相同,则将接收的数据传送出去。以上过程可以通过软件设置RFID Enable 自动实现,也可有用户通过上层协议完成。当设置RFID Enable时,APC220模块将自动比较所接收数据是否地址匹配,但不会自动应答,若地址匹配模块会将地址、数据传给终端设备。另外,组网必须保证在任何一个瞬间,同一个频点通信网中只有一个电台处于发送状态,以免相互干扰。APC220可以设置多个频道,所以可以在一个区域实现多个网络并存。
详细教程可见:APC220无线数传模块配置教程
把APC220,直接插在RoMeo上,而另一块APC220通过USE to Serial模块直接插在PC端的USB口即可。
 
此时,在设备管理器会显示两个串口。给Romeo下载下段代码。
注意:APC220模块会占用串口端口,在下载程序的时候,请拔下APC220模块。
 
演示代码:
    void setup(){
      Serial.begin(9600);
    }
    void loop(){
      Serial.print("Hello,DFRobot!");
      Serial.println();
      delay(500);
    }
程序功能:Bluno RoMeo从串口间隙性的发送字符串“Hello,DFRobot!”,经过APC220发射到空中,被接到电脑上的APC220接收到。下面用Arduino IDE 串口助手观察结果。PC端的APC220在电脑中显示为COM2,串口助手设置串口号为APC220的COM2,波特率和程序设置的一致为9600,其他默认即可,打开两个串口就可以看见结果。如下图所示,Romeo端发送,PC端接收。
 
