找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 10722|回复: 9

【ai2与ev3】第6课Direct Command

[复制链接]
发表于 2015-2-23 21:50:31 | 显示全部楼层 |阅读模式
本节课内容是使用direct command来实现第4课中的小车移动,direct command也就是无需ev3端的编程,直接使用ai2中手机端的编程来控制ev3机器人。关于电机的命令传说是在c_com.h,也有说有bug,根据测试,启动电机格式如下:13-0-0-0-128-0-0-165-0-3-129-30-166-0-3,其中的变量为端口和速度,端口3是D电机,即第10位和第15位,速度是30,即第12位,ai2中构造自定义程式如下:端口8是A电机,端口9表示A+D电机一起启动。
搜狗截图15年02月23日2133_1.png
左转时需要将两个电机方向相反。
搜狗截图15年02月23日2146_3.png
电机停止的格式为9-0-0-0-128-0-0-163-0-3-0,第10位端口参数
搜狗截图15年02月23日2133_2.png

通过以上的模块编辑,无需在ev3编程即可实现小车移动。

6.zip

1.5 MB, 下载次数: 116

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2015-2-23 23:58:56 | 显示全部楼层
以下是LEGO MINDSTORMS NXT Direct commands 命令列表,还没有试过能不能在EV3中使用


每个有效命令的细节内容将会在下面列表中被描述。
格式说明:
 所有的返回包都包含一个状态字节,0x00代表成功,任何非零值指明了具体的错误状态。
 所有单字节值都是无符号的,除非有特别的规定。对于多字节值得内部数据类型需要被列出,在乐高NXT通信协议中,都将他们假定为低位优先的字节顺序。
 如果在这里没有明确规定一个合法的范围,那么它通常会记录在相关的模块文档中或代码中。
 可变长包字段可以指定为:“Byte 4 – N:消息数据”,N为可变长字段的大小加命令头的大小。N不能超过上面提到的最大命令长度减一。
启动程序
Byte 0:0x00 or 0x80
Byte 1:0x00
Byte 2 – 21:文件名。格式为ASCIIZ字符串,最大长度为15.3chars再加一个Null终结符。
返回包:
Byte 0:0x02
Byte 1:0x00
Byte 2:状态字节
停止程序
Byte 0:0x00 or 0x80
Byte 1:0x01
返回包:
Byte 0:0x02
Byte 1:0x01
Byte 2:状态字节
播放声音文件
Byte 0:0x00 or 0x80
Byte 1:0x02
Byte 2:是否循环?(Boolean,TRUE:无限循环播放声音文件;FALSE:只播放一次)
Byte 3 – 22:文件名。格式为ASCIIZ字符串,最大长度为15.3chars再加一个Null终结符。
返回包:
Byte 0:0x02
Byte 1:0x02
Byte 2:状态字节
播放音调
Byte 0:0x00 or 0x80
Byte 1:0x03
Byte 2 – 3:音调频率,Hz(UWORD,范围:200 – 14000Hz)
Byte 4 – 5:持续时长,ms(UWORD,范围:???)
返回包:
Byte 0:0x02
Byte 1:0x03
Byte 2:状态字节
设置输出状态
Byte 0:0x00 or 0x80
Byte 1:0x04
Byte 2:输出端口(范围:0 – 2;0xFF代表所有端口,用于简单的控制操作)
Byte 3:功率大小(范围:-100 – 100)
Byte 4:模式字节(位字段)
Byte 5:调节模式(UBYTE:枚举类型)
Byte 6:匝数比(SBYTE:-100 – 100)
Byte 7:运行状态(UBYTE:枚举类型)
Byte 8 – 12:转速限制(ULONG;0:不停的运行)
返回包:
Byte 0:0x02
Byte 1:0x04
Byte 2:状态字节
“模式”的枚举类型有:
MOTORON 0x01 打开指定的马达
BRAKE 0x02 在PWM中用run/brake取代run/float
REGULATED 0x04 打开调节模式
“调节模式”的枚举类型有:
REGULATION_MODE_IDLE 0x00 没有开启调节
REGULATION_MODE_MOTOR_SPEED 0x01 开启指定输出的功率调节
REGULATION_MODE_MOTOR_SYNC 0x02 开启同步(需要两个输出端口)
“运行状态”的枚举类型有:
MOTOR_RUN_STATE_IDLE 0x00 输出将被闲置
MOTOR_RUN_STATE_RAMUP 0x10 输出将被加强
MOTOR_RUN_STATE_RUNNING 0x20 开始输出
MOTOR_RUN_STATE_RAMPDOWN 0x40 输出将被降低
设置输入模式
Byte 0:0x00 or 0x80
Byte 1:0x05
Byte 2:输入端口(范围:0 – 3)
Byte 3:传感器类型(枚举类型)
Byte 4:传感器方式(枚举类型)
返回包:
Byte 0:0x02
Byte 1:0x05
Byte 2:状态字节
“传感器类型”的枚举类型有:
NO_SENSOR 0x00
SWITCH 0x01
TEMPERATURE 0x02
REFLECTION 0x03
ANGLE 0x04
LIGHT_ACTIVE 0x05
LIGHT_INACTIVE 0x06
SOUND_DB 0x07
SOUND_DBA 0x08
CUSTOM 0x09
LOWSPEED 0x0A
LOWSPEED_9V 0x0B
NO_OF_SENSOR_TYPES 0x0C
“传感器模式”的枚举类型有:
RAWMODE 0x00
BOOLEANMODE 0x20
TRANSITIONCNTMODE 0x40
PERIODDCOUNTERMODE 0x60
PCTFULLSCALEMODE 0x80
CELSIUSMODE 0xA0
FAHRENHEITMODE 0xC0
ANGLESTEPSMODE 0xE0
SLOPEMASK 0x1F
MODEMASK 0xE0
获得输出状态
Byte 0:0x00 or 0x80
Byte 1:0x06
Byte 2:输出端口(范围:0 – 2)
返回包:
Byte 0:0x02
Byte 1:0x06
Byte 2:状态字节
Byte 3:输出端口(范围:0 – 2)
Byte 4:功率大小(-100 – 100)
Byte 5:模式字节(位字段)
Byte 6:调节模式(UBYTE:枚举类型)
Byte 7:匝数比(SBYTE:-100 – 100)
Byte 8:运行状态(UBYTE:枚举类型)
Byte 9 – 12:转速限制(ULONG;若有的话,表示在运行过程中当前的限制)
Byte 13 – 16:转数(SLONG;内部记数,从马达记数器最后清零到现在的记数)
Byte 17 – 20:阻塞转数(SLONG;现在位置相对于最后移动位置)
Byte 21 – 24:转动传感器(SLONG;现在位置相对于最后重置该马达转动传感器的位置)
具体的枚举类型,请查阅上面的设置输出状态。
获得输入值
Byte 0:0x00 or 0x80
Byte 1:0x07
Byte 2:输入端口(范围:0 – 3)
返回包:
Byte 0:0x02
Byte 1:0x07
Byte 2:状态字节
Byte 3:输入端口(范围:0 – 3)
Byte 4:是否有效(Boolean;TRUE表示新数据值可作为有效数据被查看)
Byte 5:是否校准(Boolean;如果有校准文件则为TRUE,用于下面的“校准值”字段)
Byte 6:传感器类型(枚举类型)
Byte 7:传感器模式(枚举类型)
Byte 8 – 9:原始A/D值(UWORD;取决于设备)
Byte 10 – 11:标准化A/D值(UWORD;取决于类型;范围:0 – 1023)
Byte 12 – 13:换算值(SWORD;取决于模式)
Byte 14 – 15:校准值(SWORD;根据校准确定该值规模。CURRENTLY UNUSED)
具体的枚举类型,请查阅上面的设置输入状态。
重置输入换算值
Byte 0:0x00 or 0x80
Byte 1:0x08
Byte 2:输入端口(范围:0 – 3)
返回包:
Byte 0:0x02
Byte 1:0x08
Byte 2:状态字节
消息写
Byte 0:0x00 or 0x80
Byte 1:0x09
Byte 2:收件箱号(0 – 9)
Byte 3:消息大小
Byte 4 – N:消息数据,这里的N = 消息大小 + 3
消息数据作为字符串进行处理,所以接收到的消息必须包含null终结符。相应地,消息大小也应该包含null终结符字节。消息大小不能超过59,当然对于所有的消息包需要符合USB标准。
返回包:
Byte 0:0x02
Byte 1:0x09
Byte 2:状态字节
重置马达位置
Byte 0:0x00 or 0x80
Byte 1:0x0A
Byte 2:输出端口(范围:0 – 2)
Byte 3:是否相对转动(Boolean;TURE:根据最后位置相对移动,FLASE:绝对位置)
返回包:
Byte 0:0x02
Byte 1:0x0A
Byte 2:状态字节
获得电量信息
Byte 0:0x00 or 0x80
Byte 1:0x0B
返回包:
Byte 0:0x02
Byte 1:0x0B
Byte 2:状态字节
Byte 3 – 4:毫伏电压(UWORD)
停止重放声音
Byte 0:0x00 or 0x80
Byte 1:0x0C
返回包:
Byte 0:0x02
Byte 1:0x0C
Byte 2:状态字节
保持活力
Byte 0:0x00 or 0x80
Byte 1:0x0D
返回包:
Byte 0:0x02
Byte 1:0x0D
Byte 2:状态字节
Byte 3 – 6:当前睡眠时限,单位为毫秒(ULONG)
LS得到状态
Byte 0:0x00 or 0x80
Byte 1:0x0E
Byte 2:端口(0 – 3)
返回包:
Byte 0:0x02
Byte 1:0x0E
Byte 2:状态字节
Byte 3:准备的字节数(读的有效字节数)
LS写
Byte 0:0x00 or 0x80
Byte 1:0x0F
Byte 2:端口(0 – 3)
Byte 3:Tx数据长度(字节)
Byte 4:Rx数据长度(字节)
Byte 5 – N:Tx数据,这里的N = Tx数据长度 + 4
对于在NXT上的LS通信,每个命令的数据长度被限定在16个字节。在从设备底层读数据的时候,必须在写命令中指定Rx数据长度。
返回包:
Byte 0:0x02
Byte 1:0x0F
Byte 2:状态字节
LS读
Byte 0:0x00 or 0x80
Byte 1:0x10
Byte 2:端口(0 – 3)
返回包:
Byte 0:0x02
Byte 1:0x10
Byte 2:状态字节
Byte 3:读字节数
Byte 3 – 19:Rx数据(填补)
对于在NXT上的LS通信,每个命令的数据长度被限定在16个字节。此外,这个协议不支持可变长度的返回包。所以,在返回包中总是包含16个数据字节,无效的数据字节将填充零。
得到当前程序名字
Byte 0:0x00 or 0x80
Byte 1:0x11
返回包:
Byte 0:0x02
Byte 1:0x11
Byte 2:状态字节
Byte 3 – 22:文件名。格式为ASCIIZ字符串,最大长度为15.3chars再加一个Null终结符。
如果当前没有程序在运行,将会返回一个错误信息,文件名字段将全部填充为0。
消息读
Byte 0:0x00 or 0x80
Byte 1:0x13
Byte 2:远程收件箱号(0 – 9)
Byte 3:本地收件箱号(0 – 9)
Byte 4:是否清除(Boolean:TRUE即非0,则清除远程收件箱的消息)
返回包:
Byte 0:0x02
Byte 1:0x13
Byte 2:状态字节
Byte 3:本地收件箱号(0 – 9)
Byte 4:消息大小
Byte 5 – 63:消息数据(附加的)
因为消息数据都是以字符串形式进行处理,所以它需要包含一个null终结符。相应地,消息的大小也应该包括null终结符字节。此外,返回包都有一个固定大小,所以消息数据字段将有可能被填充null字节。
要注意的是,远程邮箱号可以用0 – 19的值来指定,但是其它所有的邮箱号应该小于9。这也归咎于主从设备NXT模块建立连接之间的关系。从设备可能无法和主设备建立通信连接,所以他们将输出
消息存储在大于10的邮箱中(从10 – 19)。最后利用消息读命令从主设备中重新读这些消息。
当要远程读从设备中的数据时,可以发送如下命令:
0x05, 0x00, 0x00, 0x13, 0x0A, 0x00, 0x01 => 读远程从设备邮箱0中的数据,然后清除远程从邮箱。
0x05, 0x00, 0x00, 0x13, 0x0B, 0x01, 0x01 => 读远程从设备邮箱1中的数据,然后清除远程从邮箱。
返回给主机的错误消息
下面信息描述了我们怎样对错误消息进行分类,并没有描述独立的或特殊的错误消息。这些信息将被包含在返回包中。
返回包:
Byte 0:0x02
Byte 1:接收回复命令
Byte 2:表示状态。0代表成功;大于0代表错误,并指明了错误消息的值。
我们可能从NXT单元接收到下面错误消息:
 进程中等待的通信事务 0x20
 指定邮箱队列为空 0x40
 请求失败(也就是未找到指定的文件) 0xBD
 未知的操作命令 0xBE
 错误包 0xBF
 数据包含出界值 0xC0
 通信总线错误 0xDD
 通信缓存不足 0xDE
 指定的通道/连接无效 0xDF
 指定的通道/连接没有配置或被占用 0xE0
 没有现用程序 0xEC
 指定非法大小 0xED
 指定非法的邮箱队列ID 0xEE
 企图使用一个无效的结构字段 0xEF
 指定了错误的输入和输出 0xF0
 可利用内存不足 0xFB
 参数错误 0xFF
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-2-24 09:16:58 | 显示全部楼层
另外我有个文档 LEGO MINDSTORMS EV3 Communication Developer Kit.pdf,我想可以用来在AI2发送蓝牙指令时作参考。
LEGO MINDSTORMS EV3 Communication Developer Kit.pdf (274.19 KB, 下载次数: 80)
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2015-2-24 21:49:08 | 显示全部楼层
谢谢楼上老师指正,端口对应为。
1=A
2=B
4=C
8=D
3=AB
5=AC
6=BC
7=ABC
9=AD
10=BD
11=ABD
12=CD
13=ACD
14=BD
15=ABCD
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-2-27 15:00:16 | 显示全部楼层
易伟 发表于 2015-2-24 21:49
谢谢楼上老师指正,端口对应为。
1=A
2=B

呵呵看了看这个数据用二级制表示就更明确了,示例中端口号3前面的0应该也是和这个端口号一起的,从而组成一个字节的数据。
因为电机口只有4个所以只使用了一个字节中的低4位,而高4位始终为零,这同事说明可以扩展到8个电机口!哈哈哈
低4位中第0位控制电机口A
           第1位控制电机口B
           第2位控制电机口C
           第3位控制电机口D
当每一位为0时,电机不受指令控制,而为1时,受指令控制。
你试试设置不同的位为1,是不是和你列的这个控制表格一样?!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-4-2 14:42:26 | 显示全部楼层
顶的人不多,支持下!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-8-20 11:51:15 | 显示全部楼层
由于台湾已经EV3的模块集成到AI2中,官方也已发布,编程更加简单,将本节内容重新发布。EV3模块说明见http://www.appinventor.tw/ai2_chinese,右侧LEGO MINDSTORMS EV3。
项目编程地址在http://app.gzjkw.net,模块集成后,左侧找到EV3马达,页面设计基本不变。右侧属性可以选择默认,蓝牙客户端选择蓝牙,只要更改马达埠号,我这里是AD端口。
搜狗截图16年08月20日1135_1.jpg 2.jpg 3.jpg
逻辑设计蓝牙连接方面和前面的一样,不同之处是按钮设计变的更加简单。前进按钮如下图,选择同步转动,功率参数数值为-100到100,代表马达功率,转速参数代表小车方向,数值-100到100,0为直行,-100为左转,100为右转。松开时选择停止指令,刹车参数真为直接刹车,假为缓冲刹车。
4.jpg
后退、左转、右转设计
5.jpg
项目地址见下,解压后aia文件可导入,打包apk可安装或下载伴侣在线调试。
new_ev3_1.zip (114.39 KB, 下载次数: 25)





如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-3-22 14:43:18 | 显示全部楼层
易伟 发表于 2016-8-20 11:51
由于台湾已经EV3的模块集成到AI2中,官方也已发布,编程更加简单,将本节内容重新发布。EV3模块说明见http: ...

是好东西,为什么我编译后安装在手机上启动报错呀。蓝牙都已配对的。感觉是ev3模块调用蓝牙的错(因为去掉ev3部分的话不会报错)。报错内容为:“Bad argemnets to BluetoothClient The operation BluetoothClient annot accept the argments:,[false]
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-5-12 15:59:29 | 显示全部楼层
易伟 发表于 2016-8-20 11:51
由于台湾已经EV3的模块集成到AI2中,官方也已发布,编程更加简单,将本节内容重新发布。EV3模块说明见http: ...

请问在选择好AD电机情况下,可以分别控制电机A或者D吗?如果可以,在程序中怎么实现呢?我感觉集成模块好像实现不了,还得用较原始的模块。。非常感谢!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-5-22 15:10:22 | 显示全部楼层
找到解决方法了,我又试了下,多拖一个电机模块,选择我需要的端口即可分别控制。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2025-2-9 05:28 , Processed in 0.394010 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表