Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Minimallösung: asuro steuert RC-Servo



radbruch
21.04.2007, 09:29
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:

https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1410 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1410) https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1409 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1409) https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1408 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1408) https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1411 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1411)
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:

http://img.youtube.com/vi/k_LAmDGj3EU/3.jpg (http://www.youtube.com/watch?v=k_LAmDGj3EU)
http://www.youtube.com/watch?v=k_LAmDGj3EU

Hier noch zwei Codes, einmal einfach mit Sleep()-Schleifen:

#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:

#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:

#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 (https://www.roboternetz.de/phpBB2/viewtopic.php?t=29865) 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

asuromatze
21.04.2007, 11:00
ist die fotodiode zwingend erforderlich, d.h. kann ich sie nicht durch ein anderes bauteil ersetzen? ich hab nämlich keine fotodiode zuhause.

radbruch
21.04.2007, 12:58
Ja, die ist zwingend nötig. Es könnt zwar auch mit einem Fotowiderstand funktionieren, aber das hilft dir sicher nicht weiter. Quelle für Fotodioden sind z.b. alte Diskettenlaufwerke(5 1/4), Drucker oder auch, hier habe ich meine gefunden, alte Videorecorder.

asuromatze
21.04.2007, 15:16
^^ich werde mal schauen, ob ich einen finde. vielen dank.

ChrisPHL
05.05.2007, 18:09
Aber was für einen Servomotor hast du denn da genommen. Oder auf welche "Eckdaten" muss man achten, wenn man (so) einen Servo käuflich erweben will?
Ist sowas schon ausreichend/ empfehlenswert http://www.conrad.de/goto.php?artikel=233751? (zumindest sieht ja das Bild dem hier ganz ähnlich: https://www.roboternetz.de/wissen/index.php/Servos#Anmerkungen
Hat vielleicht jemand eine Idee bzw weiß jemand, wo man so einen Servomotor 'rausschlachten' kann?

Gruß
Christian

damaltor
05.05.2007, 19:28
conrad-shop links funktionieren nicht!! bitte rufe den artikel auf, und suche "link zu diesem artikel". diese adresse musst du posten (am besten mit dem edit-button... =)

ChrisPHL
06.05.2007, 07:42
Damit doch noch mal eine Benachrichtigung an euch ´raus geht:
OK, Link ist oben geändert.
Ist so ein Motor vielleicht in einem alten Drucker, die müssen doch auch relativ genau Schritt für Schritt die Rolle weiter drehen...

Gruß
Christian

radbruch
06.05.2007, 12:33
Hallo

Diese Servos habe ich verwendet:
http://www1.conrad.de/m/2000_2999/2300/2300/2305/230500_RB_00_FB.EPS.jpg (http://www1.conrad.de/goto.php?artikel=230500)
Conrad-Servo ES-05 (http://www1.conrad.de/goto.php?artikel=230500)

Grundsätzlich sollte das mit allen Servos funktionieren, denn man kann die Servos verschiedener Hersteller auch bei allen anderen RC-Anlagen verwenden. Aber ich habe auch keine genaueren Kenntnisse, das ist mein erster Kontakt mit Servos.

Leider findet man Servos im normalen Haushalt recht selten, gelegentlich kann man sie vielleicht aus etwas hochwertigerem RC-Spielzeug ausschlachten. Da sie aber Massenware sind, erhält man sie recht günstig beim Elektronikversand oder bei einer Onlineversteigerung. Oder eben beim freundlichen Modelbauladen um die Ecke. In Druckern werden sie nicht eingesetzt, hier verwendet man technisch vollkommen anders funktionierende Schrittmotoren.

Gruß

mic

ChrisPHL
06.05.2007, 12:47
In Druckern werden sie nicht eingesetzt, hier verwendet man technisch vollkommen anders funktionierende Schrittmotoren. Ich hab´mir sowas schon geadcht, wäre ja auch zu einfach gewesen... Danke für deine Hilfe!

Sternthaler
07.05.2007, 01:05
Mit der Schaltung sollten eigendlich alle Servos steuerbar sein.
Der Servo wird da ja 'nur' durch die pfifige Minimallösung 'getaktet'.
Aufpassen muss man nur bei den verschiedenen Stecker-Belegungen der Servos bei unterschiedlichen Herstellern. Klick mal hier auf Servos!

@radbruch
Tolle Idee, den Lötkolben wegzulassen und trotzdem etwas an den Asuro 'anzuklemmen'.

P.S.: Es ist immer gut, allen Variablen, die sowohl innerhalb als auch ausserhalb von Interruptfunktionen benutzt werden, das volatile voranzustellen.

Dani-Bruchflieger
07.05.2007, 21:17
Hi,

Mein Nick sollte es ja schon verraten, daß ich vom RC-Modellbau abstamme...
Wer ein Servo auch ohne 10k Widerstand und Fotodiode nutzen will, könnte ganz einfach an die Anschlüsse Con1,2 Out+,- von Buchsenleisten steckkontakte in die vorbereiteten Lötpunkte löten, und dann das Servo anstecken:
gelb an con2 (portd.2)
rot an+
schwarz / braun an -

Und wer es nicht weiß, diese Servos benötigen eine PWM mit 1,0ms - 2,0ms Impuls (1,5ms = Mittelstellung) und ca 10...20ms Pause (die Pausendauer ist nicht so kritisch sollte aber nicht unter 10ms und auch nicht weit über 20ms liegen)

radbruch
09.05.2007, 20:23
Hallo

Ich möchte meine Projekte einfach halten und dabei möglichst auf Löteingriffe verzichten. Die Gründe dafür sind u.a.:

- ich bin altersbedingt fast blind und sehr zittrig
- ich habe 'ne schlechte Elektronik-Lötausrüstung und keinen vernünftigen Arbeitsplatz
- ich verwende nahezu den orginalen asuro, so kann jeder die Versuche nachbauen
- einfacher und kostengünstiger Aufbau mit schnellem Erfolgserlebniss
- mit wenigen Handgriffen ist die Erweiterung entfernt und der asuro für neue Schandtaten bereit
- der asuro hat mindestens fünf für Servoansteuerung nutzbare LEDs...

Die Pausenzeiten beeinflussen bei meinem Aufbau die Geschwindigkeit, mit der das servo in seine neue Position fährt. Je länger die Pausen zwischen den PWM-Impulsen sind, umso mehr Zeit läst sich das servo. Gleichzeitig sinkt auch die Stromaufnahme. Vermutlich macht das servo dann intern so etwas wie eine eigene PWM, weil der Motor nur ununterbrochen läuft, wenn die Impulse schnell genug hintereinander ankommen.

Gruß

mic

jpitsche
15.05.2007, 14:21
von welchen pin das atmegas bekommst du das pwm signal

asuromatze
15.05.2007, 16:09
@dani-bruchflieger
ich hab den servo jetzt mal so angelötet. aber wie kann ich den jetzt steuern?

Dani-Bruchflieger
15.05.2007, 19:22
gelb an con2 (portd.2)
rot an+
schwarz / braun an -

@jpitsche: Pwm soll also am Portd.2 ausgegeben werden. (entspricht StatusLed rot)

@asuromatze
wenn du Bascom kannst, kann ich dir ein Beispielprogramm posten. - ich muß es aber auch erstmal noch etwas anpassen, damit es auf dem Asuro laufen kann - dazu braucht man einen freien Timer
bsp Timer0:
1. Timer so configurieren, daß er recht langsam läuft. möglichst so daß 255 (128) Zählschritte ca. 1ms dauern. (der Servoimpuls soll zwischen 1,0 und 2,0 ms liegen auf jeden fall sollte 128 (64) die Mittelstellung sein! -> timer0 muß ISR 2 mal anlaufen pro servo, dann kommt das nächste dran bzw. beginnt die Pause die zw. 10 und 20 ms dauern soll.)
2. Die ISR des Timers
Zuerst wird eine Bytevariable um 1 erhöht. (zählt Ansprünger der ISR in der Schleife.
Wenn Zähler =1 dann Timer mit Servosollwert vorladen (0(0)=2ms 128(64)=1,5ms 255(128)=1ms)
Beim 2.mal den Port des Servos auf 0 setzen. (Pause startet)
Frühestens bei Zähler = 13 (spätestens bei 22) den Zähler auf 0 setzen und den Servoport einschalten.

Das ganze sind dann meherere If then Anweisungen, die intelligent verschachtelt werden müssen. zumal bei 8MHz kein Prescaler genau auf 1ms für 256 Schritte kommt - es muß immer etwas angepaßt werden, daß man grundsätzlich den Timer mit einem Grundwert vorlädt bei jedem Durchgang, aber beim 2.mal den Grundwert + den Servowert.
Normalerweise arbeite ich mit 7Bit Auflösung (0bis 127 mit 64=Mittelstellung) das ist genau genug. Hab mir damals eine Excel-Tabelle gemacht, wo ich mit Prescalern und vorladungen der Timer rumspielen konnte für jede Quartzfrequenz, bis ich die passende Konfiguration gefunden hatte...
Probier mal etwas rum - ich denke mal, du wirst eine gute Lösung finden. Kleiner Tipp noch: in der Abteilung Elektronik habe ich im Fred "Rechnen mit Bascom" ein Programm gepostet, daß an einem Mega8 mit 8MHz 5 Servos am Portb.0 ... b.4 per Timer1 so steuert, wie es per Potis an den Ports c.1 ... c.5 vorgegeben wurde. Allerdings ich habe mit C null Ahnung und kann nur erklären wie mans in Bascom umsetzen kann.

asuromatze
16.05.2007, 12:04
^^ich hab bascom leider nicht. kann man den asuro nicht mit dem mitgeliefertem programm programmieren, dass er den servo steuert?

Dani-Bruchflieger
16.05.2007, 12:42
Hi,

du brauchst kein Bascom um ein Servo ansteuern zu können - das kann man auch in assambler oder C schreiben - wenn man diese Programmiersprachen kann. Nur ich habe bisher nur und ausschließlich in Bascom Programmiert, und darum hab ich davon, wie man das in C umsetzt, keine Ahnung.
Das PWM für ein RC-Servo braucht nur einen Timer, der pro Durchlauf min. 1ms benötigt - der Timer1 eignet sich dafür noch besser, weil man ihn so einstellen kann, daß er pro Durchlauf 2ms läuft. Du mußt nur in der ISR des Timmers so intelligent programmieren, daß er einen Impuls von 1,0...2,0ms mit danach 10...20ms Pause erzeugt. Dafür gibt es verschiedene Möglichkeiten, je nach dem, ob nur ein Servo angesteuert werden soll, oder mehrere.
Beispiel für 5Servos am Mega8 in Bascom: https://www.roboternetz.de/phpBB2/viewtopic.php?t=30663
eventuell könnte das auch noch mit der kostenlosen Bascom-Demo kompiliert werden - aber man wird es sicherlich auch in C übersetzen können... wobei das Programm so wie es dort ist, NICHT für den Asuro geeignet ist! Soll ja nur als Beispiel dienen, wie man sowas von Hand machen kann.

asuromatze
16.05.2007, 13:42
^^ok vielen dank für deine antwort. ich werde mal schauen, ob ich das irgendwie hinbekomme.

radbruch
16.05.2007, 17:13
Als Programmbeispiel für den asuro könnte mein Code aus dem Startbeitrag dienen. Die angesteuerten LEDs müssen durch den verwendeten Port ersetzt werden und der betreffende Port eventuell zuvor noch auf Ausgabe programmiert werden. Außerdem muss die Logik noch invertiert werden, aus LED(OFF) wird Port=1 und umgekehrt.

mic

asuromatze
16.05.2007, 17:22
^^in welcher datei muss ich "port=1" einstellen? in "asuro.h" oder in der programmdatei?

radbruch
16.05.2007, 17:57
Das "Port=1" soll nur einen Pseudocode darstellen und steht für die Steuerung eines Ausgangsbit.

Soweit ich weis (bin noch ATMega und asuro-Neuling) hat der ATMega8 vier Ports(a-d) mit jeweils 8 Bits(=32Beinchen+Spannungsversorgung? *grübel*). Jedes Bit kann als Eingang oder Ausgang verwendet werden. Wenn man etwas ausgeben möchte, muss man das Datenrichtungsregister des entsprechenden Portbits auf Ausgabe setzen und kann dann anschliesend dieses Bit Setzen oder Löschen und damit das entsprechende Beinchen, an dem das Servo hängt, steuern. Gibt man eine 1 aus, stehen an dem Beinchen 5V(=VCC) an, bei einer 0 sind es dann 0V. Durch geschicktes Timing beim Ein-und Ausschalten erzeugt man dann das PWM-Signal für das Servo.

Weil ich (aus Zeitmangel) noch nicht in die Untiefen der direkten Port-Programmierung vorgedrungen bin, beschränke ich mich zur Zeit noch auf die Verwendung der asuro.h. Hier sind alle wichtigen asuro-Ports schon programmiert und initialisiert (Init()) und man kann sofort loslegen. Das ist auch der Grund für den Umweg über den Optokoppler. So kann ich die schon vorhandenen LEDs des asuros mit Standartbefehlen (....LED(ON/OFF)) steuern ohne genau zu wissen, wie das porttechnisch funktioniert.

Wenn du z.B. das ATMega-Beinchen anzapfst mit dem die Front-LED angesteuert wird, kannst du das PWM-Singal mit den FrontLED(ON/OFF)-Befehlen aus asuro.h erzeugen.

Alternativ kann man auch die hwdefines.h von asuro-henk verwenden. Das ist eine Sammlung von Defines die den Zugriff auf die Ports und Datenrichtungsregister vereinfachen. Allerdings wird diese Technik hier im Forum kaum besprochen, obwohl sich damit sehr schlanke und prozessornahe Codes erzeugen lassen.

mic