PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR Hindernisserkennung



Reeper
18.10.2005, 18:01
Hallo, ich habe ein Problem mit rc5 (ja, das altbekannte Thema :oops:

Also ich will mit einer IR-Diode (SFH415) senden, in einem Programm funktioniert und mit einem IR-Empfänger (SFH5110-36) empfangen (was auch in einem Programm funktioniert.

Habe den Empfänger mal mit einer rc5 Fernbedienung getestet und es funktioniert.


$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600
$lib "mcsbyte.lbx"

Config Pina.7 = Input 'out-pin vom ir empfänger
Config Pinc.3 = Output 'Status-LED
Config Rc5 = Pina.7
Porta.7 = 1

Enable Interrupts
Dim Adress As Byte , Command As Byte

Do


Getrc5(adress , Command)
Waitms 150
If Adress < 255 Then
Print "Adress: " ; Adress ; "Command: " ; Command ; " - "
End If

If Command = 2 Then 'wenn die Taste 2 gedrückt, dann Status-LED an
Portc.3 = 1
Elseif Command = 255 Then
portc.3=0
End If

Loop
End


Will ich aber beide Befehle in einem Programm abarbeiten, akzeptiert Bascom den rc5send Befehl nicht:


$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600
$lib "mcsbyte.lbx"

Config Pind.5 = Output 'ir-led
Config Pina.7 = Input 'out-pin vom ir empfänger
Config Pinc.3 = Output 'Status-LED 1
Config Pinc.4 = Output 'Status-LED 2
Config Rc5 = Pina.7
Porta.7 = 1

Enable Interrupts
Dim Togbit As Byte , Adress As Byte , Command As Byte


Command = 12
Togbit = 0
Address = 0



Do
Waitms 500
Rc5send Togbit , Address , Command


Getrc5(adress , Command)
Waitms 150
If Adress < 255 Then
Print "Adress: " ; Adress ; "Command: " ; Command ; " - "
End If

If Command = 2 Then ' wenn Taste 2 gedrückt, dann Status-LED 1 an
Portc.3 = 1
Elseif Command = 255 Then
Portc.3 = 0
End If

If Command = 12 Then 'wenn command 12, dann Status-LED 2 an
Portc.4 = 1
Elseif Command = 255 Then
Portc.4 = 0
End If
Loop
End

Besagt die Zeile command = 12 vor do eigentlich, was gesendet wird?

Könnt ihr mir weiterhelfen?

Reeper
19.10.2005, 02:48
Habe gerade ein Fehler erkannt (Bascom hat einmal address und das andere mal adress geschrieben).

Also der neue Code ist:

$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600
$lib "mcsbyte.lbx"

Config Pind.5 = Output
Config Pina.7 = Input 'out-pin vom ir empfänger
Config Pinc.3 = Output
Config Rc5 = Pina.7
Porta.7 = 1


Enable Interrupts
Dim Togbit As Byte , Adress As Byte , Command As Byte

Command = 6
Togbit = 0
Adress = 0

Do

Waitms 150
Rc5send Togbit , Adress , Command
Waitms 150

Getrc5(adress , Command)
Waitms 150
If Adress < 255 Then
Print "Adress: " ; Adress ; "Command: " ; Command ; " - "
End If

If Command < 255 Then
Portc.3 = 1
Wait 1
Elseif Command = 255 Then
Portc.3 = 0
End If

Loop
End

Dieser schein in sich schlüssig zu sein, jedoch habe ich ein Problem beim senden.
Wenn ich die Stromversorgung des Atmel´s ausschalte, leuchtet die IR-LED ununterbrochen (ist +5V ---> A LED K -----> 220 Ohm > pind.5).
Wenn die Stromversorgung des Atmel's an ist, flackert die IR-LED periodisch (so, dass man es mit einer trägen Digicam sehen kann - das Flackern, also kann das best. nicht die "Codierung" sein).

Werde die IR-LED mal über einen Transistor ansteuern, mal schauen, was rauskommt.
Vielleicht seht ihr ja noch ein Fehler, denn Bascom beschreibt die Schaltung ja wie oben 8-[

Reeper
20.10.2005, 11:20
Morgen.

Kann mir denn keiner ein Tipp geben?

Das mit dem Transistor funktioniert tadellos, die IR.LED leuchtet jetzt, wenn diese es soll.
Ich kann nebenher mit dem Empfänger die Daten einer externen Quelle auslesen, aber eben nicht die, die vom Atmel selbst kommen.

Aber ist es überhaupt möglich mit einem Atmel Daten über die IR.LED zu senden und diese! gleichzeitig zu empfangen (dies wäre ja Multitasking, was nicht funktioniert), oder irre ich mich?

Danke für eure Hilfe.

Reeper
23.10.2005, 17:38
Kann mir keiner weiterhelfen?
Ist es überhaupt möglich, dieses mit einem Controller zu lösen (Empfang evtl. über adc)?

pebisoft
23.10.2005, 19:44
Aber ist es überhaupt möglich mit einem Atmel Daten über die IR.LED zu senden und diese! gleichzeitig zu empfangen (dies wäre ja Multitasking, was nicht funktioniert), oder irre ich mich?
nein......................du irrst nicht.

1 avr zum senden-------------1 avr zum empfangen

mfg pebisoft

Reeper
09.11.2005, 23:20
Hallo,
ich habe meinen Roboter jetzt halbwegs fertig.
Vorne habe ich eine IR-Bake gebastelt.
Über portd.5 wird ein rc5code zu einem Transistor geschickt (mit 4,7kohm Widerstand). Dieser schaltet alle IR-Dioden auf Masse. Die ganzen 5 IR-Dioden sind über ein Vorwiderstand direkt an VCC und die Kathode jeweils an einem Transistor (werden mit seperaten port auf den anderen Transistor vom Portd.5 gelegt).
Dies funktioniert, es kommt ein Signal an (ich kann auch für jede einezelne IR-Diode einen seperaten Code senden, wenn diese durch den Transistor auf Masse gelegt ist).

Aber: Wie kann ich die Sendeleistung verringern? Ich habe schon mit den Vorwiderständen rumprobiert (von der IR-Diode und von den Empfängern), aber keine zufriedenstellende Lösung erhalten.
(IR-Diode = SFH 415 , Empfänger = SFH 5110-36
Könnt ihr mir helfen?

waste
10.11.2005, 00:36
Hallo Reeper,

die Sendeleistung kann man entweder über den Vorwiderstand oder über das Tastverhältnis einstellen. Hast Du schon meinen Beitrag (https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114)zur IR-Hinderniserkennung gesehen. Vielleicht kannst Du da was übernehmen, es werden auch die gleichen Bauteile verwendet.

Aber warum sendest Du einen Code? Warum nicht nur den 36kHz-Träger?

Wenn Du weniger Leistung brauchst, dann sollten auch die Transistoren überflüssig sein und die Dioden direkt vom AVR angesteuert werden können.

Gruß Waste

Reeper
10.11.2005, 17:43
Hallo waste

habe heute meine ganze Bake nochmal neu konstruiert, sie funktioniert jetzt mit einem 220Ohm Widerstand für die IR-Dioden und 470Ohm für die Empfänger (werde für die IR-Dioden aber noch höhere ptobieren).

Die Transistoren verwende ich, da ich alle 5 IR-Dioden über einen einzigen Port steuere (das wollte ich diesen nicht zutrauen, wenn alle ab und zu gleichzeitig leuchten sollen, reichen doch die 20mA des Ports nicht).
Mit den Transistoren schalte ich jeweils nur eine IR-Diode auf Masse (zB. der Portc.2 ist mit dem Transistor verbunden, den schalte ich auf high und somit diese eine IR-Diode auf Masse und schicke nun über portd.5 (der wiederum an einen Transistor hängt und die Verbindung von allen Transistoren - Emitter letzendlich mit GND verbindet, einen rc5Code).

Den Code verwende ich, damit ich weiß, wo sich das Hinderniss ungefähr befindet.
Doch wie erzeuge ich mit Bascom nur ein 36khz Trägersignal (das wäre interessant)?

Ach ja, deinen genialen Beitrag habe ich auch für den Asuro genutzt (jedenfalls Hardware - mäßig). Aber programmieren mit C fällt mir noch sehr schwer, da ich überhaupt keine Vorkenntnisse im Programmieren habe (außer CNC \:D/ ) und mich erst seit August mit Robotik beschäftige.
Bascom ist für mich als Anfänger logischer und intuitiv.

waste
10.11.2005, 21:46
Hallo Reeper,

so ganz ist mir Deine Schaltung noch nicht klar. Kannst Du mal einen Schaltplan zeichnen?

Ich kenn mich mit Bascom nicht aus, aber damit sollte auch ein 36kHz-Signal mit einstellbarem Tastverhältnis (PWM) möglich sein. Vielleicht kann Dir da ein Bascom-Experte weiterhelfen.

Gruß Waste

Reeper
11.11.2005, 15:41
Ich habe mal ein Teil des Schaltplans gezeichnet:

http://www.pixum.de/int/img.php?u=reeper&t=2&i3=!4034427154034432839540048420&ts=13126&np=1&sid=r4wz5dd14dac0f32a0ea71e1fed1fe55

Habe mittlerweile 860 Ohm Vorwiderstände für die IR-Dioden genommen (probiere aber weiterhin versch.).

Ein Programm zum testen habe ich hier:


$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600

Config Pind.5 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pinc.6 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output

Dim Togbit As Byte
Dim Command1 As Byte , Command2 As Byte , Command3 As Byte , Command4 As Byte , Command5 As Byte
Dim Address As Byte

Command1 = 11
Command2 = 12
Command3 = 13
Command4 = 14
Command5 = 15
Togbit = 0
Address = 1

Do

Portb.0 = 1
Portb.1 = 1

Portc.6 = 1
Print "1"
Rc5send Togbit , Address , Command1
Portc.6 = 0
Portc.5 = 1
Print "2"
Rc5send Togbit , Address , Command2
Portc.5 = 0
Portc.4 = 1
Print "3"
Rc5send Togbit , Address , Command3
Portc.4 = 0
Portc.3 = 1
Print "4"
Rc5send Togbit , Address , Command4
Portc.3 = 0
Portc.2 = 1
Print "5"
Rc5send Togbit , Address , Command5
Portc.2 = 0

Loop

End

Der andere Atmel 32 empfängt die Daten und verwertet diese entsprechend dem gespeicherten Programm, benutze also 2 Controller.

waste
11.11.2005, 16:23
Danke, jetzt seh ich klarer. Bei 860 Ohm könntest schon wieder direkt die Portausgänge verwenden. Übrigens die Relation von Strom und Abstand des Erkennens ist quadratisch. Also bei halber Entfernung brauchst nur ein viertel des Stromes.

Bei Bascom muss Dir wie gesagt ein anderer weiterhelfen.

Gruß Waste

Reeper
11.11.2005, 19:27
Naja, wie geschrieben weiß ich nicht, ob ich alle 5 IR-LED's an einen einzigen Port hängen kann (wenn ab und zu mal alle leuchten sollen, müsste die benötigt Stromstärke doch höher als 20mA sein - die der Controller-Port aushält).
Das mit den Transistoren funtkioniert ja, die habe ich eh aus einer Monitorplatine rausgelötet, hat also nichts gekostet (man muss nur erstmal die richtigen Transistoren finden =P~ ).

waste
11.11.2005, 20:11
Kein Problem wenn es funktioniert. Bei nächster Gelegenheit kannst ja meinen Vorschlag übernehmen (siehe Bild). Bei 860 Ohm fließt pro Port weniger als 5mA. Die Polarität der Ports bleibt sogar gleich.

Gruß Waste

Reeper
11.11.2005, 20:43
Aber ich könnte nicht steuern, über welche IR-Diode gerade welcher Code gesendet werden soll :-k .

waste
11.11.2005, 22:51
Meine Schaltung macht das Gleiche wie Deine. Das Programm muss nicht geändert werden. Nur sind die 860 Ohm Widerstände direkt an die Ports geschaltet.
Beispiel: Geht der PortC2 auf HIGH, dann sendet die Diode D1, genau wie bei deiner Schaltung.

Noch eine Frage: Willst Du für jede Diode einen anderen Code senden? Ich dachte der Code wird mit PortD5 erzeugt.

Waste

Reeper
11.11.2005, 23:56
Ja, ich sende, wenn ich eine Diode auf Masse lege einen best. rc5 Code, wenn ich eine andere auf Masse lege dann entsprechend einen anderen Code. Somit kann ich auf den ungefähren Ort des Hindernisses schließen (vorne, rechts oder links) und entsprechend eine Antwort dafür programmieren (Empfänger sind alle parallel direkt an einen Port des anderen Atmel's 32).

Bis jetzt fahre ich damit ganz gut O:)