• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Reaktives Licht mit Atmel AVR

thomas_st

Geowizard
Geomane schrieb:
thomas_st schrieb:
Ebenfalls außen vor sind "." (· − · − · −), "," (− − · · − −), usw.
Wieso, genau Punkt und Komma klappen doch wunderbar:

Punkt = 10101010
Komma = 10110011

Bei anderen Codes funktioniert das leider nicht immer.
Stimmt, ist mir später dann auch aufgefallen, dass diese beiden Beispiele ausgerechnet funktionieren. ;) Allgemein: alle 6 stellige Codes mit einem dah am Ende klappen und auch alle 7 stellige mit dit dah am Ende. Das ist IMO aber schon etwas undurchsichtige Programmierung: zur Erklärung: Bit 5 bzw. 5 und 6 werden hier für zwei Aufgaben genutzt: 1.) zur Codierung der Codelänge und 2.) für die letzten Zeichen des Morsecodes selbst.

Viele Grüße und sorry an alle, die sich jetzt verwirrt vorkommen,
Thomas(_st)
 

movie_fan

Geoguru
na ich freu mich schon *gg*
"triggert das reaktivlicht auf 500meter an"
"enddeckt den morsecode der via infrarot gesendet wird"
"versteht was die aufgabe von euch will"
"und lauft dahin"

wann issen der online?!? :) :D
 

Geomane

Geocacher
thomas_st schrieb:
Allgemein: alle 6 stellige Codes mit einem dah am Ende klappen und auch alle 7 stellige mit dit dah am Ende.
Für alle, die es interessiert: Ich verwende eine modifizierte Routine, bei der zum Längenwert nur dann 1 addiert wird, wenn der Längenwert kleiner oder gleich 5 ist. So kann ich noch ein paar Zeichen mehr in der Liste haben (z. B. den Klammeraffen und das Fragezeichen), das "ß" aber auch nicht.

Die Liste schaut dann bei mir so aus:

Code:
Buchstabe	Längenwert	tats. Länge	Byte
A	1	2	0x00100010
B	3	4	0x01100001
C	3	4	0x01100101
D	2	3	0x01000001
E	0	1	0x00000000
F	3	4	0x01100100
G	2	3	0x01000011
H	3	4	0x01100000
I	1	2	0x00100000
J	3	4	0x01101110
K	2	3	0x01000101
L	3	4	0x01100010
M	1	2	0x00100011
N	1	2	0x00100001
O	2	3	0x01000111
P	3	4	0x01100110
Q	3	4	0x01101011
R	2	3	0x01000010
S	2	3	0x01000000
T	0	1	0x00000001
U	2	3	0x01000100
V	3	4	0x01101000
W	2	3	0x01000110
X	3	4	0x01101001
Y	3	4	0x01101101
Z	3	4	0x01100011
0	4	5	0x10011111
1	4	5	0x10011110
2	4	5	0x10011100
3	4	5	0x10011000
4	4	5	0x10010000
5	4	5	0x10000000
6	4	5	0x10000001
7	4	5	0x10000011
8	4	5	0x10000111
9	4	5	0x10001111
À,Å	4	5	0x10010110
Ä	3	4	0x01101010
È	4	5	0x10010010
É	4	5	0x10000100
Ö	3	4	0x01100111
Ü	3	4	0x01101100
CH	3	4	0x01101111
Ñ	4	5	0x10011011
.	5	6	0x10101010
,	5	6	0x10110011
:	6	6	0x11000111
;	6	6	0x11010101
?	6	6	0x11001100
-	5	6	0x10100001
(	4	5	0x10001101
)	5	6	0x10101101
'	6	6	0x11011110
=	4	5	0x10010001
+	4	5	0x10001010
/	4	5	0x10001001
@	6	6	0x11010110
Spruchanfang	4	5	0x10010101
Pause	4	5	0x10010001
Spruchende	4	5	0x10001010
verstanden	4	5	0x10001000
Verkehrsende	5	6	0x10101000

Zur Info hab ich den Längencode und die tatsächliche Länge dazugeschrieben. Die Spalten verrutschen leider, das müsst Ihr Euch selber hinschieben ;-)

Die Morsezeichen selber hab ich aus Wikipedia.
 

Swunn

Geocacher
Nehmt doch einfach zwei Bytes: eines für die Länge, eines für den Code. Soviel Speicher wird doch noch übrig sein.

Btw: Man muss den Code nicht im Eeprom ablegen, man kann das auch in den Flash packen und mit LPM auslesen, ist schneller und sicherer.

Swunn
 

chr2k

Geomaster
Swunn schrieb:
Btw: Man muss den Code nicht im Eeprom ablegen, man kann das auch in den Flash packen und mit LPM auslesen, ist schneller und sicherer.

Das würde im Code wie aussehen? Gibts ein Kontra für diesne Vorschlag?

Danke
Gruß
 

chr2k

Geomaster
Ich kann ja von GLück sagen, das ich meinen einen Tiny nicht geschrottet habe, hatte ihn grade eingie minuten (!!!) falsch herum gepolt angeschlossen 8 war minus 4 war plus. Hatte dann heir ne kleine heizung...


Aber ich hab ein anderes problem. Ich bekomme den Morse-Programmcode von seite 25 nicht zum laufen. das "SOS" signal bewirkt bei meinem reaktiv licht nichts. habe die dit/dah zeit schon auf 1200/2400 gestellt, da ich zuerst vermutet habe, das ich nciht sauber genug morse. Aber es klappt immer noch nicht.
 

chr2k

Geomaster
Schittlewiller schrieb:
Hier, wie versprochen mein Progrämmchen.
Was ausgegeben wird lese ich aus dem EEPROM. Dieses solltet ihr also "füllen". Das geht direkt übers BASCOM. Ich erledige das aber per Code (folgt später). Vergesst nicht, das Fusebit G auf 0 zu stellen.

Code:
'============================================================
'
' ***********************************************************
' ***                                                     ***
' *** Reaktiv-Tiny v0.5 2006-02-25                   (AP) ***
' ***                                                     ***
' *** Morsecodeabfrage eines Morsezeichens mit            ***
' *** anschließender Ausgabe von bis zu 64 Morsezeichen.  ***
' *** Es können Koordinaten oder beliebiger Text          ***
' *** ausgegeben werden.                                  ***
' *** Die Eingabegeschwindigkeit wird mit der ersten      ***
' *** empfangenen Zeichenlänge bestimmt                   ***
' ***                                                     ***
' ***                                                     ***
' *** --------------- Einstellungen --------------------- ***
' ***                                                     ***
' *** Fusebit H:    0                                     ***
' *** Fusebit G:    0                                     ***
' *** Fusebit F:    1                                     ***
' *** Fusebit E:    1                                     ***
' *** Fusebit DCBA: 1011                                  ***
' ***                                                     ***
' *** Beachtet das Fusebit G. Es muss auf 0 stehen!       ***
' ***                                                     ***
' *** Unter 'Options' ' Compiler' 'Chip'                  ***
' *** den "HW Stack" runterstellen. z.B. auf 6            ***
' ***                                                     ***
' ***********************************************************
'
' µC: ATtiny13V
'
'============================================================
'
$regfile = "ATtiny13.DAT"
$crystal = 113000              'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 6
'
Config Portb = &B00011000      'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111             'Pullups zuschalten, außer für Pinb.3 und .4
'
Stop Adc                       'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac                        'Analog-Komparator abschalten, um Strom zu sparen
'
'
'Anmerkung zur Deklaration: bin sparsam mit den Variablen umgegangen,
'd.h. diese werden zum Teil im Programm mehrfach für verschiedene Aufgaben verwendet.
'Grund: ich kenne das "Drosseln" des HW Stack erst seit es hier im Fred stand. Dank an Gonzoarts.
Dim Hell As Bit
Dim Vhell As Bit
Dim Ok As Bit
Dim A As Byte
Dim B As Byte
Dim Ein As Integer
Dim Bx As Byte
Dim Z As Byte
Dim D1 As Byte
Dim D2 As Integer
'
'
'
'
' Es können alle Buchstaben und Zahlen gesendet werden, da diese maximal 5 Zeichen lang sind. 
' Ausgabe der Zeichen aus dem EEPROM mit Länge
'                                             
'
'
' dit = kurz = . = 0   
' dah = lang = - = 1
'
'             
'            765 43210                              
'            \_/ \___/                              
'             |    |                                
'           Länge  |                                
'                  |                                
'            Morsezeichen v.rechts (rückwärts)     
'
'     Morse   Bit v.r.
'1 = .---- = 100|11110
'2 = ..--- = 100|11100
'3 = ...-- = 100|11000
'4 = ....- = 100|10000
'5 = ..... = 100|00000
'6 = -.... = 100|00001
'7 = --... = 100|00011
'8 = ---.. = 100|00111
'9 = ----. = 100|01111
'0 = ----- = 100|11111
'
'N = -.    = 001|00010
'E = .     = 000|00000
'
'KA (Spruch Anfang) = -.-.- = 100|10101
'AR (Spruch Ende)   = .-.-. = 100|01010
'
'Wortabstand einfügen mit 111|11111  (FF)
'
'
' Übertragungsrate
' 1 WPM: 1 dit = 1200 ms
' 5 WPM: 1 dit =  240 ms
'10 WPM: 1 dit =  120 ms
'20 WPM: 1 dit =   60 ms
'
'
'==> Übertragungsrate festlegen, hier 5 Wörtern pro Minute (WPM)
D1 = 240                                    'D1 entspricht der Länge eines dit in Millisekunden
D2 = 480                                    'D2 entspricht der doppelten Länge eines dit
'
'==> Abgefragtes Zeichen festlegen
Ein = &B0000000000111000                    'Beispiel: SOS  ...---...   
'
'
Ok = 1
Gosub Morsen                                'beim Start das ganze mal testweise Morsen
'
' Morsezeichen - Abfrage:
Do
   Gosub Led_abfrage
   If Hell = 1 Then Vhell = 1               'Bei Licht Merker setzen
   If Vhell = 1 And B < 255 Then B = B + 1  'Wenn Merker gesetzt wurde, Zähler für Lichtdauer erhöhen (bis max. 255)
   If Hell = 0 Then
      If Vhell = 1 Or B = 255 Then          'Übergang zu Dunkel
         If Z = 0 Then
            Ok = 1                          'Neues Spiel, neues Glück
                                            'Festlegen der Grenzdauer. Diese entscheidet, ob ein dit oder dah eingegeben wurde.
           '==> Leider muss man hier "von Hand" eintragen, ob das erste Zeichen dit oder dah ist. Bei dit B), bei dah A) auskommentieren
           'Die benötigte If-Abfrage hat im 1k Programmspeicher des ATtiny13V keinen Platz mehr.
                                       'A) erstes abgefragtes Zeichen ist ein dit
            If B < 127 Then            'A) dies sollte nicht zu lange sein
               Bx = B * 1.7            'A) Grenzdauer Bx durch Länge des ersten dit festlegen
            Else                       'A)
               Ok = 0                  'A) das war zu lange fürs erste dit
            End If                     'A)
                                       'B) erstes abgefragtes Zeichen ist ein dah
'            Bx = B / 2                'B) Grenzdauer Bx durch Länge des ersten dah festlegen
         End If
         If B < Bx Then
            If Ein.z = 1 Then Ok = 0   'dit empfangen, wenn Ein.z = 0, dann richtig
         Else
            If Ein.z = 0 Then Ok = 0   'dah empfangen, wenn Ein.z = 1, dann richtig
         End If
         Z = Z + 1
         If Z = 9 Or Ok = 0 Then       'Auswerten wenn Falsch ODER Anzahl Zeichen erreicht
            Gosub Morsen               '==> Z auf die Anzahl abgefragter Zeichen einstellen
         End If
      End If
   End If
   If Hell = 0 Then                    'Bei Dunkelheit Merker und Zähler für Lichtdauer löschen
      Vhell = 0
      B = 0
   End If
Loop


Morsen:
   Waitms 500                          'Pause, sonst ist das erste Zeichen schwer zu lesen
   If Ok = 1 Then                      'Morsezeichen senden
      For Bx = 0 To 36                 '=> Länge anpassen!
         Readeeprom A , Bx             'in A steht der zu morsende Code (Bit 0 bis 4 dit und dah, Bit 5 bis 7 die Anzahl
         Z = 0
         Z.0 = A.5                     'Zeichenlänge steht in den vorderen 3 Bit (A.5 bis 7)
         Z.1 = A.6
         Z.2 = A.7
         If Z = 7 Then                 'bei FF einen Wortabstand einfügen (4dit = 7dit - 3dit)
            Waitms D2
            Waitms D2
         Else                          'Zeichenlänge: 1 bis 5  (0 bis 4)
            Gosub Licht
         End If
      Next Bx
   Else                                ' IRRUNG senden
       If B < 255 Then                 ' aber nicht, wenn die Dämmerung eintritt bzw. ein langes Lichtsignal anlag
          Z = 7
          A = 0                        ' Irrung  =  ........ =  0
          Gosub Licht
       End If
   End If
   'A = 0
   B = 0
   Z = 0
Return


Licht:
   For B = 0 To Z
      Portb.3 = 1                      'LED an
      Waitms D1                        '1  . dit
      If A.b = 1 Then
         Waitms D2                     '3  - dah
      End If
      Portb.3 = 0                      'LED aus
      Waitms D1                        '1 dit  Pause
   Next B
   Waitms D2                           '+2 dit Pause nach Ziffer
Return


Led_abfrage:
   Portb.3 = 0                         'Portb.3 auf Masse schalten
   Portb.4 = 1                         'Portb.4 auf +Ub schalten, um die LED zu 'laden'
   Waitus 1                            'Ladezeit 1 µs, kann ggf. noch verkleinert werden
   Config Portb.4 = Input              'Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
   Portb.4 = 0                         'Pullup abschalten, sonst geht's nicht!
   Waitms 20                           'Entladezeit 20 ms - je größer, desto weniger Licht genügt (je kleiner, je unempfindlicher)
   If Pinb.4 = 0 Then                  'Ladezustand einlesen: '1' -> dunkel, '0' -> hell
      Hell = 1
   Else
      Hell = 0
   End If
   Config Portb.4 = Output             'Portb.4 wieder auf Ausgang schalten
   Portb.4 = 0                         'Portb.4 auf Masse schalten
Return


End

Viel Spaß
Andi


Ich bekomm es einfach nicht gebacken das reaktivlicht mit dem "SOS" Morsecode zu triggern damit es mir die Korrdinaten ausspuckt.

Was mir auch merkwürdig vorkommt ist in dem Code die Binärfolge für das SOS "&B0000000000111000"

Hat jemand eine Idee?

Dankeschön

Gute Nacht
Christian
 

stonewood

Geowizard
chr2k schrieb:
Swunn schrieb:
Btw: Man muss den Code nicht im Eeprom ablegen, man kann das auch in den Flash packen und mit LPM auslesen, ist schneller und sicherer.
Das würde im Code wie aussehen? Gibts ein Kontra für diesne Vorschlag?
Kontra ist vielleicht nur daß Dir irgendwann der Speicher ausgeht. Das EEprom ist halt sonst für nix benutzt.
Aber als erste Näherung: Der Tiny hat 64 Byte EEprom, das reicht also sicher für 32 Zeichen. Z.b. Byte N wäre dann die Länge, Byte N+1 der Code. Das wären dann 22 Buchstaben, 10 Zahlen - Du willst doch keine Romane morsen? Oder man nimmt 3 Byte: 1 Byte Länge (4 Bit+4Bit), 2 Byte Codes, damit also 42 Zeichen.
 

stonewood

Geowizard
chr2k schrieb:
Code:
'==> Abgefragtes Zeichen festlegen
Ein = &B0000000000111000                    'Beispiel: SOS  ...---...   
[..]
         End If
         If B < Bx Then
            If Ein.z = 1 Then Ok = 0   'dit empfangen, wenn Ein.z = 0, dann richtig
         Else
            If Ein.z = 0 Then Ok = 0   'dah empfangen, wenn Ein.z = 1, dann richtig
         End If
         Z = Z + 1
         If Z = 9 Or Ok = 0 Then       'Auswerten wenn Falsch ODER Anzahl Zeichen erreicht
Ich bekomm es einfach nicht gebacken das reaktivlicht mit dem "SOS" Morsecode zu triggern damit es mir die Korrdinaten ausspuckt.

Was mir auch merkwürdig vorkommt ist in dem Code die Binärfolge für das SOS "&B0000000000111000"

Das ist (wieder rückwärts zu lesen!) 0-0-0-1-1-1-0-0-0, und die Abfrage 'Z=9' sagt uns daß davon nur 9 Bit benutzt werden. Soweit also richtig. Wenn da nun was eigenes rein soll muß man Z auch auf die richtige Länge anpassen.
 

stonewood

Geowizard
So, ich hab nun mal mit einem Fototransistor anstatt des LDR rumgespielt. Konkret: SFH300 von Reichelt. Billig, klein (zumindest in der Fläche, das Teil sieht wie eine LED aus, ist aber ca. 8mm hoch, 5mm Durchmesser), schnell (10 us Reaktionszeit) und tut auch seinen Dienst:
Statt - --- R --- LDR --- + habe ich nun - --- R --- FTT --- + im Spannungsteiler verbaut. Als Widerstand hab ich 1 MOhm genommen. Das ganze hab ich dann mal mit einem AtMega und einem LCD vermessen, dabei waren die gemessenen Werte von 20-1023, je nachdem ob das wirklich 'ganz hell' oder 'ganz dunkel' war. Die Schwankungen waren dabei ziemlich klein, die Schwelle habe ich drum auf 20 runtergesetzt. Ansonsten habe ich das Standardprogramm genutzt.

Ergebnis:
- mit der LED-Stirnlampe etwa gleiche Reichweite, vielleicht etwas weniger (1 W LED, unfokussiert, ca. 30-40 m)
- mit meiner Baumarkt-4D mit Kryptonbirne habe ich nach 150m aufgehört - das Teil verschwand dann hinter Büschen. Das Licht ließ sich jedes mal zuverlässig auslösen, von daher schätze ich mal daß ich bei 200-300m weitertesten sollte ...

Zumindest die etwas geringere Reichweite der LED-Leuchte kann an der größeren Empfindlichkeit bei warmen Farben liegen: Der SFH 300 geht von 420nm bis 1130 nm, mit einem Maximum bei 870nm (was schon im IR liegt), eine blaue LED hat ca. 465 nm.

Das ganze paßt mit zwei AA-Batterien in einen 13cm Petling, die LDR-Variante habe ich bisher nur in einen 13,8cm Petling bekommen. Die Platine dafür ist 5 Rasterlöcher breit, 8 Rasterlöcher lang. Ab dem zweiten Rasterloch kommt dann der Atmel, und für LED und Fototransistor sind dann noch 3 Rasterlöcher übrig. Am Fototransistor habe ich dafür die Beine etwas mit dem Seitenschneider bearbeitet: Mit den Stegen an den Beinen ist der ca. 12mm hoch, das paßt dann mit Platine nicht mehr in den Petling. Wenn man die Stege abschneidet geht das ohne größere Probleme.

So, und nu mach ich wohl mal Bilder damit auch wer versteht was ich hier rumfasele ...
 

thomas_st

Geowizard
Ich habe nun meine Reaktivlicht so weit fertig, dass ich damit zufrieden bin. Es passt in einen kleinen Petling, wie auf den Bildern erkennbar.

Gesamtansicht

Leiterplatte Vorderseite (Größe der Platine: 38x16mm²)

Rückseite mit LDR

Als Batterien habe ich hier AAAA-Zellen genutzt, die nebeneinander in den Petling passen. Diese beiden stammen aus einem 9V-Block von Varta, welcher 6 davon enthält (Achtung: 9V-Blöcke anderer Hersteller könnten anders aufgebaut sein).
Im Prototypen hatte ich noch AAA-Zellen genutzt, was aber einen großen Petling bedurfte, da diese nicht nebeneinander passen.

Viele Grüße,
Thomas(_st)
 

Swunn

Geocacher
Für eine Energizer sieht das so aus:



Zum Vergleich eine AAA-Zelle.

Swunn

Btw: Ein Angstkondensator 100n X7R kostet bei Reichelt etwa 6 ct. Dafür bekommt man eine längere Batterienutzungsdauer (da der bei Alterung und Kälte höhere Innenwiderstand für die HF* überbrückt wird und der IC nicht so schnell in den BrownOut geht) und ein geringeres Rauschen des ADC (da die Ref besser ist). Und der Platz für so eine Perle sollte auch noch zu finden sein, notfalls als 1206er SMD.

*) Störungen auf der Versorgungsspannung können mehrere 100mVpp ausmachen, auch bei internem Oszillator.
 

Kappler

Geowizard
@Swunn:
Du leuchtest und detektierst durch den Boden des PETlings hindurch.
Hast du mal getestet, ob hierdurch die Reichweite sinkt? Am Boden ist der Kunststoff doch deutlich dicker als an der Wand und speziell in der Mitte der "Knoten" könnte eine Abschattung bewirken...
 

conrad

Geocacher
> Du leuchtest und detektierst durch den Boden des PETlings hindurch.
> Hast du mal getestet, ob hierdurch die Reichweite sinkt? Am Boden ist > der Kunststoff doch deutlich dicker als an der Wand


Ich experimentiere grad ein wenig mit der "Nur LED Variante" (arbeite mich Step by Step durch den Tread und das Kochbuch)und glaube festzustellen das es eher günstiger ist ..... Mag an der Streuung liegen aber mein Prototyp reagiert sicherer bzw. zuverlässiger wenn er in einem Milchglas steckt..... Das ist natürlich subjektiv und nicht durch Messungen bestätigt ;-)

Gruß conrad
 
Oben