2011
Présentez vous ! / Re : Bonjour à tous
« le: juillet 23, 2017, 05:55:02 pm »
Il n'y a pas le feu, en cette période de vacances !
Dominique
Dominique
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.
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");
}
}
}
}
}
}
}
/*
* ISR CAN
*/
void MCP2515_ISR()
{
Flag_Recv = 1;
}
/*
* Routine de récuperation des messages CAN dans la memoire circulaire _Circule
* appelee par LOOP lorsque Flag_Recv = 1;
*/
void CAN_recup()
{
unsigned char len = 0; // nombre d'octets du message
unsigned char buf[8]; // message
unsigned char Id; // Id
while (CAN_MSGAVAIL == CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
Id = CAN.getCanId();
if ((_Ncan+len+2) < sizeof(_Circule)) { // il reste de la place dans _Circule
_Circule[_indexW] = Id; // enregistrement de Id
_indexW++;
_Ncan++;
if (_indexW == sizeof(_Circule)) {_indexW = 0;}
_Circule[_indexW] = len; // enregistrement de len
_indexW++;
_Ncan++;
if (_indexW == sizeof(_Circule)) {_indexW = 0;}
for (byte z = 0; z<len; z++) {
_Circule[_indexW] = buf[z]; // enregistrement du message
_indexW++;
_Ncan++;
if (_indexW == sizeof(_Circule)) {_indexW = 0;}
}
} else {
_CANoverflow = 1; // depassement de la capacite de Circule
// message perdu (pas enregistré dans Circule)
}
}
}
/*
* traitement des messages dans le buffer _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[..]
curCLEF = Rbuf[0] & 0x3F; // garder que les bits 0..5 = index aiguille
if (RId == RId_TCO_Clef) {
// 1 octet donnees: bit 7,6 -> 1,1 et 5..0 -> 3F = envoi etats toutes clefs
if (curCLEF == 0x3F) { // commande de lecture etats
if (bitRead(Rbuf[0], 7)) {
if (bitRead(Rbuf[0], 6)) { // demande etat toutes clefs (data = 0xFF)
EnvoiCAN_toutesClefs();
}
}
}
}
if (RId == RId_TCO_Led) {
// 1 octet donnees: bit 7,6 -> 0,0 = devie ou 0,1 = droit, bits 5..0 = numero clef
if (!bitRead(Rbuf[0], 7)) { // bit 7=0, commande de positionnement de Led sur une Clef d'aiguille
if (curCLEF < MaxCLES) { // numero de clef
ListeClef[curCLEF].LedUpdate(bitRead(Rbuf[0], 6)); // bit 6 = position
//affiche_vertes(); // affichage vertes + rouges plus loin
if (_dumpCan) {
Serial.print(" CAN : curCLEF ");Serial.print(curCLEF);
Serial.print(" Aiguille "); Serial.print(ListeClef[curCLEF].NomClef());
if (bitRead(Rbuf[0], 6)) {
Serial.println(" DROIT");
} else {
Serial.println(" DEVIE");
}
}
}
}
} // fin changement leds aiguilles
} // fin traitement messages CAN (while)
Arduino sauve moi !!!
Je suis parti sur une horloge et un séquenceur et amplificateur de puissance (555 et 4017 puis 4050 et 3 régulateurs de vitesse)
en fait je ne comprends pas comment faire pour le train (et ma crèche) comment incrémenter les borne de 1 à 10 fixe (pas clair!!)
Je débute en Arduino et regardé les autres forums (malheureusement pas de train)
en gros je voudrais envoyer une commande fixe numérique sur 1 puis le 1 maintenu, le 2 puis le 2 maintenu et 3 et jusqu'à 10 voir 9 et tout remettre à zéro puis recommencer.
Certain font int pour déclarer les sorties avant void
pour le reste pas facile !!!
de l'aide Merci