hallo,
für ein schulprojekt möchte ich meine asuro platine ein rc-car steuern
lassen. der servo wird direkt vom akku mit strom gespeist, der asuro
(mit spannungsregler dazwischen) auch.
Das weiße Signal-Kabel des Servos ist direkt mit dem Ausgang des
Mikrocontrollers, der sonst einen der Motoren versorgt, verbunden und
wird so mit dem PWM-Signal versorgt.
Mein Programm sieht wie folgt aus:
1
#include"asuro.h"
2
3
4
5
6
voidmain(void)
7
{
8
9
10
Init();
11
inti,j,time;
12
13
FrontLED(ON);
14
BackLED(ON,ON);
15
StatusLED(GREEN);//alle LEDs an
16
17
for(j=0;j<4;j++)Sleep(200);
18
19
FrontLED(OFF);
20
BackLED(OFF,OFF);
21
StatusLED(OFF);//alle LEDs aus
22
23
24
while(1)
25
{
26
27
//gerade
28
BackLED(ON,ON);
29
for(i=0;i<6000;i++)
30
{
31
MotorDir(FWD,FWD);
32
MotorSpeed(255,255);
33
Sleep(108);
34
MotorSpeed(0,0);
35
for(j=0;j<1;j++)Sleep(200);
36
}
37
38
//links
39
BackLED(ON,OFF);
40
for(i=0;i<700;i++)
41
{
42
MotorDir(FWD,FWD);
43
MotorSpeed(255,255);
44
Sleep(72);//failsafe=65
45
MotorSpeed(0,0);
46
for(j=0;j<1;j++)Sleep(200);
47
}
48
49
50
51
//rechts
52
BackLED(OFF,ON);
53
for(i=0;i<700;i++)
54
{
55
MotorDir(FWD,FWD);
56
MotorSpeed(255,255);
57
Sleep(144);
58
MotorSpeed(0,0);
59
for(j=0;j<1;j++)Sleep(200);
60
}
61
62
63
64
}
65
}
Wird so der Lenkservo angeschlossen bewegt er sich nach links, in die
mitte und nach rechts (also im groben und ganzen wie gewollt), zittert
allerdings in mitte und rechts ganz schön.
Schließe ich allerdings den Fahrregler an, dreht der Motor nicht
(links/rechts müsste hier ja eigentlich vor/zurück bedeuten).
Was müsste ich an dem Programm verändern um den Fahrregler richtig
anzusprechen?
Einen Akku hast du schon an den Regler angeschlossen? Oder ist ein evtl.
angeschlossener Akku leer? Zu geringe Spannung für den Motor? Zu hohe?
Motor mechanisch blockiert?
Motorlimit des Reglers verfehlt? (Turns)
Mal anderen Motor/regler probieren?
akku ist defintiv voll, mit messgerät gemessen, spannung passt, motor
dreht, turn limit stimmt, wenn der regler sein signal vom Empfänger
bekommt funzt alles.
Huh? So weit ich mich erinnern kann, ist die steuert der µC vom Asuro
doch direkt eine H-Brücke an und liefert kein Servokonformes Signal (
0.5 - 1.5ms high, 18.5-19.5ms low,Periodendauer 20ms). Da musst du schon
ein Signal erzeugen, das ein Servo oder der Fahrtenregler auch versteht.
an gast: nein das heißt es natürlich nicht der regler soll ja vom
controller gesteuert werden und nicht vom empfänger -.-
an tnn: die h-brücke ist nicht mehr in der schaltung wie in meinem
ersten post bereits erwähnt ist das signalkabels des servos direkt mit
dem microcontroller ausgang verbunden der sonst an die brücke vom motor
geht, pwm signal soll durch das programm erzeugt werden, klappt ja auch
beim servo schon.
Ohne jetzt das Programm zu beachten (programmiere in C):
Das Servozittern zeigt dir, dass etwas mit den Impulsen nicht stimmt.
Die Impulse kommen zu schnell, zu langsam oder die Pausenzeit ist nicht
in Ordnung.
Der Servo ist nur zu träge um es genauer an zu zeigen.
Der Fahrtenregler prüft die Impulse auf Plausibilität und interpretiert
sie als nicht gültig.
Schau nochmal das Programm durch und steuere den Servo so an, dass er
nicht zittert. Noch besser wäre, sich die Impulse mit einem Oszi an zu
sehen. Ich nehme mal an, dass du keines hast.
... Ulli
Vincent Göllner schrieb:> pwm signal soll durch das programm erzeugt werden, klappt ja auch> beim servo schon.
Solange der Servo zittert klappt es NICHT.
Erst wenn die Impulse stimmen, dann zittert auch der Servo nicht mehr.
... Ulli
Ok. Ich denke ich weiß jetzt was du mit dem Code vorhast. Die
Sleep(72),Sleep(144) und Sleep(108) sollen die Servostellungen links,
rechts und Mitte erzeugen.
Wozu hast du aber diese riesigen Schleifen mit i<6000 und die jeweiligen
Schleifen am Ende von jedem Block mit Sleep(200) eingefügt?
Wenn die Sleep(200) die Restperiodendauer darstellen sollen, sind sie
leider unterdimensioniert. Für einen Kanal brauchst du ja wie richtig
erkannt ein Signal von 1-2ms Länge und dann eine Pause von 18-20ms
Länge. Für die Pause müsstest du also bei deiner 72khz Sleepfunktion die
Funktion mit dem Wert Sleep(36)=0.5ms aufrufen und das Ganze entweder 36
, 37 oder 38 mal (durch deine Schleife (je nachdem wie lang dein Signal
vorher war)
@ tnn: die äusseren "riesigen" schleifen sollen das signal für eine
gewisse zeit senden, also die anzahl der schleifendurcläufe bestimmt wie
lange der servo in der angestrebten position bleibt
Die Schleifen am Ende mit dem Sleep 200 am ende jeden blocks sollen wie
du schon vermutet hast die restperiodendauer darstellen, ich hatte
angefangen mit soviel schleifendurchläufen dass ich auf 18-20ms komme,
da hat der servo sich aber nich zielgerichtet bewegt, der aktuelle code
ist vor allem durch ausprobieren entstanden.
Leider bin ich ziemlicher programmierdau, also wenn jemand von euch
meinen quellcode entsprechend verbessern oder einen anderen
funktionierenden anbieten könnte, wäre ich sehr dankbar
@spess: jop gemessen is io
@ulli: oszi hättich morgen inner schule wieder zur verfügung, wollte mir
sowieso als last resort das signal was ausm empfänger rauskommt angucken
habe das problem jetzt gelöst, die motorausgänge waren ungeeignet. habe
die pwm leitungen der servos jetzt an t12 und 13 also die backleds
angelötet.
servo fährt jetzt 1a zitterfrei in die gewollte position, fahrtenregler
initialisiert sich richtig und vollgas kann ich auch schon geben.
Für den Arduino gibt es doch sowieso schon für fast alle 08/15
Standardsachen was fix&fertiges.
http://arduino.cc/de/Reference/Servo
Das kann dann so einfach sein wie:
1
#include<Servo.h>
2
3
Servomyservo;
4
5
voidsetup()
6
{
7
myservo.attach(9);
8
myservo.writeMicroseconds(1500);// set servo to mid-point