Funduino Funbot – Aufbau und Programmierung
FunduinoZuletzt aktualisiert am
Vom Zusammenbau bis zum selbstfahrenden Roboter – in elf Lektionen
Mikrocontroller wählen
Pins, Schaltplan und Sketch in den Arbeitsschritten wechseln mit deiner Auswahl. Sie bleibt gespeichert.
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);
}
}Anleitung bewerten