Projecten/Robotwars250g: verschil tussen versies

Uit Hackerspace Drenthe WIKI
Regel 36: Regel 36:


=== Voorbeeld sourcecode ESP8266 firmware ===
=== Voorbeeld sourcecode ESP8266 firmware ===
Deze sourcecode kun je in de Arduino IDE bewerken/uploaden
Deze sourcecode kun je in de Arduino IDE bewerken/uploaden. Dit is slechts een werkend voorbeeld. Laat je niet weerhouden om het beter te doen.
  /**
  /**
   @file    wifi_car_esp8266_STA.ino
   @file    wifi_car_esp8266_STA.ino

Versie van 8 feb 2024 09:41

Robotwars low budget mini robot

We gaan een op afstand bestuurbare robot op wielen ontwerpen in de meest simpele/goedkope vorm waarmee we wedstrijden kunnen doen zoals robotwars, robotvoetbal, etc. De kostprijs zal maximaal tussen de 10 en 20 euro liggen. De robot is eenvoudig in elkaar te zetten en daarmee zeer geschikt om te bouwen tijdens workshops en om mee te spelen tijdens evenementen. De hele robot zal niet meer dan plusminus 250 gram wegen (ivm veiligheid + kosten).

Wie doet er mee?

  • Wally
  • Rein
  • ???


De globale werking

Vooralsnog gaan we uit van een ESP8266 microcontroller. De ESP32 is ook een optie. De ESP heeft een WIFI module. Hierdoor kunnen we met een smartphone commando's kunnen sturen naar de robot. De robot leest deze commando's en stuurt op zijn beurt de motordriver aan waarmee we de motortjes kunnen laten bewegen (en leds/speakers/servos aansturen)

De onderdelen + kosten

Hieronder een lijstje met de onderdelen die we denken nodig te hebben met daarachter de aliexpress prijs (bij kleine aantallen/stuks)

  • 2 x N20 motor 6Volt 500 RPM --- 2 euro
  • 1 x ESP8266 (of eventueel ESP32) -- 4 euro
  • 1 x motor driver -- 2,50 euro
  • 18650 batterij + houder -- 6 euro
  • 1 x DIY chassis -- 0 euro

Todo

  • Ontwerp maken voor chassis (3d printer?)
  • Ontwerp maken voor elektronica
  • Ontwerp maken voor firmware
  • Ontwerp maken voor app (of bestaande sw gebruiken)

Stand van zaken

  • 20240201 - Onderdelen zijn besteld voor de eerste prototypes (Rein)



Technische details

Voorbeeld sourcecode ESP8266 firmware

Deze sourcecode kun je in de Arduino IDE bewerken/uploaden. Dit is slechts een werkend voorbeeld. Laat je niet weerhouden om het beter te doen.

/**
  @file    wifi_car_esp8266_STA.ino
  @brief   Simple example of Wifi Car controlled by a web server in AP Mode. See also :
           http://www.instructables.com/id/A-very-cheap-ESP8266-WiFi-smart-car-controlled-by-/

           Example of commands to control the car :

           MOVE:
           - http://<YourIP>:<YourPort>/move?dir=F (Forward)
           - http://<YourIP>:<YourPort>/move?dir=B (Bacward)

           ACTION:
           - http://<YourIP>:<YourPort>/action?type=1 (Action 1)
           - http://<YourIP>:<YourPort>/action?type=1 (Action 2)


  @author  LACOUR Vincent
  @date    2019-10
*/

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

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

const int port = 80;
ESP8266WebServer server(port);

static const uint8_t pwm_A = 5 ;
static const uint8_t pwm_B = 4;
static const uint8_t dir_A = 0;
static const uint8_t dir_B = 2;

int motor_speed = 1024;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(pwm_A, OUTPUT); // PMW A
  pinMode(pwm_B, OUTPUT); // PMW B
  pinMode(dir_A, OUTPUT); // DIR A
  pinMode(dir_B, OUTPUT); // DIR B

  Serial.begin(115200);
  Serial.print("Connecting to : ");
  Serial.println(ssid);

  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);

  WiFi.disconnect();
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    pinMode(LED_BUILTIN, LOW);
    delay(250);
    pinMode(LED_BUILTIN, HIGH);
    delay(250);
    Serial.print(".");
  }

  Serial.println("Connection established!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/move", HTTP_GET, handleMoveRequest);
  server.on("/action", HTTP_GET, handleActionRequest);
  server.onNotFound(handleNotFound);
  server.begin();
}

void loop() {
  server.handleClient();
}

void handleMoveRequest() {
  if (!server.hasArg("dir")) {
    server.send(404, "text / plain", "Move: undefined");
    return;
  }
  String direction = server.arg("dir");
  if (direction.equals("F")) {
    forward();
    server.send(200, "text / plain", "Move: forward");
  }
  else if (direction.equals("B")) {
    backward();
    server.send(200, "text / plain", "Move: backward");
  }
  else  if (direction.equals("S")) {
    stop_motors();
    server.send(200, "text / plain", "Move: stop");
  }
  else  if (direction.equals("L")) {
    turn_left();
    server.send(200, "text / plain", "Turn: Left");
  }
  else  if (direction.equals("R")) {
    turn_right();
    server.send(200, "text / plain", "Turn: Right");
  }
  else {
    server.send(404, "text / plain", "Move: undefined");
  }
}


void handleActionRequest() {
  if (!server.hasArg("type")) {
    server.send(404, "text / plain", "Action: undefined");
    return;
  }
  String type = server.arg("type");
  if (type.equals("1")) {
    // TODO : Action 1
    server.send(200, "text / plain", "Action 1");
  }
  else if (type.equals("2")) {
    // TODO : Action 2
    server.send(200, "text / plain", "Action 2");
  }
  else if (type.equals("3")) {
    // TODO : Action 3
    server.send(200, "text / plain", "Action 3");
  }
  else if (type.equals("4")) {
    // TODO : Action 4
    server.send(200, "text / plain", "Action 4");
  }
  else if (type.equals("5")) {
    // TODO : Action 5
    server.send(200, "text / plain", "Action 5");
  }
  else if (type.equals("6")) {
    // TODO : Action 6
    server.send(200, "text / plain", "Action 6");
  }
  else if (type.equals("7")) {
    // TODO : Action 7
    server.send(200, "text / plain", "Action 7");
  }
  else if (type.equals("8")) {
    // TODO : Action 8
    server.send(200, "text / plain", "Action 8");
  }
  else {
    server.send(404, "text / plain", "Action: undefined");
  }
}

void handleNotFound() {
  server.send(404, "text / plain", "404: Not found");
}


void stop_motors() {
  analogWrite(pwm_A, 0);
  analogWrite(pwm_B, 0);
}

void backward() {
  analogWrite(pwm_A, motor_speed);
  analogWrite(pwm_B, motor_speed);
  digitalWrite(dir_A, LOW);
  digitalWrite(dir_B, HIGH);
}

void forward() {
  analogWrite(pwm_A, motor_speed);
  analogWrite(pwm_B, motor_speed);
  digitalWrite(dir_A, HIGH);
  digitalWrite(dir_B, LOW);
}

void turn_left() {
  analogWrite(pwm_A, motor_speed);
  analogWrite(pwm_B, motor_speed);
  digitalWrite(dir_A, HIGH);
  digitalWrite(dir_B, HIGH);
}

void turn_right() {
  analogWrite(pwm_A, motor_speed);
  analogWrite(pwm_B, motor_speed);
  digitalWrite(dir_A, LOW);
  digitalWrite(dir_B, LOW);
}