blinker物联网教程——23、wifi智能小车-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 21157|回复: 22

[分享] blinker物联网教程——23、wifi智能小车

[复制链接]
发表于 2018-12-20 21:39 | 显示全部楼层 |阅读模式
本帖最后由 海神 于 2021-10-11 09:42 编辑

硬件准备  
小车车体
电机驱动模块
连接线 若干
wifiduinocar2.png
小车底盘
wifixc.png wifiduinocar1.png
L298N电机驱动模块          wifiduino主板



软件准备

Blinker App

代码

  1. #define BLINKER_PRINT Serial
  2. #define BLINKER_WIFI

  3. #include <Blinker.h>

  4. char auth[] = "873sxxxxx10";
  5. char ssid[] = "mxxxxxn";
  6. char pswd[] = "cdxxxxx51";

  7. #define IN4 D7
  8. #define IN3 D6
  9. #define IN1 D4
  10. #define IN2 D5

  11. #define tap_time 300
  12. #define press_time 3000
  13. #define press_time_zy 1000

  14. unsigned long t = 0;
  15. unsigned long timeout = 2000;

  16. #define BUTTON_0 "btn-t"
  17. #define BUTTON_1 "btn-s"
  18. #define BUTTON_2 "btn-x"
  19. #define BUTTON_3 "btn-z"
  20. #define BUTTON_4 "btn-y"

  21. #define Txt_1 "tex"

  22. BlinkerText Text1(Txt_1);
  23. BlinkerButton Button0(BUTTON_0);
  24. BlinkerButton Button1(BUTTON_1);
  25. BlinkerButton Button2(BUTTON_2);
  26. BlinkerButton Button3(BUTTON_3);
  27. BlinkerButton Button4(BUTTON_4);

  28. void button0_callback(const String &state)
  29. {
  30.   t = millis();
  31.   timeout = 2000;
  32.   key_parse(0);
  33. }

  34. void button1_callback(const String &state)
  35. {
  36.   t = millis();
  37.   if (state == BLINKER_CMD_BUTTON_TAP)
  38.   {
  39.     timeout = tap_time;
  40.     key_parse(1);
  41.   }
  42.   else if (state == BLINKER_CMD_BUTTON_PRESSED)
  43.   {
  44.     timeout = press_time;
  45.     key_parse(5);
  46.   }
  47.   else if (state == BLINKER_CMD_BUTTON_RELEASED)
  48.     key_parse(0);
  49. }
  50. void button2_callback(const String &state)
  51. {
  52.   t = millis();
  53.   if (state == BLINKER_CMD_BUTTON_TAP)
  54.   {
  55.     timeout = tap_time;
  56.     key_parse(2);
  57.   }
  58.   else if (state == BLINKER_CMD_BUTTON_PRESSED)
  59.   {
  60.     timeout = press_time;
  61.     key_parse(6);
  62.   }
  63.   else if (state == BLINKER_CMD_BUTTON_RELEASED)
  64.     key_parse(0);
  65. }
  66. void button3_callback(const String &state)
  67. {
  68.   t = millis();
  69.   if (state == BLINKER_CMD_BUTTON_TAP)
  70.   {
  71.     timeout = tap_time;
  72.     key_parse(3);
  73.   }
  74.   else if (state == BLINKER_CMD_BUTTON_PRESSED)
  75.   {
  76.     timeout = press_time_zy;
  77.     key_parse(7);
  78.   }
  79.   else if (state == BLINKER_CMD_BUTTON_RELEASED)
  80.     key_parse(0);
  81. }
  82. void button4_callback(const String &state)
  83. {
  84.   t = millis();
  85.   if (state == BLINKER_CMD_BUTTON_TAP)
  86.   {
  87.     timeout = tap_time;
  88.     key_parse(4);
  89.   }
  90.   else if (state == BLINKER_CMD_BUTTON_PRESSED)
  91.   {
  92.     timeout = press_time_zy;
  93.     key_parse(8);
  94.   }
  95.   else if (state == BLINKER_CMD_BUTTON_RELEASED)
  96.     key_parse(0);
  97. }

  98. void key_parse(uint8_t car_mode)
  99. {
  100.   uint8_t L_PWM = 0;
  101.   uint8_t R_PWM = 0;
  102.   bool L_DIR = 0;
  103.   bool R_DIR = 0;
  104.   switch (car_mode)
  105.   {
  106.     case 1: //上tap
  107.       L_PWM = 127;
  108.       R_PWM = 127;
  109.       L_DIR = 1;
  110.       R_DIR = 1;
  111.       break;
  112.     case 2: //下
  113.       L_PWM = 127;
  114.       R_PWM = 127;
  115.       L_DIR = 0;
  116.       R_DIR = 0;
  117.       break;
  118.     case 3: //左
  119.       L_PWM = 127;
  120.       R_PWM = 127;
  121.       L_DIR = 0;
  122.       R_DIR = 1;
  123.       break;
  124.     case 4: //右
  125.        L_PWM = 127;
  126.       R_PWM = 127;
  127.       L_DIR = 1;
  128.       R_DIR = 0;
  129.       break;

  130.     case 5: //上press
  131.       L_PWM = 127;
  132.       R_PWM = 127;
  133.       L_DIR = 1;
  134.       R_DIR = 1;
  135.       break;
  136.     case 6: //下
  137.       L_PWM = 127;
  138.       R_PWM = 127;
  139.       L_DIR = 0;
  140.       R_DIR = 0;
  141.       break;
  142.     case 7: //左
  143.       L_PWM = 127;
  144.       R_PWM = 127;
  145.       L_DIR = 0;
  146.       R_DIR = 1;
  147.       break;
  148.     case 8: //右
  149.       L_PWM = 127;
  150.       R_PWM = 127;
  151.       L_DIR = 1;
  152.       R_DIR = 0;
  153.       break;

  154.       // case 9://左上press
  155.       // break;
  156.       // case 10://左下
  157.       // break;
  158.       // case 11://右上
  159.       // break;
  160.       // case 12://右下
  161.       // break;
  162.   }
  163.   analogWrite(IN3, L_PWM);
  164.   analogWrite(IN2, R_PWM);
  165.   digitalWrite(IN4, L_DIR);
  166.   digitalWrite(IN1, R_DIR);
  167.   Text1.print("run time", t);
  168. }

  169. void blinker_car_init()
  170. {
  171.   pinMode(IN4, OUTPUT);
  172.   pinMode(IN3, OUTPUT);
  173.   pinMode(IN2, OUTPUT);
  174.   pinMode(IN1, OUTPUT);
  175.   analogWrite(IN3, 255);
  176.   analogWrite(IN2, 255);
  177.   digitalWrite(IN4, 1);
  178.   digitalWrite(IN1, 1);
  179.   //  pinMode(C_BAR_PIN, INPUT_PULLUP);
  180. }
  181. void blinker_car_control(uint8_t cl_pwm, bool cl_dir, uint8_t cr_pwm, bool cr_dir)
  182. {
  183.   digitalWrite(IN4, cl_dir);
  184.   digitalWrite(IN1, cr_dir);
  185.   analogWrite(IN3, cl_pwm);
  186.   analogWrite(IN2, cr_pwm);
  187. }
  188. /*
  189.   void blinker_car_detect()
  190.   {
  191.     if (!digitalRead(C_BAR_PIN)) {
  192.         if (!isWarn) {
  193.             Blinker.vibrate();
  194.             isWarn = true;
  195.             car_os_time = millis();
  196.         }
  197.         else if (millis() - car_os_time >= 5000) {
  198.             isWarn = false;
  199.         }
  200.     }
  201.     else {
  202.         isWarn = false;
  203.     }
  204.   }
  205. */
  206. void setup()
  207. {
  208.   analogWriteRange(255);
  209.   blinker_car_init();

  210.   Serial.begin(115200);
  211.   BLINKER_DEBUG.stream(Serial);
  212.   Blinker.begin(auth, ssid, pswd);
  213.   Button0.attach(button0_callback);
  214.   Button1.attach(button1_callback);
  215.   Button2.attach(button2_callback);
  216.   Button3.attach(button3_callback);
  217.   Button4.attach(button4_callback);
  218. }

  219. void loop()
  220. {
  221.   Blinker.run();
  222.   if ((millis() - t) > timeout)
  223.   {
  224.     t = millis();
  225.     timeout = 2000;
  226.     blinker_car_init();
  227.     //Serial.println("timeout");
  228.   }
  229.   //   blinker_car_detect();
  230.   /*#if defined(BLINKER_CAR_DEBUG)
  231.     BLINKER_LOG4("L_PWM: ", L_PWM, "  | L_DIR: ", L_DIR);
  232.     BLINKER_LOG4("R_PWM: ", R_PWM, "  | R_DIR: ", R_DIR);
  233.     Blinker.delay(2000);
  234.     #endif*/
  235. }
复制代码

## 编辑blinker手机app界面  
1. 点击进入设备界面,点击右上角编辑键,切换到界面编辑模式  
2. 添加一个开关组件,点击按键组件,  
举例:添加一个 “上键”的按键
选择按键样式,可以选择按键的图标大小。点击“显示图标”可以修改“上键”的图标为一个向上的箭头
随后修改 数据键名、显示文本如图所示:
wifiduinocar13.png
同时添加布置“下键”“左键”“右键”“中键”
分别修改其键值为“btn-x” “btn-z”“btn-z”“btn-t”
wifiduinocar14.png
点击右上角解锁,即可完成编辑。


下载完成后打开串口窗口,会出现如下提示,表明wifiduino小车可以通过app控制了。


硬件连接

接线逻辑图
wifiduinocar12.png
1、Wifiduino与电机驱动板L298模块的连线

wifiduino引脚 L298电机驱动模块引脚
7 IN4
6 IN3
4 IN1
5 IN2
VIN 12V
GND GND
VCC 5V

2、左边电机接L298电机驱动模块的 OUT1 OUT2 右边电机接OUT3  OUT4
3、电池7.4V(2节锂电池)输入给wifiduino DC口供电


确认连线无误后,给小车上电,等待blinker中设备连接在线随后操作手机app的按键,观察小车运动情况。



4WD_wifi_key_control.zip

1.82 KB, 下载次数: 529

发表于 2018-12-21 09:48 | 显示全部楼层
例程4WD_wifi_key_control.ino
这个例子没找到呀

点评

已经添加进去,等空了把视频这些也添加进去  详情 回复 发表于 2018-12-21 20:11
 楼主| 发表于 2018-12-21 20:11 | 显示全部楼层
lanrun 发表于 2018-12-21 09:48
例程4WD_wifi_key_control.ino
这个例子没找到呀

已经添加进去,等空了把视频这些也添加进去
发表于 2018-12-21 22:02 | 显示全部楼层
强,刚弄好WIFI控制的,学习了
发表于 2018-12-23 20:57 | 显示全部楼层
MQTT怎么链接不上 呀 ?路由器 能看到设备已经连接了。但是串口调试信息显示没连上 ,密钥确认没有问题
发表于 2018-12-23 20:58 | 显示全部楼层
板子用的是wemos

点评

板子用的wifiduino 上面有图  详情 回复 发表于 2019-1-9 20:09
发表于 2018-12-23 21:11 | 显示全部楼层
串口提示 信息
IMG_20181223_210056.jpg
发表于 2018-12-24 23:46 | 显示全部楼层
已经 搞定 。库没有更新的原因
 楼主| 发表于 2019-1-9 20:09 | 显示全部楼层

板子用的wifiduino  上面有图
发表于 2019-3-16 18:04 | 显示全部楼层
出现ERROR: MQTT NOT ALIVE OR MSG LIMIT这个错误
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:28 , Processed in 0.160145 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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