Auteur Sujet: projet centrale "LaBox" wifi DCC++ Can  (Lu 558982 fois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #510 le: mai 16, 2021, 03:05:21 pm »
Citer
Je construit déjà LaBox, mais il va falloir un programme côté ESP32 et un programme côté DUE (ou éventuellement NANO) pour tester le bus.

Je m'en occupe on verra ça en mails privés et si ça a de l'intérêt pour tout le monde, je publierai  :D

Mais il faudra en premier lever le doute sur le HVD230 que tu dois avoir (sans doute pas bon, mais parfois la chance...) et je te conseille en // de te procurer un circuit DIP MCP2562
comme indiqué précdemment :
https://forum.locoduino.org/index.php?topic=922.msg12941#msg12941

Le plus rapide car c'est un vendeur français :
https://www.ebay.fr/itm/184018171938?mkevt=1&mkcid=1&mkrid=709-53476-19255-0&campid=5338624522&toolid=10001&customid=ae5e5eb5bb72548ce68ce6131eeeacd4
« Modifié: mai 16, 2021, 03:11:00 pm par Dominique »
Cordialement,
Dominique

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #511 le: mai 16, 2021, 09:20:28 pm »
Je construit déjà LaBox, ...
... HVD230 que tu dois avoir ...
Il faut au moins remplacer la 10 K par un pont pour avoir une chance après le premier essai ...
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #512 le: mai 17, 2021, 02:43:46 pm »
Test de la version 080 modifiée pour afficher l'HMI:

1) la lumière ne fonctionne pas: le symbole * s'affiche sur l'Oled mais la lumière ne s'allume pas sur la loco
sur le moniteur:
5 From Throttle : MTAS18<;>F10
Throttle 5 MTAS18<;>F10
DCCpp SetFunctions for loco 18 / Activated : 0


A l'appui suivant, le symbole * s'eteint sur l'Oled et la lumière reste éteinte
5 From Throttle : MTAS18<;>F10
Throttle 5 MTAS18<;>F10
DCCpp SetFunctions for loco 18 / Activated :

Les commandes de vitesse et direction fonctionnent bien:
5 From Throttle : MTAS18<;>V33
Throttle 5 MTAS18<;>V33
DCCpp SetSpeed for loco 18 : 33/128 )

L'appui sur la touche IDLE est sans effet:
5 From Throttle : MTAS18<;>I
Throttle 5 MTAS18<;>I
DCCpp SetSpeed for loco 18 : 32/128 )
5 From Throttle : *
Throttle 5 *
5 -> <T2 18 32 1>*10

L'appui sur la touche STOP n'arrête pas la loco, elle ralenti à la vitesse 1 comme si l'emergency stop n'existait pas dans le décodeur.
D'ailleurs la vitesse 1 est possible avec le curseur et la loco avance bien très lentement !
5 From Throttle : MTAS18<;>X
Throttle 5 MTAS18<;>X
DCCpp SetSpeed for loco 18 : 1/128 )
5 From Throttle : *
Throttle 5 *
5 -> <T2 18 1 1>*10

la lecture de l'adresse loco ne fonctionne plus: après démarrage LaBox, Withrottle connecté pour établir le signal DCC sur les rails, mais pas d'adresse de loco sélectionnée. La machine ne bouge pas du tout !
Le message ERROR s'affiche trop vite : on n'a pas le temps de le lire et je ne vois pas de compte-rendu -1 sur la trace moniteur.
14:28:26.021 -> readCVraw : start reading cv 29
14:28:26.095 -> bit : 0 iter : 9, max : 9
14:28:26.731 -> bit : 1 iter : 11, max : 13
14:28:27.393 -> bit : 2 iter : 13, max : 11
14:28:28.069 -> bit : 3 iter : 2, max : 8
14:28:28.696 -> bit : 4 iter : 18, max : 14
14:28:29.367 -> bit : 5 iter : 6, max : 14
14:28:30.023 -> bit : 6 iter : 18, max : 10
14:28:30.653 -> bit : 7 iter : 0, max : 12
14:28:31.323 -> verif :  iter : 19, max : 14
14:28:31.913 -> readCVraw : start reading cv 1
14:28:31.985 -> bit : 0 iter : 14, max : 7
14:28:32.660 -> bit : 1 iter : 6, max : 13
14:28:33.299 -> bit : 2 iter : 1, max : 13
14:28:33.936 -> bit : 3 iter : 3, max : 13
14:28:34.596 -> bit : 4 iter : 19, max : 16
14:28:35.270 -> bit : 5 iter : 0, max : 11
14:28:35.899 -> bit : 6 iter : 10, max : 10
14:28:36.566 -> bit : 7 iter : 1, max : 15
14:28:37.235 -> verif :  iter : 10, max : 11
14:28:37.897 -> readCVraw : start reading cv 29
14:28:37.969 -> bit : 0 iter : 3, max : 17
14:28:38.603 -> bit : 1 iter : 12, max : 15
14:28:39.244 -> bit : 2 iter : 4, max : 13
14:28:39.917 -> bit : 3 iter : 9, max : 10
14:28:40.587 -> bit : 4 iter : 1, max : 11
14:28:41.240 -> bit : 5 iter : 3, max : 11
14:28:41.875 -> bit : 6 iter : 2, max : 14
14:28:42.534 -> bit : 7 iter : 18, max : 13
14:28:43.199 -> verif :  iter : 2, max : 12
14:28:43.766 -> readCVraw : start reading cv 1
14:28:43.838 -> bit : 0 iter : 1, max : 9
14:28:44.510 -> bit : 1 iter : 3, max : 13
14:28:45.141 -> bit : 2 iter : 19, max : 9
14:28:45.814 -> bit : 3 iter : 4, max : 9
14:28:46.448 -> bit : 4 iter : 13, max : 9
14:28:47.108 -> bit : 5 iter : 12, max : 13
14:28:47.769 -> bit : 6 iter : 17, max : 11
14:28:48.435 -> bit : 7 iter : 5, max : 10
14:28:49.070 -> verif :  iter : 7, max : 11
14:28:49.749 -> readCVraw : start reading cv 29
14:28:49.819 -> bit : 0 iter : 0, max : 10
14:28:50.453 -> bit : 1 iter : 5, max : 12
14:28:51.126 -> bit : 2 iter : 8, max : 12
14:28:51.763 -> bit : 3 iter : 10, max : 12
14:28:52.437 -> bit : 4 iter : 15, max : 15
14:28:53.101 -> bit : 5 iter : 14, max : 12
14:28:53.730 -> bit : 6 iter : 6, max : 12
14:28:54.372 -> bit : 7 iter : 15, max : 12
14:28:55.040 -> verif :  iter : 6, max : 12
14:28:55.634 -> readCVraw : start reading cv 1
14:28:55.701 -> bit : 0 iter : 19, max : 11
14:28:56.374 -> bit : 1 iter : 0, max : 12
14:28:57.021 -> bit : 2 iter : 9, max : 9
14:28:57.653 -> bit : 3 iter : 4, max : 12
14:28:58.309 -> bit : 4 iter : 3, max : 11
14:28:58.985 -> bit : 5 iter : 19, max : 10
14:28:59.621 -> bit : 6 iter : 18, max : 11
14:29:00.289 -> bit : 7 iter : 10, max : 8
14:29:00.948 -> verif :  iter : 15, max : 15
14:29:13.753 -> Converter : client 5 disconnected

Dans DCCpp.cpp je vois DCCpp::ackThreshold = 30 dans le begin.
Là on voit qu'on est bien en dessous.. Je dois essayer avec une Labox dernière version du PCB

Voilà avec la version 079 (et du Can intégré) : la lecture est très concluante.
Ca fait comme si la commande de lecture des CVs n'est pas envoyée à la loco (?)
14:53:04.169 -> readCVraw : start reading cv 29
14:53:04.237 -> bit : 0 iter : 11, max : 8
14:53:04.415 -> bit : 1 iter : 3, max : 358
14:53:04.587 -> bit : 2 iter : 6, max : 357
14:53:04.788 -> bit : 3 iter : 8, max : 8
14:53:04.961 -> bit : 4 iter : 15, max : 9
14:53:05.129 -> bit : 5 iter : 11, max : 6
14:53:05.337 -> bit : 6 iter : 6, max : 8
14:53:05.507 -> bit : 7 iter : 6, max : 8
14:53:05.712 -> verif :  iter : 6, max : 392
14:53:05.814 -> readCVraw : start reading cv 1
14:53:05.886 -> bit : 0 iter : 4, max : 8
14:53:06.055 -> bit : 1 iter : 6, max : 362
14:53:06.190 -> 4 From Throttle : *
14:53:06.257 -> bit : 2 iter : 8, max : 6
14:53:06.432 -> bit : 3 iter : 14, max : 11
14:53:06.609 -> bit : 4 iter : 3, max : 361
14:53:06.777 -> bit : 5 iter : 5, max : 8
14:53:06.951 -> bit : 6 iter : 16, max : 9
14:53:07.159 -> bit : 7 iter : 0, max : 6
14:53:07.334 -> verif :  iter : 6, max : 389

Cela ne m'empêche pas de travailler sur le Can en attendant  ;D
« Modifié: mai 17, 2021, 02:56:55 pm par Dominique »
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #513 le: mai 17, 2021, 05:38:10 pm »
Ayant commencé à étudier l'intégration du bus Can avec la bibliothèque ACAN_ESP32 de Pierre Molinaro, je vous présente un petit exposé sur les masques et les filtres qui permettent de limiter la réception de messages aux seuls qui sont attendus par le programme.

On se reportera d'abord sur les 2 articles "La bibliothèque ACAN" (1) et (2)

L'ESP32 étant équipé en interne d'un chip SJA1000 de NXP, je joins la datasheet ICI.

Avant de rentrer dans le cas spécifique de ce contrôleur Can, voici des généralités sur les filtres et les masques :
Le but de ces registres est d'analyser chaque message qui passe sur le bus pour décider si ce message intéresse le noeud (votre carte connectée au bus Can) ou pas. Si oui, le message est placé dans la file de réception, sinon il est ignoré.

La décision d'acceptance se fait sur l'analyse de l'identifiant (Id), bit à bit, au regard de 2 registres appelés Masque et Filtre.
Si la logique d'acceptance est favorable, alors le message est réceptionné dans la file de réception et sera servi à votre programme par le jeu d'une interruption. Tout ceci est géré en interne par le composant Can et la bibliothèque.

Il faut donc se concentrer sur ce qu'il faut mettre dans les filtres et les masques !

Principe :
Chaque bit du masque ne fait rien d’autre que de valider ou invalider le bit correspondant du filtre.
Dans le cas de l'ESP32 :
Un bit '0' valide le bit correspondant du filtre.
Un bit '1' permet d'ignorer le bit correspondant du filtre.


Chaque bit du filtre validé par le masque teste l’égalité avec le bit correspondant de l’identifiant, les autres bits pouvant avoir n’importe quelle valeur donc sont validés d’office.
Le résultat global du test (un & sur l’ensemble des tests bit individuels) autorise l’entrée du message dans la file d’attente du récepteur Rx du CAN et arme une interruption.
Donc un message dont l’identifiant n’est pas validé par ce test est invisible par le programme.

Le plus simple pour comprendre est de regarder quelques exemples basés, pour commencer, sur le cas des identifiants de 11 bits (standards).
Dans le cas du SJA1000, cela peut concerner aussi des identifiants de 29 bits (étendus) et il existe un ou 2 couples de masques et filtres maximum, ainsi que des possibilités de filtrage sur les 2 premiers octets de données du message.
Mais il faut procéder par étape donc on commence à s'interesser uniquement au cas des identifiants courts (11 bits) pour comprendre la logique.

Exemples pour un identifiant de 11bits :

MasqueFiltreResultat
0b00000000000 (0x0000) (tous les bits validés)0b11111111111 (0x07FF)Le Rx ne recevra que les messages avec l’Id 0x07FF
0b00000000000 (0x0000) (tous les bits validés)0b01111111110 (0x03FE)Le Rx ne recevra que les messages avec l’Id 0x03FE
0b00000000001 (0x0001)0b01111111111 (0x03FF)Le Rx ne recevra que les messages avec l’Id 0x03FE ou 0x03FF car le bit 0 du filtre est invalidé par le bit 0 du masque
0b00000000001 (0x0001)0b01111111110 (0x03FE)Le Rx ne recevra que les messages avec l’Id 0x03FE ou 0x03FF car le bit 0 du filtre est invalidé (idem cas précédent)
0b00000000000 (0x0000) (tous les bits validés)0b01111111000 (0x03F8)Le Rx ne recevra que les messages avec l’Id 0x03F8
0b00000000111 (0x0007)0b01111111000 (0x03F8)Le Rx recevra tous les messages avec l’Id 0x03F8, 0x03F9, 0x03FA, 0x03FB,0x03FC, 0x03FD, 0x03FE, 0x03FF car les bit 0,1 & 2 du filtre sont invalidés
0b00000000000 (0x0000) (tous les bits validés)0b00000000001 (0x0001)Le Rx ne recevra que les messages avec l’Id 0x001
0b00000000111 (0x0007)0b00000000000 (0x0000)Le Rx recevra tous les messages avec l’Id 0x000,0x001,  0x002, 0x003, 0x004, 0x005, 0x006, 0x007 car les bits 0,1 & 2 jeu filtre sont invalidés
0b11111111000 (0x07F8)0b00000000000 (0x0000)Le Rx recevra tous les messages don’t l’Id se termine par 0, 1, 2, 3, 4, 5, 6, ou 7 (0x121 = acepté, 0x0128 = eliminé)
0b11111111111 (0x07FF)0b00000000000 (0x0000)Tous les messages sont acceptés quelque soit l'identifiant



On pourrait presque dire que le masque et plus prépondérant que le filtre dans cette logique d'acceptance.
Le filtre définit une valeur de base et le masque définit une plage d'acceptance autour de la valeur du filtre.


« Modifié: mai 21, 2021, 03:20:30 pm par Dominique »
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #514 le: mai 17, 2021, 05:39:31 pm »
S'il n'y avait qu'un seul couple masque-filtre, les possibilités de filtrage seraient limitées.
Le SJA1000 permet d'utiliser 2 couples masque-filtre dont les plages d'acceptance s'additionnent : il suffit qu'un message soit acceptable par l'un des couples pour être autorisé à entrer dans la file de réception.

Contrairement au MCP2515 qui a 2 masques et 6 filtres, l'ESP32 n'a que 2 masques de 32 bits et 2 filtres de 32 bits chacun.
En fait, les masques sont définis dans 4 registres 8 bits AMR0, AMR1, AMR2, AMR3 (dits "Acceptance Mask Registers").
Et les filtres sont définis dans 4 registres 8 bits ACR0, ACR1, ACR2, ACR3 (dits "Acceptance Code Registers").
Ces 8 registres peuvent être combinés de 4 façons différentes pour réaliser le filtrage des messages. Mais, selon le cas, il faut faire attention à ce qu'on fait !

1) Un seul filtre pour messages standard (Id de 11 bits):
L'identifiant de 11 bits, le bit de mode remote RTR et les 2 premiers octets de donnée du message sont inclus dans le processus d'acceptance. Un message peut néanmoins être accepté s'il ne contient qu'un seul ou aucun octet de données ou s'il est un message de remote (bit RTR) donc sans données.


2) Deux filtres pour messages standard (Id de 11 bits):
Dans ce cas, le premier filtre compare l'Id entier (11 bits) et le RTR, ainsi que le premier octet de données. Le deuxième filtre compare seulement l'identifiant et le RTR.


3) Un seul filtre pour messages étendus (Id de 29 bits):
Ici, la totalité de l'identifiant, incluant le RTR est comparé aux registres.


4) Deux filtres pour messages étendus (Id de 29 bits):
Ici, seuls les 2 premiers octets de l'ID sont comparé et ceci pour les 2 filtres.



PS: je ne garanti pas les éventuelles erreurs dans les figures qui sont issues de la datasheet !
« Modifié: mai 17, 2021, 07:36:42 pm par Dominique »
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #515 le: mai 17, 2021, 05:39:38 pm »
Pour illustrer les possibilités - certes limitées - de filtrage CAN de l'ESP32, la bibliothèque ESP32_CAN propose des exemples correspondant aux cas ci-dessus :
Ils sont traduits de la documentation acan-esp32.pdf qui se trouve dans le dossier "extra" de la bibliothèque.

Dans chaque cas, la définition des filtres et masques tient en une seule ligne dans le setup :

ESP32CANAcceptOnlyStandardFilterDemo
  const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::acceptStandardFrames () ;
Dans ce cas, les messages étendus sont rejetés et tous les messages standards sont acceptés.

ESP32CANAcceptOnlyExtendedFilterDemo
  const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::acceptExtendedFrames () ;
Dans ce cas les messages standards sont rejetés et tous les messages étendus sont acceptés.

ESP32CANSingleStandardFilterDemo
  const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::singleStandardFilter (ACAN_ESP32_Filter::data, 0x123, 0x404) ;
Le premier argument indique si on veut recevoir :
  • data: uniquement des messages de données
  • remote: uniquement des message de remote
  • dataAndRemote: les deux.
Les bits de 0x404 sont le #2 et #10. Les bits #2 et #10 de 0x123 sont ignorés dans le filtrage. En conséquence les messages d'identifiants 0x123, 0x127, 0x523 et 0x527 sont reçus.
un "0" comme dernier argument indique que le seul message accepté sera celui dont l'identifiant est égal au 2ème argument.

ESP32CANDualStandardFilterDemo
  const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::dualStandardFilter (
    ACAN_ESP32_Filter::data, 0x123, 0x110,
    ACAN_ESP32_Filter::remote, 0x456, 0x022
  ) ;
Pour le 1er filtre, les bits de 0x110 sont les #4 et #8: bits 4 et 8 de 0x123 sont ignorés dans le filtrage. Donc les identifiants 0x023, 0x033, 0x123 and 0x133 sont recevables.
Pour le 2eme filtre, les bits de 0x022 sont les #1 et #5: bits 1 et 5 de 0x456  sont ignorés dans le filtrage. Donc les identifiants 0x454, 0x456, 0x474 et 0x476 sont recevables et s'ajoutent à ceux du 1er filtre.

ESP32CANSingleExtendedFilterDemo
  const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::singleExtendedFilter (ACAN_ESP32_Filter::data, 0x12345678, 0x20202) ;
Le 1er argument est "date" ou"remote" ou "dataAndRemote"
Le 3eme argument si "0" indique que le seul message accepté sera celui dont l'identifiant est égal au 2ème argument.
Les bits de 0x20202 sont le #1 , #9 et #17: ils sont ignorés dans le filtrage de 0x12345678.
Donc les identifiants 0x12345478, 0x1234547A, 0x12345678, 0x1234567A, 0x12365478, 0x1236547A, 0x12365678 et 0x1236567A seront acceptés.

ESP32CANDualExtendedFilterDemo
  const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::dualExtendedFilter (
    0x12345678, 0x00060000, // First filter
    0x19876543, 0x00009000  // Second filter
  ) ;
Noter que les bits 0 to 12 dans les paramètres sont toujours ignorés par ce type de filtre.
Par exemple, le 1er filtre compris entre 0x12344000 et 0x12345FFF donnera toujours le même résultat.
Dans le 2ème masque 0x00009000, le bit #12 est toujours ignoré, donc toutes les valeurs entre 0x00008000 et 0x00009FFF donneront le même résultat. Finallement, ce filtre accepte des messages data et remote étendus dont l'identifiant est de la forme 1 0010 0011 0xx0 010x xxxx xxxx xxxx (215 étendus et 215 remote) ou 1 1001 1000 0111 x00x xxxx xxxx xxxx (214 étendus, 214 remote).

après chaque définition de filtre et masque suit le begin du Can:
  const uint32_t errorCode = ACAN_ESP32::can.begin (settings, filter);
« Modifié: mai 17, 2021, 09:45:57 pm par Dominique »
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #516 le: mai 17, 2021, 05:40:25 pm »
Voici quelques exemples de programmation des filtres et masques avec la bibliothèque ACAN_ESP32 :

1) La méthode settings est crée en indiquant la vitesse du bus CAN (exemple, ici 500 kb/s):

static const uint32_t DESIRED_BIT_RATE = 500UL * 1000UL ; // 0,5 Mb/s
ACAN_ESP32_Settings settings (DESIRED_BIT_RATE) ;

2) On choisit le mode de fonctionnement: NormalMode dans tous les cas de nos réseaux ou LoopBackMode dans les exemples donnés avec la bibliothèque aux fins de test uniquement.
La définition des pins Tx et Rx pour le can sont laissées en commentaire car elles sont celles utilisées par LaBox, donc inchangées par rapport aux valeurs pas défaut.

settings.mRequestedCANMode = ACAN_ESP32_Settings::NormalMode ;
//  settings.mRxPin = GPIO_NUM_4 ; // Optional, default Tx pin is GPIO_NUM_4
//  settings.mTxPin = GPIO_NUM_5 ; // Optional, default Rx pin is GPIO_NUM_5

Si on veut utiliser un seul jeu de masque et filtre, la méthode singleStandardFilter permet de déclarer le type de message (ici data, puis le filtre, puis le masque).
Ensuite on appelle begin avec 2 arguments: settings et filter.
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::singleStandardFilter (ACAN_ESP32_Filter::data, 0x000, 0x01F) ;
 // masque = tous les Id acceptes de 00 à 1F
const uint32_t errorCode = ACAN_ESP32::can.begin (settings, filter);

Si on veut utiliser deux jeux de masque et filtre, la méthode dualStandardFilter permet de déclarer deux type de message (ici data, puis le filtre, puis le masque).
Ensuite on appelle begin avec 2 arguments: settings et filter.
const ACAN_ESP32_Filter filter = ACAN_ESP32_Filter::dualStandardFilter (
    ACAN_ESP32_Filter::data, 0x000, 0x00F,    // acceptés de 00 à 0F
    ACAN_ESP32_Filter::data, 0x010, 0x00F);   // acceptés de 10 à 1F
 const uint32_t errorCode = ACAN_ESP32::can.begin (settings, filter);

Enfin, si on ne veut pas de filtrage du tout, il n'y a aucune déclaration de filtre à faire.
Ensuite on appelle begin avec un seul argument: settings.

const uint32_t errorCode = ACAN_ESP32::can.begin (settings) ;

En pièce jointe se trouve le programme de tests que j'ai utilisé sur l'ESP32 de LaBox, en laison CAN avec un satellite qui reçoit des messages avec l'ID 25 et qui emet des messages avec l'Id 15.
« Modifié: mai 21, 2021, 03:49:47 pm par Dominique »
Cordialement,
Dominique

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #517 le: mai 17, 2021, 09:42:02 pm »
Test de la version 080 modifiée pour afficher l'HMI:

Test avec manette et Engine Driver
1) la lumière fonctionne et la lumière s'allume sur la loco (avec F5) et les deux fonctions testées aussi  le symbole * s'affiche sur l'Oled

2) Les commandes de vitesse et direction fonctionnent bien

3) Arrêt avec ma manette :

0 From Throttle : t1 19 0 1
0 From Throttle : t1 36 0 1
0 From Throttle : t1 8 0 1
0 From Throttle : t1 18 0 1
Throttle 0 <t1 19 0 1>
<t> parse command
<T1 19 0 1>
0 From Throttle : t1 2 0 1
Throttle 0 <t1 18 0 1>
<t> parse command
<T1 18 0 1>
0 From Throttle : 0
Throttle 0 <t1 2 0 1>
<t> parse command
<T1 2 0 1>
Throttle 0 <0>
<0> parse command
DCCpp PowerOff
<p0>
Throttle 0 <t1 36 0 1>
<t> parse command
<T1 36 0 1>
Throttle 0 <t1 8 0 1>
<t> parse command
<T1 8 0 1>

4) la lecture de l'adresse loco ne fonctionne plus : signal DCC sur les rails, adresse de loco 8 . La machine bouge trois fois la même adresse s'affiche 16383. (trois adresses différentes dans un deuxième test, 2 adresses et un ERROR au 3e)
Le message adresse s'affiche tardivement après déplacements.
0 From Throttle : 1
Throttle 00  From Throttle : t1 19 0 0
<1>
<1> parse command
DCCpp PowerOn
<p1>
0 Message From Throttle :
0 Message From Throttle :
Throttle 0 <t1 19 0 0>
<t> parse command
<T1 19 0 0>
readCVraw : start reading cv 29
bit : 0 iter : 3, max : 34
bit : 1 iter : 7, max : 1113
bit : 2 iter : 7, max : 1021
bit : 3 iter : 18, max : 36
bit : 4 iter : 4, max : 33
bit : 5 iter : 8, max : 32
bit : 6 iter : 14, max : 31
bit : 7 iter : 1, max : 35
verif :  iter : 3, max : 35
readCVraw : start reading cv 18
bit : 0 iter : 7, max : 36
bit : 1 iter : 12, max : 34
bit : 2 iter : 16, max : 40
bit : 3 iter : 3, max : 33
bit : 4 iter : 8, max : 34
bit : 5 iter : 13, max : 32
bit : 6 iter : 18, max : 33
bit : 7 iter : 5, max : 30
verif :  iter : 9, max : 32
readCVraw : start reading cv 17
bit : 0 iter : 14, max : 44
bit : 1 iter : 19, max : 32
bit : 2 iter : 5, max : 34
bit : 3 iter : 10, max : 34
bit : 4 iter : 15, max : 32
bit : 5 iter : 2, max : 34
bit : 6 iter : 7, max : 33
bit : 7 iter : 12, max : 31
verif :  iter : 14, max : 36
readCVraw : start reading cv 29
bit : 0 iter : 18, max : 39
bit : 1 iter : 3, max : 1113
bit : 2 iter : 3, max : 1131
bit : 3 iter : 15, max : 38
bit : 4 iter : 19, max : 41
bit : 5 iter : 1, max : 65
bit : 6 iter : 11, max : 33
bit : 7 iter : 16, max : 38
verif :  iter : 18, max : 34
readCVraw : start reading cv 18
bit : 0 iter : 4, max : 35
bit : 1 iter : 9, max : 35
bit : 2 iter : 6, max : 40
bit : 3 iter : 19, max : 36
bit : 4 iter : 6, max : 33
bit : 5 iter : 11, max : 37
bit : 6 iter : 16, max : 39
bit : 7 iter : 3, max : 33
verif :  iter : 6, max : 36
readCVraw : start reading cv 17
bit : 0 iter : 10, max : 36
bit : 1 iter : 15, max : 39
bit : 2 iter : 1, max : 38
bit : 3 iter : 6, max : 24
bit : 4 iter : 10, max : 33
bit : 5 iter : 14, max : 37
bit : 6 iter : 19, max : 36
bit : 7 iter : 6, max : 31
verif :  iter : 10, max : 35
readCVraw : start reading cv 29
bit : 0 iter : 14, max : 38
bit : 1 iter : 3, max : 1092
bit : 2 iter : 7, max : 1076
bit : 3 iter : 11, max : 38
bit : 4 iter : 17, max : 33
bit : 5 iter : 2, max : 40
bit : 6 iter : 7, max : 37
bit : 7 iter : 13, max : 37
verif :  iter : 14, max : 33
readCVraw : start reading cv 18
bit : 0 iter : 19, max : 35
bit : 1 iter : 5, max : 34
bit : 2 iter : 10, max : 40
bit : 3 iter : 15, max : 37
bit : 4 iter : 2, max : 36
bit : 5 iter : 6, max : 19
bit : 6 iter : 12, max : 36
bit : 7 iter : 17, max : 35
verif :  iter : 2, max : 36
readCVraw : start reading cv 17
bit : 0 iter : 6, max : 38
bit : 1 iter : 11, max : 36
bit : 2 iter : 15, max : 37
bit : 3 iter : 2, max : 39
bit : 4 iter : 2, max : 65
bit : 5 iter : 12, max : 36
bit : 6 iter : 17, max : 36
bit : 7 iter : 4, max : 35
verif :  iter : 5, max : 27

A suivre.
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #518 le: mai 17, 2021, 09:48:37 pm »
tiens, c'est déjà mieux que mes tests

La lumière s'allume effectivement en cliquant sur "light" puis F1 (ou F2 ou F3 ou F4). un clic sur light eteint la lumière.
Je ne lis toujours pas l'adresse
Je continue les tests.
« Modifié: mai 17, 2021, 10:01:01 pm par Dominique »
Cordialement,
Dominique

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #519 le: mai 17, 2021, 10:07:49 pm »
Curieux, dans mon relevé sur le serial, il n'y a pas de tentative de lecture du CV1 ...
Cordialement

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #520 le: mai 17, 2021, 10:11:55 pm »
Curieux, dans mon relevé sur le serial, il n'y a pas de tentative de lecture du CV1 ...

ne serait-ce pas le transmetteur radio qui bloque le RxTx de l'USB ?
Cordialement,
Dominique

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #521 le: mai 17, 2021, 10:25:21 pm »
Non, pas de changement, les messages sont propres,
seuls les CV 29, 18 et 17 sont lus - trois fois.
Cordialement

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #522 le: mai 18, 2021, 09:22:02 am »
Pour les fonctions, je suis d'accord, ça ne marche pas bien, je dois repasser un peu de temps.
Pour les vitesses, j'ai testé avec EngineDriver et c'est conforme aux spécifications : la vitesse la plus basse est le cran DCC '0' (arrêt total) qui est atteinte soit au curseur, soit avec le bouton arrêt de l'application sous le curseur. Le bouton 'Idle', qui est une icône de main sur EngineDriver, envoie la vitesse DCC '1' qui  selon la norme est un arrêt d'urgence. Je dois essayer avec WiThrottle mais je ne vois pas ce qui pourrais changer... Pour la lecture de CV, je n'ai pas les moyens de tester pour le moment...

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3045
  • 100% Arduino et N
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #523 le: mai 18, 2021, 12:15:28 pm »
Thierry,
Je suis d'accord avec toi pour les vitesses sur Withrottle: c'est la même chose avec une curiosité : en quittant Withrottle, la vitesse affichée sur l'Oled passe à 0 mais la loco ne s'arrête pas. Sur le moniteur le throttle 5 est disconnected après la commande Q
11:59:08.755 -> 5 From Throttle : MT-S18<;>r
11:59:08.860 -> 5 From Throttle : Q
11:59:08.860 -> Throttle 5 MT-S18<;>r
11:59:08.860 -> 5 -> <T1 18 34 0>MT-S18<;>
11:59:08.860 -> Locomotives ------------------
11:59:08.860 -> 0 : Loco reg:1 id:18 max:128      +/-speed:-33      functions: 1
11:59:08.860 -> 1 : Loco reg:2 id:14 max:128      +/-speed:0      functions:
11:59:08.959 -> Throttle 5 Q
11:59:08.959 -> Converter : client 5 disconnected

En ce qui concerne la lecture des CVs, rien ne marche (comme Michel) et pourrais-tu me dire où il faut regarder ou comparer le code ?
Ma mesure de courant sur l'Oled a l'air correcte (environ 50 mA avec ma petite loco, <5mA quand elle s'arrête suite à un mauvais contact).
Le message ERROR s'affiche juste après l'échec de la lecture du CV1 mais juste une fraction de seconde !
A la fin le throttle est déconnecté.

11:51:23.777 -> readCVraw : start reading cv 29
11:51:23.850 -> bit : 0 iter : 15, max : 5
11:51:24.484 -> bit : 1 iter : 6, max : 8
11:51:25.152 -> bit : 2 iter : 5, max : 7
11:51:25.787 -> bit : 3 iter : 0, max : 5
11:51:26.458 -> bit : 4 iter : 6, max : 6
11:51:27.122 -> bit : 5 iter : 1, max : 7
11:51:27.760 -> bit : 6 iter : 0, max : 5
11:51:28.420 -> bit : 7 iter : 12, max : 6
11:51:29.064 -> verif :  iter : 14, max : 5
11:51:29.666 -> readCVraw : start reading cv 1
11:51:29.734 -> bit : 0 iter : 10, max : 4
11:51:30.392 -> bit : 1 iter : 1, max : 11
11:51:31.020 -> bit : 2 iter : 7, max : 4
11:51:31.679 -> bit : 3 iter : 6, max : 5
11:51:32.336 -> bit : 4 iter : 12, max : 6
11:51:32.977 -> bit : 5 iter : 3, max : 5
11:51:33.645 -> bit : 6 iter : 2, max : 3
11:51:34.266 -> bit : 7 iter : 11, max : 7
11:51:34.957 -> verif :  iter : 6, max : 5
11:51:35.616 -> readCVraw : start reading cv 29
11:51:35.683 -> bit : 0 iter : 3, max : 3
11:51:36.320 -> bit : 1 iter : 1, max : 5
11:51:36.986 -> bit : 2 iter : 9, max : 5
11:51:37.636 -> bit : 3 iter : 12, max : 5
11:51:38.292 -> bit : 4 iter : 0, max : 5
11:51:38.927 -> bit : 5 iter : 17, max : 6
11:51:39.596 -> bit : 6 iter : 5, max : 4
11:51:40.259 -> bit : 7 iter : 17, max : 4
11:51:40.891 -> verif :  iter : 19, max : 6
11:51:41.473 -> readCVraw : start reading cv 1
11:51:41.545 -> bit : 0 iter : 8, max : 6
11:51:42.208 -> bit : 1 iter : 17, max : 7
11:51:42.870 -> bit : 2 iter : 19, max : 5
11:51:43.490 -> bit : 3 iter : 18, max : 5
11:51:44.159 -> bit : 4 iter : 14, max : 6
11:51:44.825 -> bit : 5 iter : 8, max : 4
11:51:45.449 -> bit : 6 iter : 18, max : 4
11:51:46.115 -> bit : 7 iter : 2, max : 3
11:51:46.777 -> verif :  iter : 18, max : 4
11:51:47.435 -> readCVraw : start reading cv 29
11:51:47.502 -> bit : 0 iter : 7, max : 5
11:51:48.154 -> bit : 1 iter : 17, max : 5
11:51:48.815 -> bit : 2 iter : 5, max : 5
11:51:49.474 -> bit : 3 iter : 0, max : 5
11:51:50.100 -> bit : 4 iter : 2, max : 3
11:51:50.769 -> bit : 5 iter : 11, max : 6
11:51:51.397 -> bit : 6 iter : 3, max : 3
11:51:52.058 -> bit : 7 iter : 0, max : 3
11:51:52.718 -> verif :  iter : 10, max : 6
11:51:53.322 -> readCVraw : start reading cv 1
11:51:53.389 -> bit : 0 iter : 2, max : 5
11:51:54.039 -> bit : 1 iter : 11, max : 6
11:51:54.705 -> bit : 2 iter : 7, max : 5
11:51:55.326 -> bit : 3 iter : 12, max : 6
11:51:55.977 -> bit : 4 iter : 4, max : 6
11:51:56.630 -> bit : 5 iter : 6, max : 3
11:51:57.284 -> bit : 6 iter : 8, max : 5
11:51:57.955 -> bit : 7 iter : 10, max : 6
11:51:58.626 -> verif :  iter : 9, max : 5
11:52:09.962 -> Converter : client 5 disconnected

Une remarque au passage :
La manette de michel démarre le DCC à la fin de son setup (elle envoie <1>, même plusieurs fois)
Withrottle n'envoie <1> qu'après la connexion wifi, ce qui est normal
Mais pour récupérer l'adresse DCC d'une loco, il faut donc connecter un Throttle au préalable. La commande du menu HMI ne le fait pas !
Ne serait-il pas utile d'établir le DCC (comme <1>) juste avant une lecture d'adresse, quite à le couper juste après s'il n'y a aucun throttle connecté ?
Cordialement,
Dominique

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : projet centrale "LaBox" wifi DCC++ Can
« Réponse #524 le: mai 18, 2021, 09:31:56 pm »
Nouvelle version 0.8.1 :

Corrige le bouton 'Stop' de WiThrottle qui mets bien maintenant la vitesse DCC à 1 (arrêt urgence).
Corrige le bouton 'Idle' de WiThrottle qui mets bien maintenant la vitesse DCC à 0 (arrêt total normal).
Stoppe l'effet 'timeout' de déconnexion des throttles pendant la lecture de l'adresse de la loco.
Corrige un problème de compilation sur l'IDE 2.0 Beta 6.
Allumage du DCC si une demande de lecture d'adresse de loco a été faite au menu.
Ajout de la led de statut pendant le setup() dans labox.ino (merci Dominique).
Retrait de la répétition des fonctions pour le moment.