Bonjour à tous,
Cela fait longtemps que je ne suis pas venu sur cette page ; je suis confus...
Je vais donc essayer de répondre à tous;
jeanmi67 : merci pour tes expérimentations. Donc il existe une bibliothèque pour les ATtiny. Peux-tu nous dire où la télécharger ?
DDEFF : effectivement, l'ATtiny demande déjà de bien maitriser différentes notions comme les registres, le type de mémoire, etc. C'est la raison pour laquelle j'ai supprimé ces petites bêtes de la colonne débutant du site LOCODUINO. Je pensais qu'un débutant arriverait à programmer ces puces en suivant mes procédures, mais dès qu'il y a le moindre problème, le pauvre se retrouve confronté à lui-même et s'il ne maitrise pas bien les bases, cela peut vite le faire patauger.
CATPLUS : effectivement, il manque une ou deux lignes dans le programme de la fiche pratique du LR mai 2017. J'en suis désolé et c'est de ma faute ; au départ, elles y étaient mais on m'a demandé de refaire la figure en haute définition et cela a fait sauté deux lignes de programme sans que je m'en aperçoive. J'ai immédiatement publié un correctif sur le site de Loco-Revue, sur le fil concernant ce numéro de mai 2017. D'ailleurs, lorsque je publie dans Loco-Revue, je complète éventuellement sur le forum de Loco-Revue, ne serait-ce que pour mettre un programme téléchargeable. Pensez a y faire un tour au cas où...
On peut paramétrer la durée du feu orange, mais pour ma part, je préfère mesurer la durée du feu rouge et l'affecter à la durée du feu orange. Ainsi, si on admet que les cantons ont la même longueur et que le train garde sa vitesse, chaque canton est parcouru dans le même temps ce qui donne des durées identiques pour rouge et orange.
La programmation d'ATtiny peut se faire grâce à de nombreux petits montages du commerce qu'on insère directement dans la sortie USB de l'ordinateur ou bien en bricolant soi-même un tel montage. Pour ma part, j'utilise une breadboard et six câbles pour raccorder à l'UNO. Mais c'est moins pratique.
Bon voici le programme de la fiche pratique de LR 838 de mai 2017 (Celui-ci est
valide pour un ATtiny45/85 et fonctionne aussi pour un UNO avec des sorties différentes de celles employées dans la fiche pratique) :
/**********************************
* Signal_BAL_ATtiny - 30/11/2016 *
* ********************************
* Ce programme simule le fonctionnement d un signal lumineux a trois
* feux d un B.A.L Block Automatique Lumineux. Il n assure pas
* l espacement des trains. Lorsque la loco declenche le premier ILS,
* le signal se met au rouge. Lorsque la loco declenche le deuxieme
* ILS, le signal se met a l orange pour une duree egale a celle du
* rouge, puis repasse au vert.
*/
/* VARIABLES
* --------------------------------------------------------------
* debRouge : temps de debut du feu rouge
* finRouge : temps de fin du feu rouge
* dureeRouge ; duree du feu rouge
* debOrange : temps de debut du feu orange
* flagOrange : booleen 0 si feu orange eteint, 1 si allume
*/
/* BRANCHEMENTS
* --------------------------------------------------------------
* ILS E (entree) sur 3
* ILS S (sortie) sur 4
* feu vert sur 0
* feu rouge sur 1
* feu orange sur 2
*/
const byte ILS_entree = 3;
const byte ILS_sortie = 4;
const byte feu_vert = 0;
const byte feu_rouge = 1;
const byte feu_orange = 2;
unsigned long debRouge = 0;
unsigned long finRouge = 0;
unsigned long debOrange = 0;
unsigned long dureeRouge;
boolean flagOrange = 0;
void setup() {
pinMode(ILS_entree, INPUT_PULLUP);
pinMode(ILS_sortie, INPUT_PULLUP);
pinMode(feu_vert, OUTPUT);
pinMode(feu_rouge, OUTPUT);
pinMode(feu_orange, OUTPUT);
// Initialisation du signal a anode commune, allume par LOW
digitalWrite(feu_vert, LOW);
digitalWrite(feu_rouge, HIGH);
digitalWrite(feu_orange, HIGH);
}
void loop() {
// Surveillance de l ILS d entree
while (digitalRead(ILS_entree) == HIGH)
{
// ILS E non declenche
if (flagOrange)
{
if ((millis() - debOrange) > dureeRouge)
{
digitalWrite(feu_orange, HIGH);
flagOrange = 0;
digitalWrite(feu_vert, LOW);
}
}
}
// ILS E declenche
digitalWrite(feu_vert, HIGH);
digitalWrite(feu_orange, HIGH);
flagOrange = 0;
digitalWrite(feu_rouge, LOW);
debRouge = millis();
// Surveillance de l ILS de sortie
while (digitalRead(ILS_sortie) == HIGH)
{
// ILS S non declenche, ne rien faire
}
// ILS S declenche
finRouge = millis();
dureeRouge = finRouge - debRouge;
digitalWrite(feu_rouge, HIGH);
digitalWrite(feu_orange, LOW);
flagOrange = 1;
debOrange = millis();
}