Forum: Mikrocontroller und Digitale Elektronik Problem: Arduino brushless Motor Steuerung


von mompf (Gast)


Lesenswert?

Guten Abend,

ich habe die Schaltung

http://api.ning.com/files/QYxylXSaas588I6jwxcoAJR8lBXneWApDBFHGCoOMg7Ge975QGTPeT0Qinw4ffnFDRoWYf7TcktkQRYX--0YwbQT05HgK*zp/arduino_esc_lucaszanela_com.png

mit einem Arduino Uno und einem Brushless Motor (+ESC) aufgebaut. Es 
funktioniert auch soweit, dass ich den Motor steuern kann.

Aber nun zum Problem: Wenn ich die Spannungsversorgung Aus/An schalte, 
dann ist immer noch derselbe Sketch auf dem Arduino, allerdings dreht 
sich der Motor nicht mehr. Es funktioniert erst wieder, wenn ich nach 
dem Einschalten der Spannungsversorgung den Code nochmals auf den 
Arduino lade.

von Falk B. (falk)


Lesenswert?

Schon mal RESET gedrückt? Dein Sketch hat wohl ein Problem beim 
Anlaufen. Mach da mal an erste Stelle in setup() ein delay(1000); rein.

von mompf (Gast)


Lesenswert?

Falk B. schrieb:
> Schon mal RESET gedrückt? Dein Sketch hat wohl ein Problem beim
> Anlaufen. Mach da mal an erste Stelle in setup() ein delay(1000); rein.

Habe beides ausprobiert. Das mit dem delay bringt nichts. Aber ich habe 
herausgefunden, dass ich den Code nicht unbedingt nochmal neu hochladen 
muss. Stattdessen reicht es RESET zu drücken. Aber dies kann nicht die 
Lösung sein!

von mompf (Gast)


Lesenswert?

1
#include <Servo.h>
2
3
Servo motor;
4
5
void setup() {
6
  delay(1000);
7
  motor.attach(MOTOR_PIN);
8
  
9
}
10
11
void loop() {
12
  motor.writeMicroseconds(1200);
13
}

Hier noch der Code

von mompf (Gast)


Lesenswert?

1
#include <Servo.h>
2
3
#define MOTOR_PIN 4
4
Servo motor;
5
6
7
void setup() {
8
  delay(1000);
9
  motor.attach(MOTOR_PIN);
10
  
11
}
12
13
void loop() {
14
  motor.writeMicroseconds(1200);
15
}

Hatte gerade noch die Definition des MotorPins vergessen.
Außerdem ist mir aufgefallen, dass es kein Problem ist die Spannung vom 
Arduino zu nehmen. Der Code funktioniert danach ganz normal. Das Problem 
ist nur, wenn die das Netzgerät ausschalte, welches das ESC mit Spannung 
versorgt.

von Falk B. (falk)


Lesenswert?

@ mompf (Gast)

Und wo ist die Definition von MOTOR_PIN?

Ist das der ECHTE Code, aus deinem Sketchblock kopiert? Oder ist der 
hier aus dem Gedächtnis hingeschrieben? Das wäre doof!

https://www.mikrocontroller.net/articles/Netiquette#.C3.84u.C3.9Fere_Form

"Quelltext nie abtippen, sonder immer das direkt kopierte Original 
posten, anderenfalls schleichen sich neue Fehler ein oder die 
existierenden werden nicht abgeschrieben."

An sich sollte der COde so laufen.

von Falk B. (falk)


Lesenswert?

@ mompf (Gast)

>Außerdem ist mir aufgefallen, dass es kein Problem ist die Spannung vom
>Arduino zu nehmen. Der Code funktioniert danach ganz normal. Das Problem
>ist nur, wenn die das Netzgerät ausschalte, welches das ESC mit Spannung
>versorgt.

Dann hat dein Servotreiber, genannt ESC (was ist das?) ein Problem mit 
dem Reset.

von mompf (Gast)


Lesenswert?

Falk B. schrieb:
> ESC (was ist das?)

ESC = Electronic Speed control
Das ist ein Regler für einen brushless Motor, der Drehzahl und 
Geschwindigkeit des Motors steuert.

Falk B. schrieb:
> ein Problem mit
> dem Reset.

Gibt es dafür keine Lösung?

von Falk B. (falk)


Lesenswert?

@ mompf (Gast)

>ESC = Electronic Speed control
>Das ist ein Regler für einen brushless Motor, der Drehzahl und
>Geschwindigkeit des Motors steuert.

Was ist der Unterschied zwischen Drehzahl und Geschwindigkeit? ;-)

>> ein Problem mit
>> dem Reset.

>Gibt es dafür keine Lösung?

Es gibt immer eine Lösung!

Hast du einen Link auf ein Datenblatt deiner ESC?

Beschreibe noch einmal EXAKT was du macht und was dann passiert. So 
richtig klar ist das noch nicht.

von Markus F. (blackflip)


Lesenswert?

Definier auch mal deine Pins die benutzt als Ausgang, das hat auch schon 
einige Probleme gelöst.

von mompf (Gast)


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:
> Hast du einen Link auf ein Datenblatt deiner ESC?

Habe es als pdf angehängt.

Falk B. schrieb:
> Beschreibe noch einmal EXAKT was du macht und was dann passiert. So
> richtig klar ist das noch nicht.

1) Arduino über USB (PC) mit Spannung versorgen und ESC über Netzgerät 
mit Spannung versorgen. Code auf Arduino laden. Motor funktioniert.
2) Spannung von ESC ausschalten und wieder an. Dann funktioniert der 
Motor erst wieder, wenn ich nochmal den Code auf den Arduino lade.
3) Spannung von Arduino ausschalten und wieder an. Dann funktioniert der 
Motor ohne den Code nochmals auf den Arduino zu laden.

Der Wunsch ist es, dass ich von Arduino und ESC die Spannung nehmen kann 
und nach dem Einschalten der Motor wieder direkt anläuft.

von mompf (Gast)


Lesenswert?

Markus F. schrieb:
> Definier auch mal deine Pins die benutzt als Ausgang, das hat auch schon
> einige Probleme gelöst.

Habe ich doch im zweiten Code von mir. Habe nur Pin 4 als Ausgang.

von Markus F. (blackflip)


Lesenswert?

mompf schrieb:
> Markus F. schrieb:
>> Definier auch mal deine Pins die benutzt als Ausgang, das hat auch schon
>> einige Probleme gelöst.
>
> Habe ich doch im zweiten Code von mir. Habe nur Pin 4 als Ausgang.


Nein das hast du leider nicht gemacht, du musst dazu noch den Pinmode 
setzen.
https://www.arduino.cc/en/Reference/PinMode


Das sehe ich bei dir nicht, damit ist der Zustand von den Pin nicht 
genau definiert und er macht was er will. Bei freunden gab es dadurch 
schon ähnliches verhalten, das es mal ging und mal nicht.

Das ist dein Quelltext, dabei fehlt das eindeutig:
#include <Servo.h>

#define MOTOR_PIN 4
Servo motor;


void setup() {
  delay(1000);
  motor.attach(MOTOR_PIN);

}

void loop() {
  motor.writeMicroseconds(1200);
}

Edit: Sry scheint bei der Libary anscheinend net nötig zu sein, ich 
finde das dennoch echt unschön so

: Bearbeitet durch User
von mompf (Gast)


Lesenswert?

Ich habe aus Versehen das falsche Datenblatt angehängt.

Ich habe einen Emax Simon Series 20A

http://yinyanmodel.com/EMAX%20User%20Instruction%20for%20Simonk%20Series%20ESC.pdf

von Norbert S. (norberts)


Lesenswert?

Hi,

der ESC mag es nicht wenn er eingeschaltet wird und das Signal nicht 
Null ist.
Mache beim Start mal ein paar Sekunden 1000ms Servosignal und dann erst 
1200, das sollte gehen.

Gruß,
Norbert

von mompf (Gast)


Lesenswert?

1
#include <Servo.h>
2
3
#define MOTOR_PIN 4
4
Servo motor;
5
6
7
void setup() {
8
  motor.attach(MOTOR_PIN);
9
  motor.writeMicroseconds(1000);
10
  delay(5000);
11
}
12
13
void loop() {
14
  motor.writeMicroseconds(1200);
15
}

Ich habe immer noch das gleiche Problem. Was ich noch erwähnen könnte 
ist das Piepsen des Motors. Wenn der Code nicht läuft, dann piepst er 
monoton. Wenn der Code aber funktioniert, komme zunächst ein paar 
schnelle Töne.

von Norbert S. (norberts)


Lesenswert?

Hi,

Das kann natürlich nur gehen, wenn Du beide gleichzeitig mit Spannung 
versorgst.
Wenn der Arduino schon läuft, sieht der startende ESC die 1000ms während 
der 5s ja nicht mehr.

Gruß,
Norbert

von mompf (Gast)


Lesenswert?

Hast natürlich Recht! Jetzt funktioniert es auch, danke!

Woher weißt du, dass er am Anfang Null haben will? Im Datenblatt steht 
(glaub ich zumindest) nichts dazu.

Beziehungsweise weißt du wieso das so ist?

von Norbert S. (norberts)


Lesenswert?

Hi,

Jeder Modellbauer weiß das und das machen alle Regler (Steller) so.
Stell Dir ein Flugmodell vor, der Gasknüppel ist da meist mit Rasten.
Der Sender liegt rum, ausversehen auf Gas gestellt und jetzt klemmst Du 
den Akku an...
Früher war das nicht so, ich hab noch eine schöne Narbe davon am 
Unterarm.

Du kannst den Arduino übrigens auch mit den 5V vom ESC betreiben, der 
dürfte BEC haben, wenn da nicht "Opto" draufsteht.
Das sind dann meist 5 oder 5,5V, min 1A.

Gruß,
Norbert

von mompf (Gast)


Lesenswert?

Dankeschön. Nun hätte ich allerdings noch eine Frage zum Code.

motor.attach(MOTOR_PIN);
Hiermit lege ich fest, an welchem Pin das Signal vom ESC kommt?

motor.writeMicroseconds(x);
Was macht genau dieser Befehl?

" On standard servos a parameter value of 1000 is fully 
counter-clockwise, 2000 is fully clockwise, and 1500 is in the middle"

Bedeutet das nicht, dass er sich bei 1000 gegen den Uhrzeigersinn und 
bei 2000 mit dem Uhrzeigersinn dreht?

von Norbert S. (norberts)


Lesenswert?

Hi,

mompf schrieb:
> motor.attach(MOTOR_PIN);
> Hiermit lege ich fest, an welchem Pin das Signal vom ESC kommt?

Ich hab keine Ahnung von Arduino aber so klingt das.
Gedacht ist das wohl für Servos.

mompf schrieb:
> motor.writeMicroseconds(x);
> Was macht genau dieser Befehl?

Auch hier kann ich nur spekulieren, daß das ein Servosignal ausgibt.
Alle ca. 20ms (das ist sehr unkritisch, 10 bis 30ms geht fast immer) ein 
Puls von 1000 bis 2000µs Länge.
Die Länge des Pulses ist die Information.

mompf schrieb:
> " On standard servos a parameter value of 1000 is fully
> counter-clockwise, 2000 is fully clockwise, and 1500 is in the middle"

Das gilt für Servos und entspricht der Knüppelstellung an einer 
Fernsteuerung. Bei einem Antriebsmotor Vor und Zurück.

mompf schrieb:
> Bedeutet das nicht, dass er sich bei 1000 gegen den Uhrzeigersinn und
> bei 2000 mit dem Uhrzeigersinn dreht?

Nein, das ist ein Flugregler und der kann nur Vorwärts.
Knüppel zurück, also 1000ms ist hier aus, 2000ms ist Vollgas und 1500ms 
eben Halbgas.

Kauf Dir mal das billigste Servo das Du kriegen kannst (<5€), wenn Du 
damit rumspielen willst.
Da siehst Du dann was passiert ohne vermuten zu müssen, was der Regler 
da gerade macht.

Gruß,
Norbert

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.