if(train == 0){ int value; for(value = 0 ; value <= 250; value++){ digitalWrite(this-> pinAin1, inPin1); digitalWrite(this-> pinAin2, inPin2); analogWrite(this-> pinPwmA, value); } }
if(train == 0){ int value; for(value = 0 ; value <= 250; value++){ digitalWrite(this-> pinAin1, inPin1); digitalWrite(this-> pinAin2, inPin2); analogWrite(this-> pinPwmA, value); delay(60); } }
/* AamsTrein.cpp v1 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS. Writen by Paul Smits/* Deze library is, voor het sturen van de verschillende treinen. */#include "AamsTrein.h"AamsTrein::AamsTrein(byte pinPwmA, byte pinAin1, byte pinAin2, byte pinPwmB, byte pinBin1, byte pinBin2){ this-> pinPwmA = pinPwmA; // Arduino pin 3~ this-> pinAin1 = pinAin1; // Arduino pin 2 this-> pinAin2 = pinAin2; // Arduino pin 4 this-> pinPwmB = pinPwmB; // Arduino pin 6~ this-> pinBin1 = pinBin1; // Arduino pin 5 this-> pinBin2 = pinBin2; // Arduino pin 7 pinMode(this-> pinPwmA, OUTPUT); pinMode(this-> pinAin1, OUTPUT); pinMode(this-> pinAin2, OUTPUT); pinMode(this-> pinPwmB, OUTPUT); pinMode(this-> pinBin1, OUTPUT); pinMode(this-> pinBin2, OUTPUT); }void AamsTrein::start(byte train, byte direction){ bool inPin1 = LOW; bool inPin2 = HIGH; if(train == 0) { digitalWrite(this-> pinAin1, inPin1); digitalWrite(this-> pinAin2, inPin2); analogWrite(this-> pinPwmA, 120); delay(25); } else if(train == 1) { digitalWrite(this-> pinBin1, inPin1); digitalWrite(this-> pinBin2, inPin2); analogWrite(this-> pinPwmB, 120); delay(25); } if(direction == 0) { inPin1 = HIGH; inPin2 = LOW; } else if(direction == 1) { inPin1 = LOW; inPin2 = HIGH; }}void AamsTrein::stop(byte train){ if(train == 0) { analogWrite(this-> pinPwmA, 0); } else if(train == 1) { analogWrite(this-> pinPwmB, 0); }}void AamsTrein::vertrek(byte train, byte direction){ bool inPin1 = LOW; bool inPin2 = HIGH; if(direction == 0) { inPin1 = HIGH; inPin2 = LOW; } else if(direction == 1) { inPin1 = LOW; inPin2 = HIGH; } if(train == 0){ int value; for(value = 0 ; value <= 250; value++){ digitalWrite(this-> pinAin1, inPin1); digitalWrite(this-> pinAin2, inPin2); analogWrite(this-> pinPwmA, value); delay(60); } } else if(train == 1){ int value; for(value = 0 ; value <= 250; value++){ digitalWrite(this-> pinBin1, inPin1); digitalWrite(this-> pinBin2, inPin2); analogWrite(this-> pinPwmB, value); delay(60); } }}void AamsTrein::remmen(byte train, byte direction){ bool inPin1 = LOW; bool inPin2 = HIGH; int value; if(direction == 0) { inPin1 = HIGH; inPin2 = LOW; } else if(direction == 1) { inPin1 = LOW; inPin2 = HIGH; } if(train == 0){ for(value = 250 ; value >= 0; value--){ digitalWrite(this-> pinAin1, inPin1); digitalWrite(this-> pinAin2, inPin2); analogWrite(this-> pinPwmA, value); delay(25); } } else if(train == 1){ for(value = 250 ; value >= 0; value--){ digitalWrite(this-> pinBin1, inPin1); digitalWrite(this-> pinBin2, inPin2); analogWrite(this-> pinPwmB, value); delay(25); } }}void AamsTrein::snelheid(byte speed) { //Er word nog aan functie snelheid gewerkt! (deze functie is bedoeld voor Handbediening) }void AamsTrein::richting(byte direction) { // Er word nog aan functie richting gewerkt! (deze functie is bedoeld voor Handbediening) }void AamsTrein::on(byte train) { // Er word nog aan functie on gewerkt! (deze functie is bedoeld voor Handbediening) }void AamsTrein::noodstop(int speed) { // Er word nog aan functie noodstop gewerkt! if (speed == 0){ analogWrite(this-> pinPwmA, 0); analogWrite(this-> pinPwmB, 0); }}
Het gebruik van de functie delay is ten zeerste af te raden. In het voorbeeld (voor het op tellen) werd een delay van 60ms gebruikt in een loop van 250. Dit is 15 seconden. Ik weet dat het een voorbeeld is, maar al breng je het terug naar 1 seconde (per blok), dan is het nog lang.
Als ik het verkeerd denk hoor ik dat graag.
/* AamsTrein.cpp v2 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS. Writen by Paul Smits Edit by Timo Engelgeer ;)*//* Deze library stuurt de motordriver L298 voor de Arduino Analoge Modelbaan sturing. */#ifndef AamsTrein_h#define AamsTrein_h#include "Arduino.h"class AamsTrein { public: AamsTrein(byte pinPwm, byte pinIn1, byte pinIn2); void snelheid(int speed); int getSnelheid(); void update(); void setVertraging(unsigned int vertraging); unsigned int getVertraging(); void noodstop(); void start(byte direction); void stop(); protected: void setSnelheid(int speed); int setSpeed; //Snelheid die we willen gaan rijden int curSpeed; //Snelheid waarop de PWM werkelijk is ingesteld. unsigned int vertraging; unsigned long millisLast; byte pinPwm; byte pinIn1; byte pinIn2; };#endif
/* AamsTrein.cpp v2 - Library voor Arduino Analoge Modelbaan Sturing of kortweg AAMS. Writen by Paul Smits Edit by Timo Engelgeer ;)/* Deze library is, voor het sturen van de verschillende treinen. */#include "AamsTrein.h"AamsTrein::AamsTrein(byte pinPwm, byte pinIn1, byte pinIn2){ //Save the pins to use this->pinPwm = pinPwm; this->pinIn1 = pinIn1; this->pinIn2 = pinIn2; //Make them output pinMode(this->pinPwm, OUTPUT); pinMode(this->pinIn1, OUTPUT); pinMode(this->pinIn2, OUTPUT); vertraging = 0; //Standaard geen vertraging }void AamsTrein::snelheid(int speed){ //Snelheid begrenzen tot max 255 in beide richtingen if(speed > 255){ speed = 255; } else if(speed < -255){ speed = -255; } setSpeed = speed; if(vertraging == 0){ this->setSnelheid(setSpeed); }}//Geeft de ingestelde snelheidint AamsTrein::getSnelheid(){ return this->setSpeed;}//Protected functie, niet van buiten de classe te benaderen.//Stelt werkelijk de hardware in op de juiste snelheidvoid AamsTrein::setSnelheid(int speed){ if(curSpeed != speed){ curSpeed = speed; if(speed < 0){ digitalWrite(this->pinIn1, HIGH); digitalWrite(this->pinIn2, LOW); analogWrite(this-> pinPwm, -speed); } else{ digitalWrite(this->pinIn1, LOW); digitalWrite(this->pinIn2, HIGH); analogWrite(this-> pinPwm, speed); } }}//Checkt of de snelheid aangepast moet worden (optrekken/afremmen) en doet dit//Aanroepen in de loopvoid AamsTrein::update(){ //Kijken of het tijd is om een update te doen if(millis() - this->millisLast > this->vertraging) { this->millisLast = millis(); //opslaan dat we nu een update doen if(setSpeed > curSpeed){ //moeten dus sneller this->setSnelheid(curSpeed + 1); } else if(setSpeed < curSpeed){ //moeten langzamer this->setSnelheid(curSpeed - 1); } }}//Stelt de vertraging tussen het aanpassen van de snelheid in (in ms)void AamsTrein::setVertraging(unsigned int vertraging){ this->vertraging = vertraging;}//Geeft de ingestelde vertragingunsigned int AamsTrein::getVertraging(){ return this->vertraging;}//Triggert de noodstopvoid AamsTrein::noodstop(){ //Door beide in-pinnen laag te maken en de PWM pin hoog is er een "Fast Motor Stop" digitalWrite(this->pinIn1, LOW); digitalWrite(this->pinIn2, LOW); digitalWrite(this->pinPwm, HIGH); //En even de snelheden updaten setSpeed = 0; curSpeed = 0;}// Volgende functies erin gehouden omdat deze er waren//Gewoon starten met snelheid 120 met mogelijkheid om richting op te geven//Houdt rekening met de ingestelde vertragingvoid AamsTrein::start(byte direction){ if(direction){ this->snelheid(120); } else{ this->snelheid(-120); }}//Stop de treinen//Houdt rekening met ingestelde vertragingvoid AamsTrein::stop(){ this->snelheid(0);}
#include <AamsTrein.h>#define AANTAL_BLOKKEN 2AamsTrein treinen[AANTAL_BLOKKEN] = { {3, 2, 4}, //Eerste motordriver {6, 5, 7} //Tweede motordriver};void setup() { //Geef de eerste driver een 60ms vertraging tussen iedere snelheidsstap treinen[0].setVertraging(60); //Geeft tweede motordriver dezelfde vertraging als de eerste treinen[1].setVertraging( treinen[0].getVertraging() );}void loop() { //Dit blok moet altijd in je loop staan (=vaak aangeroepen worden) //om te zorgen dat de blokken de juiste snelheid hebben //Gebruik GEEN delay in de loop, dit zal de optrek/afrem vertraging in de war schoppen for (byte i = 0; i < AANTAL_BLOKKEN; i++) { treinen[i].update(); } //trek op naar "-200" (achteruit dus) treinen[0].snelheid(-200); }
#define AANTAL_BLOKKEN 2
#define AANTAL_TREINEN 2
Als ik dat met de ascii code's moet doen ben ik snel door mijn ascii codes heen.
int speed; speed = 0x80; //Plaats linker deel erin speed <<= 8; //Schuif erin (naar links) speed &= 0x54; //Voer rest toe
//Zijn maar random voorbeeld getallen/adressen#define AANTAL_TREINEN 2#define AANTAL_WISSELS 4const byte TreinAdres 0;const byte WisselAdres 8;void loop() { if(bytesIn[0] == "T"){ //begint het met een T? if(bytesIn[1] >= TreinAdres && bytesIn[1] < (TreinAdres + AANTAL_TREINEN){ //Dit adres zit op deze Arduino //Selecteer juiste trein //Maak van de twee bytes een int //Zet snelheid treinen[bytesIn[1] - TreinAdres].snelheid( byteToInt(bytesIn[2], bytesIn[3]) ); } } else if(bytesIn[0] == "w" || bytesIn[0] == "W"){ //begint het met een w of W? if(bytesIn[1] >= WisselAdres && bytesIn[1] < (WisselAdres + AANTAL_WISSELS){ if(bytesIn[0] == "W"){ wissels[bytesIn[1] - WisselAdres].rechtdoor(); } else{ wissels[bytesIn[1] - WisselAdres].afbuigen(); } } }}int byteToInt(byte msb, byte lsb){ int out; out = 0x80; //Plaats linker deel erin out <<= 8; //Schuif erin (naar links) out &= 0x54; //Voer rest toe return out;}
(Sorry, kon het niet laten een voorbeeldje te schrijven. Zeg maar als je het vervelend vindt.)