Hab mal versucht die Richtngsbestimmung einzubauen. Wenn ich mir dei Werte im Serial Monitor augeben lasse, nimmt er immer rchtsrum, egal ob ich von Gleis 11 zu Gleis 12 oder von Gleis 12 zu Gleis 11 fahren will.
Ausgabe Serieller Monitor:
Schritte rechts 1 rechtsrum das stimmt
Schritte links 47
benoetigte Schritte 1
11 // gleisAlt
12 // gleisNeu
1 // Schrittzähler
Schritte
0
Ziel // Ziel erreicht
12
Schritte rechts 1 immer rechtsrum obwohl linksrum gefahren werden soll
Schritte links 47
benoetigte Schritte 1
12 // gleisAlt
11 // gleisNeu
Bei dem Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
unsigned long aktuelleZeit;
unsigned long vergangeneZeit_A;
unsigned long interval_1 = 2000;
int messungPin1 = HIGH;
int messungPin1Alt = HIGH;
byte encoderWert = 0; // -1 ( eins weniger als 0 ) == 255
const byte hal = 3;
const byte encoderPinA = 10; // Phase A vom Drehencoder
const byte encoderPinB = 11; // Phase B vom Drehencoder
const byte tasterEnter = 12; // Pin an dem der Encoder Taster angeschlossen ist
int wertSpeichern = 0; // gespeicherter Encoderwert
int encoderGedrueckt = 0; // Statusspeicher ob Encodertaster betätigt wurde
int encoderTaster = HIGH; // Taster im Encoder
int gleisAlt = 0; // Scheibe Position alt
int gleisNeu = 0; // Position welche die Scheibe anfahren soll
bool enter = false; // Bestätigung das der Encoder gedrückt wurde
int schritte = 0; // Schritte die deer Motor (Hallsensor betätigt) zurücklegen muss
int sensor = LOW;
bool start = false;
bool ergebnis = false;
unsigned long encoderDruckzeit; // Zeit wann der Encodertaster betätigt wurde
unsigned long entprellZeit = 200; // Zeit die nach der betätigung eines Tasters gewartet wird
unsigned long startZeit; // Abfrage begin Sensor an Bühne
unsigned long interval = 2000; // Zeitabstand nachdem ein Zustand des Sensors erkannt wird
unsigned long vergangeneZeit = 0; // Speichervariable um die Vergangene Zeit zu speichern
bool nullStellung = false; // Speichervariable ob Referenzfahrt erfolgt ist
int pin_motor_links = A1; // Richtungspin an H-Brücke für Links
int pin_motor_rechts = A2; // Richtungspin an H-Brücke für Rechts
const byte sensor_referenz = 2; // Pin für Sensor Referenz aussen an der Grube (Nullstellung)
int status_sensor_referenz; // Speichervariable für Status von Sensor für Referenzfahrt
byte linksRum = 0; // Anzahl Schritte Drehrichtung links
byte rechtsRum = 0; // Richtungsflag Drehrichtung rechts
void setup() {
pinMode(sensor_referenz, INPUT);
pinMode(pin_motor_links, OUTPUT);
pinMode(pin_motor_rechts, OUTPUT);
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
pinMode(tasterEnter, INPUT);
pinMode(hal, INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Drehscheiben-");
lcd.setCursor(0, 1);
lcd.print("steuerrung");
delay (2000);
//lcd.clear();
//lcd.begin(16, 2);
//lcd.setCursor(0, 0);
//lcd.print("Wert");
//lcd.setCursor(0, 1);
//lcd.print(encoderWert);
}
void loop() {
referenzFahrt();
encoder_lesen();
schritt();
schritteZaehlen();
//Motor();
}
void referenzFahrt() {
aktuelleZeit = millis();
status_sensor_referenz = digitalRead(sensor_referenz);
if ((nullStellung == false) && (status_sensor_referenz == HIGH)) {
digitalWrite (pin_motor_rechts, HIGH);
digitalWrite (pin_motor_links, LOW);
if (millis() - vergangeneZeit_A >= interval_1) {
Serial.println("2 Sekunden abgelaufen");
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Referenzfahrt");
lcd.setCursor(0, 1);
lcd.print("gestartet");
vergangeneZeit_A = millis();
}
}
else if ((nullStellung == false) && (status_sensor_referenz == LOW)) {
Serial.println(nullStellung);
Serial.println(status_sensor_referenz);
Serial.println(vergangeneZeit_A);
nullStellung = true;
digitalWrite(pin_motor_rechts, LOW);
digitalWrite(pin_motor_links, LOW);
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Referenzfahrt");
lcd.setCursor(0, 1);
lcd.print("beendet");
delay(2000);
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Wert");
lcd.setCursor(0, 1);
lcd.print(encoderWert);
}
}
void encoder_lesen () {
messungPin1 = digitalRead(encoderPinA);
if ((messungPin1 == LOW) && (messungPin1Alt == HIGH) && (nullStellung == true)) {
if (digitalRead(encoderPinB) == HIGH) {
if (encoderWert < 48) encoderWert++ ;
} else {
if (encoderWert > 1) encoderWert-- ;
}
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Wert");
lcd.setCursor(0, 1);
lcd.print(encoderWert);
}
encoderTaster = digitalRead(tasterEnter);
if (encoderTaster == LOW)
{
encoderDruckzeit = millis();
encoderGedrueckt = 1;
}
if ((millis() - encoderDruckzeit > entprellZeit) && encoderGedrueckt == 1) {
wertSpeichern = encoderWert;
Serial.println(wertSpeichern);
encoderGedrueckt = 0;
enter = true;
}
messungPin1Alt = messungPin1;
}
void schritt () {
if (enter == true) {
gleisNeu = wertSpeichern;
//schritte = abs (gleisNeu - gleisAlt);
rechtsRum = abs(gleisAlt - gleisNeu); //Weg rechts herum
linksRum = 48 - abs(gleisAlt - gleisNeu); //Weg links herum
schritte = min(rechtsRum, linksRum); //kürzeren Weg nehmen
Serial.print("Schritte rechts ");
Serial.println(rechtsRum);
Serial.print("Schritte links ");
Serial.println(linksRum);
Serial.print ("benoetigte Schritte ");
Serial.println(schritte);
//gleisAlt = wertSpeichern;
Serial.println(gleisNeu);
Serial.println(gleisAlt);
Serial.println(enter);
enter = false;
ergebnis = true;
}
}
void schritteZaehlen () {
sensor = digitalRead (hal);
startZeit = millis();
if ((schritte != 0) && (ergebnis == true)) {
start = true;
if ((startZeit - vergangeneZeit >= interval) && (sensor == LOW) && (start == true)) {
vergangeneZeit = startZeit;
schritte--;
Serial.println("Schritte");
Serial.println(schritte);
}
}
else if ((schritte == 0) && (start == true)) {
start = false;
Serial.println("Ziel");
ergebnis = false;
gleisAlt = wertSpeichern;
}
}
void best_Richtung() {
}
void motor() {
}
Woran könnte das liegen?