De ingangsstroom kan je dan met gemak kleiner dan 10mA laten zijn terwijl de uitgang met gemak 50mA schakelt.
De 1N4148 is namelijk een high speed diode en kan dus sneller ingrijpen bij een piekspanning door de spoel.
Met een relais kost het veel minder poorten...
#include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h>/***** 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 ******************************************************************************/const char StringMotorA[] = "motor A: "; const char StringMotorB[] = "motor B: ";const char StringFull[] = "full";const char StringHalf[] = "half";const char StringLow[] = "low";const char StringSpeed[] = " speed";// 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;//int wachtTrein = 3000;//int BlokVrij = 10000; //automatische mode 10 seconden voor het blok vrij gegeven word.int tijd = 2000;// 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 LEDint wachtState = LOW;int blokState = LOW;long previousMillis = 0; // will store last time LED was updated//long previousMillisWacht = 0; //long previousMillisBlok = 0;// 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.//long interval = 500; // interval at which to blink (milliseconds)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(); prompt(); } // Einde Taak 1: Blok1 vrij // Begin Taak 2: Blok 1 bezet if(incomingByte == '2') { lcd.print("Blok 1: vrijgave"); Serial.println("Blok 1 : Bezet"); digitalWrite(blok2Pin, LOW); menu(); prompt(); } // Einde Taak 2: Blok 1 Bezet // Begin Taak 3: Motor B aan if(incomingByte == '3') { lcd.home (); lcd.setCursor(1,1); lcd.print(" Speed low "); Serial.println("Trein B: Low speed"); move(1, 120, 1); //motor B, low speed, links schakeltijd(); lcd.home (); lcd.setCursor(1,1); lcd.print(" Speed half "); Serial.println("Trein B: Half speed"); move(1, 150, 1); //motor B, half speed, links schakeltijd(); lcd.home (); lcd.setCursor(1,1); lcd.print(" Speed full "); Serial.println("Trein B: Full speed"); move(1, 200, 1); //motor B, full speed, left Serial.println("Trein B rijd op full speed totdat er een stop comando komt."); menu(); prompt(); } // Einde Taak 3: Motor B on // Begin Taak 4: Motor B off if(incomingByte == '4') { Serial.println("Trein B: Half speed"); displ(); lcd.print(" Speed half "); move(1, 150, 1); //motor B, half speed, links schakeltijd(); Serial.println("Trein B: Low speed"); displ(); lcd.print(" Speed low "); move(1, 120, 1); //motor B, low speed, links schakeltijd(); Serial.println("Trein B: Stop"); move(1, 0, 0); //motor B, stop Serial.println("Motor B staat stil omdat er een stop comando gegeven is."); displ(); lcd.print(" trein stopt "); schakeltijd(); lcd.print(" Arduino trein "); menu(); prompt(); } // Einde Taak 4: Motor B off // Begin Taak 5 : Blok 2 On if(incomingByte =='5'){ Serial.println("Blok 2 Vrij"); digitalWrite(blok1Pin, HIGH); menu(); prompt(); } // Einde Taak 5 : Blok On // Begin Taak 6: Blok 2 Off if(incomingByte == '6') { Serial.println("Blok 2 Bezet"); digitalWrite(blok1Pin, LOW); menu(); prompt(); } // Einde Taak 6: Blok 2 bezet // Begin Taak 7: Motor A On if(incomingByte == '7') { Serial.println("Trein A gaat vertrekken"); Serial.println(); Serial.println("Trein A: Low speed"); lcd.print(" Speed low "); move(0, 120, 1); //motor A, low speed, rechts schakeltijd(); Serial.println("Trein A: Half speed"); lcd.print(" Speed half "); move(0, 150, 1); //motor A, half speed, rechts schakeltijd(); Serial.println("Trein A: Full speed"); lcd.print(" Speed full "); move(0, 200, 1); //motor A, full speed, rechts Serial.println("Trein A rijd op full speed totdat er een stop comando komt."); menu(); prompt(); } // Einde Taak 7: Motor A on // Begin Taak 8: Motor A Off if(incomingByte == '8') { Serial.println("Trein gaat stoppen"); Serial.println("Trein A: Half speed"); lcd.print(" Speed half "); move(0, 170, 1); //motor A, half speed, rechts schakeltijd(); Serial.println("Trein A: Low speed"); lcd.print(" Speed low "); move(0, 120, 1); //motor A, low speed, rechts schakeltijd(); Serial.println("Trein A: Stop"); Serial.println("Trein A is gestopt omdat er een stop comando gegeven is."); move(0, 0, 0); //motor A, stop menu(); prompt(); } // Einde Taak 8: Motor B off // Begin Taak 9 : Noodstop if(incomingByte == '9') { Serial.println("Noodstop :Treinen A+B stop en blok 1+2 bezet"); menu(); noodstop(); prompt(); Serial.println("Trein 1 noodstop"); Serial.println("Trein 2 noodstop"); digitalWrite(blok1Pin, LOW); Serial.println("Blok 1: Bezet"); digitalWrite(blok2Pin, LOW); Serial.println("Blok 2: Bezet"); displ(); lcd.print("Noodstop gemaakt"); // Einde Taak 9 : Noodstop } }}void move(int motor, int speed, int direction){ //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(direction == 1){ inPin1 = HIGH; inPin2 = LOW; } else{ if(direction == 0) inPin1 = LOW; inPin2 = HIGH; } if(motor == 1){ digitalWrite(AIN1, inPin1); digitalWrite(AIN2, inPin2); analogWrite(PWMA, speed); } else{ digitalWrite(BIN1, inPin1); digitalWrite(BIN2, inPin2); analogWrite(PWMB, speed); }}void noodstop(){ //Motor A en B stoppen move(1, 0, 0);// motor A stop move(0, 0, 0);// motor B stop }void displ(){ lcd.home (); // go home lcd.setCursor(1,1); }void schakeltijd(){ delay(tijd);}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 = Motor A starten 7 = Motor B starten"); Serial.println("4 = Motor A stoppen 8 = Motor B stoppen"); Serial.println("< = Motor linksom > = Motor rechtsom"); Serial.println(); Serial.println("9 = Motoren A en B stoppen en blok 1 en 2 bezet melden"); Serial.println();}void prompt(){ Serial.println(); Serial.println("Volgende comando >"); Serial.println();}