如何用EV3做坦克

分享给朋友:通用代码: <input id="link4" type="text" class="form_input form_input_s" value="" />复 制自己用EV3 MOC的坦克下载至电脑扫码用手机看用或微信扫码在手机上继续观看二维码2小时内有效自己用EV3 MOC的坦克扫码用手机继续看用或微信扫码在手机上继续观看二维码2小时内有效,扫码后可分享给好友没有优酷APP?立即下载请根据您的设备选择下载版本
药品服务许可证(京)-经营- 请使用者仔细阅读优酷、、、Copyright(C)2017 优酷
版权所有不良信息举报电话:【iOS与EV3混合机器人编程系列之六】iOS_WiFi_EV3_Library 剖析之发送命令给EV3 - CSDN博客
【iOS与EV3混合机器人编程系列之六】iOS_WiFi_EV3_Library 剖析之发送命令给EV3
在上一篇文章中,我们已经知道了如何通过WiFi将iOS设备和EV3连接起来,那么下一步的工作就是从iOS设备中发送命令给EV3并接收EV3返回的数据。这也是本篇文章将告诉大家的。首先要明确的一点是本开源代码库只封装了EV3直接命令(Direct Command),也就是无需在EV3上开发任何程序就能使用这些命令对EV3进行控制。目前库中的API包含以下这些:#pragma mark - EV3 Direct Command// Scan or stop scan each port sensor condition and data on the ev3 brick// 检测每个端口的数据- (void)scanP- (void)stopS// 清除所有命令- (void)clearC#pragma mark - Motor Control Methods// turn motor power at specified port and power// 控制电机运转在特定的端口和特定的功率- (void)turnMotorAtPort:(EV3OutputPort)port power:(int)// 控制电机运转在特定的端口和特定的功率及特定的运转时间- (void)turnMotorAtPort:(EV3OutputPort)port power:(int)power time:(NSTimeInterval)// 控制电机运转在特定的端口和特定的功率及特定的转动角度- (void)turnMotorAtPort:(EV3OutputPort)port power:(int)power degrees:(UInt32)// 控制电机停止在特定的端口- (void)stopMotorAtPort:(EV3OutputPort)#pragma mark -& Sound Control Methods// 播放音调在特定的音量特定的频率和特定的播放时间- (void)playToneAtVolume:(int)volume frequency:(UInt16)frequency duration:(UInt16)// 播放音乐在特定的音量特定的文件及是否重复- (void)playSoundAtVolume:(int)volume filename:(NSString *)filename repeat:(BOOL)// 停止播放音乐- (void)playSoundB#pragma mark - Image Control Methods// 在EV3的显示屏上画图- (void)drawImageAtColor:(EV3ScreenColor)color x:(UInt16)x y:(UInt16)y filename:(NSString *)// 在EV3的显示屏上显示文字- (void)drawText:(NSString *)text color:(EV3ScreenColor)color x:(UInt16)x y:(UInt16)y;// 在EV3的显示屏上画特定大小的窗口- (void)drawFillWindowAtColor:(EV3ScreenColor)color y0:(UInt16)y0 y1:(UInt16)y1;最重要的两部分就是读取端口数据以及控制电机转动,至于后面的声音和显示两部分不是特别重要,可以用iPhone取代。那么,问题来了:如何创建并发送一个命令呢?有以下几个步骤:Step 1:根据直接命令协议创建特定命令的二进制数据Step 2:将命令转化为特定的数据格式NSDataStep 3:通过TCP socket将命令数据发送出去。下面我们就StepByStep地剖析实现它!== Step1:创建直接命令 ==这部分内容主要都在库中的EV3DirectCommand.m中实现。为了让大家理解,我们先来了解一下EV3的直接命令协议!首先还是摘录一下Direct Command的协议说明。这里完全EV3的源代码中的c_com.h文件中复制。关于EV3的源代码,大家可以在GitHub上下载,其网址为:Beside running user programs the VM is able to execute direct commands from the Communication Module.& In fact direct commands are small programs that consists of regular byte codes and they are executed& in parallel with a running user program.\n& Special care MUST be taken when writing direct commands because the decision until now is NOT to& restrict the use of &dangerous& codes and constructions (loops in a direct command are allowed).& If a new direct command from the same source is going to be executed an actual running direct command is terminated.& Because of a small header objects are limited to one VMTHREAD only - SUBCALLs and BLOCKs is of& course not possible.\n& This header contains information about number of global variables (for response), number of local variables& and command size.& Direct commands that has data response can place the data in the global variable space. The global& variable space is equal to the communication response buffer. The composition of the direct command& defines at which offset the result is placed (global variable 0 is placed at offset 0 in the buffer).& Offset in the response buffer (global variables) must be aligned (float/32bits first and 8 bits last).Direct Command Bytes:& ,------,------,------,------,------,------,------,------,& |Byte 0|Byte 1|Byte 2|Byte 3|Byte 4|Byte 5|& & & |Byte n|& '------'------'------'------'------'------'------'------'& Byte 0 – 1: Command size, Little Endian\n& Byte 2 – 3: Message counter, Little Endian\n& Byte 4: & & Command type. see following defines & */& #define & & DIRECT_COMMAND_REPLY& & & & &&0x00& &&//& Direct command, reply required& #define & & DIRECT_COMMAND_NO_REPLY & & &&0x80& &&//& Direct command, reply not required& & & & & & & & & & & & & & & & & & & & & & & & & &&/*& Byte 5 - 6: Number of global and local variables (compressed).&& & & & & & & Byte 6& & Byte 5& & & & & & & 543210& & & & & & & --------& --------& & & & & & & llllllgg& gggggggg& & & & & & & & & & gg& gggggggg& Global variables [0..MAX_COMMAND_GLOBALS]& & & & & & & llllll& & & & & & & Local variables& [0..MAX_COMMAND_LOCALS]& Byte 7 - n: Byte codes& Direct Command Response Bytes:& ,------,------,------,------,------,------,------,------,& |Byte 0|Byte 1|Byte 2|Byte 3|& & & |& & & |& & & |Byte n|& '------'------'------'------'------'------'------'------'& Byte 0 – 1: Reply size, Little Endian\n& Byte 2 – 3: Message counter, Little Endian\n& Byte 4: & & Reply type. see following defines & & */& #define & & DIRECT_REPLY& & & & & & & & &&0x02& &&//& Direct command reply& #define & & DIRECT_REPLY_ERROR& & & & & &&0x04& &&//& Direct command reply error& & & & & & & & & & & & & & & & & & & & & & & & & &&/*& Byte 5 - n: Response buffer (global variable values)以上这些就是Direct Command的协议!简单解释一下Direct Command就是前缀加上具体命令!所以搞清楚各种控制命令的格式是非常重要的!比如我们要控制EV3的电机,还得需要知道控制电机的命令及组成方式!更进一步地我们需要知道所有可以用的命令的格式!从python-ev3.org 这个网站我们可以找到这些命令的格式!当然从EV3的源代码也是可以找到的!在c_output.h文件中可以看到!那么下面我们举一个最直接的例子来看看命令的二进制数据是怎么样的,这样大家就可以有一个直观的认识了。== 举例:控制端口PortA的电机以功率50转动 ==EV3中控制电机的命令主要有以下三个:opOUTPUT_POWER(LAYER,NOS,SPEED) &// 设置电机的输出Set power of the outputsDispatch status unchangedParameters:&& & (DATA8)LAYER - Chain layer number[0..3]&& & (DATA8)NOS - Output bit field[0x00..0x0F] output 1 to 4 (0x01, 0x02, 0x04, 0x08)&& & (DATA8)POWER - Power[-100..100]opOUTPUT_START(LAYER,NOS) &// 启动电机&& & Starts the outputs&& & Dispatch status unchanged&& & Parameters:&& & (DATA8)LAYER - Chain Layer number[0..3]& & &(DATA8)NOS&&-&&Output bit field[0x00..0x0F]& &&opOUTPUT_STOP(LAYER,NOS) &// 停止电机&& & Stop the outputs&& & Dispatch status unchanged&& & Parameters:&& & (DATA8)LAYER - Chain layer number[0..3]&& & (DATA8)NOS - Output bit field[0x00,0x0F]& & &(DATA8)BRAKE - Brake[0,1]&经过研究,上面的DATA8格式其实就是unsigned char格式!可以说有了这三个命令我们就能控制电机了。要实现这个功能需要两个命令,一个是确定端口的输出,一个是启动输出。如果要用伪代码的形式表示就是:opOUTPUT_POWER(0x00,PortA,50)opOUTPUT_START(0x00,PortA)先贴上这整个命令的二进制数据如下: 0
a6 什么意思?Byte 0,1: 0x1100& 表示命令的长度,这里是小端对齐,所以其大小为0x0011,记住这边是16进制,所以0x0011大小为17,也就是说除了Byte0,1之外其他Byte也就是命令内容的长度为17Byte。理解了吗?大家可以数数看,是不是整个命令长度19Byte,扣除前两位,则命令内容为17Byte。Byte 2,3: 0x0000 表示消息计数。这个的作用是什么呢?主要是为了分清楚接收的消息是对应发出的哪一个消息(命令)。举例说如果这里消息计数是1,那么返回的消息的消息计数也是1,这样就可以实现一一对应。在我们这边的应用中,我们不需要考虑对应问题,所以消息计数设置为0000就可以了。Byte 4:0x80 命令类型(回复或者不回复)如果是0x00,则EV3接收到命令后要做出回复,如果是0x80,那么就不回复,这里我们因为是控制电机,无需返回数据,所以设置成0x80。Byte 5,6 :0x0000 公共变量和私有变量的数量这个在上面的协议中有解释,主要是用于确定返回数据的位置。那么这边我们无需返回任何数据,也就是无需任何变量,所以设置为0x0000。接下来的Byte都是具体命令了。每个命令都有专门的命令码,如下:&&opOUTPUT_STOP & & & & & & & =&0xA3,&// & & 00011& opOUTPUT_POWER& & & & & & & =&0xA4,&// & & 00100& opOUTPUT_START& & & & & & & =&0xA6,&// & & 00110&详见源代码中的bytecodes.h这个文件接下来就是如何添加参数?每个参数之前要先添加参数的长度!typedef enum {& & EV3ParameterSizeByte = 0x81,& & & & // 1 byte& & EV3ParameterSizeInt16 = 0x82, & & & // 2 bytes& & EV3ParameterSizeInt32 = 0x83,& & & // 4 bytes& & EV3ParameterSizeString = 0x84& & & // null-terminated string}EV3ParameterS不同长度的参数前面要添加的size参数不一样!也就是说比如我这边要添加power参数,那么之前就要先添加一个size参数,由于power参数是1 byte,所以添加0x81!那么我们再回来看二进制数据:Byte 7:0xa4 opOUTPUT_POWER的命令码Byte 8,9,10,11,12,13: 0x32 opOUTPUT_POWER对应的三个参数,0x8100表示layer,其值为0,0x8101表示port,其值01为PortA,0x8132表示功率,其值为0x32 = 50.Byte 14:0xa6& opOUTPUT_START的命令码Byte 15,16,17,18:0x opOUTPUT_START对应的两个参数,0x8100表示layer,其值为0,0x8101表示port,其值01为PortA。我们的代码库就是要将这些二进制数据创建起来,具体的实现涉及大量的二进制移位操作,大家可以自己查看文件进行分析,这里不再细说。这个功能对应的API是+ (NSData *)turnMotorAtPort:(EV3OutputPort)port power:(int)power{& & EV3DirectCommander *command = [[EV3DirectCommander alloc] initWithCommandType:EV3CommandTypeDirectNoReply globalSize:0 localSize:0];& & [command addOperationCode:EV3OperationOutputPower];& & [command addParameterWithInt8:0];& & [command addParameterWithInt8:port];& & if (abs(power) & 100) {& & & & [command addParameterWithInt8:100];& & } else {& & & & [command addParameterWithInt8:(Byte)power];& & }&& && & [command addOperationCode:EV3OperationOutputStart];& & [command addParameterWithInt8:0];& & [command addParameterWithInt8:port];&& &&& && & return [command assembledCommandData];}具体实现时就是编写如下的代码:[self turnMotorAtPort:EV3OutputPortA power:50];可以说其他的命令组成方法道理都是一样的。大家可以自己分析一下获取传感器数据的命令是如何组成的。== Step 2:转换为NSData数据 ==这里在EV3DirectComand.m文件通过一个方法实现:[NSData dataWithBytes:buffer length:cursor];仅仅是格式转换,大家即使不理解也没有关系。== Step 3:发送命令 ==这个工作在EV3Device.m文件中实现,也很简单。下面是控制电机的发送命令代码:- (void)turnMotorAtPort:(EV3OutputPort)port power:(int)power{// 封装命令数据& & NSData *data = [EV3DirectCommander turnMotorAtPort:port power:power];// 发送命令& & [self.tcpSocket writeData:data withTimeout:-1 tag:MESSAGE_NO_REPLY];}大家看了源代码应该就可以明白。这里不再多讲。对于TCP方面不了解的童鞋请查看之前的文章。好啦,关于如何创建并发送Direct Command命令就介绍到这里。可以说,如果大家理解到这里,那么对整个库的编写也就基本理解了。之后我们就不再讲解这个代码库的问题了。我们将开始一个真正的项目:用iOS来体感控制EV3 坦克!大家准备好了吗?敬请期待下一篇文章!【本文为原创文章,版权所有,转载请注明出处!& 谢谢!】
本文已收录于以下专栏:
相关文章推荐
在上一篇文章中,我们论述了iOS与EV3结合后机器人开发的无限可能,那么,大家要不要一起来Hacking一把呢?为了能够完整地完成我接下来我讲的项目,我们需要做以下准备:1、一台Mac运行MAC OS...
在上一篇文章中,我们通过编写EV3 Port Viewer项目实现了iOS监测EV3的实时端口数据。程序最核心的部分就是我们的开源代码库iOS_WiFi_EV3_Library。那么,在本文中,我们将...
在上一篇文章中,我们讲解了如何用开源代码库CocoaAsyncSocket来实现iOS上的UDP和TCP数据通信。那么在本文中,我们将介绍在CocoaAsyncSocket的基础如何使用UDP和TCP...
在这个系列之前的博客中,我研究觉得在iOS未越狱的情况下,无法使用蓝牙来控制EV3,编写类似Commander的程序。但,最近和网友的研究发现,通过External Accessory 来实现蓝牙的传...
在上次的资料收集中,我们已经找到了EV3的蓝牙通信协议。
按照之前的设想,只要能够通过蓝牙将iPhone与EV3连接,那么根据协议就有望实现对EV3的控制。
但今天发现事情并没有想像的简单。
...
在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个基本的设想,并且介绍了要完成项目所需的软硬件准备和知识准备。那么在今天这一篇文章中,我们将直接真正开始项目实践。==第一个项目: EV3 Po...
在上一篇文章中,我们已经分析了iOS通过BTstack这个第三方库连接外部蓝牙设备的方法,也就是可以连接EV3了。
那么,在连接成功之后,我们要做的关键就是给EV3发它可以识别的信息。这...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)您的访问出错了(404错误)
很抱歉,您要访问的页面不存在。
1、请检查您输入的地址是否正确。
2、感谢您使用本站,通过
进行查找。
3、使用搜索框直接进行搜索更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
, 可在设置中重新打开噢!
30秒后自动关闭
乐高ev3机器人坦克进攻">乐高ev3机器人坦克进攻
请选择打赏金额:
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
本奖品由提供
红包雨下完了,下次早点来噢~分享给朋友:通用代码: <input id="link4" type="text" class="form_input form_input_s" value="" />复 制乐高机器人EV3--坦克下载至电脑扫码用手机看用或微信扫码在手机上继续观看二维码2小时内有效乐高机器人EV3--坦克扫码用手机继续看用或微信扫码在手机上继续观看二维码2小时内有效,扫码后可分享给好友没有优酷APP?立即下载请根据您的设备选择下载版本
药品服务许可证(京)-经营- 请使用者仔细阅读优酷、、、Copyright(C)2017 优酷
版权所有不良信息举报电话:

我要回帖

 

随机推荐