als extra kun je er bv wissels mee schakelen, daar wil ik een aparte sturing voor maken.
De twee seinen heb ik bewust als 4 aparte sturingen uitgevoerd zodat ik de seinen apart kan bedienen of via het blok sturen.
Wat wel van belang is dat ikzelf de richting van de trein kan kiezen, hiervoor gebruik ik dus de case functie case'<' ,case'>'Het is de bedoeling dat ik, voor ik de trein een vertrek comando geeft, ik eerst de richting moet aangeven.
//I2C Master Code(Arduino Nano)#include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h> // library voor 12c lcd display#define BACKLIGHT_PIN 3LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // adressering lcd displayconst byte SlavePin1 = 2;const byte SlavePin2 = 3;const byte SlavePin3 = 4;const byte SlavePin4 = 5;const byte MasterSendPin = 6;const byte MasterRecivePin = 7;const byte ControllePin = 13;int Interval = 500; // Tijdvertraging ter controlle of het programma nog loopt.boolean LedState = LOW;unsigned long LedMillis = 0; // slaat de laatste stand van de LED op.char I2CByte; // Slaat een waarde op in I2CBytevoid setup(){ lcd.begin(20, 4); // Stelt de lcd driver in op 20 characters en vier regels. // set de backlight van het lcd display aan. lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // Ga naar de boventse regel en het eerste character. pinMode(SlavePin1, OUTPUT); pinMode(SlavePin2, OUTPUT); pinMode(SlavePin3, OUTPUT); pinMode(SlavePin4, OUTPUT); pinMode(MasterSendPin, OUTPUT); pinMode(MasterRecivePin, OUTPUT); pinMode(ControllePin, OUTPUT); Serial.begin(9600); Serial.println("Arduino test programma : I2C communicatie"); lcd.home (); lcd.setCursor(0, 1); lcd.println("Arduino Bloksturing"); Wire.begin(); delay(1000);}void loop(){ // Controlle led om te zien of het programma nog werkt. unsigned long currentMillis = millis(); if (currentMillis - LedMillis > Interval) { // Sla de laatste stand van de Led waneer die nog knipperde LedMillis = currentMillis; // Als de Led uit is zet de Led aan en vice-versa: if (LedState == LOW) LedState = HIGH; else LedState = LOW; digitalWrite(ControllePin, LedState); // Afhankelijk van de ledState is de Led aan of uit. } if (Serial.available() > 0) { // Kijk of de seriele verbinding beschikbaar is. int I2CByte = Serial.read(); // Lees een 'byte'. switch (I2CByte) { case'A': // Blok 1 Vrij Wire.beginTransmission(2); Wire.write('A'); // Stuur een A naar slave 2, Blok1, HIGH Serial.println("Stuur een A naar de Slave 2"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; case'a': // Blok 1 Bezet Wire.beginTransmission(2); Wire.write('a'); // Stuur een a naar slave 2, Blok1,LOW Serial.println("Stuur een a naar de Slave 2"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); break; case'B': // Blok 2 Vrij Wire.beginTransmission(2); Wire.write('B'); // Stuur een B naar slave 2, Blok2, HIGH Serial.println("Stuur een B naar de Slave 2"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; case'b': // Blok 2 Bezet Wire.beginTransmission(2); Wire.write('b'); // Stuur een b naar slave 2, Blok2,LOW Serial.println("Stuur een b naar de Slave 2"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; case'C': // Blok 3 Vrij Wire.beginTransmission(3); Wire.write('C'); // Stuur een C naar slave 3, Blok3,HIGH Serial.println("Stuur een C naar de Slave 3"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; case'c': // Blok 3 Bezet Wire.beginTransmission(3); Wire.write('c'); // Stuur een c naar slave 3, Blok3,LOW Serial.println("Stuur een c naar de Slave 3"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; case'D': // Blok 4 Vrij Wire.beginTransmission(3); Wire.write('D'); // Stuur een D naar slave 3, Blok4,HIGH Serial.println("Stuur een D naar de Slave 3"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; case'd': // Blok 4 Bezet Wire.beginTransmission(3); Wire.write('d'); // Stuur een d naar slave 3, Blok4,LOW Serial.println("Stuur een d naar de Slave 3"); digitalWrite(MasterSendPin, HIGH); Wire.endTransmission(); delay(20); Printmenu(); break; } }}void Printmenu() { Serial.println(); Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen")); Serial.println(); Serial.println(F("Stuur comando's")); Serial.println(); Serial.println(F("A = Blok 1 vrijgeven a = Blok 1 bezet melden")); Serial.println(F("B = Blok 2 vrijgeven b = Blok 2 bezet melden")); Serial.println(F("C = Blok 3 vrijgeven c = Blok 3 bezet melden")); Serial.println(F("D = Blok 4 vrijgeven d = Blok 4 bezet melden")); Serial.println(F("< = Trein linksom > = Trein rechtsom")); Serial.println(F("1 = Trein 1 starten 0 = Trein 1 stoppen")); Serial.println(F("| = Wissel 1 rechtdoor / = Wissel 1 Afbuigend")); Serial.println(); Serial.println(F("9 = Noodstop")); Serial.println();}
//i2c Slave Code(NANO slave 2)#include <Wire.h>//char I2CByte; // Slaat een waarde op in incomingByte/****************************************************************************** * Definities ****************************************************************************** * Blok A en C is aangesloten op OUT1 en OUT2 van de motorsturing * Blok B en D is aangesloten op OUT3 en OUT4 van de motorsturing ******************************************************************************/// constants zullen niet veranderen.// Geef de output pinnen een naam.const byte LedPin = 13; // Pin nummer LedPinconst byte blok1Pin = 8; // Pin nummer Blok 1const byte blok2Pin = 12; // Pin nummer Blok 2const byte sein1rPin = 4; // sein 2 Roodconst byte sein1gPin = 5; // sein 2 Groenconst byte sein2rPin = 2; // sein 1 roodconst byte sein2gPin = 3; // sein 1 Groenconst byte wissel1rPin = 6; // Wissel 1 Rechtdoorconst byte wissel1aPin = 7; // Wissel 1 Afbuigendint Interval = 500; // Tijdvertraging ter controlle of het programma nog loopt.//Trein 1const byte PinPwmA = 9; // Snelheids regeling trein 1const byte PinAin1 = 10; // Rechtsom trein 1const byte PinAin2 = 11; // Linksom trein 1boolean Cw = false; // clockwiseboolean Ccw = false; // counter clockwiseboolean ledState = LOW;unsigned long ledMillis = 0; // slaat de laatste stand van de LED op.void setup(){ Wire.begin(2); // Stelt de comminicatie met de master in. Wire.onReceive(receiveBlok1); Wire.onReceive(receiveBlok2); Wire.onReceive(receiveWissel1r); Wire.onReceive(receiveWissel1a); Wire.onReceive(receiveVooruit); Wire.onReceive(receiveAchteruit); Wire.onReceive(receiveOptrekken); Wire.onReceive(receiveAfremmen); }void loop(){ // Controlle led om te zien of het programma nog werkt. unsigned long currentMillis = millis(); if (currentMillis - ledMillis > Interval) { // Sla de laatste stand van de Led waneer die nog knipperde ledMillis = currentMillis; // Als de Led uit is zet de Led aan en vice-versa: if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(LedPin, ledState); // Afhankelijk van de ledState is de Led aan of uit. }}void receiveBlok1(int howMany){ while (Wire.available()) { char I2CByte = Wire.read(); if (I2CByte == 'A') { baanvak(1, 0); } else if ( I2CByte == 'a') { baanvak(1, 1); } }}void receiveBlok2(int howMany) { while (Wire.available()) { char I2CByte = Wire.read(); if (I2CByte == 'B') { baanvak(2, 0); } else if ( I2CByte == 'b') { baanvak(2, 1); } }}void receiveWissel1r(int howMany) { }void receiveWissel1a(int HowMany) { }void receiveVooruit(int HowMany) { }void receiveAchteruit(int howMany) { }void receiveOptrekken(int howMany) { }void receiveAfremmen(int howMany) { }void locomotief(int loc, int snelheid, int richting) { // Zet de parameters van de functie locomotief (loc, snelheid, richting) // Loc: 1 output A op het motorshield // Snelheid: 0 is stop, 250 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 (loc == 1) { digitalWrite(PinAin1, inPin1); digitalWrite(PinAin2, inPin2); analogWrite(PinPwmA, snelheid); }}void baanvak(int blok, int status) { // Zet de parameters van de functie baanvak (blok, status) // Blok: 1 waarde blok kan van 1 tot zoveel blokken nodig zijn worden gebruikt. // Voor elk blok moet een routine schrijven. // Status: 0 vrij, 1 bezet. if (blok == 1) { if (status == 1) { digitalWrite(blok1Pin, LOW); digitalWrite(sein1rPin, LOW); digitalWrite(sein1gPin, HIGH); } } if (blok == 1) { if (status == 0) { digitalWrite(blok1Pin, HIGH); digitalWrite(sein1rPin, HIGH); digitalWrite(sein1gPin, LOW); } } if (blok == 2) { if (status == 1) { digitalWrite(blok2Pin, LOW); digitalWrite(sein2rPin, LOW); digitalWrite(sein2gPin, HIGH); } } if (blok == 2) { if (status == 0) { digitalWrite(blok2Pin, HIGH); digitalWrite(sein2rPin, HIGH); digitalWrite(sein2gPin, LOW); } } if (blok == 0) { if (status == 1) { digitalWrite(blok2Pin, LOW); digitalWrite(blok1Pin, LOW); digitalWrite(sein1rPin, LOW); digitalWrite(sein2rPin, LOW); digitalWrite(sein1gPin, HIGH); digitalWrite(sein2gPin, HIGH); } } if (blok == 0) { if (status == 0) { digitalWrite(blok2Pin, HIGH); digitalWrite(blok1Pin, HIGH); digitalWrite(sein1rPin, LOW); digitalWrite(sein2rPin, LOW); digitalWrite(sein1gPin, HIGH); digitalWrite(sein2gPin, HIGH); } }}void wissel(int wnummer, int wrichting) { // Zet de parameters van de functie wissel (wnummer, wrichting) // wnummer : 1, deze waarde bevat het nummer van de wissel // wrichting : 0, deze waarde geeft de richting van de wissel, 1 rechtdoor, 0 afbuigend // Let op !, deze parameters moetten voor elke wissel worden ingesteld, de wissels worden in paar gesteld. // De wissels kunnen ook per wissel gesteld worden, de programeercode hoeft daar niet voor aangepast worden. if (wnummer == 1) { } if (wrichting == 0) { digitalWrite(wissel1rPin, HIGH); delay(500); digitalWrite(wissel1rPin, LOW); } if (wnummer == 1) { } if (wrichting == 1) { digitalWrite(wissel1aPin, HIGH); delay(500); digitalWrite(wissel1aPin, LOW); }}
// I2C Mastercode (NANO)#include<Wire.h>void setup(){ Serial.begin(9600); //Serial.println("Arduino i2c sturing tussen twee of meer arduino's"); Wire.begin(); //Printmenu();}void loop(){ if (Serial.available()); { char c = Serial.read(); if (c == 'A') { Wire.beginTransmission(5); // Adres eerste slave unit Wire.write('A'); Wire.endTransmission(); Serial.println("Blok 1 Vrij geven."); Printmenu(); } if (c == 'a') { Wire.beginTransmission(5); Wire.write('a'); Wire.endTransmission(); Serial.println("Blok 1 Bezet melden."); } if (c == 'B') { Wire.beginTransmission(5); Wire.write('B'); Wire.endTransmission(); Serial.println("Blok 2 Vrij geven."); } if (c == 'b') { Wire.beginTransmission(5); Wire.write('b'); Wire.endTransmission(); Serial.println("Blok 2 Bezet melden."); } if (c == '|') { Wire.beginTransmission(5); Wire.write('|'); Wire.endTransmission(); Serial.println("Wissel 1 Rechtdoor."); } if (c == '/') { Wire.beginTransmission(5); Wire.write('/'); Wire.endTransmission(); Serial.println("Wissel 1 Afbuigend"); } if (c == 'C') { Wire.beginTransmission(6); // Adres tweede slave unit. Wire.write('C'); Wire.endTransmission(); Serial.println("Blok 3 Vrij geven."); } if (c == 'c') { Wire.beginTransmission(6); Wire.write('c'); Wire.endTransmission(); Serial.println("Blok 3 Bezet melden."); } if (c == 'D') { Wire.beginTransmission(6); Wire.write('D'); Wire.endTransmission(); Serial.println("Blok 4 Vrij geven."); } if (c == 'd') { Wire.beginTransmission(6); Wire.write('d'); Wire.endTransmission(); Serial.println("Blok 4 Bezet melden."); } }}void Printmenu() { Serial.println(); Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen")); Serial.println(); Serial.println(F("Stuur comando's")); Serial.println(); Serial.println(F("A = Blok 1 vrijgeven a = Blok 1 bezet melden")); Serial.println(F("B = Blok 2 vrijgeven b = Blok 2 bezet melden")); Serial.println(F("C = Blok 3 vrijgeven c = Blok 3 bezet melden")); Serial.println(F("D = Blok 4 vrijgeven d = Blok 4 bezet melden")); Serial.println(F("< = Trein linksom > = Trein rechtsom")); Serial.println(F("1 = Trein 1 starten 0 = Trein 1 stoppen")); Serial.println(F("| = Wissel 1 rechtdoor / = Wissel 1 Afbuigend")); Serial.println(); Serial.println(F("9 = Noodstop")); Serial.println();}
// I2C Slave code (NANO)#include <Wire.h>void setup(){ Wire.begin(5); Wire.onReceive(receiveEvent); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, LOW);}void loop(){}void receiveEvent(int howMany){ while (Wire.available()) { char c = Wire.read(); if (c == 'A') { digitalWrite(8, HIGH); // BloK 1 Vrij geven. } if (c == 'a') { digitalWrite(8, LOW); // Blok 1 Bezet melden. } if (c == 'B') { digitalWrite(12, HIGH); // Blok 2 Vrij geven. } if (c == 'b') { digitalWrite(12, LOW); // Blok 2 bezet melden. } if (c == '|') { // Wissel 1 Rechtdoor. digitalWrite(6, HIGH); delay(750); // bekrachtigings- tijd wisselspoel. digitalWrite(6, LOW); } if (c == '/') { // Wissel 1 Afbuigend. digitalWrite(7, HIGH); delay(750); // bekrachtigings- tijd wisselspoel. digitalWrite(7, LOW); } }}
Nu je een display aan de module hangt is dat wel wat lastiger. Of krijgt niet elke module een display? Staat me iets van bij dat je graag had dat je één Adruino tussen PC en rest wilde die ook als interface zou dienen. Dan kan het wel makkelijk. Maar dan zou ik nu al beginnen met de boel op te splitsen. Hoe meer je er nu bij maakt hoe lastiger...
Gelijk ook terug komende op je foto's, hoe stuur je nu de wissels? Via de relais? En zie ik dat goed, schakel je de relais gelijk door de Arduino? Zo ja, welke relais zijn het? (Zoveel vermogen kan de Arduino niet leveren op een pin.) En ik lijk geen back EMF diodes te zien...
//I2C Master Code(Arduino Nano)#include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h> // library voor 12c lcd display#define BACKLIGHT_PIN 3LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // adressering lcd displayconst byte SlavePin1 = 2;const byte SlavePin2 = 3;const byte SlavePin3 = 4;const byte SlavePin4 = 5;const byte MasterSendPin = 6;const byte MasterRecivePin = 7;const byte ControllePin = 13;char Slave;char I2CByte; // Slaat een waarde op in I2CBytevoid setup(){ lcd.begin(20, 4); // Stelt de lcd driver in op 20 characters en vier regels. // set de backlight van het lcd display aan. lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // Ga naar de boventse regel en het eerste character. pinMode(SlavePin1, OUTPUT); pinMode(SlavePin2, OUTPUT); pinMode(SlavePin3, OUTPUT); pinMode(SlavePin4, OUTPUT); pinMode(MasterSendPin, OUTPUT); pinMode(MasterRecivePin, OUTPUT); pinMode(ControllePin, OUTPUT); Serial.begin(9600); Printmenu(); Wire.begin(); lcd.home (); lcd.setCursor(0, 1); lcd.println("Arduino Bloksturing");}void loop(){ Wire.requestFrom(5, 1); // request //Wire.requestFrom(6, 1); if (Wire.available()) { // slave may send less than requested char Slave = Wire.read(); // receive a byte as character if (Slave == 5) { digitalWrite(SlavePin1, HIGH); digitalWrite(MasterSendPin, HIGH); } else { digitalWrite(SlavePin1, LOW); digitalWrite(MasterSendPin, HIGH); } //if (Slave == '6') //{ // digitalWrite(SlavePin2, HIGH); // digitalWrite(MasterSendPin, HIGH); //} //else //{ //digitalWrite(SlavePin2, LOW); //digitalWrite(MasterSendPin, HIGH); //} } if (Serial.available()) { // Kijk of de seriele verbinding beschikbaar is. char I2CByte = Serial.read(); // Lees een 'byte'. switch (I2CByte) { case'A': // Blok 1 Vrij Wire.beginTransmission(5); Wire.write('A'); // Stuur een A naar slave 2, Blok1, HIGH Wire.endTransmission(); Serial.println("Blok 1 Vrij"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin1, LOW); Printmenu(); break; case'a': // Blok 1 Bezet Wire.beginTransmission(5); Wire.write('a'); // Stuur een a naar slave 2, Blok1,LOW Wire.endTransmission(); Serial.println("Blok 1 Bezet"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin1, LOW); Printmenu(); break; case'B': // Blok 2 Vrij Wire.beginTransmission(5); Wire.write('B'); // Stuur een B naar slave 2, Blok2, HIGH Wire.endTransmission(); Serial.println("Blok 2 Vrij"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin1, LOW); Printmenu(); break; case'b': // Blok 2 Bezet Wire.beginTransmission(5); Wire.write('b'); // Stuur een b naar slave 2, Blok2,LOW Wire.endTransmission(); Serial.println("Blok 2 Bezet"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin1, LOW); Printmenu(); break; case'C': // Blok 3 Vrij Wire.beginTransmission(6); Wire.write('C'); // Stuur een C naar slave 3, Blok3,HIGH Wire.endTransmission(); Serial.println("Blok 3 Vrij"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin2, LOW); Printmenu(); break; case'c': // Blok 3 Bezet Wire.beginTransmission(6); Wire.write('c'); // Stuur een c naar slave 3, Blok3,LOW Wire.endTransmission(); Serial.println("Blok 3 Bezet"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin2, LOW); Printmenu(); break; case'D': // Blok 4 Vrij Wire.beginTransmission(6); Wire.write('D'); // Stuur een D naar slave 3, Blok4,HIGH Wire.endTransmission(); Serial.println("Blok 4 vrij"); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin2, LOW); Printmenu(); break; case'd': // Blok 4 Bezet Wire.beginTransmission(6); Wire.write('d'); // Stuur een d naar slave 3, Blok4,LOW Wire.endTransmission(); Serial.println("Blok 4 Bezet."); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin2, LOW); Printmenu(); break; case'|': // wissel 1 rechtdoor Wire.beginTransmission(5); Wire.write('|'); Wire.endTransmission(); Serial.println("Wissel 1 Rechtdoor."); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin1, LOW); Printmenu(); break; case'/': // wissel 1 afbuigend Wire.beginTransmission(5); Wire.write('/'); Wire.endTransmission(); Serial.println("Wissel 1 Afbuigend."); digitalWrite(MasterSendPin, LOW); digitalWrite(SlavePin1, LOW); Printmenu(); break; } }}void Printmenu() { Serial.println(); Serial.println(F("Arduino analoge modelbaan sturing: Motorsturingen en blok meldingen")); Serial.println(); Serial.println(F("Stuur comando's")); Serial.println(); Serial.println(F("A = Blok 1 vrijgeven a = Blok 1 bezet melden")); Serial.println(F("B = Blok 2 vrijgeven b = Blok 2 bezet melden")); Serial.println(F("C = Blok 3 vrijgeven c = Blok 3 bezet melden")); Serial.println(F("D = Blok 4 vrijgeven d = Blok 4 bezet melden")); Serial.println(F("< = Trein linksom > = Trein rechtsom")); Serial.println(F("1 = Trein 1 starten 0 = Trein 1 stoppen")); Serial.println(F("| = Wissel 1 rechtdoor / = Wissel 1 Afbuigend")); Serial.println(); Serial.println(F("9 = Noodstop")); Serial.println();}
// I2C Slave code (NANO)#include <Wire.h>char I2CByte;const byte Blok1Pin = 8; // Blok 1const byte Blok2Pin = 12; // Blok 2const byte Sein1rPin = 4; // Sein 1 roodconst byte Sein1gPin = 5; // Sein 1 groenconst byte Sein2rPin = 2; // Sein 2 roodconst byte Sein2gPin = 3; // Sein 2 groenconst byte Wissel1rPin = 6; // Wissel 1 rechtdoorconst byte Wissel1aPin = 7; // Wissel 1 afbuigendconst byte PinPwm = 9; // Snelheids regeling pwmconst byte PinIn1 = 10; // Trein cwconst byte PinIn2 = 11; // Trein ccwboolean Cw = false;boolean Ccw = false;void setup(){ pinMode(Wissel1rPin, OUTPUT); pinMode(Wissel1aPin, OUTPUT); pinMode(Blok1Pin, OUTPUT); pinMode(Blok2Pin, OUTPUT); pinMode(Sein1rPin, OUTPUT); pinMode(Sein1gPin, OUTPUT); pinMode(Sein2rPin, OUTPUT); pinMode(Sein2gPin, OUTPUT); pinMode(PinPwm, OUTPUT); pinMode(PinIn1, OUTPUT); pinMode(PinIn2, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, LOW); Wire.begin(5); // Stelt de communicatie met de master in. Wire.onReceive(receiveEvent); // Iets ontvangen van de Master. Wire.onRequest(requestEvent); // Stuur een 5 naar de Master.}void loop(){}void receiveEvent(int howMany){ while (Wire.available()) { char I2CByte = Wire.read(); if (I2CByte == 'A') { digitalWrite(Blok1Pin, HIGH); // BloK 1 Vrij geven. } if (I2CByte == 'a') { digitalWrite(Blok1Pin, LOW); // Blok 1 Bezet melden. } if (I2CByte == 'B') { digitalWrite(Blok2Pin, HIGH); // Blok 2 Vrij geven. } if (I2CByte == 'b') { digitalWrite(Blok2Pin, LOW); // Blok 2 bezet melden. } if (I2CByte == '|') { // Wissel 1 Rechtdoor. digitalWrite(Wissel1rPin, HIGH); delay(750); // bekrachtigings tijd wisselspoel. digitalWrite(Wissel1rPin, LOW); } if (I2CByte == '/') { // Wissel 1 Afbuigend. digitalWrite(Wissel1aPin, HIGH); delay(750); // bekrachtigings tijd wisselspoel. digitalWrite(Wissel1aPin, LOW); } }}void requestEvent() { Wire.write(5); // Stuur een 5 naar de Master.}
Ik heb gisteravond de raw code gepost, ik was nog bezig om de goede code met goede variable namen te maken, om snel test code te programmeren gebruik ik geen variable namen, ik hoef dan ook op dat moment niet aan variable namen te denken.
De slave hoeft geen ander adres te krijgen, eenmaal geprogrammeerd, zal het adres van de slave niet meer veranderen, het kan dat het programma in de slave nog wat aangepast word maar geenszins het adres.
#include <EEPROM.h>byte moduleAdres = 2; //Dit adres zal worden opgeslagen in EEPROM als dit de eerste keer programmeren is of als je FORCEER_NIEUW_ADRES defined (adres 255 niet teogestaan)//#define FORCEER_NIEUW_ADRES //Uncomment als je de module geforceerd een nieuw adres wilt geven.const byte AdresEE = 0; //Adres van het eeprom waar het module adres staat opgeslagenvoid setup(){ #ifdef FORCEER_NIEUW_ADRES //We passen adres aan. Alleen als deze niet al juist is. if(EEPROM.read(AdresEE) != moduleAdres){ EEPROM.write(AdresEE, moduleAdres); } #else //Is adres niet ingesteld? Nooit ingesteld heeft een waarde van 255 ofwel 0xFF if(EEPROM.read(AdresEE) == 0xFF){ EEPROM.write(AdresEE, moduleAdres); } else{ moduleAdres = EEPROM.read(AdresEE); //haal adres uit EEPROM } #endif }void loop(){ //gebruik hier het moduleAdres}
Misschien een uitleg van het Millis commando in het Nederlands)
unsigned long vorigeMillis = 0; //Wanneer is de laatste keer dat we iets gedaan hebben?const unsigned int Interval = 60 * 1000; //Om de hoeveel tijd (met welk interval) willen we de taak doen?void loop(){ //We kijken hoe laat het is, //we halen hier vanaf hoe laat het de vorige keer was //en kijken of dit al langer dan interval geleden is if(millis() - vorigeMillis >= interval){ //sla de tijd van nu op als laatste keer dat we iets gedaan hebben vorigeMillis = millis(); //doe hier wat je eens per minuut wilde doen }}
#include <Bounce2.h>unsigned long ledjeAanMillis = 0; //De tijd dat we het ledje aan gezet hebbenconst unsigned long LedjeAanTijd = 10 * 60 * 1000; //Voor 10 minuten aanconst byte LedjePin = 13; //Pin waar het ledje aan hangtconst byte KnopjePin = 9; //Pin waar het knopje aan hangt (naar GND)Bounce knopje; //Het object (door de library) van het knopjevoid setup(){ pinMode(LedjePin, OUTPUT); //We willen het ledje laten branden dus een output knopje.attach(LedjePin, INPUT_PULLUP); //Geven aan aan welke pi het knopje zit en dat voor deze pin de pull up aan moet}void loop(){ ledjeUpdate(); //Controleren of we het ledje aan of uit moeten zetten /* En hier kan nog veel meer gebeuren interessanteFunctie(); nogIets(); ditKanOokwelGebeuren(true); enz */}void ledjeUpdate(){ //Beginnen we met kijken of het knopje is ingedrukt want ja, dan moet het ledje aan knopje.update(); //Lees het knopje //Is het knopje ingedrukt? if(knopje.fell()){ digitalWrite(LedjePin, HIGH); //zet het ledje aan ledjeAanMillis = millis(); //sla op wanneer je it gedaan hebt } //nu we dat gedaan hebben, is het misschien tijd om het ledje uit te zetten? Moet hij wel aan staan natuurlijk! //Staat ledje aan? (Ja, je kan gewoon een digitalRead op een output doen, geen probleem :) ) if(digitalRead(LedjePin)){ //Ledje is dus aan, maar moet hij al uit? if(millis() - ledjeAanMillis >= LedjeAanTijd){ digitalWrite(LedPin, LOW); } }}
@Reinout,Ik weet niet wat je probeert te doen met servo's maar die kan je standaard (out of the box) al gewoon aansturen. Tenzij je een goede reden hebt lijkt mij micro() niet nodig...
Of zie ik iets enorm over het hoofd?
Stel nu dat we in code iedere minuut iets willen doen. Dan wordt dat ik code: Code: [Selecteer]unsigned long vorigeMillis = 0; //Wanneer is de laatste keer dat we iets gedaan hebben?const unsigned int Interval = 1000; //Om de hoeveel tijd (met welk interval) willen we de taak doen?
unsigned long vorigeMillis = 0; //Wanneer is de laatste keer dat we iets gedaan hebben?const unsigned int Interval = 1000; //Om de hoeveel tijd (met welk interval) willen we de taak doen?
Of begrijp ik het verkeerd.
Maar ik ga er wel van uit dat de servo library dan zelf degene is die elke 20ms de laatste actuele waarde doorgeeft.
Als ik maar één maal per 20ms één waarde aan de servo zou geven zou dat dus soepeler gaan?
// I2C AAMS Blokkaart code (NANO)#include <Wire.h>char I2CByte;const byte Blok1Pin = 8; // Blok 1const byte Blok2Pin = 12; // Blok 2const byte Sein1rPin = 4; // Sein 1 roodconst byte Sein1gPin = 5; // Sein 1 groenconst byte Sein2rPin = 2; // Sein 2 roodconst byte Sein2gPin = 3; // Sein 2 groenconst byte Wissel1rPin = 6; // Wissel 1 rechtdoorconst byte Wissel1aPin = 7; // Wissel 1 afbuigendconst byte PinPwm = 9; // Snelheids regeling pwmconst byte PinIn1 = 10; // Trein cwconst byte PinIn2 = 11; // Trein ccwboolean CwRichting = 0;boolean CcwRichting = 1;void setup(){ pinMode(Wissel1rPin, OUTPUT); pinMode(Wissel1aPin, OUTPUT); pinMode(Blok1Pin, OUTPUT); pinMode(Blok2Pin, OUTPUT); pinMode(Sein1rPin, OUTPUT); pinMode(Sein1gPin, OUTPUT); pinMode(Sein2rPin, OUTPUT); pinMode(Sein2gPin, OUTPUT); pinMode(PinPwm, OUTPUT); pinMode(PinIn1, OUTPUT); pinMode(PinIn2, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, LOW); Wire.begin(5); // Stelt de communicatie met de master in. Wire.onReceive(receiveEvent); // Iets ontvangen van de Master. // <<<<<<<<< Wire.onRequest(requestEvent); // Stuur een 5 naar de Master. setBaanvakStatus(0,1);}void loop(){ // De loop word niet gebruikt, in plaats daarvan word een Event gebruikt.}void receiveEvent(int howMany){ while (Wire.available()) { char I2CByte = Wire.read(); if (I2CByte == 'A') { setBaanvakStatus(1, 0); // BloK 1 Vrij geven. } if (I2CByte == 'a') { setBaanvakStatus(1, 1); // Blok 1 Bezet melden. } if (I2CByte == 'B') { setBaanvakStatus(2, 0); // Blok 2 Vrij geven. } if (I2CByte == 'b') { setBaanvakStatus(2, 1); // Blok 2 bezet melden. } if (I2CByte == '|') { setWissel(1, 0); // Wissel 1 Rechtdoor. } if (I2CByte == '/') { setWissel(1, 1); // Wissel 1 Afbuigend. } // snelheds regeling voor de baanspanning Pwm if (I2CByte == '0') { if (CwRichting == 0) { for (int t = 200; t >= 10; t--) { delay(600); setLocSpeed(1, t, CwRichting); } } if (CwRichting == 1) { for (int t = 200; t >= 10; t--) { delay(600); setLocSpeed(1, t, !CwRichting); } } } if (I2CByte == '1') { if (CwRichting == 0) { for (int t = 10; t <= 200; t++) { delay(750); setLocSpeed(1, t, CwRichting); } } if (CwRichting == 1) { for (int t = 10; t <= 200; t++) { delay(750); setLocSpeed(1, t, !CwRichting); } } } }} void requestEvent() { Wire.write(5); // Stuur een 5 naar de Master. } void setLocSpeed(byte loc, byte Snelheid, bool Richting) { boolean inPin1 = LOW; boolean inPin2 = HIGH; if (Richting == 1) { inPin1 = LOW; inPin2 = HIGH; } else { if (Richting == 0) { inPin1 = HIGH; inPin2 = LOW; } } if (loc == 1) { digitalWrite(PinIn1, inPin1); digitalWrite(PinIn2, inPin2); analogWrite(PinPwm, Snelheid); } } // Einde functie setLocSpeed void setBaanvakStatus(byte Blok, bool Status) { if (Blok == 1) { if (Status == 1) { digitalWrite(Blok1Pin, LOW); // Blok 1 Bezet. // Zet de seinen goed digitalWrite(Sein1rPin, HIGH); digitalWrite(Sein1gPin, LOW); } } if (Blok == 1) { if (Status == 0) { digitalWrite(Blok1Pin, HIGH); // Blok 1 Vrij. // Zet de seinen goed digitalWrite(Sein1rPin, LOW); digitalWrite(Sein1gPin, HIGH); } } if (Blok == 2) { if (Status == 1) { digitalWrite(Blok2Pin, LOW); // Blok 2 Bezet. // Zet de seinen goed digitalWrite(Sein2rPin, HIGH); digitalWrite(Sein2gPin, LOW); } } if (Blok == 2) { if (Status == 0) { digitalWrite(Blok2Pin, HIGH); // Blok 2 Vrij. // Zet de seinen goed digitalWrite(Sein2rPin, LOW); digitalWrite(Sein2gPin, HIGH); } } if (Blok == 0) { if (Status == 1) { digitalWrite(Blok1Pin, LOW); digitalWrite(Blok2Pin, LOW); // Zet de seinen goed digitalWrite(Sein1rPin, LOW); digitalWrite(Sein1gPin, HIGH); digitalWrite(Sein2rPin, LOW); digitalWrite(Sein2gPin, HIGH); } } if (Blok == 0) { if (Status == 0) { digitalWrite(Blok1Pin, HIGH); digitalWrite(Blok2Pin, HIGH); // Zet de seinen goed digitalWrite(Sein1rPin, LOW); digitalWrite(Sein1gPin, HIGH); digitalWrite(Sein2rPin, LOW); digitalWrite(Sein2gPin, HIGH); } } } // einde functie setBaanvakStatus void setWissel(byte Wnummer, bool Wrichting) { if (Wnummer == 1) { if (Wrichting == 0) { digitalWrite(Wissel1rPin, HIGH); delay(750); // Normaal staat de waarde op 500) digitalWrite(Wissel1rPin, LOW); } } if (Wnummer == 1) { if (Wrichting == 1) { digitalWrite(Wissel1aPin, HIGH); delay(750); // Normaal staat de waarde op 500) digitalWrite(Wissel1aPin, LOW); } } } // einde functie setWissel
En nu we het over pin namen hebben, wat is de taak van SlavePinx ?
Ik snap dat een slave tijdens normaal gebruik geen ander adres hoeft te krijgen. Maar wat als je later (als je al 10+ slave modules hebt) opeens toch nog een aanpassing maakt aan de software? Ga je dan:
Wire.begin(5); // Stelt de communicatie met de AAMS centrale in. Wire.onReceive(receiveEvent); // Iets ontvangen van de AAMS centrale. Wire.onRequest(requestEvent); // Stuur een Adres(5) naar de AAMS centrale en maak dat zichtbaar door een LED.
void requestEvent() { Wire.write(5); // Stuur een adres(5) naar de AAMS centrale. }
setBaanvakStatus(0,0);}void loop(){}void receiveEvent(int howMany){
Voor het serial data tussen PC en master gedoe (en dit kan je dan eigenlijk ook gebruiken op de slaves...)