REGLER ESC mit Arduino einlernen

BrainChecker

Rotor-Schredderer
#1
Hallöchen Community, ich hab mal wieder ein Problem:

im Zuge eines Bastelprojekts will ich einen ESC (Hobbking Blue Series 85A) mit einem Arduino ansteuern.
Im Prinzip gibts dazu auch vieles im Internet, sollte kein Problem darstellen.
Zuerst wollte ich den Regelweg einlernen; dazu hab ich mich daran gehalten:

https://dronesandrovs.wordpress.com/2012/11/24/how-to-control-a-brushless-motor-esc-with-arduino/

Diese Anleitung gibts es ja dutzendfach im Netz, sollte also eigentlich funktionieren.
Im seriellen Monitor wird der Poti auch korrekt erkannt (neg. Extremum 140, Mitte 160, pos Extremum 180).
Der ESC kann damit aber offensichtlich nichts anfangen.
Statt die gewünschten Töne zu produzieren (Anschalten bei neg -> Piepsen, Poti auf pos -> Piepsen, Poti neutral -> Bestätigung), gibt er beim Anschalten nur 4er-Kaskaden verschiedener, immer hektischer werdender Töne von sich.

Genau das gleiche passiert mir wenn ich den Arduino an einen anderen ESC hänge (no name China-Kracher), der ESC scheint also nicht defekt zu sein.

Hat hier jemand Erfahrung mit dem Thema/Problem? Gibt es einen anderen Anschlussplan oder einen anderen Code?

Ich würde mich freuen wenn ihr mir helfen könnt!
 
Zuletzt bearbeitet:

kalle123

Jugend forscht ....
#2
Wenn du einen Oszi zur Hand hast, häng den mit rein und schau, was da als Signal übertragen wird.

Für eine schnelle Prüfung hab ich mir irgendwann mal eine kleine Anzeige (Atmel 328 und 1602 LCD) gebaut.

Einfach dazwischen hängen und sehen, was sich da tut.

 

BrainChecker

Rotor-Schredderer
#3
Danke für die Antwort!

An ein Osci kann ich erst morgen rankommen, hab selbst leider (noch) keines...

Ich hab mich nochmal ein wenig mit dem Mapping in dem Code beschäftigt:

val= map(val, 0, 1023,1000,2000);

der Poti gibt aber laut seriellem Monitor nur Werte zwischen 0 und 250 aus. Also hab ich das Mapping auf

val= map(val, 20, 230,1000,2000);

geändert. Der Output beträgt nun Werte zwischen 960 und 2060, also Grenzen die für einen ESC Sinn ergeben.
Komischerweise erkennt der BlueSeries aber nur die untere Grenze. Wenn ich auf Minimalposition einschalte speichert er den Punkt, auf Maximalposition wieder nur das "Falsches/ kein Signal" Piepsen.
Eigentlich müsste es doch anders herum sein, oder? Erst Max dann Min damit weil er danach ja direkt gearmt ist.
 

kalle123

Jugend forscht ....
#5
Hab mal schnell das sketch auf nen Uno geladen.

Liefert hier nen Wert von 544 bis 2388.



Selbe Werte auch mit dem anderen sketch weiter unten auf der Seite in den Kommentaren.

Hab mal deine geänderte Zeile dort eingefügt und sehe hier 908 bis 2404.

Gruß KH
 
Zuletzt bearbeitet:

kalle123

Jugend forscht ....
#6
Ich hab mich nochmal ein wenig mit dem Mapping in dem Code beschäftigt:

val= map(val, 0, 1023,1000,2000);

der Poti gibt aber laut seriellem Monitor nur Werte zwischen 0 und 250 aus. Also hab ich das Mapping auf

val= map(val, 20, 230,1000,2000);

geändert. Der Output beträgt nun Werte zwischen 960 und 2060, also Grenzen die für einen ESC Sinn ergeben.
Irgendwas stimmt da nicht. Hab jetzt mal meinen Oszi rausgeholt.

Auch der sagt 2400!


 

kalle123

Jugend forscht ....
#7
Code:
//following your code
#include  <Servo.h>

Servo esc;
int potpin = 0;// Pot pin
int val=0;
void setup()
{
esc.attach(9);// ESC attach to pin no 9
}
void loop()
{
val = analogRead(potpin);
//val = map(val, 0, 1023, 0, 179);
val= map(val, 20, 230,1000,2000);

esc.write(val);
}
 

BrainChecker

Rotor-Schredderer
#8
Danke für dich Mühe die du dir machst kalle123!

Sorry für die Sketch-Verwirrung, hab mittlerweile nochmal das Ding neu zusammengetippt und die Variablen leicht anders genannt. Macht aber 1:1 das Selbe.
Der von Dir angehängte Code produziert ungefähr die von mir genannten Werte (960-2100).
Mit der auskommentierten Zeile val = map(val, 0, 1023, 0, 179); kommt was zwischen 0 und 50.
Das mag natürlich an dem eingeschränkten Weg des Potis liegen. Nutze einen Joystick (der später auch mal über 433mhz zur Bedienung verwendet werden soll), der nutzt ja effektiv nur vlt 60° der Rotation.

Trotz allem verstehe ich nicht warum der Brushless die Werte nicht akzeptiert; bzw nur die untere Grenze anerkennt.



@cesco1 ist ein 16mhz Mega328p Uno-Clone
 

BrainChecker

Rotor-Schredderer
#10
Ich bin jetzt vollkommen verwirrt;

Ich hab ein bisschen mit den Werten rumgespielt und hab mal noch ein Flugzeug dran gehängt (Hobbyking 20A ESC). Mit Max-Min-Mitte macht der auch nichts, allerdings wenn ich nur mit Minimalposition starte. Bestätigunspiepsen und wenn ich dann am Poti drehe dreht auch der Motor.
Exakt gleiches Setup am 85A Blue-Series. Motor reagiert gleichermaßen nicht auf erst Max dann Min, bringt aber auch eine positive Bestätigung wenn ich nur die Minimalposition anfahre. Allerdings dreht der Motor dann immer noch nicht wenn ich am Poti drehe.

Es ist zum Haare ausreißen. Am einen ESC funktionierts, am anderen nicht. ESC scheint ja aber nicht hinüber zu sein, denn den Motor piepsen lassen kann er ja...

Code:
#include  <Servo.h>

Servo esc;
int potpin = 0;
int val=0;
void setup()
{
esc.attach(9);
Serial.begin(9600); 
}
void loop()
{
val = analogRead(potpin);
//val = map(val, 0, 1023, 0, 180);
val= map(val, 0, 250,800,2300);
Serial.println(val);
esc.writeMicroseconds(val);
}
EDIT: ob ich esc.write(val) oder esc.writeMicroseconds(val) schreibe macht keinen Unterschied
 
Zuletzt bearbeitet:

BrainChecker

Rotor-Schredderer
#11
So ich melde mich nochmal damit die Sache nicht ungelöst im Raum steht.
Das Oszilloskop hat ein brauchbares Signal angezeigt; prinzipiell lag wohl kein Problem vor.

Ich hab dann noch ein bisschen mit dem Code rumgespielt und ein paar Delays reingebaut. Damit hats dann schlussendlich funktioniert.
Danke nochmal für die Hilfestellungen!

Code:
#include  <Servo.h>

Servo esc;
int potpin = 0;
int val=0;
void setup()
{
esc.attach(6);
Serial.begin(9600);
delay(40);
}
void loop()
{
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 180);
//val= map(val, 0, 1023,600,2300);
delay(1);
Serial.println(val);
//esc.writeMicroseconds(val);
esc.write(val);
delay(1);
}
 

Knuspel

Erfahrener Benutzer
#12
Du könntest noch val auf min und max Werte begrenzen, ich bin gerade nicht sicher ob map() das automatisch macht. Dein Poti ist möglicherweise nicht absolut genau.

Wenn du nur die ESC einlernen willst würde ich dir empfehlen ohne den Poti zu arbeiten

#define ESC_MIN 1000
#define ESC_MAX 2000
#define PAUSE 1000

...

esc.writeMicroseconds(ESC_MAX);
delay(PAUSE);
esc.writeMicroseconds(ESC_MIN);
delay(PAUSE);

...
 
FPV1

Banggood

Oben Unten