PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probot 128 ACS: Implementieren eines Abstandssensors/Distanzmessers



philonous
21.12.2013, 17:04
Hallo zusammen,

ich habe eine grundsätzliche Frage zum Probot 128 oder besser dessen IR-LEDs und dem IR-Empfänger.

Nach meinem Verständnis des Programmcodes und auch des Schaltplans gibt es hier nur die Möglichkeit, abzufragen, ob etwas "im Weg" ist, aber nicht, wie weit es entfernt ist.
Der Rückgabewert der Funktionen ACS_RIGHT und ACS_LEFT ist ja auch nur ein Boolean ...

Gibt es irgendeine (einfache) Möglichkeit, einen Abstandssensor "drumrum" zu bauen?

Es scheint immerhin Ansätze/Versuche zu geben:
https://www.roboternetz.de/community/threads/55516-ProBot128-ACS
https://www.roboternetz.de/community/threads/51567-Probleme-bei-Programm-f%C3%BCr-Pro-Bot-128?p=498302&viewfull=1#post498302

Das hat aber wohl auch nicht wirklich funktioniert, wie mir scheint ;)

Vielen Dank und schöne Grüße,
phil

radbruch
21.12.2013, 18:27
Hallo

Inzwischen kenne ich vier Ansätze mit denen man mit einem IR-ACS Rückschlüsse auf die Entfernung zum Hinderniss ziehen kann:

Änderung der Trägerfrequenz:
Funktioniert nicht wirklich, denn der TSOP reagiert zu heftig, wenn sich die Frequenz vom Nennwert entfernt:
https://www.roboternetz.de/community/threads/33984-Abstandsmessung-%C3%A4hnlich-wie-IR-Schnittstelle-des-asuro?p=326640&viewfull=1#post326640

Änderung des Burst:
Ein Burst sind IR-Impulspakete. Ein IR-Empfänger reagiert erst nach einer bestimmten Anzahl von Trägerfrequenzperioden bevor er ein Signal als gültig anerkennt (typisch ca. 6-10 Perioden). Mit zunehmenden Abstand muss der Burst länger sein um erkannt zu werden. Das funktioniert leidlich...

Änderung der Sendeleistung über Vorwiderstände:
Mit größerem Hardwareaufwand verbunden wird hierbei der Strom durch die ACS-LED verändert. Das funktioniert gut und wird z.B. beim RP6 angewand:
https://www.roboternetz.de/community/threads/58081-Frage-zur-Funktionsweise-eines-Anti-Collision-System-(mit-Infrarot)

Änderung der duty cycles:
Normalerweise wird das Trägersignal mit 50:50 Impuls zu Pause gesendet. Durch Vergrößerung der Pause (Low-Anteil, kein IR-Licht) kann man sehr feinfühlig den Abstand zum Hinderniss messen. Diese Methode funktioniert sehr gut. Beispiele für die Anwendung:

Der "Klassiger" beim Asuro nach waste:
https://www.roboternetz.de/community/threads/9973-Asuro-Umbau-der-IR-Schnittstelle-zur-Hinderniserkennung
https://www.roboternetz.de/community/threads/24212-Minimall%C3%B6sung-IR-Abstandsmessung

Meine Umsetzung mit der bee:
https://www.roboternetz.de/community/threads/46233-nibobee-IR-Abstandsmessung?p=443546&viewfull=1#post443546

Mit der Probot-Hardware funktioniert die duty-cycle-Methode auch sehr gut:


void ACSData(unsigned int *data)
{
UCSRB &= ~(1<<TXEN); // USART TX disable

OCR2=0xff;
DDRD |= (1<<PD1);
PORTD &= ~(1<<PD1); // ACS LED left on
while(PIND & 1)
{
acs=15;
while(acs);
OCR2--;
}
PORTD |= (1<<PD1); // ACS LED left off
data[0]=OCR2;
while(!(PIND &1));

OCR2=0xff;
PORTB &= ~(1<<PB0); // ACS LED right on
while(PIND & 1)
{
acs=15;
while(acs);
OCR2--;
}
PORTB |= (1<<PB0); // ACS LED right off 6
data[1]=OCR2;
while(!(PIND &1));

OCR2=0x91; //36kHz
}(Aus https://www.roboternetz.de/community/threads/43885-ProBot-mit-asuro-Mega8?p=423547&viewfull=1#post423547)

Das Pulse/Pauseverhältniss wird (bei konstantem Burst von 15) schrittweise von 0:255 Richtung 50:50 geändert. Wenn der IR-Empfänger das Signal erkennt (sein Signalpegel geht auf Low) kann man aus dem aktuellen Verhältniss von Puls zu Pause auf den Abstand schliesen.

Das funktioniert gut, scheiterte aber in den von dir gezeigten Beispielen an der Umsetzung auf dem ccpro ;)


http://www.youtube.com/watch?v=ri9kHphFiPI

Gruß

mic

philonous
24.12.2013, 10:56
Vielen Dank, mic, für die schnelle und vor allem sehr ausführliche Antwort! :)

Da ich allerdings absoluter Neuling bin, ist mir allerdings unklar, ob ich das mit dem "normalen" C-Control Pro-Controller auch bewerkstelligen kann. Du hast ja in dem verlinkten Thread einen ATMega8 zur Steuerung verwendet – bei mir ist ein C-Control Pro-Controller drauf.

Die Namen UCSRB, OCR2 usw. im Code oben sind nicht in der Lib vorhanden, müssten meiner naiven Meinung nach dann von der Pin-Belegung des Controllers kommen. Nur gibt es natürlich UCSRB, OCR2 usw. nicht in der Pin-Belegung der C-Control Pro (wie aus der Hilfe der leider nur unter Windows lauffähigen IDE entnommen hab).

Ist es also überhaupt möglich mit entsprechender Änderung der Namen/Pins dieselbe Funktionalität mit der C-Control Pro hinzubekommen oder nimmt der letzte Satz Deines Posts schon vorweg, dass das gar nicht möglich ist?!

Danke und schönes Fest und so ;)
phil

PS: Dass man einen Interpreter verwendet, kann ich noch halbwegs verstehen, aber warum baut man eine proprietäre IDE, die nur unter Windows lauffähig ist?? Argh. (Ich hab den Roboter geschenkt bekommen, anderenfalls wäre die Wahl wohl eher auf den ASURO gefallen ... )

Valen
30.12.2013, 22:21
Den C-Control Pro-Controller modul hat ein Atmega128 microcontroller in. Das ist den Grossere Brüder von den Atmega8. Also sind viele von den Registern, Timer, Zahlern, ADC, Pin-Funktionen ähnlich. Aber nicht gleich. Die nahmen UCSRB, OCR2 usw. werdest du in dem Datenblätter der beiden Microcontrollern finden. Auch die bestimmten Pins (von den Chip) wo sie mit verbunden sind stehen dort in. Aber welcher Pins der C-Control Pro Controller modul diesen mit verbunden sind muss du irgendwo aus der C-Control Pro documentation herausfinden. Es gibt sicher irgendwo einer Atmega128->C-Control Pro 128 Pinbelegung Tabelle.


EDIT: Wusste ich doch: http://www.c-control-pro.de/documentation/modul128.htm