Радиоуправляемая воздушная лодка с NodeMCU и Arduino
Привет меня зовут Алекс. И время от времени я люблю решать небольшие задачи для себя. У меня довольно плотный график, поэтому у меня не так много времени для творчества.
Поэтому, если я хочу, чтобы что-то работало, мне нужно сделать это очень быстро.
На его сборку у меня ушло 14 часов, включая поход в торговый центр за пенополистиролом и древесиной. Меня захлестнула эта идея — очень быстро построить что-то реальное и получить от этого удовольствие.
Аппаратные части
- NodeMCU 32-х
- Ардуино Уно
- Шаговый двигатель 28byj-48
- Бесщеточный двигатель
- светодиодная лента
- 3,7В х 3 аккумулятора
Вот и все. Это все, что мне понадобилось для создания этой штуки.
Общая схема
узелMCU создал сеть wi-fi. Таким образом, я мог добраться до его ip и увидеть какую-то супер простую веб-страницу с 3 кнопками. После щелчка по каждому из них он отправляет запрос GET на nodeMCU.
Вот код
#include <WiFi.h>
const char* ssid = "ESP32-Access-Point";
const char* password = "123456789";
WiFiServer server(80);
String header;
String output26State = "off";
String output27State = "off";
const int output26 = 26;
const int output27 = 27;
void setup() {
Serial.begin(115200);
pinMode(output26, OUTPUT);
pinMode(output27, OUTPUT);
digitalWrite(output26, LOW);
digitalWrite(output27, LOW);
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
server.begin();
}
void loop(){
WiFiClient client = server.available();
if (client) {
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
header += c;
if (c == '\n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
if (header.indexOf("GET /26/on") >= 0) {
Serial.print("g");
output26State = "on";
digitalWrite(output26, HIGH);
} else if (header.indexOf("GET /26/off") >= 0) {
Serial.print("s");
output26State = "off";
digitalWrite(output26, LOW);
} else if (header.indexOf("GET /27/left") >= 0) {
Serial.print("l");
} else if (header.indexOf("GET /27/right") >= 0) {
Serial.print("r");
} else if (header.indexOf("GET /27/center") >= 0) {
Serial.print("c");
}
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
client.println(".button2 {background-color: #555555;}</style></head>");
client.println("<body><h1>ESP32 Web Server</h1>");
client.println("<p>GPIO 26 - State " + output26State + "</p>");
if (output26State=="off") {
client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("<p>GPIO 27 - State " + output27State + "</p>");
client.println("<p><a href=\"/27/left\"><button class=\"button button2\">left</button></a></p>");
client.println("<p><a href=\"/27/center\"><button class=\"button button2\">center</button></a></p>");
client.println("<p><a href=\"/27/right\"><button class=\"button button2\">right</button></a></p>");
client.println("</body></html>");
client.println();
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
header = "";
client.stop();
}
}
Ардуино имел контроль над всеми двигателями. Он связывался с NodeMCU через SoftwareSerial. Вот код
char signal;
#include <SoftwareSerial.h>
#include <Stepper.h>
#include <Servo.h>
Servo ESC; // create servo object to control the ESC
const byte rxPin = 2;
const byte txPin = 3;
// set up a new serial object
SoftwareSerial mySerial (rxPin, txPin);
const int stepsPerRevolution = 64; // шагов за один оборот
const int IN1 = 4;
const int IN2 = 5;
const int IN3 = 6;
const int IN4 = 7;
void setup() {
mySerial.begin(115200);
Serial.begin(9600);
ESC.attach(9);
ESC.writeMicroseconds(1000);
myStepper.setSpeed(300);
}
void loop() {
// put your main code here, to run repeatedly:
if (mySerial.available()) {
signal = mySerial.read();
Serial.println(signal);
if (signal == 'g'){
Serial.println("yes x");
ESC.writeMicroseconds(1250); //using val as the signal to esc
}
if (signal == 's'){
ESC.writeMicroseconds(1000); //using val as the signal to esc
}
if (signal == 'l'){
myStepper.step(-300);
}
if (signal == 'r'){
myStepper.step(300);
}
}
}
Процесс разработки
Перед запуском этой модели я сделал несколько быстрых измерений. Как сложно построить модель. Какие части я умею делать, а какие нет. И я сделал это перед сном. Хорошей практикой является мысленный обзор проекта, чтобы увидеть все его узкие части.
После этого я начал тестировать все жесткие части. Я имею в виду, какой модуль подключения использовать и с каким будет достаточно просто работать. Важно избавиться от синдрома перфекциониста, чтобы добиться цели. Видите ли, моя лодка выглядит не очень вдохновляюще, я сделал ее быстро.
вот видео