PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servoprogrammierung



Madcilc
06.05.2010, 18:57
Hallo zusammen,
ich würde gerne einen Servo mittels meinen Axon I Microcontroller mittels Tastatur steuern. Kurz gesagt, mit Hilfe von A-Taste nach links wählen, mit Hilfe von S-Taste nach rechts drehen. Ich habe schon einen Code gemacht, leider dreht er sich immer in die selbe Richtung. Kann man den Code irgendiwe umprogrammieren, damit er in die gewünschte Richtung dreht?

Code:


void control(void)
{

char cByte;

rprintf("Auto ist bereit!\n");
rprintf("a druecken fuer Vorne\n");
rprintf("s druecken fuer Hinten\n");
rprintf("x druecken fuer LED anmachen\n");
rprintf("c druecken fuer LED ausmachen\n");

while(1)
{
cByte = uart1GetByte(); //qC bekommt Steuerbefehle von UART1 also Tastatur
if (cByte == 'a')
{
servo(PORTH,2,50); //Servo an Port2 wird um 50 erhöht
}


cByte = uart1GetByte();
if (cByte == 's')
{
servo(PORTH,2,-50);
}



cByte = uart1GetByte();
if (cByte == 'x') /
{
LED_on();
}

cByte = uart1GetByte();
if (cByte == 'c')
{
LED_off();
}
}
}


Außerdem hab ich das Problem, dass der Servo sich irgendwie hackelig dreht, also als ob da eine kurze Warteschleife ist. Mfg

syn_error
06.05.2010, 23:12
Ich habe schon einen Code gemacht....
Kann man den Code irgendiwe umprogrammieren, damit er in die gewünschte Richtung dreht?
wenn du den code selbst geschrieben hast, solltest du eigentlich auch wissen wo es hackt.


dass der Servo sich irgendwie hackelig dreht, also als ob da eine kurze Warteschleife ist.
du zeigst nur so wenig code und verlangst von andern sie sollen wie hellseher wissen wo der fehler liegt und noch am besten umschreiben das alles läuft so wie du dir das vorstellst.

es fehlt schon als minimum die port initialisierung auch sehe ich die servo() funktion nicht!

Madcilc
09.05.2010, 17:29
Wiso wenig Code? Mehr Code brauch ich nicht um den Servo anzusteuern!
Mit Hilfe von:


{
servo(PORTH,2,50);
}

Initialisiere ich den Port 2 an dem der Servo angeschlossen ist, hiermit kann ich ihn auch ansprechen. Nun weiß ich leider nicht, wie man ihn entweder schneller und langsamer macht und wie man auswählt in welche Richtung er drehen soll

syn_error
09.05.2010, 17:51
servo() ist eine funktion und irgentwo ist programmiert was die funktion genau macht.
ohne das kann keiner außer der autor sagen was für argumente/werte die funktion denn gerne haben will.

Dirk
09.05.2010, 19:34
@Madcilc:
Was auffällt:
1. Nach jedem servo() Befehl muss man eine Pause von 10..20 ms einbauen.
2. Wenn du eine Taste für Linksdrehung und eine andere für Rechtsdrehung nehmen willst, must du den 3. Parameter von servo() als Variable definieren. Da zählst du dann z.B. 10 dazu oder nimmst minus 10 für die andere Drehrichtung. So einfach mit 50/-50 wird das nicht klappen.

Gruß Dirk

Madcilc
03.06.2010, 17:47
So, ich habe den Code verändert, allerdings dreht sich der Servo immer noch in eine bestimmte Richtung :-s, ich krieg ihn nicht dazu in eine bestimmte Richtung zu drehen. Bin leider kein guter Coder, verstehe deswegen leider nicht wo der Fehler liegen kann. Mfg



void control(void)
{


char cByte;
int i=1000;


rprintf("Auto ist bereit!\n");
rprintf("W druecken fuer Vorne\n");
rprintf("S druecken fuer Hinten\n");
rprintf("X druecken fuer LED aus\n");
rprintf("C druecken fuer LED ein\n");

while(1)
{
cByte = uart1GetByte(); // get byte from UART1 on the axon
if (cByte == 'w') // if character received is w then
{

servo(PORTH,2,i=i+10);
delay_ms(20);

}





cByte = uart1GetByte(); // get byte from UART0 on the axon
if (cByte == 's') // if character received is s then
{

servo(PORTH,2,i=i-10);
delay_ms(20);

}



cByte = uart1GetByte(); // get byte from UART1 on the axon
if (cByte == 'x') // if character received is x then
{
LED_on();

}

cByte = uart1GetByte(); // get byte from UART1 on the axon
if (cByte == 'c') // if character received is c then
{
LED_off();

}


}

}