
Esp32无限制距离WIFI履带小车
简介
基于ESP32S3R8的无限制距离Wifi小车,上电自动连接WIFI,只有手机端联网就能在有网络的地方任意操作小车
简介:基于ESP32S3R8的无限制距离Wifi小车,上电自动连接WIFI,只有手机端联网就能在有网络的地方任意操作小车开源协议
:GPL 3.0
描述
项目简介
基于ESP32S3R8的无限制距离Wifi小车,上电自动连接WIFI,只有手机端联网就能在有网络的地方任意操作小车
参考:
https://wiki.lckfb.com/zh-hans/esp32s3r8n8/projects/unlimited-distance-remote-control-car.html

项目功能
- 无限制距离
环境准备
- Arduino开发环境,类似keil,为ESP32提供强大的库
https://www.arduino.cc/en/software
- 然后配置esp32环境
https://wiki.lckfb.com/zh-hans/esp32s3r8n8/arduino-beginner/install.html
参考环境配置内容,在线和离线下载都可,离线下载资料在附录。 - 手机端下载点灯科技App
https://diandeng.tech/doc/app-download
导入配置

{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨文本1¨¨t1¨¨文本2¨¨bg¨É¨cols¨Ë¨rows¨Ë¨key¨¨btn-stop¨´x´Ì´y´Ò}{ßBßCßD¨fad fa-arrow-alt-circle-left¨ßFÉßG¨左行¨ßIßJßKÉßLËßMËßN¨btn-left¨´x´Ê´y´Ò¨lstyle¨É}{ßBßCßD¨fad fa-arrow-alt-circle-down¨ßFÉßG¨后退¨ßIßJßKÉßLËßMËßN¨btn-back¨´x´Ì´y´¤B}{ßBßCßD¨fad fa-arrow-alt-circle-up¨ßFÉßG¨前进¨ßIßJßKÉßLËßMËßN¨btn-frt¨´x´Ì´y´ÐßSÉ}{ßBßCßD¨fad fa-arrow-alt-circle-right¨ßFÉßG¨右移¨ßIßJßKÉßLËßMËßN¨btn-right¨´x´Î´y´Ò}{ßB¨vid¨ßKÉßLÑßMÎßN¨video¨´x´É´y´ÊßSɨstr¨¨mjpg¨}{ßBßCßD¨fad fa-toggle-off¨ßFÉßG¨开关灯¨ßIßJßKÉßLËßMËßN¨btn-led¨´x´Î´y´Ð}{ßB¨deb¨ßFÉßKÉßLÑßMÌßN¨debug¨´x´É´y´¤E}{ßB¨num¨ßGßHßD¨fal fa-question¨¨clr¨¨#389BEE¨¨min¨É¨max¨¢1c¨uni¨¨单位¨ßKÉßLËßMËßN¨num-abc¨´x´É´y´Ð}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßw¨source_zh¨¨开关状态¨¨state¨|ßyß10÷¨state_zh¨|´打开´´关闭´÷}÷´rt´|÷}
- 下载监控APP
- 配置点灯科技库入Arduino
硬件基础
1、放反接电池电路
2、DC-DC:BUCK降压电路

3、电机驱动(内部就是H桥电路)

4、USB插入接口

5、地分割(功率地、数字地)通过磁珠汇总到大地,防止电机感性电压突变影响电路

6、单片机ESP32S3R8(S3是系列,R8是有8M flash)

7、预留OLED显示屏,实际没用到,可以删了

为什么选择ESP32S3R8
1、 主频240MHZ
2、 国产芯片,乐鑫科技,支持国产
3、 支持Arduino强大的库,写代码简单
4、 IO MUX(任意引脚分配任意功能)
例如:
LED PWM

I2C

代码
1. #define BLINKER_WIFI
2. #include
3.
4. //宏
5. #define Resolution 9 //分辨率
6. char auth[] = "e6fab95e8ac0";
7. char ssid[] = "XinXun-8633";
8. char pswd[] = "12345678";
9. //IO宏
10. #define LED 48
11. #define Lin1 15
12. #define Lin2 16
13. #define Rin1 18
14. #define Rin2 17
15.
16. //函数宏
17. void motor_init();
18. void motor_left();
19. void motor_right();
20. void motor_forward();
21. void motor_stop();
22. void control(void);
23.
24. // 按下按键即会执行该函数
25. void button1_callback(const String & state) {
26. digitalWrite(LED, !digitalRead(LED));
27. }
28. //对象
29. BlinkerNumber Number1("num-abc");
30. BlinkerButton Button1("btn-led");
31.
32. int counter = 0;
33. String KeyName;
34. String KeyValue;
35.
36.
37. void setup() {
38. // put your setup code here, to run once:
39. // 初始化串口
40. Serial.begin(115200);
41. BLINKER_DEBUG.stream(Serial);
42.
43. //初始化电机
44. motor_init();
45. pinMode(LED,OUTPUT);
46. digitalWrite(LED, LOW);
47.
48. // 初始化blinker
49. Blinker.begin(auth, ssid, pswd);
50. Blinker.attachData(dataRead);
51. Button1.attach(button1_callback);
52. }
53.
54. void loop() {
55. // put your main code here, to run repeatedly:
56. Blinker.run();
57. control();
58. }
59.
60.
61. /**************************WIFI链接端******************************/
62. /*
63. 函数名:dataRead
64. 功能:对发送来的数据做处理,储存键名、键值,日志加一
65. 说明:
66. 发送过来的数据格式:
67. {"btn-fnt":"tap"}
68. {"num-abc":{"val":5}}
69. 在第一次出现" ",这两个夹着的是按键名KeyName
70. 后边出现的"",中间夹得是KeyValue
71. */
72. void dataRead(const String & data)
73. {
74. //日志+1
75. BLINKER_LOG("Blinker readString: ", data);
76. counter++;
77. Number1.print(counter);
78.
79. //储存键值和键名
80. int startPos = data.indexOf('"') + 1; //提取第一次"出现的索引位置
81. int endPos = data.indexOf('"', startPos); //从第一次"往后第一个出现"的位置
82. // 提取双引号内的内容
83. KeyName = data.substring(startPos, endPos);
84. Serial.println(KeyName);
85.
86. startPos = data.indexOf('"', endPos+1) + 1;
87. endPos = data.indexOf('"', startPos);
88. // 提取双引号内的内容
89. KeyValue = data.substring(startPos, endPos);
90. Serial.println(KeyValue);
91.
92. }
93.
94. void control(void)
95. {
96.
97. //键名:前进
98. if(KeyName.equals("btn-frt"))
99. {//键值判断
100. if(KeyValue.equals("press")) //长按
101. {
102. motor_forward();
103. }
104. else if(KeyValue.equals("pressup"))//长按松开
105. {
106. motor_stop();
107. }
108. }
109. //键名:左转
110. if(KeyName.equals("btn-left"))
111. {//键值判断
112. if(KeyValue.equals("press")) //长按
113. {
114. motor_left();
115. }
116. else if(KeyValue.equals("pressup"))//长按松开
117. {
118. motor_stop();
119. }
120. }
121. //键名:右转
122. if(KeyName.equals("btn-right"))
123. {//键值判断
124. if(KeyValue.equals("press")) //长按
125. {
126. motor_right();
127. }
128. else if(KeyValue.equals("pressup"))//长按松开
129. {
130. motor_stop();
131. }
132. }
133. //键名:后退
134. if(KeyName.equals("btn-back"))
135. {//键值判断
136. if(KeyValue.equals("press")) //长按
137. {
138. motor_back();
139. }
140. else if(KeyValue.equals("pressup"))//长按松开
141. {
142. motor_stop();
143. }
144. }
145. //键名:停车
146. if(KeyName.equals("btn-stop"))
147. {//键值判断
148. if(KeyValue.equals("tap")) //轻触
149. {
150. motor_stop();
151. }
152. else if(KeyValue.equals("press")) //长按
153. {
154. motor_stop();
155. }
156. else if(KeyValue.equals("pressup"))//长按松开
157. {
158. motor_stop();
159. }
160. }
161. }
162.
163. /**************************底盘******************************/
164. void motor_init()
165. {
166. //L_IN1
167. ledcAttach(Lin1,10000,Resolution);
168. //L_IN2
169. ledcAttach(Lin2,10000,Resolution);
170. //R_IN1
171. ledcAttach(Rin1,10000,Resolution);
172. //R_IN2
173. ledcAttach(Rin2,10000,Resolution);
174. motor_stop();
175. }
176.
177. void motor_left(void)
178. {
179. ledcWrite(Lin1, 340); // 左
180. ledcWrite(Lin2, 0);
181.
182. ledcWrite(Rin1, 400); // 右
183. ledcWrite(Rin2, 0);
184. }
185. void motor_right(void)
186. {
187. ledcWrite(Lin1, 400); // 左
188. ledcWrite(Lin2, 0);
189.
190. ledcWrite(Rin1, 340); // 右
191. ledcWrite(Rin2, 0);
192. }
193. // speed range from 0-100
194. void motor_forward(void)
195. {
196. ledcWrite(Lin1, 400); // 左
197. ledcWrite(Lin2, 0);
198.
199. ledcWrite(Rin1, 400); // 右
200. ledcWrite(Rin2, 0);
201. }
202.
203. void motor_back(void)
204. {
205.
206. ledcWrite(Lin1, 0); // 左
207. ledcWrite(Lin2, 400);
208.
209. ledcWrite(Rin1, 0); // 右
210. ledcWrite(Rin2, 400);
211. }
212. void motor_stop()
213. {
214. ledcWrite(Lin1, 0); // 输出PWM
215. ledcWrite(Lin2, 0); // 输出PWM
216. ledcWrite(Rin1, 0); // 输出PWM
217. ledcWrite(Rin2, 0); // 输出PWM
218. }
图片

设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










