PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Enfache Servosteuerung?



Rick07
13.12.2007, 20:19
Kennt jemand eine einfache Steuerung um 2 Servos mit je einem 4-Bit wert einen Drehbereich von 90 Grad fahren zu lassen?
Ich möchte an der Schaltung pro Servo 4 Bit anlegen und der Servo soll den entsprechenden Winkel anfahren.

Danke

uwegw
13.12.2007, 20:31
Schaltungstechnisch am einfachsten: einen Mikrocontroller nehmen. Dann reicht zb ein 14poliges IC, fast ohne Außenbeschaltung.
Damit ist der Aufwand dann in die Software verlagert worden.

Als SMD auf Briefmarkengröße unterzubringen. In THT auf ner großen Briefmarke.

Rick07
13.12.2007, 20:33
Das waren meine Vorstellungen.
Ich habe jedoch noch wenig Erfahrungen mit Mikrocontrollern und würde mir gerne mal einen fertigen Vorschlag ansehen. Sicher hat schon mal jemand so was gemacht. Kennst Du einen Link?

HannoHupmann
13.12.2007, 20:42
Werden Servos nicht über Pulsweite angesteuert? Die brauchen nur einen einzigen Pin und über den werden entsprechende Signale geschickt (Standartservos haben eh nur Plus, Ground und Signal Leitungen).
Wie man das macht findet man zu den gängigen µControllern überall da es eine Standartaufgabe ist. Die Unterlagen musst du dir aber selber suchen, heißer Tipp ist aber unsere Wiki.

radbruch
13.12.2007, 20:54
Hallo

Meinen Langbein (https://www.roboternetz.de/phpBB2/viewtopic.php?p=324867#324867) steure ich mit einem Attiny13 und programmiere ihn in C. Der tiny13 kostet ca. 1.15€, hat 8 Pins und steuert bei mir 5 Servos. Mein aktueller Code:

#include <avr/io.h>
#include <avr/interrupt.h>

//#define f_cpu 9,6 MHz

uint8_t a, b, x, x2, y, y2, z, demo;
volatile uint16_t count, time;

void delay(uint16_t d) // Warteschleife
{
d+=time; while(d>time);
}

ISR(TIM0_COMPA_vect) // Servoansteuerung
{
if (count>z) PORTB &= ~(1<<PB0); else PORTB |= (1<<PB0);
if (count>y) PORTB &= ~(1<<PB1); else PORTB |= (1<<PB1);
if (count>x) PORTB &= ~(1<<PB2); else PORTB |= (1<<PB2);
if (count>y2) PORTB &= ~(1<<PB3); else PORTB |= (1<<PB3);
if (count>x2) PORTB &= ~(1<<PB4); else PORTB |= (1<<PB4);
if (count < 1000) count++; else { count=0; time++; }
}

int main(void)
{
y=y2=60;
x=x2=60;
z=95;
time=0;

DDRB = (1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0); // Servoausgänge
//PORTB= (1<<PB3); // PullUp Taster ein

TCCR0A = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0A |= (0 << COM0A0) | (0 << COM0A1); // ohne OCR-Pin
TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); // prescaler /8
TIMSK0 = (1 << OCIE0A); // Interrupt ein
OCR0A = 11; // nicht wissenschaftliche Frequenz(100kHz?)
sei();

delay(100);
{
for(a=0; a<10; a++) {x++; y++; delay(5);};
for(a=0; a<10; a++) {y--; delay(5);};
for(a=0; a<10; a++) {x--; x2--; delay(5);};
}
while(1);
return(0);
}

Nur als Anregung, x,x2,y,y2,z sind die jeweiligen Servopositionen. Wertebereich vom -90° bis + 90° ist ca. 50-150. Vielleicht hilft/inspiriert dich das. Bei Problemen bei der Anpassung an 4-bit-Positionen kannst du gerne nachfragen.

Gruß

mic

Rick07
13.12.2007, 22:00
Danke für die Info.
Ich werde mir das morgen mal genauer anschauen.
Wie gesagt möchte ich das dann anpassen und mit je 4 Bit ansteuern.

Luca-33
28.12.2007, 13:22
Ich hätte da auch noch mal eine Frage! Also ich hab einen Atmega 16 und wollte mit dem über eine ADC Ausgang einen Servo steuern! Das Programm mit dem ich programmiere ist BASCOM-AVR!

Die Frage ist nun wie schreibe ich das Programm?
Wie sage ich ihm in welche richtung er das Servo lenkt?

Ich hoffe sehr auf eine Antwort
Danke vorab! :D

recycle
28.12.2007, 14:59
@Luca-33
Das Wort "Servo" wird hier im Forum automatisch mit einem Link hinterlegt. Wenn du da einfach mal draufklickst, findest du wie ein Servo grundsätzlich angesteuert wird.
Da findest du auch ein Codeschnipsel zur Ansteuerung eines Servos in Bascom. Genaueres dazu findest du auch in der Bascom Online-Hilfe.
Ein Beispielprogramm ist ebenfalls in Bascom enthalten. Das würde ich einfach mal auf deinen Controller anpassen und ein bischen damit rumspielen.