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总线接口等功能。

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

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

**注意:**

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

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

模拟口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模块

引脚说明

外部电源/电机电源输入: 你可以从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发光模块

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

C. 按键实验

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

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

<File:nextredirectltr.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舵机

演示代码:

    #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舵机

演示代码:

    #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"端。

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语言提供了几个函数[https://wiki.dfrobot.com.cn/Serial.available__(Serial.available)]、[https://wiki.dfrobot.com.cn/Serial.read__(Serial.read)]、[https://wiki.dfrobot.com.cn/Serial.print__(Serial.print)]、[https://wiki.dfrobot.com.cn/Serial.write__(Serial.write)],实现串口的通讯操作,下面做个串口输入通讯的实验,通过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口即可。

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

演示代码:

    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在使用上的区别。

E. RoMeo串口XBee模块实验

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

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

详细教程可见:[XBee模块配置教程](https://wiki.dfrobot.com.cn/SKU_TEL0014_XBee_1mW_Zigbee%E6%97%A0%E7%BA%BF%E6%95%B0%E4%BC%A0%E6%A8%A1%E5%9D%97_100%E7%B1%B3%E4%BC%A0%E8%BE%93

演示代码:(发送端)

    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.png>SHARP GP2Y0A41SKOF 红外距离传感器

演示代码:

    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作为主机,而另外一块作为从机。

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

代码涉及的函数可以查阅,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

疑难解答

更多问题及有趣的应用,可以访问论坛进行查阅或发帖!

更多

DFRobot商城购买链接