Forum: Compiler & IDEs Servo Steuerung


von samawi (Gast)


Lesenswert?

An alle die schon mal servo motoren gesteuert haben oder fit was GCC 
angeht

ich habe ein Kleines Problem.( Hardwäre stk 500 mit Atmega 16)


Ich habe ein C-Code geschrieben  wird nach druck der Taster1 ( PIN0) der 
servo in der Position 1700 bringen und nach druck der Taster 2 ( 
PIN1)nach Position 1200.

Aber ich möchte eine Verzögerung hinbringen das nach dem Drücken von nur 
eine Taster das der Servo sich nach Position 1700 bewegen kann und 
danach nach Postition 1200.

Ich habe es mit der " delay " versucht aber er erkennt es irgend wie 
nicht. und nimmt nur der letzte befehl an auch wenn ich höhere Tacktfreq 
nehme.

von Hansl (Gast)


Lesenswert?

servotiming ist schon eine spannende sache. hab selbst auch schon
tage mit dem debugging verbracht :)

dir ist schon klar das du dem servo permanent positionsdaten schicken
musst ... zb. 20ms_2ms_20ms_2ms. wenn dies ausbleibt wandert er,
sofern er nicht gehackt wurde(endlossservo) auf position NULL zurueck?

poste mal deinen c code schnippsel dann seh ich mirs(in ca. 8h)
gern mal an. mit welcher frequenz taktest du deinen atmega16?

mfg
 hansl

von STK500-Besitzer (Gast)


Lesenswert?

>dir ist schon klar das du dem servo permanent positionsdaten schicken
>musst ... zb. 20ms_2ms_20ms_2ms. wenn dies ausbleibt wandert er,
>sofern er nicht gehackt wurde(endlossservo) auf position NULL zurueck?


Quatsch.
Der wandert nirgendwohin, wenn die Impulse ausbleiben und keine äussere 
Kraft auf das Ding einwirkt.

@samawi:
Wenn du dein Programm (oder zumindest relevante Teile) hier reinstellen 
würdest, könnte man auch präziser antworten.

Im Prinzip geht es ganz einfach:
Warte auf die Taste
Sobald die Taste gedrückt wurde, setze die aktuelle Impulslänge auf 1700
Solange Position 1200 noch nicht erreicht wurde,
 gib einen Impuls der akutellen Impulslänge aus
 verringere die Impulslänge um einen bestimmten Betrag.

Der Betrag, um die Impulslänge geändert wird, entscheidet über die 
Geschwindigkeit, mit der sich das Servo bewegt (bis auf dessen 
mechanische Träghheit natürlich).
Die Schleife kann auch fußgesteuert sein...

von Hansl (Gast)


Lesenswert?

war wohl doch schon ein wenig spaet ;)

von Samawi (Gast)


Lesenswert?

Hier mein Programm ist allerdings einbisschen komplizierter da ich 
mehrere servos gleichzeitig kontrolliere ( Hier gehts um die Steuerung 
eines sexbeinigen Roboters( Hexabot).

Also ich habe so zu sagen die Aufgabe jetzt schon gelöst und zwar statt 
eine einzige delay habe ich eine delay schleife (for)eingesetzt.

Es scheint mir allerdings immer noch einbisschen doof programmiert.
wenn jemanden eine andere idee hat ist immer willkommen.

n.B ich nutze neben den stk500 noch den servo controller SSC32

======================================================
#include <avr/interrupt.h>
#include <util/delay.h>
#include<stdio.h>
// Einbinden des Servo Treibers

void servo_cmd (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}


int main(void) {
int i;

// Initialisierung der RS232 Schnittstelle
  uart_init();

// IO Ports initialisieren
  DDRA=0x00;

  DDRB=0xff;
  PORTB=0xff;

// Timer1 initialisieren
  TCNT1H=0x00;
  TCNT1L=0x00;

// CTC Mode - Prescaler 256
  TCCR1A = 0x00;
  TCCR1B = 0b00001011;

// 1sec bei 3,6864 MHz
   OCR1AH = 0xe0;
  OCR1AL = 0xff;

// Timer aktivieren
  TIMSK |= 0x10;


// Globale Interrupts aktivieren
  sei();

  while(1) {

    if ( !(PINA & (1 << PA0)) ) {

        servo_cmd("#4p1200 #5p1750 #6p1750 #24p1750 #25p1200 #26p1250 
#16p1750 #17p1200 #18p1250 t2000\r");
        for (i = 0; i < 150; i++) {
          _delay_ms(30);
    } ;
          servo_cmd("#4p1500 #5p1500  #24p1500 #25p1500  #16p1500 
#17p1500 t2000 \r");

    for (i = 0; i < 200; i++) {
          _delay_ms(30);
    } ;


      servo_cmd("#0p1200 #1p1750 #2p1750 #8p1200 #9p1750 #10p1750 
#20p1750 #21p1200 #22p1250  #6p1500 #26p1500 #18p1500 t2000\r");

        for (i = 0; i < 150; i++)
    {
              _delay_ms(30);
    } ;
      servo_cmd("  #0p1500 #1p1500 #8p1500 #9p1500 #20p1500 #21p1500 
t2000\r");

       for (i = 0; i < 100; i++)
                {
                     _delay_ms(30);
    } ;
      servo_cmd("#4p1200 #5p1750 #6p1750 #24p1750 #25p1200 #26p1250 
#16p1750 #17p1200 #18p1250  #2p1500 #10p1500 #22p1500 t2000 \r");


  }
  return(0);
}

// Interrupt Routine Timer1 Compare Match
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
// Toggle LED an PortB
PORTB ^= (1 << PB0);
//uart_puts(servo);
}

von Falk B. (falk)


Lesenswert?

@ Samawi (Gast)

>mehrere servos gleichzeitig kontrolliere ( Hier gehts um die Steuerung
>eines sexbeinigen Roboters( Hexabot).
       ^^^^
Bist du Entwickler für die Firma B. U. aus F.? fg

SCNR
Falk

von Simon K. (simon) Benutzerseite


Lesenswert?

OT: Wundert mich, dass das durch den Spamfilter gekommen ist ;) ;)

von samawi (Gast)


Lesenswert?

@  Falk Brunner : nein es ist ein Project bei und an der FH ich bin noch 
kein richtiger Entwickler eher Anfänger.

@ Simon Küppers : OT: Wundert mich, dass das durch den Spamfilter 
gekommen ist ;) ;)

was meinst du genau damit?

von Falk B. (falk)


Lesenswert?

@ samawi (Gast)

>@ Simon Küppers : OT: Wundert mich, dass das durch den Spamfilter
>gekommen ist ;) ;)
>was meinst du genau damit?

Solche bösen Worte wie S E X erkennt die Software dieser Website und 
weist die Beiträge zurück. Probier mal das Wort oben ohne Leerzeichen in 
einem Beitrag zu verwenden. Sex

MFG
Falk

von Falk B. (falk)


Lesenswert?

Huch,geht doch. SPAMfilter im Urlaub?

von STK500-Besitzer (Gast)


Lesenswert?

>servo_cmd("#4p1200 #5p1750 #6p1750 #24p1750 #25p1200 #26p1250
>#16p1750 #17p1200 #18p1250  #2p1500 #10p1500 #22p1500 t2000 \r");


Jetzt wäre interessant, was die einzelnen Zeichen/Phrasen in diesem 
String zu bedeuten haben.
Gibt es zu dem Servo-Controller bzw. dessen Protokoll auch eine 
Beschreibung?

>Huch,geht doch. SPAMfilter im Urlaub?
Andreas macht nebenbei noch ein Bekanntschaften-Forum hier auf...

von samawi (Gast)


Lesenswert?

@ Falk Brunner ;-)))))))))) hab gar nicht drauf geachtet. Die sollen 
dich als Spamfilter einstellen. gut aufgepasst.

@ STK500-Besitzer: die string ist nicht weiter als ein servo befehl der 
so aufgebaut ist : # Chanel ( Nr der servo) P postion wo er hin muss ( 
oder kann mann als winkel betrachten) T steht für die zeit der er für 
die bewegung braucht.

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.