_SKU_DFR0225_RoMeo_V2 - jimaobian/DFRobotWikiCn GitHub Wiki

DFRduino RoMeo V2

简介

新一代RoemoV2是以ATmega32U4为主芯片的多功能控制板。同样基于Arduino开放源代码的Simple I/O平台,并且具有使用类似jave,C语言的开发环境。RoMeo不仅可直插各类Switch,Sensor等输入设备,同样可直插多类LED,舵机等输出设备。板子还集成了电机驱动模块,可通过外接6~20V电压,直接驱动电机。RoMeo也可以独立运作为一个可以跟软件沟通的平台,例如,flash,processing,Max/MSP,VVVV等互动软件...Romeo不但有完整的Arduino Leonardo的功能,还集成了2路电机驱动、无线数传模块、数字与模拟IO扩展口、I2C总线接口等功能。

warning_yellow.png

V2版的Romeo和V1版的Analog模拟量3-P排针有所更改,如果您用以前的模拟量传感器,请注意正确接线。不正确的电源接线会烧坏传感器等设备。

使用USB口调试电机的时候,请关闭电机开关!否则,过大的外部供电会使Romeo烧坏。 |

| :注意

上传程序时,请在Arduino IDE下选择版型:Leonardo,否则编译上传出错。

串口通信设备:对于串口通信设备,如:Xbee,蓝牙模块,WiFi模块等,请在代码中使用Serial1.***()。Serial.***()用于电脑端软件,如串口助手, Arduino IDE的Serial Monitor,通过USB线调试Romeo。【阅读:[[https://www.arduino.cc/en/Reference/Serial]Arduino官方说明】

模拟口A0:当您使用A0口作为模拟量输入/输出时,请关掉按钮选择开关,即:拨到OFF的位置。因为板子上的5个按钮是连接在A0上的,如果打开,A0口的读数不正确](https://www.arduino.cc/en/Reference/Serial%5DArduino官方说明】%3Cbr%3E%3Cbr%3E模拟口A0:当您使用A0口作为模拟量输入/输出时,请关掉按钮选择开关,即:拨到OFF的位置。因为板子上的5个按钮是连接在A0上的,如果打开,A0口的读数不正确)。 |

产品参数

  • 微控制器:ATmega32u4
  • 引导装载程序:Arduino Leonardo
  • 工作电压:5V
  • 直流输出:5V/3.3V
  • 输入电压(推荐):7-12V
  • 输入电压(极限):6-20V
  • 数字端口外部电源电压:5-20V
  • IO引脚直流电流:40mA
  • 3.3V引脚直流电流:50mA
  • 电机驱动模块恒定输出电流:2A
  • 体积:89x84x14mm
  • Digital I/O(数字): D0-D16,A0-A5 (23个)
  • Analog I/O(模拟): A0-A5,A6-A11(在数字接口4,6,8,9,10,12上)) (12个)
  • PWM口:7个 (数字引脚3,5,6,9,10,11和13)
  • 支持USB供电与外部供电自动切换
  • 支持ISP下载功能
  • 集成APC220无线数传/DF-Bluetooth蓝牙模块接口
  • 支持3组I2C/TWI接口
  • 支持2路电机驱动,峰值电流2A,4个控制口使用跳线切换
  • 支持5个按键输入(模拟口0),支持开关切换
  • 支持公母排阵
  • 支持Xbee和XBee形式的WiFi,蓝牙和RF模块

引脚说明

Romeo_Pinout_V3.png

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

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

RoMeo如何使用

Arduino IDE的使用:

Arduino IDE是Arduino产品的软件编辑环境。简单的说就是用来写代码,下载代码的地方。任何的Arduino产品都需要下载代码后才能运作。我们所搭建的硬件电路是辅助代码来完成的,两者是缺一不可的。如同人通过大脑来控制肢体活动是一个道理。如果代码就是大脑的话,外围硬件就是肢体,肢体的活动取决于大脑,所以硬件实现取决于代码。

数字口的使用

A. 板载L灯实验

先来个预热,做个最简单的实验。Romeo和Arduino一样,有个连接到数字口13的板载LED(L),先来亮个灯吧!把Romeo连到电脑上后,打开Arduino IDE,选择Boards --> Arduino Leonardo 和串口com。

演示代码:

int ledPin = 13;                // 定义LED为 pin 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // 设置数字端口13为输出模式
}
void loop()
{
  digitalWrite(ledPin, HIGH);   // 数字端口置高,LED亮
  delay(1000);                  // 延时
  digitalWrite(ledPin, LOW);    // 数字端口置低,LED灭
  delay(1000);                  // 延时
}

程序功能:板载的L灯会每秒闪烁一次。

B. 外接LED实验

如果你想外接个LED,可以按下图进行连接,下载实验A中相同的代码,可以实现相同的效果。

File:nextredirectltr.png 数字食人鱼红色LED发光模块 Romeo444.png

程序功能:外接LED灯会每秒闪烁一次。

C. 按键实验

我们来做个简单的互动实验,按键按下,LED灯亮,松开,LED熄灭。按下图连接。

File:nextredirectltr.png 数字食人鱼红色LED发光模块 File:nextredirectltr.png 数字大按钮模块 Romeo+LED+button.png

演示代码:

int buttonPin = 2;     // 定义按键为 pin 2
int ledPin =  13;      // 定义LED为 pin 13

int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);     // 设置数字端口13为输出模式
  pinMode(buttonPin, INPUT);   // 设置数字端口2为输入模式
}

void loop(){
  buttonState = digitalRead(buttonPin);  //读取Pin 2的状态

  if (buttonState == HIGH) {      //判断是否为高
    digitalWrite(ledPin, HIGH);   //如果是高,设置LED亮
  }
  else {
    digitalWrite(ledPin, LOW);    //如果是低,设置LED灭
  }
}

程序功能:按下灯亮,松开灯灭。

D. 舵机实验

如果想让东西动起来,离不开舵机。令人兴奋的是,Arduino提供了一个Servo库,让初学者能很快的用上舵机,来看下吧!

File:nextredirectltr.png TowerPro SG50舵机 Romeo+Servo.png

演示代码:

#include <Servo.h>      // 声明调用Servo.h库
Servo myservo;          // 创建一个舵机对象
int pos = 0;            // 变量pos用来存储舵机位置

void setup() {
    myservo.attach(9);  // 将引脚9上的舵机与声明的舵机对象连接起来
}

void loop() {
    for(pos = 0; pos < 180; pos += 1){   // 舵机从0°转到180°,每次增加1°
        myservo.write(pos);              // 给舵机写入角度
        delay(15);                       // 延时15ms让舵机转到指定位置
    }

    for(pos = 180; pos>=1; pos-=1) {     // 舵机从180°回到0°,每次减小1°
        myservo.write(pos);              // 写角度到舵机
        delay(15);                       // 延时15ms让舵机转到指定位置
    }
}

程序功能:舵机从0°-180°,再从180°转回0°。

E. 多舵机实验

RoMeo数字端口扩展端子是按照舵机的线序设计的,所以可以直接控制舵机。接一个舵机时由于电流不大,所以可以暂时使用RoMeo上的5V供电,但如果Romeo控制器可以控制多个舵机,用USB的5V供电就不够了,这时就需要从数字端口外部电源输入端供电,电源电压取决于你所需舵机的正常工作电压,我们这里使用的5V舵机,所以接入5V开关电源供电即可。

File:nextredirectltr.png TowerPro SG50舵机 Romeo+Servo3.png

演示代码:

#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
void setup(){
  servo1.attach(5);               //定义舵机1控制口为Pin5
  servo2.attach(10);              //定义舵机2控制口为Pin10
  servo3.attach(11);              //定义舵机3控制口为Pin11
  Serial.begin(19200);//设置波特率
  Serial.print("Ready");
}

void loop(){
  static int v = 0;
  if ( Serial.available()) {
    char ch = Serial.read();       //读取串口数据
    switch(ch) {
      case '0'...'9':
        v = v * 10 + ch - '0';  //字符换算成10进制
        break;
      case 'a':             //如果数据后带a,则表示是servo1的数据,比如串口发送85a
        servo1.write(v);
        v = 0;
        break;
      case 'b':             //如果数据后带b,则表示是servo2的数据,比如串口发送90b
        servo2.write(v);
        v = 0;
        break;
      case 'c':             //如果数据后带c ,则表示是servo3的数据,比如串口发送180c
        servo3.write(v);
        v = 0;
        break;
    }
  }
}

程序功能:通过IDE中的串口助手,发送舵机度数控制舵机转动的角度,比如发送字符85a表示舵机1转动85度,发送字符180c表示舵机3转动180度。

如何打开串口? 打开Arduino IDE,右上角有个放大镜的图标,鼠标放在上面会显示串口监视器,点击该图标。

serial1234.png

打开串口后,设置串口监视器的波特率为19200。

serial123456.png

就可以直接从串口输入相应的值了,比如我们这里输入"85a",让第一个舵机转85°。

serial1234567.png

F. 电机驱动实验

RoMeo上集成了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=4;i<=7;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;
             case 'q'://停止
                     stop();
                     break;
             default : break;
            }
          delay(40);
       }

   }
}

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

PLL控制模式

Romeo也支持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

//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有两个串口Serial1和Serial。Serial1通过数字端口的Pin 0(RX)和Pin 1(TX)来对外通信。Serial而只是与USB通信。下面我们会针对这两个串口来做几个简单的实验,来体会一下它们之间的区别。

程序的下载正是使用的串口Serial1,只不过被USB芯片将TTL串口转换成了USB接口而已。串口是个很常用的通讯端口,也是RoMeo最基本的通讯口,使用时需要注意端口电平和设置波特率。代码中的波特率需要与串口监视器的波特率设置一致。

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口上并与电脑连接。

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灯闪烁一下, 否则不进行任何操作。

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

演示代码:

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

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

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

Serial_123.png

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

RoMeo兼容APC220无线数传模块和DF-BluetoothV2蓝牙模块。

APC220无线数传模块的通信信道是半双工的,可以完成一点对一点,一点对多点的通讯。这二种方式首先需要设1个主站,其余为从站,所有站点都必须设置一个唯一的地址。通信的协调由主站控制,主站采用带地址码的数据帧发送数据或命令,所有从站全部都接收,并将接收到的地址码与本机地址码比较,地址不同则将数据丢掉,不做响应,若地址码相同,则将接收的数据传送出去。以上过程可以通过软件设置RFID Enable 自动实现,也可有用户通过上层协议完成。当设置RFID Enable时,APC220模块将自动比较所接收数据是否地址匹配,但不会自动应答,若地址匹配模块会将地址、数据传给终端设备。另外,组网必须保证在任何一个瞬间,同一个频点通信网中只有一个电台处于发送状态,以免相互干扰。APC220可以设置多个频道,所以可以在一个区域实现多个网络并存。

File:nextredirectltr.png APC220无线数传(含天线)

详细教程可见:APC220无线数传模块配置教程

把APC220,直接插在RoMeo上,而另一块APC220通过USE to Serial模块直接插在PC端的USB口即可。

Serial_APC220.jpg

此时,在设备管理器会显示两个串口。给Romeo下载下段代码。 注意:APC220模块会占用串口端口,在下载程序的时候,请拔下APC220模块。

SerialAPC220.png

演示代码:

void setup(){
  Serial1.begin(9600);
  Serial.begin(9600);
}

void loop(){
  Serial1.print("Hello,DFRobot!");
  Serial1.println();
  Serial.print("Hello,DFRobot!");
  Serial.println();
  delay(500);
}

程序功能:RoMeo从串口间隙性的发送字符串“Hello,DFRobot!”,经过APC220发射到空中,被接到电脑上的APC220接收到。下面用Arduino IDE 串口助手观察结果。PC端的APC220在电脑中显示为COM2,串口助手设置串口号为APC220的COM2,波特率和程序设置的一致为9600,其他默认即可,打开两个串口就可以看见结果。如下图所示,Romeo端发送,PC端接收。

SerialAPC2201.png

D. RoMeo串口蓝牙模块(DF-BluetoothV3)实验

RoMeo集成了一个TTL电平的无线数传接口,兼容APC220无线数传模块和DF-BluetoothV3蓝牙模块。蓝牙模块能做各种应用,,可与各种蓝牙适配器、蓝牙手机配对使用。拨码开关可设置模块状态,LED Off可关闭LINK灯进入省电模式,AT Mode可使模块进入AT指令模式,通过AT指令可以修改波特率和主从机模式,将2个模块分别设置为主模块和从模块后,2个模块就可以自由配对进行数据传输,也非常适用于2个单片机之间的数据通讯。

File:nextredirectltr.png DF-BluetoothV3蓝牙串口模块

详细教程可见:DF-BluetoothV3蓝牙串口模块教程

使用的时候同样注意Serial与Serial1在使用上的区别。

SerialDF-BluetoothV3.jpg

E. RoMeo串口XBee模块实验

Xbee模块是采用ZigBee技术的无线模块,通过串口与单片机等设备间进行通信,能够非常快速地实现将设备接入到ZigBee网络的目的。这是一款2.4G的XBee无线模块 。此模块采用802.15.4协议栈,通过串口与单片机等设备间进行通信,支持点对点通信以及点对多点网络。此模块的天线为导线天线,简单,方便。

File:nextredirectltr.png XBee 1mW Zigbee 无线数传模块

详细教程可见:XBee模块配置教程

Serial_XBee1.jpg

演示代码:(发送端)

void setup(){
  Serial1.begin(9600);
  Serial.begin(9600);
}

void loop(){
  Serial1.print("Hello,DFRobot!");
  Serial1.println();
  Serial.print("Hello,DFRobot!");
  Serial.println();
  delay(500);
}

演示代码:(接收端)

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

void loop(){
  char val;
  val = Serial1.read();     //读串口
  if(val!=-1){
  Serial.print(val);  //将收到是数据再通过串口发送出去
  }
}

程序功能:两块XBee直接通信,一块XBee发送数据,而另一块接收数据,可以从串口中,分别读到发送而接收一致。

Serial_XBee.png

模拟口的使用

A. 五个按键实验

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

button_Romeo.png

演示代码1:

int potPin = 0;       //定义输入模拟口0
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(0);    // 读取模拟口0的值
  digitalWrite(13,LOW);
  key = get_key(adc_key_in);  //调用判断按键程序

  if (key != oldkey){   // 判断是否有新键按下
      delay(50);  // 延时去抖
      adc_key_in = analogRead(0);    // 再次读模拟口0
      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

B. 测距实验

Romeo有5过模拟口的扩展插针,扩展口针脚排列根据GP2D12红外距离传感器设计,所以可以直接连接使用。GP2D12是日本SHARP公司生产的红外距离传感器,测量距离20~150cm模拟输出,它的输出模拟量与距离成反比,这点需要注意。

File:nextredirectltr.pngSHARP GP2Y0A41SKOF 红外距离传感器

Romeo_IRdistance.png

演示代码:

int GP2D12 = 0;         //定义输入模拟口0
int val = 0;
void setup() {
  Serial.begin(19200);    //初始化串口 并设置波特率为19200
}
void loop() {
  val = analogRead(GP2D12);    //读模拟口
  if(val!=-1)
     Serial.println(val);     //从串口发送采集到的模拟数据
  delay(100);
}

程序功能:打开IDE串口助手,波特率选择19200,将手放到GP2D12正上方不同的高度,会看见IDE串口助手里显示的数据变化。

C. I2C总线实验

RoMeo的模拟口2(SDA) 和 3(SCL) 具有I2C总线功能。我们设计时特意把I2C总线引出,做了3组插针,方便连接I2C器件。下个实验实现两块控制板之间通信。

I2C总线定义I2C(‘intel’ -Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。

I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既可以是主控器(或被控器),又可以是发送器(或接收器),这取决于它所要完成的功能。

这里我们让其中一块Romeo作为主机,而另外一块作为从机。

Romeo_I2C.png

该实验来自宜昌城老张,原地址

代码涉及的函数可以查阅,Arduino官网 Wire库

演示代码:(主机部分)

#include <Wire.h>    //声明I2C库文件
#define LED 13
byte x = 0;    //变量x决定LED的亮灭

void setup(){
  Wire.begin();       // 加入 i2c 总线,作为主机
  pinMode(LED,OUTPUT);  //设置数字端口13为输出
}

void loop(){
  Wire.beginTransmission(4);   //发送数据到设备号为4的从机
  Wire.write("light is ");     // 发送字符串"light is "
  Wire.write(x);               // 发送变量x中的一个字节
  Wire.endTransmission();      // 停止发送

  x++;//变量x加1
  if(x==2)//如果变量x的值为2,则把x值转为0
      x=0;
  delay(1000);//延时1s

  Wire.requestFrom(4, 1);    //通知4号从机上传1个字节
  while(Wire.available()>0) {   // 当主机接收到从机数据时
      byte c = Wire.read(); //接收一个字节赋值给c
      //判断c为1,则点亮LED,否则熄灭LED。
      if(c==1){
          digitalWrite(LED,HIGH);
      }else{
          digitalWrite(LED,LOW);
      }
  }
  delay(1000);//延时1s
}

演示代码:(从机部分)

#include <Wire.h>//声明I2C库文件
int x;//变量x值决定主机的LED是否点亮

void setup(){
  Wire.begin(4);                 // 加入 i2c 总线,设置从机地址为 #4
  Wire.onReceive(receiveEvent);  //注册接收到主机字符的事件
  Wire.onRequest(requestEvent);  // 注册主机通知从机上传数据的事件
  Serial.begin(9600);           //设置串口波特率
}

void loop(){
  delay(100);//延时
}

// 当从机接收到主机字符,执行该事件
void receiveEvent(int howMany){
  while(Wire.available()>1){  // 循环执行,直到数据包只剩下最后一个字符
    char c = Wire.read(); // 作为字符接收字节
    Serial.print(c);         // 把字符打印到串口监视器中
  }
   //接收主机发送的数据包中的最后一个字节
  x = Wire.read();    // 作为整数接收字节
  Serial.println(x);    //把整数打印到串口监视器中,并回车
}

//当主机通知从机上传数据,执行该事件
void requestEvent(){
  //把接收主机发送的数据包中的最后一个字节再上传给主机
  Wire.write( x); // 响应主机的通知,向主机发送一个字节数据
}

程序功能:主机向从机循环发送字符串"light is "和字节x,x为1或0,从机接收后,把数据显示在它的串口监视器中,如下图。然后当主机通知从机向它上传数据时,会把x值再上传回主机,然后赋值给变量c。当主机程序判断c为1,则点亮主机数字端口13相连的LED,否则熄灭LED。

Romeo_I2C2.png

疑难解答

Arduino Leonardo的串口消失了,该怎么办呢? http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=2687&fromuid=724121 ; (出处: DF创客社区 - 分享创造的喜悦)

更多问题及有趣的应用,请访问论坛

更多

  • 原理图

Romeo Schematic V2

  • 老版本

Romeo V2 Romeo V1

File:nextredirectltr.pngGo Shopping DFRobot商城购买链接

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

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