Romeo 三合一Arduino兼容控制器

概述

RoMeo是一块基与Arduino开放原始代码的Simple i/o平台,並且具有使用类似java,C语言的开发环境。让您可以快速使用Arduino语言与Flash或Processing…等软件,作出互动作品。RoMeo可以使用开发完成的电子元件例如Switch或Sensors或其他控制器、LED、步进电机或其他输出裝置。RoMeo也可以独立运作成为一个可以跟软件沟通的平台,例如说:flash processing Max/MSP VVVV 或其他互动软件…
Arduino开发IDE界面基于开放原始码原则,可以让您免费下载使用开发出更多令人惊奇的互动作品或机器人作品。
RoMeo不但有完整的Arduino功能,还集成了2路电机驱动、无线数传、数字与模拟IO扩展口、I2C总线及键盘输入等接口,并和Arduino Nano相同,比传统的Arduino多2路模拟输入端口。

技术规格

  • Digital I/O 数字输入/输出端0~13。
  • Analog I/O 模拟输入0~7。
  • 支持USB接口协议。
  • 支持USB供电与外部供电自动切换。
  • 支持ISP下载功能。
  • 支持单片机TX/RX端子。
  • 支持AREF端子。
  • 支持数字端、模拟端插针和插孔端子。
  • 集成APC220无线数传和DF-Bluetooth蓝牙模块接口,并且有TX选择跳线选通。
  • 支持5组I2C总线接口。
  • 支持2路电机驱动,峰值电流2A,4个控制口使用跳线切换。
  • 支持7个按键输入,5个A/D模拟按键(模拟口7),2个数字按键(Pin2,Pin3),均使用跳线切换。
  • 数字口扩展接口支持单独外部供电或内部5V供电,使用跳线切换。
  • 支持六組PWM端子(Pin11,Pin10,Pin9、Pin6,Pin5,Pin3)。
  • 输入电压:接上USB时无须外部供电或外部供7V~12V DC输入。
  • 输出电压:5V DC输出和3.3V DC输出 和 外部电源直接输出。
  • 采用Atmel Atmega168-20AU单片机(RoMeo 168版)或Atmega328-20AU单片机(RoMeo 328版)。
  • RoMeo大小尺寸:宽90mm X 高80mm。

DFRduino RoMeo的使用

认识DFRduino RoMeo

RoMeo_V1.3_1.jpg

集成开发环境的使用

RoMeo可直接使用Arduino 0012以上版本的集成开发环境,以下简称为IDE,可到这里下载,IDE中的硬件请选择Arduino Nano。
Arduino语言的语法请参考:官方网站
IDE的使用请:参考l

数字端口的使用

L灯实验

RoMeo和Arduino一样,有一个使用Pin13数字端口控制的板载LED(L),那么首先做一个数字端口控制一个LED闪烁的实验。
将USB电缆与RoMeo连接后,打开0012以上版本的IDE,硬件选择Arduino Nano。 RoMeo_V1.3_2.jpg

演示代码:

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);                  // 延时
}

按键(Button)实验

RoMeo集成了7个按键S1~S7,其中有2个按键(S6、S7)是使用数字端口控制。

RoMeo_V1.3_3.jpg

数字按键S6和S7使用跳线选通,见下图红圈内,当标有S6或S7的插针插上短路帽后即表示该按键选通,拔掉则表示断开控制。按键S6使用数字端口Pin2,S7使用数字端口Pin3控制,选通S6和S7后数字口Pin2和Pin3将被占用。

RoMeo_V1.3_4.jpg

下面做一个单按键实验,使用按键S6,按下放开后L灯亮,再按一次L灯灭。 演示代码:

int ledPin = 13;                // 定义LED为 pin 13
int key_s6 = 2;                 // 定义S6 为 Pin2
int val=0;
void setup()
{
  pinMode(ledPin, OUTPUT);      // 设置数字端口13为输出模式
  pinMode(key_s6, INPUT);       // 设置数字端口2为输入模式
}
void loop()
{
   if(digitalRead(key_s6)==0)    //查询S6有没有按下
     {
        while(!digitalRead(key_s6));
        val++;

}
   if(val==1)

 {
digitalWrite(ledPin, HIGH);   // 数字端口置高,LED亮
     }
   if(val==2)
     {
        val=0;
        digitalWrite(ledPin, LOW);    // 数字端口置低,LED灭
     }
}

再做一个双按键实验,按下按键S6 L灯亮,按下按键S7 L灯灭。 演示代码:

int ledPin = 13;                // 定义LED为 pin 13
int key_s6 = 2;                 // 定义S6 为 Pin2
int key_s7 = 3;                 // 定义S7为 Pin3
void setup()
{
  pinMode(ledPin, OUTPUT);      // 设置数字端口13为输出模式
  pinMode(key_s6, INPUT);       // 设置数字端口2为输入模式
pinMode(key_s7, INPUT);       // 设置数字端口3为输入模式
}
void loop()
{
   if(digitalRead(key_s6)==0)    //查询S6有没有按下
     {
         digitalWrite(ledPin, HIGH);   // 数字端口置高,LED亮
     }
   if(digitalRead(key_s7)==0)   //查询S7有没有按下
     {
         digitalWrite(ledPin, LOW);    // 数字端口置低,LED灭
     }
}

舵机实验

RoMeo数字端口扩展端子是按照舵机的线序设计的,所以可以直接控制舵机。接一个舵机时由于电流不大,所以可以暂时使用RoMeo上的5V供电,但切记不能使用USB供电,这时需要插上外部直流电源(DC7~12V),如下图所示,RoMeo上同时插了USB电缆和外部直流电源,有人可能会问“不怕烧USB吗?”,答案是不怕,因为当外部输入电源电压大于6.5V时,RoMeo会自动从USB供电切换为外部电源供电,同时USB与外部电源完全隔绝,所以不会烧USB接口。
Arduino 0012-0016版本的IDE内会自带一个舵机库文件,不过该库文件只能使Pin9和Pin10控制舵机,如下图舵机连接到Pin9上:

RoMeo_V1.3_5.jpg

演示代码:

#include <Servo.h>
Servo myservo;   // 定义舵机对象,
int pos = 0;
void setup()
{
  myservo.attach(9);  //舵机接到Pin9上
}
void loop()
{
  for(pos = 0; pos < 180; pos += 1)       //从0度转到180度,步进1度
  {
    myservo.write(pos);               //改变舵机度数
    delay(15);                       // 延时
  }
  for(pos = 180; pos>=1; pos-=1)        //从180度转到1度,步进1度
  {
    myservo.write(pos);               //改变舵机度数
    delay(15);                       // 延时
  }
}

使用Arduino 0017-0018可以让RoMeo和其他Arduino控制器的Pin2-13端口控制12个舵机。当RoMeo接多个舵机时,就不能使用RoMeo上的5V供电了,这时就需要从数字端口外部电源输入端供电,电源电压为5V。如下图所示使用的5V开关电源供电,也可以用4-5节充电电池供电。

RoMeo_V1.3_6.jpg

演示代码:

#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
void setup()
{
  servo1.attach(5);               //定义舵机1控制口为Pin5
  servo2.attach(11);              //定义舵机2控制口为Pin11
  servo3.attach(12);              //定义舵机3控制口为Pin12
  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度。
在使用舵机过程中会遇到电源供电的问题,RoMeo上的供电接口与跳线又显的有些复杂,怎么合理的设置才能避免烧掉RoMeo和USB接口呢,下面我们就详细的介绍一下供电的方式与设置。

RoMeo_V1.3_7.jpg

如上图所示,当使用数字外部供电端给舵机供电时,同时RoMeo也在用USB电缆和外部直流电源供电,那么这时红圈内的内外部电源切换跳线短路帽就要拔掉,逻辑电源和舵机电压分开,防止大电流负载对处理器的干扰,工作更稳定。

RoMeo_V1.3_8.jpg 当RoMeo也要想使用数字端口外部供电时,首先必须保证该电源的电压为5V,同时需要拔掉USB电缆和外部直流电源供电,如上图红圈中所示。然后插上内外部电源切换跳线短路帽,如下图红圈中所示。这时整个RoMeo都使用数字端口外部供电了。不推荐使用这种供电方式。

RoMeo_V1.3_9.jpg

电机驱动实验

RoMeo上集成了2路电机驱动,这是为了让机器人爱好者节约大量制作硬件的时间,而把开发重点放在软件上。电机驱动电路采用L298芯片,峰值电流可达2A。当使用电机驱动时,又会涉及到电源供电问题,如下图所示的接线方法,红圈内的外部直流电源供电就要改到右边的插针上,VIN接正极,GND接负极。

RoMeo_V1.3_10.jpg

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

RoMeo_V1.3_11.jpg

从上图中可以看到,电机控制端口使用数字端口Pin4、5、6、7,Pin4是M1电机的正反转控制端,Pin5是M1电机的使能端,可以进行PWM调速;Pin6是M2的使能端,可以进行PWM调速,Pin7是M2的正反转控制端。
注意:老版本的RoMeo电机控制端口为Pin6、7、8、9,Pin6、9为PWM调速端,Pin7、8为电机正反转控制端。
演示代码:

/*
int E1 = 6;     //定义M1使能端
int E2 = 9;     //定义M2使能端
int M1 = 7;     //定义M1控制端
int M2 = 8;    //定义M1控制端
*/
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)
{
     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();
}

程序功能:使用IDE的串口助手发送字母,控制电机正转、反转或停止,并可以使用PWM调速,本程序可以 直接用于控制小车前进、后退或转弯,速度可调整。

串行端口的使用

IDE串口助手的使用

RoMeo_V1.3_12.jpg

先要选择RoMeo的串口号,这步应该在开始实验时就完成了。

RoMeo_V1.3_13.jpg

然后点上图中黄色的那个按钮(Serial Monitor)。

RoMeo_V1.3_14.jpg

最后选择相应的波特率,右边的是发送文本框和发送按钮。

RoMeo的串口输入

RoMeo具有1个全双工TTL电平的串口,也就是数字端口的Pin0(RX)和Pin1(TX),程序的下载正是使用的这个串口,只不过被USB芯片将TTL串口转换成了USB接口而已。串口是个很常用的通讯端口,也是RoMeo最基本的通讯口,使用时需要注意端口电平和设置波特率。Arduino语言提供了几个函数Serial.begin ()、Serial.read()、Serial.print()、Serial.println(),实现串口的通讯操作,下面做个串口输入通讯的实验,通过USB接口和RoMeo串口通讯,将USB电缆插到USB口上并与电脑连接。

RoMeo_V1.3_2.jpg

演示代码:

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

RoMeo_V1.3_16.jpg

RoMeo的串口输出

演示代码:

void setup()
{
  Serial.begin(9600);             //初始化串口并设置波特率为9600
}
void loop() {
  Serial.print("Hello!");           //串口向外发送字符串
Serial.println(" DFRobot");      //串口向外发送字符串 ,并带回车
  delay(1000);                  //延时
}

程序功能: RoMeo从串口间隙性的发送字符串“Hello! DFRobot”。下面用IDE的串口助手观察结果。

RoMeo_V1.3_17.jpg

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

RoMeo集成了一个TTL电平的无线数传接口,兼容APC220无线数传模块和DF-BluetoothV2蓝牙模块。
APC220无线数传模块的通信信道是半双工的,可以完成一点对一点,一点对多点的通讯。这二种方式首先需要设1个主站,其余为从站,所有站点都必须设置一个唯一的地址。通信的协调由主站控制,主站采用带地址码的数据帧发送数据或命令,所有从站全部都接收,并将接收到的地址码与本机地址码比较,地址不同则将数据丢掉,不做响应,若地址码相同,则将接收的数据传送出去。以上过程可以通过软件设置RFID Enable 自动实现,也可有用户通过上层协议完成。当设置RFID Enable时,APC220模块将自动比较所接收数据是否地址匹配,但不会自动应答,若地址匹配模块会将地址、数据传给终端设备。另外,组网必须保证在任何一个瞬间,同一个频点通信网中只有一个电台处于发送状态,以免相互干扰。APC220可以设置多个频道,所以可以在一个区域实现多个网络并存。
使用上面的串口输出代码演示,RoMeo从串口间隙性的发送字符串“Hello! DFRobot”,经过APC220发射到空中,被接到电脑上的APC220接收到。下面用SSCOM3.2串口助手观察结果。串口助手设置串口号为APC220的COM4,波特率和程序设置的一致为9600,其他默认即可,打开串口就可以看见结果。

注意:APC220模块会占用串口端口,在下载程序的时候,请拔下APC220模块。

APP20链接方法

RoMeo_V1.3_19.jpg

RoMeo串口蓝牙模块(DF-BluetoothV2)实验

RoMeo集成了一个TTL电平的无线数传接口,兼容APC220无线数传模块和DF-BluetoothV2蓝牙模块。

RoMeo_V1.3_20.jpg

DF-BluetoothV2蓝牙模块基于蓝牙2.0规范,兼容蓝牙1.1、蓝牙1.2。DF-BluetoothV2蓝牙模块需要和蓝牙适配器配合使用。DF-BluetoothV2蓝牙模块只能做从机,蓝牙适配器做主机。使用蓝牙适配器需要安装一个管理软件IVT BlueSoleil(网上有下载),安装后,插上蓝牙适配器便会映射2个COM口出来,但不是我们需要的端口。

RoMeo_V1.3_21.jpg

DF-BluetoothV2蓝牙模块插到RoMeo上,蓝牙适配器插到电脑上,打开IVT BlueSoleil软件,黄色的球体就是蓝牙适配器,在黄色的球体上点右键→搜索设备,这是就会出现一个带问号的蓝色球体,这个就是我们的DF-BluetoothV2蓝牙模块了,在问号球体上点右键→配对,会出现下面的对话框,要求填写蓝牙口令,模块默认为四个零(0000),填好后点确定,配对后指示灯会一闪一闪的。

RoMeo_V1.3_22.jpg

在问号球体上点右键→搜索服务,将会出现一个串口,接下来需要连接模块和适配器,在问号球体上点右键→连接蓝牙串口(如COM30),这个新产生的COM端口号就是要用的串口号了。连接成功后,问号球体会由蓝色变为绿色,指示灯的闪烁也变为亮1秒灭3秒,并有虚线箭头线表示正在传输数据,还是使用之前的串口输出演示代码,但是这里波特率需要更改为115200,必须和DF-BluetoothV2蓝牙模块的波特率(115200)一致。

注意:DF-BluetoothV2蓝牙模块会占用串口端口,在下载程序的时候,请拔下DF-BluetoothV2蓝牙模块。

RoMeo_V1.3_23.jpg

演示代码:

void setup()
{
  Serial.begin(115200);             //初始化串口并设置波特率为115200
}
void loop() {
  Serial.print("Hello!");           //串口向外发送字符串
Serial.println(" DFRobot");      //串口向外发送字符串 ,并带回车
  delay(1000);                  //延时
}

RoMeo_V1.3_24.jpg

使用SSCOM3.2串口助手观察结果。串口助手设置串口号为COM30,波特率和程序设置的一致为115200,其他默认即可,打开串口就可以看见结果。

模拟端口的使用

RoMeo采用的MEGA168-20AU,和Arduino Nano一样具有8个模拟口,排列方式与Arduino兼容。多出的2个模拟口放到了POWER的左侧。请使用0012以上版本IDE,硬件选择Arduino Nano。

模拟按键实验

RoMeo_V1.3_3.jpg

RoMeo集成了7个按键S1~S7,其中有5个按键(S1~S5)是使用模拟端口7控制。使用模拟按键需要设置跳线,如下图红圈中所示,将标有S1-5的跳线短接就选通,不用就断开。

RoMeo_V1.3_25.jpg

演示代码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:

char msgs[5][19] = {   "S1 > Up Key OK    ",
                    "S2 > Left Key OK  ",

"S3 > Down Key OK  ",
                    "S4 > Right Key OK ",
                    "S5 > Select Key OK" };      //定义一个2维数组 存放显示字符
int adc_key_val[5] ={30, 150, 360, 535, 760 };         //定义一个数组 存放模拟键值比较值
int potPin = 7;           //定义按键模拟端口7
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

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

void loop()
{
  adc_key_in = analogRead(potPin);          //读模拟口7
  key = get_key(adc_key_in);               //调用判断按键程序
  if (key != oldkey)                       // 判断是否有新键按下
   {
     delay(50);                          // 延时
     adc_key_in = analogRead(potPin);       //读模拟口7
     key = get_key(adc_key_in);            //调用判断按键程序
     if (key != oldkey)
      {
         oldkey = key;
         if (key >=0) Serial.println(msgs[key]);  //确认有键按下,就通过串口发送2维数组相应字符
      }
   }
}
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串口助手,波特率选择19200,分别按下S1~S5,会看见IDE串口助手里显示按键对应的字符串。

RoMeo_V1.3_26.jpg

GP2D12输入实验

RoMeo 8个模拟口对应有8个扩展插针,扩展口针脚排列根据GP2D12红外距离传感器设计,所以可以直接连接使用,GP2D12是日本SHARP公司生产的红外距离传感器,测量距离10~80cm模拟输出,价格便宜,测距效果好,主要用于模型和机器人制作。它的输出模拟量与距离成反比,这点需要注意。

RoMeo_V1.3_27.jpg

演示代码:

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串口助手里显示的数据变化。

RoMeo_V1.3_28.png

I2C总线实验

RoMeo的模拟口4(SDA)和5(SCL)具有I2C总线功能,我们设计时特意把I2C总线引出,做了5组插针,方便连接I2C器件。

RoMeo_V1.3_29.jpg

RoMeo_V1.3_30.jpg

RoMeo_V1.3_31.jpg

RoMeo与I2C转16路GPIO模块的连接,I2C转16路GPIO模块可以扩展出16个双向IO口,I2C总线上最多可以并接8个模块,每个模块采用跳线设置硬件地址,主机控制器程序也不复杂。模块IO口都具有内部上拉,可提供最大50mA漏电流和20mA灌电流。I2C转16路GPIO模块的具体使用请:参考

演示代码:

#include <Wire.h>    //库文件
//  地址            0 1 0 0   A2 A1 A0
#define KEY_ADDRESS 0x20 //模块B地址
#define LED_ADDRESS 0x27 //模块A地址
#define REGISTER_INPUT 0x00 //寄存器0 设置P0输入
#define REGISTER_OUTPUT 0x02 //寄存器2 设置P0输出参数
#define REGISTER_CONFIG 0x06 //寄存器6 设置P0状态
void setup()
{
  Wire.begin();
  gpio_write(LED_ADDRESS, 0xffff);//设置模块A  IO口输出为高
  gpio_dir(LED_ADDRESS, 0x0000);//设置模块A  IO口为输出
}
void loop()
{
  int bits;
  bits = gpio_read(KEY_ADDRESS) & 0x0f;//读模块B,因为输入寄存器
  gpio_write(LED_ADDRESS,
   (((bits & 1) << 3) | ((bits & 2) << 1) | ((bits & 4) >> 1) | ((bits & 8) >> 3)) << 12); //  将模块B的值镜像输出到模块A
  delay(200);
}
int gpio_read(int address)//读函数
{
  int data = 0;

  //  发送输入寄存器地址
  Wire.beginTransmission(address);//模块地址
  Wire.send(REGISTER_INPUT);//寄存器地址
  Wire.endTransmission();

  //  连接模块并接收2字节数据
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  if (Wire.available()) //读P0
  {
data = Wire.receive();//读P0口8位
  }
  if (Wire.available())
  {
    data |= Wire.receive() << 8;//读P1口8位
  }
  Wire.endTransmission();
  return data;
}
void gpio_dir(int address, int dir) //配置函数
{
  //  发送配置寄存器地址
  Wire.beginTransmission(address);
  Wire.send(REGISTER_CONFIG);
  //  连接模块并发送2字节数据
  Wire.send(0xff & dir);  //  写P0配置寄存器8位
  Wire.send(dir >> 8);    //  写P1配置寄存器8位
  Wire.endTransmission();
}
void gpio_write(int address, int data) //写函数
{
  //  发送输出寄存器地址
  Wire.beginTransmission(address);
  Wire.send(REGISTER_OUTPUT);
  //  连接模块并发送2字节数据
  Wire.send(0xff & data);  //  写P0输出寄存器8位
  Wire.send(data >> 8);    //  写P1输出寄存器8位
  Wire.endTransmission();
}

程序功能:模块A做输出,P1口高4位驱动4个LED,模块B做输入,P0口低4位接键盘。当模块B的P0口低4位有1位接地时,模块A的P1口高4位相反IO点亮一个LED。

RoMeo_V1.3_32.jpg

RoMeo与2个Nano连接,组成多CPU I2C总线系统,RoMeo 做主机, 2个Nano做从机,Nano可单独编程,地址可任意设置。

RoMeo主机演示代码:

#include <Wire.h>
void setup()
{
  Wire.begin();         //初始化I2C总线,不设地址表示默认为主机
  Serial.begin(9600);    //
  Serial.println("Ready");
}
void loop()
{
  int val;
  if(Serial.available() > 0)
   {
      val=Serial.read();

      if(val==49)     //1
        {
          Wire.beginTransmission(4); // 从机地址#4
          Wire.send(1);               // 发送字符1
          Wire.endTransmission();    // 停止传送
          Serial.println("49 OK");
          delay(10);
        }
      else if(val==50)     //2
        {
          Wire.beginTransmission(4); // 从机地址#4
          Wire.send(0);               // 发送字符0
          Wire.endTransmission();    //停止传送
          Serial.println("50 OK");
          delay(10);
        }
      else if(val==51)    //3
        {
          Wire.beginTransmission(5); // 从机地址#5
          Wire.send(1);               // 发送字符1
          Wire.endTransmission();    //停止传送
          Serial.println("51 OK");
          delay(10); //:P
        }
      else if(val==52)    //4
        {
          Wire.beginTransmission(5); // 从机地址#5
          Wire.send(0);               // 发送字符0
          Wire.endTransmission();    //停止传送
          Serial.println("52 OK");
          delay(10);
        }
       else Serial.println(val);
    }
}

Nano从机A演示代码:

#include <Wire.h>
int LED = 2;
void setup()
{
  Wire.begin(4);               // 设置从机地址为#4
  Wire.onReceive(receiveEvent); //
  pinMode(LED,OUTPUT);
}
void loop()
{
  delay(100);
}

void receiveEvent(int howMany)
{
    int c = Wire.receive();     // 接收字符
    if(c==1)
      {
         digitalWrite(LED,HIGH);
      }
    else if(c==0)
      {
         digitalWrite(LED,LOW);
      }
}

Nano从机B演示代码:

#include <Wire.h>
int LED = 2;
void setup()
{
  Wire.begin(5);  // 设置从机地址为#5
  Wire.onReceive(receiveEvent); //
  pinMode(LED,OUTPUT);
}
void loop()
{
  delay(100);
}

void receiveEvent(int howMany)
{
    int c = Wire.receive();  // 接收字符
    if(c==1)
      {
         digitalWrite(LED,HIGH);
      }
    else if(c==0)
      {
         digitalWrite(LED,LOW);
      }
}

程序功能:将3个代码分别编译后,分别下载到3个控制器中,然后打开IDE的串口助手,从串口助手的文本框中分别发送数字1,2,3,4来到RoMeo主机,RoMeo主机再通过I2C总线将指令分别转发给从机A和B,从机A和B接收到主机发送来的1点亮LED,接收到0关掉LED。

<File:nextredirectltr.png>购买Romeo控制器 兼容arduino (Arduino Compatible Atmega 328) (SKU:DFR0004)