PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [GELÖST] - Erweiterung für Bluetooth - Asuro



pinsel120866
03.10.2008, 06:32
Hallo zusammen,

ich habe mir von http://www.e-robotix.de/epages/61660837.sf die ATMEGA32 - Bluetooth - Platine gekauft und sie mit einer eigenen Erweiterung auf Basis der IR-Entfernungsmessung (sh. Anlage) ausgestattet.

Die PINs meiner Platine habe ich so belegt:

- Anoden beider IR-LEDs auf PIN21 (PD7) des ATMEGA32
- Kathode rechte IR-LED auf PIN2 (PB1) des ATMEGA32
- Kathode linke IR_LED auf PIN8 (PB7) des ATMEGA32
- OUT vom SFH5110 auf PIN7 (PB6) des ATMEGA32

Die Software sieht so aus (Codeschnipsel):


uint8_t objekt_sichtbar_rechts(uint8_t distance_r)
{
uint16_t j,z;

PORTB |= (1 << PB1); // PB1 auf HIGH (LED ausschalten)
DDRB |= (1 << DDB7); // Port B7 als Ausgang
PORTB &= ~(1 << PB7); // PB7 auf LOW

OCR2 = 254-distance_r; // wenn OCR2=0xFE dann Objekt sehr nahe
z=0;
for(j=0;j<30;j++) // loop time: 5ms
{
if (PINB & (1 << PB6))z++;
Sleep(6); // 6*Sleep(6)=1ms
}
if (z>=29) return FALSE; // Objekt nicht gefunden
else return TRUE;
}

uint8_t objekt_sichtbar_links(uint8_t distance_l)
{
uint16_t i,y;

PORTB |= (1 << PB7); // PB7 auf HIGH (LED ausschalten)
DDRB |= (1 << DDB1); // Port B1 als Ausgang
PORTB &= ~(1 << PB1); // PB1 auf LOW

OCR2 = 254-distance_l; // wenn OCR2=0xFE dann Objekt sehr nahe
y=0;
for(i=0;i<30;i++) // loop time: 5ms
{
if (PINB & (1 << PB6))y++;
Sleep(6); // 6*Sleep(6)=1ms
}
if (y>=29) return FALSE; // Objekt nicht gefunden
else return TRUE;
}


So weit so gut, aber die Entfernungsmessung funktioniert nicht, auf OUT des SFH5110 messe ich z. B. keine Spannung.

Bitte um Tipps und Hinweise was ich hier falsch gemacht habe.

oberallgeier
03.10.2008, 11:21
Hallo pinsel120866,

fleissig, fleissig! Wie ich sehe, hast Du ja jetzt (mindestens) zwei asuro´s. Und Dein zweiäugiger sieht ja wirklich nett aus, wieder mal mein Kompliment! Den code habe ich mir nicht durchgesehen, aber trotzdem frage ich: wie hoch ist die Spannung an den Akkus, am Prozessor, am 5110 usf. wenn Du all Deine Gimmicks: mega32, 2 (oder 3?) IR-LED´s, usf. in Betrieb hast. Aber vermutlich hast Du da schon nachgesehen. Und vermutlich hast Du auch den SFH5110 richtig versorgt, oder? Übrigens: keine Spannung am 5110 heisst ja, dass er ein kräftiges Signal zu erkennen glaubt (aktiv low ! ! !).

Ach ja, noch ne Frage: da ja das Bluetooth-Modul nicht im Lieferumgang ist - sind dann die xx € gerechtfertigt? Was ist im Lieferumfang?

pinsel120866
03.10.2008, 11:28
Hallo Nachbar,

danke für die Blumen. O:)

Zu deinen Fragen: Akkus sind voll, Am 5110 messe ich bei VCC 4,2V, IR-LEDs leuchten (mit Handykamera überprüft).

Ist meiner Meinung nach nur ein Softwareproblem, da am OUT vom SFH5110 keine Spannung anliegt.

Kosten sind gerechtfertigt, ist praktisch das gleiche wie die ATMEGA32-Platine, nur halt ohne IR. Allerdings war für mich die grösste Hürde das BT-Modul anzulöten - brauchte dazu Profi-Hilfe. Die Möglichkeiten werden mit BT deutlich erweitert.

oberallgeier
03.10.2008, 11:46
Aktiv low ! - also wenn der 5110 richtig versorgt ist UND die richtige Anzahl ir-Pulse mit ausreichendem Empfangspegel erkennt, dann geht er auf low! siehe Auszug Datenblatt:

http://oberallgeier.ob.funpic.de/5110_aktiv-low.jpg

pinsel120866
03.10.2008, 12:28
Das heisst also, dass das SFH5110 richtig arbeitet, oder?
Aber wo habe ich dann den Fehler?

oberallgeier
03.10.2008, 12:45
Hallo Nachbar,


... Das heisst also, dass das SFH5110 richtig arbeitet, oder? ...Du weißt doch selbst: eine Verifizierung ist praktisch nie möglich, eine Falsifizierung dagegen relativ einfach. Es KÖNNTE ja sein, dass GARNIX da ist, einfachste Möglichkeit: Drahtbruch. Vielleicht klemmst Du einen 10k zwischen Vcc und PB6 - der 5V-Pegel müsste dann von irgendetwas runtergezogen werden . . . . DANACH könntest Du sagen, dass der 5110 arbeitet. Ob er recht hat - das bleibt dann offen.

Es könnte z.B. sein, dass entweder Deine Kunststoffabdeckungen für irLicht durchsichtig sind (steht in meinem langen Thread, siehe unten "eigene Untersuchungen") oder dass die LED´s nach hinten scheinen und so Streulicht auf den 5110 fällt. Ich hatte z.B. in der Testphase die 5110er mit ziemlich dickem, weitgehend ir-dichtem Klebeband abgedeckt, siehe hier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=388755#388755) (3 Stück links oben). Evtl. Alufolie dranpappen.

Ich könnte mir folgenden Test vorstellen:
1) Low am PB6 lässt eine Test-LED leuchten, high löscht sie aus.
2) irLED´s eine Sekunde einschalten
3) irLED´s eine Sekunde ausschalten
4) Erkenntnisse aus dem Ergebnis ziehen *gggg*


... Aber wo habe ich dann den Fehler?Ja, das ist die bekannte Frage zum Feiertag (in DE ist Tag der deutschen (R)Einheit). Ich bin vor etlicher Zeit über Probleme bei der SFH415/SFH5110-Kombination (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=348970#348970) gestolpert und hatte deswegen etliche eigene Untersuchungen (https://www.roboternetz.de/phpBB2/viewtopic.php?t=38009) angestellt. Die sind mittlerweile abgeschlossen. Hatte aber eine Weile gedauert *schnief*. Das wäre ein Haufen Lesestoff, aber vielleicht hilft es Dir weiter (einfach Schnelllesen : also diagonal).

pinsel120866
06.10.2008, 10:15
Hallo Oberallgeier,

ich trete derzeit auf der Stelle. Hardwareseitig habe ich die Schaltung vom Asuro auf meine Erweiterungsplatine übernommen (Kondensatoren, Widerstand, SFH...), aber offensichtlich bin ich zu dämlich eine vernünftige Fehleranalyse durchzuführen.

Bin im Moment ratlos, weil das SFH nicht arbeitet. Ich habe es schon ausgetauscht, weil ich gemeint habe ich hätte es "gegrillt", aber ohne Erfolg.

Die IR-LEDs senden brav, aber ich weiss nicht ob es 36 MHz sind. Wie kann ich das herausfinden?

Ich habe auch schon ein kleines Testprogramm mit dem ich das SFH testen will:


while(1)
{
if (PINB & (1 << PB6)) StatusLED(OFF);
else StatusLED(GREEN);
}

Wenn ich nun mit meinem Asuro-PC-Adapter sende müsste eigentlich die Status LED blinken, was sie aber nicht tut...

](*,)

oberallgeier
06.10.2008, 11:19
Vermutlich die einfachste Testmöglichkeit (ohne Oszilloskop) ist der asuro in seiner Grundkonfiguration. Wenn es Dir möglich ist, einen Bauteilsatz (LED und Empfänger, also SFH415 und SFH5110) an den originalen asuro zu hängen, dann wäre die Funktion durch die Funktion der Schnittstelle nachweisbar. Dann könntest Du die Initialisierung so ändern, dass Du statt 36kHz nur noch 1Hz auf der LED hast - das siehste dann in der Kamera *gggg*.

An welchem Pin hängt aktuell die LED? Wie oben beschrieben?
Stimmt die Initialisierung der LED?
Ist der mega32 nicht durch verschiedene Bauteile in seiner Belastbarkeit ausgereizt?
Wieviel Spannung misst Du am Pin der LED im Betrieb?

Ich habe hier eine RNControl, 16 MHz-Quarze und mega32er. Vielleicht könntest Du den Code posten (PN), dann bastel ich mir einen Aufbau und teste das!?

pinsel120866
06.10.2008, 12:33
Belegung:

- Anoden beider IR-LEDs auf PIN21 (PD7)
- Kathode rechte IR-LED auf PIN2 (PB1)
- Kathode linke IR_LED auf PIN3(PB2)
- OUT vom SFH5110 auf PIN1 (PB0)

Spannungen:

- VCC von SFH5110 - 4,2V
- OUT von SFH5110 - 0V
- beide IR-LEDs - 2,2V

Testcode:

#include "asuro.h"
#include <stdlib.h>

uint8_t objekt_sichtbar_rechts(uint8_t distance)
{
uint16_t j,z;

PORTB |= (1 << PB1); // PB1 auf HIGH (LED ausschalten)
DDRB |= (1 << DDB2); // PB2 als Ausgang
PORTB &= ~(1 << PB2); // PB2 auf LOW

OCR2 = 254-distance; // wenn OCR2=0xFE dann Objekt sehr nahe
z=0;
for(j=0;j<30;j++) // loop time: 5ms
{
if (PIND & (1 << PB0))z++;
Sleep(6); // 6*Sleep(6)=1ms
}
if (z>=29) return FALSE; // Objekt nicht gefunden
else return TRUE;
}

uint8_t objekt_sichtbar_links(uint8_t distance)
{
uint16_t j,z;

PORTB |= (1 << PB2); // PB2 auf HIGH (LED ausschalten)
DDRB |= (1 << DDB1); // PB1 als Ausgang
PORTB &= ~(1 << PB1); // PB1 auf LOW

OCR2 = 254-distance; // wenn OCR2=0xFE dann Objekt sehr nahe
z=0;
for(j=0;j<30;j++) // loop time: 5ms
{
if (PIND & (1 << PB0))z++;
Sleep(6); // 6*Sleep(6)=1ms
}
if (z>=29) return FALSE; // Objekt nicht gefunden
else return TRUE;
}

uint8_t abstand_rechts()
{
uint8_t k,n;

k=255;
for(n=0;n<8;n++)
{
if (!objekt_sichtbar_rechts(n)) k=n; // solange kein Objekt, Distanz erhoehen
}
return k;
}

uint8_t abstand_links()
{
uint8_t l,m;

l=255;
for(m=0;m<8;m++)
{
if (!objekt_sichtbar_links(m)) l=m; // solange kein Objekt, Distanz erhoehen
}
return l;
}
/************************************************** ***********************

Hauptprogramm

************************************************** ***********************/
int main(void)
{
uint8_t n,m;

Init();

FrontLED(ON);
while(1)
{
n=abstand_rechts();
m=abstand_links();
StatusLED(OFF);
BackLED(OFF,OFF);

if ((n!=255) || (m!=255))
{
if (n<2) StatusLED(GREEN);
if (m<2) StatusLED(RED);
Msleep(10);
}
else StatusLED(YELLOW);
}
}

Wenn du bei diesem Programm eine der beiden IR-LEDs abdeckst, sollte die STATUS-LED grün oder rot leuchten.

oberallgeier
06.10.2008, 13:22
Hmmm - das ist der Code für den Mega16? Mit #include "asuro.h" ? ? ? Kann ich mir (fast) nicht vorstellen, dass das ohne Fehler zu übersetzen ist. Welche Frequenz hat der Quarz?

Oder ist das der Code für einen mega8 auf dem asuro? Wäre doooof - den m8 hatte ich noch nie. Hab zwar einige m168 hier, die sind pinkompatibel, werden aber total anders initialisiert = nicht software-kompatibel.

pinsel120866
06.10.2008, 13:30
Nein, das ist der Code für die ASURO - ATMEGA32 - Platine. Du hast doch geschrieben dass du einen hättest - oder hab ich was falsch verstanden?

oberallgeier
06.10.2008, 13:45
Stimmt, ich habe einen ATmega32 hier. Aber nicht Deine Erweiterungsplatine, ich wollte auf der RNControl testen (mega32 ist mega32 *ggg*).

Mein Problem ist jetzt: die asuro-lib initialisiert die Timer für einen mega8. Bisher wusste ich nicht, ob/dass die auch für den mega32 geht, aber ein oberflächlicher Blick in die beiden doc´s sieht recht gut aus. Den Code werde ich testen. Bin nur gerade bei der Gartenarbeit - daher (leider) bis heute spät abends. Wenn ich´s früher schaffe, meld ich mich natürlich. Hmmm, wär interessant - wenn die asuro-lib auch den m32 bedient . . . .

pinsel120866
06.10.2008, 21:46
Hallo,

die Erweitung läuft jetzt, es war ein Softwareproblem.

Danke für deine Unterstützung.