|
如何使用探索者通信模块
作者:机器谱
2510转接板 蓝牙串口模块 BLE4.0模块 NRF模块 WiFi无线路由器 Zigbee模块 Shoal总线模块 |
2510通信转接板
2510通信转接板模块需要安装到 Bigfish扩展板 的扩展坞上使用。它的作用是从Bigfish中引出一个采用4芯接口的串口,同时还有一个5V的小电流USB 口。当需要将类似陀螺仪这种4芯接口的串口传感器与bigfish连接时,可以利用2510通信转接板进行更加规整的连接。或者当用到无线路由器时,也需要通过2510通信转接板的USB口给路由器供电【路由器与2510通信转接板的连接方式可参考【U011】如何使用探索者通信模块-WiFi无线路由器 】。
注:
1. 跳帽连接至此处,四芯输出端口可工作。连接方式如图:
2. 跳帽连接至此处,四芯输出端口与USB接口可同时工作。连接方式如图:
3. 控制四芯输出口的电压。输出5V连接如图A,输出电源电压(非控制板,直接输出电源电压)连接如图B:
将2510通信转接板安装到Bigfish扩展板的扩展坞上使用(注意方向,插反可能导致烧坏)。
序号 | 内容 |
1 | 【U011】2510通信转接板电路文件 |
【整体打包】-【U011】如何使用探索者通信模块-2510通信转接板-资料附件.zip | 1.06MB | 下载27次 | 下载 |
1. 概述
HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式,在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;当模块处于命令响应工作模式时能执行下述所有AT命令,用户可向模块发送各种AT指令,为模块设定控制参数或发布控制命令。通过控制模块外部引脚(PIO11)输入电平,可以实现模块工作状态的动态转换。
2. 参数
· 蓝牙2.0 带EDR, 2Mbps-3Mbps 调制度
· 内置 2.4GHz 天线, 用户无需调试天线
· 灵敏度(误码率)达到 -80dBm
· -4 -> 6dBm 功率可调输出
· 外置 8Mbit FLASH
· 低电压3.3V 工作
· 可选PIO 控制
· 标准HCI 端口(UART or USB)
· USB 协议: Full Speed USB1.1, Compliant With 2.0
· 数字2.4GHz 无线收发射
· CSR BC04 蓝牙芯片技术
· 自适应跳频技术
· 蓝牙Class 2 功率级别
3. 实物图片
4. 原理图
5. 使用示例:
手机与蓝牙相互通信(键盘模式)
器材:蓝牙串口模块、Basra/Arduino Uno控制板、BigFish扩展板、安卓手机,Arduino IDE。
实现功能:在键盘模式下,实现利用手机蓝牙发送命令1时,在手机蓝牙串口上显示“I receive:1”字符串;发送2时,在手机蓝牙串口上显示“I receive:2”字符串。
(1)编写如下源代码(BlueTooth.ino),并上传到主控板:
序号 | 内容 |
1 | 蓝牙串口模块_参考资料 |
2 | 蓝牙串口模块_例程 |
3 | 蓝牙串口模块_安卓蓝牙串口助手APK |
int _ABVAR_1_Data_of_bluetooth = 0 ; void setup() { Serial.begin(9600); } void loop() { _ABVAR_1_Data_of_bluetooth = Serial.parseInt() ; if (( ( _ABVAR_1_Data_of_bluetooth ) > ( 0 ) )) { if (( ( _ABVAR_1_Data_of_bluetooth ) == ( 1 ) )) { Serial.print("I receive:1"); Serial.println(); } if (( ( _ABVAR_1_Data_of_bluetooth ) == ( 2 ) )) { Serial.print("I receive:2"); Serial.println(); } } else { delay( 10 ); } } |
int _ABVAR_1_data = 0 ; void setup() { Serial.begin(9600); pinMode( 9 , OUTPUT); pinMode( 5 , OUTPUT); } void loop() { _ABVAR_1_data = Serial.parseInt() ; if (( ( _ABVAR_1_data ) == ( 1 ) )) { digitalWrite( 9 , HIGH ); digitalWrite( 5 , LOW ); } if (( ( _ABVAR_1_data ) == ( 2 ) )) { digitalWrite( 9 , LOW ); digitalWrite( 5 , HIGH ); } } |
②配对成功后,出现如下图图5中的界面,出现了三种操作模式选项,选择键盘模式。
⑦按照同样的方式设置“发送2”的命令。
(2)按下图所示连接电路,错误的连接会导致模块损坏。
(3)安装蓝牙串口助手app
将蓝牙串口助手.apk安装到手机里,也可在手机应用商城中搜索安装其他版本的蓝牙串口助手。
(4)设置蓝牙串口助手
①打开手机上已经安装好的蓝牙串口助手app(见下图),打开该软件后,会看到HC-05,等待扫描结束后,点击搜索到的HC-05设备,初次连接需输入密码1234进行配对。
③点击“键盘模式”,出现如下图界面。
④点击右上角按钮
⑤ 第④步完成后出现如下图所示的界面,此时点击“配置键盘值”。
⑥接着出现下图所示界面,此时点击界面中的任意一个“点我”按钮,就可以编辑自己需要的命令了。我们可以设置一个“发送1”的命令,其步骤为:首先点击界面中的任意一个“点我”,接着将“点我”删除,然后输入“发送1”,最后在“按下发送值”这个文本框中添加“1”就完成了该命令的设置。
⑧完成这两个命令的效果如下图所示。
⑨最后一步按照下图中步骤操作,就可完成命令的设置。
⑩通过以上的配置后,完成了键盘模式的配置。配置完成后,我们点击手机App上的“发送1”,在手机上就会接收到“I receive:1”,如果点击“发送2”,在手机上就会接收到“I receive:2”。具体效果如下图所示。
6. 使用示例:手机遥控小车
接下来我们尝试实现用安卓手机APP通过串口控制023号小车运动。
(1)准备好机构和电路。
(2)编写并烧录以下代码:
(2)用手机APP连接蓝牙串口模块,并在APP上设置前进按钮(发送1),后退按钮(发送2),即可对小车遥控操作。效果如下:
7. 应用前景
· 工业遥控、遥测
· POS系统,游戏手柄
· 汽车检测设备
· 便携、电池供电医疗器械
· 自动化数据采集
· 蓝牙遥控玩具
· 无线LED显示系统
· 蓝牙打印机
· 智能家居、工业控制
8. 资料清单
【整体打包】-【U011】如何使用探索者通信模块-蓝牙串口模块-资料附件.zip | 1.83MB | 下载36次 | 下载 |
1. 概述
BLE4.0a蓝牙模块采用TI CC2540芯片,配置256Kb 空间,支持AT 指令,用户可根据需要更改角色(主、从模式)以及串口波特率、设备名称、配对密码等参数,使用灵活。
2. 参数
· 蓝牙协议:Bluetooth Specification V4.0 BLE
· 收发没有字节限制
· 空旷环境下和iphone4s可以实现110米超远距离通信
· USB协议:USB V2.0
· 工作频率:2.4GHz ISM band
· 调制方式:GFSK(Gaussian Frequency Shift Keying)
· 发射功率:-23dbm, -6dbm, 0dbm, 6dbm, 可以通过AT 指令修改
· 灵 敏 度:≤-84dBm at 0.1% BER
· 传输速率:Asynchronous: 6K bytes
· Synchronous: 6k Bytes
· 安全特性:Authentication and encryption
· 支持服务:Central & Peripheral UUID FFE0,FFE1
· 功 耗:自动休眠模式下,待机电流400uA~1.5mA, 传输时8.5mA。
· 供电电源:+3.3VDC 50mA
· 工作温度:–5 ~ +65 Centigrade
3. 原理图
4. 配置AT指令
按下图所示用公对母杜邦线将BLE4.0a模块与bigfish连接。注意!错误的连接会导致模块损坏。
底板电路图如下:
给控制板刷一套空的程序。初始打开Arduino IDE或新建,都是空程序。
将蓝牙模块连接到Bigfish扩展板上,并将扩展板插到控制板上。打开arduino的Seiral Monitor,输入AT指令集,观察蓝牙模块的相应。
(1)测试
模块处于待机状态时,会通过串口返回: “OK”
模块处于连接状态时,会断开连接并返回:”OK+LOST”, 前提是设置了AT+NOTI1
(2)查询模块MAC地址
指令 | 应答 | 参数 |
AT | OK OK+LOST | 无 |
指令 | 应答 | 参数 |
AT+ADDR? | OK+LADD:MAC地址 | 无 |
指令 | 应答 | 参数 |
AT+CONNL | OK+CONN[Para] | Para: L, N, E,F L:连接中 N:空地址 E:连接错误 F:连接失败 |
指令 | 应答 | 参数 |
AT+CON[para1] | OK+CONN[Para2] | Para1: 蓝牙地址 如: 0017EA0943AE Para2: A, E, F A: 连接中 B: 连接错误 F: 连接失败 |
指令 | 应答 | 参数 |
AT+CLEAR | OK+CLEAR | 无 |
指令 | 应答 | 参数 |
查询:AT+FILT? | OK+ Get:[Para] | Para: 0 ~ 1 0: 不过滤 1: 过滤 Default: 0 |
设置:AT+FILT[Para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+HELP? | 帮助信息 | 无 |
指令 | 应答 | 参数 |
查询:AT+IMME? | OK+ Get:[para] | Para: 0 ~ 1 0: 上电立即工作 1: 上电等待AT+START 后开始工作 Default: 0 |
设置:AT+IMME[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+MODE? | OK+ Get:[para] | Para: 0 ~ 2 0: 透传模式 1: 远控模式 2:透传+远控模式 Default: 0 |
设置:AT+MODE[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+NOTI? | OK+ Get:[para] | Para: 0 ~ 1 0: 连接后不通知上位机 1: 连接后通知上位机 Default: 0 |
设置:AT+NOTI[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+NAME? | OK+ Get:[para] | Para:设备名称 最长11 位数字或字母, 含中划线和下划线,不建 议用其它字符。 Default:HMSoft |
设置:AT+NAME[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+PARI? | OK+ Get:[para] | Para范围0,1,2 0: 无校验 1: EVEN 2: ODD Default: 0 |
设置:AT+PARI[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+PIO1? | OK+ Get:[para] | Para1:0~1 0:待机慢闪,连接后常亮 1:待机不闪,连接后常亮 Default:0 |
设置:AT+PIO1[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+PASS? | OK+ Get:[para] | Para1: 000000~999999 Default:000000 |
设置:AT+PASS[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+PWRM? | OK+ Get:[para] | Para: 0 ~ 1 0: 自动休眠 1: 不自动休眠,等待 AT+SLEEP进入休眠状态 Default: 1 |
设置:AT+PWRM[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+POWE? | OK+ Get:[para] | Para: 0 ~ 3 0: -23dbm 1: -6dbm 2: 0dbm 3: 6dbm Default: 2 |
设置:AT+POWE[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+ROLE? | OK+ Get:[para] | Para1: 0 ~ 1 1: 主设备 0: 从设备 Default: 0 |
设置:AT+ROLE[para] | OK+ Set:[Para] |
指令 | 应答 | 参数 |
查询:AT+SAVE? | OK+ Get:[para] | Para: 0 ~ 1 0: 保存 1: 不保存 Default: 0 |
设置:AT+SAVE[para] | OK+ Set:[Para] |
#include <arduino.h> #include <MsTimer2.h> #include <Servo.h> #include "LedControl.h" #include <EEPROM.h> String inputString = ""; // a string to hold incoming data LedControl lc=LedControl(12,11,13,1); //config 8*8 led Servo myServo[6]; int servo_port[6]={4,9,10,3,6,5}; boolean ledbuf[8][8]; void setup() { // initialize serial: Serial.begin(9600); // reserve 200 bytes for the inputString: inputString.reserve(200); LedInit(); #if 1 Serial.print("AT"); delay(100); Serial.print("AT+BAUD0"); delay(100); Serial.print("AT+ROLE0"); delay(100); Serial.print("AT+CLEAR"); delay(100); Serial.print("AT+ROLE1"); delay(100); #endif } void loop() { char arr[5]; LedLetter('8'); delay(100); Serial.print("AT"); Serial.print("AT"); //delay(100); if(Serial.available()) { LedLetter((char)(Serial.read())); delay(1000); } } |
指令 | 应答 | 参数 |
AT+RENEW | OK+RENEW | 无 |
指令 | 应答 | 参数 |
AT+RESET | OK+RESET | 无 |
指令 | 应答 | 参数 |
AT+RSSI? | OK+RSSI:[para] | 无 |
指令 | 应答 | 参数 |
AT+RADD? | OK+RADD:MAC地址 | 无 |
指令 | 应答 | 参数 |
AT+START | OK+START | 无 |
指令 | 应答 | 参数 |
AT+SLEEP | OK+SLEEP | 无 |
指令 | 应答 | 参数 |
查询:AT+BAUD? | OK+Get:[para1] | Para1:0~8 0=9600;1=19200; 2=38400;3=57600; 4=115200;5=4800; 6=2400;7=1200; 8=230400; Default:0(9600) |
设置:AT+BAUD[para1] | OK+Set:[para1] |
(3)查询、设置波特率
(4)连接最后一次连接成功的从设备
若远程设备异常断电或是已经和别的设备建立连接,则OK+CONNF 需要10秒左右才会返回。
注:此指令只有在主设备时才有效;从设备时不接受此指令,发送此指令没有回复,也不执行。
(5)连接指定蓝牙地址的从设备
若远程设备异常断电或是已经和别的设备建立连接,则OK+CONNF 需要10秒左右才会返回。
注:此指令只有在主设备时才有效;从设备时不接受此指令,发送此指令没有回复,也不执行。
(6)清除主设备配对信息
清除成功连接过的设备地址码信息。
(7)设置是否过滤AT指令
该指令用于在AT+MODE 值等于2 的情况下,即远控+透传模式下,是否将AT 远程主机的AT指令过滤掉,不通过串口发出。
(8)帮助指令
(9)设置模块工作类型
注:重新上电后该设置值生效。
(10)设置模块工作模式
注:透传模式即普通的串口透明传输,远控模式,您可以在蓝牙连接后,通过远端对蓝牙模块进行参数设置,PIO 控制等,透传+远控模式,您可以同时进行串口传输和参数控制。
(11)设置是否通知上位机连接状态
注:只在主模块方式下生效。如Para值设为1,则主模块在成功连接上从模块后,会通过串口发送”AT+CONN”字符给与主模块焊接在一起的上位机,断开连接后则会发送”AT+LOST”字符。
(12)查询、设置设备名称
例子如下:
发送:AT+NAMEname
返回:OK+Set:name
参数name:所要设置的当前名称,即蓝牙被搜索到的名称。11个字符以内。
例:发送AT+NAMEbill_gates
返回OK+Set:bill_gates
这时蓝牙模块名称改为bill_gates
注:该指令执行后,须重新上电新设置的参数才能生效。
(13)设置串口校验
注:该指令执行后,须重新上电新设置的参数才能生效。
(14)PIO1 口输出状态(Query/Set Pio1 output status)
(15)查询、设置配对密码
例子如下:
发送AT+PASS008888
返回OK+Set:008888
这时蓝牙模块配对密码改为008888,模块在出厂时的默认配对密码是000000。
(16)设置模块休眠方式
该指令仅在从模式下生效。
(17)模块功率设置指令
(18)恢复默认设置(Renew)
恢复模块默认出厂设置值,模块的所有设置均会被重置,恢复到出厂时状态,
恢复出厂设置后,模块延时500ms后重启,如无必要,请慎用。
(19)模块复位,重启(Reset)
该指令执行后,模块将延时500ms后重启。
(20)查询、设置主从模式
注:该指令执行后,会导致模块延时500ms重启。
(21)读取RSSI信号值
注:该指令仅在远程控制(AT+MODE1,2)下起作用,上位机发送AT+RSSI?后,模块读取RSSI值并回复给上位机。
(22)查询成功连接过的远程主机地址
注:只能显示在主模式下成功连接过的地址。
(23)开始工作指令
注:该指令配合AT+IMME 设置值”1”为1 时有效,指令执行后,模块延时500ms开始工作。
(24)让模块进行休眠状态
该指令仅在从模式下待机状态下生效。
(25)设置模块成功连接后是否保存连接地址
注:如果要设置主模块为不保存,请先执行一下AT+CLEAR指令清除以前的地址,这样每次主模块上电后,会先搜索,而非直接连接上次地址。
5. 通过单片机操作AT指令
正常使用时,将BLE4.0a模块直接插在Bigfish的座坞上即可。
启动Arduino IDE,将例程uploading到控制板中。
本例程源代码如下(Ble4_AT.ino)
控制板通过串口向蓝牙模块发出AT指令,观察bigfish上点阵的显示结果。如果依次显示“O”、“K”,表示收到了蓝牙模块返回的AT指令结果。
6. 配置模块主从模式
硬件环境:Basra主控板、Bigfish扩展板、Ble4.0a模块、两个触碰传感器(安装在Bigfish的A0/A4)
功能:按下A0触碰时,Ble4.0a配置为主机,点阵上(0,0)灯亮;按下A4触碰时,配置为从机,(0,1)灯亮
例程源代码如下(Ble4_Configure.ino):
#include "LedControl.h" LedControl lc=LedControl(12,11,13,1); //调用8*8点阵函数库,并初始化;
void setup() { Serial.begin(9600); //设置串口通信波特率; Serial.print("AT"); //以下六条语句设置蓝牙模块参数; delay(100); Serial.print("AT+CLEAR"); delay(100); Serial.print("AT+BAUD0"); delay(100); lc.shutdown(0, false); //设置点阵参数; lc.clearDisplay(0); } void loop() { if(!digitalRead(A0)) //如果按下"从模式"按键,即A0端口键; { for(int i = 0;i<5;i++) { Serial.print("AT"); //测试一下; delay(10); } Serial.print("AT+ROLE0"); //设置从模式; delay(100); if( Serial.find("Set:0")) //判断是否设置成功,成功则(0,0)灯亮; { lc.clearDisplay (0); lc.setLed(0, 0, 0, true); } } if(!digitalRead(A4)) //如果按下"主模式"按键,即A4端口键; { for(int i = 0;i<5;i++) { Serial.print("AT"); //断开连接或测试; delay(10); } Serial.print("AT+ROLE1"); //设置主模式; if( Serial.find("Set:1")) //判断是否设置成功,成功则(0,1)灯亮; { lc.clearDisplay (0); lc.setLed(0, 0, 1, true); } } } |
//此程序用于一对一式蓝牙通信,主模块,maple韩枫编写;参考资料bluetooth40.pdf,HMDongle40.pdf; #include"LedControl.h" LedControl lc=LedControl(12,11,13,1); int i=0; //要发送的数据; void setup() { Serial.begin(9600); lc.shutdown(0, false); delay(3000); } void loop() { delay(500); lc.clearDisplay (0); Serial.print(i); //发送出去; lc.setLed(0, 0, i, true); delay(50); for(int k=0;k<3;k++) Serial.read(); //消除串口缓冲区的数据"i","ok",以便执行serialEvent事件; delay(100); } void serialEvent() //如果从模块响应了我的发送行为,数据++; { i++; if(i==8) i=0; } |
//此程序用于一对一式蓝牙通信,从模式程序,maple韩枫编写;参考资料bluetooth40.pdf,HMDongle40.pdf;此程序与一对多式蓝牙通信被传染对象程序一模一样; #include"LedControl.h" LedControl lc=LedControl(12,11,13,1);
void setup() { delay(1000); Serial.begin(9600); //以下注释掉的6行为参数配置行,但因为硬件响应原因容易导致设置失败,从而影响程序的执行,我采用在端口软件提前设置好. // Serial.print("AT+ROLE0"); //设置自身为从模块; // delay(1000); // Serial.print("AT+IMME0"); //设置自身上点即工作; // delay(1000); // Serial.print("AT+MODE2"); //设置自身为远控加透传模式; // delay(1000); lc.shutdown(0, false); lc.clearDisplay (0); while (Serial.available()) //消除串口缓冲区多余数据,以便执行loop; Serial.read(); } void loop() { while (Serial.available()) //收到数据工作; { int i=Serial.read(); //存储; delay(100); lc.clearDisplay (0); switch(i) //判断收到的数据; { case 48:{lc.setLed(0, 0, 0, true); Serial.print("ok");}break;//点亮相应的灯并回应主模块; case 49:{lc.setLed(0, 0, 1, true); Serial.print("ok");}break; case 50:{lc.setLed(0, 0, 2, true); Serial.print("ok");}break; case 51:{lc.setLed(0, 0, 3, true); Serial.print("ok");}break; case 52:{lc.setLed(0, 0, 4, true); Serial.print("ok");}break; case 53:{lc.setLed(0, 0, 5, true); Serial.print("ok");}break; case 54:{lc.setLed(0, 0, 6, true); Serial.print("ok");}break; case 55:{lc.setLed(0, 0, 7, true); Serial.print("ok");}break; default:;break; } } } |
7. BLE4.0a模块通信
硬件环境:(Basra、Bigfish、Ble4.0)×2,2个BLE4.0a模块配置为一主一从。
实现功能:2套硬件上电后,主从BLE4.0a应自动连上,此时主机点阵(0,0)亮,通过蓝牙发送字符0;从机接收到字符0后,点阵(0,0)亮;一秒后,主机点阵(0,1)亮,发送字符1;从机收到1后,点亮(0,1);以此类推,到从机接收到字符7后结束。
主机程序源代码(Ble4_Master.ino):
从机程序源代码(Ble4_Slave.ino):
8. 应用前景
· 工业遥控、遥测
· POS系统,游戏手柄
· 汽车检测设备
· 便携、电池供电医疗器械
· 自动化数据采集
· 蓝牙遥控玩具
· 无线LED显示系统
· 蓝牙打印机
· 智能家居、工业控制
9. 资料清单
序号 | 内容 |
1 | BLE4.0a蓝牙模块_参考资料 |
2 | BLE4.0a蓝牙模块_例程 |
【整体打包】-【U011】如何使用探索者通信模块-BLE4.0a蓝牙模块-资料附件.zip | 359.02KB | 下载2次 | 下载 |
1. 简介
探索者NRF无线通信模块使用的是NRF24L01-M芯片,是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设置可以通过SPI 接口进行设置。几乎可以连接到各种单片机芯片,并完成无线数据传送工作。
极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。
2. 特点
· 增强型“ShockBurst”工作模式,硬件的CRC校验和点对多点的地址控制
· 4线SPI通讯端口,通讯速率最高可达8Mbps,适合与各种MCU连接,编程简单
· MCU可通过IRQ引脚快判断是否完成数据接收和数据发送
3. 参数
· 宽电压工作范围,1.9V~3.6V,输入引脚可承受5V电压输入
· 工作温度范围,-40℃~+80℃
· 工作频率范围,2.400GHz~2.525GHz
· 发射功率可选择为0dBm、-6dBm、-12dBm和-18dBm
· 数据传输速率支持1Mbps、2Mbps[2]
· 低功耗设计,接收时工作电流12.3mA,0dBm功率发射时11.3mA,掉电模式时仅为900nA
· 126个RF通道,6个增强型数据通道,满足多点通讯和调频需要
· 数据包每次可传输1~32Byte的数据
4. 实物图片与接口
5. NRF24L01-M芯片原理图
6. 实现无线模块的串口传输功能
器材:NRF24L01模块2个、Basra/Arduino UNO控制板2个、BigFish扩展板2个、直流电机1个、miniUSB数据线,上位机终端2台。
(1)设置NRF模块的通信频道
由于NRF模块用到了BigFish的RX、TX引脚,因此首先需要将通信频道调整程序setchannal.ino下载到控制板,然后才可以将NRF模块按照图示插接到BigFish扩展板的座坞上,否则模块会占用串口,造成程序下载失败。
NRF模块的通信频道编号通过模块上的四个LED灯组合成的二进制码表示,共16个通道。我们需要将两个互相通信的NRF模块的通信频道调整成一致的。
另外,还需要安装一个触碰传感器作为按钮,用于NRF无线模块通信频道的调节,具体为传感器每触发一次,NRF无线模块通信频道编号即加1。下面提供的例程允许你将触碰传感器安装在任意一个传感器接口。
例程源代码(setchannal.ino)如下:
int sensor[4]= {A0,A2,A4,A3}; void setup() { Serial.begin(9600); for(int i=0;i<4;i++) pinMode(sensor[i],INPUT); } void loop() { if(SensorTrigger(0)){ Serial.println('#'); } delay(100); } boolean SensorTrigger( int which ) { boolean where = false; if( !digitalRead( sensor[ which ] ) ) { delay( 100 ); if( !digitalRead( sensor[ which ] ) ) where = true; } return( where ); } |
void setup() { Serial.begin(9600); } void loop() { Serial.println("123456789"); } |
#include "LedControl.h" LedControl lc=LedControl(12,11,13,1); //config 8*8 led String inputString = ""; boolean stringComplete = false; void setup() { Serial.begin(9600); inputString.reserve(200); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); LedInit(); } void loop() { if (stringComplete) { string_deal(); } } void string_deal() { Serial.println(inputString); int len = inputString.length()-1; char buf[len]; inputString.toUpperCase(); inputString.toCharArray(buf, len); for(int i=0; i<len-1; i++){ LedLetter(buf[i]); delay(1000); } inputString = ""; stringComplete = false; } |
int a = 0 ; int b = 0 ; void ADGet(); void SerialPrint(); void setup() { Serial.begin(9600); } void loop() { ADGet(); SerialPrint(); delay( 100 ); } void ADGet() { a = analogRead(14) ; b = analogRead(15) ; a = map ( a , 0 , 1024 , 0 , 3 ) ; b = map ( b , 0 , 1024 , 0 , 3 ) ; } void SerialPrint() { if (( ( ( a ) == ( 0 ) ) && ( ( b ) == ( 1 ) ) )) { Serial.print("1"); Serial.println(); } if (( ( ( a ) == ( 1 ) ) && ( ( b ) == ( 0 ) ) )) { Serial.print("2"); Serial.println(); } if (( ( ( a ) == ( 1 ) ) && ( ( b ) == ( 1 ) ) )) { Serial.print("3"); Serial.println(); } if (( ( ( a ) == ( 1 ) ) && ( ( b ) == ( 2 ) ) )) { Serial.print("4"); Serial.println(); } if (( ( ( a ) == ( 2 ) ) && ( ( b ) == ( 1 ) ) )) { Serial.print("5"); Serial.println(); } } |
int a = 0 ; int a_his = 0 ; int b = 0 ; void Right(); void Select(); void Stop(); void Left(); void Back(); void Forward(); void setup() { Serial.begin(9600); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); pinMode( 9 , OUTPUT); pinMode( 10 , OUTPUT); a = 3 ; a_his = 3 ; } void loop() { a = Serial.parseInt() ; if (( ( a ) > ( 0 ) )) { Select(); } else { a = a_his ; Select(); } a_his = a ; a = b ; delay( 50 ); } void Select() { if (( ( a ) == ( 1 ) )) { Forward(); } if (( ( a ) == ( 2 ) )) { Back(); } if (( ( a ) == ( 3 ) )) { Stop(); } if (( ( a ) == ( 4 ) )) { Left(); } if (( ( a ) == ( 5 ) )) { Right(); } } void Back() { digitalWrite( 5 , LOW ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH ); } void Forward() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); } void Stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); } void Left() { digitalWrite( 5 , LOW ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); } void Right() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH ); } |
(2)发送字符串
将两个NRF模块设置为相同的通道后,准备2套Basra主控板和Bigfish扩展板,其中一套作为发送端,将send.ino下载到该主控板;另一套作为接收端,将receive.ino下载到该主控板。
例程源代码如下:
send.ino
receive.ino
将两个NRF模块分别插接到Bigfish上,依次打开接受端、发送端。就可以在接收端主控板的LED点阵上面看到发送的字符串。
7. NRF遥控小车
本项目将使用NRF模块构建一套遥控系统,并使用它们遥控023号机构的小车。
主要器材:Basra主控板×2;Bigfish扩展板×1;Birdmen扩展板×1;NRF无线模块×2;023号机构1个。
一块Basra控制板将作为遥控器使用,下载NRF_master.ino程序;另一块Basra控制板将作为小车的控制器使用,下载NRF_slave.ino程序。
源代码如下:
NRF_master.ino
NRF_slave.ino
将Birdmen手柄扩展板堆叠到作为遥控器的Basra控制板上,然后堆叠上NRF模块,一个遥控器就做好了;
将Bigfish扩展板堆叠到下载了slave的Basra控制板,再堆叠上无线串口模块。并且给Bigfish的电机接口分别接上023号机构的电机。
序号 | 内容 |
1 | NRF无线模块_函数库 |
2 | NRF无线模块_例程_发送字符串 |
3 | NRF无线模块_例程_设定通信频道 |
4 | NRF无线模块_例程_遥控双路直流马达 |
5 | NRF无线模块_例程_遥控小车 |
6 | NRF无线模块_参考资料 |
【整体打包】-【U011】如何使用探索者通信模块-NRF无线模块-资料附件.zip | 2.22MB | 下载18次 | 下载 |
1. 简介
探索者无线路由器尺寸为58mm×58mmx25mm,方便安装、携带。双网口,150M 无线速率,有线无线连接都完美支持。支持连接USB摄像头,做为高清(HD)无线网络监控,通过手机APP可以随时随地轻松访问。支持连接U盘或USB移动硬盘,作为远程下载,从此下载电影不用再一直开着电脑,绿色环保;手机也可以直接启动下载任务,不占用手机流量。加强对安全策略,硬件身份认证,对网络监控及个人数据给予充分的安全保护。操作界面简洁友好,不像其他路由器要进行繁杂的设置,支持一键更新固件。内置DDNS,为每位用户免费提供独立访问域名,不需要再另外申请。64M内存,16M Flash,支持OPENWRT系统刷机,自带刷不死Uboot,主板TTL针已焊好,另预留4个GPIO接口,充分满足DIY爱好者的需要。
2. 参数
· CPU:Atheros 9331 400MHZ
· 内存 / 闪存:内存: 64MB / 闪存:16MB
· 接口:1Wan , 1LAN , 1USB2.0 , 1Micro USB(Power)
· LED指示灯:Wireless、Wan、Lan指示灯
· 协议标准:IEEE802.11n/g/b、IEEE802.3、IEEE802.3u
· 无线开关键:支持。每按一次切换WIFI on/off,按住8S恢复出厂设置。拨动功能可自定义。
· 天线:内置智能全向天线
· PC应用:web访问,支持:Chrome/Safari/Firefox浏览器/IE8-IE10
· 手机APP:Android、IOS专业APP
· DDNS域名:内置独立域名,永久免费
· USB外接存储:格式FAT32/EXFAT/EXT4/ETX3/EXT2/NTFS,推荐EXT4、NTFS若使用USB硬盘,建议硬盘独立供电
· USB外接摄像头:USB接口免驱动,支持MJPG或YUV格式。
· 软件在线更新:支持一键刷机,自动更新
· DIY特性:自带刷不死Uboot;Uart串口;预留4个GPIO接口,3.3V、5V电源接口
· 电源:5V/1A micro USB
· 尺寸:58mm*58mm*25mm
· 重量:42g(不含外包装)
· 功耗:小于1W(不含USB外接设备消耗)
· 温度:工作温度0~45℃, 存储温度-20~70℃
3. 实物图片与接口
3.1白色外壳版本
4. 实现固定位置的视频监控
器材:无线路由器、miniUSB下载线、USB摄像头、带wifi连接的电脑或安卓/苹果手机。
(1)先按下图所示对各种模块进行连线:
(2)实现PC端视频监控:
USB摄像头连接到无线路由器的标准USB接口,通过miniUSB线将无线路由器与PC连接(或手机用的电源适配器)
电源接通后,无线路由器顶端的指示灯绿灯亮起,路由器开始启动。稍等约30秒,待指示灯开始红绿间断闪动时,表示启动完毕。
此时,搜索无线网络连接,可以找到名称为:GL-AR150-xxx的SSID。点击连接后,输入无线密码:goodlife。若连接失败,请将无线网卡的ip设为自动获取。
在浏览器中输入:192.168.8.1,出现登陆界面。在密码区中输入密码:12345678。在监控页面我们可以对摄像头传输的画面分辨率进行设置,由于摄像头数据非加密,设置完成后我们在浏览器地址栏中输入IP+端口号(192.168.8.1:8083,中间冒号需要在英文状态下输入)即可访问摄像头,浏览器建议使用火狐、谷歌浏览器,设置及浏览器显示效果如下:
浏览器地址输入访问如下图:
5. 实现移动条件下的无线传输
把无线路由器与摄像头安装在移动机器人平台上,并实现视频传输。
器材:无线路由器、miniUSB下载线、USB摄像头、带WiFi连接的电脑或安卓手机、控制板、锂电池、机器人本体。
(1)先按下图所示对各种模块进行连线(注意路由器需要去掉外壳,可以用镊子辅助):
通信转接板与路由器(去掉外壳)的接线如下图:
(2)使用锂电池给控制板供电,打开控制板电源后,无线路由器也同时开始启动工作。
(3)电路连接完成稍等30秒左右手机WiFi连接“GL-AR150-xx”,输入密码:goodlife。如果60秒内还未连接到WiFi,可以参考本文第8部分,重新烧录路由器串口固件。
6. 手机app控制伺服电机
利用手机app通过WiFi遥控伺服电机,可通过手机观察摄像头实时拍摄影像。
器材:无线路由器、miniUSB下载线、带WiFi连接的安卓手机、WIFIRobotV2.01.apk、Basra控制板、Bigfish扩展板、锂电池。
按下图所示对各模块进行连线:
电路连接完成稍等30S左右手机WiFi连接“GL-AR150-xx”,输入密码:goodlife。如果60s内还未连接到WiFi,可以参考本文第8部分,重新烧录路由器串口固件。
编写下面的代码(wifi_protocol.ino)并下载到Basra主控板。这段程序是下位机程序,用于驱动舵机。注意程序烧录时拔下通信转接板,否则串口被占用,会造成下载失败:
/**************** wifi protocol ********************* * ff 02 01 xx ff left speed slider, adjust speed, xx : 0 ~ 10 * ff 02 02 xx ff right speed slider, operate panel, xx : 0 ~ 10 * ff 01 07 xx ff x point of screen, xx : * ff 01 08 xx ff y point of screen, xx : 00 ~ 99 * ff 0a 01 xx ff moveDirection, xx : 1 ~ 5 *************** main process *********************** __________________________ | \ start - wait mode - infrared start - automode 60s \ \ | \ ------------------ wifi mode - wait 10s \____________________________________| */ #include <Servo.h> Servo servoX; Servo servoY; boolean dataComplete; int inputData[4]; //data from wifi void setup() { Serial.begin(9600); servoX.attach(4); servoY.attach(3); } void loop() { //control by wifi if (dataComplete) //接收完 WiFi 数据后 { if(inputData[0] == 1) { if(inputData[1] == 7) //当数据为 17** 的时候 X 轴舵机动 { servoX.write(inputData[2]); } if(inputData[1] == 8) //当数据为 18** 的时候 Y 轴舵机动 { servoY.write(inputData[2]); } } } } void serialEvent() { static int i; static boolean revStart; while (Serial.available()) { //get data from wifi int inData = Serial.read(); if (inData == 0xff && !revStart) { revStart = true; } else if(revStart) { inputData[i] = inData; i++; if(i > 3) { if(inputData[3] == 0xff) { dataComplete = true; i = 0; revStart = false; } else { i = 0; revStart = false; } } } } } |
路由器启动完成,用手机连接路由器WiFi(路由器启动大概需要30秒左右)。在手机上安装WIFIRobotV2.01.apk文件,并打开app进行如下设置:
重启app,点击“开始”按钮,手机将会收到视频画面,通过按键便可以控制D3、D4引脚两个舵机进行转动。
7. 路由器固件升级方法
(1)电脑连接路由器,然后在浏览器地址输入:192.168.8.1,输入密码12345678,首次登陆需要设置密码,登陆成功后进入设置界面,按如下步骤操作:
(2)之后选择bin格式的升级固件,固件软件包中的openwrt-gl-ar150.bin文件,此文件为2.26版本,选择之后先上传然后进行校验,校验成功后点击升级即可
升级过程不要关闭网页,固件升级时建议使用网线连接路由器与电脑,避免在WiFi连接下升级。
8. 安装ser2net软件包教程(重刷固件)
8.1 重新设置路由器密码
(1)启动路由器,电脑连接路由器WIFI网络,初始密码为goodlife:
(2)使用浏览器(edge、谷歌、搜狗等)网页登陆路由器管理页面,浏览器地址输入:192.168.8.1
点击中文
点击Next
重新设置密码:goodlife(如果未自动弹出该界面则无需设置密码,直接参考下面步骤完成固件安装)
8.2 安装串口控制ser2net软件包
(1)安装winSCP文件传输软件(WinSCP_5.9.3.7136_Setup.exe),电脑连接路由器WiFi信号,打开winSCP登陆路由器账户,账户名:root,密码:goodlife(设置的登陆密码),按下图设置:
路由器登陆成功后文件目录如下:
(2)打开PuTTY_0.67.0.0软件,此软件可以在命令行界面进行路由器文件管理,首先登陆路由器账户:root,密码:goodlife,(密码输入时没有显示,输入即可),登陆设置如下图:
点击open弹出命令行界面,输入账户,密码,登陆成功后如下图:
(3)安装ser2net软件包
①将软件文件夹下的ser2net_2.10.0-2_ar71xx.ipk软件包通过winSCP上传到路由器/tmp文件夹下(拖拽即可)
然后在PuTTY命令函界面下输入如下命令安装ser2net软件包:
opkg install /tmp/ser2net_2.10.0-2_ar71xx.ipk
②修改ser2net.conf 文件(安装成功后才会出现此设置文件)
在PuTTY命令行输入如下命令查看路由器串口输出名:
上图ttyATH0即为路由器串口输出名,此串口名字用于下面设置。
在winSCP下对路由器etc文件夹下ser2net.conf设置文件进行编辑,找到
2001:raw:600:/dev/ttyS0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS
将ttyS0改为上面查看的串口名ttyATH0(上图为修改过的),保存,可以看到,上位机发送的端口是2001,这就是我们需要发送的端口号,波特率是9600,其他的基本不需要改动 当然 根据自己需要改动………
③设置开机启动
将软件文件夹下的wifiser2net串口开机启动文件通过winSCP上传到路由器/etc/init.d文件夹下(拖拽即可),属性权限改为0777,保存。
接下来打开PuTTY命令行输入如下命令
ln -s /etc/init.d/wifiser2net /etc/rc.d/S80wifiser2net
执行此命令后将在路由器rc.d目录下生成一个链接,启动时系统会按顺序启动rc.d目录下的脚本链接,对应执行init.d目录下的启动脚本。
④重启路由器
命令行输入 reboot 回车即可,至此ser2net软件包已安装完成。
⑤重新登陆路由器网页管理页面,查看软件库->已安装软件包,可查看到ser2net软件包已安装成功。
9. 资料清单
序号 | 内容 |
1 | WiFi无线路由器-PC端软件 |
2 | WiFi无线路由器-安卓APK文件 |
3 | WiFi无线路由器-固件软件包 |
4 | WiFi无线路由器-下位机例程 |
【整体打包】-【U011】如何使用探索者通信模块-WiFi无线路由器-资料附件.zip | 22.42MB | 下载18次 | 下载 |
内部PCB
3.2 黄色外壳版本
黄色外壳版本的接口和白色版本基本一致,可以对照查看。
1. 简介
探索者Zigbee模块使用的是广州致远电子股份有限公司基于NXP JN5168芯片开发的低功耗、高性能型ZM516系列模块,它提供一个完整的基于IEEE802.15.4标准ISM(2.4—2.5GHZ)频段的应用集成方案。支持fastZigbee、ZNET、JenNet-IP、Zigbee-PRO、RF4CE等协议,可快速应用于工业控制,工业数据采集,农业控制,矿区人员定位,智能家居,智能遥控等场合。
2. 参数
额定值:
工作条件:
3. 实物图片与接口
参数 | Min | Max |
电源电压 | -0.3V | 3.6V |
管脚 | -0.3V | VDD+0.3V |
温度范围 | -40℃ | 150℃ |
参数 | Min | Max |
电压 | 2.0V | 3.6V |
温度 | -40℃ | 85℃ |
引脚号 | 引脚名称 | 方向 | 功能 | 描述 |
1 | ADC0 | Input | 模拟输入 | ADC0输入 |
2 | NC | - | 无 | |
3 | ISP | Input | 固件升级使用 | 将该管脚拉低后上电,进入ISP固件升级模式 |
4 | NC | - | 无 | |
5 | NC | - | 无 | |
6 | ADC2 | Input | 模拟输入 | ADC2输入(V1.70及以上固件版本支持) |
7 | ADC3 | Input | 模拟输入 | ADC3输入(V1.70及以上固件版本支持) |
8 | NC | - | 无 | |
9 | NC | - | 无 | |
10 | IO2 | I/O | 数字输入输出 | |
11 | IO3 | I/O | 数字输入输出 | |
12 | TXD | Output | 串口发送 | |
13 | RXD | Input | 串口接收 | |
14 | DEF | Input | 恢复出厂 | 内部上拉、复位或重新上电时,如果该管脚被拉低,模块参数将被重置为出厂默认。 注:如果在使用过程中忘记串口参数或无法获取配置信息,可使用该功能。 |
15 | SLEEP | Input | 休眠 | 下降沿有效(≥1ms),使模块进入休眠状态 注:ZNET固件只有终端设备才能进入休眠 |
16 | STATE | Output | 工作指示灯 | 可外接指示灯,模块工作时500ms闪烁,不使用可悬空。 |
17 | VDD | - | 电源 | |
18 | GND | - | 地 | |
19 | WAKE | Input | 唤醒 | 下降沿有效(≥1ms),使模块进入休眠中唤醒 注:ZNET固件只有终端设备才能进入休眠 |
20 | NC | - | 无 | |
21 | IO4 | I/O | 数字输入输出 | |
22 | RESETN | Input | 复位输入 | 低电平有效 |
23 | IO5 | I/O | 数字输入输出 | |
24 | IO6 | I/O | 数字输入输出 | |
25 | ACK | Output | ACK接受指示 | 初始状态为低电平,收到ACK回复后产生高电平脉冲。 注意:用户MCU可通过检测该管脚判断数据是否已经成功到达目标节点。该管脚输出脉冲时间短,直接驱动LED无明显效果。 |
26 | IO7 | I/O | 数字输入输出 | |
27 | ADC1 | Input | 模拟输入 | ADC1输入 |
实物图 引脚分布图
ZM516X系列无线模块管脚功能说明如下表模块管脚说明所示,以下说明仅针对使用Fastzigbee固件的ZM516X系列模块,如使用本系列模块自行开发其他协议,可直接参考NXP《JN5268-001-MMX》模块数据手册。
模块管脚说明
4. 典型应用
ZM5268模块提供了透明传输数据的功能,通过模块的串口实现用户的无线传输,ZM5168模块模型应用如图所示:
5. FastZigBee组网协议
由于ZigBee无线协议栈的复杂性,以往用户基于Zigbee无线协议栈自行开发时,多缺乏对Zigbee协议栈的审图认识,导致产品开发周期长,开发难度大,且提供用户稳定可靠的实用型协议。
* P2P结构
点对点(P2P)结构是最基本的拓扑结构,可构建两个系统或进程之间的通信链路,该方式节点参数基本固定,只要将两个节点目标互相指向即可实现通信。
、
*星型网络拓扑结构
星形拓扑结构也称主从结构,该拓扑网络属于集中控制型网络,整个网络由中心节点执行集中式通行控制管理,个节点见通信都要通过中心节点。一般由主控制中心不断切换通信目标进行轮询控制。
*中继路由结构
FastZigbee还提供一种极其优越的网络扩展方式,当两节点间距离超出颗童心距离时,只要在两节点间加入路由设备,其他任何网络参数均不需更改,即可恢复通信,该路由方式对工程施工具有重要意义。FastZigbee中继路由结构,为最基础的中继路由拓扑图,且终端可任意切换通信目标,实现任意节点互相通信。
FastZigbee P2P结构
FastZigbee星型网络拓扑结构
FastZigbee中继路由结构
6. Zigbee模块间相互通信
6.1 将ziggbee模块插在bigfish扩展坞上。如图所示:
注意:使用命令前请确认模块运行的固件为Fastzigbee固件,且版本在V1.65以上,固件版本向下兼容,但低于该版本本号的固件,可能存在部分功能无效,确认方法如下:
步骤一:使用ZigbeeCfg配置工具,获取模块目前的固件类型,确认模块固件是否为“FastZigbee”设备(如果出现无法识别,请卸下zigbee模块用arduino下载空程序后在进行配置,此时可能依然无法识别,再点击一次获取固件类型即可)。
步骤二:如果是FastZigbee设备,可跳转至“FastZigBee”标签页,如下,
步骤三确认固件版本是否为V1.66以上,可以从配置工具以下位置进行确认。
6.2 两个模块间相互通讯
(1)把两个模块的串口分别连接在电脑的串口上,对两个模块进行配置,两个模块的目的网络地址分别为配置为对方模块的本地网络地址,两个模块的PANID和通道号必须设置为一直,配置信息如下图:
终端设备1的配置信息
终端设备2的配置信息
(2)配置完成后关闭配置工具,使用串口调试助手打开连接两个模块的串口(IDE上的Serial Monitor)。两个模块即可进行发送数据.如图:
通讯测试
7. 实现Zigbe模块遥控舵机
器材:Zigbee模块、杜邦线、Basra控制板×2、BigFish扩展板×2、miniUSB数据线、7.4V锂电池、直流电机、标准舵机。
设置好两个Zigbee模块终端通信,使用杜邦线将Zigbee模块连接在Bigfish的座坞上,针脚对应关系为:
Zigbee针脚 | Bigfish针脚 |
VCC | 3.3V |
GND | GND |
TX | RX |
RX | TX |
void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: Serial.println(1); delay(5000); Serial.println(2); delay(5000); } |
#include <Servo.h> Servo servo_pin_3; void setup() { // put your setup code here, to run once: pinMode(5,OUTPUT); pinMode(6,OUTPUT); Serial.begin(115200); servo_pin_3.attach(3); pinMode( 3 , OUTPUT); } void loop() { // put your main code here, to run repeatedly: if ((Serial.available())>0) { char inChar =(char) Serial.read(); //inChar = inputString.toInt(); Serial.println(inChar); if (inChar == '1') { digitalWrite(5,LOW); digitalWrite(6,LOW); servo_pin_3.write( 30 ); delay(2000); servo_pin_3.write( 90); delay(2000); } if (inChar == '2') { digitalWrite(5,HIGH); digitalWrite(6,LOW);
} } } |
效果如图所示:
将直流电机接到5、6号端口,标准舵机接到3号端口。
编写以下代码并分别下载到两个主控板内。观察直流电机与标准舵机的现象。
发送端例程(Zigbee_Master.ino):
接收端例程(Zigbee_Slave.ino):
备注:详情参考《ZM516X_ZigBee无线模块用户无线模块用户手册》、《Zigbee_app_tel一分钟实现Zigbee通信》、《Zigbee_app_notes快速实现Zigbee中继通信》。
8. 应用领域
● 无线门禁
● 无线数据通讯
● 安防系统
● 遥控装置
● 遥感勘测
● 智能运动设备
● 工业传感器
9. 注意事项
务必正确连接,否则模块会被烧毁!
10. 资料清单
序号 | 内容 |
1 | Zigbee例程 |
2 | Zigbee软件工具 |
3 | Zigbee应用手册 |
4 | Zigbee原理图库 |
【整体打包】-【U011】如何使用探索者通信模块-Zigbee模块-资料附件.zip | 20.9MB | 下载1次 | 下载 |
Shoal总线舵机模块
Shoal总线舵机驱动可以支持市面上绝大多数的模拟舵机和数字舵机,能够很方便的将多个舵机串联起来,将普通舵机变成总线舵机,使用I2C总线来统一控制。内置的shoal通信协议方便开发者快速的构建舵机的动作序列,极大的简化了机器人的动作调试过程。相比一体化的总线舵机,使用传统舵机加shoal总线舵机驱动的方式使得用户的机构搭建更灵活,成本更低。
l 每个驱动模块支持2个舵机
l 宽范围的电压输入:6V~12V
l 可最多支持127个模块同时串联使用
l 使用2510接口防止用户连线反插
l 1K动作存储空间,最多支持200个动作点或24小时的动作时长
n 总线接口:I2C
n I2C器件地址:0x01
n 芯片:ATMEGA328P
n 主频:16MHz
n SRAM:1kb
n 舵机接口:2
n I2C接口:2
n 接口类型:2510端子座
n 尺寸:40mm*30mm
n 定位孔:ø3mm
n 孔距:30mm
实物图
示意图
【通道切换按键】
短按:切换通道,将当前通道号加1作为新的通道号
长按:将通道复位为1
【通道指示灯】
使用二进制的规则,0~6号的7个led灯的亮灭来表示模块的通道号(channel),亮为1,灭为0。
图例:○led灭 ●led亮
通道指示灯与通道数值对应表
【通道】
在一个系统中,每个总线舵机模块需要一个独立的通道,以区别于系统中其他的总线模块。在使用通信协议控制总线模块时,包含有通道数据的指令只能被相同通道的模块处理,其他通道模块则忽略这个指令。
【动作和动作点】
在文学的语言里,我们描述一个机器人的行为,通常使用拟人或拟物的方式,如行走、前进、休息、转弯等。但当我们进入机器人的世界时,会发现机器人只是一个婴儿,他无法理解这些词语,除非我们更加细致的去解释我们的指令,比如:左边轮子顺时针旋转同时右边轮子逆时针旋转、腿部关节弯曲30度、所有电机停止工作等。
动作是关于机器人的抽象概念,反应了驱动部件(舵机、直流电机、电磁铁、气动等)的一系列输出所构成的机构的某种意义的运动。
动作点是一个动作运行的过程中的特定时刻,驱动部件的输出状态。
用数学的语言来描述的话,动作是一系列动作点的集合。换句话说,如果把动作看成是一个函数,则动作点是在某个时刻关于舵机角度的解。既然动作是关于舵机角度与时间的函数,这意味着我们不需要记录下一个动作中的所有动作点,而只需要有限的动作点及相邻动作点间的函数式即可完整的描述一个动作。
下图是关于动作和动作点的对应关系的示例:
【一组动作和一个动作】
完成机器人某种具体行为所需要构建的若干驱动部件的动作函数称为一组动作,在一组动作中某个特定驱动部件的动作函数称为一个动作。
【通信协议格式】
【字段内容】
分隔符:@ : ;
结束符:\n
通道:0~127。总线舵机模块的通道为1~127,当协议的通道字段为0时,意味着该指令将被所有总线模块执行。
舵机:0或1,对应0/1号舵机
指令:总线舵机模块的控制指令,主要分为act指令(一个动作的构建、运行与清空)和acts指令(一组动作的构建、运行、存储与读取)。使
用acts指令时,servo字段忽略,一般设为0即可。
l act.Add(servoValue,timePoint)
功能:增加用于构建动作的动作点 参数: servoValue - 舵机角度值 timePoint - 舵机角度的对应绝对时间位置 示例:构建5.1中的图示动作 1@1:act.Add(90,0);@ 1@1:act.Add(120,2000);@ 1@1:act.Add(60,3500);@ 1@1:act.Add(90,5000);@ |
功能:清空动作 示例: 1@1:act.Clear();@ |
功能:暂停或运行动作 参数:0为运行,1为暂停 示例: 1@1:act.Pause(0);@ //运行动作 1@1:act.Pause(1);@ //暂停动作 |
功能:设置动作循环次数 参数:最大为99次。若为0则为无限循环 示例: 1@1:act.SetRepeatMode(1);@ |
功能:动作停止运行并复位。 示例: 1@1:act.Reset();@ |
功能:直接控制舵机运转角度,相当于servo.write 参数:舵机运转的角度 示例: 1@1:act.write(90);@ |
功能:清空一组动作 示例: 1@0:acts.Clear();@ |
功能:暂停或运行一组动作 参数:0为运行,1为暂停 示例: 1@0:acts.Pause(0);@ //运行动作 1@0:acts.Pause(1);@ //暂停动作 |
功能:一组动作停止运行并复位。 示例: 1@0:acts.Reset();@ |
功能:设置一组动作的循环次数 参数:最大为99次。若为0则为无限循环 示例: 1@0:acts.SetRepeatMode(1);@ |
功能:保存一组动作 参数:动作组的序号。动作组的保存需要依次进行,先构建并保存第0组动作,再构建并保存第1组动作,然后构建并保存第2组动作,以此类推 示例: 1@0:acts.Save(0);@ |
功能:读取一组动作 参数:动作组的序号。 示例: 1@0:acts.Load(0);@ |
#include <Wire.h> String serialString = ""; boolean serialComplete = false; char stringBuf[100]; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { if (serialComplete) { StringDeal(); } } void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); serialString += inChar; if (inChar == '\n') { serialComplete = true; } } } void StringDeal() { String outString; static int stringlength; //add sum check at the end of string, start with '*' serialString = serialString.substring(0,serialString.length()-1); serialString+="*"; serialString+=serialString.length()-1; serialString+="\n"; stringlength=serialString.length(); //split the string to certain part, each part as 30 char, send parts one by one for(int i=0;i<((stringlength/30)+1);i++){ outString = serialString.substring(0,min(serialString.length(),30)); outString.toCharArray(stringBuf, outString.length()+1); serialString=serialString.substring(min(serialString.length(),30),serialString.length()+1); Wire.beginTransmission(1); Wire.write(stringBuf); Wire.endTransmission(); } serialString = ""; serialComplete = false; } |
#include <Wire.h>
String serialString = ""; boolean serialComplete = false; char stringBuf[100];
void setup() { Wire.begin(); Serial.begin(9600); }
void loop() { if (serialComplete) { StringDeal(); } }
void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); serialString += inChar; if (inChar == '\n') { serialComplete = true; } } }
void StringDeal() { String outString; static int stringlength;
//add sum check at the end of string, start with '*' serialString = serialString.substring(0,serialString.length()-1); serialString+="*"; serialString+=serialString.length()-1; serialString+="\n"; stringlength=serialString.length();
//split the string to certain part, each part as 30 char, send parts one by one for(int i=0;i<((stringlength/30)+1);i++){ outString = serialString.substring(0,min(serialString.length(),30)); outString.toCharArray(stringBuf, outString.length()+1); serialString=serialString.substring(min(serialString.length(),30),serialString.length()+1);
Wire.beginTransmission(1); Wire.write(stringBuf); Wire.endTransmission(); }
serialString = ""; serialComplete = false; } |
//构建一个动作 |
功能:清空存储的所有动作 示例: 1@0:acts.ClearMem();@ |
l act.Clear()
l act.Pause(isPause)
l act.SetRepeatMode(repeatTime)
l act.Reset()
l act.write(servoValue)
l acts.Clear()
l acts.Pause(isPause)
l acts.Reset()
l acts.SetRepeatMode(repeatTime)
l acts.Save(actsNum)
l acts.Load(actsNum)
l act.ClearMem()
通信协议可以便于其他设备控制总线舵机模块,但构建动作的过程通常需要人为的来进行。构建动作的过程实际上是一个不断调试的过程,需要不停的输入大量的协议指令才能完成。为了简化这个过程,特制作了一个简单的上位机软件,封装了通信协议,只用通过简单的拖拉滑块条和点击按钮,即可完成动作的调试、构建和保存。
软件启动后,首先显示出电脑上的所有COM端口,选择控制板的COM口后即可进入动作编辑界面,如下图所示。(注意,控制板的COM口号不能大于9,否则串口无法正常打开)
动作编辑界面如下:
动作编辑界面的分区域功能说明:
l 手动操作区
可以在输入框中输入通信协议,点击Send按钮后将协议指令发给总线舵机模块
l 全局功能区
此功能区发送的指令,通道全部设为0,即此区域的指令将被所有的总线模块执行
l 时间轴
用于输入构建动作时的时间参数
l 舵机功能区
用于控制特定通道总线模块上的0口或1口的舵机,对应着act指令
拖动滑块条可以实时的控制相应端口的舵机运动
l 模块功能区
用于控制特定通道总线模块上的动作,对应着acts指令
l 按钮功能
l 文件功能区
存储、读取和自动运行操作动作
附一个增加了11个总线舵机模块的软件界面:
实验目的:熟悉总线舵机模块的使用。
实验器材:总线舵机模块2个、舵机6个、连接线、控制板、BigFish扩展板、miniUSB数据线、通信转接板、锂电池。
电路连接:
注:
l 将3个总线舵机模块的通道分别设置为1、2、3
l 通信转接板的I2C接口电源跳线应选择VCC
l 舵机连接时请注意顺序,黑线接GND,不要插反
将hostControl.ino下载到控制板,打开电源开关,此时1通道总线模块的0号舵机将开始转动,注意观察转动的规律与setup中发送的协议代码的关系。
源代码如下:
将host.ino下载到控制板,打开电源开关,打开Serial Monitor。
源代码如下:
依次输入下列指令,实现一组动作的编辑:
① 将hostControl.ino下载到控制板,打开文末资料中的..\上位机软件\shoal\Build\shoal.exe,出现端口端口选择界面,选择控制板对应的COM端口(如果COM口大于9,请在设备管理器中设置COM口不要大于9)。
② 如果COM端口正常,进入动作编辑界面。
③ 拖动channel 1的servo0下面的滑块条,观察连接在通道1总线模块0号接口舵机的实时运动。
④ 下面开始为channel 1的servo 0构建一个动作,动作函数如下图所示:
⑤ 点击运行/暂停按钮 、复位按钮 和动作循环按钮 ,观察这个动作的运行情况。
⑥ 重复第④步,为channel 1的servo 1构建一个动作。
⑦ 使用模块功能区的按钮,操作channel 1总线模块的两个舵机。
⑧ 新增2个总线模块的控制区域,为其他的舵机编辑动作,并使用全局功能区的按钮操作所有舵机。
8. 原理图
序号 | 内容 |
1 | 程序源代码 |
2 | 上位机软件 |
3 | ISP驱动 |
【整体打包】-【U011】如何使用探索者通信模块-Shoal总线舵机模块-资料附件.zip | 23.53MB | 下载0次 | 下载 |