Projecten/Robotwars250g

Uit Hackerspace Drenthe WIKI

Battlebots ant robot

We gaan een op afstand bestuurbare robot op wielen ontwerpen in de meest simpele en goedkope vorm waarmee we wedstrijden kunnen doen zoals robotvoetbal, capture the flag, etc. De kostprijs zal maximaal rond de 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 150 gram wegen (Battlebots antweight klasse).

Wie doet er mee?

  • Wally
  • Rein
  • Hen3
  • ???


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 per 2
  • 1 x ESP8266 (of eventueel ESP32) -- 4 euro per stuk
  • 1 x motor driver -- 2,50 euro per stuk
  • 18650 batterij + houder+lader -- 6 euro per set
  • 1 x DIY chassis -- 0 euro (zelf maken) of 3 euro (3d geprint)

Opmerkingen over de onderdelen:

  • De ESP8266 en de ESP32 zijn bijna even duur. De ESP32 is beter maar van de ESP8266 hebben we er nog een stuk of 30 liggen.
  • De 18650 batterij is groot en zwaar maar wel goedkoop en simpel.Uitzoeken wat de opties zijn voor een kleine RC-batterij. Als dit qua prijs gunstig uitvalt dan deze overwegen.

Todo

  • Ontwerp maken voor standaard chassis (3d printer?)
  • Ontwerp maken voor standaard elektronica
  • Ontwerp maken voor standaard firmware
  • Ontwerp maken voor app (of bestaande sw gebruiken)
  • Ontwerpen van diverse varianten

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. Je kunt hem met je webbrowser besturen dus je hebt geen app nodig.

/**
  @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);
}