h f
©Patrice Barthélemy 2017
ligne
Rétrosignalisation
f
Codeur de rétrosignalisation
ligne

C'est un codeur assez complexe non par la difficulté technique mais plutôt par la quantité de matériel à mettre sur le circuit. Ce codeur est conforme à la norme S88n. Je me suis largement inspiré de l'article de Ruud Boer de Novembre 2014.

Voir ci-dessous le schéma de principe:

lkuh

Ensuite j'ai dessiné les 2 circuits imprimés que j'ai fait fabriquer en Chine.

trr

 

rtg

 

 

rtgwgr

 

htgrd

 

Dernière étape, le programme, sur la base du programme de JPClaude j'ai réalisé ma propre version qui fontionne parfaitement.

*/*********************************************************************************************
* Détecteur d'occupation des voies S88n à 8 canaux basé sur un controleur Arduino Nano.
*
* Programme librement interpreté par Babar sur la base de celui de Ruud Boer de Novembre 2014.
*
***********************************************************************************************/


Brochage du Bus S88n, des prises RJ45 et de l'Arduino Nano


Data In--------->> S88n: 7------------>> RJ45: 2------------- >> Arduino Nano: D0
Data Out------->> S88n: 7----------->> RJ45: 2--------------->> Arduino Nano: D1
GND------------ >> S88n: 4,6-------- >> RJ45: 3,5------------>> Arduino Nano: GND
Clock---------- >> S88n: 5------------>> RJ45: 4-------------->> Arduino Nano: D2
PS(Load)------>> S88n: 3----------- >> RJ45: 6--------------->> Arduino Nano: D3
Signal--------- >>----------------------- >>-------------------------->> Arduino Nano: D5-D12


*/

int clockCounter=0;
long loopCounter=0;
unsigned int sensors=0;
unsigned int data=0xffff;
const byte dataIn=0; //Entrée des données depuis l'Arduino Nano suivant.
const byte dataOut=1; //Sortie des données vers l'Aarduino Nano précédent ou vers l'ordinateur
boolean loadSensors=false; //Flag qui démarre le chargement des données

void setup() {
pinMode(2, INPUT_PULLUP);
attachInterrupt(0,clock,RISING); //broche 2 = clock interrupt
pinMode(3, INPUT_PULLUP);
attachInterrupt(1,PS,RISING); //broche 3 = PS interrupt
pinMode(dataIn,INPUT_PULLUP); //broche 12 = Entrée des données depuis les modules suivants
pinMode(dataOut, OUTPUT); //broche 13 = Sortie des données vers les modules précédents
digitalWrite(dataOut, LOW); //LED off
pinMode(5, INPUT_PULLUP); // capteur 01
pinMode(6, INPUT_PULLUP); // capteur 02
pinMode(7, INPUT_PULLUP); // capteur 03
pinMode(8, INPUT_PULLUP); // capteur 04
pinMode(9, INPUT_PULLUP); // capteur 05
pinMode(10, INPUT_PULLUP); //capteur 06
pinMode(11, INPUT_PULLUP); //capteur 07
pinMode(12, INPUT_PULLUP); //capteur 08

}

void loop() {
if (loopCounter==10){bitSet(sensors,0);}

if (!digitalRead(5)){bitSet(sensors,0);}
if (!digitalRead(6)) {bitSet(sensors,1);}
if (!digitalRead(7)) {bitSet(sensors,2);}
if (!digitalRead(8)) {bitSet(sensors,3);}
if (!digitalRead(9)) {bitSet(sensors,4);}
if (!digitalRead(10)) {bitSet(sensors,5);}
if (!digitalRead(11)) {bitSet(sensors,6);}
if (!digitalRead(12)) {bitSet(sensors,7);}

}

void PS() {
clockCounter=0;
data=sensors;
sensors=0;
loopCounter++; //Incrémente loopCounter pour créer une temporisation
}

void clock() {
digitalWrite(dataOut,bitRead(data,clockCounter));
delayMicroseconds(16); // améliore la lecture du signal qui vient de l'élément suivant.
bitWrite(data,clockCounter,digitalRead(dataIn));
clockCounter =(clockCounter +1) % 8;
}



La liste de pièces et les coûts

Décodeur
Nom Référence   Prix unitaire
pièces par jeu
Prix par jeu
Print décodeur 1
2,71
Bornier 2p 0,05 8
0,39
Prise cable plat 20p 0,49 1
0,49
Microcontroleur Arduino nano 1,85 1
1,85
bornier nano 0,10 2
0,19
Prise RJ45 0,46 2
0,93
Optocoupleur  4N35 0,14 8
1,11
Support DIP6 0,03 8
0,27
Diode BY251 0,10 32
3,20
résistance 22 ohm 0,01 8
0,04
résistance 47k 0,01 8
0,04

 

Prix de revient
11,22
Interface
Nom Référence   Prix unitaire
pièces par jeu
Prix par jeu
Print interface 1
1,32
Bornier 2p 0,05 8
0,39
Prise cable plat 20p 0,49 1
0,49
  Prix de revient
2,20

Rappel: 1 jeu = 8 sections de voie

ligneligneligne