Verder gebruik ik principieel waar mogelijk Nederlandse benamingen voor variabelen en dergelijke, om te voorkomen dat ik een "keyword" van IDE of library gebruik.
Debounce van de knoppen gaat zonder library.
// - - - - - zet wissel 1 gebogen met knop if ((millis() - lastDebounceTimeGebogen_1) > debounceDelay) { // if the button state has changed: if (readingKnopG1 != knopG_1State) { knopG_1State = readingKnopG1; if (knopG_1State == LOW) { digitalWrite(relaisG_1, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_1, LOW); // relais valt af, hartstuk stroomloos wisselServos.gotoEndPos(0,0); // zet servo om } } }
knopGebogen1.update();if(knopGebogen1.fell()){ digitalWrite(relaisG_1, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_1, LOW); // relais valt af, hartstuk stroomloos wisselServos.gotoEndPos(0,0); // zet servo om}
Ik zie alleen ook hier weer veel "dubbel werk" omdat je bijvoorbeeld alles voor wissel 1 en wissel 2 los uit schrijft.
Citaat van: Cees Baarda op 24 augustus 2015, 12:21:37Debounce van de knoppen gaat zonder library.Het lijkt bijna wel of je dit met trots zegt
if(this->servoInfo[i].relaisAvailable){ //laat relais afvallen}
//time to detach else if(this->servoInfo[i].speed.intervalCount == 1) { this->servoInfo[i].speed.intervalCount--; this->servoList[i].detach(); if(this->servoInfo.relaisAvailable) { // laat het juiste relais opkomen } }
En dan heb ik de keus 1 x kopiëren en plakken met wat wijzigingen of extra code toevoegen.
Ik heb het geschreven als constatering en om aan te geven, dat er hiervoor geen library hoeft te worden bijgevoegd. Ik heb denk ik wel bewezen libraries te gebruiken.
Ik ben overigens nog niet zo ver dat ik me wil wagen aan array's om e.e.a. te vereenvoudigen. Mijn ervaring is dat dan je eigen code cryptischer wordt, waardoor zeker ik de weg dreig kwijt te raken.
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - S e r v o W i s s e l S t e l l e r Testprogramma voor het omzetten van twee modelspoorwissels m.b.v. een modelbouw servo. Te testen: - 4 losse drukknoppen voor recht en afbuigend - 2 optocoupler ingangen; funtioneel als schakelaar, bedoeld voor besturing vanuit HCC!m-systeem of Dinamo OC32 - 1 van de optocouplers moet later ook DCC kunnen verwerken Er wordt gebruik gemaakt van 2 servo's Ten behoeve van hartstukpolarisatie zijn er per servo 2 relais Werking per wissel: - na een wisselcommando vallen eerst beide relais af - daarna loopt het wissel om (servo) - dan komt het juiste relais op Bij opstarten gebeurt er niets. Het hartstuk van het wissel heeft geen spanning en de servo staat in een ongedefinieerde stand. De gebruikte Arduino is een Pro Mini, 5V met ATmega328. Gebruikte libraries en voorbeelden: - code uit het Debounce-voorbeeld bestand van Arduino.cc http://www.arduino.cc/en/Tutorial/Debounce - ServoExtend library van Timo Engelgeer - ServoControl library van Timo Engelgeer Created: 30-04-2015 By: Cees Baarda Eerste opzet met gebruikmaking van de library Servo uit de Arduino- omgeving. Modified: 15-07-2015 By: Cees Baarda Aangepast aan gebruik met de libraries van Timo Engelgeer De servo's starten nu op in de middenstand, ongeacht de stand van schakelaars. De relais blijven afgevallen tot het eerste wisselstel commando. Nadeel: Je moet het wissel 2 keer stellen als je het wissel in de stand van de schakelaar wilt hebben. Je kunt de drukknoppen en schakelaars door elkaar gebruiken. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - - - - - L i b r a r i e s i n g e b r u i k :#include <ServoExtend.h>#include <ServoControl.h>#include <Bounce2.h>//#include <Wire.h>//#include <LiquidCrystal_I2C.h>#define R 0#define G 1// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - C o n s t a n t e n :// De pinnummers en vaste waarden een naam geven#define AANTAL_POS 2 //Aantal posities per wissel// - - - - - voor wissels const byte OptoPin[] = {3, 2}; //Pin van de opto's inconst byte ServoPin[] = {9, 10};//Pin van de servo's//eindposities sevo's {R, G} (ServoEndPos[wiselnummer][R of G])const byte ServoEndPos[][AANTAL_POS] = {{10, 1002}, //wissel 1 {10, 1002}};//wissel 2// output; t.b.v. relais bij recht gelegd wisssel {R, G} (RelaisPin[wiselnummer][R of G])const byte RelaisPin[][AANTAL_POS] = {{7, 8}, //wissel 1 {11, 12}}; //wissel 2// inputs t.b.v. bediening met knoppen {R, G} (KnopPin[wiselnummer][R of G])const byte KnopPin[][AANTAL_POS] = {{6, 5}, {A2, A0}};#define AANTAL_SERVOS sizeof(ServoPin)#define AantalOptos sizeof(OptoPin)// - - - - - beide wissels met DCC, nog niet in gebruik // const int DCC_in = 2; // input; de DCC-railspanning gaat hier aan const int ServoSnelheid = 30; const int ServoStepInterval = 1; const int LedPin = A1; // LED op de print // - - - - - nog niet in gebruik, voor servo instelmodus// encoder: common moet aan GND, andere aan pin 5 en 6// const int pgmEncA = 6;// const int pgmAncB = 5;// const int pgmOK = A0; // kan losse knop of knop van de encoder zijn// - - - - - nog niet in gebruik, zijn bedoeld voor extra print aan 8 polige// connector // const int LEDarduino = 13; // LED op de arduino // const int LEDextern_1 = A2; // evt. extra LED op externe print (pin 4) // const int LEDextern_2 = A3; // evt. extra LED op externe print (pin 5) // const int externKnop_1 = A2; // evt. extra knop op externe print (pin 4) // const int externKnop_1 = A3; // evt. extra knop op externe print (pin 5) // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - G l o b a l e V a r i a b e l e n :// ServoControl wisselServos; // 1 object van het type ServoControl // - - - - - Inputs Bounce knop[AANTAL_SERVOS][2]; //Voor alle knoppen (knop[wisselnummer][R of G]) Bounce opto[AantalOptos]; //Voor alle opto's (opto[wisselnummer]) // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - prototypes// void servoInstellen(); void stelWissel(byte, byte);// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - setup, 1 x doorlopen//void setup(){ //Doe alles voor elke servo for(byte servoNr = 0; servoNr < AANTAL_SERVOS; servoNr++){ //Ga alle wissels langs //Setup voor alle knoppen for(byte posNr = 0; posNr < AANTAL_POS; posNr++){ //Ga R en G langs pinMode(KnopPin[servoNr][posNr], INPUT_PULLUP); //Zet alle knoppen als input met pullup knop[servoNr][posNr].attach(KnopPin[servoNr][posNr]); //Koppel aan Bounce object } //Setup alle opto's pinMode(OptoPin[servoNr], INPUT_PULLUP); //Zet alle opto's als input met pullup opto[servoNr].attach(OptoPin[servoNr]); //Koppel aan Bounce object //Setup voor alle relais for(byte posNr = 0; posNr < AANTAL_POS; posNr++){ pinMode(RelaisPin[servoNr][posNr], OUTPUT); digitalWrite(RelaisPin[servoNr][posNr], LOW); } //Setup voor alle servo's for(byte posNr = 0; posNr < AANTAL_POS; posNr++){ wisselServos.setEndPos(servoNr, posNr, ServoEndPos[servoNr][posNr]); //Stel beide/alle eindposities in } wisselServos.setSpeed(servoNr, ServoSnelheid, ServoStepInterval); //stel snelheid in wisselServos.init(servoNr, ServoPin[servoNr]); //Koppel aan pin enzo wisselServos.gotoPos(servoNr, 511); //Ga naar middenstand } wisselServos.update();// - - - - - testen van werking (moet later weg?)// digitalWrite(LedPin, HIGH);}// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - eindeloos doorgaanvoid loop(){ //loop alle wissels langs for(byte servoNr = 0; servoNr < AANTAL_SERVOS; servoNr++){ //----De knoppen //Loop posities langs for(byte posNr = 0; posNr < AANTAL_POS; posNr++){ knop[servoNr][posNr].update(); //Update de knop if(knop[servoNr][posNr].fell()){ //Knop is ingedrukt (gevallen) sidns vorige keer stelWissel(servoNr, posNr); //Zet wissel in bijbehorende stand } } //----De opto's opto[servoNr].update(); //update de opto if(opto[servoNr].rose()){ stelWissel(servoNr, R); //R-positie als hoog geworden } else if(opto[servoNr].fell()){ //G-positie als laag geworden stelWissel(servoNr, G); } //----De relais //Klaar met bewegen if(!wisselServos.isMoving(servoNr)){ //Vind de eindstand waar hij is for(byte posNr = 0; posNr < AANTAL_POS; posNr++){ if(wisselServos.isAtEndPos(servoNr, posNr)){ //En zet juiste relais aan digitalWrite(RelaisPin[servoNr][posNr], HIGH); } } } } wisselServos.update(); //update alle servo's }// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - Servo instelmodusvoid servoInstellen(){ }void stelWissel(byte wisselNr, byte pos){ //laat relais afvallen for(byte j = 0; j < AANTAL_POS; j++){ digitalWrite(RelaisPin[wisselNr][j], LOW); // relais valt af, hartstuk stroomloos } wisselServos.gotoEndPos(wisselNr, pos); // zet servo om}
void loop(){// - - - - - zet wissel 1 en 2 om met knoppen for (byte i = 0; i < NrButtons; i++) { buttons[i].update(); if (buttons[i].fell()) { wisselServos.gotoEndPos(i / 2,i % 2); // zet servo om } }// - - - - - zet wissel 1 en 2 om met schakelaars for (byte j = 0; j < NrSwitches; j++) { switches[j].update(); { if (switches[j].fell()) {wisselServos.gotoEndPos(j,0);} if (switches[j].rose()) wisselServos.gotoEndPos(j,1); } }wisselServos.update(); }
Enige wat ik alleen nog denk als ik de print nu zie:- De rotary lijkt me nogal dicht op de Arduino te zitten. Misschien kan deze meer naar de buitenkant?
- Weet niet wat je wilt instellen met de potmeter, maar als je het vaak wilt aanpassen is misschien versie met as makkelijk?
- Misschien dc jack naar links laten uitkomen zodat het niet in de weg zit met eventuele heat link?- Ik denk dat ik 78xx zie? Je zou kunnen overwegen deze te vervangen door DC-DC converters. Maar goed, met kleine modules zoals deze past het zelfs met dezelfde voetprint