Programmierhilfe Ansteuerung Schrittmotor

Hallo Zusammen,

ich habe mit meinem Sohn eine Garage für sein ferngesteuertes Auto gebastelt. Daran ein Garagento, welches per Schrittmotor + Codetaster geöffnet werden soll. Alles mit dem Arduino.

Das ganze funktioniert auch soweit, allerdings verzweifle ich an einem Punkt.

Wenn der Code zum öffnen eingegeben wird, fährt der Schrittmotor auf die Stellung öffnen, schließt dann aber sofort wieder. Ich blicks nicht. Kann mir da jemand weiterhelfen? Sorry bitte für den Programmierstil, ist einer meiner ersten Programme!

Vielen Dank
Markus

#include <Keypad.h>
#include <Servo.h> 

 
// Pinlänge und Pincode festlegen
const byte PINLENGTH = 4;
char pinOpen[PINLENGTH+1] = {'1','1','1','1'};
//Markus Begin
char pinClose[PINLENGTH+1] = {'0','0','0','0'};
//Markus Ende 
// Zwischenspeicher für Eingaben
char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};
 
// Kompakter kann man das auch so schreiben:
// char pin[] = "0815";
// char keyBuffer[] = "----";
 
// Definition für das Keypad von Elegoo
const byte ROWS = 4; // vier Zeilen
const byte COLS = 4; // vier Spalten
// Symbole auf den Tasten
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
 
// Einstellung für Servo und LEDs
//const int greenPin = 12;
//const int redPin = 13;
const int servoPin = 10;
const int servoPin1 = 11;
const int angleClosed = 5;
const int angleClosed1 = 7;
const int angleOpen = 100;
const int angleOpen1 = 100;
const int anglezero1 = 0;
const int openDelay = 3000;
 
// Servo-Objekt erzeugen
Servo myservo;
Servo myservo1;
 
// Instanz von Keypad erzeugen, Keymap und Pins übergeben
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
 
void setup()
{
  Serial.begin(9600);
  // LED Pins setzen
// pinMode(greenPin, OUTPUT);
//  pinMode(redPin, OUTPUT);
//  digitalWrite(greenPin, LOW);
//  digitalWrite(redPin, LOW);
  // Servo auf Ausgangsposition
  myservo.attach(servoPin);
  myservo.write(angleClosed);
  myservo1.attach(servoPin1);
  myservo1.write(angleOpen1);
 
}
 
void loop()
{
  // Gedrückte Taste abfragen
  char customKey = customKeypad.getKey();
 
  if (customKey) 
  {
    // Check, ob ASCII Wert des Char einer Ziffer zwischen 0 und 9 entspricht
    if ((int(customKey) >= 48) && (int(customKey) <= 57)){ 
      addToKeyBuffer(customKey); 
  }
  // oder Code überprüfen, falls Raute gedrückt wurde 
    else if (customKey == '#')
    { 
      checkKey(); 
    } 
  } 
} 
 
void addToKeyBuffer(char inkey)
{ 
  Serial.print(inkey); 
  Serial.print(" > ");
  // Von links nach rechts Zeichen um eins weiterkopieren = ältestes Zeichen vergessen
  for (int i=1; i<PINLENGTH; i++) 
  {
    keyBuffer[i-1] = keyBuffer[i];
  }
  // in ganz rechter Stelle die letzte Ziffer speichern
  keyBuffer[PINLENGTH-1] = inkey;
  Serial.println(keyBuffer);
}


void checkKey() 
{
  // Eingabe mit festgelegtem Pincode vergleichen
  if (strcmp(keyBuffer, pinOpen) == 0) 
  {
    Serial.println("Garage auf");
    // Aktion für richtigen Pin ausführen
    pinGarageAuf();
  }

  //Markus Begin
  
 if (strcmp(keyBuffer, pinClose) == 0) 
  {
    Serial.println("Garage zu");
    // Aktion für richtigen Pin ausführen
    pinGarageZu();
  }
 // Markus Ende
//  else {
//    Serial.println("Code Falsch!");
    // Aktion für falschen Pin ausführen
    //pinWrong();
//  }


 
  // Nach Überprüfung Eingabe leeren
  for (int i=0; i < PINLENGTH; i++) {
    keyBuffer[i] = '-'; 
  }
}
 
// Aktion für Pincode öffnen
void pinGarageAuf() 
{
  myservo.write(angleOpen);
  myservo1.write(angleClosed1);
  delay(10);

}


//Markus Beginn
 // Aktion für Pincode schließen
void pinGarageZu() 
{
myservo.write(angleClosed);
myservo1.write(angleOpen1);

}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

ich sehe da keinen Schrittmotor sondern zwei Servos im Code.
Bitte mach ein Echtbild was du da genau gebaut hast.

Nutze die Serielle Schnittstelle zum Debuggen, d.h. gib in jede deiner Funktionien eine Ausgabe, rein damit du nachvollziehen kannst was dein Sketch macht.

Wenn du trotz der Erweiterung deine Programmlogik nicht nachvollziehen und korrigieren kannst:

  • poste deinen neuen Sketch,
  • poste den Seriellen Output der das Problem zeigt.

Ich sehe keine Fehle im Programm aber eine schlechte verwendung von arrays bzw String.
Die Strings sollten mit "/0" als Terminator abgeschlossen werden. Wo machst Du das?

const byte PINLENGTH = 4;
...
char keyBuffer[PINLENGTH+1] = {'-','-','-','-'};

Du erzeugst ein Array mit 5 Elementen und speicherst in den ersten 4 Elementen (0 bis 3) einen Wert.

Was sagen die seriellen Ausgaben. Sind alle Ausgaben so wie Du das erwartest?
Was passiert wenn Du einen Falschen CODE eingibstß
Grüße Uwe

Sorry, natürlich Servos. Das mit dem debuggen muss ich noch lernen.

Wenn ich den falschen Code eingebe, passiert nichts. So wie es soll. Das mit dem Codetaster funktioniert alles. Der Servo wird beim eingeben des richtigen Code und bestätigen mit # bewegt. Auch an die richtige Stelle. Mein Problem ist nur, dass er sofort wieder zurück fährt..

Du steuerst in deinem Code aber 2 Servos an. Immer einer auf und der andere zu und umgekehrt. Wie sind die 2 Servos denn verbaut?
Zeig mal ein Bild, wie das ganze aussieht und mechanisch funktionieren soll.

Und wie wird das ganze mit Strom versorgt - nicht dass der Arduino einfach bei jedem Öffnen einen Reset macht, weil die Spannung zusammenbricht. Du kannst im Setup noch ein Serial.print mit einer Startmeldung einbauen, dann kannst Du das erkennen.

Vielen Dank euch allen für die schnelle Hilfe. Lösung war so einfach wie simple wie von MicroBahner geschrieben: Die Spannung am USB Port ist zusammengebrochen. Mit einem Netzteil geht alles, Code war also in Ordnung.

Markus

Bravo, Daran hätte ich nicht gedacht.
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.