WiFi避障小车
硬件清單:
Wemos D1(支持AP模式也就是路由模式和STA模式也就是上網設備)、超聲波模塊、小車、L9110s步進電機控制器
軟件:
eclipse、arduino IDE
WiFi配置參考博文
ESP8266WiFi庫:
從上圖中可以看出ESP8266WiFi庫主要包含Station、Soft AP、config、WiFiClient、WiFiServer、scan、hostname,本節主要介紹Station相關的函數使用。
動態IP方式連接WiFi熱點
#include "ESP8266WiFi.h" char* ssid = "sand"; char* passwd = "12345678"; void setup() {Serial.begin(115200);// Set WiFi to station modeWiFi.mode(WIFI_STA);WiFi.begin(ssid, passwd);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.println("connecting......");}Serial.println("Connect to router successfully!");Serial.println(String("mac address is ")+WiFi.macAddress()); } void loop() {if (WiFi.status() == WL_CONNECTED){Serial.println("Connect to router success");Serial.println(String("Subnet mask is ")+WiFi.subnetMask().toString());Serial.println(String("gatewayIP address is ")+WiFi.gatewayIP().toString());Serial.println(String("dnsIP address is ")+WiFi.dnsIP().toString());Serial.println(String("SSID is ") + WiFi.SSID());Serial.println(String("PSK is ") + WiFi.psk());Serial.println(String("BSSID is ") + WiFi.BSSIDstr());Serial.println(String("RSSI is ") + WiFi.RSSI());Serial.println(WiFi.localIP());}else{Serial.println("Connect to router failed"); }// Wait a bit before scanning againdelay(1000); }串口輸出如下:
Connect to router success Subnet mask is 255.255.255.0 gatewayIP address is 192.168.43.1 dnsIP address is 192.168.43.1 SSID is HUAWEI PSK is FHN12345 BSSID is F4:63:1F:7D:AB:69 RSSI is -51 192.168.43.5//這個是想要固定的IP地址Wemos作為設備動態接入WiFi:
#include <ESP8266WiFi.h> char *ssid="HUAWEI"; char *passwd="FHN12345"; void initWifiSta()//wifi初始化函數 {WiFi.mode(WIFI_STA);//設置STA模式WiFi.begin(ssid,passwd);//連接網絡while(WiFi.status()!=WL_CONNECTED)//判斷是否接入WiFi,如果接入WiFi.status()=WL_CONNECTED{Serial.print(".");delay(500);Serial.println(WiFi.localIP());//通過串口打印wemos的IP地址delay(500);} } void setup() {Serial.begin(115200);initWifiSta(); }void loop() {Serial.println(WiFi.localIP());delay(500); }Wemos作為設備靜態接入WiFi:
#include "ESP8266WiFi.h" char* ssid = "HUAWEI"; char* passwd = "FHN12345"; IPAddress local_static_ip(192,168,43,5); IPAddress local_gateway(192,168,43,1); IPAddress local_subnet(255,255,255,0); IPAddress local_dns_ip(192,168,43,1); void setup() {Serial.begin(115200);// Set WiFi to station modeWiFi.mode(WIFI_STA);WiFi.begin(ssid, passwd);WiFi.config(local_static_ip, local_gateway, local_subnet, local_dns_ip);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.println("connecting......");}Serial.println("Connect to router successfully!");Serial.println(String("mac address is ")+WiFi.macAddress()); } void loop() {if (WiFi.status() == WL_CONNECTED){Serial.println("Connect to router success");Serial.println(String("IP address is ")+WiFi.localIP().toString());Serial.println(String("Subnet mask is ")+WiFi.subnetMask().toString());Serial.println(String("gatewayIP address is ")+WiFi.gatewayIP().toString());Serial.println(String("dnsIP address is ")+WiFi.dnsIP().toString());Serial.println(String("SSID is ") + WiFi.SSID());Serial.println(String("PSK is ") + WiFi.psk());Serial.println(String("BSSID is ") + WiFi.BSSIDstr());Serial.println(String("RSSI is ") + WiFi.RSSI());}else{Serial.println("Connect to router failed"); }// Wait a bit before scanning againdelay(1000); }串口打印如下:
Connect to router success IP address is 192.168.43.5 Subnet mask is 255.255.255.0 gatewayIP address is 192.168.43.1 dnsIP address is 192.168.43.1 SSID is HUAWEI PSK is FHN12345 BSSID is F4:63:1F:7D:AB:69//MAC RSSI is -54研發常說的C/S模式:
其實就是服務器和客戶端的關系,服務器兩大要素:1、地址(IP地址、域名等)2、端口號:(一臺電腦或者設備有多個服務,每個服務用端口號區別)。比如:醫院地址就可以類比為服務器地址,不同的科室去不同的地方類比端口號。
編程Wemos服務器,手機TCP工具控制舵機的旋轉:
#include <Servo.h> #include "ESP8266WiFi.h" #define DuoPin 4 Servo myduoji; char* ssid = "HUAWEI"; char* passwd = "FHN12345";int port=4466;//端口號 WiFiServer server(port);//設置服務器端口號,將Wemos作為服務器,為其他設備接入提供端口號,server是自己定義的IPAddress local_static_ip(192,168,43,5); IPAddress local_gateway(192,168,43,1); IPAddress local_subnet(255,255,255,0); IPAddress local_dns_ip(192,168,43,1); void setup() {Serial.begin(115200);// Set WiFi to station modeWiFi.mode(WIFI_STA);WiFi.begin(ssid, passwd);WiFi.config(local_static_ip, local_gateway, local_subnet, local_dns_ip);server.begin();//啟動服務器開始服務myduoji.attach(DuoPin);//連接舵機myduoji.write(98); } void loop() {char cmd;WiFiClient client=server.available();//初始化服務器while(client.connected()){//當沒有接入的時候client.connected()是0,當接入的時候client.connected()是非零進入循環while(client.available()>0){//判斷有沒有數據的到來cmd=client.read();//將命令讀取到cmdif(cmd=='1'){myduoji.write(98);}else if(cmd=='2'){myduoji.write(180); }}} }編程Wemos服務器,手機TCP工具控制電機的旋轉:
#include <Servo.h> #include "ESP8266WiFi.h" #define DuoPin 4 #define BehindLight1 5 #define BehindLight0 16 #define BehindRight1 0 #define BehindRight0 2Servo myduoji; char* ssid = "HUAWEI"; char* passwd = "FHN12345";int port=4466;//端口號 WiFiServer server(port);//設置服務器端口號,將Wemos作為服務器,為其他設備接入提供端口號,server是自己定義的IPAddress local_static_ip(192,168,43,5); IPAddress local_gateway(192,168,43,1); IPAddress local_subnet(255,255,255,0); IPAddress local_dns_ip(192,168,43,1); void initL9()//初始化L9電機驅動模塊 {pinMode(BehindLight1,OUTPUT);pinMode(BehindLight0,OUTPUT);pinMode(BehindRight1,OUTPUT);pinMode(BehindRight0,OUTPUT); } void initSg() {myduoji.write(105); } void forward() {digitalWrite(BehindLight1,HIGH);digitalWrite(BehindLight0,LOW);digitalWrite(BehindRight1,HIGH);digitalWrite(BehindRight0,LOW); } void retreat() {digitalWrite(BehindLight1,LOW);digitalWrite(BehindLight0,HIGH);digitalWrite(BehindRight1,LOW);digitalWrite(BehindRight0,HIGH); } void Stop() {digitalWrite(BehindLight1,LOW);digitalWrite(BehindLight0,LOW);digitalWrite(BehindRight1,LOW);digitalWrite(BehindRight0,LOW); } void setup() {Serial.begin(115200);// Set WiFi to station modeWiFi.mode(WIFI_STA);WiFi.begin(ssid, passwd);WiFi.config(local_static_ip, local_gateway, local_subnet, local_dns_ip);server.begin();//啟動服務器開始服務myduoji.attach(DuoPin);//連接舵機initSg();initL9(); } void loop() {char cmd;WiFiClient client=server.available();//初始化服務器while(client.connected()){//當沒有接入的時候client.connected()是0,當接入的時候client.connected()是非零進入循環while(client.available()>0){//判斷有沒有數據的到來cmd=client.read();//將命令讀取到cmdif(cmd=='1'){forward();delay(2000);Stop();}else if(cmd=='2'){retreat();delay(2000);Stop(); }}}Serial.println(WiFi.localIP()); }代碼的綜合實現:
#include <Servo.h> #include "ESP8266WiFi.h" #define DuoPin 4 #define BehindLight1 5 #define BehindLight0 16 #define BehindRight1 0 #define BehindRight0 2 #define Beep D5 Servo myduoji; char* ssid = "HUAWEI"; char* passwd = "FHN12345";int port = 4466; //端口號 WiFiServer server(port);//設置服務器端口號,將Wemos作為服務器,為其他設備接入提供端口號,server是自己定義的IPAddress local_static_ip(192, 168, 43, 5); IPAddress local_gateway(192, 168, 43, 1); IPAddress local_subnet(255, 255, 255, 0); IPAddress local_dns_ip(192, 168, 43, 1); void initL9()//初始化L9電機驅動模塊 {pinMode(BehindLight1, OUTPUT);pinMode(BehindLight0, OUTPUT);pinMode(BehindRight1, OUTPUT);pinMode(BehindRight0, OUTPUT); } void initSg() {myduoji.write(105); } void forward() {digitalWrite(BehindLight1, HIGH);digitalWrite(BehindLight0, LOW);digitalWrite(BehindRight1, HIGH);digitalWrite(BehindRight0, LOW); } void retreat() {digitalWrite(BehindLight1, LOW);digitalWrite(BehindLight0, HIGH);digitalWrite(BehindRight1, LOW);digitalWrite(BehindRight0, HIGH); } void Stop() {digitalWrite(BehindLight1, LOW);digitalWrite(BehindLight0, LOW);digitalWrite(BehindRight1, LOW);digitalWrite(BehindRight0, LOW); } void Lift() {myduoji.write(135); } void Right() {myduoji.write(75); } void initBeep() {pinMode(Beep, OUTPUT);digitalWrite(Beep, HIGH); } void Bee() {while (WiFi.status() != WL_CONNECTED) //判斷是否接入WiFi,如果接入WiFi.status()=WL_CONNECTED{digitalWrite(Beep, LOW);delay(1000);digitalWrite(Beep, HIGH);delay(1000);} } void setup() {Serial.begin(115200);// Set WiFi to station modeWiFi.mode(WIFI_STA);WiFi.begin(ssid, passwd);WiFi.config(local_static_ip, local_gateway, local_subnet, local_dns_ip);server.begin();//啟動服務器開始服務myduoji.attach(DuoPin);//連接舵機initBeep();initSg();initL9();} void loop() {char cmd;Bee();//如果處于未連接狀態,蜂鳴器響WiFiClient client = server.available(); //初始化服務器while (client.connected()) { //當沒有接入的時候client.connected()是0,當接入的時候client.connected()是非零進入循環while (client.available() > 0) { //判斷有沒有數據的到來cmd = client.read(); //將命令讀取到cmdswitch (cmd) {case'q':forward();break;case'h':retreat();break;case'z':Lift();break;case'y':Right();break;case's':Stop();break;case'd':initSg();break;}}}Serial.println(WiFi.localIP()); }安卓app的設置:
-
導入工程文件
-
①
-
②
-
③
-
④在電腦的模擬器上面運行
-
⑤如果不能在虛擬機上運行,則按以下步驟執行,打開Eclipse的路徑找到platform-tools
-
⑥找到SDK
-
⑦找到adb.exe并復制路徑
-
⑧找到對應的盤,輸入adb的路徑,dir查看路徑下的文件。并輸入adb connect 127.0.0.1:62001,這里127.0.0.1是本機地址,62001是模擬器端口號。
將程序發送到手機:程序在bin文件夾下面。
總結
- 上一篇: 图像文件类型
- 下一篇: 校园表白墙网站源码 带网站后台