Guten Tag,
schonmal vielen Dank für das lesen meines Beitrags!
Ich möchte gerne eine kleine Hühnerstalltür öffnen wenn es hell wird und
schließen wenn es dunkel wird.
Ich habe dazu einen Standard Servo, einen Atmega8 und einen
Fotowiderstand von dem ich aber leider nicht die Typenbezeichnung haben.
Die Anssteuerung des Servos ist zwar schlampig geschrieben funktioniert
aber soweit.
Nur komme ich nicht mit der AD Wandlung klar, würde gerne bei erreichen
eines bestimmten Werts sagen Servo fahr Tür hoch und umgekehrt.
Ich habe den Fotowiderstand so verbunden:
PortC1 -> Fotowiderstand -> Batterie(Akku,1,2V ) -> GND
Ich weiss das eigentlich Kondensatoren dazu gehören, aber ich hab
gelesen das es man es zum testen auch ohne versuchen kann.
Habe das hier zusammengeschrieben:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB = (1<<PB1);
int i;
int x;
DDRC=0b00000000;
i=0;
while(1)
{
ADCSR=0b11000101;
while (bit_is_set(ADCSR,6));
x=ADCW;
if(x>200)
{
while(i<1000 ) {
PORTB |= (1<<PB1);
_delay_us( 1500 );
PORTB &= ~(1<<PB1);
_delay_ms( 18 );
i++;
}
i = 0;
}
if(x<200)
{
while(i<480 ) {
PORTB |= (1<<PB1);
_delay_us( 20000 );
PORTB &= ~(1<<PB1);
_delay_ms( 18 );
i++;
}
}
}
return 0;
}
Wie ich bereits sagte, ist der Code sehr schlampig geschrieben, aber
glaube trotzdem lesbar.
Vielen Dank schonmal!
Liebe Grüsse
Benjamin
Gast
#2393401
Benjamin Kehl schrieb: > PortC1 -> Fotowiderstand -> Batterie(Akku,1,2V ) -> GND das ist schon Mal falsch! Steht sicher irgendwo wie man's macht, vermutlich im Tutorial
Gast
#2393419
GND|-Widerstand-|-Fotowiderstand->Versorgungsspannung
ADC
Hätte ich gesagt
Gast
#2393428
LCDmann schrieb: > Hätte ich gesagt musst du alles verraten? (ich würde es übrigens noch ein bißchen anders machen)
Gast
#2393438
Benjamin Kehl schrieb: > und schließen wenn es dunkel wird. Woher weißt du, ob dann alle Hühner im Stall sind?
Gast
#2393447
ah ok, also mach ich GND -> Widerstand (10k ) -> Fotowiderstand -> Akku1,2V-> PortC1 Danke! Kann mir jemand sagen wie die Daten dann im ADCR gespeichert werden? Würde er bei 1,2 Volt dann 120 reinschreiben? Denke wohl nicht, wäre nett wenn mir noch jemand die Umrechnungsmethode verraten könnte!
Gast
#2393449
Die gehen wenns dunkel wird in den Stall, bzw schon immer etwas früher
Gast
#2393498
In deinem Programm ist die Schaltschwelle <200 oder >200. Damit hast du eine Hysterese von einem Wert (=200). Der Motor an der Tür wird sich den Wolf machen und genau dann wenn die Türaktion läuft zwischen Aufmachen und Zumachen zappeln! > glaube trotzdem lesbar. C Beautifier sind längst erfunden. ADC beim Atmega8 in C http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
> GND -> Widerstand (10k ) -> Fotowiderstand -> Akku1,2V-> PortC1 Das ist auch nix. http://www.mikrocontroller.net/articles/AD-Wandler http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC (rechte Schaltung)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
Ich würde aber noch einen Endtaster/Schalter vorsehen damit im Programm unnötiges Öffnen bzw. Schliessen der Tür vermieden wird. Man könnte zwar den Zustand der Tür im Programm protokollieren (Variable nach dem Öffnen/Schliessen setzen). Aber ein manuelles Betätigen der Tür könnte das System aus dem Tritt bringen, wenn man danach nicht manuell den Zustand herstellt den das Programm protokolliert hat. Wenn man bereit ist das zu tun, könnte man den Zustand z.B. mit einer LED anzeigen.
Wow vielen Dank, habe es jetzt folgendermaßen:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
// Schaltung soll bei 1,2V+-10% an ADC1 schalten
// AVref = Vcc = 5V
#define SCHWELLWERT ((1024*1200)/5000)
#define HYSTERESE (SCHWELLWERT/10)
void adc_init(void) {
uint16_t result;
// ADMUX = (0<<REFS1) | (1<<REFS0); // AVcc als Referenz benutzen
ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung
nutzen
// Bit ADFR ("free running") in ADCSRA steht beim Einschalten
// schon auf 0, also single conversion
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
ADCSRA |= (1<<ADEN); // ADC aktivieren
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der
Konvertierung warten
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
Wandlung nicht übernommen. */
result = ADCW;
}
uint16_t adc_read( uint8_t channel )
{
// Kanal waehlen, ohne andere Bits zu beeinflußen
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung
warten
return ADCW; // ADC auslesen und zurückgeben
}
int main(void)
{
DDRB = (1 << PB1); // PB1 Ausgang für Motor
DDRC = 0b00000000;
adc_init();
while (1)
{
uint16_t adcwert;
adcwert = adc_read(1);
if ( adcwert > SCHWELLWERT+HYSTERESE )
{
// Tür öffnen
for(int servopulse = 0; servopulse < 1000; servopulse++)
{
PORTB |= (1 << PB1);
_delay_us(1500);
PORTB &= ~(1 << PB1);
_delay_ms(18);
}
}
else if ( adcwert < SCHWELLWERT-HYSTERESE )
{
// Tür schliessen
for(int servopulse = 0; servopulse < 480; servopulse++)
{
PORTB |= (1 << PB1);
_delay_us(20000);
PORTB &= ~(1 << PB1);
_delay_ms(18);
}
}
}
return(0);
}
Wenn ich jetzt nichts an PortC1 anlege dreht sich der Motor in eine
Richtung ohne zu stoppen.
Wenn ich jetzt 1,2 V an PortC1 anlege passiert auch nichts anderes...
Lese jetzt das Tutorial, falls wer noch nen Tip hätte würd ich mich
freuen!
Vielen vielen Dank schonmal für die tolle Hilfe!
Liebe Grüsse
Benny
Gast
#2394195
Dann vereinfache das Problem. Der Schlüssel für dich ist zu wissen, wie groß der adcwert bei deiner angelegten externen Spannung ist damit du 1) weisst ob dein ADC im Programm funktioniert und 2) du die SCHALTSCHWELLE einstellen kannst. Optimal wäre es, wenn du den adcwert z.B. über UART direkt ausgeben könntest. Das macht aber ein Faß auf mit UART Programmierung und UART Hardware und RS232 Verbindung zum PC... Wenn du genug freie Portpins hast, kannst du auch den adcwert auf die freien Portpins geben und dort mit dem Multimeter messen welcher Pegel anliegt und daraus den Wert berechnen. Statt Multimeter gehen auch LEDs, ist aber mehr Aufwand. Angenommen du hast PORTD komplett frei dann kannst du 8-Bit ausgeben z.B. die unteren 8-Bits des 10-Bit wertes adcwert
1 | |
2 | |
Du misst dann mit dem Multimeter die Pins von PORTD gegen GND. Bei LOW Pegel (um 0V) setze eine 0 für den PDx in folgende Formel ein, bei HIGH Pegel (>3V geschätzt) eine 1...
1 | |
Wenn dich die oberen Bits interessieren kannst du die auf weitere zwei freie Pins geben oder adcwert vor der Ausgabe durch 4 teilen
1 | |
2 | |
Mit
1 | |
So wunderbar alles funktioniert, habe den Code noch etwas verändert, nur ein einziges Problem besteht :(( Ich habe eine Batterie anstelle eines Akkus eingesetzt ( 1,53 Volt ), wenn die Spannung über 1,2 Volt ist ist offen, wenn die Spannung unter 0,76 Volt fällt ist zu, aber wenn es dazwischen ist ( also unter 1,2 und über 0,76 )gehts immer aufzuaufzuaufzu. Bitte bitte helft mir noch bei diesem kleinen Denkfehler den ich da wohl habe :( Vielen Dank für eure Zeit! Echt super die Leute hier im Forum! Danke!
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
Gast
#2394305
Der Code
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
setzt eine bestimmte Hardwareschaltung am Atmega8 voraus. AVcc und AGND müssen angeschlossen sein. AVREF ist frei bzw. über einen 100nF Kondensator mit AGND verbunden. Wenn da Unklarheiten sind, zeige den Aufbau deiner Schaltung. > Wenn ich jetzt nichts an PortC1 anlege dreht sich der Motor in eine > Richtung ohne zu stoppen. > Wenn ich jetzt 1,2 V an PortC1 anlege passiert auch nichts anderes... Nichts anlegen ist nicht gut. Du solltest die garantierten Grenzwerte testen, dann sollten auf jeden Fall zwei Schaltzustände zu sehen sein. D.h. entweder 5V oder 0V anlegen. 0V heisst nicht nichts, sondern eine Verbindung zu GND. Um Kurzschlüsse zu vermeiden würde ich aber alle Spannungen über einen 1K Widerstand in Serie (als Strombegrenzer) an den Pin anlegen. Wenn keine zwei Schaltzustände zu sehen sind, muss die Schaltung und/oder das Programm entwanzt werden.
Gast
#2394361
> aber wenn es dazwischen ist ( also unter 1,2 und > über 0,76 )gehts immer aufzuaufzuaufzu. Da komme ich mit dem gezeigten Code nicht auf die Ursache. Beeinflusst die Tür den Lichteinfall auf den Fotowiderstand? Was macht der Servo bei ausbleibenden Impulsen, denn im Bereich 102 <= adcwert <= 300 schickst du dem Servo ja nichts. Der Code mit dem goto ist nicht schön. Ich würde so arbeiten:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
Gast
#2394415
Hallo!
Ok also ich hab mal alles rausgeschrieben:
Der Servo bekommt eigentlich nichts zugeschickt wenn die "mittelwerte"
als Spannung anliegen, dachte das past schon so.
Also bisher steckt noch alles im Stk500, die Verdrahtung ist
folgendermaßen:
Externe Stromquellen: 4,5 Volt Netzteil
1,5 Volt Batterie
Servo Data -> PB1
Servo + -> 4,5 Volt +
Servo - -> 4,5 Volt -
PORTC GND -> 4,5 Volt -
1,5 Volt -> Fotowiderstand -> Multimeter + -> Multimeter - -> 1,5 Volt
-
Alles ist auf ein Breadboard gesteckt, in der 5er Reihe zwischen
Fotowiderstand und Multimeter + habe ich das Kabel zum PORTC1.
In der 5er Reihe zwischen Multimeter - und 1,5 Volt - hab ich einen 10k
widerstand nach 4,5 Volt -.
Danke schonmal!
Gast
#2394418
Ach und die Tür beeinflusst den Lichteinfall nicht weil ja alles noch probeweise auf dem Breadboard gesteckt ist und noch nichts montiert ist. Habe auch noch folgendes Problem, wenn ich das Multimeter rausnehme geht nichts mehr... Ich glaub ich hab da ein Anschluss Problem....
Gast
#2394444
Benjamin schrieb: > Ich glaub ich hab da ein Anschluss Problem.... Es hat auch keiner gesagt, dass du das Multimeter mit verschalten sollst. Krapao hat doch aufgemalt, wie die Schaltung aussehen muß.
Gast
#2394453
Ja aber dadurch konnte ich ablesen wie hoch die Spannung ist zum testen... Dachte ja nicht das es zu Problemen führen könnte wenn ich es danach rausnehme...
Gast
#2394454
Bin gerne auch bereit ein paar Euros zu überweisen für die viele Zeit die du hier für mich opferst Krapao...
Gast
#2394498
> Also bisher steckt noch alles im Stk500, die Verdrahtung ist > folgendermaßen: Hmm...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
> Bin gerne auch bereit ein paar Euros zu überweisen für die viele Zeit > die du hier für mich opferst Krapao... Überhaupt nicht nötig, iss einfach ein Ei für mich mit :-) Oder bei 1,2V Versorgung des Fotowiderstands aus der Batterie. Das ist aber nicht notwendig sondern verkompliziert die Schaltung und beim Entleeren der Batterie ändert sich die Spannung am PC1 Abgriff des Spannungsteilers, d.h. deine Schaltung funktioniert nicht mehr wie am Anfang!
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Ich habe dabei angenommen, dass du den µC mit 5V vom Steckbrett/STK500 versorgst. Ist das später auch so vorgesehen oder willst du eine gemeinsame Spannungsquelle für µC, Sensor und Servo haben (fände ich praktisch)?
Gast
#2394524
Der ADC Wert ist natürlich stark davon abhängig wie du den Fotowiderstand versorgst. Je nachVariante müssen die Werte in der if-Bedingung angepasst werden. Weil die Spannung der Batterie beim Entleeren sinkt, ist das bei externer Batterieversorgung des Sensors auch ein Problem. Man müsste dann vor der Auswertung auch noch die Batteriespannung messen und adcwert entsprechend korrigieren.
Gast
#2394526
Warum denn eine hell/dunkel-Schaltung??? Dann geht die Klappe auch tagsüber zu, wenn es gewittert oder eine Sonnenfinsternis gibt. Und wenn es nachts gewittert und blitzt, geht die Klappe auf und der Fuchs holt Deine Hühner. Mach das lieber nach der Uhrzeit, Du kannst ja nach Tabellen fahren (im Dezember wird es später hell und früher dunkel und im Juni ist es bekanntermassen anders). Dazu zwei Lichtschranken, die zählen, ob auch alle Hühner drin sind und erst dann zumacht. Alarm, wenn z.B. um 23 Uhr immer noch ein Huhn fehlt.
Gast
#2394532
Yeah yeah also die Batterie Variante funktioniert schonmal, muss kurz weg und dann versuch ich die mit der gleichen Stromversorgung, ist wohl wirklich praktischer! Vielen vielen Dank für all die ganze Hilfe!
Gast
#2394926
Also ich freu mich echt riesig! Klappt nun alles wunderbar, schon alles auf ne Lochrasterplatine gelötet, morgen wirds montiert. Falls du mal n paar Eier abhaben willst schreib mir ne Nachricht ;) "bbennyk83@yahoo.de" Danke danke danke freu Liebe grüsse und einen schönen Abend Benny
Gast
#2394930
Ach ja, habs jetzt über ein 5 Volt netzteil alles laufen, dann gibts keine Ungenauigkeiten mit dem ADC Wert bei sinkender Batterie. Falls mal ne Sonnenfinsternis ist überlebens die auch drausen n paar Minuten, wenns Abend wird sind sie brav drin, schon bevors richtig dunkel ist. Wenns wirklich bei nem Blitz aufgeht wird wohl net der Fuchs da rumrennen, da hoff ich einfach mal auf mein Glück und das der Fuchs auch Angst hat wenns Donnert ;) Die Lichtschranken sind bissl blöd falls die Katzen durchs Tor laufen, ich werd das jetzt mal so die nächsten Wochen testen und dann bescheid sagen wenns doch unerwartete Probleme gibt ;)
Gast
#2406238
Hallo, habe ein Problem entdeckt! Wenn es zu einem Strom ausfall kommt würde ich gerne auf "Notstrom" umschalten. Habe überlegt ob das mit 4 * 1,5 V Batterien und einem Spannungsregler möglich wäre. Weiss nur nicht wie ich das vernünftig realisieren kann. Hätte vielleicht jemand die Lösung? Mit freundlichen Grüssen Benny
Gast
#2406952
Kannst du messen, wieviel Strom deine Schaltung aufnimmt, wenn der Servo arbeitet und wenn der Servo ruht?
Gast
#2407032
Will jetzt schon jeder Vollbauer Mikrokontrollerprogrammierer werden ??? Mal im Ernst: Bleib bei deinen Tieren
Benjamin schrieb: > Hallo, > habe ein Problem entdeckt! > Wenn es zu einem Strom ausfall kommt würde ich gerne auf "Notstrom" > umschalten. > Habe überlegt ob das mit 4 * 1,5 V Batterien und einem Spannungsregler > möglich wäre. Weiss nur nicht wie ich das vernünftig realisieren kann. > Hätte vielleicht jemand die Lösung? Erstmal zu "Professioneller": was soll das dumme Geschwätz, noch dazu als Gast? Wir haben alle mal klein angefangen. Und Benjamin hat sein System wohl zum Laufen bekommen. Benjamin: ist Notstrom wirklich ein Thema? Wenn bei Dir öfter der Strom ausfällt, stelle doch eine Autobatterie hin, die Du alle Vierteljahr nachlädst. Ansonsten die primitivste aller Möglichkeiten: die beiden Spannungsquellen über Dioden (am besten Zenerdioden) kombinieren. So lange das Netzteil mehr Spannung liefert als die Batterie, ist die Batterie quasi abgehängt. Zenerdioden .----------------------->|--------------- | | | | -------- | .---->|---------------' zur Schaltung | | | | | | | / \ Netzteil --- Batterie (_/_) 5V - 4,5V \_/ | | | | ' GND GND (created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de) Gruß, Max
Gast
#2407235
Zenerdioden
AR (.- .-.) schrieb: > Zenerdioden Danke für den freundlichen und ausführlichen Hinweis einschließlich Korrektur. Es hätte natürlich Schottkydioden heißen sollen. Max
> Kann mir jemand sagen wie die Daten dann im ADCR gespeichert werden? > Würde er bei 1,2 Volt dann 120 reinschreiben? Denke wohl nicht, wäre > nett wenn mir noch jemand die Umrechnungsmethode verraten könnte! Das Datenblatt tut dies sehr gerne.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.