Hallo zusammen,
nachdem ich bereits seit längerem passiver Teilnehmer dieses Forums bin, möchte ich heute die Gelegenheit nutzen etwas zurückzugeben und meine neueste Erkenntnis zu teilen.
Ich habe einen Arduino Nano der mit einem Endschalter einen Digital-Servo in zwei unterschiedliche Positionen fahren soll.
Servo ist mit externen 6V verbunden.
Der erste Versuch war die Einbindung der Servo.h und die direkte Ansteuerung mit Angabe der Winkel.
#include <Servo.h>
Servo servoblau;
void setup()
{
servoblau.attach(8);
pinMode(4,INPUT);
pinMode(5,OUTPUT);
}
void loop()
{
if (digitalRead(4) == 1){
servoblau.write(90);
}
else
{
servoblau.write(0);
}
}
Daraufhin hat mein digitales Servo nur geruckelt und sich nicht bewegt. Da es sich um ein günstiges Produkt aus Fernost handelt bin ich davon ausgegangen dass das gute Teil Schrott ist. Ein Test in einer RC-Steuerung hat das Gegenteil bewiesen.
Also musste das Problem irgendwo an der Programmierung liegen.
Ein altes analoges Servo hat auf Anhieb funktioniert und ist die Positionen angefahren.
Nach weiterer Recherche habe ich dann herausgefunden dass mein digitales Servo nicht ganz den Standardspezifikationen entspricht. Somit habe ich auf die Servo.h verzichtet und die PWM manuell programmiert.
void setup() {
pinMode(2,OUTPUT);
pinMode(4,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(4) == 1){
aa(0);
}
else
{
aa(90);
}
}
void aa(int i)
{int m=map(i,0,180,500,2500);
digitalWrite(2,HIGH);
delayMicroseconds(m);
digitalWrite(2,LOW);
delayMicroseconds(20000-m);
}
Der Servo hat sich jetzt zwar an die gewünschte Position bewegt, aber nur sehr ruckelig und extrem langsam (90° in ca.10s). (Auch hier wieder: Analoges Servo kein Problem)
Durch Zufall bin ich darauf gestoßen dass jemand die gewünschte Position nicht als Endwert übergibt, sondern diese "langsam" inkrementiert - und siehe da: ES TUT!
int pos=0;
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(4,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(4) == 1){
if (pos == 0){
for(int l=0;l<=90;l++)
{
aa(l);
delay(5);
}
pos = 90;
}
}
else
{
if (pos == 90){
for(int l=90;l>=0;l--)
{
aa(l);
delay(5);
}
pos=0;
}
}
}
void aa(int i)
{int m=map(i,0,180,500,2500);
digitalWrite(2,HIGH);
delayMicroseconds(m);
digitalWrite(2,LOW);
delayMicroseconds(20000-m);
}
Der Code ist auf die schnelle aus mehreren Quellen zusammenkopiert und noch nicht bereinigt - sorry.
Eine genaue Erklärung dafür habe ich leider nicht, aber vielleicht hilft es ja trotzdem jemandem weiter.
Falls jemand das Verhalten erklären kann würde ich mich freuen.
Viele Grüße
Shane54