Hallo
Heute zeige ich euch mal, wie einfach man einen RC-Servo mit dem asuro steuern kann. Wie üblich sollte am asuro möglichst wenig geändert werden, deshalb habe ich zuerst eine galvanisch getrennte Variante mit eigener Spannungsversorgung gebastelt:
Bild hier Bild hier Bild hier Bild hier
Leider immer noch nicht sehr scharf, aber es gibt auch fast nichts zu sehen.
Benötigte Bauteile:
Fotodiode, 10k-Widerstand, Servo, Akku, etwas Draht, Lötausrüstung und Werkzeug. Werte der Fotodiode in Durchlassrichtung: Hell < 1k, Dunkel > 100k
Aufbau und Schaltungsbeschreibung:
Ein Spannungsteiler mit dem Widerstand an VCC und Fotodiode an 0V erzeugt das PWM-Signal für den Servo. Die Fotodiode wird mit einer beliebigen asuro-LED angestrahlt und überträgt so das PWM-Signal des asuros zum Servo. Funktioniert mit Front-, Status- und BackLEDs:
Bild hier
http://www.youtube.com/watch?v=k_LAmDGj3EU
Hier noch zwei Codes, einmal einfach mit Sleep()-Schleifen:
Code:
#include "../inc/ir-asuro.h"
#include "../inc/ir-asuro.c"
unsigned char i, servo_stellzeit;
void servo(unsigned char winkel){
unsigned int count=0;
do{
count++;
BackLED(OFF,OFF);
FrontLED(OFF);
Sleep(winkel);
BackLED(OFF,ON);
FrontLED(ON);
Sleep(255); Sleep(255); Sleep(255);
}while (count<servo_stellzeit);
}
int main(void) {
Init();
StatusLED(OFF);
do{
servo_stellzeit=35;
servo(51);
servo(90);
servo(51);
servo(15);
servo_stellzeit=2;
for (i=15; i<88; i+=2) servo(i);
for (i=90; i>17; i-=2) servo(i);
}while (1);
return 0;
}
und einmal etwas anspruchsvoller mit angezapftem Timer-Interrupt:
Code:
#include "../inc/ir-asuro.h"
#include "../inc/ir-asuro.c"
unsigned char i;
int main(void) {
Init();
StatusLED(OFF);
do {
servo_pos=45;
StatusLED(GREEN);
Msleep(500);
servo_pos=80;
StatusLED(RED);
Msleep(500);
servo_pos=45;
StatusLED(GREEN);
Msleep(500);
servo_pos=15;
StatusLED(YELLOW);
Msleep(500);
}while(1);
return 0;
}
und noch die Änderung der Timerfunktion in der asuro.c:
Code:
#include "ir-asuro.h"
volatile unsigned char count36kHz;
volatile unsigned long timebase;
volatile int autoencode=FALSE;
/* Anfang Servoansteuerung I 1.Versuch mit Interrupt 18.4.2007 */
unsigned char servo_pos;
unsigned int servo_pwm;
/* Ende Servoansteuerung I 1.Versuch mit Interrupt 18.4.2007 */
/* uses timer2 (36kHz for IR communication */
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz) timebase ++;
/* Anfang Servoansteuerung II 1.Versuch mit Interrupt 18.4.2007 */
if (servo_pos) {
servo_pwm++;
if (servo_pwm<servo_pos) BackLED(OFF,OFF); else BackLED(OFF,ON);
if (servo_pwm>255) servo_pwm=0;
}
/* Ende Servoansteuerung II 1.Versuch mit Interrupt 18.4.2007 */
}
Das steuerbare Bugrad war nur ein Test, die Schaltung kann deutlich mehr. Sie macht den asuro zu einem flexiblen Kontrollerboard. Mit einem teilweise gehacktem Servo (nur Poti lahmgelegt) sollten sogar echte Motorfunktionen (endlos vor-zurück) möglich sein. Viel Spaß beim Nachbau.
Gruß
mic
Lesezeichen