Infrarot funktioniert gut:
https://www.roboternetz.de/community...bstandsmessung
Hallo,
ich möchte gerne ein ACS an meine NIBObee bauen.
Was ist dafür besser geeignet, Ultraschall oder Infrarot? Oder hat einer vielleicht noch eine andere, bessere Lösung?
Die zweite Frage wär, ob man diese über die freien Analoganschlüsse der NIBObee verbinden kann. (bin neu auf dem Gebiet, könnt sein dass die Frage dumm ist )
mfG pacman
Infrarot funktioniert gut:
https://www.roboternetz.de/community...bstandsmessung
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
mh.. also wenn ich mir den thread so durchlese, wird es wohl eine kompliziertere Angelegenheit als ich gedacht hatte ;D..
ich möchte jetzt keine richtige, genaue Abstandsmessung, sondern nur, dass der Bot erkennt, dass zB halb links ein Gegenstand ist. Da müssten doch ein paar Infrarot-LEDs und ein TSOP reichen oder?
So arg kompliziert ist es auch wieder nicht. Der Aufbau ist Minimal und die Software ist quasi fertig. TSOP und IR-Leds (jeweils mit Vorwiderständen) reichen aus, aber viel mehr ist die vorgestellte Lösung ja auch nicht.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
stimmt, ist im Prinzip ja eigentlich fast das selbe .. jedenfalls, vielen Dank für deine Antworten, ich schau dann mal was ich nehme.
radbruch, könntest du mir vielleicht noch einmal helfen ... da ich eben einen TSOP bei mir gefunden habe, habe ich mich entschlossen mein ACS damit zu bauen. Ich habe leider keine Ahnung wie ich den in Verbindung mit den IR-LEDs anschließen soll. (wie gesagt, ich bin neu auf dem Gebiet)
Ich bin um jede Hilfe dankbar!
Es sind zwei IR-LED jeweils mit Vorwiderstand und ein 36kHz-IR-Empfänger mit Vorwiderstand und Glättungskondensatoren nach Datenblatt (z.B. der SFH5110). Der Anschluß ist im Kopf der Programme beschrieben:
Das ist aber eher als Vorschlag zu betrachten und kann natürlich an die eigene bee angepasst werden.Code:// Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0) // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1) // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden // Der Empfänger SFH5110 ist mit PA2 (X2-AN2) verbunden #define ddr_acs_led_l DDRA // Anoden der IR-LEDs links #define port_acs_led_l PORTA #define pin_acs_led_l (1<<PA1) #define ddr_acs_led_r DDRA // rechts #define port_acs_led_r PORTA #define pin_acs_led_r (1<<PA0) #define ddr_acs_36kHz DDRA // Kathoden der IR-LEDS mit 36kHz getaktet #define port_acs_36kHz PORTA #define pin_acs_36kHz (1<<PA3) #define ddr_acs_tsop DDRA // Eingang IR-Empfänger #define port_acs_tsop PINA // Achtung, das ist ein Eingang! #define pin_acs_tsop (1<<PA2)
Zum Thema IR-Abstandsmessung wurde auch von oberallgeier etwas Grundlagenforschung betrieben:
https://www.roboternetz.de/community...elle-des-asuro
http://www.mikrocontroller.net/topic/125704
Aufbau beim asuro:
https://www.roboternetz.de/community...l=1#post489253
Geändert von radbruch (06.06.2011 um 09:56 Uhr)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo,
ich habe mein NIBObee mit 4 IR-LEDs erweitert. Das Problem ist jetzt das Programm zu schreiben. Ich bin Programmieranfänger und habe versucht ein Programm zu schreiben, wo zumindest mal die LEDs leuchten. Mit dem Code hier, klappt es allerdings nicht (was für eine Überraschung ):
Ich weiß, wenn ihr den Code seht, werdet ihr mich wahrscheinlich auslachen ..aber könnt ihr mir vielleicht trotzdem weiterhelfen?Code:#include <nibobee/iodefs.h> #include <nibobee/led.h> #include <nibobee/delay.h> #define ddr_acs_led_l DDRA #define port_acs_led_l PORTA #define pin_acs_led_l (1<<PA1) #define ddr_acs_led_r DDRA #define port_acs_led_r PORTA #define pin_acs_led_r (1<<PA0) #define ddr_acs_36kHz DDRA #define port_acs_36kHz PORTA #define pin_acs_36kHz (1<<PA3) #define ddr_acs_tsop DDRA #define port_acs_tsop PINA #define pin_acs_tsop (1<<PA2) int main() {led_init(); while(1==1) { led_set(ddr_acs_led_l, 1); led_set(ddr_acs_led_r, 1); } return 0; }
Hallo
Wenn man an den freien Erweiterungssteckern der bee etwas anschliesen möchte, kann man die Befehle der Library nicht so ohne weiteres verwenden. Man muss vielmehr die entsprechenden IO-Pins "von Hand" ansteuern. Dazu muss man allerdings ein paar Grundlagen kennen:
Die Ein- bzw. Ausgänge des Kontrollers sind zu Ports mit (meist) 8 einzelnen Pins zusammengefasst und von 0 bis 7 durchnummeriert. Jeder Pin kann ein Eingang oder ein Ausgang sein, die jeweilige Funktion kann für jeden Pin einzeln festgelegt werden. Als Ausgang kann ein Pin entweder ein low (0V) oder ein high (5V) ausgeben. Als Eingang können alle Pins digital eingelesen werden, einige besondere (meist ein kompletter Port) können auch analoge Signale verarbeiten. Bei allen als Eingang verwendeten Pins kann man Bedarf einen zusätzlichen internen PullUp-Widerstand (OpenKollektor) aktivieren.
Ohne PullUp ist ein Eingang sehr hochohmig, ein Pin kann deshalb drei Zustände annehmen: High, Low und Hochohmig (oder Z-State). Das ist wichtig für die gebräuchlichen Kommunikationsprotokolle wie SPI oder TWI(I2C) und sprengt den Rahmen des Beitrags ;)
Jeder Port besitzt drei Register, das Eingangsregister, das Ausgangsregister und das Datenrichtungsregister. Sie ermöglichen den Zugriff auf die Daten und die Funktion des Ports. Diese Register sind 8 Bit (= ein Byte) breit, jedes Bit entspricht einem Pin im jeweiligen Port. Die Nummer des Pins bezeichnet deshalb die Stelle des Pins als Zweierpotenz im Registerbyte, 2^0 (mit Wert 1!) ist Pin0, 2^1 (Wert 2) ist Pin1 bis 2^7 (Wert 128) für Pin7.
Mit dem Datenrichtungsregister (DDR + Portname A-D) entscheidet man, ob die Pins eines Ports jeweils als Ein- oder Ausgang geschaltet sind. Jeder Pin, dessen Bit im Registerbyte 1 ("gesetzt") ist, ist ein Ausgang, jeder Pin mit einer 0 in seinem Bit ("nicht gesetzt") ist ein Eingang. Ist ein Pin als Ausgang geschaltet, kann man mit dem entsprechenden Bit im Ausgangsregister (PORT + Portname) mit einem gesetzten Bit ein High und einem gelöschten Bit ein Low ausgeben. Wenn der Pin als Eingang geschaltet ist, wird das entsprechende Bit im Eingangsregister (PIN -Portname) in Abhängigkeit vom angelegten Spannungspegel gesetzt oder gelöscht. Bei Eingängen schaltet das Ausgaberegister die internen PullUp-Widerstände. Ein gesetztes Bit schaltet den PullUp für den Pin ein, ein gelöschtes Bit schalten ihn aus.
Verwirrt? Keine Panik, das kann man alles auch in den bekannten AVR-Tutorials nachlesen. ;) Nach so vielen Grundlagen kommen wir nun endlich zur Praxis.
Bei Start nach dem Einschalten oder einem Reset sind alle Pis auf Eingang ohne PullUp geschaltet. Das ist eine Vorsichtsmassnahme um zu verhindern, dass etwas abraucht. Die Init-Funktionen der Library setzt dann in den diversen Registern die zur externen Hardware passenden Bits. Bei einer eigenen Erweiterung muss man diese Bits selbst richtig setzen.
Als Beispiel schliesen wir eine LED mit ihrem Vorwiderstand zwischen Pin0 von PortA (PA0) und GND (0V) an, die Kathode (der Strich im Schaltplan) zeigt dabei nach GND. Diese LED würde leuchten, wenn am PA0 5V (ein High) ausgegeben wird. Also müssen wir das Bit im Datenrichtungsregister setzen um einen Ausgang zu erhalten und das Bit im Ausgangsregister muss gesetzt sein für ein High:
DDRA = 1;
PORTA = 1;
while(1);
Jetzt sollte die LED leuchten :)
Blöderweise haben wir so aber alle anderen Pins vom Port A auf Eingang geschaltet, das stört natürlich alle anderen Funktionen an diesem Port. Viel besser wäre es, wenn wir nur das benötigte Bit manipulieren würden und alle anderen Bits so lassen würden, wie sie sind. Das erreichen wir mit einer bitweisen Verknüpfung (nicht mit einer logischen Verknüpfung verwechseln!) des alten Registerwertes mit dem Bitwert für den zu ändernden Pin. Dazu muss man zuallererst den Registerwert auslesen, dann die gewünschte Verknüpfung ausführen und dann erst das Ergebniss wieder ins Register zurückschreiben. Für unser Beispiel mit der LED an PA0 würde das so aussehen:
DDRA = DDRA | 1;
PORTA = PORTA | 1;
Oder die Kurzform:
DDRA |= 1;
PORTA |= 1;
(Beide Schreibweisen erzeugen den selben Programmcode!)
Ächz. Mehr zum Thema Bitmanipulationen findet man auch wieder in den Tutorials. Ich hatte das hier schonmal angeschnitten:
https://www.roboternetz.de/community...l=1#post271532
Es wäre natürlich schlau alle Fragen zu deiner IR-Erweiterung in einem Thread zusammenzufassen. ;)
Desweiteren wäre ebenfalls schlau mitzuteilen, wo und wie die LEDs angeschlossen wurden. ;)ich habe mein NIBObee mit 4 IR-LEDs erweitert.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo radbruch,
ich finde es echt super, dass du dir die Mühe machst und die Zeit nimmst mir alles so genau zu erklären!
Ich habe deinen Ratschlag befolgt und die Anoden der rechten IR-LEDs an Signal 1 von X1 angeschlossen, die Anoden der linken an Signal 2 von X1, die Kathoden beider Seiten an Signal 1 von X3 und den Empfänger an Signal 1 von X2.Desweiteren wäre ebenfalls schlau mitzuteilen, wo und wie die LEDs angeschlossen wurden.
Fragen: 1. Also muss ich, wenn ich es richtig verstanden habe, die Kathoden der LEDs als Ausgang als low definieren?
2. Wie kann ich die eingehenden Daten, die von meinem Empfänger ausgehen, sehen? (sprich die Werte)
3. Muss ich die +/- Anschlüsse von z.B. X1 auch aktivieren? (für den Empfänger)
4. Wie kann ich in einem Code schreiben, dass die LEDs z.B. jede Sekunde leuchten? Kann ich da auf die delay.h zurückgreifen?
5. Muss ich an den Projekteinstellungen im AVR-Studio etwas ändern?
Geändert von pacman (08.06.2011 um 21:16 Uhr)
Lesezeichen