Ich probiere gerade mit meine Arduino Mega 2560 und Grove-Mega Shield Erweiterung ein Programm zum laufen zu bringen.
Dabei muss mein Servo-Motor drei unterschiedliche Positionen einnehmen.
Zu Beginn soll er Position 1 mit 0° einnehmen.
Wird Taster 2 gedrückt soll der Servo in die Position 45° fahren.
Wird Taster 3 gedrückt soll der Servo in die Position 90° fahren.
Wird Taster 1 gedrückt soll der Servo in die Position 0° fahren.
Beim Servo handelt es sich um ein Reely-Servo (Art. Nummer: RE-2141322)
Sobald der Servo am Arduino angeschlossen ist, kommt in regelmässigem Abstand vom PC ein Ton, wie wenn ein USB-Stick die Verbindung mit dem PC nicht schafft. Woran liegt das?
Zum Code:
int tasterPin1 = 2; //Taster1 an Pin 2 angeschlossen
int tasterPin2 = 4; //Taster2 an Pin 4 angeschlossen
int tasterPin3 = 6; //Taster2 an Pin 6 angeschlossen
int Servo_Pin = 12; //Servo an Pin 12
int Stellung1 = 0; //ServoStellung 1
int Stellung2 = 45; //ServoStellung 2
int Stellung3 = 90; //ServoStellung 3
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt
void Servo_move(int servo,int Stellung_Neu);
//-------------------------------------------------------------
void setup()
{
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin 2) wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 4) wird als INPUT definiert
pinMode(tasterPin3, INPUT); //tasterPin2 (Pin 6) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin3,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);
Stellung_bisher=Stellung1; // Ruhestellung
}
//-------------------------------------------------------------
void loop()
{
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
if (digitalRead(tasterPin3) == LOW)
Servo_move(Servo_Pin, Stellung3);
delay(20);
}
//-------------------------------------------------------------
/*** Ab hier nichts ändern, bestimmt das Timingverhalten!!! ***/
void Servo_move(int servo,int Stellung_neu){
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
}
Nein,
das wird nichts.
Das Bild bitte in Deinem Erstpost mit dem hochladen-Button einfügen.
Externe Links kann ich sowieso nicht und die verschwinden da irgendwann und kein Mensch kann später nachvollziehen, was Deine Ausgangslage war.
Mein Ansatz: Du ziehst mehr an Leistung aus dem USB-Port, als dieser zur Verfügung stellt, was der Port dann mit einem Disconnect quittiert.
So habe das Bild hier auch noch direkt integriert.
Gut Möglich, dass ich so zu viel Leistung ziehe. Input wäre 7 bis 12 Volt möglich, wie komme ich dort besser an das Limit? Mit den klassischen Laptop-Kabel hat man ja 19.5 Volt...
Irgend nen 9-12V Netzteil. Kein Ladegerät.
Und dann gehe mal in Dein Ausgangspost. Da ist unten ein Bleistift.
Der Code ist unvollständig.
Ersetze den mal mit dem was Du hast.
Ach schau. Du hast #1 nacheditiert... Es wäre schön, sowas ggfls auch mitzuteilen.
Das delay(20) macht was?
Und was machst Du in Servo_move? Da gibt es nach jedem Grad eine Pause von 19ms? Warum schickst Du den Servo nicht einfach an seine Position.
Dafür gibt es eine Library, die Dir alles abnimmt. Nimm diese.
Mein Code kompiliert - ob er das macht, was Du willst, musst Du rausfinden.
#include "Servo.h"
Servo myServo;
const byte Servo_Pin = 12; //Servo an Pin 12
const byte tasterPin[] = {2, 4, 6};
const byte pos[] = {0, 45, 90};
byte soll = 0;
//-------------------------------------------------------------
void setup()
{
for (byte b = 0; b < 3; b++)
pinMode(tasterPin[b], INPUT_PULLUP);
pinMode(Servo_Pin, OUTPUT);
myServo.write(pos[0]);
}
//-------------------------------------------------------------
void loop()
{
for (byte b = 0; b < 3; b++)
{
if (digitalRead(tasterPin[b]) == LOW)
{
soll = b;
continue;
}
}
if (soll > sizeof(pos) / sizeof(pos[0]))
soll = 0; // sicherheitsabfrage
myServo.write(pos[soll]);
}