Post Top Ad

Saturday, March 11, 2023

on video how to make a simple to use AM radio


 It is very much that there are three plaisant of your circuler of trains en toute securité en les suivant à l'écran de son Smartphone, de his tablet or his son ordinateur, it is on peut also trouver beaucoup de plaisir à "jouer" manuellement avec une ou plusieurs machines, all au moins sur une partie de son réseau.

L'originalité du projet tient entre autre dans le stockage maximum de 59 locos dans la souris, ce qui permet de travailler avec sa propre souris à la maison ou dans son club en anyant toutes ses machines sous la main (sous conditions d'avoir la Me centrale at the club).


historical


The fréquentant des clubs of modélisme ferroviaire il est apparu que les souris utilisées ne convenaient pas toujours à tout le monde. L'idée d'en faire une sur mesure a germé et c'est en prenant en main le boitier HAMMOND que j'ai décidé de me lancer dans ce projet, tant ce boitier est agréable à manipuler. Le cahier des charges a été défini avec l'aide des membres de mon club. La demande était, entre autres, de pouvoir suivre en toute liberté son convoi so far au long du réseau, qui peut être très vaste among certains clubs, ce qui m’a orienté vers le sans fil.

Après de longues semaines de tests avec les "pointures" du club, the project is finished about me and prêt à être mis en ligne.

Depuis que j’utilise ce type de souris “liberté” il me serait difficile de revenir à une souris classicique.

De plus aucun article sur ce sujet n'a jamais été présenté sur le coduino site (à ma connaissance en sous cas).

This source/central sera is conveniently integrated in its n'importe quelle configuration presented on Locoduino grace à la presente d'un bus CAN dans la centrale.


Voici celle que je vous propose de realiser:


Ma souris


What does this project consist of?

It has a centralized 100% DCC (pas d'analogique) recorder commanded by one or more souris with radio liaison (30 and plus it's not too much envisageable).


Les characters sont les suivantes:


La souris:


Boitier ergonomique, robuste and aesthetic equipé d'un clavier alphanumerique.

Afficheur OLED 1,54'' is very affordable.

Mise en mémoire (in la souris) of 59 machines with leur address and leur nom sur 12 caractères.

Une "liste du jour" de 10 locos sélectionnables directement par appui de la touche * suivi de 0 à 9 du clavier. Such loco garde sa vitesse et ses fonctions en mémoire.

28 fonctions standards vers DCC et 72 fonctions programmables delegateées sur le bus CAN de la centrale. La fonction lumière affiche une petite ampoule, les autres sont affichées dans la dernière ligne du bas.

Menu complete with List triée sur nom, List triée sur adresse, Creation nouvelle loco, Programming de CVs.

Program automatique des adresses longues et courtes (this is the modifie automatiquement les CV1, CV29, 17 et 18).

Programming in POM mode is possible.

Utilization 24H en continu sans recharge selon la batterie installée.

The memoire EEPROM of the souris compporte une "bibliothèque" of 59 localities avec un N° d'ordre, une adresse DCC et un nom. It is possible to create a very rapid list of 10 locos maximum (parmi les 59), this is a list qu’on va jouer. Si le N° d’ordre de la loco est inferieur à 10 loco est dans la liste du jour.

Je vous propose de feuilleter le mode d'emploi ci-dessous pour vous donner une idee plus précise de ses caractéristiques.



Mode d'emploi de la souris V1.21

La centrale:


The central is equipped with the base:


d’un module Bluetooth (command by Smartphone possible, program Android available)

d’un module radio acceptant 6 souris (extensible by modules de 6 souris)

d'un bus CAN permettant all les possible extensions

d’une sortie DCC voie MAIN 43A protégée selon les besoins du réseau

d’une sortie DCC voie de PROGRAMMATION de 3A.

La centrale garde en mémoire les vitesses et fonctions même en cas de coupure de la tension DCC.

Aucune commande ne se trouvant sur la centrale, celle-ci peut être cachée sous le réseau.

Est-il compliqué à realiser?


La réalisation de cet ensemble, et principalement de la souris, demande une grande rigueur mécanique, principalement au niveau de la découpe du boitier. Tous les gabarits de coupe, les plans, les schemas, les films CI, les sketches et la list des composants sont disponibles sur le site à la fin de cet article. A circuit imprimé double face + trous métallisés + vernis épargne (pour la souris et pour la centrale) is également available sur simple demande.

At the age of sketches, beaucoup "d'anciens" (ayat pratiqué l'assembleur) vont retrouver leur manière de programmer car je ne maîtrise absolument pas, à mon grand regret, le "monde des objets" si cher à Locoduino (in just the titre ). That sera donc une programming pas à pas avec un maximum de commentaires pour guider au mieux les utilisateurs.

The coût de l'ensemble se situe aux alentours de 50€ for the centrale and 40€ for the souris.


Realization of sourcing:

Comments by the plus diff

d'affichage.

Codeur incrémental avec bouton poussoir pour garder les vitesses de chaque loco en memoire.

Clavier alphanumerique pour siisir facilement les noms des locos.

Arduino PRO/MINI 3,3V pour pouvoir utiliser une batterie de 3,7V très économique.

Module radio NRF24L01 for ses 6 tampons mémoires émission/reception.

Voici le schema complete de la souris ; ne figure pas les condensateurs de decouplages conseillés sur l’alimentation of NRF24L01 ni les liaisons GND de certains composants :


Schema souris


The L’écran Oled and the NRF24L01 sont tous les deux controls par le bus SPI du PRO/MINI, with bits A1, A2 and A3 for selecting the NRF and les bits 9 and 10 for selecting the NRF.

On utilise l'interruption 0 pour lire les rotations du codeur.

The A6 enters a la double function of charging the niveau de tension of the batterie to travers the point of resistance 10K/20K and the connection of the bouton d'arrêt d'urge Stop.

Je me suis guardé les bits 1 et A5 for pouvoir éventuellement ajouter une memory EEPROM (SPI) extérieure de grosse capacité for les personnes qui possèdent plus de 59 machines à mettre en memoire.


The program of the sourcing:



Sketch V1. 21 de la souris

J'ai laissé en tête de croquis plusieurs commentaires et liens qui m'ont permis de concevoir ce dernier. N'hésitez pas à consulter ces liens très richissants.


Voici les liens for downloading the different libraries:

Pour l'afficheur: https://github.com/olikraus/u8glib

For the NRF24L01: https://github.com/nRF24/RF24

Pour l’anti-rebonds des touches: https://github.com/thomasfredericks/Bounce-Arduino-Wiring/archive/master.zip

Pour le clavier: http://www.arduino.cc/playground/uploads/Code/Keypad_1-0.zip


Je ne vais pas commenter le sketch completet, ce serait tres vite rébarbatif, je vais juste presenter les blocks principaux avec leurs fonctions.


Les dix premières lignes permettent de modifier rapidement quelques comportements du program (Attention! Les N° de lignes ne correspondent pas forcément au programme).


const char version[] = "1.10"; // changer ce number for version

#define tempo_alpha 700 // milliseconds pour touches alphanumeriques (700)

#define tempo_touche 500 // milliseconds pour touches fonctions (500)

#define tempo_loco 1000 // milliseconds pour touches locos (500)

#define palier_1 9 // 1er palier of changement d'incrément

#define inc_palier_1 2 // incrément après 1er palier

#define palier_2 20 // 2 palier of changement d'incrément

#define inc_palier_2 5 // incrément après 2è palier

#define palier_3 50 // 3 palier of changement d'incrément

#define inc_palier_3 12 // incrément après 3 palier

// si on veut autoriser la programming in mode POM, dé-commenter la ligne suivante

// #define aff_pom 1

tempo_alpha permet de modifier la tempo entre 2 appuis successifs des touches alphanumériques

tempo_touche est la tempo maximum for la saisie de la seconde value des touches de fonction qui se fait sur 1 or 2 chiffres.

tempo_loco idem mais pour la saisie d’une loco dans la liste du jour avec la touche *

Les différents paliers permettent d'incrémenter ou de decrémenter plus rapidement la vitesse de la loco selon la valeur des 3 paliers. Si on ne veut pas utiliser de palier il suffit de mettre palier_1, palier_2 and palier_3 à 128.

Si l'on désire autoriser la fonction "POM" (programmation sur la voie principale), il faut dé-commenter la ligne qui définit "aff_pom". Cela rajoute une option sur la page de programming des CVs.

Si vous avez déjà travaillé avec un écran Oled, vous serez certainement surpris du choix de la librairie U8glib.h qui est une ancienne librairie qui n'est plus maintenue et dont l'auteur propose de se rabattre sur la nouvelle version qui est U8g2lib. h.

Ce choix s'est imposé à moi car, d'après mes ssais, it's the librairie qui consomme le moins de memoire live et qui permet malgré all de beaux graphismes. By contre cela impose une gymnastique un peu particulière pour l'affichage d'une page car à chaque ajout de texte il faut entièrement rafraîchir cette dernière. Une petite explication (in Anglais) ici: https://github.com/olikraus/u8glib/wiki/thelloworld


Les constants:

// menu

#define MENU_ITEMS 5

const char *menu_strings[MENU_ITEMS] = { "Liste par nom", "Liste par address", "Nouvelle Loco", "Gession CVs", "Quitter" };

C'est le menu qui vous est proposé en appuyant la touche # .


Les canaux radio:


// il y a 10 canaux possibles


Pourquoi 10 canaux et non pas 6 like the exige le NRF24L01 ?

The central club is equipped with a carte radio supply

Entaire avec 4 canaux en plus ce qui permet d’utiliser 10 souris en même temps.

The choix du canal se fait en fonction de la valeur num_souris lue dans l'EEPROM et modifiable by appui de la touche grise (mise en route DCC) au moment de l'allumage de la souris puis la saisie d'un chiffre de 0 à 9. That no s'affiche pendant 2s à l'allumage ainsi que la version of the programme.


Les touches alpha-numeriques:


const char lettre[10][4] = {

   {'Z','Q','-','0'},

   {' ',':','+','1'},

   {'A','B','C','2'},

   {'D','E','F','3'},

   {'G','H','I','4'},

   {'J','K','L','5'},

   {'M','N','O','6'},

   {'P','R','S','7'},

   {'T','U','V','8'},

   {'W','X','Y','9'},

};

This tableau permet de modifier éventuellement les caractères utilisés pour les noms des locos ; chaque ligne corresponding to son chiffre en fin de ligne.


Avant le setup se trouvent les différents sous-programmes d'affichage de pages et quelques fonctions utilisées plus loin dont la très courte routine d'interruption du codeur :


// routine interruption du codeur

void routineInterruption () {

   if (digitalRead(PinA)) {

     up = !digitalRead(PinB);

   }

   else {

     up = digitalRead(PinB);

   }

   mouvement = true;

}

Or la routine d’affichage de la page “jeu” assez complexe:


void draw_Jeux() { // affiche la page en position JEU

   u8g. setFont(u8g_font_6x13);

   u8g. setFontRefHeightText();

   u8g. setFontPosTop();

   // Afficher la ligne d'état

   sprintf(ligne1, "Ordre:%d Adr:%d", ordre, adresse_loco);

   u8g. drawStr(0, 0, line1);

   // Afficher le name de la loco or loco ? Si choix loco en course

   u8g. setFont(u8g_font_helvB12); // hauteur 12 pixels GRAS 64%

   if (choice == 0) {

     for (i = 0; i < 16; i++) {

       line1[i] = nom_loco[i]; // initialiser avec la loco 0

     }

     d = ((128 - u8g. getStrWidth(ligne1)) / 2);

     u8g. drawStr(d, 28, line1);

   }

   else {

     u8g. drawStr(42, 28, "Loco ?"); // Afficher le name de la loco or loco ? Si choix loco en course

   }

   // Afficher ampoule si fonction 0 active

   if (function[order][0]) {

     u8g. drawCircle(centre_co, centre_li, 4);

     u8g.drawLine(15, centre_li - 8, 15, centre_li - 6);

     u8g.drawLine(15, centre_li + 6, 15, centre_li + 8);

     u8g.drawLine(centre_co - 8, centre_li, centre_co - 6, centre_li);

     u8g. drawLine(centre_co + 6, centre_li, centre_co + 8, centre_li);

     u8g.drawLine(centre_co - 7, centre_li - 6, centre_co - 5, centre_li - 4); // "\"

     u8g.drawLine(centre_co + 5, centre_li - 4, centre_co + 7, centre_li - 6); // "/"

     u8g.drawLine(centre_co - 7, centre_li + 6, centre_co - 5, centre_li + 4); // "/"

     u8g.drawLine(centre_co + 5, centre_li + 4, centre_co + 7, centre_li + 6); // "\"

   }

   // Afficher la vitesse

   if (tension == 1) {

     cpt = crans[order]; // crans[] = crans delegates, cpt = crans affichés to l'écran

     sense[order] = 1;

     if (crans[order] > 0) {

       sprintf(buf, "%3d >", cpt + 2);

       d = ((128 - u8g. getStrWidth(buf)) / 2) + 10;

     }

     else if (crans[order] == 0) {

       sprintf(buf, "%3d", 0);

       d = ((128 - u8g. getStrWidth(buf)) / 2);

     }

     else if (crans[order] < 0) {

       cpt = - crans[order];

       sprintf(buf, "< %d", cpt + 2);

       sense[order] = 0;

       d = ((128 - u8g. getStrWidth(buf)) / 2) - 6;

       if (d < 0) {

         d = 0;

       }

     }

   }

   else if (tension == 0) {

     sprintf(buf, "%s", "STOP");

     d = 40;

   }

   else {

     sprintf(buf, "%s", "DISJONCTE");

     d = 9;

   }

   u8g. drawStr(d, 46, buf);

   // afficher niveau batterie

   u8g. setFont(u8g_font_6x13);

   u8g. setFontRefHeightText();

   u8g. setFontPosTop();

   u8g. drawFrame(106, 38, 22, 9);

   if (moyenne > 0) {

     byte volt = 0; //(0 = 1 bar, 5 = 6 bar)

     if (moyenne > 850) { // 6 bars

       volt = 5;

     }

     else if (moyenne > 829) { // 5 bars

       volt = 4;

     }

     else if (moyenne > 808) { // 4 barres

       volt = 3;

     }

     else if (moyenne > 787) { // 3 bars

       volt = 2;

     }

     else if (moyenne > 766) { // 2 barres

       volt = 1;

     }

     else if (moyenne > 745) { // 1 barre

       volt = 0;

     }

     for (byte i = 0; i <= volt; i++) {

       u8g.drawLine((i * 3) + 109, 40, (i * 3) + 109, 44);

     }

   }

   // Afficher les functions

   d = 0; // AU DEpart afficher à partir de gauche

   if (w > 128) {

     d = -(w - 128); // si ligne trop longue, decaler à gauche

   }

   u8g. drawStr(d, 54, line2); // n'afficher que la fin de la ligne des fonctions

}

The setup:

//Serial. begin (9600); // Initialization of the port series

 

order = EEPROM. read(1020); // lire la dernière loco utilisée en EEPROM

contraste = EEPROM. read(1021); // récupérer dernier contraste en EEPROM

num_sources = EEPROM. read(1022); // lire le numéro de souris en EEPROM

PTXpipe = pipes[num_source]; // recuperer le channel correspondant

 

rech_loco_ordre(ordre); // Chercher les infos de la dernière loco utilisée

 

attachInterrupt (0, routineInterruption, CHANGE

;

 

 

 

Le Serial.begin est supprime pour gagner de la place en memoire flash et RAM.

It can be removed from service to the finest débogage en supprimant momentanément la police "u8g_font_helvB12" and all the lines that use it in comments that liberate the memory.

The NRF24L01 is utilisé de façon un peu particulière en lui attribuant le même canal pour l'émission et la réception. C'est ce qui permet d'utiliser 6 souris (avec une centrale de base sans l'extension radio).

Le setup configure l'interruption for the codeur, les bits E/S, le radio module NRF24L01 et récupère all les infos sauvegardées en EEPROM: Le N° de canal de la souris, la dernière loco utilisée et le dernier contraste affiché.


Laloop:

Désolé for the applications of one (voire three) succinctes of the partie la plus conséquente du program mais vue la longueur (encore the monde des objets qui manque) je ne me vois pas commenter ces 748 lignes de code, et n'en faire qu 'A petite partie ne vous apporterait pas grand chose. Je suis à votre disposition pour répondre à toutes vos demandes à la fin de cet article ou via the forum.

En voici en tous cas les blocs principaux:

Line 636 à 673: Boucle d'affichage selon la valeur de la variable "type_affichage".

Line 676 to 699: On test si une radio trame est détectée, suivi de l’envoi d’une eventuelle réponse.

Line 701 à 836: Test and actions en fonction de la rotation du codeur incrémental. Your commentaries are orientated si besoin.

Line 837 to 863: On n'envoie les commandes DCC que toutes les 500 ms.

Line 869 à 929: Test des boutons STOP (rouge).

Line 931 à 974: Test des boutons START (gris).

Line 977 à 1200: Très long test du bouton du codeur avec actions correspondantes selon la page dans laquelle on se trouve.

Line 1204 à 1343: Test du clavier alphanumerique et actions selon page.

Line 1345 à 1355: Test de la tempo pour la saisie des différents caractères des touches du clavier.

Line 1357 à 1360: Test de la tempo pour les touches de fonction.

Line 1362 à 1370: Test de la tempo pour les touches de choix de loco.

Line 1373 à 1384: Lecture du niveau batterie avec moyenne glissante, sujet très intéressant à voir ici: http://arduino.blaisepascal.fr/index.php/2016/02/06/lisser-un-signal-analogique/


Les ligne 977 à 1343 représentent Le gros du program avec une tripotée de "if" que j'ai essayé de remplacer par des "case" mais sans que cela ne fasse gagner de la memoire, donc abandonné. C'est dans cette partie que tout se passe pour gérer l'appui des touches, afficher un "pseudo" curseur ( il n'existe pas de curseur dans la bibliothèque U8glib.h), limiter le nombre de caractères saisis, annuler or valider one action, etc. L’orientation se fait principalement en fonction de la variable “menu” qui est definie par la validation d’une des lignes du menu.

Also the commentaires are not nombres et peuvent éclairer votre route.


The fabrication of souris


Voici les dimensions du boitier:


Dimensions boitier


Un des objectifs pour la fabrication de la souris était de mettre tous les composants sur un seul circuit imprimé avec le clavier, l’écran et le microcontrôleur sur picots enfichables pour en faciliter le remplacement en cas de panne. Cela impose 2 types of picots for a question d’encombrement vertical et que vous retrouverez sur la liste des pièces.

La partie la plus difficile car la plus précise, sera la préparation du boitier avec toutes les decoupes necessaires to accueillir cet unique circuit imprimé qui sera bloqué entre les 2 demis-coques du boitier sans aucune fixation. Il faudra suivre scrupuleusement le gabarit de coupe fourni.



Gabarit d


 It is very much that there are three plaisant of your circuler of trains en toute securité en les suivant à l'écran de son Smartphone, de his tablet or his son ordinateur, it is on peut also trouver beaucoup de plaisir à "jouer" manuellement avec une ou plusieurs machines, all au moins sur une partie de son réseau.

L'originalité du projet tient entre autre dans le stockage maximum de 59 locos dans la souris, ce qui permet de travailler avec sa propre souris à la maison ou dans son club en anyant toutes ses machines sous la main (sous conditions d'avoir la Me centrale at the club).


historical


The fréquentant des clubs of modélisme ferroviaire il est apparu que les souris utilisées ne convenaient pas toujours à tout le monde. L'idée d'en faire une sur mesure a germé et c'est en prenant en main le boitier HAMMOND que j'ai décidé de me lancer dans ce projet, tant ce boitier est agréable à manipuler. Le cahier des charges a été défini avec l'aide des membres de mon club. La demande était, entre autres, de pouvoir suivre en toute liberté son convoi so far au long du réseau, qui peut être très vaste among certains clubs, ce qui m’a orienté vers le sans fil.

Après de longues semaines de tests avec les "pointures" du club, the project is finished about me and prêt à être mis en ligne.

Depuis que j’utilise ce type de souris “liberté” il me serait difficile de revenir à une souris classicique.

De plus aucun article sur ce sujet n'a jamais été présenté sur le coduino site (à ma connaissance en sous cas).

This source/central sera is conveniently integrated in its n'importe quelle configuration presented on Locoduino grace à la presente d'un bus CAN dans la centrale.


Voici celle que je vous propose de realiser:


Ma souris


What does this project consist of?

It has a centralized 100% DCC (pas d'analogique) recorder commanded by one or more souris with radio liaison (30 and plus it's not too much envisageable).


Les characters sont les suivantes:


La souris:


Boitier ergonomique, robuste and aesthetic equipé d'un clavier alphanumerique.

Afficheur OLED 1,54'' is very affordable.

Mise en mémoire (in la souris) of 59 machines with leur address and leur nom sur 12 caractères.

Une "liste du jour" de 10 locos sélectionnables directement par appui de la touche * suivi de 0 à 9 du clavier. Such loco garde sa vitesse et ses fonctions en mémoire.

28 fonctions standards vers DCC et 72 fonctions programmables delegateées sur le bus CAN de la centrale. La fonction lumière affiche une petite ampoule, les autres sont affichées dans la dernière ligne du bas.

Menu complete with List triée sur nom, List triée sur adresse, Creation nouvelle loco, Programming de CVs.

Program automatique des adresses longues et courtes (this is the modifie automatiquement les CV1, CV29, 17 et 18).

Programming in POM mode is possible.

Utilization 24H en continu sans recharge selon la batterie installée.

The memoire EEPROM of the souris compporte une "bibliothèque" of 59 localities avec un N° d'ordre, une adresse DCC et un nom. It is possible to create a very rapid list of 10 locos maximum (parmi les 59), this is a list qu’on va jouer. Si le N° d’ordre de la loco est inferieur à 10 loco est dans la liste du jour.

Je vous propose de feuilleter le mode d'emploi ci-dessous pour vous donner une idee plus précise de ses caractéristiques.



Mode d'emploi de la souris V1.21

La centrale:


The central is equipped with the base:


d’un module Bluetooth (command by Smartphone possible, program Android available)

d’un module radio acceptant 6 souris (extensible by modules de 6 souris)

d'un bus CAN permettant all les possible extensions

d’une sortie DCC voie MAIN 43A protégée selon les besoins du réseau

d’une sortie DCC voie de PROGRAMMATION de 3A.

La centrale garde en mémoire les vitesses et fonctions même en cas de coupure de la tension DCC.

Aucune commande ne se trouvant sur la centrale, celle-ci peut être cachée sous le réseau.

Est-il compliqué à realiser?


La réalisation de cet ensemble, et principalement de la souris, demande une grande rigueur mécanique, principalement au niveau de la découpe du boitier. Tous les gabarits de coupe, les plans, les schemas, les films CI, les sketches et la list des composants sont disponibles sur le site à la fin de cet article. A circuit imprimé double face + trous métallisés + vernis épargne (pour la souris et pour la centrale) is également available sur simple demande.

At the age of sketches, beaucoup "d'anciens" (ayat pratiqué l'assembleur) vont retrouver leur manière de programmer car je ne maîtrise absolument pas, à mon grand regret, le "monde des objets" si cher à Locoduino (in just the titre ). That sera donc une programming pas à pas avec un maximum de commentaires pour guider au mieux les utilisateurs.

The coût de l'ensemble se situe aux alentours de 50€ for the centrale and 40€ for the souris.


Realization of sourcing:

Comments by the plus diff

d'affichage.

Codeur incrémental avec bouton poussoir pour garder les vitesses de chaque loco en memoire.

Clavier alphanumerique pour siisir facilement les noms des locos.

Arduino PRO/MINI 3,3V pour pouvoir utiliser une batterie de 3,7V très économique.

Module radio NRF24L01 for ses 6 tampons mémoires émission/reception.

Voici le schema complete de la souris ; ne figure pas les condensateurs de decouplages conseillés sur l’alimentation of NRF24L01 ni les liaisons GND de certains composants :


Schema souris


The L’écran Oled and the NRF24L01 sont tous les deux controls par le bus SPI du PRO/MINI, with bits A1, A2 and A3 for selecting the NRF and les bits 9 and 10 for selecting the NRF.

On utilise l'interruption 0 pour lire les rotations du codeur.

The A6 enters a la double function of charging the niveau de tension of the batterie to travers the point of resistance 10K/20K and the connection of the bouton d'arrêt d'urge Stop.

Je me suis guardé les bits 1 et A5 for pouvoir éventuellement ajouter une memory EEPROM (SPI) extérieure de grosse capacité for les personnes qui possèdent plus de 59 machines à mettre en memoire.


The program of the sourcing:



Sketch V1. 21 de la souris

J'ai laissé en tête de croquis plusieurs commentaires et liens qui m'ont permis de concevoir ce dernier. N'hésitez pas à consulter ces liens très richissants.


Voici les liens for downloading the different libraries:

Pour l'afficheur: https://github.com/olikraus/u8glib

For the NRF24L01: https://github.com/nRF24/RF24

Pour l’anti-rebonds des touches: https://github.com/thomasfredericks/Bounce-Arduino-Wiring/archive/master.zip

Pour le clavier: http://www.arduino.cc/playground/uploads/Code/Keypad_1-0.zip


Je ne vais pas commenter le sketch completet, ce serait tres vite rébarbatif, je vais juste presenter les blocks principaux avec leurs fonctions.


Les dix premières lignes permettent de modifier rapidement quelques comportements du program (Attention! Les N° de lignes ne correspondent pas forcément au programme).


const char version[] = "1.10"; // changer ce number for version

#define tempo_alpha 700 // milliseconds pour touches alphanumeriques (700)

#define tempo_touche 500 // milliseconds pour touches fonctions (500)

#define tempo_loco 1000 // milliseconds pour touches locos (500)

#define palier_1 9 // 1er palier of changement d'incrément

#define inc_palier_1 2 // incrément après 1er palier

#define palier_2 20 // 2 palier of changement d'incrément

#define inc_palier_2 5 // incrément après 2è palier

#define palier_3 50 // 3 palier of changement d'incrément

#define inc_palier_3 12 // incrément après 3 palier

// si on veut autoriser la programming in mode POM, dé-commenter la ligne suivante

// #define aff_pom 1

tempo_alpha permet de modifier la tempo entre 2 appuis successifs des touches alphanumériques

tempo_touche est la tempo maximum for la saisie de la seconde value des touches de fonction qui se fait sur 1 or 2 chiffres.

tempo_loco idem mais pour la saisie d’une loco dans la liste du jour avec la touche *

Les différents paliers permettent d'incrémenter ou de decrémenter plus rapidement la vitesse de la loco selon la valeur des 3 paliers. Si on ne veut pas utiliser de palier il suffit de mettre palier_1, palier_2 and palier_3 à 128.

Si l'on désire autoriser la fonction "POM" (programmation sur la voie principale), il faut dé-commenter la ligne qui définit "aff_pom". Cela rajoute une option sur la page de programming des CVs.

Si vous avez déjà travaillé avec un écran Oled, vous serez certainement surpris du choix de la librairie U8glib.h qui est une ancienne librairie qui n'est plus maintenue et dont l'auteur propose de se rabattre sur la nouvelle version qui est U8g2lib. h.

Ce choix s'est imposé à moi car, d'après mes ssais, it's the librairie qui consomme le moins de memoire live et qui permet malgré all de beaux graphismes. By contre cela impose une gymnastique un peu particulière pour l'affichage d'une page car à chaque ajout de texte il faut entièrement rafraîchir cette dernière. Une petite explication (in Anglais) ici: https://github.com/olikraus/u8glib/wiki/thelloworld


Les constants:

// menu

#define MENU_ITEMS 5

const char *menu_strings[MENU_ITEMS] = { "Liste par nom", "Liste par address", "Nouvelle Loco", "Gession CVs", "Quitter" };

C'est le menu qui vous est proposé en appuyant la touche # .


Les canaux radio:


// il y a 10 canaux possibles


Pourquoi 10 canaux et non pas 6 like the exige le NRF24L01 ?

The central club is equipped with a carte radio supply

Entaire avec 4 canaux en plus ce qui permet d’utiliser 10 souris en même temps.

The choix du canal se fait en fonction de la valeur num_souris lue dans l'EEPROM et modifiable by appui de la touche grise (mise en route DCC) au moment de l'allumage de la souris puis la saisie d'un chiffre de 0 à 9. That no s'affiche pendant 2s à l'allumage ainsi que la version of the programme.


Les touches alpha-numeriques:


const char lettre[10][4] = {

   {'Z','Q','-','0'},

   {' ',':','+','1'},

   {'A','B','C','2'},

   {'D','E','F','3'},

   {'G','H','I','4'},

   {'J','K','L','5'},

   {'M','N','O','6'},

   {'P','R','S','7'},

   {'T','U','V','8'},

   {'W','X','Y','9'},

};

This tableau permet de modifier éventuellement les caractères utilisés pour les noms des locos ; chaque ligne corresponding to son chiffre en fin de ligne.


Avant le setup se trouvent les différents sous-programmes d'affichage de pages et quelques fonctions utilisées plus loin dont la très courte routine d'interruption du codeur :


// routine interruption du codeur

void routineInterruption () {

   if (digitalRead(PinA)) {

     up = !digitalRead(PinB);

   }

   else {

     up = digitalRead(PinB);

   }

   mouvement = true;

}

Or la routine d’affichage de la page “jeu” assez complexe:


void draw_Jeux() { // affiche la page en position JEU

   u8g. setFont(u8g_font_6x13);

   u8g. setFontRefHeightText();

   u8g. setFontPosTop();

   // Afficher la ligne d'état

   sprintf(ligne1, "Ordre:%d Adr:%d", ordre, adresse_loco);

   u8g. drawStr(0, 0, line1);

   // Afficher le name de la loco or loco ? Si choix loco en course

   u8g. setFont(u8g_font_helvB12); // hauteur 12 pixels GRAS 64%

   if (choice == 0) {

     for (i = 0; i < 16; i++) {

       line1[i] = nom_loco[i]; // initialiser avec la loco 0

     }

     d = ((128 - u8g. getStrWidth(ligne1)) / 2);

     u8g. drawStr(d, 28, line1);

   }

   else {

     u8g. drawStr(42, 28, "Loco ?"); // Afficher le name de la loco or loco ? Si choix loco en course

   }

   // Afficher ampoule si fonction 0 active

   if (function[order][0]) {

     u8g. drawCircle(centre_co, centre_li, 4);

     u8g.drawLine(15, centre_li - 8, 15, centre_li - 6);

     u8g.drawLine(15, centre_li + 6, 15, centre_li + 8);

     u8g.drawLine(centre_co - 8, centre_li, centre_co - 6, centre_li);

     u8g. drawLine(centre_co + 6, centre_li, centre_co + 8, centre_li);

     u8g.drawLine(centre_co - 7, centre_li - 6, centre_co - 5, centre_li - 4); // "\"

     u8g.drawLine(centre_co + 5, centre_li - 4, centre_co + 7, centre_li - 6); // "/"

     u8g.drawLine(centre_co - 7, centre_li + 6, centre_co - 5, centre_li + 4); // "/"

     u8g.drawLine(centre_co + 5, centre_li + 4, centre_co + 7, centre_li + 6); // "\"

   }

   // Afficher la vitesse

   if (tension == 1) {

     cpt = crans[order]; // crans[] = crans delegates, cpt = crans affichés to l'écran

     sense[order] = 1;

     if (crans[order] > 0) {

       sprintf(buf, "%3d >", cpt + 2);

       d = ((128 - u8g. getStrWidth(buf)) / 2) + 10;

     }

     else if (crans[order] == 0) {

       sprintf(buf, "%3d", 0);

       d = ((128 - u8g. getStrWidth(buf)) / 2);

     }

     else if (crans[order] < 0) {

       cpt = - crans[order];

       sprintf(buf, "< %d", cpt + 2);

       sense[order] = 0;

       d = ((128 - u8g. getStrWidth(buf)) / 2) - 6;

       if (d < 0) {

         d = 0;

       }

     }

   }

   else if (tension == 0) {

     sprintf(buf, "%s", "STOP");

     d = 40;

   }

   else {

     sprintf(buf, "%s", "DISJONCTE");

     d = 9;

   }

   u8g. drawStr(d, 46, buf);

   // afficher niveau batterie

   u8g. setFont(u8g_font_6x13);

   u8g. setFontRefHeightText();

   u8g. setFontPosTop();

   u8g. drawFrame(106, 38, 22, 9);

   if (moyenne > 0) {

     byte volt = 0; //(0 = 1 bar, 5 = 6 bar)

     if (moyenne > 850) { // 6 bars

       volt = 5;

     }

     else if (moyenne > 829) { // 5 bars

       volt = 4;

     }

     else if (moyenne > 808) { // 4 barres

       volt = 3;

     }

     else if (moyenne > 787) { // 3 bars

       volt = 2;

     }

     else if (moyenne > 766) { // 2 barres

       volt = 1;

     }

     else if (moyenne > 745) { // 1 barre

       volt = 0;

     }

     for (byte i = 0; i <= volt; i++) {

       u8g.drawLine((i * 3) + 109, 40, (i * 3) + 109, 44);

     }

   }

   // Afficher les functions

   d = 0; // AU DEpart afficher à partir de gauche

   if (w > 128) {

     d = -(w - 128); // si ligne trop longue, decaler à gauche

   }

   u8g. drawStr(d, 54, line2); // n'afficher que la fin de la ligne des fonctions

}

The setup:

//Serial. begin (9600); // Initialization of the port series

 

order = EEPROM. read(1020); // lire la dernière loco utilisée en EEPROM

contraste = EEPROM. read(1021); // récupérer dernier contraste en EEPROM

num_sources = EEPROM. read(1022); // lire le numéro de souris en EEPROM

PTXpipe = pipes[num_source]; // recuperer le channel correspondant

 

rech_loco_ordre(ordre); // Chercher les infos de la dernière loco utilisée

 

attachInterrupt (0, routineInterruption, CHANGE

;

 

 

 

Le Serial.begin est supprime pour gagner de la place en memoire flash et RAM.

It can be removed from service to the finest débogage en supprimant momentanément la police "u8g_font_helvB12" and all the lines that use it in comments that liberate the memory.

The NRF24L01 is utilisé de façon un peu particulière en lui attribuant le même canal pour l'émission et la réception. C'est ce qui permet d'utiliser 6 souris (avec une centrale de base sans l'extension radio).

Le setup configure l'interruption for the codeur, les bits E/S, le radio module NRF24L01 et récupère all les infos sauvegardées en EEPROM: Le N° de canal de la souris, la dernière loco utilisée et le dernier contraste affiché.


Laloop:

Désolé for the applications of one (voire three) succinctes of the partie la plus conséquente du program mais vue la longueur (encore the monde des objets qui manque) je ne me vois pas commenter ces 748 lignes de code, et n'en faire qu 'A petite partie ne vous apporterait pas grand chose. Je suis à votre disposition pour répondre à toutes vos demandes à la fin de cet article ou via the forum.

En voici en tous cas les blocs principaux:

Line 636 à 673: Boucle d'affichage selon la valeur de la variable "type_affichage".

Line 676 to 699: On test si une radio trame est détectée, suivi de l’envoi d’une eventuelle réponse.

Line 701 à 836: Test and actions en fonction de la rotation du codeur incrémental. Your commentaries are orientated si besoin.

Line 837 to 863: On n'envoie les commandes DCC que toutes les 500 ms.

Line 869 à 929: Test des boutons STOP (rouge).

Line 931 à 974: Test des boutons START (gris).

Line 977 à 1200: Très long test du bouton du codeur avec actions correspondantes selon la page dans laquelle on se trouve.

Line 1204 à 1343: Test du clavier alphanumerique et actions selon page.

Line 1345 à 1355: Test de la tempo pour la saisie des différents caractères des touches du clavier.

Line 1357 à 1360: Test de la tempo pour les touches de fonction.

Line 1362 à 1370: Test de la tempo pour les touches de choix de loco.

Line 1373 à 1384: Lecture du niveau batterie avec moyenne glissante, sujet très intéressant à voir ici: http://arduino.blaisepascal.fr/index.php/2016/02/06/lisser-un-signal-analogique/


Les ligne 977 à 1343 représentent Le gros du program avec une tripotée de "if" que j'ai essayé de remplacer par des "case" mais sans que cela ne fasse gagner de la memoire, donc abandonné. C'est dans cette partie que tout se passe pour gérer l'appui des touches, afficher un "pseudo" curseur ( il n'existe pas de curseur dans la bibliothèque U8glib.h), limiter le nombre de caractères saisis, annuler or valider one action, etc. L’orientation se fait principalement en fonction de la variable “menu” qui est definie par la validation d’une des lignes du menu.

Also the commentaires are not nombres et peuvent éclairer votre route.


The fabrication of souris


Voici les dimensions du boitier:


Dimensions boitier


Un des objectifs pour la fabrication de la souris était de mettre tous les composants sur un seul circuit imprimé avec le clavier, l’écran et le microcontrôleur sur picots enfichables pour en faciliter le remplacement en cas de panne. Cela impose 2 types of picots for a question d’encombrement vertical et que vous retrouverez sur la liste des pièces.

La partie la plus difficile car la plus précise, sera la préparation du boitier avec toutes les decoupes necessaires to accueillir cet unique circuit imprimé qui sera bloqué entre les 2 demis-coques du boitier sans aucune fixation. Il faudra suivre scrupuleusement le gabarit de coupe fourni.



Gabarit d

No comments:

Post a Comment

Post Top Ad

Pages