(SKU:DFR0225)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总线接口等功能。
|
|
产品参数
- 微控制器: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中相同的代码,可以实现相同的效果。
程序功能:外接LED灯会每秒闪烁一次。
C. 按键实验
我们来做个简单的互动实验,按键按下,LED灯亮,松开,LED熄灭。按下图连接。
演示代码:
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库,让初学者能很快的用上舵机,来看下吧!
演示代码:
#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开关电源供电即可。
演示代码:
#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,右上角有个放大镜的图标,鼠标放在上面会显示串口监视器,点击该图标。
打开串口后,设置串口监视器的波特率为19200。
就可以直接从串口输入相应的值了,比如我们这里输入"85a",让第一个舵机转85°。
F. 电机驱动实验
RoMeo上集成了2路电机驱动,这是为了让机器人爱好者节约大量制作硬件的时间,而把开发重点放在软件上。电机驱动电路采用L298芯片,峰值电流可达2A。当使用电机驱动时,又会涉及到电源供电问题,如下图所示的接线方法,M_VIN接正极,GND接负极。还有就是记得把开关拨到"ON"端。
PWM控制模式
引脚 | 功能 |
---|---|
4 | 电机1方向控制 |
5 | 电机1PWM控制 |
6 | 电机2PWM控制 |
7 | 电机2方向控制 |
电机驱动电路控制端使用短路跳线选通,用的时候接通,不用就断开。
演示代码:
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启用控制 |
演示代码:
//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语言提供了几个函数Serial.begin ()、Serial.read()、Serial.print()、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的串口助手观察结果。注意:代码的波特率与串口波特率保持一致。
C. RoMeo串口无线数传(APC220)实验
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(){ 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端接收。
D. RoMeo串口蓝牙模块(DF-BluetoothV3)实验
RoMeo集成了一个TTL电平的无线数传接口,兼容APC220无线数传模块和DF-BluetoothV3蓝牙模块。蓝牙模块能做各种应用,,可与各种蓝牙适配器、蓝牙手机配对使用。拨码开关可设置模块状态,LED Off可关闭LINK灯进入省电模式,AT Mode可使模块进入AT指令模式,通过AT指令可以修改波特率和主从机模式,将2个模块分别设置为主模块和从模块后,2个模块就可以自由配对进行数据传输,也非常适用于2个单片机之间的数据通讯。
详细教程可见:DF-BluetoothV3蓝牙串口模块教程
使用的时候同样注意Serial与Serial1在使用上的区别。
E. RoMeo串口XBee模块实验
Xbee模块是采用ZigBee技术的无线模块,通过串口与单片机等设备间进行通信,能够非常快速地实现将设备接入到ZigBee网络的目的。这是一款2.4G的XBee无线模块 。此模块采用802.15.4协议栈,通过串口与单片机等设备间进行通信,支持点对点通信以及点对多点网络。此模块的天线为导线天线,简单,方便。
详细教程可见:XBee模块配置教程
演示代码:(发送端)
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发送数据,而另一块接收数据,可以从串口中,分别读到发送而接收一致。
模拟口的使用
A. 五个按键实验
RoMeo集成了5个按键S1~S5,通过模拟端口0控制。使用模拟按键需要时,如下图中所示,把开关拨到"ON"状态。
演示代码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串口助手里显示按键对应的字符串。
B. 测距实验
Romeo有5过模拟口的扩展插针,扩展口针脚排列根据GP2D12红外距离传感器设计,所以可以直接连接使用。GP2D12是日本SHARP公司生产的红外距离传感器,测量距离20~150cm模拟输出,它的输出模拟量与距离成反比,这点需要注意。
演示代码:
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。
疑难解答
Arduino Leonardo的串口消失了,该怎么办呢?
http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=2687&fromuid=724121
(出处: DF创客社区 - 分享创造的喜悦)
更多问题及有趣的应用,请访问论坛
更多
- 原理图
- 老版本
Go Shopping DFRobot商城购买链接