Ik heb wat gesurft om het een en het ander uit te zoeken over verschillende mosfet 's , er zijn mij twee types opgevallen die mij geschikt lijken (IRF 720 en IRF 820) de max stroom continu van de IRF 720 is 3.3 A en van de IRF 820 2.5 A, deze mosfet's lijken mij geschikt voor mijn wissels.
Ik heb deze printjes juist ruimer gemaakt, dat maak het solderen van de printjes een stuk makkelijker, ook als er een onderdeel kapot gaat is het makkelijk te vervangen.Het lijkt tegenwoordig mode te zijn om de printen zo compact mogelijk te ontwerpen.
Ik ga thuis niet zitten kliederen met chemische stoffen om printjes te maken, de printjes in China laten maken is een stuk goedkoper( ik hoef geen aparte kamer met exotische apparaten, lichtbak, etsbak, spoelbak enz., te kopen) en een stuk schoner.
Sorry, maar ik begrijp de code niet helemaal
const byte turnouts[] = {30, 31, 32, 33, 34, enz };void setTurnout(byte turnout, byte state){ digitalWrite(turnouts[turnout], state);}
Het is mij ook niet helemaal duidelijk hoe ik een libray met een klasse moet maken, heb je misschien een klein voorbeeld voor mij, om het wat begrijpelijker te maken.
Ik maak soms gebruik van bestaande code en pas die aan aan mijn eigen eisen, op deze manier heb ik de basisopzet van de modelbaan sturing ontworpen.
alleen wissels worden wat lastiger, daar zou een aparte Arduino voor nodig zijn.
Wat wil ik per blok sturen allereerst de rijrichting en snelheid, blok vrij/bezet melding, blokseinen, wissel (max 2 wissels parallel), verlichting (extra), ga uitzoeken of dat mogelijk is om met 1 Arduino te sturen.
voor de kleinere blokken ga ik een Arduino Nano met shield gebruiken
De rgb driver is een onafhankelijk systeem en word niet gekoppeld aan de Arduino blok sturing.
De communicatie tussen de Arduino's is een andere uitdaging om te ontwerpen, er zijn namelijk meerdere opties, I2C -bus, RS485 -bus, de rx/tx -bus functie op de Arduino.
De indeling van de Arduino, zoals ik in gedachte heb.
/* Arduino analoge modelbaan stuuring. Auteur : Paul Smits Versie 1.0 (is nog in testfase) Nieuwe functie sturing(trein,snelheid,richting) Vervangt de functie move(motor,speed,direction) Zijn feitelijk dezelfde funcie 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 3 LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd display char incomingByte;/****************************************************************************** * Definitions ****************************************************************************** *motor A is aangesloten op OUT1 en OUT2 van de motorsturing *motor B is aangesloten op OUT3 en OUT4 van de motorsturing ******************************************************************************/ // Set pin numbers als constanten, deze waardes zullen niet veranderen. const int seinR1 = 2; // sein 1 Rood = stop blok 1 const int seinG1 = 3; // sein 1 Groen = vrijgave blok 1 const int seinG2 = 5; // sein 2 Rood = stop blok 2 const int seinR2 = 4; // sein 2 Groen = vrijgave blok 2 const int wisselR = 6; // Wissel stand Rechtdoor const int wisselA = 7; // Wissel stand Afbuigend const int AIN1 = 8; // Richting Rechtom const int AIN2 = 9; // Richting Linksom const int PWMA = 10; // Snelheids regeling trein const int blok1 = 11; // Blok 1 const int blok2 = 12; // Blok 2 const int ledPin = 13; // Controlle of het programma nog loopt. // Analoge porten toewijzen. const int ldrBlok1 = A0; // Detectie Blok1 const int ldrBlok1s = A1; // Detectie Blok1 sectie 1 const int ldrBlok2 = A2; // Detectie Blok 2 const int ldrBlok2s = A3; // Detectie Blok 2 sectie 1 int ledState = LOW; int seinR1State = LOW; int seinG1State = HIGH; int seinR2State = LOW; int seinG2State = HIGH; int blok1State = HIGH; int blok2State = HIGH; int wisselRState = HIGH; int wisselAState = HIGH; int Interval = 500; // Tijd vertraging van 0.5 seconden // Drempelwaarde van de LDR-sensors moeten induvueel ingesteld worden. int Drempelwaarde = 300; int Drempelwaarde1 = 150; int Drempelwaarde2 = 300; int Drempelwaarde3 = 150; long previousMillis = 0; void setup() { pinMode(seinR1,OUTPUT); pinMode(seinG1,OUTPUT); pinMode(seinR2,OUTPUT); pinMode(seinG2,OUTPUT); pinMode(blok1,OUTPUT); pinMode(blok2,OUTPUT); pinMode(wisselR,OUTPUT); pinMode(wisselA,OUTPUT); pinMode(PWMA,OUTPUT); pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(ledPin,OUTPUT); // Beginstand porten defineren digitalWrite(seinR1,HIGH); digitalWrite(seinG2,HIGH); digitalWrite(seinG1,LOW); digitalWrite(seinR2,LOW); digitalWrite(wisselR,HIGH); digitalWrite(wisselA,HIGH); digitalWrite(blok1,HIGH); digitalWrite(blok2,HIGH); lcd.begin (16,2); // Zet de backlight aan. 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 Nano"); lcd.setCursor(1,1); lcd.print("AAMS V1.0"); Serial.begin(9600); Wire.begin(); Serial.println("Arduino Nano test programma : Motorsturing, bloksturing, seinsturing"); } 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: ledState = !ledState; // set the LED with the ledState of the variable: digitalWrite(ledPin,ledState); } if (Serial.available() > 0) { // kijk of de seriele verbinding beschikbaar is. incomingByte = Serial.read(); // Lees een 'byte'. } if(incomingByte == '1') { Wire.beginTransmission(5); Wire.write('H'); Wire.endTransmission(); int ldrBlok1Waarde = analogRead(ldrBlok1); int ldrBlok1sWaarde = analogRead(ldrBlok1s); int ldrBlok2Waarde = analogRead(ldrBlok2); int ldrBlok2sWaarde = analogRead(ldrBlok2s); digitalWrite(blok2, LOW); Serial.println("Blok 2 : Vrij"); if (ldrBlok1Waarde < Drempelwaarde){ digitalWrite(seinR1,LOW); digitalWrite(seinG1,HIGH); digitalWrite(seinR2,HIGH); digitalWrite(seinG2,LOW); sturing(1,150,1); } if (ldrBlok2Waarde < Drempelwaarde){ digitalWrite(seinR1,HIGH); digitalWrite(seinG1,LOW); digitalWrite(seinR2,LOW); digitalWrite(seinG2,HIGH); sturing(1,125,1); } } if(incomingByte == '2') { int ldrBlok1Waarde = analogRead(ldrBlok1); int ldrBlok1sWaarde = analogRead(ldrBlok1s); int ldrBlok2Waarde = analogRead(ldrBlok2); int ldrBlok2sWaarde = analogRead(ldrBlok2s); digitalWrite(blok2, LOW); if (ldrBlok1Waarde < Drempelwaarde){ blok(1,1); sturing(1,150,1); } if (ldrBlok2Waarde < Drempelwaarde){ blok(0,1); sturing(1,125,1); } } if(incomingByte == '0') { Wire.beginTransmission(5); Wire.write('L'); Wire.endTransmission(); sturing(1,0,1); digitalWrite(blok2, HIGH); digitalWrite(seinR1,LOW); digitalWrite(seinG1,HIGH); digitalWrite(seinR2,HIGH); digitalWrite(seinG2,LOW); } } // einde loopvoid 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); // }} void blok(int sein, int blokState){ boolean sPin1 = LOW; boolean sPin2 = HIGH; boolean bPin1 = LOW; boolean bPin2 = HIGH; if (sein == 1){ digitalWrite(seinR1,sPin1); digitalWrite(seinG1,sPin2); digitalWrite(seinR2,sPin2); digitalWrite(seinG2,sPin1); } //else{ //digitalWrite(seinR1,sPin2); //digitalWrite(seinG1,sPin1); //digitalWrite(seinR2,sPin2); //digitalWrite(seinG2,sPin1); //} if (sein == 0){ digitalWrite(seinR1,sPin2); digitalWrite(seinG1,sPin1); digitalWrite(seinR2,sPin2); digitalWrite(seinG2,sPin1); } //else{ //digitalWrite(seinR1,sPin1); //digitalWrite(seinG1,sPin2); //digitalWrite(seinR2,sPin2); //digitalWrite(seinG2,sPin1); // } if (blokState == 1){ digitalWrite(blok1,bPin2); digitalWrite(blok2,bPin1); Serial.println("Blok 1: vrij --> Blok 2 bezet"); } //else { //digitalWrite(blok1,bPin1); //digitalWrite(blok2,bPin2); // Serial.println("Blok 1: bezet --> Blok 2: vrij"); //} if (blokState == 0){ digitalWrite(blok1,bPin1); digitalWrite(blok2,bPin2); Serial.println("Blok 1: bezet --> Blok 2: vrij"); } //else { //digitalWrite(blok1,bPin1); //digitalWrite(blok2,bPin2); // Serial.println("Blok 1: bezet --> Blok 2: vrij"); //} }
const int DitIsDusEenConst;int ditIsGeenConst;
unsigned long currentMillis = millis(); if(currentMillis - previousMillis > Interval) {
if(millis() - previousMillis > Interval) {
/* AamBlok.h v1 - Library to iets Created by Timo Engelgeer (Septillion), February 2, 2015*/#ifndef AamBlok_h#define AamBlok_h#include "Arduino.h"#define AAM_GROEN 1#define AAM_ROOD 0class AamBlok{ public: AamBlok(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel); void bezet(); void vrij(); void sein(byte state); bool checkBezet(); bool isBezet(); void checkStop(); void update(); protected: bool bezetState; byte pinBlok; byte pinSein; byte pinLdr; byte pinLdrS; int drempel; };#endif
/* AamBlok.h v1 - Library to iets Created by Timo Engelgeer (Septillion), February 2, 2015*//* Blaa, dit doet iets :p */#include "Arduino.h"#include "AamBlok.h"AamBlok::AamBlok(byte pinBlok, byte pinSein, byte pinLdr, byte pinLdrS, int ldrDrempel){ this->pinBlok = pinBlok; this->pinSein = pinSein; this->pinLdr = pinLdr; this->pinLdrS = pinLdrS; this->drempel = drempel; pinMode(this->pinBlok, OUTPUT); pinMode(this->pinSein, OUTPUT); pinMode(this->pinLdr, INPUT); pinMode(this->pinLdrS, INPUT); digitalWrite(this->pinBlok, HIGH); digitalWrite(this->pinSein, HIGH);}//maak blok bezetvoid AamBlok::bezet(){ this->bezetState = true;}//maak blok vrijvoid AamBlok::vrij(){ this->bezetState = false;}//zet sein op rood of groen.void AamBlok::sein(byte state){ digitalWrite(pinSein, state);}//Check of LDR een trein ziet en pas bezet aan. return bezet.bool AamBlok::checkBezet(){ if(analogRead(this->pinLdr) < this->drempel){ this->bezetState = true; } else{ this->bezetState = false; } return this->bezetState;}//return is blok is bezetbool AamBlok::isBezet(){ return this->bezetState;}void AamBlok::checkStop(){ if(analogRead(this->pinLdrS) < this->drempel && digitalRead(this->pinSein) == AAM_ROOD){ digitalWrite(this->pinBlok, LOW); }}void AamBlok::update(){ this->checkBezet(); this->checkStop();}
#include <AamBlok.h>//AamBlok(pinBlok, pinSein, pinLdr, pinLdrS, drempelwaarde)AamBlok blok1 = AamBlok(0, 1, A0, A1, 300);AamBlok blok2 = AamBlok(2, 3, A2, A3, 300);void setup(){ }void loop(){ blok1.sein(AAM_ROOD);}
#include <AamBlok.h>//AamBlok(pinBlok, pinSein, pinLdr, pinLdrS, drempelwaarde)AamBlok blokken[] = {AamBlok(0, 1, A0, A1, 300), AamBlok(2, 3, A2, A3, 300)};#define NR_BLOKKEN sizeof(blokken)/sizeof(blokken[0]) //Geeft aantal blokkenvoid setup(){ }void loop(){ blokken[1].sein(AAM_ROOD); //Zet sein tweede blok op rood blokken[0].sein(!blokken[1].isBezet()); //Maakt sein van 1e blok rood als 2e blok bezet is. //alle blokken langs lopen for(byte i = 0; i < NR_BLOKKEN; i++){ blokken[i].update(); }}