Funduino Funbot
FunduinoDernière mise à jour le
Vom Zusammenbau bis zum selbstfahrenden Roboter – in elf Lektionen
Choisir un microcontrôleur
Les broches, le schéma électrique et le sketch des étapes de travail changent selon ta sélection. Celle-ci reste enregistrée.
Was den Funbot ausmacht
Den Funbot zusammenbauen
Stromversorgung
Die Module des Funbot im Überblick
Lektion 1: Die blinkenden Frontscheinwerfer
Lektion 1: Die blinkenden Frontscheinwerfer
int modul_LED = A1;
void setup()
{
pinMode(modul_LED, OUTPUT);
}
void loop()
{
digitalWrite(modul_LED, HIGH); // Scheinwerfer an
delay(1000); // eine Sekunde warten
digitalWrite(modul_LED, LOW); // Scheinwerfer aus
delay(1000); // eine Sekunde warten
}Lektion 2: Die beiden Taster auswerten
Lektion 2: Beide Taster auswerten
int modul_TasterL = A2;
int modul_TasterR = A3;
int modul_LED = A1;
int TasterL_status = 0;
int TasterR_status = 0;
void setup()
{
pinMode(modul_TasterL, INPUT);
pinMode(modul_TasterR, INPUT); // auch der rechte Taster ist ein Eingang
pinMode(modul_LED, OUTPUT);
}
void loop()
{
// Linker Taster: Scheinwerfer fuer 2 Sekunden
TasterL_status = digitalRead(modul_TasterL);
if (TasterL_status == 1)
{
digitalWrite(modul_LED, HIGH);
delay(2000);
digitalWrite(modul_LED, LOW);
}
// Rechter Taster: Scheinwerfer fuer 4 Sekunden
TasterR_status = digitalRead(modul_TasterR);
if (TasterR_status == 1)
{
digitalWrite(modul_LED, HIGH);
delay(4000);
digitalWrite(modul_LED, LOW);
}
}Lektion 3: Töne mit dem Lautsprecher
Lektion 3: Ton und Licht im Wechsel
int modul_speaker = A0;
int modul_led = A1;
void setup()
{
pinMode(modul_led, OUTPUT);
// Fuer den Lautsprecher ist kein pinMode noetig:
// der tone-Befehl kuemmert sich selbst darum.
}
void loop()
{
tone(modul_speaker, 100); // Ton mit 100 Hertz ausgeben
digitalWrite(modul_led, HIGH); // Scheinwerfer an
delay(1000);
noTone(modul_speaker); // Ton abschalten
digitalWrite(modul_led, LOW); // Scheinwerfer aus
delay(1000);
}Lektion 4: Die Antriebsmotoren
Lektion 4: Den linken Motor drehen lassen
int MSL = 9; // Motor Speed Links - Enable-Pin des linken Motors
int MotorLa = 7; // Richtungspin a
int MotorLb = 8; // Richtungspin b
void setup()
{
pinMode(MSL, OUTPUT);
pinMode(MotorLa, OUTPUT);
pinMode(MotorLb, OUTPUT);
}
void loop()
{
analogWrite(MSL, 255); // volle Geschwindigkeit (0 bis 255)
digitalWrite(MotorLa, LOW); // eine Richtung: a LOW, b HIGH
digitalWrite(MotorLb, HIGH);
}Lektion 5: Fahr, kleiner Roboter!
Lektion 5: Beide Motoren - der Funbot faehrt
int MSL = 9; // linker Motor
int MotorLa = 7;
int MotorLb = 8;
int MSR = 6; // rechter Motor
int MotorRa = 5;
int MotorRb = 4;
void setup()
{
pinMode(MSL, OUTPUT);
pinMode(MotorLa, OUTPUT);
pinMode(MotorLb, OUTPUT);
pinMode(MSR, OUTPUT);
pinMode(MotorRa, OUTPUT);
pinMode(MotorRb, OUTPUT);
}
void loop()
{
analogWrite(MSL, 255);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, HIGH);
analogWrite(MSR, 255);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, HIGH);
}Lektion 6: Der Linie folgen
Lektion 6: Der Linie folgen
int modul_Tracking = 12;
int Tracking_status = 0;
int MSL = 9;
int MotorLa = 7;
int MotorLb = 8;
int MSR = 6;
int MotorRa = 5;
int MotorRb = 4;
void setup()
{
pinMode(modul_Tracking, INPUT);
pinMode(MSL, OUTPUT);
pinMode(MotorLa, OUTPUT);
pinMode(MotorLb, OUTPUT);
pinMode(MSR, OUTPUT);
pinMode(MotorRa, OUTPUT);
pinMode(MotorRb, OUTPUT);
}
void loop()
{
Tracking_status = digitalRead(modul_Tracking);
if (Tracking_status == 1)
{
// Heller Untergrund erkannt: Rechtskurve,
// der linke Motor dreht schnell, der rechte langsam.
analogWrite(MSL, 255);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, HIGH);
analogWrite(MSR, 40);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, HIGH);
}
else
{
// Dunkle Linie erkannt: Linkskurve,
// jetzt dreht der rechte Motor schnell.
analogWrite(MSL, 40);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, HIGH);
analogWrite(MSR, 255);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, HIGH);
}
}Lektion 7: Abstand messen mit Ultraschall
Lektion 7: Abstand messen und bei unter 30 cm leuchten
int modul_led = A1;
int modul_trigger = 10;
int modul_echo = 11;
float entfernung = 0;
float gemessene_zeit = 0;
float zeit_pro_strecke = 0;
// Schallgeschwindigkeit in Zentimetern je Mikrosekunde
float schallgeschwindigkeit = 0.0341;
void setup()
{
pinMode(modul_led, OUTPUT);
pinMode(modul_trigger, OUTPUT);
pinMode(modul_echo, INPUT);
}
void loop()
{
// Trigger kurz ausschalten, damit keine Stoersignale anliegen
digitalWrite(modul_trigger, LOW);
delayMicroseconds(5);
// Messung starten: 10 Mikrosekunden HIGH
digitalWrite(modul_trigger, HIGH);
delayMicroseconds(10);
digitalWrite(modul_trigger, LOW);
// Zeit messen, bis das Echo eintrifft
gemessene_zeit = pulseIn(modul_echo, HIGH);
// Nur der Hinweg zaehlt, also durch zwei teilen
zeit_pro_strecke = gemessene_zeit / 2;
// Weg = Zeit mal Geschwindigkeit
entfernung = zeit_pro_strecke * schallgeschwindigkeit;
if (entfernung < 30)
{
digitalWrite(modul_led, HIGH);
delay(1000);
digitalWrite(modul_led, LOW);
}
}Lektion 8: Fahren und vor Hindernissen anhalten
Lektion 8: Fahren und vor einem Hindernis anhalten
int modul_led = A1;
int modul_trigger = 10;
int modul_echo = 11;
float entfernung = 0;
float gemessene_zeit = 0;
float zeit_pro_strecke = 0;
float schallgeschwindigkeit = 0.0341;
int MSL = 9;
int MotorLa = 7;
int MotorLb = 8;
int MSR = 6;
int MotorRa = 5;
int MotorRb = 4;
void setup()
{
pinMode(modul_led, OUTPUT);
pinMode(modul_trigger, OUTPUT);
pinMode(modul_echo, INPUT);
pinMode(MSL, OUTPUT);
pinMode(MotorLa, OUTPUT);
pinMode(MotorLb, OUTPUT);
pinMode(MSR, OUTPUT);
pinMode(MotorRa, OUTPUT);
pinMode(MotorRb, OUTPUT);
}
void loop()
{
// Beide Motoren vorwaerts
analogWrite(MSR, 255);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, HIGH);
analogWrite(MSL, 255);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, HIGH);
// Abstand messen
digitalWrite(modul_trigger, LOW);
delayMicroseconds(5);
digitalWrite(modul_trigger, HIGH);
delayMicroseconds(10);
digitalWrite(modul_trigger, LOW);
gemessene_zeit = pulseIn(modul_echo, HIGH);
zeit_pro_strecke = gemessene_zeit / 2;
entfernung = zeit_pro_strecke * schallgeschwindigkeit;
// Hindernis naeher als 30 cm: beide Motoren stoppen
if (entfernung < 30)
{
analogWrite(MSR, 0);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, LOW);
analogWrite(MSL, 0);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, LOW);
}
}Lektion 9: Die Unterbodenbeleuchtung
Lektion 9: Die sechs Pixel in drei Farben
#include <Adafruit_NeoPixel.h>
#define PIN 13 // Datenleitung der Pixel
#define NUMPIXELS 6 // Anzahl der Pixel auf dem Funbot
Adafruit_NeoPixel BodenLED = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
BodenLED.begin(); // Objekt starten - vergleichbar mit pinMode
}
void loop()
{
// setPixelColor legt die Farbe fest, zeigt sie aber noch nicht an.
BodenLED.setPixelColor(0, BodenLED.Color(255, 0, 0)); // rot
BodenLED.setPixelColor(1, BodenLED.Color(255, 0, 0));
BodenLED.setPixelColor(2, BodenLED.Color(0, 255, 0)); // gruen
BodenLED.setPixelColor(3, BodenLED.Color(0, 255, 0));
BodenLED.setPixelColor(4, BodenLED.Color(0, 0, 255)); // blau
BodenLED.setPixelColor(5, BodenLED.Color(0, 0, 255));
BodenLED.show(); // erst dieser Befehl schaltet die Pixel wirklich um
}Lektion 10: Der Lagesensor MPU6050
Lektion 10: Den Winkel der Z-Achse auslesen
#include <TinyMPU6050.h>
// Objekt fuer den Sensor. (Wire) bedeutet: Kommunikation ueber I2C.
MPU6050 MPU(Wire);
void setup()
{
MPU.Initialize();
Serial.begin(9600);
Serial.println("Kalibrierung beginnt, bitte warten!");
MPU.Calibrate();
Serial.println("Kalibrierung abgeschlossen");
}
void loop()
{
MPU.Execute(); // aktuelle Messdaten abrufen
Serial.print("Winkel Z-Achse = ");
Serial.println(MPU.GetAngZ());
}Lektion 11: Mit dem Lagesensor geradeaus fahren
Lektion 11: Mit dem Lagesensor geradeaus fahren
// Zuerst werden Bibliotheken eingebunden und Variablen erstellt.
// 1. Fuer den Lagesensor
#include <TinyMPU6050.h>
MPU6050 MPU(Wire);
float Grundstellung = 0;
float Abweichung = 0;
// 2. Fuer die Motoren
int MSL = 9;
int MotorLa = 7;
int MotorLb = 8;
int MSR = 6;
int MotorRa = 5;
int MotorRb = 4;
void setup() {
// Serielle Verbindung starten, um die Messwerte mitlesen zu koennen
Serial.begin(9600);
// Ein- und Ausgaenge festlegen
pinMode(MSL, OUTPUT);
pinMode(MotorLa, OUTPUT);
pinMode(MotorLb, OUTPUT);
pinMode(MSR, OUTPUT);
pinMode(MotorRa, OUTPUT);
pinMode(MotorRb, OUTPUT);
// Sensor starten und kalibrieren
MPU.Initialize();
Serial.println("Kalibrierung beginnt, bitte warten!");
MPU.Calibrate();
Serial.println("Kalibrierung abgeschlossen");
// Einmalig die Ausgangslage erfassen und merken
MPU.Execute();
Grundstellung = MPU.GetAngZ();
}
void loop() {
// Aktuelle Messwerte des Lagesensors holen
MPU.Execute();
// Wie weit ist der Funbot von seiner Ausgangslage abgewichen?
// Dafuer wird die Grundstellung vom aktuellen Wert abgezogen.
Abweichung = MPU.GetAngZ() - Grundstellung;
Serial.println(Abweichung);
// Info: Gegen den Uhrzeigersinn nimmt der Wert zu,
// im Uhrzeigersinn wird er kleiner und auch negativ.
if (Abweichung >= 0) {
// Nach links abgewichen, also leicht nach rechts gegensteuern
analogWrite(MSL, 255);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, HIGH);
analogWrite(MSR, 40);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, HIGH);
}
else {
// Nach rechts abgewichen, also leicht nach links gegensteuern
analogWrite(MSL, 40);
digitalWrite(MotorLa, LOW);
digitalWrite(MotorLb, HIGH);
analogWrite(MSR, 255);
digitalWrite(MotorRa, LOW);
digitalWrite(MotorRb, HIGH);
}
}Évaluer le guide