dr_Bal
15.07.2009, 03:13
Hi,
Ich arbeite mich gerade in die Atmega Controller ein und hier ist mal ein kleines Testprojekt. :-)
Ich fand ne alte Solarzelle und nen Servo in der Bastelkiste, also warum nicht mal ne Solarzelle mittels Servo und 2 LDRs der Sonne nachführen.
Gesagt getan und losgebaut, hier das Ergebniss:
2 LDR, einer links und einer rechts von der Solarzelle messen das Licht und der Atmega wertet es aus. Der Atmega bewegt dann das Servo in die Richtung wo es heller ist. das ganze macht er solange bis beide in etwa gleich Hell sind.
Mann kann im Code einen Puffer einstellen, wieviel Abstand zwischen den beiden Messergebnissen sein darf bis der Atmega reagiert.
Hier ein kleines Video davon:
http://www.youtube.com/watch?v=qcufMahoQEQ
Werde es wohl Morgen (heute) noch so abändern, das nur aller 10min gemessen wird um Strom zu sparen. Evtl. werde ich dann auch einen Attiny26 verwenden.
Das ganze soll, nicht hundertprozentig eine Funktion erfüllen, es geht mir nur darum mich in die Atmegas einzuarbeiten.
hier noch der Code:
'************************************************* *********
'* TEST Solarnachführung mittels Servo *
'* Ronny Drbal *
'* Email: ronny at ronbal de *
'* *
'* Servo am PORTD.5 LDR an ADC0 & ADC1 *
'* *
'************************************************* *********
$regfile = "m16def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 9600 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Config Servos = 1 , Servo1 = Portd.5 , Reload = 10 'Servo Konfigurieren
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Konfigurieren
Enable Interrupts
Start Adc
Dim Linkerldr As Word
Dim Rechterldr As Word
Dim Serv1 As Byte
Dim Rechts1 As Word
Dim Rechts2 As Word
Serv1 = 45 'Startposition des Servos
Servo(1) = Serv1 'Servo setzen
Do
Messen: 'Wert vom linken LDR einlesen
Linkerldr = Getadc(0) 'Wert vom rechten LDR einlesen
Rechterldr = Getadc(1) 'Werte ausgeben an die Serielle Schnittstelle
Print "links: " ; Linkerldr ;
Print " rechts: " ; Rechterldr ;
Print " SERVO POS: " ; Serv1
Rechts1 = Rechterldr + 1 'hier werden die AD Werte etwas gelättet :-)
Rechts2 = Rechterldr - 1
If Linkerldr > Rechts1 Then 'prüfen wo es heller ist
If Serv1 > 144 Then 'prüfen ob Servo schon an der Max pos ist
Goto Messen
End If
Serv1 = Serv1 + 1 'Servo eine position weiter
Servo(1) = Serv1
Waitms 50
Goto Messen
End If
If Linkerldr < Rechts2 Then
If Serv1 < 45 Then
Goto Messen
End If
Serv1 = Serv1 - 1
Servo(1) = Serv1
Waitms 50
Goto Messen
End If
Loop
End
Gebt doch mal feedback was ihr davon haltet.
VG
dr_bal
Ich arbeite mich gerade in die Atmega Controller ein und hier ist mal ein kleines Testprojekt. :-)
Ich fand ne alte Solarzelle und nen Servo in der Bastelkiste, also warum nicht mal ne Solarzelle mittels Servo und 2 LDRs der Sonne nachführen.
Gesagt getan und losgebaut, hier das Ergebniss:
2 LDR, einer links und einer rechts von der Solarzelle messen das Licht und der Atmega wertet es aus. Der Atmega bewegt dann das Servo in die Richtung wo es heller ist. das ganze macht er solange bis beide in etwa gleich Hell sind.
Mann kann im Code einen Puffer einstellen, wieviel Abstand zwischen den beiden Messergebnissen sein darf bis der Atmega reagiert.
Hier ein kleines Video davon:
http://www.youtube.com/watch?v=qcufMahoQEQ
Werde es wohl Morgen (heute) noch so abändern, das nur aller 10min gemessen wird um Strom zu sparen. Evtl. werde ich dann auch einen Attiny26 verwenden.
Das ganze soll, nicht hundertprozentig eine Funktion erfüllen, es geht mir nur darum mich in die Atmegas einzuarbeiten.
hier noch der Code:
'************************************************* *********
'* TEST Solarnachführung mittels Servo *
'* Ronny Drbal *
'* Email: ronny at ronbal de *
'* *
'* Servo am PORTD.5 LDR an ADC0 & ADC1 *
'* *
'************************************************* *********
$regfile = "m16def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 9600 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Config Servos = 1 , Servo1 = Portd.5 , Reload = 10 'Servo Konfigurieren
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Konfigurieren
Enable Interrupts
Start Adc
Dim Linkerldr As Word
Dim Rechterldr As Word
Dim Serv1 As Byte
Dim Rechts1 As Word
Dim Rechts2 As Word
Serv1 = 45 'Startposition des Servos
Servo(1) = Serv1 'Servo setzen
Do
Messen: 'Wert vom linken LDR einlesen
Linkerldr = Getadc(0) 'Wert vom rechten LDR einlesen
Rechterldr = Getadc(1) 'Werte ausgeben an die Serielle Schnittstelle
Print "links: " ; Linkerldr ;
Print " rechts: " ; Rechterldr ;
Print " SERVO POS: " ; Serv1
Rechts1 = Rechterldr + 1 'hier werden die AD Werte etwas gelättet :-)
Rechts2 = Rechterldr - 1
If Linkerldr > Rechts1 Then 'prüfen wo es heller ist
If Serv1 > 144 Then 'prüfen ob Servo schon an der Max pos ist
Goto Messen
End If
Serv1 = Serv1 + 1 'Servo eine position weiter
Servo(1) = Serv1
Waitms 50
Goto Messen
End If
If Linkerldr < Rechts2 Then
If Serv1 < 45 Then
Goto Messen
End If
Serv1 = Serv1 - 1
Servo(1) = Serv1
Waitms 50
Goto Messen
End If
Loop
End
Gebt doch mal feedback was ihr davon haltet.
VG
dr_bal