如何使蓝牙模块协议适用airsync协议

手把手教你做蓝牙小车(三)
第6节 马达
要说蓝牙小车哪个模块最重要,多数人一定会以为是马达。
之前说过,为了防止开发板被电流击穿,控制马达时要增加一块扩展板。
所以,控制马达,只对扩展板,而不需要对马达编程。
此外,扩展板厂家会提供通过扩展板控制马达的代码。
综上,对开发人员来说,马达,只要确认存在就可以了。
6.1 扩展板
Arduino开发板只提供了一些基础、通用的接口,针对一些常见的特殊功能,Arduino专门为其推出了扩展板。
6.1.1 官方扩展板
Arduino官方目前总共推出了5款扩展板。
其中的Arduino Motor Shield就是专为马达设计的扩展板。
6.1.2 第三方扩展板
Arduino是开放平台,所以有不少第三方设计者为Arduino设计扩展板。
我们今天要使用的是下面这款双L293D芯片的马达扩展板。
作为一个软件程序员,我们只需要知道L293D是一种&H桥电机驱动器&就足够了。
如果你还有更多好奇心,可以参看L293D的文件
之所以选择这块马达扩展板,而没有选择官方推出的扩展板。
一个原因是这块扩展板有两个L293D,它支持同时控制四个车轮。四轮驱动,好牛X的感觉:)
另一个原因是这个开发板便宜。
6.2 马达和车轮
马达采用比较常见的这种
车轮只要能和马达匹配就行
因为不会针对这两个设备编程,所以没有太多要求。
6.3 代码分析
厂家提供了一些扩展板相关的代码,我把相关的三个文件打包放在方便大家。
6.3.1 扩展板库文件
下载解压后,打开MotorTest目录,可以看到三个文件。
AFMotor.cpp,AFMotor.h是扩展板的库文件。
Arduino有两种方法使用库文件。
第一种方法是把它们加入Arduino库文件目录中。
把库文件打成zip包,直接打包文件或放在目录下打包都可以。
选择&菜单 项目-&加载库-&添加一个.ZIP库&,文件就被加到了&c:\Users\UserName\Documents\Arduino\libraries\&目录。
所以你也可以直接拷贝这两个文件到以上目录下。
第二种方法是把这两个文件和使用他们的ino文件放在一起。
使用时根据相对路径调用库文件。
所有arduino模块,厂家都会提供库文件,这个库文件相当于sdk。
大多数时候,我们不需要了解它的详细实现过程,只要知道它提供哪些接口,怎么使用就可以了。
6.3.2 扩展板测试程序
MotorTest.ino是这款马达扩展板的演示程序。
我们需要详细了解这个文件。
6.3.2.1 引用头文件
如果你没把AFMotor.h放在arduino库文件目录下,这里要改成&&引用头文件。
6.3.2.2 生成马达对象
从这张图中可以看到,这款开发板可以控制的四个马达,接口分别被标注为M1、M2、M3、M4。
AF_DCMotor motor(4);
生成一个控制M4号马达的对象。
6.3.2.3 设置马达速度
motor.setSpeed(200);
从函数名判断是设置马达的速度,代码理解到这个程度就足够了。
当然,如果你非常有好奇心,我还是有必要满足一下。
看看setSpeed函数的实现:
void AF_DCMotor::setSpeed(uint8_t speed) {
switch (motornum) {
setPWM1(speed);
setPWM2(speed);
setPWM3(speed);
setPWM4(speed);
我们传入的参数是200,即speed=200。
初始化AF_DCMotor对象时,指定了M4号马达,此处的motornum等于4。
setSpeed最终执行的是case 4: setPWM4(200);。
再看看setPWM4函数的实现:
inline void setPWM4(uint8_t s) {
#if defined(__AVR_ATmega8__) || \
defined(__AVR_ATmega48__) || \
defined(__AVR_ATmega88__) || \
defined(__AVR_ATmega168__) || \
defined(__AVR_ATmega328P__)
// use PWM from timer0A on PB3 (Arduino pin #6)
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// on arduino mega, pin 6 is now PH3 (OC4A)
#elif defined(__PIC32MX__)
// Set the OC2 (pin 5) PMW duty cycle from 0 to 255
#error &This chip is not supported!&
我手头这块Mega板对应的宏定义是__AVR_ATmega2560__,即执行了代码OCR3A =。
你如果不确定哪个宏定义对应你的开发板,可以用这个方法。
每一个#if下都胡乱写一些代码,不相同即可。
inline void setPWM4(uint8_t s) {
#if defined(__AVR_ATmega8__) || \
defined(__AVR_ATmega48__) || \
defined(__AVR_ATmega88__) || \
defined(__AVR_ATmega168__) || \
defined(__AVR_ATmega328P__)
// use PWM from timer0A on PB3 (Arduino pin #6)
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// on arduino mega, pin 6 is now PH3 (OC4A)
#elif defined(__PIC32MX__)
// Set the OC2 (pin 5) PMW duty cycle from 0 to 255
#error &This chip is not supported!&
编译一下,编译器会告诉你某行代码出错了。我这里提示def出错了。
我就确定我的开发板对应的是__AVR_ATmega1280__或defined(__AVR_ATmega2560__。
OCR3A = s这行代码做了什么?简单说,就是告诉Arduino,输出电压按时间分成255份,s份输出1,其他的输出0。
OCR3A = 200就是200份输出1,55份输出0。整体看,Arduino就输出了一个5(v)*200/255~=4(v)的电压。
还不满意我这个解释?
那就自己学习和两篇文档。
6.3.2.4 马达初始状态设置为停止
motor.run(RELEASE);
先看看RELEASE的定义,在AFMotor.h中一共定义了四条命令。
// Constants that the user passes in to the motor calls
#define FORWARD
#define BACKWARD 2
#define BRAKE
#define RELEASE
接着分析run函数的实现,先看函数的后半段。
void AF_DCMotor::run(uint8_t cmd) {
switch (cmd) {
case FORWARD:
latch_state |= _BV(a);
latch_state &= ~_BV(b);
MC.latch_tx();
case BACKWARD:
latch_state &= ~_BV(a);
latch_state |= _BV(b);
MC.latch_tx();
case RELEASE:
latch_state &= ~_BV(a);
// A and B both low
latch_state &= ~_BV(b);
MC.latch_tx();
先看看_BV是个啥东东。
#define _BV(bit) (1 && (bit)),作用就是把1左移bit位。
我们继续分析刚才发出的RELEASE命令,
latch_state &= ~_BV(a);,把latch_state的第a位清零。
latch_state &= ~_BV(b);,把latch_state的第b位清零。
MC.latch_tx();调用AFMotorController类latch_tx函数。
回过头再分析run函数的前半段
void AF_DCMotor::run(uint8_t cmd) {
uint8_t a,
switch (motornum) {
a = MOTOR1_A; b = MOTOR1_B;
a = MOTOR2_A; b = MOTOR2_B;
a = MOTOR3_A; b = MOTOR3_B;
a = MOTOR4_A; b = MOTOR4_B;
继续查看MOTOR1_A的定义
#define MOTOR1_A 2
#define MOTOR1_B 3
#define MOTOR2_A 1
#define MOTOR2_B 4
#define MOTOR4_A 0
#define MOTOR4_B 6
#define MOTOR3_A 5
#define MOTOR3_B 7
结合这个定义,我们可以得出结论:
latch_state变量的2,3位对应MOTOR1,也就是扩展板上看到的M1。
1,4位对应M2,
5,7位对应M3,
0,6位对应M4。
继续分析latch_tx函数
void AFMotorController::latch_tx(void) {
//LATCH_PORT &= ~_BV(LATCH);
digitalWrite(MOTORLATCH, LOW);
//SER_PORT &= ~_BV(SER);
digitalWrite(MOTORDATA, LOW);
for (i = 0; i & 8; i++) {
//CLK_PORT &= ~_BV(CLK);
digitalWrite(MOTORCLK, LOW);
if (latch_state & _BV(7 - i)) {
//SER_PORT |= _BV(SER);
digitalWrite(MOTORDATA, HIGH);
//SER_PORT &= ~_BV(SER);
digitalWrite(MOTORDATA, LOW);
//CLK_PORT |= _BV(CLK);
digitalWrite(MOTORCLK, HIGH);
//LATCH_PORT |= _BV(LATCH);
digitalWrite(MOTORLATCH, HIGH);
这段代码根据latch_state各个位的状态开或关MOTORDATA引脚。
如果不详细学习这个硬件知识,完全搞不懂这是在做什么。
目前只要知道通过这些操作,马达是可以被有效控制的就足够了。
6.3.2.5 马达前进
motor.run(FORWARD);
for (i = 0; i & 255; i++) {
motor.setSpeed(i);
delay(10);
for (i = 255; i != 0; i--) {
motor.setSpeed(i);
delay(10);
经过刚才的分析,这一块的代码就很简单了。
motor.run(FORWARD)让车轮向前转
第一个for循环i逐渐变大,motor.setSpeed(i)使车轮速度越来越快。
第一个for循环i逐渐减小,motor.setSpeed(i)使车轮速度越来越慢到最后停止。
6.3.2.6 马达后退
motor.run(BACKWARD);
for (i = 0; i & 255; i++) {
motor.setSpeed(i);
delay(10);
for (i = 255; i != 0; i--) {
motor.setSpeed(i);
delay(10);
其他代码比较简单,就不再分析了。
6.4 连接模块
蓝牙模块还是5.2节的连接方法。
这里要注意扩展板和Mega的连接方式。扩展板没有Pin脚的这头和Mega没有Pin脚的这头放一边,扩展板0 Pin脚和Mege 0 Pin脚重合,图中黄线所示。
上传程序到开发板,可以观察到马达先向前转,速度从慢到快,又从快到慢。
接着马达向后转,速度从慢到快,又从快到慢。蓝牙Airsync协议开发与介绍-技术分享-温州忆初科技有限公司
蓝牙Airsync协议开发与介绍
  该文档规范了蓝牙设备和手机上的微信的通信协议
  协议支持经典蓝牙和4.0 BLE蓝牙,目前支持ios和andriod两个系统,后续会扩展到其他系统。
  整体架构
  厂商服务器和外设,由厂商开发完成。
  微信会提供服务器的接口以对接厂商的服务器,会提供手机的接口(如本文规定的蓝牙协议)以对接厂商的外设。
  主要功能
  该协议打通了设备和厂商服务器之间的数据链路,也就是支持将设备上的数据发送到厂商的服务器上,也支持将厂商的数据发送到设备。
  厂商的数据对于微信来说,是黑盒,微信不对设备数据做分析。
  该协议也打通了设备和微信服务器之间的数据链路。
  设备和微信服务器之间的数据格式由微信规定,例如登录,新消息通知等。
  蓝牙BLE模拟成流
  微信支持蓝牙BLE。
  微信规定了蓝牙BLE设备需要先模拟成流(即stream,输入输出流)。经典蓝牙的RFCOMM,就是一个流。流具有的特性有:
  a. 可以传输无限长度的数据
  b. 双工,读写可以并发,互不干扰。
  显然,蓝牙BLE无法传输无限长度的数据,为了实现这个目的,需要定义一个规范。
  蓝牙设备需暴露两个特征值(Characteristics):Write特征值,Indication特征值。蓝牙设备从Write特征值接受数据,从Indication特征值发送数据。
  Indication特征值类型是bytes。
  这里我们约定,把一个特征值一次传输的数据,称为一帧(不同类型的特征值一次传输的数据长度是不一样的)。
  注意:应用层上的数据包(例如1k大小),会分散成许多帧来传输。
  蓝牙设备写过程:
分帧:假设蓝牙手环上有1k数据,要发给手机微信。由于一个特征值长度有限(如20个字节),显然需要分多次才能传输完成。1k数据,要分成1024字节/
20字节=51 个帧。剩下的4个字节,不足一帧(20个字节),需补齐为一帧并对剩下的16个字节赋0。总共是52帧。
  2. 发送第一个帧:把第一个帧的内容放入特征值里面。然后通知手机读取数据,通知有两种方式,Indication
和notify,这里使用Indication方式,即带响应的通知。当通知完成的时候,可以认为手机已经读完数据。这就完成了发送第一个帧。
  3. 按照2的步骤,依次发送剩下的帧。
  蓝牙设备读过程:
  当蓝牙设备发现读特征值收到数据的时候,就接收数据,并追加到设备的buf里。
  注意:蓝牙设备必须等微信app订阅了Characteristics之后,才能indicate数据,否者会造成设备发送数据丢失的问题。
&&&&& 本文由&- 温州忆初科技发布,转载需要注明:作者:airMAX - airSync -协议问题
AirSync的好处是什么?在多个无线设备并置在一起时,airSync可以减少问题。在一个无线设备接收时,它以最高的信噪比(SNR)工作。如果在第一个设备接收时一个附近的无线设备也在发送,那么第一个设备的信噪比就会低很多,因为在高信号强度工作时附近无线设备发送的数据会被收到。在AirSync启用时,所有的AP将在同一时间发送并在同一时间接收,AirSync能减少相互干扰。
AP如何知道同时同步?带airSync功能的AP配置了一定的发送和接收时隙(时间量)。所有AP将从GPS卫星获得非常准确的定时,并基于该定时与上述配置的时隙,就会知道何时应该发送以及何时应接收。
AP如何获得同步/定时信息?在airSync中配置一个AP为主,其余为从。在从无线设备中输入主设备的IP地址。当从无线设备启动时,它们将联系主无线设备,并获取同步时隙定时信息。
AP之间需要第二层通信吗?不需要,只要该设备可以在第三层(UDP)进行通信,airSync就会工作(换句话说,只要你可以从从AP ping通主AP)。
AirSync为什么可以克服多站同址干扰?
为了加大网络的容量或是提高覆盖范围,通常会考虑增加更多的基站AP,或者通过多基站和扇区天线实现相对集中的覆盖。但是,在同一个站址安装多个AP可会造成互相之间的干扰,被称为同址干扰(co-location interference)。对于无线通信,同址干扰对通信系统的主要影响有两个方面。首先是“远近效应”会造成RF接收信号抑制或者灵敏度降低甚至阻塞,即便是两个频率完全不同的基站,因为工作频率十分接近,近距离基站发出的强信号直接进入相邻基站的接收机,淹没了从远距离传输过来的其他基站和客户端微弱信号,造成接收机放大电路工作阻塞或解调失效。其次是两个同址基站以相同频率发射,如果发射过程存在时间上的混叠,或先后次序小于一个数据帧长度,在接收端收到的信号实际上可能造成了事实上的碰撞或者冲突。同址干扰造成的困扰,一般通过系统同步发射技术来解决,即每个发射机使用统一的定时来实现载波或数据帧同时发送,使接收端看起来像是一个基站发出的信号。
为什么AirSync要使用GPS?
airSync需要GPS的原因是为了提高系统同步发射的定时精度,GPS输出的NEMA 0183导航报文具有非常高的定时精度,误差通常小于几纳秒。如果采用IP网络自身的报文(UDP)来控制同步,可能存在很大的风险。因为考虑到不同设备的硬件配置和软件处理能力及版本等存在差异,这种微小的差异可能会导致在系统上产生接近毫秒级的误差,这种接近报文长度的误差几乎是不可容忍的。
为什么AirSync同步发射技术可以增加用户容量总数?
同址多站一般用于提高系统容量和增加覆盖范围。特别是当使用airMAX扇区天线进行密集覆盖,或多个基站需要频率复用却受到限制时,采用同址多站是效费比较高的方法之一。airSync同步发射技术就是解决同频同址多站收发同步的问题,使多个基站看起来就像一个基站一样。但是这些基站却在不同扇区天线覆盖面上工作,当然,用户的容量也会随之增加N倍。
采用airSync同步发射技术以后带来airMAX的一些性能变化:
1)采用GPS同步,所有AP和客户端站点同时收发,有效避免了同址干扰。
2)存在一个相对较小的系统延时(8-16ms左右,因为处理GPS报文信息和消息同步)。
3)稳定的吞吐量(时隙和方向都是固定的),上下行单方向上的吞吐量峰值是理论峰值的一半,但是这一吞吐量不随网络规模的变化而变化。
4)收发定时间隔对不同尺寸的TCP数据包影响不同。一般较小的时间间隔对小的TCP包具有较好的性能,但对大尺寸的复用TCP包会受到影响,降低性能。反之,采用较大的时间间隔对大数据流的TCP或UDP应用极为有利,如视频多媒体等应用。
5)具有固定的、最小的网络延迟特性,取决于收发定时间隔的大小。
6)网络总的吞吐量与AP的个数呈线性的比例关系。
附件PDF仅供参考
17:47 上传
点击文件名下载附件
19.28 KB, 下载次数: 6
17:47 上传
点击文件名下载附件
49.2 KB, 下载次数: 28
width:100%">
优倍快网络技术咨询(上海)有限公司
.cn All Rights Reserved.本站发布的所有内容,未经许可,不得转载.君,已阅读到文档的结尾了呢~~
介绍用蓝牙模块实现与微信的对接沟通。
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
蓝牙模块在微信里怎么应用的
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口君,已阅读到文档的结尾了呢~~
这篇主要针对蓝牙模块的单模双模经典这三种蓝牙模块分类做一个描述讲解,方便大家来做区分选择。还有不理解的可以致电
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
如何正确选择蓝牙模块
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 airsync协议 的文章

 

随机推荐