准备材料:

Arduino Uno 一块

Arduino 扩展板        购买链接

DT-06模块一个       购买链接

安卓手机一个

小度音箱一个

小车一个

杜邦线若干

1.DT-06固件的烧录

1.1打开ESP模块下载工具ESPFlashDownloadTool,选择需要下载的固件,填写下载地址,推荐使用  ESP8266 Download TOOL,配置信息如下:

1.2 选择实际的串口,选择下载速度

1.3点击ERASE,先插除,再点击START,开始下载

工具下载及详细请看:http://bbs.doit.am/forum.php?mod=viewthread&tid=208

DT-06固件.bin文件下载链接

2.硬件电路的连接

DT-06安装到arduino扩展板的串口排插位置

3.DT-06通讯协议

通信方式:串口通讯

波特率:115200,无奇偶校验,8位数据位,1位停止位

每条命令以\r\n结尾。

3.1  控制命令

3.1.1 DT06->arduino

‘2’:前进,’4’:左转,’6’:右转,’8’:后退,’5’:停止,’Y’:左平移,

‘y’:右平移,’7’:加速,’9’:减速

3.1.2 Arduino->DT06

cmd=ctrl&ok;

3.2  设置小车模式

3.2.1 DT06->arduino

‘A’:手动,’B’:循迹,’C’:避障。

3.2.2 Arduino->DT06

cmd=mode&ok;

3.3 上传状态

3.3.1 Arduino->DT06  

上传状态

cmd=ext_stat&status=speed|mode|soft_poweroff

例:cmd=ext_stat&status=255|65|0

speed表示小车当前车速,mode表示小车当前模式

soft_poweroff表示小车当前运动状态,1表示运动,0表示停止

3.3.2 DT06->arduino

cmd= ok

4.Arduino UNO 程序的编写

  1 //材料:UNO+Doit电机驱动板+蓝牙模块
2
3 /****************************IO引脚定义*****************************/
4 //电机引脚
5 #define PWMD 3 //D电机转速
6 #define DIRD 2 //D电机转向
7
8 #define PWMC 5 //C电机转速
9 #define DIRC 4 //C电机转向
10
11 #define PWMB 6 //B电机转速
12 #define DIRB 7 //B电机转向
13
14 #define PWMA 9 //A电机转速
15 #define DIRA 8 //A电机转向
16
17
18 //上传状态
19 void uploadExtendStatus(uint8_t uSpeed,uint8_t uMode,uint8_t soft_poweroff)
20 {
21 char strExtStat[128];memset(strExtStat,0x00,sizeof(strExtStat));
22 sprintf(strExtStat,"cmd=ext_stat&status=%d|%d|%d\r\n",uSpeed,uMode,soft_poweroff);
23 Serial.write((uint8_t*)strExtStat,strlen(strExtStat));
24 }
25
26
27 //车体前进
28 //
29 void motor_go_forward()
30 {
31 digitalWrite(DIRA,HIGH);
32 digitalWrite(DIRB,HIGH);
33 digitalWrite(DIRC,LOW);
34 digitalWrite(DIRD,LOW);
35
36 analogWrite(PWMA,255);
37 analogWrite(PWMB,255);
38 analogWrite(PWMC,255);
39 analogWrite(PWMD,255);
40 uploadExtendStatus(255,65,1);
41
42 }
43
44 //车体前进后退
45 //
46 void motor_go_back()
47 {
48 digitalWrite(DIRA,LOW);
49 digitalWrite(DIRB,LOW);
50 digitalWrite(DIRC,HIGH);
51 digitalWrite(DIRD,HIGH);
52
53 analogWrite(PWMA,255);
54 analogWrite(PWMB,255);
55 analogWrite(PWMC,255);
56 analogWrite(PWMD,255);
57 uploadExtendStatus(255,65,1);
58 }
59
60 //车体左转
61 //
62 void motor_go_left()
63 {
64 digitalWrite(DIRA,HIGH);
65 digitalWrite(DIRB,LOW);
66 digitalWrite(DIRC,LOW);
67 digitalWrite(DIRD,HIGH);
68
69 analogWrite(PWMA,255);
70 analogWrite(PWMB,255);
71 analogWrite(PWMC,255);
72 analogWrite(PWMD,255);
73 uploadExtendStatus(255,65,1);
74 }
75
76 //车体右转
77 //
78 void motor_go_right()
79 {
80 digitalWrite(DIRA,LOW);
81 digitalWrite(DIRB,HIGH);
82 digitalWrite(DIRC,HIGH);
83 digitalWrite(DIRD,LOW);
84
85 analogWrite(PWMA,255);
86 analogWrite(PWMB,255);
87 analogWrite(PWMC,255);
88 analogWrite(PWMD,255);
89 uploadExtendStatus(255,65,1);
90 }
91
92 //车体停止
93 void motor_go_stop()
94 {
95 digitalWrite(DIRA,LOW);
96 digitalWrite(DIRB,LOW);
97 digitalWrite(DIRC,LOW);
98 digitalWrite(DIRD,LOW);
99
100 analogWrite(PWMA,0);
101 analogWrite(PWMB,0);
102 analogWrite(PWMC,0);
103 analogWrite(PWMD,0);
104 uploadExtendStatus(0,65,0);
105
106 }
107
108 //车体左平移
109 //
110 void motor_pmove_left()
111 {
112 digitalWrite(DIRA,HIGH);
113 digitalWrite(DIRB,LOW);
114 digitalWrite(DIRC,HIGH);
115 digitalWrite(DIRD,LOW);
116
117 analogWrite(PWMA,200);
118 analogWrite(PWMB,200);
119 analogWrite(PWMC,200);
120 analogWrite(PWMD,200);
121 uploadExtendStatus(200,65,1);
122
123 }
124
125 //车体右平移
126 void motor_pmove_right()
127 {
128 digitalWrite(DIRA,LOW);
129 digitalWrite(DIRB,HIGH);
130 digitalWrite(DIRC,LOW);
131 digitalWrite(DIRD,HIGH);
132
133 analogWrite(PWMA,200);
134 analogWrite(PWMB,200);
135 analogWrite(PWMC,200);
136 analogWrite(PWMD,200);
137 uploadExtendStatus(200,65,1);
138
139 }
140
141 //串口接收处理
142 #define MAX_PACKETSIZE 32 //串口接收缓冲区
143 char buffUART[MAX_PACKETSIZE];
144 unsigned int buffUARTIndex = 0;
145 unsigned long preUARTTick = 0;
146 //小车转向
147 enum DN
148 {
149 GO_ADVANCE,
150 GO_LEFT,
151 GO_RIGHT,
152 GO_BACK,
153 STOP_STOP,
154 PMOVE_LEFT,//Parallel movement to the left
155 PMOVE_RIGHT,//Parallel movement to the right
156 DEF
157 } Drive_Num = DEF;
158
159 //电机控制标志量
160 bool flag1 = false;
161 bool stopFlag = false;
162 bool JogFlag = false;
163 uint16_t JogTimeCnt = 0;
164 uint32_t JogTime = 0;
165
166
167 //小车电机控制
168 void CAR_Control()
169 {
170 switch (Drive_Num)
171 {
172 case GO_ADVANCE:motor_go_forward(); JogFlag = true; JogTimeCnt = 1; JogTime = millis(); break;
173 case GO_LEFT: motor_go_left(); JogFlag = true; JogTimeCnt = 1; JogTime = millis(); break;
174 case GO_RIGHT: motor_go_right(); JogFlag = true; JogTimeCnt = 1; JogTime = millis(); break;
175 case GO_BACK: motor_go_back(); JogFlag = true; JogTimeCnt = 1; JogTime = millis(); break;
176 case STOP_STOP: motor_go_stop(); JogTime = 0; JogFlag = false; stopFlag = true; break;
177 case PMOVE_LEFT: motor_pmove_left(); JogFlag = true; JogTimeCnt = 1; JogTime = millis(); break;
178 case PMOVE_RIGHT: motor_pmove_right(); JogFlag = true; JogTimeCnt = 1; JogTime = millis(); break;
179 default: break;
180 }
181 Drive_Num = DEF;
182 //小车保持姿态210ms
183 if (millis() - JogTime >= 510)
184 {
185 JogTime = millis();
186 if (JogFlag == true)
187 {
188 stopFlag = false;
189 if (JogTimeCnt <= 0)
190 {
191 JogFlag = false; stopFlag = true;
192 }
193 JogTimeCnt--;
194 }
195 if (stopFlag == true)
196 {
197 stopFlag = false;
198 JogTimeCnt = 0;
199 motor_go_stop();
200 }
201 }
202 }
203
204
205
206 //串口数据接收处理
207 void UART_Control()
208 {
209 char Uart_Date = 0;
210 if (Serial.available()) //串口收到数据
211 {
212 Uart_Date = Serial.read();
213 }
214
215 if (buffUARTIndex > 0 && (millis() - preUARTTick >= 100)) //超过100ms没接到数据,则认为已经接收到完整指令
216 { //data ready
217 buffUART[buffUARTIndex] = 0x00;
218 if ((buffUART[0] == 'C') && (buffUART[1] == 'M') && (buffUART[2] == 'D')) //若发送指令非法,则忽略
219 {
220 ;
221 }
222 else Uart_Date = buffUART[0];
223 buffUARTIndex = 0;
224 }
225 //Serial.println("Uart_Date:");
226 //Serial.println(Uart_Date);
227 switch (Uart_Date) //串口控制指令
228 {
229 case '2': Drive_Num = GO_ADVANCE; break;
230 case '4': Drive_Num = GO_LEFT; break;
231 case '6': Drive_Num = GO_RIGHT; break;
232 case '8': Drive_Num = GO_BACK; break;
233 case '5': Drive_Num = STOP_STOP; break;
234 case 'Y': Drive_Num = PMOVE_LEFT; break;
235 case 'y': Drive_Num = PMOVE_RIGHT;break;
236 case 'A': break;
237 case 'B': break;
238 case 'C': break;
239 default: break;
240 }
241
242 }
243 //IO初始化
244 void IO_init()
245 {
246 pinMode(DIRA, OUTPUT);
247 pinMode(PWMA, OUTPUT);
248 pinMode(DIRB, OUTPUT);
249 pinMode(PWMB, OUTPUT);
250 pinMode(DIRC, OUTPUT);
251 pinMode(PWMC, OUTPUT);
252 pinMode(DIRD, OUTPUT);
253 pinMode(PWMD, OUTPUT);
254 motor_go_stop();
255 }
256
257 /////////////////////////////////////////////////////////////////////////////
258 void setup()
259 {
260 Serial.begin(115200);
261 delay(1000);
262 IO_init();
263 }
264
265 void loop()
266 {
267 UART_Control();//串口接收处理
268 CAR_Control();//小车控制
269 }

注意:

(1)上传arduino程序需先断开DT-06模块的连接,程序上传完成后再插上DT-06模块

(2)DT-06和arduino UNO的通信协议中

当APP控制界面点击前进状态DT-06向arduino UNO发送字符‘2’,

当APP控制界面点击后退状态DT-06向arduino UNO发送字符‘4’,

当APP控制界面点击左转状态DT-06向arduino UNO发送字符‘6’,

当APP控制界面点击右转状态DT-06向arduino UNO发送字符‘8’,

arduino UNO控制程序代码:下载地址

5.功能测试

5.1 DT-06与手机DoHome App 的连接

5.1.1扫描下面二维码(注意用浏览器扫描,不要用微信)或直接访问

http://dohome.doit.am/upgrade/downLoad/downLoad.php下载

5.1.2 App安装完成后打开应用,打开左上角配置栏,在“点击登录”处创建和登陆帐户。

5.1.3  点右上角加号添加设备,点击机器人,添加新的设备

5.1.4连接附近可用的WIFI,选择设备要连接的网络路由器,并输入正确的网络密码。点击下一步

5.1.5按照页面说明,返回手机的WLAN设置,连接“DoHome_XXXX”的热点,其密码为“12345678”。注:若有多台设备,请注意区分不同的热点名字。等待设备连接完成100%。

5.2功能调试

APP的控制界面如下图,点击前进按钮,小车前进一段时间,长按APP界面前进按钮,小车一直保持前进,左转右转后退类似。

6.小度音响的连接和远程控制

在手机应用市场搜索小度音箱app并安装完成打开小度音箱APP

6.1小度音箱APP添加小度音响设备

打开手机蓝牙,打开小度音箱APP,点击添加新设备,长按音箱上的三角键,听到音箱提示音后点击下一步

6.2小度音箱APP添加其他平台设备

6.2.1打开小度音箱APP,点击“智能家居”,然后添加设备,接着在弹出的品牌列表中找到DoHome。

6.2.2选择绑定账号,输入DoHome APP的绑定账号信息(注意是在第5节关于创建和注册的DoHome账号)。返回智能家居主页面,刷新可以得到该账号下的设备列表。

6.2.3现在您已经可以使用小度音响控制您的设备了。同时,小度音箱在“设备详情”菜单下支持分组功能。

小度支持的部分指令如下(以插座为例):

  • 打开 [设备名字]
  • 关闭 [设备名字]

6.3 小度音箱语音远程控制继电器

对小度说打开门口插座,继电器 的红色开关指示灯亮起

对小度说关闭门口插座,继电器 的红色开关指示灯熄灭

7.天猫精灵的连接和远程控制

7.1天猫精灵APP添加音响设备

7.1.1  在各大应用市场搜索天猫精灵app并安装以华为为例

7.1.2 打开天猫精灵APP,点击“我的”,然后添加智能设备,接着在左侧列表中选择您的音响设备类型-》选择路由器-》长按音响上的静音键点击开始连接

7.2天猫精灵APP添加其他平台设备

第一步:打开天猫精灵APP,点击“我的”,然后添加智能设备,接着在左侧列表中选择您的设备类型。

第二步:右上角搜索“DoHome”,并在链接的页面中输入您的DoHome 账号信息,完成天猫精灵与DoHome之间的链接。

第三步:此时,天猫精灵APP中,已经出现该账号下的所有设备。您可以选取特定设备,进行重新命名,例如“客厅的台灯”等等。现在您可以使用天猫精灵控制设备了。

天猫精灵支持的部分指令(以插座为例):

  • 打开 [设备名字]
  • 关闭 [设备名字]

7.3 天猫精灵语音远程控制继电器

对天猫精灵说打开门口插座,继电器 的红色开关指示灯亮起

对天猫精灵说关闭门口插座,继电器 的红色开关指示灯熄灭

8.小米音箱的连接和远程控制

8.1米家APP添加小爱音响设备

8.1.1在各大应用市场搜索米家app并安装以华为为例

8.1.2  打开小爱音箱,长按音箱上三角形按键听到语音提示:已进入配对模式。手机打开蓝牙,打开米家APP点击添加设备-->附近设备,搜索到设备连接,接着选择路由器下一步即可

8.2米家APP添加其他平台设备

第一步:打开米家APP,点击“我的”,然后选择“其他平台设备”。

第二步:点击添加,在弹出的列表中,找到“四博智联”。选择绑定账号,输入DoHome APP的绑定账号信息。

第三步:现在您已经可以使用小爱同学控制您的设备了。

小爱支持的部分指令如下(以插座为例):

  • 打开 [设备名字]
  • 关闭 [设备名字]

8.3 小米音箱语音远程控制继电器

对天猫精灵说打开门口插座,继电器 的红色开关指示灯亮起

对天猫精灵说关闭门口插座,继电器 的红色开关指示灯熄灭

利用DoHome APP和音箱控制小车的实验参考步骤的更多相关文章

  1. 利用DoHome APP和音箱控制LED灯实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 小灯珠一个 杜邦线若干 1.DT-06固 ...

  2. 利用DoHome APP和音箱控制继电器通断电实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 继电器模块一个 杜邦线若干 1.DT-0 ...

  3. [转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

    原文出处: https://blog.csdn.net/Forrest_Z/article/details/55002484 准备工作 1.下载串口通信的ROS包 (1)cd ~/catkin_ws/ ...

  4. Qt on android 蓝牙开发(控制小车)

    因为要做一个用蓝牙控制小车的app,就用着QT搞了下,网上关于QT蓝牙开发的资料比较少,我在这里记录下过程希望对看到了人有所帮助 首先在项目文件里添加 QT += bluetooth 这样就可以用QT ...

  5. Arduino开发版学习计划--蓝牙控制小车行走

    蓝牙模块一共6个引脚,我们一般只需要接4个线就可以了,分别是VCC.GND.TXD.RXD这四个引脚,我们分别接到arduino板子上,VCC接3.3V,GND接板子的GND,蓝牙TXD接板子的RXD ...

  6. 制作Kinect体感控制小车教程 &lt;一&gt;

    转载请注明出处:http://blog.csdn.net/lxk7280                                        Kinect体感控制小车        Kine ...

  7. 利用微软Speech SDK 5.1开发语音识别系统主要步骤

    利用微软Speech SDK 5.1开发语音识别系统主要步骤 2009-09-17 10:21:09|  分类: 知识点滴|字号 订阅 微软语音识别分两种模式:文本识别模式和命令识别模式.此两种模式的 ...

  8. oracle之 利用 controlfile trace文件重建控制文件

    一. 11g RAC 重建控制文件 1. --"create controlfile"命令生成到追踪文件中:alter database backup controlfile to ...

  9. 树莓派小车(三)Python控制小车

    正文之前 由于最近忙于复习赶考,所以暂时没有拿起树莓派小车,直到昨天,终于空出时间来把代码整理一下来和大家分享. 正文 在树莓派小车系列之二中,讲到了树莓派的引脚定义方式有两种: PHYSICAL N ...

随机推荐

  1. .Net Core 学习新建Core MVC 项目

    一.新建空的Core web项目 二.在Startup文件中添加如下配置 1.  在ConfigureServices 方法中添加 services.AddMvc();MVC服务 2. app.Use ...

  2. APP系统架构设计初探

    一,图片体验的优化. 在手机上显示图片,速度是一个非常重要的体验点,试想,如果您打开一个网站,发现里面的图片一直显示失败或者是x,稍微做得好一点的,可能是一个不消失的loading或者是菊花等等,但不 ...

  3. 磁盘大保健 保持你的Linux服务器存储健康

    df du -sh *| sort -nr du -h --max-depth=1 / du -h --max-depth=1 /* find . -type f -size +1000000k 查找 ...

  4. C语言指针专题——指针怎么就很灵活?

    最近在研读 C Primer pkus(第五版)中文版,老外写的还是很经典的,推荐给朋友们,购买地址:C primer plus 5版中文版购买 另外再推荐两本书: 1. 2017年9月全国计算机二级 ...

  5. 20131214-EditPlus快捷键-第二十一天

    EditPlus 快捷键 文件   FileFtpUpload Ctrl+Shift+S 上传文件到 FTP 服务器 FileNew Ctrl+N 新建普通的文本文档 FileNewHtml Ctrl ...

  6. 20141102-微信.NET-笔记

    http://weixin.senparc.com/ 欢迎使用 微信公众平台SDK!     Senparc.Weixin.MP.dll 使用 Senparc.Weixin.MP.dll 整合网站与微 ...

  7. Promise原理探究及实现

    前言 作为ES6处理异步操作的新规范,Promise一经出现就广受欢迎.面试中也是如此,当然此时对前端的要求就不仅仅局限会用这个阶段了.下面就一起看下Promise相关的内容. Promise用法及实 ...

  8. MyBatis从入门到精通:第一章实体类与Mapper.xml文件

    实体类: package tk.mybatis.simple.model; public class Country { public Long getId() { return id; } publ ...

  9. request 中url拼接排序参数与签名算法

    一.参数要求: { appId:应用在后台创建应用时分配的应用编号,与应用密钥一一对应 sign:按照当前请求参数名的字母序进行升序排列(排序时区分大小写,除sign外,其它值不为空的参数都参与签名) ...

  10. RabbitMQ 从入门到精通(二)

    目录 1. 消息如何保障百分之百的投递成功? 1.1 方案一:消息落库,对消息状态进行打标 1.2 方案二:消息的延迟投递,做二次确认,回调检查 2. 幂等性 2.1 幂等性是什么? 2.2 消息端幂 ...