/* Arduino analoge modelbaan sturing. Auteur : Paul Smits Versie 4.6 (is nog in testfase) Nieuwe functie sturing(trein,snelheid,richting) Vervangt de functie move(motor,speed,direction) Zijn feitelijk dezelfde functie alleen omgezet naar de modelbaansturing. Het in stappen optrekken en afremmen is er uit gehaald. De trein trekt nu langzaam op of remt nu langzaam af zonder stappen. Deze software is vrij aanpasbaar en kan door iedereen gebruikt worden, voor zijn eigen modelbaan of eigen project. LET OP !:Het gebruik van het programma geschied op eigen risico.*/#include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h> // library voor 12c lcd display/***** Global vars ***********************************************/// Define I2C Address where the PCF8574A is#define BACKLIGHT_PIN 3LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd displaychar incomingByte;/****************************************************************************** * Definitions ****************************************************************************** *motor A is aangesloten op OUT1 en OUT2 van de motorsturing *motor B is aangesloten op OUT3 en OUT4 van de motorsturing ******************************************************************************/// constants won't change. Used here to // set pin numbers:const int ledPin = 13; // Pin nummer LedPinconst int blok1Pin = 6; // Pin nummer Blok 1const int blok2Pin = 7; // Pin nummer Blok 2int Interval = 500;// Variables will change://Motor Aint PWMA = 3; //Speed control int AIN1 = 9; //Directionint AIN2 = 8; //Direction//Motor Bint PWMB = 5; //Speed controlint BIN1 = 11; //Directionint BIN2 = 12; //Directionint ledState = LOW; // ledState used to set the LEDlong previousMillis = 0; // will store last time LED was updated// the follow variables is a long because the time, measured in miliseconds,// will quickly become a bigger number than can be stored in an int.void setup(){ lcd.begin (16,2); // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home // Print a message to the LCD. lcd.setCursor(2,0); //Start at character 2 on line 0 lcd.print("Arduino Uno"); lcd.setCursor(1,1); lcd.print("L298 M-Sturing"); Serial.begin(9600); Serial.println("Arduino test programma : Motorsturingen en blok meldingen"); menu(); // Set all the pins we need to output pins // pinMode(STBY, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(10, OUTPUT); pinMode(ledPin, OUTPUT);}void loop (){ // Controlle led om te zien of het programma nog werkt. unsigned long currentMillis = millis(); if(currentMillis - previousMillis > Interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) ledState = HIGH; else ledState = LOW; // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } if (Serial.available()) { //read serial as a character //char ser = Serial.read(); if (Serial.available() > 0) { // kijk of de seriele verbinding beschikbaar is. incomingByte = Serial.read(); // Lees een 'byte'. } // Begin Taak 1: Blok1 vrij if(incomingByte == '1') { lcd.home (); lcd.setCursor(0,1); lcd.print("Blok 1: Vrijgave"); Serial.println("Blok 1 : Vrij"); digitalWrite(blok2Pin, HIGH); menu(); } // Einde Taak 1: Blok1 vrij // Begin Taak 2: Blok 1 bezet if(incomingByte == '2') { lcd.home (); lcd.setCursor(1,1); lcd.print("Blok 1: Bezet "); Serial.println("Blok 1: Bezet"); digitalWrite(blok2Pin, LOW); menu(); } // Einde Taak 2: Blok 1 Bezet // Begin Taak 3: Motor B aan if(incomingByte == '3') { lcd.home (); lcd.setCursor(0,1); lcd.print("Trein 1: Rijdt "); int value; for(value = 60 ; value <= 250; value++){ sturing(1,value,1); delay(60);} Serial.println("Trein 1: Rijdt linksom"); Serial.println("Trein 1: Rijd op maximale snelheid, totdat er een stop commando komt."); menu(); } // Einde Taak 3: Motor B on // Begin Taak 4: Motor B off if(incomingByte == '4') { lcd.home (); lcd.setCursor(0,1); lcd.print("Trein 1: Gestopt"); int value; for(value = 250 ; value >= 0; value--){ sturing(1, value, 1); delay(30); } Serial.println("Trein 1: Linksom, is gestopt"); Serial.println("Trein 1: Staat stil omdat er een stop commando gegeven is."); menu(); } // Einde Taak 4: Motor B off // Begin Taak 5 : Blok 2 On if(incomingByte =='5'){ lcd.home (); lcd.setCursor(0,1); lcd.print("Blok 2: Vrijgave"); Serial.println("Blok 2: Vrij"); digitalWrite(blok1Pin, HIGH); menu(); } // Einde Taak 5 : Blok On // Begin Taak 6: Blok 2 Off if(incomingByte == '6') { lcd.home (); lcd.setCursor(0,1); lcd.print("Blok 2: Bezet "); Serial.println("Blok 2: Bezet"); digitalWrite(blok1Pin, LOW); menu(); } // Einde Taak 6: Blok 2 bezet // Begin Taak 7: Motor A On if(incomingByte == '7') { int value; for(value = 60 ; value <= 250; value++){ sturing(1,value,0); delay(60);} Serial.println("Trein 1 : Rijdt rechtsom"); Serial.println("Trein 1 : Rijdt op maximale snelheid, totdat er een stop commando komt."); menu(); } // Einde Taak 7: Motor A on // Begin Taak 8: Motor A Off if(incomingByte == '8') { int value; for(value = 250 ; value >= 0; value--){ sturing(1, value, 0); delay(30);} Serial.println("Trein 1: Rechtom, gaat stoppen"); Serial.println("Trein 1: Is gestopt omdat er een stop commando gegeven is."); menu(); } // Einde Taak 8: Motor B off // Begin Taak 9 : Noodstop if(incomingByte == '9') { lcd.home (); lcd.setCursor(0,1); lcd.print("Noodstop trein"); Serial.println("Noodstop :Treinen A+B stop en blok 1+2 bezet"); menu(); sturing(1, 0, 0);// Trein 1 stop Serial.println("Trein 1 noodstop"); sturing(0, 0, 0);// Trein 2 stop Serial.println("Trein 2 noodstop"); digitalWrite(blok1Pin, LOW); Serial.println("Blok 1: Bezet"); digitalWrite(blok2Pin, LOW); Serial.println("Blok 2: Bezet"); // Einde Taak 9 : Noodstop } }}void sturing(int trein, int snelheid, int richting){ //Move specific motor at speed and direction //motor: 0 for B 1 for A //speed: 0 is off, and 255 is full speed //direction: 0 clockwise, 1 counter-clockwise boolean inPin1 = LOW; boolean inPin2 = HIGH; if(richting == 1){ inPin1 = HIGH; inPin2 = LOW; } else{ if(richting == 0) inPin1 = LOW; inPin2 = HIGH; } if(trein == 1){ digitalWrite(AIN1, inPin1); digitalWrite(AIN2, inPin2); analogWrite(PWMA, snelheid); } else{ digitalWrite(BIN1, inPin1); digitalWrite(BIN2, inPin2); analogWrite(PWMB, snelheid); }}void menu(){ Serial.println(); Serial.println("Stuur comando's"); Serial.println(); Serial.println("1 = Blok 1 vrijgeven 5 = Blok 2 vrijgeven"); Serial.println("2 = Blok 1 bezet melden 6 = Blok 2 bezet melden"); Serial.println("3 = Trein linksom starten 7 = Trein rechtsom starten"); Serial.println("4 = Trein linksom stoppen 8 = Trein rechtsom stoppen"); Serial.println("9 = Trein noodstop"); Serial.println(); Serial.println("Volgende comando >"); Serial.println();}
if (ledState == LOW) ledState = HIGH; else ledState = LOW;
ledState!=ledState;
Ik heb het niet op met de Arduino pro mini( ik heb daar nog geen ervaring mee, wel de specificaties bekeken), er zit daar geen usb aansluiting op zodat ik hem iedere keer uit de print moet verwijderen om het programma evt. te updaten, wil ik de pro mini gebruiken voor de sturing met de computer / of smartphone ,zal ik daar een bluetooth seriele verbinding bij moet maken, en het lukt helaas niet om met bluetooth een programma te downloaden naar de pro mini.
De delay(30) had ik er in gezet voor test doeleinden.
De terminal bediening heb ik nodig om er mee te kunnen werken.
Ik ben inderdaad nog bezig met het programma, ik heb geen Windows meer op de computer staan, ik heb tegenwoordig linux op de computer staan.
Er zal wel nog meer worden aangepast maar dat komt wel, voor nu werk het goed.