zoukankan      html  css  js  c++  java
  • 利用DoHome APP和音箱控制小车的实验参考步骤

    准备材料:

    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位停止位

    每条命令以 结尾。

    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
    ",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 小米音箱语音远程控制继电器

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

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

     

     

  • 相关阅读:
    装饰器api
    API
    Python之模块和包
    编辑后保留原URl搜索条件
    数据结构相关知识
    博客系统之评论树与评论楼相关操作
    Redis五大数据类型以及操作
    Class python31
    python_class21
    数字及字符串
  • 原文地址:https://www.cnblogs.com/doiting/p/11136892.html
Copyright © 2011-2022 走看看