ROVER Bot: Meine erste Arduino-Roboter-Versuchsplattform

Probesitzen: Das Arduino-Board ist probehalber auf dem Rover-Chassis platziert...

Probesitzen: Das Arduino-Board ist probehalber auf dem Rover-Chassis platziert…

 

Arduino-Projekte haben in der Regel den Charme, dass es interdisziplinare Vorhaben sind. Es geht sowohl um die elektronische Anbindung von Sensoren und Aktuatoren, der Verbindung mit Hardware und dazu Software-Code, der alles zusammen zu einer funktionierenden Einheit werden lässt.

Vor diesem Hintergrund habe ich ein kleines Arduino-Rover-Projekt begonnen, um mich etwas intensiver mit dem Zusammenspiel von diesen Dingen zu beschäftigen und meine Kenntnisse bei der Programmierung zu entwickeln.

Die Frage ist: Was braucht es für einen Rover, mit dem man einfach und unkompliziert experimentieren will ohne dafür ein Stange Geld auf den Tisch zu legen?

Einen Arduino: Aus zurückliegender Zeit habe ich noch ein Arduino Duemilanove , mit dem ich vor 6 Jahren einen Quadrocopter aufbaute, diesen jedoch irgendwann wieder zerlegte.

Einen Antrieb: Da ich keine Getriebe-Motoren habe, aber noch einige 3003-Servos, sollten diese so umgebaut werden, dass sie nicht mehr als Steller sondern als Antriebseinheiten einsetzbar sind – Stichwort ist hier: Servo Hacking.

Ein Fahrgestell: Für einen Rover braucht es natürlich ein passendes Fahrgestell. Dieses fand ich bei thingiverse – denn ich hatte noch Laufwerksrollen und Ketten eines Tamiya-Kits in der Bastelkammer.

Einen Sensor: Dazu benutze ich ein Ultraschall-Sensor (HC-SR04), der montiert auf einem Servo, als „Radar“ zur Hinderniserkennung den kleinen Rover vor Überraschungen bewahren soll. Zur Montage des Sensors habe ich diese Halterung, die ich ebenfalls bei thingiverse fand, vorgesehen.

Einen Code: Es ist für ich zunächst ein Puzzle, bei dem ich zu aller erst im Netz recherchiere, wie solche Roboter bisher mit den Teilen, die ich habe, von anderen umgesetzt wurde. Dabei suche ich mir die Code-Teile zusammen, die ich meiner Meinung nach gebrauchen kann.

 

Perspektivisch möchte ich die Rover-Plattform zum Experimentieren nutzen, und dabei unterschiedliche Sensoren kennenlernen und die Einbindung in einen Roboter erarbeiten. Zum jetzigen Zeitpunkt erscheint mir insbesondere ein LIDAR lite Sensor zum Abtasten der Umgebung interessant zu sein. Aber auch die Kombination des Arduino mit einem Raspberry Pi B+ oder 2 und einer Pi-Kamera , deren Bilder dann per Wifi gestream werden sind Erweiterungen, die ich vielleicht zu einem späteren Zeitpunkt in Angriff nehmen möchte.

 

Aktuell habe ich die o.g. Teile gedruckt, entgratet und zur Probe vormontiert – hier mal ein Blick auf die bisherigen Bastel-Schritte:

Druck und Montage des Fahrgestells…

Die Chassis-Teile für den Rover werden mit einer Layerhöhe von 0,2mm und einem Infill von 30% in PLA gedruckt.

Die Chassis-Teile für den Rover werden mit einer Layerhöhe von 0,2mm und einem Infill von 30% in PLA gedruckt.

Alle Fahrgestell-Teile sind mit Rand gedruckt, um die Haftung auf dem Druckbett zu verbessern.

Alle Fahrgestell-Teile sind mit Rand gedruckt, um die Haftung auf dem Druckbett zu verbessern.

Die gedruckten Rover-Teile...

Die gedruckten Rover-Teile…

Probemontage des Chassis nach dem Entgraten - die Teile passen gut zusammen. Bei der Endmontage werden die Einzelteile miteinander verklebt.

Probemontage des Chassis nach dem Entgraten – die Teile passen gut zusammen. Bei der Endmontage werden die Einzelteile miteinander verklebt.

Die Laufrollen inkl. der Schrauben sind aus dem Tamiya-Kit.

Die Laufrollen inkl. der Schrauben sind aus dem Tamiya-Kit.

…es folgte das Servo Hacking…

Übersichtlich: Zur Demontage des Servos ist nicht viel Werkzeug nötig...

Übersichtlich: Zur Demontage des Servos ist nicht viel Werkzeug nötig…

Servo Hacking: Das Servo-Gehäuse ist aufgeschraubt. Zu erkennen ist links der Motor und rechts die Steuerplatine, unter der das Potentiometer montiert ist.

Servo Hacking: Das Servo-Gehäuse ist aufgeschraubt. Zu erkennen ist links der Motor und rechts die Steuerplatine, unter der das Potentiometer montiert ist.

Servoplatine und das darunterlegende Potentiometer, welches im Servogehäuse mittels Schnapphaken gehalten wird, sind demontiert.

Servoplatine und das darunterlegende Potentiometer, welches im Servogehäuse mittels Schnapphaken gehalten wird, sind demontiert.

Entfernt: Das Potentiometer ist von der Steuerplatine abgetrennt.

Entfernt: Das Potentiometer ist von der Steuerplatine abgetrennt.

Das Ausmessen des Potentiometers ergibt einen Gesamtwiderstand von 5k Ohm.

Das Ausmessen des Potentiometers ergibt einen Gesamtwiderstand von 5k Ohm.

20150201_160937

 

Um in etwa die Mitte des Potentiometerwertes zu treffen nutze ich zwei Festwiderstände mit 2,4 k Ohm Nennwiderstand.

Um in etwa die Mitte des Potentiometerwertes zu treffen nutze ich zwei Festwiderstände mit 2,4 k Ohm Nennwiderstand.

Austausch: 5 K Ohm-Poti wird gegen zwei 2,4 k Ohm Festwiderstände getauscht.

Austausch: 5 K Ohm-Poti wird gegen zwei 2,4 k Ohm Festwiderstände getauscht.

Ohne Dritte-Hand geht das Löten leider nicht...

Ohne Dritte-Hand geht das Löten leider nicht…

Verlötet: Die beiden 2,4k Ohm Ersatzwiderstände sind statt des Potentiometers an den drei Pins fliegend verlötet.

Verlötet: Die beiden 2,4k Ohm Ersatzwiderstände sind statt des Potentiometers an den drei Pins fliegend verlötet.

Nach dem Anbringen des Widerstandsnetzwerks wird der Servo mittels Tester ausprobiert - nun dreht er wie ein Motor.

Nach dem Anbringen des Widerstandsnetzwerks wird der Servo mittels Tester ausprobiert – nun dreht er wie ein Motor.

Das gedruckte zweiteilige Antriebsrad passt gut auf den Servo.

Das gedruckte zweiteilige Antriebsrad passt gut auf den Servo.

Es folgte die Montage der Servo-Antriebsmotoren und der Ketten…

Ansicht auf den Rover von oben. Zu erkennen ist die Spurweiten-Differenz zwischen Antriebsrädern und den Ketten. Um die Ketten in Flucht zu den Antriebsrädern zu bringen werden gedruckte Distanzschreiben genutzt.

Ansicht auf den Rover von oben. Zu erkennen ist die Spurweiten-Differenz zwischen Antriebsrädern und den Ketten. Um die Ketten in Flucht zu den Antriebsrädern zu bringen werden gedruckte Distanzschreiben genutzt.

Kleinteile: Die gedruckten Distanzscheiben zur Einstellung der Spurweite der Ketten.

Kleinteile: Die gedruckten Distanzscheiben zur Einstellung der Spurweite der Ketten.

Alles ist an seinem vorgesehenen Platz: Rover ist bereit für die Steuerungselektronik.

Alles ist an seinem vorgesehenen Platz: Rover ist bereit für die Steuerungselektronik.

Zwischenzeitlich habe ich an dem Bot etwas weitergearbeitet. Zunächst habe ich mir eine Halterung für den noch vorhandene Ultraschall-Sensor gedruckt:

Für ein späteres Upgrade: Schwenkbar ausgelegter Ultraschallsensor. Die Halterung ist gedruckt.

Für ein späteres Upgrade: Schwenkbar ausgelegter Ultraschallsensor. Die Halterung ist gedruckt.

Der Sensor passt genau in die gedruckte Halterung.

Der Sensor passt genau in die gedruckte Halterung.

Die einfache Schaltung ist zunächst mit einem Steckboard realisiert.

Die einfache Schaltung ist zunächst mit einem Steckboard realisiert.

 

Anschließend habe einen ersten Fahrtest (noch ohne Sensor) gemacht, die aber ernüchternd war: Die eine Kette läuft regelmäßig von den Laufrollen und am anderen Kettenlaufwerk ist die Lagerung der vorderen Rolle gebrochen.

Die linke vordere Laufrolle ist samt Lager aus dem gedruckten Teil herausgebrochen....

Die linke vordere Laufrolle ist samt Lager aus dem gedruckten Teil herausgebrochen….

Getestet habe ich mit diesem Code, den ich im Netz gefunden habe:
//———————————————————————————
// START OF ARDUINO CONTROLLED SERVO ROBOT (SERB) PREAMBLE
#include <Servo.h>

#define LEFTSERVOPIN 10
#define RIGHTSERVOPIN 9

Servo leftServo;
Servo rightServo;

int speed = 100; //sets the speed of the robot (both servos) a percentage between 0 and 100

// END OF ARDUINO CONTROLLED SERVO ROBOT (SERB) PREAMBLE
//———————————————————————————
/*
* sets pins to appropriate states and attaches servos. Then pauses
* for 1 second before the program starts
*/
void setup()
{
serbSetup(); //sets the state of all neccesary pins and adds servos to your sketch
randomSeed(analogRead(0)); //sets the random number seed with something mildly random
delay(1000);
}

/*
* turns the robot either left or right (randomly) for a period between
* 0.1 and 1 second. Before going forward for a random time period
* between 1 and 4 seconds. Before pausing for two seconds then starting
* again.
*/
void loop()
{
turnRandom(100,1000); //Turns randomly left or right for a random time period between .1 second and one second
goForwardRandom(1000,2000); //Goes forward for a random time period between 1 and 2 seconds
goStop(); //Stops the robot
delay(2000); //pauses for 2 seconds (whilst stopped)
}

/*
* turns the robot randomly left or right for a random time period between
* minTime (milliseconds) and maxTime (milliseconds)
*/
void turnRandom(int minTime, int maxTime){
int choice = random(2); //Random number to decide between left (1) and right (0)
int turnTime = random(minTime,maxTime); //Random number for the pause time
if(choice == 1){ goLeft();} //If random number = 1 then turn left
else {goRight();} //If random number = 0 then turn right
delay(turnTime); //delay for random time
}

/*
* goes forward for a random time period between minTime (milliseconds)
* and maxTime (milliseconds)
*/
void goForwardRandom(int minTime, int maxTime){
int forwardTime = random(minTime,maxTime); //determine a random time to go forward
goForward(); //sets the SERB forward
delay(forwardTime); //delays for random time period
}

//————————————————————————————————————
//START OF ARDUINO CONTROLLED SERVO ROBOT (SERB) ROUTINES

/*
* sets up your arduino to address your SERB using the included routines
*/
void serbSetup(){
setSpeed(speed);
pinMode(LEFTSERVOPIN, OUTPUT); //sets the left servo signal pin to output
pinMode(RIGHTSERVOPIN, OUTPUT); //sets the right servo signal pin to output
leftServo.attach(LEFTSERVOPIN); //attaches left servo
rightServo.attach(RIGHTSERVOPIN); //attaches right servo
goStop();
}
/*
* sets the speed of the robot between 0-(stopped) and 100-(full speed)
* NOTE: speed will not change the current speed you must change speed
* then call one of the go methods before changes occur.
*/
void setSpeed(int newSpeed){
if(newSpeed >= 100) {newSpeed = 100;} //if speed is greater than 100 make it 100
if(newSpeed <= 0) {newSpeed = 0;} //if speed is less than 0 make it 0
speed = newSpeed * 0.9; //scales the speed to be between 0 and 90
}

/*
* sends the robot forwards
*/
void goForward(){
leftServo.write(90 + speed);
rightServo.write(90 – speed);
}

/*
* sends the robot backwards
*/
void goBackward(){
leftServo.write(90 – speed);
rightServo.write(90 + speed);
}

/*
* sends the robot right
*/
void goRight(){
leftServo.write(90 + speed);
rightServo.write(90 + speed);
}

/*
* sends the robot left
*/
void goLeft(){
leftServo.write(90 – speed);
rightServo.write(90 – speed);
}

/*
* stops the robot
*/
void goStop(){
leftServo.write(90);
rightServo.write(90);
}

Da ich nicht wirklich Lust habe das Kettenlaufwerk nun noch groß zu überarbeiten versuche ich es mit dem sog. Miniskybot 2 , um endlich mal mit dem Arduino spielen zu können – der Drucker ist schon mit der Fahrgestell-Herstellung beschäftigt…

Soweit aus der Bastelkammer…

Horrido und stay tuned.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s