Wio-Terminal---通过HTTP协议遥控电机
Wio-terminal作为客户端,ESP8266作为服务器,接收Wio-terminal发送的信息,控制电机的旋转。
标签
嵌入式系统
好喝的娃哈哈
更新2022-04-01
济南大学
1165

一,项目介绍

本项目主要使用了Wio-terminal板卡和ESP8266开发板两块开发板,其中Wio-terminal作为HTTP通信中的客户端,ESP8266作为服务器端,接收来自Wio-terminal的控制信号,从而实现无线遥控,下面来介绍一下这两个板卡。

1.Wio-terminal

看看他帅气的外观和官方介绍(官方链接),这次项目中主要用到了WIFI模块,五项按键,LCD屏幕。

Wio-Terminal-Wiki.jpg

Wio Terminal 是基于SAMD51的微控制器,具有 Realtek RTL8720DN 支持的无线连接,与Arduino和MicroPython兼容。它的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。它同时支持蓝牙和Wi-Fi,为物联网项目提供了骨架。Wio Terminal自身配有 a 2.4” LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和红外发射器(IR 940nm)。 最重要的是它还有两个用于Grove生态系统的多功能Grove端口和40个Raspberry pi兼容的GPIO引脚,用于支持更多附加组件。

2.ESP8266WIFI开发板

查看源图像

二,程序框架

FlphgqYEFUUJRyTXF0t-rkibg6FS

三,程序介绍

本项目主要分为客户端和服务端,先介绍一下客户端(WIO-termianl)程序

#include <rpcWiFi.h>
#include <TFT_eSPI.h>
#include <SPI.h>

#define black TFT_BLACK  //定义颜色
#define white TFT_WHITE
#define red TFT_RED

TFT_eSPI tft = TFT_eSPI();  //将屏幕对象化

const char* ssid = "8888";    //设置WiFi网络
const char* password = "12345789";

const int httpport = 80;      //设置网络端口
const char* host = "192.168.204.4";   //设置连接IP地址

int Flag;            //定义电机状态标识


void setup()
{
  Serial.begin(9600);

  tft.init();
  tft.fillScreen(TFT_WHITE);
  tft.setTextColor(TFT_RED);
  tft.setTextSize(3);
  tft.setRotation(3);                     //屏幕初始化,设置屏幕背景为白色,字体颜色为红色,字体大小为三号,屏幕方向为3号

  int i;
  for (i = 1; i <= 8; i++) {
    tft.drawFastHLine(0, i * 40, 320, black);
  }
  tft.drawString("Hello! Remote", 0, 19);   //绘制六条水平线  

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(250);
    Serial.print(". ");
  }                                        //连接WiFi
  
  tft.drawString("WiFi SSID:", 0, 59);
  tft.drawString(ssid, 200, 59);
  tft.drawString("Connected IP:", 0, 99);
  tft.drawString(host, 0, 139);        

  button_init();                           //按键初始化
}  

void loop() {
  tft.setTextColor(red);
  
  if (digitalRead(WIO_5S_UP) == LOW) {
    tft.fillRect(0,181,320,19,white);
    tft.drawString("UP",0,179);
    Flag = 1;
  }
  else if (digitalRead(WIO_5S_DOWN) == LOW) {
    tft.fillRect(0,181,320,19,white);
    tft.drawString("DOWN", 0,179);
    Flag = 2;
  }
  else if (digitalRead(WIO_5S_LEFT) == LOW) {
    tft.fillRect(0,181,320,19,white);
    tft.drawString("LEFT", 0,179);
    Flag = 3;
  }
  else if (digitalRead(WIO_5S_RIGHT) == LOW) {
    tft.fillRect(0,181,320,19,white);
    tft.drawString("RIGHT", 0,179);
    Flag = 4;
  }
  else if (digitalRead(WIO_5S_PRESS) == LOW) {
    tft.fillRect(0,181,320,19,white);
    tft.drawString("PRESS", 0,179);
    Flag = 5;
  }                                                    //检测按键,显示状态

  WiFiClient client;                                   //初始化WiFi网络,建立客户端对象
  Serial.println("Connect to...");
  Serial.print(host);

  String url = "/update?flag=" + String(Flag);         

  String httpRequest = String("GET ") + url + " HTTP/1.1\r\n" +
                       "Host: " + host + "\r\n" +
                       "Connection: close\r\n" +
                       "\r\n";                         //HTTP请求  
  Serial.print("\r\n");
  if (client.connect(host, 80)) {
    Serial.println(" Success");
    client.print(httpRequest);                         //发送http请求
    Serial.println("Sending request: ");
    Serial.println(httpRequest);
  }
  else {
    Serial.println(" failed");
  }
  delay(1000);
  }
void button_init()
{
  pinMode(WIO_KEY_A, INPUT_PULLUP);
  pinMode(WIO_KEY_B, INPUT_PULLUP);
  pinMode(WIO_KEY_C, INPUT_PULLUP);
  pinMode(WIO_5S_UP, INPUT_PULLUP);
  pinMode(WIO_5S_DOWN, INPUT_PULLUP);
  pinMode(WIO_5S_LEFT, INPUT_PULLUP);
  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);
  pinMode(WIO_5S_PRESS, INPUT_PULLUP);
}

显示效果

FkXG_Zm7r3X7zRW3l4-5LvCcSRl4

服务端程序

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

ESP8266WebServer ESPServer(80);  //实例化网页服务

const char* ssid = "8888";
const char* password = "12345789";

IPAddress local_IP(192, 168, 68, 4); //配置网络参数
IPAddress gateway(192, 168, 68, 64); //静态IP地址
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(8, 8, 8, 8);


const int M1A = 5;
const int M1B = 4;
const int M2A = 0;
const int M2B = 2;
const int M3A = 14;
const int M3B = 12;
const int M4A = 13;
const int M4B = 15;

void setup() {
  Serial.begin(9600);
  if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("Failed to config");
  }
  Serial.println("WiFi connect...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(". ");
  }
  pinMode(M1A, OUTPUT);
  pinMode(M1B, OUTPUT);
  pinMode(M2A, OUTPUT);
  pinMode(M2B, OUTPUT);
  pinMode(M3A, OUTPUT);
  pinMode(M3B, OUTPUT);
  pinMode(M4A, OUTPUT);
  pinMode(M4B, OUTPUT);
  Serial.println("WiFi ssid: ");
  Serial.println(WiFi.SSID());
  Serial.println("WiFi IP: ");
  Serial.println(WiFi.localIP());

  ESPServer.on("/update", handleInfo);
  ESPServer.begin();
  Serial.println("ESPServer Started");
}
void loop() {
  
  ESPServer.handleClient(); 
}
void handleInfo() {
  int flag = ESPServer.arg("flag").toInt(); 
  ESPServer.send(200, "text/plain", "Received");

  switch (flag) {
    case 1:
      UP();
      break;
    case 2:
      DOWN();
      break;
    case 3:
      STOP();
      break;
  }
  delay(200);

  Serial.print("direction: ");
  switch (flag) {
    case 1:
      Serial.println("UP");
      break;
    case 2:
      Serial.println("DOWN");
      break;
    case 3:
      Serial.println("LEFT");
      break;
    case 4:
      Serial.println("RIGHT");
      break;
  }
  Serial.println("===============================");
  delay(100);

}

void UP() {
  digitalWrite(M1A, HIGH);
  digitalWrite(M1B, LOW);
  digitalWrite(M2A, HIGH);
  digitalWrite(M2B, LOW);
  digitalWrite(M3A, HIGH);
  digitalWrite(M3B, LOW);
  digitalWrite(M4A, HIGH);
  digitalWrite(M4B, LOW);
}

void DOWN() {
  digitalWrite(M1A, LOW);
  digitalWrite(M1B, HIGH);
  digitalWrite(M2A, LOW);
  digitalWrite(M2B, HIGH);
  digitalWrite(M3A, LOW);
  digitalWrite(M3B, HIGH);
  digitalWrite(M4A, LOW);
  digitalWrite(M4B, HIGH);
}
void STOP() {
  digitalWrite(M1A, LOW);
  digitalWrite(M1B, LOW);
  digitalWrite(M2A, LOW);
  digitalWrite(M2B, LOW);
  digitalWrite(M3A, LOW);
  digitalWrite(M3B, LOW);
  digitalWrite(M4A, LOW);
  digitalWrite(M4B, LOW);
}

通过Wio-terminal的五项摇杆按键来控制与ESP8266相连的两个电机。

Fujb71sF1FUdpjNLR8hvx_bdyymW

五,小结

由于疫情和开学原因,没有小车模型,只能控制两个电机意思一下,后续还有可能使用IMU传感器实现重力控制。

最后,感谢硬禾学堂提供的这次机会。

附件下载
Car.ino
IP地址配置要根据自身WIfi网络配置,WiFi配置需自定义
Wio____.ino
团队介绍
个人
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号