PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Facharbeit: Bau eines Roboters



catchme
29.01.2007, 14:40
Hallo!
Ich möchte euch hier meine Facharbeit vorstellen, in der ich als praktischen Teil einen Roboter bauen musste/_durfte_ ;D
Die Facharbeit ist mittlerweile fertig und abgegeben, nachdem das Wochenende durchgefeiert wurd hab ich nun Zeit sie euch vorzustellen.
Also hier erstmal die Eckdaten, was an Sensorik verbaut ist:
- 2 mal Sharp GP2D12
- 5 CNY 70 als Liniensensor
- ADNS-2610 als Maussensor
- BPW21 als Helligkeitssensor
- Devantech SRF02-Sonar

Als Motoren kamen Schrittmotoren zum Einsatz, die habe ich von mir-elektronik.de bezogen.
Bezeichnung: VEXTA Cxxxx-9212
Nennspannung: 3,18 V
Phasenstrom: 1,06 A
Haltemoment: 35 Ncm
Die Motoren kann ich echt empfehlen, v.a. mit der Konstant-Strom Ansteuerung ist die Leistung der Motoren sehr gut!
Ich habe dabei nichtmal den Phasenstrom vollständig ausgereizt, um noch etwas am Stromverbrauch zu sparen.

Akkus wurden übrigens ein 14,4V Pack mit 1,4Ah von pollin verbaut. Reicht im Endeffekt etwa für 30 Min Laufzeit.

Als Hauptprozessor kam ein ATmega32 zum Einsatz.

Die Laufräder sind auch von pollin.de, sowie das PICO-Plug Bluetooth Set, mit dem ich die Funkverbindung herstelle!

Alle Platinen wurden von mir selbst designt und auf Lochraster aufgebaut, da ich (noch) keine Möglichkeit besitze, mir Platinen selbst zu ätzen.
Dafür sind sie trotzdem recht kompakt geworden, wie ich finde!
Bei Bedarf kann ich die in Lochmaster 3.0 erstellten Layouts entweder als .bmps oder als Lochmaster-Dateien einstellen!

Ich habe folgende Boards konstruiert:
- Schrittmotor Ansteuerung mit Anschluss nach RN-Definition und einem Jumper zum Umschalten zwischen Half/Full-Step
- Einen Transimpedanzverstärker, der den Kurzschlusstrom des BPW21 in eine analoge Ausgangsspannung umwandelt
- LM75 Platine mit I2C Anschluss
- Eine LCD-Platine mit Anschluss nach RN-Definitionen
- Platine mit für 5 OPs, die als Vergleicher eingesetzt werden. D.h. sie können die Ausgangsspannung eines CNY-70 in ein digitales Signal umwandeln.
Ideal für Liniensensoren, denn man muss keine wertvollen AD-Pins verschwenden. Der Schaltplan ist von robotmaker.de
- Ein Mainboard mit folgenden Anschlüssen:
- 2 Schrittmotor-Platinen
- 1ne OP-Platine wie oben beschrieben
- LCD-Anschluss nach RN-Definitionen
- 3-Pin Analogeingänge auch nach RN-Definitionen
- einen Servo-Ausgang
- an zwei IO-Pins hängen Transistoren
- anschlüsse für einen Maussensor mit two-wire serial inteface
- RS232 ausgang (mit MAX232)
- I2C-Interface an 4-Pin Stecker

Was kann der Roboter nun alles messen?
- Wegstrecke in Zentimeter über den ADNS-2610 messen
- Die Drehung auf 0,1° genau auch mit dem ADNS-2610 messen
- Beleuchtungsstärke in lux messen
- Entfernung mit dem GP2D12
- Entfernung mit dem SRF02
- Temperatur auf 0,5°C genau

Welche Verhalten wurden implementiert?
- Einer Linie nachfahren
- Den Hellsten Punkt finden
- Hindernissen ausweichen
- Sobald bei Geradeausfahrt eine Drehung von >3° registriert wird, wird der Kurs automatisch korrigiert

Die ganzen Messdaten werden zum eine auf dem LCD-Display ausgegeben, zum andern kann man auch eine Verbindung mit dem PC herstellen
und sich die Daten in einem selbst-geschriebenen VB-Programm anzeigen lassen!

Auch Bilder will ich euch nicht vorenthalten! Ich habe leider nur die drei, und kann auch keine mehr schießen, da der Roboter nun bei meinem LK-Lehrer steht!
Im Anhang findet ihr auch die Facharbeit als PDF!

Last but not least möchte ich euch allen für eure Arbeit an der RN-Wiki und hier am Forum danken, denn ohne diese ganzen Informationen wäre ich nie so weit gekommen. Durch diese Seite bin ich zunächst überhaupt zum Ersten mal mit Roboterbau in Kontakt gekommen! =D> =D>

EDIT:
Ich kann auch bei Bedarf meinen AVR-GCC Code bereitstellen. Er enthält Routinen zur Kommunikation mit einem SRF02, LM75, Servo, ADNS-2610 uvm.
Ich habe es z.b. auch hinbekommen, das LCD ohne die Rw-Leitung anzusprechen!

greetz max

UriAn
29.01.2007, 16:10
Sieht sauber gearbeitet aus, sehr schön.

MfG René

PS: kann man ihn nicht sogar noch erweitern (noch eine Ebene)???

UlrichC
29.01.2007, 19:18
Hi,
ich war erstaunt, soetwas als Facharbeit zu lesen.

Sehr gut ausgearbeitet, überzeugendes Ergebnis!

Schöne Grüße
Christian

LuK-AS
29.01.2007, 19:34
Hallo Max,

wie hast Du das PICO-Plug Bluetooth Set denn eingebunden, hast Du hierzu einen Schaltplan gemacht und wo zapfst Du die Platine an?

Zum Rest kann ich nur sagen "Respekt"

Gruss
Clemens

Reeper
29.01.2007, 19:52
Von mir auch Respekt!

Tolles Projekt und Durchführung :-)

Wie bist du eigentlich mit dem PicoPlug zufrieden, arbeitet dieser Zuverlässig?

Gruß
Stefan

patti16
29.01.2007, 20:10
Von mir kann ich auch sagen das es gut Ausgearbeitet ist, Schönes Projekt.


gibt bestimmt ne gute Note.

gruß
patrick

3TageBart
29.01.2007, 22:25
sieht vom Aufbau her dem ct bot sehr ähnlich....

catchme
29.01.2007, 22:34
PS: kann man ihn nicht sogar noch erweitern (noch eine Ebene)???
Jep, hab ich extra so gemacht dass ich es später evtl. noch aufstocken kann.
Aber erstma hab ich genug (nur für wie lange... ) ;D

ich war erstaunt, soetwas als Facharbeit zu lesen.
Hab ich hauptsächlich meinem echt coolen Physik LK-Lehrer zu verdanken. Ich habe mich in der schriftl. Ausarbeitung der Facharbeit auch eigentlich auf fast rein physikalische Aspekte beschränkt.

wie hast Du das PICO-Plug Bluetooth Set denn eingebunden, hast Du hierzu einen Schaltplan gemacht und wo zapfst Du die Platine an?
Wie meinst du das genau? Also ich habe es einfach über den Stromstecker mit 5V Spannung von dem integrierten Schaltnetzteil versorgt. Der RS232-Anschluss dürfte ja klar sein..
Und von der Position her, das Pico Plug liegt einfach über dem Mainboard!

Wie bist du eigentlich mit dem PicoPlug zufrieden, arbeitet dieser Zuverlässig?
Nicht so wirklich. Die Reichweite ist echt mies, das geht nur im Umkreis von ca. 6m. Und auch die Übertragung ist fehlerhaft. Ich hatte den Roboter mal angeschaltet auf dem Fensterbrett stehen, und wollte von meinem Laptop aus (der am schreibtisch steht) ein kommando senden, um den Servo zu drehen. Nur leider verstand der Robi das als Kommando für den rechten Motor... Den Rest kannst dir vorstellen, zum Glück bin ich schnell genug aufgesprungen und habe es gerade noch geschafft ... :D
Ich habe das Picoplug eigentlich nur wegen des konkurrenzlosen Preises genommen.


sieht vom Aufbau her dem ct bot sehr ähnlich....
Jep, du hast recht. Habe mich auch daran orientiert. Z.b. ist sogar die Maussensor-Platine orginal aus dem C't bot, da ich die nicht auf Lochraster hab aufbauen können. Aber z.b. hat mein Roboter nicht das bekannte Problem, dass der Maussensor zu hoch sitzt. Der ist nämlich in der hinteren metallernen Stütze integriert.

Ansonsten ein dickes DANKE für euer Lob und eure Zusprüche :D
greetz max

Reeper
29.01.2007, 23:12
Hmm, dass mit dem PicoPlug habe ich mir gedacht.
Ich war mit meinem auch nicht zufrieden, es hätte ja sein können, dass es ein Einzelfall war.
Nun habe ich mir das bestellt:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26585&highlight=
Ich berichte, wenn es geliefert wurde :-)

Ach ja: Gute Reflexe ;-)


EDIT:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=250141#250141
Habe den BTS1009 mittlerweile und bin damit sehr zufrieden :-)

jackalice
10.04.2007, 18:30
Ich kann auch bei Bedarf meinen AVR-GCC Code bereitstellen. Er enthält Routinen zur Kommunikation mit einem SRF02, LM75, Servo, ADNS-2610 uvm.


Hi Max,
Kompliment zu der Arbeit!! Ich beschäftige mich auch grade mit dem ADNS-2610 und möchte diesen zur Positionsbestimmung einsetzen... könntest du den C-Code zur Verfügung stellen? Dann müsste ich nicht von ganz vorne anfangen O:)

Danke
j.a.

steveLB
11.04.2007, 09:16
der ct-bot verwendet auch ein adns-2610 , und dessen code in C kann man sich runterladen , dort drinn stehts wie sie es gemacht haben, das kannst dann für deine anwendung nutzen
Gruß

unapiedra
14.04.2007, 10:44
Hi Max,

sieht sehr schön aus. Da hast du echt Glück mit deinem Physiklehrer. Ich konnte nichts mit Robotern in meiner Physik-FA machen.

Wie dem auch sei, auf Seite 16f. schreibst du, dass der Maussensor bis zu einer Geschwindigkeit von 30,xx cm/s arbeitet. Hast du das ausprobiert oder sind das nur die Werte aus dem Datenblatt?
Wenn ja, würde mich interessieren, was passiert wenn die Geschwindigkeit höher ist. Ich wollte mal Maussensoren für einen RoboCup Soccerbot einsetzen. Da entstehen aber zwei Probleme. 1. der Roboter fährt bis zu 100 cm/s schnell. 2. Wir haben einen Omnidriveroboter. Da wir in alle Richtungen fahren können, funktioniert deine Lösung die Drehung über den Y-Wert zu bestimmen leider nicht.

Hast du eine Idee wie, das mit zwei Maussensoren funktionieren könnte? Mein Ansatz war es, zwei nebeneinander zu befestigen, und eine Drehung dann über die Differenz der X-und Y-Werte zu bestimmen. Hat aber nicht geklappt (weil ich keine Formel aufstellen konnte).

Nochmal Gratulation zu der sehr schönen Arbeit. (Nur Seitenzahlen und Inhaltsverzeichnis stimmen nicht überein. Siehe Maussensor...)

Viele Grüße,
unapiedra

catchme
23.04.2007, 17:16
Hi Max,
Kompliment zu der Arbeit!! Ich beschäftige mich auch grade mit dem ADNS-2610 und möchte diesen zur Positionsbestimmung einsetzen... könntest du den C-Code zur Verfügung stellen? Dann müsste ich nicht von ganz vorne anfangen O:)
Hi!
Klar, kein Problem!
Aber mein Code ist auch so ziemlich der gleiche wie der vom c't-Bot, wie steve schon richtig gesagt hat!

//ADNS Funktionen!!
void adns_writebyte(uint8_t bdata) {
//PD7 als Ausgang definieren
DDRB |= (1<<SDIO);

for(int8_t i = 7; i >= 0; i--) {
PORTB &= ~(1<<SCK);
/*
PORTB = (PORTB & (~PINB)) | ((bdata >> (7 - SDIO)) & (1<<SDIO));
bdata = bdata <<1;
*/
PORTB &= ~(1<<SDIO);
if(bdata&(1<<i)) PORTB |= (1<<SDIO);


asm volatile("nop");

PORTB |= (1<<SCK);
}

}

uint8_t adns_readbyte(void) {
uint8_t Bdata = 0;
PINB &= ~(1<<SDIO);
DDRB &= ~(1<<SDIO);

//Bdata = 0;
for(int8_t i = 7; i >= 0; i--) {
//Sck = 0
PORTB &= ~(1<<SCK);

Bdata = Bdata <<1;
PORTB |= (1<<SCK);
asm("nop");
Bdata |= (PINB >> SDIO) & 0x01;
}
return Bdata;
}

void adns_write(uint8_t adr, uint8_t Bdata) {
//erstes Byte auf eins, da schreibvorgang!
adr |= (1<<7);
adns_writebyte(adr);
adns_writebyte(Bdata);

_delay_us(200);
}

uint8_t adns_read(uint8_t adr) {

adr &= ~(1<<7);
//Adresse schreiben
adns_writebyte(adr);

_delay_us(200);
//antwort-byte ausgeben

return adns_readbyte();
}

void adns_init(void) {
DDRB |= (1<<SCK);
PORTB &= ~(1<<SCK);
//reset
adns_write(0x00, 0x80);

//forced awake mode
adns_write(0x00, 0x01);
}

@unapiedra:
Den Wert habe ich aus dem Datenblatt und nicht selbst getestet.
Aber ich kann es testen, da ich der Roboter mittlerweile wieder bei mir zuhause steht. Nur musst du dich noch etwas gedulden, denn ich stecke momentan voll im Abi-Stress.
Allerdings ist der ADNS-2610 mittlerweile eigentlich total veraltet. Es gibt, so weit ich weiß, Sensoren, die locker 100cm/s schaffen dürften. Einfach mal eine aktuelle Gamer-Maus zerlegen :D

Bei einem omnidrive-Roboter müsste das rein theoretisch schon mit einem Maussensor zu realisieren sein, ABER: nur bei dem Spezialfall, dass der Roboter nie um die eigene Achse rotiert. Soll heißen, dass der Roboter von Start bis Ende immer in die gleiche Richtung schaut. Die Richtungsänderungen erfolgen nur über die Geschwindigkeit der verschiedenen Omnidrive-Räder.
Dann müsste ein im Mittelpunkt des Roboters montierter Maussensor genügen, um den Winkel der aktuellen Fortbewegungsrichtung festzustellen. Formel wäre dann tan alpha = dY / dX (achtung: wenn dX=0 dann muss alpha = 90/180° gesetzt werden, da durch null geteilt wird). Den Weg kann man entweder über "sin alpha = dY / Weg" oder über "cos alpha dx / Weg" bestimmen.

Da der Sensor zentral sitzt erkennt er also keine Drehung um die eigene Achse.

Um den Roboter ganz normal benützen zu können, müsste man also einen zweiten Sensor einbauen, der exzentrisch sitzt und die Rotierung um die eigene Achse registriert und jeweils von dem anderen alpha abzieht/hinzuzählt. Allerdings dürfte dieser Sensor nur dann aktiviert werden, wenn sich der Roboter auch wirklich um die eigene Achse dreht. Der zurückgelegte Weg wird nach wie vor über den zentralen Sensor bestimmt.

Hoffe ich habe das einigermaßen verständlich (und richtig) erklärt, wenn nicht, dann mach noch ne Zeichnung!
Es gibt sicher noch besserere Möglichkeiten, rein theoretisch müsste es auch mit nur einem Sensoren, der sich außerhalb des Mittelpunkts befindet, funktionieren.... hm... ein sehr interessantes Problem!

Danke nochmal an alle für das positive Feedback =D>
mfg max

PS.: Hab 15pkt bekommen 8-[ =P~

unapiedra
23.04.2007, 19:38
Herzlichen Glückwunsch zu der angemessenen Benotung!
Tut mir leid, ich vermute das wird hier ein bisschen OT. Aber hoffentlich interessant ;-)


Bei einem omnidrive-Roboter müsste das rein theoretisch schon mit einem Maussensor zu realisieren sein, ABER: nur bei dem Spezialfall, dass der Roboter nie um die eigene Achse rotiert. Soll heißen, dass der Roboter von Start bis Ende immer in die gleiche Richtung schaut.

Da der Sensor zentral sitzt erkennt er also keine Drehung um die eigene Achse.

Um den Roboter ganz normal benützen zu können, müsste man also einen zweiten Sensor einbauen, der exzentrisch sitzt und die Rotierung um die eigene Achse registriert und jeweils von dem anderen alpha abzieht/hinzuzählt. Allerdings dürfte dieser Sensor nur dann aktiviert werden, wenn sich der Roboter auch wirklich um die eigene Achse dreht. Der zurückgelegte Weg wird nach wie vor über den zentralen Sensor bestimmt.

Der Trick beim Omnidriveantrieb ist ja, dass Translation und Rotation wirklich unabhängig sind. D.h. ich kann zum Beispiel mit einer Geschwindigkeit von 10 cm/s nach vorne (Y-Richtung), einer Geschwindigkeit von 5 cm/s nach rechts (x-Richtung) und mich dabei noch um 5° /s drehen. Dann fahre ich einen Kreis mit dem Mittelpunkt irgendwo links hinten.
Unsere Roboter könnte man diese Operation machen lassen, mit einer Funktion omni(5, 10, 5); (die Funktion ist nicht so genau so. In Wirklichkeit werten wir nur die Richtungen aus, Ein Speed parameter sorgt dafür, dass man die Geschwindigkeit anders einstellen kann.)

Habe mal eben eine Zeichnung entworfen: (siehe unten)
Der Roboter dreht sich also um einen Mittelpunkt M. Und bewegt sich von P nach P'.

Das Problem ist also, dass der Roboter sich meistens nicht um eine dir bekannte Achse dreht, sondern dass die Drehachse irgendwo auf der Ebene steht.

Ich habe nochmal einen neuen Ansatz. Die Herleitung ist mir zu kompliziert, auf zuschreiben/zu malen (deutet darauf hin, dass ichs noch nicht ganz verstanden habe). Aber hier jedenfalls mein Ergebnis: (auch im Anhang)

\begin{math}
\tan(\alpha) = \dfrac{|\Delta\overrightarrow{s_2} - \Delta\overrightarrow{s_1}\|}{|\overrightarrow{d}| } \\
\mbox{mit } \Delta\overrightarrow{s_2} = \overrightarrow{s_2}'-\overrightarrow{s_2} \\
\mbox{und } \Delta\overrightarrow{s_1} = \overrightarrow{s_1}'-\overrightarrow{s_1}
\end{math}

unapiedra
29.04.2007, 15:42
So habe jetzt noch den richtigen Tip bekommen und möchte dieses Thema damit abschließen.
www.c-palb.de/stuff/mousesensors.pdf
Hier habe ich mal mein Endergebnis veröffentlicht. Ihr könnt gerne Fragen, wenn euch irgendwas unklar ist. Aus Zeitmangel habe ich keine Grafiken und nur sehr wenig Text...
Ich hoffe irgendjemand hat da seine Freude dran. Ich werde das vermutlich in der nächsten Zeit mal mit den echten Sensoren ausprobieren.

FIRST HELP
03.05.2007, 15:31
was für räder sind das???

bitte art sagen und wo gekauf!

danke im vorraus

FIRST HELP
05.05.2007, 21:08
keiner ?????


gruss Help

catchme
08.05.2007, 21:07
Ist die Best.Nr. 440 661 von pollin.de
Gibts auch in den Farben weiß und hellblau, je nach Geschmack ;D
Aber sehen aus, als wären sie von einem Kinderwagen abmontiert!!
Und haben aufgrund der Harten Lauffläche auch nicht den besten Grip, aber für den Preis einfach unschlagbar! (0,95€)
Grüße max

FIRST HELP
09.05.2007, 13:21
vielen dank ich werde mal schauen ob ich sie nehme oder ich schau mal im Baumarkt nach

stumpi_8
07.05.2009, 10:03
Hallo
hab da mal eine Frage, da du den Weg mit nem Maussensor misst:

ich versuche den Weg, den eine optische Maus in x bzw y Richtung zurücklegt zu messen. Dazu hab ich eine Platine mit einem Pic aufgebaut und ich kann die Maus auch initialisieren und bei Bewegung bzw Tastendruck empfange ich Daten. Die Tasten kann ich auch einwandfrei auswerten, allerdings hab ich Probleme mit dem Weg. Ich wollte einfach die empfangenen Werte zu addieren um so auf den gesamt zurückgelegten Weg zu kommen. Das funktionierte allerdings nicht, dann hab ich gelesen, dass die Werte das 2er Komplement der Dezimal-Werte ist. Hab dieses dann umgewandelt in Dezimal werte aber es läuft immer noch nicht. Bewege ich die Maus zb nur in y-Richtung dann wird der x Wert auch stark verändert, außerdem Vergrößern und verkleinern sich die Werte obwohl ich die Maus nur in eine Richtung bewege.
Ich hänge meine Main in der ich die Auswertung der Daten durchführe mal an.
Wär super wenn mir jemand helfen könnte.

stumpi_8
07.05.2009, 10:16
so jetzt auch den anhang