/* IR blok bezet melder voor de AAMS sturing Dit is de eerste versie van deze sturing, moet nog in het AAMS programma worden gebouwd.*/ #include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h> // library voor 12c lcd display#define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd displayconst int IRblok1 = A0;const int IRblok2 = A1;const int rood = 4;const int geel = 3;const int groen = 2;int drempelWaarde1 = 750;int drempelWaarde2 = 500;int drempelWaarde3 = 250;void setup(){ lcd.begin (20,4); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home // Print a message to the LCD. lcd.setCursor(3,0); //Start at character 2 on line 0 lcd.print("Arduino UNO R3"); lcd.setCursor(6,1); lcd.print("AAMS V1.0"); pinMode(rood,OUTPUT); pinMode(geel,OUTPUT); pinMode(groen,OUTPUT); Serial.begin(9600); }void loop(){ int irblok1Waarde = analogRead(IRblok1); if (irblok1Waarde < drempelWaarde1){ digitalWrite(groen,LOW); } else { digitalWrite(groen,HIGH); } if (irblok1Waarde < drempelWaarde2){ digitalWrite(geel,LOW); } else { digitalWrite(geel,HIGH); } if (irblok1Waarde < drempelWaarde3){ digitalWrite(rood,LOW); } else { digitalWrite(rood,HIGH); } Serial.print(irblok1Waarde); lcd.setCursor(3,2); lcd.print(irblok1Waarde);}
Hoewel er in de schema's niet een directe verbinding getekend is, is deze gnd er wel in het schema aangegeven als +5v GND deze gaan naar de Arduino
de sturing voor de wissels wil ik galvanische gescheiden houden van de Arduino, de snelheids regeling van de motorschield is wel via de GND gekoppeld met de Arduino.
/*HMC pendelautomaat met een Arduino Haagse Modelbouw Club 2014 Aangepast door Paul Smits oginele versie door Alfred Hol */// Keuze in- en uitgangen Arduinoint pwmA = 10;int aIn1 = 9;int aIn2 = 8;int irSensor1 = 2; //digital in pin waarop Sensor1 wordt aangeslotenint irSensor2 = 3; //digital in pin waarop Sensor2 wordt aangesloten //digitale pin waarop Sensor2 wordt aangesloten// Beginwaarden rijrichting en snelheidint pwmAval = 0;int progStep = 1;int waitTime = 10000; // wachttijd op eindpunten in millisecondenint ASCSPD = 30; // versnellingscurve (totale tijd van versnellen in milliseconden is waarde ASCSPD x 256)int DSCSPD = 20; // vertragingscurve (totale tijd van vertragen in milliseconden is waarde DSCSPD x 256)void setup() { // Instellen in- en uitgangen Arduino pinMode(pwmA, OUTPUT); pinMode(aIn1, OUTPUT); pinMode(aIn2, OUTPUT); pinMode(irSensor1, INPUT); pinMode(irSensor2, INPUT); //analogWrite(pwmA, pwmAval); // open seriele poort tbv logging Serial.begin(9600); Serial.println("Start log:"); Serial.println("Pendelautomaat voor de Arduino"); Serial.println("Haagse Modelbouw Club 2014"); Serial.println(" ");}void loop() { //na het dooorlopen van alle acht programmastappen weer beginnen bij stap 1 if (progStep == 9) { progStep = 1; } //na het dooorlopen van alle acht programmastappen weer beginnen bij stap 1 //uitlezen sensoren Serial.print("wacht op sensor "); Serial.print("1 "); Serial.println(digitalRead(irSensor1)); Serial.print("2 "); Serial.println(digitalRead(irSensor2)); if (progStep == 2) { if (digitalRead(irSensor2) == 1) { progStep = 3; }; }; if (progStep == 6) { if (digitalRead(irSensor1) == 1) { progStep = 7; }; }; // naar specieke actie die hoort bij programmastatus while (progStep == 1) { versnellen(); } while (progStep == 3) { vertragen(); } while (progStep == 4) { wachtenompolen(); } while (progStep == 5) { versnellen(); } while (progStep == 7) { vertragen(); } while (progStep == 8) { wachtenompolen(); }}void versnellen () { Serial.print("Programmastap "); Serial.println(progStep); Serial.print(" accelereren in "); Serial.print(255*ASCSPD/1000); Serial.println( " seconden"); for(int pwmAval=60; pwmAval <= 255; pwmAval++){ analogWrite(pwmA,pwmAval); delay(ASCSPD); Serial.println(pwmAval); } Serial.println(" maximale snelheid bereikt "); Serial.println(""); progStep =progStep+ 1; Serial.print("Programmastap "); Serial.println(progStep); Serial.print(" wacht op input op sensor "); if (progStep == 2) { Serial.println("2"); }; if (progStep == 6) { Serial.println("1"); }; Serial.println("");}void vertragen () { Serial.print("Programmastap "); Serial.println(progStep); Serial.print(" afremmen in "); Serial.print(255*DSCSPD/1000); Serial.println( " seconden"); for (int pwmAval=255; pwmAval > 0; pwmAval--){ analogWrite(pwmA,pwmAval); delay(DSCSPD); Serial.println(pwmAval); } Serial.println(" trein staat stil "); Serial.println(""); progStep =progStep+ 1;}void wachtenompolen (){ Serial.print("Programmastap "); Serial.println(progStep); Serial.print(" Wachttijd tot ompolen: "); Serial.print((waitTime)/1000); Serial.println(" seconden"); delay(waitTime); if (progStep == 4) { //digitalWrite(aIn1, HIGH); //digitalWrite(aIn2, LOW); sturing(1,0,1); }; if (progStep == 8) { //digitalWrite(aIn1, LOW); //digitalWrite(aIn2, HIGH); sturing(1,0,0); }; Serial.println(" Ompolen "); Serial.println(""); progStep =progStep+ 1;}void sturing(int trein, int snelheid, int richting){ // Zet de parameters van de functie sturing(trein, snelheid, richting) // Trein 1: linksom en Trein 2 output B op het motorshield // Snelheid: 0 is stop, 255 is maximale snelheid // Richting: 0 Rechtsom, 1 Linksom 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); }*/}
Het ontwerp wat je er bij heb gemaakt werkt helaas niet
Diodes kunnen prima gebruikt worden voor de keerlus