赞
踩
#如何操控小车
这个问题问的好,相信许多学习过单片机的小伙伴们都知道我们控制一个硬件的方法有很多种,例如红外遥控,蓝牙遥控等等,但是我们今天介绍的是用wifi和服务器进行遥控,那么wifi怎么控制我们的小车呢?
其实原理与蓝牙相似,只不过esp8266这款芯片可以连接wifi,如果连接上了阿里云我们,只要芯片有网,我们就可以实现无限距离的传输。当然如果我们也可以使用局域网来控制小车。本项目用Arduino IDLE来实现代码。
下面展示如何连接wifi。
/ /wifi连接 Serial.begin(9600); // 启动串口通讯 WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接 int i = 0; // 这一段程序语句用于检查WiFi是否连接成功 while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值 } // 同时NodeMCU将通过串口监视器输出连接时长读秒。 // 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后 Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。 Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用 Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
#在连接WiFi后我们该如何给芯片发送指令来控制小车呢?
我们可以通过esp8266来创建一个服务器通过网页里面的指令来控制小车
// 以下是创建服务器的部分代码
esp8266_server.begin();
esp8266_server.on("/", handleRoot);
esp8266_server.onNotFound(handleNotFound);
以下是创建网页的基本代码(用html5编写)
// 网页编写部分代码 webPage += "<div align=\"center\"><h1>contral direction</h1>"; webPage += "<a href=\"FL\"><button style=\"height:200px;width:200px\"><font size=\"20\">FL</font></button></a>"; webPage += "<a href=\"F2\"><button style=\"height:200px;width:200px\"><font size=\"20\">FW</font></button></a>"; webPage += "<a href=\"FR\"><button style=\"height:200px;width:200px\"><font size=\"20\">FR</font></button></a><br>"; webPage += "<a href=\"L2\"><button style=\"height:200px;width:200px\"><font size=\"20\">LT</font></button></a>"; webPage += "<a href=\"S2\"><button style=\"height:200px;width:200px\"><font size=\"20\">ST</font></button></a>"; webPage += "<a href=\"R2\"><button style=\"height:200px;width:200px\"><font size=\"20\">RT</font></button></a><br>"; webPage += "<a href=\"BL\"><button style=\"height:200px;width:200px\"><font size=\"20\">BL</font></button></a>"; webPage += "<a href=\"B2\"><button style=\"height:200px;width:200px\"><font size=\"20\">BC</font></button></a>"; webPage += "<a href=\"BR\"><button style=\"height:200px;width:200px\"><font size=\"20\">BR</font></button></a></div>"; webPage += "<div align=\"center\"><h1>speed contral</h1>"; webPage += "<a href=\"SE1\"><button style=\"height:200px;width:200px\"><font size=\"20\">1</font></button></a>"; webPage += "<a href=\"SE2\"><button style=\"height:200px;width:200px\"><font size=\"20\">2</font></button></a>"; webPage += "<a href=\"SE3\"><button style=\"height:200px;width:200px\"><font size=\"20\">3</font></button></a><br>"; webPage += "<a href=\"SE4\"><button style=\"height:200px;width:200px\"><font size=\"20\">4</font></button></a>"; webPage += "<a href=\"SE5\"><button style=\"height:200px;width:200px\"><font size=\"20\">5</font></button></a>"; webPage += "<a href=\"SE6\"><button style=\"height:200px;width:200px\"><font size=\"20\">6</font></button></a><br>"; webPage += "<a href=\"SE7\"><button style=\"height:200px;width:200px\"><font size=\"20\">7</font></button></a>"; webPage += "<a href=\"SE8\"><button style=\"height:200px;width:200px\"><font size=\"20\">8</font></button></a>"; webPage += "<a href=\"SE9\"><button style=\"height:200px;width:200px\"><font size=\"20\">9</font></button></a>";
大家在连接上wifi之后可以根据Arduino IDLE上的串口来查看esp8266的IP地址。如果是手机开热点的话可以在手机热点里查看ip(例如192.168.4.1),
注意你的手机要和开发板连接同一个WiFi,然后在浏览器输入IP地址就可以进入你创建的网页了
这个页面上分别设置了9个按键来控制方向和9个按键来控制速度。包括前后左右,左前方,右前方等等。速度我设置了9个档为分别为0~9(用pwm来调速)
#做好这些基础的代码之后就是硬件和软件的相结合了,我们控制直流减速电机用到了l298n电机驱动模块。
该模块5-12v都可以驱动,我个人建议最好是12v驱动。将电源的正负极分别接在l298n的12v和GND上,5v和GND接出来接到nodemcu的vin与GND接口,然后分别将outA和outB接到直流减速电机上(这里注意千万不要将12v接到nodemcu上,会将芯片烧坏)
我的代码是将开发板的D1接到ENA,D3接到ENB,D5~D7分别接在IN1到IN4上,开发板上的pwm输出是接在了使能端上来调速的。
以下为完整代码(这里的WiFi是我自己的,大家可以改成自己的WiFi名称,注意的是esp8266只能接收2.4Ghz的WiFi)
// An highlighted block #define ENA 5 // Enable/speed motors Right GPIO 5(D1) //#define ENA_2 4 // Enable/speed motors Right_2 GPIO 4(D2) #define ENB 0 // Enable/speed motors Left GPIO 0(D3) //#define ENB_2 2 // Enable/speed motors Left_2 GPIO 2(D4) #define IN_1 14 // L298N in1 motors Right GPIO14(D5) #define IN_2 12 // L298N in2 motors Right GPIO12(D6) #define IN_3 13 // L298N in3 motors Left GPIO13(D7) #define IN_4 15 // L298N in4 motors Left GPIO15(D8) #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266WiFiMulti.h> /* Wifi ssid and pwd */ const char *ssid = "LHD1"; const char *password = "1234567890"; /* your car speed */ int speedCar = 125; // 0 - 255. int speedInterval = 20; //速度间隔 int speedTrun = 1.5; //转弯系数 ESP8266WebServer server(80); String webPage = ""; /* 192.168.4.1 */ void handleRoot() { server.send(200, "text/html", "<h1>You are connected</h1>"); } void setup() { Serial.begin(9600); // 启动串口通讯 WiFi.begin(ssid, password); // 启动网络连接 Serial.print("Connecting to "); // 串口监视器输出网络连接信息 Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接 int i = 0; // 这一段程序语句用于检查WiFi是否连接成功 while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值 } // 同时NodeMCU将通过串口监视器输出连接时长读秒。 // 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后 Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。 Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用 Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。 webPage += "<div align=\"center\"><h1>ESP8266 CAR</h1>"; webPage += "<a href=\"FL\"><button style=\"height:200px;width:200px\"><font size=\"20\">FL</font></button></a>"; webPage += "<a href=\"F2\"><button style=\"height:200px;width:200px\"><font size=\"20\">FW</font></button></a>"; webPage += "<a href=\"FR\"><button style=\"height:200px;width:200px\"><font size=\"20\">FR</font></button></a><br>"; webPage += "<a href=\"L2\"><button style=\"height:200px;width:200px\"><font size=\"20\">LT</font></button></a>"; webPage += "<a href=\"S2\"><button style=\"height:200px;width:200px\"><font size=\"20\">ST</font></button></a>"; webPage += "<a href=\"R2\"><button style=\"height:200px;width:200px\"><font size=\"20\">RT</font></button></a><br>"; webPage += "<a href=\"BL\"><button style=\"height:200px;width:200px\"><font size=\"20\">BL</font></button></a>"; webPage += "<a href=\"B2\"><button style=\"height:200px;width:200px\"><font size=\"20\">BC</font></button></a>"; webPage += "<a href=\"BR\"><button style=\"height:200px;width:200px\"><font size=\"20\">BR</font></button></a></div>"; webPage += "<div align=\"center\"><h1>SPEED CHANGE</h1>"; webPage += "<a href=\"SE1\"><button style=\"height:200px;width:200px\"><font size=\"20\">1</font></button></a>"; webPage += "<a href=\"SE2\"><button style=\"height:200px;width:200px\"><font size=\"20\">2</font></button></a>"; webPage += "<a href=\"SE3\"><button style=\"height:200px;width:200px\"><font size=\"20\">3</font></button></a><br>"; webPage += "<a href=\"SE4\"><button style=\"height:200px;width:200px\"><font size=\"20\">4</font></button></a>"; webPage += "<a href=\"SE5\"><button style=\"height:200px;width:200px\"><font size=\"20\">5</font></button></a>"; webPage += "<a href=\"SE6\"><button style=\"height:200px;width:200px\"><font size=\"20\">6</font></button></a><br>"; webPage += "<a href=\"SE7\"><button style=\"height:200px;width:200px\"><font size=\"20\">7</font></button></a>"; webPage += "<a href=\"SE8\"><button style=\"height:200px;width:200px\"><font size=\"20\">8</font></button></a>"; webPage += "<a href=\"SE9\"><button style=\"height:200px;width:200px\"><font size=\"20\">9</font></button></a>"; // preparing GPIOs pinMode(ENA, OUTPUT); //digitalWrite(ENA, 0); pinMode(ENB, OUTPUT); //digitalWrite(ENB, 0); pinMode(IN_1, OUTPUT); // digitalWrite(IN_1, 0); pinMode(IN_2, OUTPUT); // digitalWrite(IN_2, 0); pinMode(IN_3, OUTPUT); // digitalWrite(IN_3, 0); pinMode(IN_4, OUTPUT); // digitalWrite(IN_4, 0); server.on("/", []() { server.send(200, "text/html", webPage); }); server.on("/FL", []() { server.send(200, "text/html", webPage); FL(); }); server.on("/F2", []() { server.send(200, "text/html", webPage); F2(); }); server.on("/FR", []() { server.send(200, "text/html", webPage); FR(); }); server.on("/L2", []() { server.send(200, "text/html", webPage); L2(); }); server.on("/S2", []() { server.send(200, "text/html", webPage); S2(); }); server.on("/R2", []() { server.send(200, "text/html", webPage); R2(); }); server.on("/BL", []() { server.send(200, "text/html", webPage); BL(); }); server.on("/B2", []() { server.send(200, "text/html", webPage); B2(); }); server.on("/BR", []() { server.send(200, "text/html", webPage); BR(); }); server.on("/SE1", []() { server.send(200, "text/html", webPage); CS(1); }); server.on("/SE2", []() { server.send(200, "text/html", webPage); CS(2); }); server.on("/SE3", []() { server.send(200, "text/html", webPage); CS(3); }); server.on("/SE4", []() { server.send(200, "text/html", webPage); CS(4); }); server.on("/SE5", []() { server.send(200, "text/html", webPage); CS(5); }); server.on("/SE6", []() { server.send(200, "text/html", webPage); CS(6); }); server.on("/SE7", []() { server.send(200, "text/html", webPage); CS(7); }); server.on("/SE8", []() { server.send(200, "text/html", webPage); CS(8); }); server.on("/SE9", []() { server.send(200, "text/html", webPage); CS (9); }); server.begin(); Serial.println("HTTP server started"); } /*******************************************/ void FL() { analogWrite(ENA, speedCar); analogWrite(ENB, speedCar / speedTrun); digitalWrite(IN_1, 0); digitalWrite(IN_2, 1); digitalWrite(IN_3, 0); digitalWrite(IN_4, 1); } void F2() { digitalWrite(ENA, 1); digitalWrite(ENB, 1); digitalWrite(IN_1, 0); digitalWrite(IN_2, 1); digitalWrite(IN_3, 0); digitalWrite(IN_4, 1); } void FR() { analogWrite(ENA, speedCar / speedTrun); analogWrite(ENB, speedCar); digitalWrite(IN_1, 0); digitalWrite(IN_2, 1); digitalWrite(IN_3, 0); digitalWrite(IN_4, 1); } void L2() { analogWrite(ENA, speedCar); analogWrite(ENB, speedCar); digitalWrite(IN_1, 0); digitalWrite(IN_2, 1); digitalWrite(IN_3, 1); digitalWrite(IN_4, 0); } void S2() { digitalWrite(IN_1, 0); digitalWrite(IN_2, 0); digitalWrite(IN_3, 0); digitalWrite(IN_4, 0); } void R2() { analogWrite(ENA, speedCar); analogWrite(ENB, speedCar); digitalWrite(IN_1, 1); digitalWrite(IN_2, 0); digitalWrite(IN_3, 0); digitalWrite(IN_4, 1); } void BL() { analogWrite(ENA, speedCar); analogWrite(ENB, speedCar / speedTrun); digitalWrite(IN_1, 1); digitalWrite(IN_2, 0); digitalWrite(IN_3, 1); digitalWrite(IN_4, 0); } void B2() { analogWrite(ENA, speedCar); analogWrite(ENB, speedCar); digitalWrite(IN_1, 1); digitalWrite(IN_2, 0); digitalWrite(IN_3, 1); digitalWrite(IN_4, 0); } void BR() { analogWrite(ENA, speedCar / speedTrun); analogWrite(ENB, speedCar); digitalWrite(IN_1, 1); digitalWrite(IN_2, 0); digitalWrite(IN_3, 1); digitalWrite(IN_4, 0); } void CS(int NUM) { speedCar = 255 - (9 - NUM) * speedInterval; analogWrite(ENA, speedCar); analogWrite(ENB, speedCar); } /*******************************************/ void loop() { server.handleClient(); }
代码参考太极创客网站
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。