Forum: Mikrocontroller und Digitale Elektronik Servomotor per Tastendruck steuern


von Brummer (Gast)


Lesenswert?

Hallo

ich habe einen Servomotor(hängt an PINB1), der per Tastendruck über 
einen ATMega 8 in die beiden Extrempositionen gesteuert werden soll. Da 
ich momentan nur einen Taster (hängt an PIND) habe will ich zwischen 
1-mal drücken und 2-mal drücken unterscheiden.
Mein Programm sieht momentan so aus:

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int mode;
int schleife;
int schleife2;
int schleife3;

int main(void)
{
DDRD = 0x00;
DDRB = (1<<PB1);
PORTD = 0x00;

         while(1)
  {
  //mode=0;
    if (PIND & (1<<2))
    {
                _delay_ms(1);
    }// end if

    else
    {
    mode++;
    _delay_ms(1500);
    for(schleife=0;schleife<1000;schleife++)
    {
    if (PIND & (1<<2))
    {
    _delay_ms(3);
    }
    else
    {
    mode++;
    _delay_ms(500);
    }
    }
    }
          if(mode==1)
    {
    for(schleife2=0;schleife2<1000;schleife2++)
    {
    PORTB |= (1<<PB1);
        _delay_us( 2000 );
       PORTB &= ~(1<<PB1);
   _delay_ms(18);
    }
    }

    if(mode==2)
    {
     for(schleife3=0;schleife3<1000;schleife3++)
     {
      PORTB |= (1<<PB1);
          _delay_us( 1000);
            PORTB &= ~(1<<PB1);
      _delay_ms(18);
            }
           }

    if(mode==0)
    {
     PORTB |= (1<<PB1);
         _delay_us( 1500 );
         PORTB &= ~(1<<PB1);
     _delay_ms(18);
    }
  }
return 1;
}


Ich weiß mein Programm ist noch ziemlich einfach gestrickt, weil ich 
erst vor Kurzem mit µC-Programmierung angefangen hat.
Aber trotzdem müsste es doch so eig funktionieren oder übersehe ich da 
ein Fehler. Der Servo geht zwar in die Ausgangspostion, aber bei 
Tastendruck zuckt er immer nur kurz.
Der Moduswechsel an sich funktioniert eigentlich, da ich ihn isoloert 
mit Led-Blinken getestet habe.

Ich bin grad echt ratlos und würde mich über jeden Tipp sehr freuen :)

von Hubert G. (hubertg)


Lesenswert?

Wenn du deinen Code etwas dokumentiert hättest, müsste man sich nicht in 
deine Gedankengänge versetzen.
Eine Schaltung wäre zum besseren Verständnis auch nicht schlecht.

von Brummer (Gast)


Lesenswert?

OK, alles klar. Ja die Schaltung is noch groß kompliziert. Hab n 
Starter-Kit, bei dem der Button schon integriert ist. Der ist über PIND 
angeschlossen. Und dann hängt eben noch der Servo an PINB1. Aber die 
Schaltung dürfte eigentlich nicht das Problem sein, da die mit anderen 
Programmen funktioniert.

Zur Logik des Programms:

mit if (PIND & (1<<2)) frag ich den Tastendruck ab. Wird er nicht 
gedruckt, passiert nichts.
Sobald er gedrückt wird wird die mode-Variable hochgezählt, die nachher 
den Modus(linke oder rechte Position) bestimmt. Danach hab ich kurze 
Wartezeiten um den Taster zu "entprellen".

Die folgende for-scheife:
for(schleife=0;schleife<1000;schleife++)
{
...
wartet noch eine kurze Zeit auf den nächsten Tastendruck.
1. Kommt der wird mode nochmal hochgezählt.
2. Kommt er nicht bleibt mode eben auf 1.

Damit ist die Festlegung des Modus beendet(bis hierhin hats mit LED 
blinken lassen nach Modus auch funktioniert).

Mit den folgenden if-Schleifen:
if(mode==1){..}
usw. soll dann eben je nach Modus eine Position angefahren werden.
In den if-schleifen lass ich das PWM-Signal 1000 mal wiederholen, da am 
Anfang der while-TRUE mode=0 gestzt wird, sodass nach Anfahren der 
Extrempositionen der Servo wieder die Ausgangsstellung einnimmt.

Ich hoffe das war soweit verständlich und es wäre sehr nett, wenn sich 
jemand die Zeit nimmt mein Programm durchzudenken :)

von Hubert G. (hubertg)


Lesenswert?

Wenn es ein Starter-Kit ist, dann ist es eher ungewöhnlich das der 
Taster nach + geht. Daher meine Frage nach der Schaltung.

von Karl H. (kbuchegg)


Lesenswert?

Ich denke der vernünftigste Tipp den ich dir geben kann, ist dich erst 
mal nach einer vernünftigen Tastenentprellung und erkennung umzusehen. 
Die ist das Um und Auf, wenn irgendwo Tasten im Spiel sind

Entprellung


Nimmst du die PeDa Lösung ganz unten, dann wird deine Hauptschleife ganz 
einfach
1
...
2
3
int main()
4
{
5
  ...
6
7
  mode = 0;
8
9
  while( 1 ) {
10
11
    if( get_keypress( 1 << KEY0 ) )
12
      mode = 1 - mode;
13
14
    if( mode == 0 ) {
15
      PORTB |= (1<<PB1);
16
      _delay_us( 1000);
17
      PORTB &= ~(1<<PB1);
18
      _delay_ms(18);
19
    }
20
21
    else if( mode == 1 ) {
22
      PORTB |= (1<<PB1);
23
      _delay_us( 2000);
24
      PORTB &= ~(1<<PB1);
25
      _delay_ms(18);
26
    }
27
  }
28
}

von Brummer (Gast)


Lesenswert?

Ja da hast du natürlich Recht mit der Entprellung. Und ich werde mich in 
den Ferien auch hinhocken und das Tutorial durcharbeiten, aber ich würde 
gern davor dieses eine Projekt erfolgreich beenden.
Und meine provisorische Entprellung funktioniert ja eig auch sogar ganz 
gut bei den LEDs.

Deine Lösung für den Moduswechsel ist natürlich genial ;)
Da wär ich jetzt nich drauf gekommen, aber ich hab ja gewissermaßen 3 
Zustände. DIe beiden Extrempositionen und die Mittelstellung in die er 
immer wieder zurückkehren soll. Wie könnte man das lösen?

von Brummer (Gast)


Lesenswert?

Mal ne andere Frage:

Funktioniert mein Programm eigentlich auch mit einem Analog-Servo?

WEil ich benutzt grad nen digitalen und bräuchte aber nen Stärkeren. 
Preislich sind da analoge viel billiger. Funktioniert die Ansteuerung 
gleich?

MfG Brummer

von STK500-Besitzer (Gast)


Lesenswert?

Ja

von Brummer (Gast)


Lesenswert?

Cool, danke :)

Jetzt hab ich noch eine kleine Frage. Sry, dass ich hier jetzt immer 
weiter schreib, aber n neuer Post würde sich nicht lohnen.

Ich würde gern für oben genannte Schaltung noch einen 2. Taster kaufen. 
Allerdings stolper ich bei CONRAD über die Schaltspannung. Die liegt da 
bei allen Tastern um die 200V. Mein Mikrocontroller läuft doch mit 6V... 
Funktionieren solche Taster an meinem AVR? Ist das der obere Grenzwert 
oder was für Taster sind für ein AVR geeignet?

MfG Brummer

von Karl H. (kbuchegg)


Lesenswert?

Brummer schrieb:

> Ich würde gern für oben genannte Schaltung noch einen 2. Taster kaufen.
> Allerdings stolper ich bei CONRAD über die Schaltspannung. Die liegt da
> bei allen Tastern um die 200V.

Ein Taster sind im Prinzip 2 Drähte in einem Gehäuse, die aufeinander 
gedrückt werden.

Der Taster KANN 200V noch schalten, ohne dass ihm der Lichtbogen kurz 
vor dem endgültigen Kontakt den Garaus macht. Aber das heißt nicht, dass 
er 200V schalten muss!

Dein Autotacho ist auch mit 180km/h angeschrieben. Das heißt aber auch 
nicht, dass du immer 180 fahren musst.

von Brummer (Gast)


Lesenswert?

Jetzt hätte ich nochmal eine Frage zur Funkübertragung, da ich den Servo 
per Funk steuern möchte.
Für euch wirken mein Fragen bestimmt zusammenhangslos, aber ihr helft 
mir echt genial und ich habe bei meinem Projekt schon große Fortschritte 
gemacht :)

Also ich habe mir jetzt ein Sender-/Empfängermodul-Set gekauft, um die 
Zustände des Tasters an den Servo zu schicken.
Ich finde nur überhaupot kein Beispielprogramm zur Funkübertragung und 
kann mir auch nicht wirklich vorstellen, wie das auszusehen hat...

Kann ich einfach Strom durch den PIN, der mit dem Sender verbunden ist, 
schicken und dann beim Empfänger abfragen, ob Strom fließt?
Oder gibts da genauere Befehle zum Senden?

MfG Brummer

von Brummer (Gast)


Lesenswert?

Also ich habe jetzt gelesen, dass dieses spezielle Modul von Conrad eine 
Manchester-Codierung verlangt.

Allederdings ist Manchester ja eig dazu da komplexe Datenpakete zu 
versenden und ich komm gar nich dahinter wie ich Manchester 
programmieren soll.
Ich muss ja aber auch nur 2 Zustände übertragen(Taster gedrückt oder 
nicht).

Hat da jmd Erfahrung, ob das dann evtl einfacher geht?

von Maddin (Gast)


Lesenswert?

du könntest einfach schaltbare Steckdosen umbauen... Da gibts 
fernbedieung und 3 Empfänger oft für einen 10er. Innen wird 5V erzeugt 
im Empfänger, da kann man dann ansetzen...

M.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.