PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro IR Hinderniserkennung im Fahren?



Kagee
01.12.2010, 19:18
Hallo.

Bei meinem Asuro ist die IR-Modifikation von waste drauf(siehe https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114).

Nun dachte ich mir verwendeste mal die IR-Schnittstelle zur Hinderniserkennung und Umfahren von Objekten. Ich habe den Beispielcode aus dem Thread genommen und dies getestet, etwas vereinfacht und es funktionierte wunderbar:

#include "asuro.h"
#include <stdlib.h>
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFD; //Pulsbreite 2
}

int main(void)
{
Init();
InitIRDetect();

while (1)
{

UCSRB = 0;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
}
return 0;
}

Man sieht mit dem Programm sehr schön die Annäherung des Objektes. Die Schleifendurchläufe mit roter LED nehmen bei Annäherung immer mehr zu, bis die LED irgendwann ganz rot ist - so weit so gut (ich verwende immer den Wert ßxFD für die Pulsbreite).

Nun wollte ich natürlich, dass der Asuro dies auch während der Fahrt tut. Wenn ich nun aber nur die Anweisung den Motoren zu starten einfüge, geht die Hinderniserkennung gar nicht mehr PortD Pin0 ist dauerhaft low, die LED belibt grün.

#include "asuro.h"
#include <stdlib.h>
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFD; //Pulsbreite 2
}

int main(void)
{
Init();
InitIRDetect();
MotorSpeed(64,64); //Ohne diese Zeile gehts es wie gedacht
while (1)
{
UCSRB = 0;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
}
return 0;
}

Nun habe ich herausgefunden, dass die Funktion der IR-Erkennung davon abhängt, was durch MotorSpeed in die Register OCR1A und OCR1B reingeschrieben wird: Bei 64 funktioniert es noch gerade so (es werden sehr wenige Reflexionen erkannt, aber es werden noch welche erkannt), bei 100 wird nichts mehr erkannt. Bei 20 ist es quasi wie bei 0.
Das blöde dabei ist freilich, dass der Asuro sich bei 64 für OCR1A und OCR1B nicht bewegt. Folglich funktioniert die Erkennung nicht in der Bewegung. Da ich hier im Forum und an anderen Stellen des Internets niemanden mit demselben Problem fand, schließe ich auf einen Fehler meinerseits.

Hat ihn wer gefunden?

radbruch
01.12.2010, 20:04
Hallo

Da sollte eigentlich kein direkter Zusammenhang bestehen. Der Antrieb verwendet Timer1, die Trägerfrequenz für das IR-Signal den Timer2. Ist die IR-Led nicht richtig abgeschirmt, so dass der IR-Empfänger irgendwelche IR-Echos empfängt? Welche Lib verwendest du? myMotorSpeed() kenne ich nicht.

Gruß

mic

[Edit]
"geht die Hinderniserkennung gar nicht mehr PortD Pin0 ist dauerhaft low, die LED bleibt grün"

Grün bedeutet bei deinem Programm, dass der Port des IR-Empfängers High ist!

if (PIND & (1 << PD0))
StatusLED(GREEN);

Das bedeutet, der IR-Empfänger erkennt kein Signal. Sind die Akkus/Batterien ok? Möglicherweise senkt die Belastung durch die Motoren die Bordspannung soweit ab, dass der IR-Empfänger nicht mehr richtig funktioniert. Er ist sehr zickig bei Unterspannung.

Kagee
01.12.2010, 20:23
oh, danke für den Hinweis. Die Funktion myMotorSpeed hatte ich mir zwischendurch selbst geschrieben, das sollte eigentlich nicht in den Codeabschnitt rein. Die Funktion ist inzwischen wieder verworfen, da der Ansatz keine Lösung des Problems brachte.

Was ich vielleicht noch erwähnen sollte:
Der Fehler kann nicht an derr grundsätzlichen Bewegung im physikalischen Sinne liegen - es funktioniert nähmlich auch dann nicht, wenn ich die Räder des Asuro anhebe und so die Bewegung verhindere und nur die Raddrehung erzeuge.

radbruch
01.12.2010, 20:37
Schau mal mein Edit oben, habe ich grad geschrieben :)

Kagee
01.12.2010, 20:59
Das ist eine sehr gut Idee. daran habe ich noch gar nicht gedacht.

Die Spannungen sehen wie folgt aus:
Abgeschaltet 5,14 V
Bootvorgang: 5,09 V
Angeschaltete Motoren bei v=255: 4,93 V
Angeschaltete Motoren bei v=64 (Räder drehen sich nicht): 5,05 V

Ist das schon zuwenig bei 255?
Im moment betreibe ich den Asuro mit NiMH-Akkus 4x1,2 V ohne gejumperte Diode. Sollte man da schon jumpern? Rein theoretisch sollte da ja nur 4,8V rauskommen... Ohne Last sinds aber 5,14 V (s.o)

Problem
01.12.2010, 22:38
Also ich will das vieleicht auch machen und fasse mal zusammen


zuerst einfach nur die 2 IR-Dioden wie am Bild montieren

siehe https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114).

Brauch ich 5 Kabelstücke und richtig anlöten (verbinden)

Dann ist es nur noch eine Progermierer sache oder

Wie weit geht das ca. ? (Hindernisserkennung)

mfg

radbruch
01.12.2010, 23:22
Hallo


Die Spannungen sehen wie folgt aus:An welchen Punkten gemessen? Gut wäre (trotz der Kurzschlussgefahr beim Messen) direkt am SFH5110 bzw. am C8/C2.


Im Moment betreibe ich den Asuro mit NiMH-Akkus 4x1,2 V ohne gejumperte Diode.Der Jumper sollte bei Akkus gesteckt (=überbrückt) sein. Auch wenn die Ladeschlussspannungen der Akkus in Summe mehr als 5V betragen. Der Mega8 kann nominal 5,5V und ich habe bisher noch nichts von einem "abgerauchten" asuro gelesen :)

Die Library bietet auch die Funktion Batterie(), leider weiß ich aber nicht, ab welcher Version. Damit könnte man die Bordspannung mit und ohne Motoren ermitteln und aus den Werten eventuell Rückschlüsse auf die Bordspannung ziehen. Das habe ich aber bisher noch nie versucht und ich bin mir deshalb nicht sicher, ob das möglicherweise eine Sackgasse ist. Jumper stecken und Akkus laden sollte vorerst mal reichen ;)

@Problem (ist der Name Programm? :)
Die zwei "IR-Dioden" sind die IR-LED und der IR-Empfänger. Die haben 2+3=5 Beinchen und benötigen daher auch fünf Leitungen, wenn man sie mit dem asuro verbinden will. Infos zur IR-Abstandsmessung findest du auch im asurowiki (http://www.asurowiki.de/pmwiki/pmwiki.php). Du stürzt dich von einem Abenteuer ins nächste, magst du nicht mal bei einem Thema bleiben?

Gruß

mic

Kagee
02.12.2010, 06:26
verdammt ich depp!

Die Spannungen sind gemessen direkt am Akkupack, also kommt die Diode noch dahinter. Das würde bedeutet:

Abgeschaltet 5,14 V -0,6 V = 4,54 V
Bootvorgang: 5,09 V -0,6V = 4,49 V
Angeschaltete Motoren bei v=255: 4,93 V -0, 6V = 4,33 V
Angeschaltete Motoren bei v=64 (Räder drehen sich nicht): 5,05 V - 0,6 V = 4,45 V

das reicht natürlich nicht. Ich werd die Diode heute mal überbrücken und testen, dann melde ich mich nochmal. Vielen Dank schonmal *freu*

Problem
02.12.2010, 15:08
Du stürzt dich von einem Abenteuer ins nächste, magst du nicht mal bei einem Thema bleiben?


Ja währ vlt besser

Kagee
03.12.2010, 16:40
also die Vermutung kann ich nun bestätigen. Mit überbrückter Diode funktioniert die IR-Erkennung nun bei allen Geschwindigkeiten.

besten Dank, radbruch =D>