Projecten/Robotwars250g: verschil tussen versies

Uit Hackerspace Drenthe WIKI
Geen bewerkingssamenvatting
 
(11 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 1: Regel 1:
== Robotwars low budget mini robot ==
== Battlebots ant robot ==
We gaan een op afstand bestuurbare robot op wielen ontwerpen in de meest simpele/goedkope vorm waarmee we wedstrijden kunnen doen zoals robotwarsrobotvoetbal,  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.
We gaan een op afstand bestuurbare robot op wielen ontwerpen in de meest simpele en goedkope vorm waarmee we wedstrijden kunnen doen zoals robotvoetbalcapture 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? ==
== Wie doet er mee? ==
* Wally
* Wally
* Rein
* Rein
* Hen3
* ???
* ???


== De onderdelen ==
Hieronder een lijstje met de onderdelen die we denken nodig te hebben met daarachter de aliexpress prijs per stuk
* 2 x N20 motor 6Volt 500 RPM --- 2 euro
* 1 x ESP8266 (of eventueel ESP32) -- 4 euro
* 1 x motor driver -- 2,50 euro
* 2 x 18650 batterijen + houder -- 6 euro
* 1 x chassis -- 0 euro


== De globale werking ==
== De globale werking ==
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.
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)
 
== Technische details ==
 
=== Commando's ===
Beweging:


* M0 - robot stop
== De onderdelen + kosten ==
* M1 - robot forward
Hieronder een lijstje met de onderdelen die we denken nodig te hebben met daarachter de aliexpress prijs (bij kleine aantallen/stuks)
* M2 - robot backward
* M3 - robot turn ccw
* M4 - robot turn cw


Actuator besturing:
* 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:


* A0 - disable all actuators (weapons/tools)
* 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.
* A1 - activate actuator 1
* 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 ==
== Todo ==
* Ontwerp maken voor chassis (3d printer?)
* Ontwerp maken voor standaard chassis (3d printer?)
* Ontwerp maken voor electronika
* Ontwerp maken voor standaard elektronica
* Ontwerp maken voor firmware
* Ontwerp maken voor standaard firmware
* Ontwerp maken voor app (of bestaande sw gebruiken)
* Ontwerp maken voor app (of bestaande sw gebruiken)
* Ontwerpen van diverse varianten


== Stand van zaken ==
== Stand van zaken ==
* 20240201 - Onderdelen zijn besteld voor de eerste prototypes (Rein)
* 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 :
            <nowiki>http://www.instructables.com/id/A-very-cheap-ESP8266-WiFi-smart-car-controlled-by-/</nowiki>
            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);
}

Huidige versie van 12 feb 2024 om 14:04

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