Das Infolexikon
...und Blog über die Uni FrankfurtInformatik und Kram
Da wir lange nicht wußten, wo wir das für die Uni ausgearbeitete Material unterbringen sollten und auch einen schrecklichen Drang hatten der Welt diverse Sachen aufzudrücken...
| Er lebt! |
Er ist wieder unterwegs! Nach wochenlangem Grübeln, Messen, Layouten und Platinen-Ätzen ist er endlich unterwegs, um die WG unsicher zu machen: der Afterburner!
Hier mal ein kleines Video, funktioniert trotz ziemlich grober Programmierung und fehlender Kalibrierung erstaunlich gut.
Hier mal ein kleines Video, funktioniert trotz ziemlich grober Programmierung und fehlender Kalibrierung erstaunlich gut.
Das Video
Die neue Technik
Neu sind diesmal dazugekommen:Den Sharp GP2D12-Sensor kann man hervorragend mit dem ADC-Wandler des Atmega8 auslesen. Den Sensor kann man direkt an PC0 anschliessen und in digitale Werte umwandeln.
Da dieser Sensor ziemlich empfindlich gegen Spannungsspitzen ist, empfiehlt es sich, zwei Kondensatoren in die Nähe vom Sensor zwischen + und - zu hängen, einmal 100 nF und einmal 100 uF.
Der Code zum Umwandeln d. Analog-Wertes und für die Reaktion d. Robos:
int sample,i,j,value, count1, count2, left, right, try;
/* Interne Referenz-Spannung (2,56V) verwenden */
ADMUX=0xC0;
ADCSRA=0x80;
count1 = 0;
count2 = 0;
try = 0;
left = 0;
right = 0;
while(1){
if(left == 1){
PORTC |= (1 << 4);
PORTC &= ~(1 << 3);
wait_ms(100);
try++;
}
if(right == 1){
PORTC |= (1 << 3);
PORTC &= ~(1 << 4);
wait_ms(100);
try++;
}
if(right != 1 && left !=1 ){
PORTC |= (1 << 3);
PORTC |= (1 << 4);
wait_ms(100);
try = 0;
}
count1 = 0;
count2 = 0;
for(j=0;j<10;j++){
sample=0;
for(i=0;i<32;i++){
ADCSRA |= (1 << 6);
while(ADCSRA & (1<<ADSC)){
;
}
sample+=ADCW;
}
value=sample/32;
if(value < 300){
count1 ++; // counter für weg frei
}else{
count2 ++; // counter für weg versperrt
}
}
if(count1 > count2){
{
char buffer[20];
lcd_clear();
lcd_string("No Obstacles.Go!");
set_cursor(0,2);
itoa(value, buffer, 10);
lcd_string( buffer );
}
if(left == 1){
turn_left();
wait_ms(100);
left = 0;
}
if(right == 1){
turn_right();
wait_ms(100);
right = 0;
}
if(left != 1 && right != 1){
drive();
}
}else{
{
char buffer[20];
lcd_clear();
lcd_string("Obstacle! Stop! ");
set_cursor(0,2);
itoa(value, buffer, 10);
lcd_string( buffer );
}
stop_slow(); // bei Hindernis anhalten, Kopf drehen
if(try >= 4){
go_back();
wait_ms(100);
try = 0;
}
if(right == 1 || left != 1){
right = 0;
left = 1;
}else{
if(left == 1){
left = 0;
right = 1;
}
}
}
}
Ich habe immer noch leichte Spannungs-Spitzen und extreme Messwerte, man merkt es, wenn er bei gerader Fahrt ohne Hindernisse trotzdem stehenbleibt..Bin noch nicht draufgekommen, ob es Spannungsschwankungen sind, die die Motoren irgendwie verursachen (die Masse vom Atmega8, dem L293D und dem IR-Distanz-Sensor GP2D12 müssen zusammenhängen), oder ob es einfach nur Erschütterungen sind..
Wie ihr seht bilde ich schon den Mittelwert aus 32 Messungen, und entscheide dann auch erst nach 10-maligem Zählen, ob ein Hindernis da ist oder nicht, also - äh - kein Plan im Moment, da muß wahrscheinlich noch ein bißchen Entstörtechnik und Mathe her.
Bilder
Der Sensor auf dem Servo-Hals in seinem "Gehäuse":
--- UPDATE 07.04.2008 ---
Heute hab ich mir mal WD-40, zwei Click-Schalter und sechs-zackige Servo-Kränze besorgt.Das WD-40, ums Getriebe mal ordentlich zu ölen, jetzt fährt er endlich mal wieder geradeaus :-)
Soweit so gut, die Teile festgeklebt, und bis jetzt aber erstmal in ner einfachen Schleife die Auslöser gezählt, was soweit ganz gut funktioniert..
Als nächstes muss ich mich jetzt halt erstmal mit interrupts auseinandersetzen, um die Schalter regelmässig auszulesen..
| Erstellt | 6. April 2008 00:52:09 | Geändert | 7. April 2008 22:21:26 |
|---|---|---|---|
| Von | Tobias Weis | Kategorien | Technik |
| 4 Kommentar(e) | |||
Kommentare
Hi! Der Linksdrall ist ungewollt, war wohl irgendwo ein mechanischer Hänger, ich hab das Gehäsue noch nicht wirklich 100% ausgefeilt..Hab eben gerade WD-40 draufgehauen, jetzt läuft das Getriebe viel leiser, und er fährt auch wieder geradeaus..Ausserdem mal nen 8-Zackigen Servo-Kranz auf die Achsen geschraubt, damit will ich nen Klick-Schalter auslösen, um wenigstens grob abzuschätzen, wie schnell die Motoren getrennt laufen...
der kranz hat 6 zacken du rechenmonster. muhaaa!
uh, äh, stimmt...und was waren nochmal 2 Fototransistoren und 2 Fototransistoren? Muharhar, ich rechne nicht mehr mit Zahlen, nur noch mit komischen griechischen Zeichen!
Aber sag' mal: warum hat er so einen Linksdrall?