Code: Alles auswählen
/* Dateiname: Drehscheibe_neu_2_1 by e69-fan
Beispiel: Stepper_03 von den MobaTools / MoToStepper - attaching a bipolar stepper with step/dir and enable
StepperMotor ACT 17HS4417L20P1X2
TB6600 Schrittmotor-Treiber-Modul
16 MicroStep - 3200 Pulse/Rev - S1 OFF / S2 OFF / S3 ON
Current Control Setting: 1,5 Ampere S4 ON / S5 ON / S6 OFF
max. Drehwinkel 370 Grad, dann zurück
Referenzpunkt bei Position "Einfahrt" in Einzelschritten links/rechts setzen, Bestätigung mit LED
Blinklicht AN während der Bühnendrehung
optionale Infoausgabe an LCD-Display 20x4 // A4 =SDA; A5 =SCL; 5V Plus; Masse
Danke an MicroBahner und Franz54 https://www.franzls-technik-forum.de
https://arduino-fan.de/
*/
#define MAX8BUTTONS
#include <MobaTools.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
// A4 = SDA, grün; A5 = SCL, blau; +5V, rot; Ground, schwarz;
//----- individuelle Definitionen -------------------------------------------------- //
// -----------Declarationen Blinklicht-----------------
int LED_PIN = 2; // Blink-LED auf D2
byte LED = LOW;
byte stopp = 8;
byte fahrt = 8;
unsigned long BLINKIO = 0;
const int delayTime = 300; // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;
// ----------------------------------------------------
//TMC2209 = 5,6,7 - TB6600 = 36,35,34 - DM556 = 32,31,30
const byte dirPin = 5; // orange
const byte stepPin = 6; // lila
const byte enaPin = 7; // grau
const byte LinksPin = A1; // rot / 4 steps nach links
const byte RechtsPin = A2; // grün / 4 steps nach rechts
const byte RefPin = A3; // grau / RefPunkt setzen - RefLED leuchtet
const byte RefLED = 13; // gelb / leuchtet wenn RefPunkt gesetzt
const byte piezo = 3; // rot-weiß / ?????????????????????????????????
const byte EinfahrtPin = 8 ; // grün / Einfahrt Gleis1A - Lok steht vorwärts
const byte V_Ausfahrt_1bPin = 9 ; // gelb / Ausfahrt Gleis1B - Lok steht vorwärts
const byte WendePin = 10; // blau / Wendung 180 Grad - Lok steht
const byte SchuppenPin = 11; // grau / Lokschuppen - Lok steht
const byte R_Ausfahrt_1bPin = 12; // orange / Ausfahrt Gleis1B - Lok steht rückwärts
const byte potPin = A0; // Analog Poti Eingang
int Umdrehungen = 0;
int Umdrehung_Schritte = 3200; // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe = 200;
// ----- Stepper einrichten ( 3200 Schritte / Umdrehung - 1/8 Microstep )------------------------------------------- //
const int STEPS_REVOLUTION = 3200; // Schritte Auftrag für TCM2208 nur 1600
MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR ); // Steps bei xxx pro Umdrehung
// ----- Taster einrichten ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 } ; // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, EinfahrtPin, V_Ausfahrt_1bPin, WendePin, SchuppenPin, R_Ausfahrt_1bPin } ; // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );
// ----- speedPoti einrichten --------------------------------------------------------------------------------------//
MoToTimebase speedIntervall; // Zeitinterval zum Auslesen des Speedpotentiometers
int vspeed = 0; // Steppergeschwindigkeit in U/min*10
// ----------------------------------------- S E T U P -----------------
void setup() {
// ------------------OLED Display --------------------------------------
Wire.begin();
Wire.setClock(400000L);
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
oled.setFont(Callibri11);
// ---------------------------------------------------------------------
pinMode(RefLED, OUTPUT);
digitalWrite(RefLED, LOW);
pinMode(LED_PIN, OUTPUT);
oled.setCursor (0, 0);
oled.print (F("Drehscheibe_neu_2_1"));
oled.setCursor (0, 2);
oled.print (F("Referenzpunkt ? "));
oled.setCursor (0, 4);
oled.print (F("Gleis ? "));
oled.setCursor (50, 16); // 50er Einzug in Zeile 6
oled.print (F("-----"));
//----- Stepper -------------------------------------------------------------------- //
Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;
myStepper.attach( stepPin, dirPin );
myStepper.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper.setSpeed( 200 ); // 20 Umdrehungen je Minute
myStepper.setRampLen( Rampe ); // Rampenlänge 300 Steps bei 20U/min
speedIntervall.setBasetime( 100 ); // 100ms Tickerzeit
}
void loop() {
BLINKIO = myStepper.stepsToDo();
AktuellMilles = millis();
if (AktuellMilles - VorherMilles >= delayTime) {
VorherMilles = AktuellMilles;
LED = !LED;
if (BLINKIO == 0) {
LED = 0;
if (stopp < 8)
{
oled.setCursor (0, stopp); // Ausgabe Position für das Wort "Stopp" übergeben
oled.print (F(" Stopp ")); // durch Leerzeichen mittig ausgerichtet
stopp = 8;
}
}
digitalWrite(LED_PIN, LED);
}
button.processButtons(); // Taster einlesen und bearbeiten
if ( speedIntervall.tick() ) { // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
// Speed alle 100ms neu einlesen und setzen
vspeed = map((analogRead(potPin)), 0, 1023, 20, 240); // Poti mappen auf 2 ... 240 Umdr/Min
myStepper.setSpeed( vspeed ); // min speed =2 and max speed =180 rpm
}
// --------------------------- Referenzpunkt setzen ------------------------------------------------ //
if (button.pressed(Button1) ) { // Taster Links gedrückt
oled.setCursor (0, 2);
oled.print (F("< Referenzpunkt ? "));
digitalWrite(RefLED, LOW);
myStepper.doSteps( 4 ); // Stepper dreht 1x links
}
if ( button.released(Button1) ) { // Taster links losgelassen
myStepper.rotate(0); // Stepper stoppt
}
if (button.pressed(Button2) ) { // Taster Rechts gedrückt
oled.setCursor (0, 2);
oled.print (F("> Referenzpunkt ? "));
digitalWrite(RefLED, LOW);
myStepper.doSteps( -4 ); // Stepper dreht 1x rechts
}
if ( button.released(Button2) ) { // Taster Rechts losgelassen
myStepper.rotate(0); // Stepper stoppt
}
if (button.pressed(Button3) ) { // Taster Ref gedrückt
myStepper.setZero(); // Referenzpunkt gesetzt
tone(3, 440, 300); // Bestätigungston piezo an PIN3, Tonhöhe, ? - Dauer
digitalWrite(RefLED, HIGH);
oled.setCursor (0, 2);
oled.print (F("Referenzpunkt OK "));
}
// --------------------------- Bühnendrehung ------------------------------------------------ //
if ((button.pressed(Button4)) && (fahrt == 8)) { // Taster4 gedrückt:
tone(3, 150, 1000); // tone(3, 440, 300);
oled.setCursor (0, 4);
oled.print (F("> Einfahrt Gleis 1A "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( 0 ); // dreht zur Einfahrt Gleis1A zurück
// zur Startposition
}
if ((button.pressed(Button5)) && (fahrt == 8)) { // Taster5 gedrückt
tone(3, 150, 1000);
oled.setCursor (0, 4);
oled.print (F("> Ausfahrt Gleis 1B "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( 50 ); // dreht zur Ausfahrt Gleis1B - vorwärts
}
if ((button.pressed(Button6)) && (fahrt == 8)) { // Taster6 gedrückt:
tone(3, 150, 1000);
oled.setCursor (0, 4);
oled.print (F("< 180 Wendung "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( -180 ); // wendet die Bühne um 180 Grad
}
if ((button.pressed(Button7)) && (fahrt == 8)) { // Taster7 gedrückt:
tone(3, 150, 1000);
oled.setCursor (0, 4);
oled.print (F("< Lokschuppen "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( -250 ); // dreht zur Abfahrt: Lokschuppen
}
if ((button.pressed(Button8)) && (fahrt == 8)) { // Taster8 gedrückt:
tone(3, 150, 1000);
oled.setCursor (0, 4);
oled.print (F("< Ausfahrt Gleis 1B "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( -100 ); // dreht zur Ausfahrt Gleis1B - rückwärts
}
}
void disp()
{
oled.setCursor (0, (fahrt));
oled.print (F(" "));
oled.setCursor (0, (fahrt)); // Position (Zeile) für das Wort "Fahrt"
oled.print (F(" Fahrt "));
fahrt = 8;
}