Sparrow-Peripherie und Sensoren
Der
Sparrow ist zwar nun schon vielfach im Test, aber eine Frage steht noch
im Raum: Ist die Beschaltung mit zwei Tastern und zwei LEDs
schon optimal? Eine klare Meinung dazu habe ich von Leander
gehört: Eigentlich ist es schade, dass nicht ein einiger Pin des
Tiny13 ganz frei geblieben ist.
Insbesondere
der Anschluss von LED2 zwischen PB4 und PB3 hat Vor- und Nachteile, die
abgewogen werden wollen. Beide Ports sind ja auch AD-Eingänge.
Vorteile:
1. Man kann die LED komplett wegschalten und dann beide AD-Eingänge nutzen.
2. Man kann die LED in Durchlassrichtung und in Sperrrichtung als Lichtsensor schalten
3. LED2 kann als kleiner Kondensator für Touch-Sensoren dienen
4. Man kann LED bei Bedarf "frei "verdrahten und z.B. zwischen PB1 und VCC schalten (invertiertes PWM)
Nachteile:
1. Um LED2 einzuschalten muss man PB4 low-schalten, PB4 ist dann nicht anders nutzbar
2. Ein Pin fehlt oft, z.B. kann man nicht gleichzeitig einen AD-Eingang und außerdem LED2 nutzen.
3. Für beide Hautpanwendungen, Touch-Sensor und Lichtsensor gibt es Alternativen mit LED2 an GND
Und hier kommen die Programme, die die Alternativen beleuchten:
Lichtsensor 1
Die
LED wird hier in Sperrrichtung betrieben und zu Anfang der Messung wie
ein kleiner Kondensator geladen. Der Fotostrom entlädt die LED.
Gemessen wird die Entladezeit. Sie ist umgekehrt proportional zur
Helligkeit. Das Verfahren wurde bereits erfolgreich mit dem Tiny13
durchgeführt (ELO: LED-Lichtsensor).
Es hängt aber auch von der verwendeten LED ab. Die
Ergebnisse müssen nicht immer gleich sein. Es kam z.B. der Verdacht
auf, dass eine zu heiß gelötete SMD-LED einen Leckstrom hat, der den
Fotostrom überdecken kann. Das Programm misst die Helligkeit. Wird ein
bestimmter Grenzwert unterschritten schaltet sich dei LED ein.
Interessant ist hier, dass dieselbe LED als Sensor und zur Ausgabe
verwendet wird. Das funktioniert weil die LED zwischen B3 und B4
geschaltet ist. Im Programm ist eine serielle Ausgabe vorgesehen,
sodass man während der Entwicklung Ergebnisse an einem Terminal sehen
kann.
'Sparrow_Lightsensor1.bas
'K an PB4
'A über 1 k an PB3
'LED1 leuchtet bei Dunkelheit
$regfile = "attiny13.dat"
$crystal = 1200000
Baud = 9600
Dim D As Integer
Dim N As Byte
Dim Mini As Byte
Dim Maxi As Byte
Dim T As Integer
'Baud = 9600
Config Adc = Single , Prescaler = Auto
Start Adc
Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Do
N = 0
Ddrb.3 = 1
Portb.3 = 0
Ddrb.4 = 0
Portb.4 = 1 'Laden
Portb.4 = 1 'Freigeben
Portb.4 = 0
Do
N = N + 1
If N > 11 Then
N = 11
Ddrb.4 = 1
End If
Waitms 5
Loop Until Pinb.4 = 0
Put #1 , N
If N > 10 Then
Ddrb.3 = 1
Portb.3 = 1
Ddrb.4 = 1
Portb.4 = 0
Waitms 1000
End If
If N < 11 Then
Ddrb.3 = 1
Portb.3 = 0
Ddrb.4 = 0
Portb.4 = 0
End If
Waitms 50
Loop
End
Kapazitiver Touch-Sensor
Hier wird das abgewandelte
Q-Touch-Verfahren von Atmel verwendet (vgl. AVR-Touch-Sensor). Normalerwiese legt man dabei
einen Kondensator von z.B. 10.000 pF zwischen zwei Ports. Eine Seite
ist dann mit der kapazitiven Touch-Fläche verbunden. Die spannende Frage
war, ob die rote LED als kleiner Kondensator funktioniert. Sie hat ja
in Sperrrichtung nur etwa 5 pF. Mit einem Trick wird die Kapazität noch
etwas vergrößert. Kurz vor der Messung wird die LED nämlich über
den internen Pullup in Durchlassrichtung betrieben. Die Sperrschicht
wird dabei enger und bekommt mehr Kapazität. Tatsächlich sieht man
auch ein schwaches rotes Leuchten.
Je
nach LED liefert die Sub
Touch einen Wert von T=2 oder T = 3. Eine zusätzliche Kapazität an B3
verringert diesen Wert auf 1. Ein Vorteil des Verfahrens ist, dass man
mit zwei Leitungen eine abgesetzte LED verwenden kann, die gleichzeitig
die Zuleitung zum Sensor und zur Anzeige ist. Im Programm ist
eine serielle Ausgabe vorgesehen, sodass man während der Entwicklung
Ergebnisse an einem Terminal sehen kann.
'Sparrow_Touch1.bas
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 4
$framesize = 4
Dim T As Byte
Declare Sub Touch()
Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Do
Touch
'Put #1 , T
If T < 2 Then
Portb.3 = 1
Ddrb.3 = 1
Wait 1
End If
Loop
Sub Touch
Ddrb.3 = 0
Portb.3 = 0
For T = 1 To 200
Ddrb.3 = 0 'B3 hochohmig
Portb.4 = 1 'B4 high
Ddrb.4 = 1 'B4 niederohmig
If Pinb.3 = 0 Then Exit For 'B3 low?
Ddrb.4 = 0 'B4 hochohmig
Portb.4 = 0 'ohne Pullup
Ddrb.3 = 1
Next T 'B3 low
Portb.3 = 1 '0
Portb.4 = 0
' Ddrb.3 = 1
Ddrb.4 = 1
End Sub
End
Alternative Schaltung
Dies ist
die Alternative: LED2 ist permanent gegen GND geschaltet. B4 bleibt dann frei
für beliebige Anwendungen. Die folgenden beiden Beispiele zeigen, dass man
damit dieselben Ergebnisse erzielen kann, vielleicht sogar noch besser. Die
beiden Apps sind so geschrieben, dass man sowohl die alte wie auch die neue Schaltung
verwenden kann.
Sparrow_Lightsensor
Die rote
LED dient als Lichtsensor und zugleich als Leuchte. Bei geringer Helligkeit
schaltet sich die LED an. Wenn es hell ist kann man das Licht durch kurzes
Abschatten für fünf Sekunden einschalten. Diesmal liegt die Kathode der LED2
permanent an GND, sodass man den Port B4 sparen könnte. Ausgewertet wird die
von der LED als Fotoelement erzeugte Spannung. Die Spannung steigt
logarithmisch mit der Helligkeit, sodass man einen großen Helligkeitsbereich
hat. Es ist erforderlich, über mehrere AD-Messungen zu mitteln um eine zuverlässiges
Ergebnis zu bekommen, das wenig von externen 50-Hz-Feldern beeinflusst wird.
Download: Sparrow_LightSensor.zip
Direkt laden: http://tiny.systems/categorie/cheepit/LightSensor.html
'Sparrow_Lightsensor.bas
'K an PB4
'A über 10 k an PB3
'LED leuchtet bei Dunkelheit
$regfile = "attiny13.dat"
$crystal = 1200000
Baud = 9600
$hwstack = 8
$swstack = 4
$framesize = 4
Dim D As Word
Dim N As Byte
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc 'Ref 1,1 V
Ddrb.4 = 1
Portb.4 = 0
Do
D = 0
For N = 1 To 50
D = D + Getadc(3)
Next N
D = D / 50
If D < 700 Then '770 mV
Ddrb.3 = 1
Portb.3 = 1
Wait 5
End If
Portb.3 = 0
Ddrb.3 = 0
Loop
End
Sparrow_TouchB4
Wenn man
B4 berührt geht die rote LED für fünf Sekunden an. Es reicht auch hier einen Draht
anzuschließen, den man nur außen an seiner Isolierung berührt. Oder man
verwendet eine isolierte Metallfläche als kapazitiven Näherungssensor. Das
Programm wertet die geringe Kapazitätsänderung am Port B4 aus. B4 wird
während der Messung über den hochohmigen Pullup aufgeladen. Sofort nach dem
Einschalten des Pullup wird der Eingangszustand des Pins abgefragt. Die
Frage ist, schafft der Pullup eine so schnelle Aufladung, dass schon ein
1-Pegel gelesen wird? Das hängt von der Geschwindigkeit der Abfrage und der
Kapazität am Port ab. Wenn hier ein Draht angeschossen ist und man diesen außen
an der Isolierung berührt steigt die Kapazität etwas, die Aufladung wird langsamer.
Normalerweise reicht das aber noch nicht für einen Null-Zustand beim Lesen.
Deshalb wird hier der ganze Controller auf 2,4 MHz hochgetaktet. Damit ist
ein eindeutiger Unterschied messbar.
Download: Sparrow_TouchB4.zip
Direkt laden: http://tiny.systems/categorie/cheepit/TouchSensor.html
'Sparrow_TouchB4.bas
$regfile = "attiny13.dat"
$crystal = 2400000
$hwstack = 8
$swstack = 4
$framesize = 4
Dim D As Byte
Clkpr = 128 '2,4 MHz
Clkpr = 2
Clkpr = 2
nop
nop
nop
Do
Ddrb.4 = 1
Portb.4 = 0
Ddrb.3 = 0
Portb.3 = 0
Ddrb.4 = 0
Portb.4 = 1
D = Pinb.4
Portb.4 = 0
Ddrb.4 = 1
If D = 0 Then
Portb.3 = 1
Ddrb.3 = 1
Wait 5
Portb.3 = 0
Ddrb.3 = 0
Waitms 2
End If
Loop
Sparrow_LichtAlarm
Diese
Alarmanlage wertet kleinste Änderungen der Helligkeit aus. Da ist kein
direkter Schattenwurf erforderlich, es reicht schon, dass jemand sich irgendwo
an einem Fenster vorbeischleicht, eine Tür öffnet oder eine Taschenlampe
benutzt. Bei jeder schnellen Änderung der Helligkeit geht für einige Sekunden
die grüne LED an. Langsame Änderungen werden dagegen toleriert.
Das
Programm wertet die Spannung an der roten LED aus und mittelt
jeweils 64 Messwerte um eventuelles Lampenflackern zu eliminieren. Die
schon gemittelten Messwerte werden dann noch einmal wie mit einem
Tiefpassfilter geglättet. Wenn sich die tatsächliche Helligkeit
nur langsam ändert sind der geglättete und der aktuelle Messwert
gleich. Aber bei plötzlichen Änderungen zeigt sich ein Unterschied, der
den Alarm auslöst.
Download: Sparrow_LichtAlarm.zip
Direkt laden: http://tiny.systems/categorie/cheepit/LichtAlarm.html
'Sparrow_LichtAlarm.bas
'K an PB4
'A über 1 k an PB3
'LED1 leuchtet bei schzneller Änderung der Helligkeit
$regfile = "attiny13.dat"
$crystal = 1200000
Baud = 9600
$hwstack = 8
$swstack = 4
$framesize = 4
Dim D As Word
Dim E As Word
Dim M As Word
Dim N As Byte
Dim I As Byte
Dim T As Word
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Config Portb = &B00010010
'Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up
Config Adc = Single , Prescaler = Auto
Start Adc
Do
D = M
Shift D , Right , 4
M = M - D 'Tiefpass-Mittelwert * (1 -1 / 16)
D = 0
For N = 1 To 64
D = D + Getadc(3)
Waitus 160
Next N
Shift D , Right , 6 'Gemittelter Messwert
M = M + D 'Tiefpass-Mittelwert + Messwert
E = M
Shift E , Right , 4
' Pwm0b = D 'Ausgabe nur zum Debuggen
If D > E Then 'Schnelle Änderungen auswerten
D = D - E
If D > 2 Then T = 100 'Alarm-Haltezeit
Else
E = E - D
If E > 2 Then T = 100 'Alarm-Haltezeit
End If
If T > 0 Then T = T - 1
If T > 1 Then
Led1 = 1
Else
Led1 = 0
End If
Loop
End