Радиоуправляемая воздушная лодка с NodeMCU и Arduino

Привет меня зовут Алекс. И время от времени я люблю решать небольшие задачи для себя. У меня довольно плотный график, поэтому у меня не так много времени для творчества.
Поэтому, если я хочу, чтобы что-то работало, мне нужно сделать это очень быстро.

На его сборку у меня ушло 14 часов, включая поход в торговый центр за пенополистиролом и древесиной. Меня захлестнула эта идея — очень быстро построить что-то реальное и получить от этого удовольствие.

Аппаратные части

  • NodeMCU 32-х
  • Ардуино Уно
  • Шаговый двигатель 28byj-48
  • Бесщеточный двигатель
  • светодиодная лента
  • 3,7В х 3 аккумулятора

Вот и все. Это все, что мне понадобилось для создания этой штуки.

Общая схема

mycode_bb.jpg

узелMCU создал сеть wi-fi. Таким образом, я мог добраться до его ip и увидеть какую-то супер простую веб-страницу с 3 кнопками. После щелчка по каждому из них он отправляет запрос GET на nodeMCU.
2019-06-02 13.51.12.jpg

Вот код



#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);
      } 
}
  
}

Процесс разработки

Перед запуском этой модели я сделал несколько быстрых измерений. Как сложно построить модель. Какие части я умею делать, а какие нет. И я сделал это перед сном. Хорошей практикой является мысленный обзор проекта, чтобы увидеть все его узкие части.

После этого я начал тестировать все жесткие части. Я имею в виду, какой модуль подключения использовать и с каким будет достаточно просто работать. Важно избавиться от синдрома перфекциониста, чтобы добиться цели. Видите ли, моя лодка выглядит не очень вдохновляюще, я сделал ее быстро.

2019-06-02 13.38.25.jpg

вот видео

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *