1996
Vos projets / Re : Rétrosignalisation/Bus Can
« le: août 22, 2017, 10:46:01 pm »
Effectivement, le détecteur doit être hors de cause.
Le forum LOCODUINO est consacré aux discussions ayant trait à l'utilisation de l'Arduino dans les automatismes et les animations pour le train miniature. Nous avons eu récemment quelques inscriptions de personnes ayant des projets plus généraux mais surtout inapplicables au train miniature. Si votre projet ou vos questions ne concernent pas le modélisme ferroviaire, ne vous inscrivez pas, vous perdriez votre temps et nous aussi.
Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.
Comme j'utilise un Can 8Mhz cela peut il provenir de celui-ci? Un 16 Mhz serait plus rapide. A moins que dans le programme l'on puisse augmenter la vitesse...
int timer = 1000; // une seconde d'interval entre 2 sorties
int timer2 = 15000; // 15 secondes a la fin du cycle
int ledPins[] = {
2, 3, 4, 5, 6, 7, 8, 9, 10, 11
};
int pinCount = 10; // nombre de pins
void setup() {
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
pinMode(ledPins[thisPin], OUTPUT);
}
}
void loop() {
// loop from the lowest pin to the highest:
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
// turn the pin on:
digitalWrite(ledPins[thisPin], HIGH);
delay(timer);
}
delay(timer2);
// turn all the pin off:
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
digitalWrite(ledPins[thisPin], LOW);
}
}
class Aiguille
{
private:
byte index; // 0, .. MaxAIG-1
char nom; // 'A' ou 'B' ...
byte pin_sens; // sens droit (HIGH) ou devie (LOW)
byte pin_pulse; // impulsion de commande : actif LOW
bool etat; // true = droit, false = devie
bool change; // rafraichir la position en fonction de etat avec envoi CAN
bool echoCan; // rafraichir la position en fonction de etat sans envoi CAN si false
bool curstep; // true = pulse en cours, false = cycle fini
unsigned long milli; // temps systeme au debut de l'impulsion
public:
// ----------- constructeur complet ------------
Aiguille(byte a_index, char a_nom, byte a_pin_sens, byte a_pin_pulse);
void Setup();
void Armer();
void Rafraichir();
void Caner();
void Preparer(bool a_sens); // sur reception message CAN: mise en liste
void Bouger(); // execute suivant sens avec envoi CAN
void Positionner(bool a_sens); // si changement - cas recurent
void Forcer(bool a_sens); // cas setup lecture EEPROM
void MiseAJour(); // din de la periode : desarmement relais
byte NomAig();
bool EtatAig();
};
/*
* Toutes les 10 secondes : rafraichissement d'une position d'aiguille
*/
if (_Minute + 10000 < millis()) { // toutes les 10 secondes
_Minute = _Minute + 10000;
ListeAig[RafraichAiguille].Rafraichir(); // rafraichissment d'une position d'aiguille sans envoi CAN
if (_debug) {
Serial.print(" 10SEC : rafraich: ");Serial.print(RafraichAiguille);
Serial.print(ListeAig[RafraichAiguille].NomAig());
Serial.print(" ram ");Serial.println(_RamFree());
}
RafraichAiguille++;
if (RafraichAiguille > MaxAIG-1) RafraichAiguille = 0; // pas de rafraichisement des Deteleurs, evidemment !
}
/*
* Récupération d'un seul message par loop dans la memoire circulaire _Circule
*/
while (_Ncan > 2) { // messages dans _Circule : au moins 3 bytes
//digitalWrite(LedV, HIGH); // led activité CAN reste allumée jusqu'à loop suivante
_Ncan--;
RId = _Circule[_indexR]; // recup Id
_indexR++;
if (_indexR == sizeof(_Circule)) {_indexR = 0;}
_Ncan--;
Rlen = _Circule[_indexR]; // recup longueur
_indexR++;
if (_indexR == sizeof(_Circule)) {_indexR = 0;}
if (_dumpCan) {
Serial.print("CAN id ");
Serial.print(RId);
Serial.print(", data ");
}
for (int k = 0; k < Rlen; k++) {
_Ncan--;
Rbuf[k] = _Circule[_indexR]; // recup octets message
_indexR++;
if (_indexR == sizeof(_Circule)) {_indexR = 0;}
if (_dumpCan) {
Serial.print("0x");
Serial.println(Rbuf[k], HEX);
}
} // le message est dans les globales RId, Rlen et Rbuf[..]
curAIG = Rbuf[0] & 0x3F; // garder que les bits 0..5 = index aiguille
/*
* commandes aiguilles CAN sur ID 0x40
*/
if (RId == RId_AIGUILLE) {
// commandes relatives aux aiguilles
// 1 octet donnees: bit 7,6 -> 1,0 = devie ou 1,1 = droit, bits 5..0 = numero aiguille
if (bitRead(Rbuf[0], 7)) { // commande de changement d'aiguille
if (curAIG < MaxAIG) { // aiguille
if (bitRead(Rbuf[0], 6) != ListeAig[curAIG].EtatAig()) {
ListeAig[curAIG].Positionner(bitRead(Rbuf[0], 6)); // bit 6 = position
BougeAIG[curAIG] = true;
if (_debug) {
Serial.print(" CAN : curAIG ");Serial.print(curAIG);
Serial.print(" Aiguille "); Serial.print(ListeAig[curAIG].NomAig());
if (bitRead(Rbuf[0], 6)) {
Serial.println(" DROIT");
} else {
Serial.println(" DEVIE");
}
}
}
}
}
}
}