Hallo Robotoni,
ich habe da jetzt kein Beispielprog in der Schublade.
"stochri" hat hier 'mal einen GCC-Code veröffentlicht, mit dem 10 Servos mit Timer1-PWM angesteuert werden.
Geh mal auf die Suche.
Gruß Dirk
Druckbare Version
Hallo Robotoni,
ich habe da jetzt kein Beispielprog in der Schublade.
"stochri" hat hier 'mal einen GCC-Code veröffentlicht, mit dem 10 Servos mit Timer1-PWM angesteuert werden.
Geh mal auf die Suche.
Gruß Dirk
Hallo Robotoni,
Da habe ich mich dann 'mal dran gesetzt und das ist heraus gekommen.Zitat:
... aber es wäre schon toll, wenn das Signal über den Timer des RP6-M32 Erweiterungsmodules laufen würde.
Viel Spaß!
Gruß Dirk
Hallo Dirk... toll wenn man richtig Ahnung hat ...... funktioniert super...
bin bereits am Experimentieren.... mit meinem Entfernungssensor und einem Servo.. danke..danke..danke
Gruß Robotoni (Toni)
Hallo RP6 Servo-Tester,
Diese tolle Lösung zur Servoansteuerung fehlte ja noch.Zitat:
SlyD: ... gäbe es ... auch die Möglichkeit ein PWM Modul des MEGA32 auf dem RP6-M32 zu verwenden.
Hier ein 1. Vorschlag zur Umsetzung für den RP6.
Viel Spaß damit!
Gruß Dirk
Ich habe das ganze mal wie oben beschrieben durch probiert...
1. mal das programm mit copy paste übernommen
2. die Lib für das programm verändert.
3. make all
Das rote lämpchen leuchtet aber der servo tut nix... außer beim anschließen kurz zucken
!Wichtig habe bis jetzt nur das RP6 basis modul - aber das sollte ja klappen wie im video zu sehen ist ...!
kann mir da jemand weiter helfen ?
Danke :)
Hallo carlitoco,
da müßte radbruch etwas zu sagen.
Wenn du erst 'mal nicht die Lib verändern willst, probier evtl. meine Version (RP6Base_Servo.zip vom 3.10.07).
Gruß Dirk
ok da hat er sich jetzt schon mal in eine richtung gedreht - prima -jetzt muss ich mal schauen warum er versucht immer weiter in die selbe richtung zu drehen..
Danke
Ups, ich dachte, ihr redet über Servos am Erweiterungsmodul. Inwischen steure ich die Servos etwas anders an:
Ich verwende nicht die orginalen Libraries, so kann ich freier über die Funktionen des Mega32 verfügen. (Meine abgespeckte Lib ist im Anhang, Verwendung auf eigene Gefahr, weil ohne Überwachungen! Ist ideal beim Anhauchen wenn ein Antrieb spinnt*grins*)Code:// Vierradantrieb mit RC-Steuerung v1.0 9.12.2007 mic
#include "rblib.h"
#include "rblib.c"
uint8_t servo_l, servo_r, demo;
uint16_t i, j, time;
uint8_t rc_input_pwr, rc_input_dir, rc_pwr, rc_dir, rc_misch=6;
ISR(TIMER0_COMP_vect)
{
static uint16_t count=0;
uint8_t rc_in;
static uint8_t rc_temp_pwr=0;
static uint8_t rc_temp_dir=0;
if(count>servo_l) PORTA &= ~1; else PORTA |= 1; // ADC0
if(count>servo_r) PORTA &= ~2; else PORTA |= 2; // ADC1
if(count<2000)count++; else { count=0; time++; }
rc_in=PINC;
if (rc_in & 1) rc_temp_dir++; else // SCL (Pin10)
if (rc_temp_dir) { rc_input_dir=rc_temp_dir; rc_temp_dir=0; }
if (rc_in & 2) rc_temp_pwr++; else // SDA (Pin12)
if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr; rc_temp_pwr=0; }
}
void servo_init(void)
{
//DDRA |= 16; // E_INT1 als Ausgang
//DDRC |= 3; // SCL und SDA als Ausgang
DDRA |= 3; // ADC0(PortA0) und ADC1(PortA1) als Ausgang
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 13; // 100kHz?
time=0;
}
int main(void)
{
rblib_init();
servo_init();
servo_l=130;
servo_r=120;
setMotorDir(FWD,FWD);
setMotorPWM(130,90);
setLEDs(0b1001);
while(0)
{
if (1) {
writeString("\n\r");
writeInteger(rc_input_pwr, 10);
writeString("-");
writeInteger(rc_input_dir, 10);
if (rc_input_pwr > 105)
{
rc_pwr=rc_input_pwr-100;
servo_l=servo_r=rc_input_pwr;
setMotorDir(FWD,FWD);
setMotorPWM(rc_pwr*rc_misch,rc_pwr*rc_misch);
}
else if (rc_input_pwr < 95)
{
rc_pwr=100-rc_input_pwr;
servo_l=servo_r=rc_input_pwr;
setMotorDir(BWD,BWD);
setMotorPWM(rc_pwr*rc_misch,rc_pwr*rc_misch);
}
else
{
servo_l=servo_r=100;
setMotorPWM(0,0);
}
}
}
while(1);
return 0;
}
Alternativ könnte man auch die Timer 2 Compare ISR in der RP6BaseLib verwenden, die wird aber nicht ganz so häufig aufgerufen, die Werte für die Servostellung sind dann anders. Und man muss von Hand dafür sorgen, dass der Interrupt überhaupt läuft. Deshalb meine eigene Lib, damit geht das einfacher.
Zum Programm(, das eigentlich die Vorbereitung meines 4-Rad-Antriebs ist):
Die zwei Servos hängen an ADC0/1, das sind die freien ADC-Anschlüsse hinter dem IR-Empfänger auf der RP6-Platine. Hier habe ich zwei 3-polige Stiftleisten (+,-,ADC0/1) angelötet. Blöderweise sind die nicht servokompaktibel (bei den Servos ist + in der Mitte), aber an den Steckern der Servos kann man recht einfach die Adern vertauschen. Die Werte für die Servostellungen werden in uint8_t servo_l/servo_r übergeben, count erzeugt die 20ms-Wiederholung (und time dient als allgemeiner Timer):
SDA und SCL verwende ich hier zum Einlesen der Signale einer RC-Fernbedienung die am xBus hängt, das wird in der ISR gleich miterledigt. Mit dem Programm steure ich momentan die Motoren und die Servos zusammen an. Denn unnötigen Code kann man natürlich rausschmeissen. Das passiert im unteren Teil der ISR:Zitat:
if(count>servo_l) PORTA &= ~1; else PORTA |= 1; // ADC0
if(count>servo_r) PORTA &= ~2; else PORTA |= 2; // ADC1
if(count<2000)count++; else { count=0; time++; }
Man kann auch gut die SDA/SCL am xBus zur Ansteuerung der Servos verwenden.Zitat:
rc_in=PINC;
if (rc_in & 1) rc_temp_dir++; else // SCL (Pin10)
if (rc_temp_dir) { rc_input_dir=rc_temp_dir; rc_temp_dir=0; }
if (rc_in & 2) rc_temp_pwr++; else // SDA (Pin12)
if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr; rc_temp_pwr=0; }
Gruß
mic
Also ich will auch mal ein Servo ansteuern, aber leider werde ich aus den ganzen Beiträgen nicht schlau. Ich habe ein Robby ohne Erweiterung. Welche Möglichkeiten gibt es jetzt, um einen oder mehrere Servos anzusteuern und vor allem welche Ausgänge nutzt man dann?
Stratege993
@Radbruch Hm das beispiel aber einmal nachzuarmen wird nicht toll, da ich mir jetzt überlegen muss wo lege ich die rblib.c /.h ab um anschließend die makefile zu bearbeiten... jedoch frage ich mich ob ich für das program nur deine beiden libs brauch oder die anderen aus dem RP6Lib-ordner auch...
Wie ist das?
MfG carlitoco