RoMeo V2
DFRduino RoMeo V2
目录
1 简介
2 产品参数
3 引脚说明
4 RoMeo如何使用
4.1 Arduino IDE的使用:
4.2 数字口的使用
4.2.1 A. 板载L灯实验
4.2.2 B. 外接LED实验
4.2.3 C. 按键实验
4.2.4 D. 舵机实验
4.2.5 E. 多舵机实验
4.2.6 F. 电机驱动实验
4.2.6.1 PWM控制模式
4.2.6.2 PLL控制模式
4.3 串口端口的使用
4.3.1 A. 串口监视器的串口输入
4.3.2 B. 串口监视器的串口输出
4.3.3 C. RoMeo串口无线数传(APC220)实验
4.3.4 D. RoMeo串口蓝牙模块(DF-BluetoothV3)实验
4.3.5 E. RoMeo串口XBee模块实验
4.4 模拟口的使用
4.4.1 A. 五个按键实验
4.4.2 B. 测距实验
4.4.3 C. I2C总线实验
5 疑难解答
6 更多
简介
新一代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总线接口等功能。
V2版的Romeo和V1版的Analog模拟量3-P排针有所更改,如果您用以前的模拟量传感器,请注意正确接线。不正确的电源接线会烧坏传感器等设备。
使用USB口调试电机的时候,请关闭电机开关!否则,过大的外部供电会使Romeo烧坏。
注意:
上传程序时,请在Arduino IDE下选择版型:Leonardo,否则编译上传出错。
串口通信设备:对于串口通信设备,如:Xbee,蓝牙模块,WiFi模块等,请在代码中使用Serial1.()。Serial.()用于电脑端软件,如串口助手, Arduino IDE的Serial Monitor,通过USB线调试Romeo。【阅读:[1]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产品都需要下载代码后才能运作。我们所搭建的硬件电路是辅助代码来完成的,两者是缺一不可的。如同人通过大脑来控制肢体活动是一个道理。如果代码就是大脑的话,外围硬件就是肢体,肢体的活动取决于大脑,所以硬件实现取决于代码。
Arduino IDE 点击下载
驱动安装教程 点击查看
如何下载程序 点击查看教程
Arduino语言的语法参考网站:
Arduino 官网
DFRobot 中文版
数字口的使用
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); // 延时
}
B. 外接LED实验
如果你想外接个LED,可以按下图进行连接,下载实验A中相同的代码,可以实现相同的效果。
数字食人鱼红色LED发光模块
程序功能:外接LED灯会每秒闪烁一次。
C. 按键实验
我们来做个简单的互动实验,按键按下,LED灯亮,松开,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库,让初学者能很快的用上舵机,来看下吧!
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开关电源供电即可。
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,右上角有个放大镜的图标,鼠标放在上面会显示串口监视器,点击该图标。
打开串口后,设置串口监视器的波特率为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);
}
}
}
PLL控制模式
Romeo也支持PLL相位锁相环控制模式。
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;
}
}
}
}
串口端口的使用
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灯灭
}
}
}
B. 串口监视器的串口输出
演示代码:
void setup() {
Serial.begin(9600); //初始化串口并设置波特率为9600
}
void loop() {
Serial.print("Hello!"); //串口向外发送字符串
Serial.println(" DFRobot"); //串口向外发送字符串 ,并带回车
delay(1000); //延时
}
C. RoMeo串口无线数传(APC220)实验
RoMeo兼容APC220无线数传模块和DF-BluetoothV2蓝牙模块。
APC220无线数传模块的通信信道是半双工的,可以完成一点对一点,一点对多点的通讯。这二种方式首先需要设1个主站,其余为从站,所有站点都必须设置一个唯一的地址。通信的协调由主站控制,主站采用带地址码的数据帧发送数据或命令,所有从站全部都接收,并将接收到的地址码与本机地址码比较,地址不同则将数据丢掉,不做响应,若地址码相同,则将接收的数据传送出去。以上过程可以通过软件设置RFID Enable 自动实现,也可有用户通过上层协议完成。当设置RFID Enable时,APC220模块将自动比较所接收数据是否地址匹配,但不会自动应答,若地址匹配模块会将地址、数据传给终端设备。另外,组网必须保证在任何一个瞬间,同一个频点通信网中只有一个电台处于发送状态,以免相互干扰。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);
}
D. RoMeo串口蓝牙模块(DF-BluetoothV3)实验
RoMeo集成了一个TTL电平的无线数传接口,兼容APC220无线数传模块和DF-BluetoothV3蓝牙模块。蓝牙模块能做各种应用,,可与各种蓝牙适配器、蓝牙手机配对使用。拨码开关可设置模块状态,LED Off可关闭LINK灯进入省电模式,AT Mode可使模块进入AT指令模式,通过AT指令可以修改波特率和主从机模式,将2个模块分别设置为主模块和从模块后,2个模块就可以自由配对进行数据传输,也非常适用于2个单片机之间的数据通讯。
DF-BluetoothV3蓝牙串口模块
详细教程可见:DF-BluetoothV3蓝牙串口模块教程
使用的时候同样注意Serial与Serial1在使用上的区别。
E. RoMeo串口XBee模块实验
Xbee模块是采用ZigBee技术的无线模块,通过串口与单片机等设备间进行通信,能够非常快速地实现将设备接入到ZigBee网络的目的。这是一款2.4G的XBee无线模块 。此模块采用802.15.4协议栈,通过串口与单片机等设备间进行通信,支持点对点通信以及点对多点网络。此模块的天线为导线天线,简单,方便。
XBee 1mW Zigbee 无线数传模块
详细教程可见: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); //延时
}
演示代码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;
}
B. 测距实验
Romeo有5过模拟口的扩展插针,扩展口针脚排列根据GP2D12红外距离传感器设计,所以可以直接连接使用。GP2D12是日本SHARP公司生产的红外距离传感器,测量距离20~150cm模拟输出,它的输出模拟量与距离成反比,这点需要注意。
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);
}
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); // 响应主机的通知,向主机发送一个字节数据
}
疑难解答
更多问题及有趣的应用,请访问论坛
更多
原理图
Romeo Schematic V2
老版本
Romeo V2
Romeo V1
Go Shopping