Auteur Sujet: Bus CAN et Décimal  (Lu 41613 fois)

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Bus CAN et Décimal
« le: avril 13, 2020, 03:31:58 pm »
Bonjour

depuis 2 semaines, Je test et re-test le CAN pour une application domotique  personnelle ( capteurs Température et hygrométrie LCD .. etc)
j'ai épluché une bonne quantité de croquis Arduino, lue toute les pages du forum, mais Rien sur le sujet.

bien vue une histoire de "Union" (non pas le magazine) la fonction qui coupe et colle les valeurs de plus "255" ... rien comprit.

donc j'ai laissé tomber le CAN pour voir du coter  du Rs485/ModBus, mais la horreur, la liaison filaire n'est pas aussi simple,
et le Code Arduino indigeste (pour un débutant, oui moi)

re-donc retour au CAN     8)

ma question, ma demande,  un exemple de croquis pour envoie et réception de valeur décimal  pour de la mesure ambiante.
... du 18.40°C ou -12°c
bref des valeurs qui existe sur terre.

Merci
(un bleu-bite qui découvre l'Arduino)   :o
 

Tony04

  • Hero Member
  • *****
  • Messages: 569
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #1 le: avril 13, 2020, 04:06:28 pm »
Bonjour,

exceptionnellement, confinement oblige, voici en PJ 2 sketchs (émission/réception) de démo pour le bus CAN.

Pourquoi exceptionnellement car sur ce site on ne traite que de train miniature, mais comme j'ai envoyé ces sketchs à un ami qui tente de s'y mettre aussi, pourquoi ne pas vous en faire profiter, mais à vous de vous débrouiller avec.

Cordialement
Antoine

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #2 le: avril 13, 2020, 04:50:43 pm »
... merci beaucoup, oui je pensais que ma demande était limite, mais lorsque on désespère  :'(

bon je recâble les Arduino en version CAN, avec capteur DHT22 et afficheur LCD et repart en test.

vais enfin pouvoir lire mes capteurs de température après la virgule   8)

un truc, Les valeurs "analogique - décimal" dans le monde du modélisme ferroviaire c'est pas utile ??

encore merci


Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1716
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #3 le: avril 13, 2020, 05:32:56 pm »
Bonjour,

Quelle bibliothèque utilisez vous ? (je fais une exception aussi)
Cordialement

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #4 le: avril 13, 2020, 05:59:13 pm »
Re

.. "Quelle bibliothèque utilisez vous ?"  rien de figer pour l'instant,
 la mcp_can de Seeed-Studio ou mcp2515  de https://github.com/autowp/arduino-mcp2515


merci pour  l'exception ..... Ah c Bo la vie  :)



Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1716
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #5 le: avril 13, 2020, 06:13:41 pm »
Je répond également parce que finalement ce n'est pas spécifique à votre problème,

En fait votre problème n'est pas lié au CAN, vous l'auriez avec n'importe quel réseau.

Votre problème est de coller les octets constituant votre nombre à virgule dans les octets du message.

Pour émettre votre message vous utilisez un truc du genre

can.sendMsgBuf(id,type,data,longueur);

où id est l'identifiant du message, type le type (0 = standard, 1 = extended), data un pointeur vers, au plus, une successions de 8 octets de données et longueur la longueur en octets, un byte.

Pour envoyer une variable v de type float dans un message standard, il faut écrire :

can.sendMsgBuf(id,0,(byte *)(&v),sizeof(v));

&v donne un pointeur sur v, (byte *) le converti en un pointer sur un octet, sizeof(v) retourne la taille en octets de v, c'est à dire 4 mais c'est mieux de l'écrire comme ça.

À la réception, vous appelez :

can.readMsgBuf(data, longueur);

Où data est un pointeur vers, au plus, une successions de 8 octets de données et longueur un pointeur vers un byte ou sera écrit la longueur en octets du message reçu.

Si v2 est votre variable de type float où vous souhaitez recevoir la donnée et len un byte où vous souhaiter voire écrit la longueur, il faut écrire :

can.readMsgBuf((byte *)(&v2), &len);
Cordialement

Tony04

  • Hero Member
  • *****
  • Messages: 569
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #6 le: avril 13, 2020, 06:44:27 pm »
Bonjour et merci Jean-Luc,

je viens d'apprendre quelque chose même si mes besoins ne sont pas des nombres à virgule que j'envoie.

Bon lundi soir de Pâques
Cordialement
Antoine

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1716
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #7 le: avril 13, 2020, 06:54:55 pm »
Bonsoir Antoine,

Joyeuses Pâques à toi également

Un dernier truc. Il faut faire attention à l'endianess. Si le message est transmis entre une plateforme où les octets ne sont pas rangés dans le même ordre, il y aura un soucis. Exemple sur un nombre entier de 4 octets (32 bits) que l'on écrit 0x11223344 peut être stocké en little endian, vu comme un tableau d'octet, il s'écrirait { 0x44, 0x33, 0x22, 0x11 } ou big endian : { 0x11, 0x22, 0x33, 0x44 }

En pratique, autour de l'Arduino, il n'y a pas de soucis : un AVR, un ARM, un ESP ou un PIC32, tout le monde est little Endian.
Cordialement

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #8 le: avril 14, 2020, 10:35:03 am »
... mais non c'est pas des Sauvages sur Locoduino, tu vois!!

Bonjour

merci pour le ++ d'info sur le sujet  8)

je revient avec des croquis sous l'bras.

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #9 le: avril 22, 2020, 06:54:15 pm »
Bonsoir

Recu hier mes 5 "Module Bus-CAN SBC-CAN01"  de chez JOY-hic, refait le câblage en plus propre.

avec la biblio ACAN / ACAN2515
 j'ai Tester les croquis (2BP et 2 Led) donner sur le super Tuto ACAN number ON ,  c'est implacable .. heu ... impeccable.

Donc me revoilà avec ma virgule   :o   

j'ai mis en application une "recette"  donnée par  skywodd sur le forum Arduino.

"Tu multiplies ton float par le nombre de dizaines après la virgule,
 tu le convertis en int(),
tu l'envoies à l'Arduino.

Coté Arduino, tu réceptionnes ce int en le recomposant,
tu le divises par le nombre de dizaine que tu avais derrière la virgule,
tu le convertis en float()."



Et c'est impeccable, enfin presque  ;D

pour le croquis émission rien a dire,  le problème c'est pour la réception.

comprend pas comment diviser quoi ou ??!!

int ival = ????
et
float val = ival / 100.0;


voila mes super Croquis.

RE-Edit du samedi 25
j'ai supprimé les croquis, c'est une horreur  :D
mais je continue a avancer.

info du jour https://www.hackster.io/monkbroc/poor-man-s-can-bus-602636
du super light  :)







« Modifié: avril 25, 2020, 12:24:32 pm par JeeLet »

Tony04

  • Hero Member
  • *****
  • Messages: 569
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #10 le: avril 22, 2020, 07:21:55 pm »
Bonsoir Jeelet,

comme ton problème n'a rien à voir avec les trains et que visiblement tu cherches et trouves des réponses sur d'autres forums je pense que les exceptions à la règle sont arrivées à leur termes en tous les cas pour moi.

Désolé, le règlement c'est le règlement.

Bonne chance pour la suite de ton projet.

Cordialement
Antoine

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #11 le: avril 22, 2020, 07:34:05 pm »
bonsoir Antoine

... mais non " tu cherches et trouves des réponses sur d'autres forums" ... j'ai fais aucune demande sur les autres Forum.
seulement du copier coller de bout de code de  Si de Là.

et j'ai pas voulue encore te déranger par mail, tu a un big projet a géré ( le peut de compris)

bon c pas grave

A+

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1716
    • Voir le profil
Re : Re : Bus CAN et Décimal
« Réponse #12 le: avril 26, 2020, 05:06:26 pm »
j'ai mis en application une "recette"  donnée par  skywodd sur le forum Arduino.

"Tu multiplies ton float par le nombre de dizaines après la virgule,
 tu le convertis en int(),
tu l'envoies à l'Arduino.

Coté Arduino, tu réceptionnes ce int en le recomposant,
tu le divises par le nombre de dizaine que tu avais derrière la virgule,
tu le convertis en float()."


C'est pas terrible comme recette.  :o

Je te suggère plutôt de passer par une union (d'ailleurs je vais suggérer à Pierre Molinaro d'ajouter un accès en float aux CANMessage).

typedef union {
  float    f;
  uint32_t i;
} floatOr32bitsInt;

Ensuite côté émetteur :

floatOr32bitsInt tmp;
tmp.f = val; /* val c'est ton flottant */
message.data32[0] = tmp.i;
controleurCAN.tryToSend(message);

Côté récepteur :

if (controleurCAN.receive(message)) {
  floatOr32bitsInt tmp;
  tmp.i = message.data32[0];
  float val = tmp.f;
  ...
}
Cordialement

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #13 le: avril 27, 2020, 11:49:48 am »
Jean-Luc Bonjour

oui  Pierre Molinaro a fait un super boulot avec ACAN, j'ai même faillie le contacter (toi aussi   ;)

mais après une semaine a essayer de comprendre la mis en pratique de la biblio de pierre, j'ai jeter l'éponge hier :)
( le fichier pdf fournie avec la lib est super pour les anglophone )

je suis repartir sur mcp.can de SeeedStudio, les exemples son super nombreux sur le web ....... mais avec ton message, demi-tour   :)


et pour "suggérer à Pierre Molinaro d'ajouter un accès en float aux CANMessage)" ..... oui il ya une vrais demande sur un bus CAN Domotique filaire.

mais beaucoup abandonne faute d'exemple mis en pratique  :(

un big merci pour ton aide, je regarde bien ta réponse.

à ce soir  (sur le forum)

MERCI

JeeLet

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Bus CAN et Décimal
« Réponse #14 le: avril 27, 2020, 02:24:29 pm »
Re
oui j'ai papy j'ai pas pu attendre ce soir  :o


c'est impeccable, magnifique, du 1er coup, j'en revient pas  ::)   


une recopie d'écran des 2 IDE en service



les 2 croquis

Emi_dht_ACAN2515_v1.ino

/*
 * Locoduino: 1er mai 2020
 * https://www.locoduino.org/spip.php?article268
 *
 * Envoi et Réception de valeur numerique a deux digit apres la virgule
 * ( valeur positif ou négatif)
 *
 * sur une base de Locoduino (JL)
 * avec Biblio ACAN de pierre Molinaro https://github.com/pierremolinaro/acan2517
 * bricolage par : JeeLet
 * -X- compil des exemples 1 et 2 (partie eraser)
 * -X- Ajout partie float "virgule" et valeur négatif
 * -o- reste ajout les capteurs (tres simple avec dhtNEW de Rob Tillaart)
 * -o-
 */
// ------------- Debut Pgm Emission ----------------

 // ----- inclusion des bibliothèques -------------
   #include <ACAN2515Settings.h>       // les reglages
   #include <ACAN2515.h>               // le controleur
   #include <CANMessage.h>             // les messages

// ------ config des E/S -----------
   static const uint8_t MCP2515_CS  = 10;  // pin SPI_CS
   static const uint8_t MCP2515_INT = 2;   // pin interruption

// ------- les déclarations ----------
// objet de type ACAN2515 est instancié pour gérer le MCP2515
 
   ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); //pin CS,SPI ,pin INT.
   static const uint32_t FREQUENCE_DU_QUARTZ = 8000000; // quartz du MCP2515 en hertz
   static const uint32_t FRENQUENCE_DU_BUS_CAN = 125000;  // fréquence du bus CAN

   CANMessage message;    // objets pour les messages CAN en emission.

// ------ début du defini union ----
  typedef union     
    {
    float    f;   // valeur f  ?
    uint32_t i;   // valeur i ?
    }
    floatOr32bitsInt; // ..
// ---------------fin  ------------------

  float vala = 32.45;   // simulation Valeur en virgule flottante
       
  static uint32_t milliEnvoi = 0;         // Tempo d’envoi
     
// -------------- Setup --------------
  void setup()  {
  Serial.begin(9600);           // com série
  SPI.begin();                  // bus SPI
 
  Serial.println("Configuration du MCP2515");
  ACAN2515Settings configuration(FREQUENCE_DU_QUARTZ, FRENQUENCE_DU_BUS_CAN);
 
// ----  Demarrage et control d'erreur du CAN ----
  const uint32_t codeErreur = CAN.begin(configuration, [] { CAN.isr(); });
   
    if (codeErreur == 0)   
      {
      Serial.println("Configuration ok");
      }
    else
      {
      Serial.println("Probleme de connexion");
      while (1);
      }
    message.len = 4;      //message avec 4 octets de donnee
 }
 
//------------ Loop --------------
  void loop()
 {
  uint16_t milliEncour = millis();
    if (milliEncour - milliEnvoi >= 2000)  //envoi toutes les 2 secondes
    {
    floatOr32bitsInt tmp;
    tmp.f = vala; /* val c'est ton flottant */
    message.data32[0] = tmp.i; 
    CAN.tryToSend(message); // envoi du message

      Serial.print(tmp.f);
      Serial.print(" --Emi--> ");
      Serial.println(message.data32[0]);
   
      milliEnvoi = milliEncour;     // reset tempo
     }
 }
// ----------- Fin du pgm ------------------



Rec_dht_ACAN2515_v1.ino

/*
 * Locoduino: 1er mai 2020
 * https://www.locoduino.org/spip.php?article268
 *
 * Envoi et Réception de valeur numerique a deux digit apres la virgule
 * ( valeur positif ou négatif)
 *
 * sur une base de Locoduino (JL)
 * avec Biblio ACAN de pierre Molinaro https://github.com/pierremolinaro/acan2517
 * bricolage par : JeeLet
 * -X- compil des exemples 1 et 2 (partie eraser)
 * -X- Ajout partie float "virgule" et valeur négatif
 * -o- reste ajout les capteurs (tres simple avec dhtNEW de Rob Tillaart)
 * -o-
 */
// ------------- Debut Pgm Reception ----------------

 // ----- inclusion des bibliothèques -------------
   #include <ACAN2515Settings.h>       // les reglages
   #include <ACAN2515.h>               // le controleur
   #include <CANMessage.h>             // les messages

// ------ config des E/S -----------
   static const uint8_t MCP2515_CS  = 10;  // pin SPI_CS
   static const uint8_t MCP2515_INT = 2;   // pin interruption

// ------- les déclarations ----------
// objet de type ACAN2515 est instancié pour gérer le MCP2515
 
   ACAN2515 CAN(MCP2515_CS, SPI, MCP2515_INT); //pin CS,SPI ,pin INT.
   static const uint32_t FREQUENCE_DU_QUARTZ = 8000000; // quartz du MCP2515 en hertz
   static const uint32_t FRENQUENCE_DU_BUS_CAN = 125000;  // fréquence du bus CAN

    CANMessage message;     // objets pour les messages CAN

// ------ début du defini union ----   
    typedef union     
    {
    float    f;
    uint32_t i;
    }
    floatOr32bitsInt; // ..
// ---------------fin  ------------------
   
// -------------- Setup --------------
  void setup()  {
  Serial.begin(9600);           // com série
  SPI.begin();                  // bus SPI
 
  Serial.println("Configuration du MCP2515");
  ACAN2515Settings configuration(FREQUENCE_DU_QUARTZ, FRENQUENCE_DU_BUS_CAN);
 
// ----  Demarrage et control d'erreur du CAN ----
  const uint32_t codeErreur = CAN.begin(configuration, [] { CAN.isr(); });
   
  if (codeErreur == 0) 
    {
    Serial.println("configuration ok");
    }
  else
    {
    Serial.println("Probleme de connexion");
    while (1);
    }
 }

//------------ Loop --------------
  void loop()
 {
   if (CAN.receive(message))  // signal arrive message CAN
    {
    floatOr32bitsInt tmp;
    tmp.i = message.data32[0];
    float val = tmp.f;
 
    Serial.print(tmp.i);
    Serial.print(" --Rec--> ");
    Serial.println(tmp.f); 
    }
 }
// -------------- fin Pgm -------------------


valeur décimal, négatif ou positif a 2digit après la virgule passe bien sur le Bus CAN ( un grand pas pour l'humabinaire)

Jean-Luc T génial ( merci a toi Antoine d'avoir amorcer la pompe  à connaissance)

Ah oui, une question :
comment pour ajouter plusieurs mesures de capteur, plusieurs sondes ???

 8)