IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

CAN entre PC et Arduino


Sujet :

Arduino

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut CAN entre PC et Arduino
    bonsoir
    je suis une étudiante ingénieur en génie électrique et je suis entrain de faire un projet fin d'étude.
    j'utilise dans mon projet des cartes arduinos qui font l'acquisition des données puis les affichent sur PC, la communication entre les cartes et le PC se fait avec le bus CAN.
    j'ai un petit problème dans la communication concernant la bibliothèque de bus CAN dans l'arduino.
    je trouve sur le net des bibliothèques qui envoient les données sur 8 octets (c'est logique puisque la taille maximale de la trame de données de bus can est de 8 octets) mais le problème que chaque donnée s'écrit seulement sur un octet (8 bits) donc si j'envoie par exemple des nombres supérieures à 2 exposant 8, la carte arduino retourne seulement le 8 premiers bits du nombre envoyé donc retourne une valeur fausse.
    y'a il quelqu'un qui a une idée ou une autre sorte de bibliothèque arduino pour un bus can qui permet l'envoie de tous nombres de taille inférieur ou égale 8 octets et n'est pas 8 bits ???
    cordialement

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Je connais un peu le CAN, pas trop l'Arduino (en plus "Arduino" est un système qui comprend un nombre conséquent de microcontrôleurs, tous différents), . En CAN, la communication se fait sous forme de messages. Un message, c'est un ensemble CobID + 8 bytes. On crée le message (souvent une instance de la classe message), on le remplit et on appelle une function sendMessage avec le message en paramètre. En réception, on a une fonction genre PopMessage avec le message reçu en paramètre. On peut appeler différentes méthodes de l'instance du message pour lire son contenu. C'est là le principe en POO, valable côté PC. L'Arduino utilise comme langage de programmation une espèce de sous-C, donc pas de classes... Se référer à la documentation de la lib CAN du micro avec lequel tu travailles.

    A+

    Pfeuh

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    bonsoir,

    utilises-tu un shield ? On peut voir le code qui te sert à transmettre les données ?

  4. #4
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Bonjour,

    Je ne pense pas que ton problème vienne du fait que les données soient codées sur 8 bits, c'est même rassurant.

    Par contre :
    la carte arduino retourne seulement le 8 premiers bits du nombre envoyé donc retourne une valeur fausse.
    .

    Pourrais tu nous donner cette portion de code qui relit l'écho du message envoyé sur le bus CAN ? Quand tu précises que la carte (la fonction je présume) retourne une valeur fausse, c'est peut être tu ne lui demandes pas de lire l'intégralité du message ?

    Cordialement, deletMe
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonsoir j'ai résolu ce problème c'est une mauvaise manipulation de bibliothèque. mais j'ai un autre problème, l'envoie de donnée ça marche mais n'est pas de façon ordonnée parfois l'arduino affiche des données fausses voilà mes codes pour l'envoie et la réception j'utilise 2 arduino méga. je veux envoyé 8 entier et 15 float par trame de 8 octet.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    //*****************************************code d'envoie****************************
     // demo: CAN-BUS Shield, send data
    #include <mcp_can.h>
    #include <SPI.h>
     
    // the cs pin of the version after v1.1 is default to D9
    // v0.9b and v1.0 is default D10
    const int SPI_CS_PIN = 53;
     
    MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
     
    void setup()
    {
        Serial.begin(9600);
     
        while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
        {
            Serial.println("CAN BUS Shield init fail");
            Serial.println(" Init CAN BUS Shield again");
            delay(100);
        }
        Serial.println("CAN BUS Shield init ok!");
    }
     
    typedef union {
      byte octet[8];
      int entier[4];
    } trame_can1;
     
    trame_can1 message1;
    trame_can1 message2;
     
    typedef union {
      byte octet[8];
      float flottant[2];
    } trame_can2;
     
    trame_can2 message3;
    trame_can2 message4;
    trame_can2 message5;
    trame_can2 message6;
    trame_can2 message7;
    trame_can2 message8;
    trame_can2 message9;
    trame_can2 message10;
     
    void loop()
    {
      message1.entier[0]=10 ;
      message1.entier[1]= 20;
      message1.entier[2]= 30;
      message1.entier[3]= 40;
     
      message2.entier[0]=50 ;
      message2.entier[1]= 60;
      message2.entier[2]= 70;
      message2.entier[3]= 80;
     
      message3.flottant[0]= 0.1;
      message3.flottant[1]= 0.2;
     
      message4.flottant[0]=0.3 ;
      message4.flottant[1]= 0.4;
     
      message5.flottant[0]=0.5 ;
      message5.flottant[1]= 0.6;
     
      message6.flottant[0]= 0.7;
      message6.flottant[1]= 0.8;
     
      message7.flottant[0]= 0.9;
      message7.flottant[1]=1.1 ;
     
      message8.flottant[0]= 1.2;
      message8.flottant[1]= 1.3;
     
      message9.flottant[0]= 1.4;
      message9.flottant[1]= 1.5;
     
      message10.flottant[0]=1.6 ;
      message10.flottant[1]=1.7 ;
     
        // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
        CAN.sendMsgBuf(0x00, 0, 8,message1.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message2.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message3.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message4.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message5.octet);
        // delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message6.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message7.octet);
        // delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message8.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message9.octet);
        //delay(100);
        CAN.sendMsgBuf(0x00, 0, 8,message10.octet);
        //delay(100);
     
    }
     
    //*****************************code de réception***********************
     
    // demo: CAN-BUS Shield, receive data with check mode
    // send data coming to fast, such as less than 10ms, you can use this way
    // loovee, 2014-6-13
     
    #include <SPI.h>
    #include "mcp_can.h"
     
    // the cs pin of the version after v1.1 is default to D9
    // v0.9b and v1.0 is default D10
    const int SPI_CS_PIN = 53;
     
    MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
     
    typedef union {
      byte octet[8];
      int entier[4];
    } trame_can1;
     
    trame_can1 message1;
    trame_can1 message2;
     
    typedef union {
      byte octet[8];
      float flottant[2];
    } trame_can2;
     
    trame_can2 message3;
    trame_can2 message4;
    trame_can2 message5;
    trame_can2 message6;
    trame_can2 message7;
    trame_can2 message8;
    trame_can2 message9;
    trame_can2 message10;
     
    void setup()
    {
        Serial.begin(9600);
     
        while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
        {
            Serial.println("CAN BUS Shield init fail");
            Serial.println(" Init CAN BUS Shield again");
            delay(100);
        }
        Serial.println("CAN BUS Shield init ok!");
    }
     
    void loop()
    {
        unsigned char len = 0;
        unsigned char buf1[8];
        unsigned char buf2[8];
        unsigned char buf3[8];
        unsigned char buf4[8];
        unsigned char buf5[8];
        unsigned char buf6[8];
        unsigned char buf7[8];
        unsigned char buf8[8];
        unsigned char buf9[8];
        unsigned char buf10[8];
     
        if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
        {
            CAN.readMsgBuf(&len, buf1);    // read data,  len: data length, buf: data buf
            delay(100);
            CAN.readMsgBuf(&len, buf2);  
            delay(100);  
            CAN.readMsgBuf(&len, buf3);
            delay(100);
            CAN.readMsgBuf(&len, buf4);  
            delay(100);  
            CAN.readMsgBuf(&len, buf5);  
            delay(100);
            CAN.readMsgBuf(&len, buf6);  
            delay(100);  
            CAN.readMsgBuf(&len, buf7);  
            delay(100);
            CAN.readMsgBuf(&len, buf8);  
            delay(100);  
            CAN.readMsgBuf(&len, buf9);
            delay(100);  
            CAN.readMsgBuf(&len, buf10);  
            delay(100);
     
            //unsigned char canId = CAN.getCanId();
            //Serial.println("-----------------------------");
     
            //Serial.print("Get data from ID: ");
            //Serial.println(canId,HEX);
     
              for(int i = 0; i<8; i++)    // print the data
            {
             message1.octet[i]=buf1[i];
             message2.octet[i]=buf2[i];
             message3.octet[i]=buf3[i];
             message4.octet[i]=buf4[i];
             message5.octet[i]=buf5[i];
             message6.octet[i]=buf6[i];
             message7.octet[i]=buf7[i];
             message8.octet[i]=buf8[i];
             message9.octet[i]=buf9[i];
             message10.octet[i]=buf10[i]; 
            }
     
     
            Serial.print(message1.entier[0]);
            Serial.print(" ");
            Serial.print(message1.entier[1]);
            Serial.print(" ");
            Serial.print(message1.entier[2]);
            Serial.print(" ");
            Serial.print(message1.entier[3]);
            Serial.print(" ");
     
            Serial.print(message2.entier[0]);
            Serial.print(" ");
            Serial.print(message2.entier[1]);
            Serial.print(" ");
            Serial.print(message2.entier[2]);
            Serial.print(" ");
            Serial.print(message2.entier[3]);
            Serial.print(" ");
     
            Serial.print(message3.flottant[0]);
            Serial.print(" ");
            Serial.print(message3.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message4.flottant[0]);
            Serial.print(" ");
            Serial.print(message4.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message5.flottant[0]);
            Serial.print(" ");
            Serial.print(message5.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message6.flottant[0]);
            Serial.print(" ");
            Serial.print(message6.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message7.flottant[0]);
            Serial.print(" ");
            Serial.print(message7.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message8.flottant[0]);
            Serial.print(" ");
            Serial.print(message8.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message9.flottant[0]);
            Serial.print(" ");
            Serial.print(message9.flottant[1]);
            Serial.print(" ");
     
            Serial.print(message10.flottant[0]);
            Serial.print(" ");
            Serial.print(message10.flottant[1]);
            Serial.print(" ");
     
            Serial.println();
     
            delay(100);
      }}


    voilà ce que affiche l'arduino réceptrice :

    Nom : Présentation1.jpg
Affichages : 719
Taille : 58,3 Ko

Discussions similaires

  1. Routage entre deux cartes réseau
    Par flotho dans le forum Réseau
    Réponses: 4
    Dernier message: 13/02/2013, 11h57
  2. Bascule entre deux cartes reseau
    Par jawed dans le forum Windows
    Réponses: 3
    Dernier message: 18/05/2009, 00h40
  3. Réponses: 4
    Dernier message: 21/11/2008, 10h54
  4. [MySQL] Écart années entre deux dates
    Par romeskira dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/10/2008, 08h25
  5. Problème entre deux cartes réseaux
    Par Azharis dans le forum Administration
    Réponses: 6
    Dernier message: 12/07/2006, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo