Sparrow-Peripherie und Sensoren      

      
Elektronik-Labor  Projekte  AVR 




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




Elektronik-Labor  Projekte  AVR