准备材料:

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 使用Http请求及基于 Polly 的处理故障

    一.介绍 在IServiceCollection调用AddHttpClient注册IHttpClientFactory服务,调用AddHttpMessageHandler以生成出站请求中间件管道. 每 ...

  2. pdfminer获取整页文本

    #! python2 # coding: utf-8 import sys from cStringIO import StringIO from pdfminer import pdfinterp ...

  3. .Net Core 创建和使用中间件

    1. 定义中间内容 1.1 必须有一个RequestDelegate 委托用了进入一个中间件 1.2 通过构造函数设置这个RequestDelegate委托 1.3 必须有一个方法Task Invok ...

  4. bzoj3316 JC loves Mkk题解

    3316: JC loves Mkk Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 979  Solved: 316[Submit][Status][Di ...

  5. C语言中的函数与数学上的函数很类似

    函数,是C语言编程中一个很重要的概念,重要到个人认为可以与指针并驾齐驱.好多教材.老师.学习资源都会专门挑出一章来讲函数.我今天也来说说函数,只不过我是从数学课上的函数来引申到C语言中的函数. 先来说 ...

  6. 【动态规划DP】传娃娃-C++

    传娃娃 描述 学习空闲之余,小信经常带着同学们做游戏,最近小信发明了一个好玩的新游戏:n 位同学围成一个圈,同学 A 手里拿着一个布娃娃.小信喊游戏开始,每位手里拿着娃娃的同学可以选择将娃娃传给左边或 ...

  7. py+selenium 直接给日期赋值,控制台调试报错【已解决】

    目标:给带日期控件的输入框赋值. 百度去搜索让你各种去只读readonly属性,再send_keys 方法: 其实既然可以去除readonly属性,那就可以直接给属性赋值,将两行代码缩为一行. dri ...

  8. STM32-I2C_CheckEvent-标志位自动清除理解

    STM32里I2C_CheckEvent函数我们应该是相当熟悉了,在每次发送数据后我们都需要检验相应的EVx(x = 0,1,2,,,)事件是否有发送. 函数定义如下: ErrorStatus I2C ...

  9. 个人永久性免费-Excel催化剂功能第32波-空行空列批量插入和删除

    批量操作永远是效率提升的王道,也是Excel用户们最喜欢能够实现的操作虽说有些批量操作不一定合适Excel的最佳实践操作,但万千世界,无奇不有,特别是在国人眼中领导最大的等级森严的职场环境下.Exce ...

  10. Python学习2——Python单行注释、整段注释使用方法

    Python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的. python注释也有自己的规范,在文章中会介绍到. 注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被 ...