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

Raspberry Pi Discussion :

Connexion Arduino & Raspberry en USB avec Serial


Sujet :

Raspberry Pi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut Connexion Arduino & Raspberry en USB avec Serial
    Bonjour les amis,

    Je suis actuellement en train de faire une machine à casino pour une de mes association.

    le tout fonctionne, et est fait à base d'Arduino. ça clignote partout, les moteurs s’enchaînent dans tous les sens, c'est super !

    Maintenant, j'aimerai que mon Raspberry Pi II lance un son lorsque mon Arduino lui envoi un ordre.

    Pour cela j'ai connecté l'Arduino et le Rpi ensemble avec une connexion serie USB :

    je reçoit donc les message de mon arduino avec script en python su le Rpi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
    
    import serial
    ser = serial.Serial('/dev/ttyACM0', 9600)
    while 1 :
      	print(ser.readline())
    Il faudrait que lorsque le message de mon Arduiino contient un code, du type "01000100" Mon raspberry exécute cette commande moc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mocp -p /home/pi/music/monson.mp3
    et si le code est "00021010" on joue un autre son.

    comment puis je m'y prendre ?

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonjour,

    côté Arduino tu as la fonction Serial.println(). Vérifie que la vitesse du port USB Arduino soit la même que la vitesse du port USB du Py (dans ton code c'est à 9600 bauds).

    Côté Py, tu peux appeler des commandes shell avec Python :
    - Python 2 : https://docs.python.org/2/library/su...ule-subprocess
    - Python 3 :https://docs.python.org/3.6/library/...ule-subprocess

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Salut Auteur et merci de ta réponse.

    Donc oui coté Arduino j'utilise bien Serial.print(). j'arrive meme à recevoir le contenu sur raspberry.

    c'est du coté de la condition en python que je bloque 😒

    je veut faire ça enfaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si dans Serial.print de mon arduino il y a 1, alors je fait cette ACTION, sinon, RIEN

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Je ne connais pas tellement Python. Essaye ceci :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ser = serial.Serial('/dev/ttyACM0', 9600)
    data = ser.readline()
    if (data == "01000100"):
        subprocess.run("mocp -p /home/pi/music/monson.mp3")

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    J'avais déjà essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system(mocp -p .......)
    et ça ne fonctionnait pas.

    J'essaye tout à l'heure ton code. merci

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par Alexis55000 Voir le message
    J'avais déjà essayé avec
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system(mocp -p .......)
    avec les guillemets ?
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("mocp -p .......")

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Auteur Voir le message
    avec les guillemets ?
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("mocp -p .......")

    Oui oui avec les guillemets. (j'ai mal recopié).

    de toutes façon j'essai ce soir, ce que tu m'as proposé tout à l'heure !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Bon ba après avoir essayé, ça ne fonctionne pas non plus.


    j'ai modifié le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (data != "1"):
        subprocess.run("mocp -p /home/pi/music/monson.mp3")
    et là quand mon arduino envoie m'envoi quelque chose , j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "./serial.sh", line 11, in <module>
        subprocess.run("mocp -p /home/pi/music/sous.mp3")
    NameError: name 'subprocess' is not defined

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    tu as bien ajouté import subprocess au début de ton code ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Arf ouais ba non je ne l'avais pas mis. je connais pas du tout python.

    donc après avoir déclaré suprocess, maintenant l'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "./serial.sh", line 12, in <module>
        subprocess.run("mocp -p /home/pi/music/sous.mp3")
    AttributeError: 'module' object has no attribute 'run'

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    je crois qu'il faudrait que je m'adresse à un forum spécialisé dans le langage python :/

  12. #12
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 604
    Points : 56 721
    Points
    56 721
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    The run() function was added in Python 3.5...

    Voir la doc correspondant à ta version de Python

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Bonsoir,

    The run() function was added in Python 3.5...

    Voir la doc correspondant à ta version de Python
    salut f-leb,

    hier j'ai vérifié, ma version python est en 3.2.

    Mais donc là, ce que je comprend, c'est qu'il faudrait que je la mette en 3.5 pour pouvoir utiliser run.

    Bon merci j'essaye ce soir

  14. #14
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 604
    Points : 56 721
    Points
    56 721
    Billets dans le blog
    40
    Par défaut
    Pas nécessairement

    The run() function was added in Python 3.5; if you need to retain compatibility with older versions, see the Older high-level API section.
    Et là tu tombes sur l'ancêtre de subprocess.run : subprocess.call.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    Bon et bien j'ai supprimé toutes mes librairies et les aies réinstallées avec pip. Maintenant cela fonctionne et même avec os.system.

    c'est à dire que mon raspberry joue la piste demandée avec ce code .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (data != "1"):
        os.system("mocp -a /home/pi/music/monson.mp3")
    ce qui est logique vu que mon arduino envoie une série de chiffre. par contre si il envoie 1, la musique est lue aussi...

    donc je pense que "serial" n'arrive pas exactement à récupérer la valeur transmise de mon arduino.

    (je sais pas si je suis trop clair là =/ mais le principale c'est que j'avance. )

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Peux-tu nous montrer ton code Arduino ? Et ton code Python ?

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    ok ça marche alors pour être sur je met le code en entier.
    Arduino :
    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
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    //!!!!!!!!!!!!!!! MODIFICATION des VARIABLES !!!!!!!!!!!!!!!!!!!!//
     
     
    int pinServo1 = 3; //pin utilisé pour le servo
    int pinServo2 = 5;
     
    int chance = 2; //chiffre du random
     
    int degresServo1 = 180; // degres final du servopour lacher le ticket
    int degresServo2 = 150;
     
    int tempsServo1 = 500; //temps entre chaques mouvement du servoen ms
    int tempsServo2 = 500;
     
    int clign = 120; //temps de clignotement des relais
     
     
    //!!!!!!!!!!!!!!! VARIABLES !!!!!!!!!!!!!!!!!!!!//
     
     
     
     
     
     
     
     
    #include <Servo.h> 
    #define RELAIS1 12 //defini le relais1 sur pin 12
     
    Servo servo1;  // crée l’objet pour contrôler le servomoteur 1
    Servo servo2;  // crée l’objet pour contrôler le servomoteur 2
     
    //!!!!!!!!!!!!!!! DECLARATION DES VARIABLES !!!!!!!!!!!!!!!!!!!!//
     
    boolean cycle = false; //variable "cycle" pour définir si le programme vient de démarer
    int actionneur; //variable du bouton actionneur du jeu
     
     
    //!!!!!!!!!!!!!!!!!!!!!!! VARIABLES !!!!!!!!!!!!!!!!!!!!!!!!!!!!//
     
    ///////////////////////////////////////////////////////////////MaTRIX ////////////////////////////////////////////////////////
     
     unsigned char j;
    //Cablage du module (gnd et +V) utilise 3 pins
    int Max7219_pinCLK = 10;  
    int Max7219_pinCS = 9;
    int Max7219_pinDIN = 8;
     
    //Définition des pixels a eclairer 
    //0-9 puis A-Z soit 10+26 = 36 caractères
     
    unsigned char debut[8][8]={
    {0x0,0x69,0x9a,0x9c,0x9c,0x9a,0x69,0x0},
    {0xff,0x96,0x65,0x63,0x63,0x65,0x96,0xff},
    {0x0,0x69,0x9a,0x9c,0x9c,0x9a,0x69,0x0},
    {0xff,0x96,0x65,0x63,0x63,0x65,0x96,0xff},
    {0x0,0x69,0x9a,0x9c,0x9c,0x9a,0x69,0x0},
    {0xff,0x96,0x65,0x63,0x63,0x65,0x96,0xff},
    {0x0,0x69,0x9a,0x9c,0x9c,0x9a,0x69,0x0},
    {0xff,0x96,0x65,0x63,0x63,0x65,0x96,0xff},
    };
     
     
    unsigned char gagne[19][8]={
    {0x0,0x66,0x0,0x18,0x18,0x0,0x7e,0x0},
    {0x0,0x66,0x0,0x18,0x18,0x0,0x7e,0x0},
    {0x0,0x66,0x0,0x18,0x18,0x42,0x3c,0x0},
    {0x0,0x66,0x0,0x18,0x18,0x42,0x3c,0x0},
    {0x0,0x66,0x0,0x18,0x5a,0x42,0x3c,0x0},
    {0x0,0x66,0x0,0x18,0x5a,0x42,0x3c,0x0},
    {0x24,0x5a,0x0,0x18,0x5a,0x42,0x3c,0x0},
    {0x24,0x5a,0x0,0x18,0x5a,0x42,0x3c,0x0},
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},//vide
    {0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
    {0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0},
    {0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
    {0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
    {0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0},
    {0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0},
    {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0},
    {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0},
    {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0},
    {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0},
    };
     
     
    unsigned char perdu[9][8]={
    {0x0,0x66,0x66,0x0,0x18,0x0,0x3c,0x0},
    {0x0,0x66,0x66,0x0,0x18,0x0,0x3c,0x42},
    {0x0,0x66,0x0,0x18,0x5a,0x42,0x3c,0x0},
    {0x0,0x0,0x66,0x81,0x18,0x0,0x3c,0x42},
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},//vide
    {0x0,0x0,0x66,0x81,0x18,0x0,0x3c,0x42},
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
    {0x0,0x0,0x66,0x81,0x18,0x0,0x3c,0x42},
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
    };
     
    unsigned char euro[17][8]={
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x8,0x18,0x28,0x48,0x8,0x8,0x8,0x3e},//1
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x1f,0x3e,0x60,0xf8,0xf8,0xc0,0x7c,0x3e},//euros
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},//vide
    };
     
    unsigned char fleche[9][8]={
    {0x0,0x81,0xc3,0x66,0x3c,0x18,0x0,0x0},//1
    {0x0,0x0,0x81,0xc3,0x66,0x3c,0x18,0x0},
    {0x0,0x0,0x0,0x81,0xc3,0x66,0x3c,0x18},
    {0x0,0x0,0x0,0x0,0x81,0xc3,0x66,0x3c},
    {0x18,0x0,0x0,0x0,0x0,0x81,0xc3,0x7e},
    {0x3c,0x18,0x0,0x0,0x0,0x0,0x81,0xff},
    {0x66,0x3c,0x18,0x0,0x0,0x0,0x0,0x0},
    {0xc3,0x66,0x3c,0x18,0x0,0x0,0x0,0x0},
    {0x81,0xc3,0x66,0x3c,0x18,0x0,0x0,0x0},
    };
     
    unsigned char tirette[23][8]={
    {0x30,0x8,0x4,0x3,0x3,0x0,0x0,0x0},
    {0x30,0x30,0x8,0x7,0x3,0x0,0x0,0x0},
    {0x30,0x30,0x8,0x7,0x3,0x0,0x0,0x0},
    {0x0,0x30,0x30,0xb,0x7,0x0,0x0,0x0},
    {0x0,0x0,0x30,0x3b,0x7,0x0,0x0,0x0},
    {0x0,0x0,0x0,0x37,0x3b,0x0,0x0,0x0},
    {0x0,0x0,0x0,0x7,0x3b,0x30,0x0,0x0},
    {0x0,0x0,0x0,0x3,0x7,0x38,0x30,0x0},
    {0x0,0x0,0x0,0x3,0x7,0x8,0x30,0x30},
    {0x0,0x0,0x0,0x3,0x3,0x4,0x8,0x30},
    {0x0,0x0,0x0,0x3,0x3,0x4,0x8,0x30},
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},//vide
    {0x0,0x0,0x0,0x3,0x3,0x4,0x8,0x30},
    {0x0,0x0,0x0,0x3,0x3,0x4,0x8,0x30},
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},//vide
    {0x0,0x0,0x0,0x3,0x3,0x4,0x8,0x30},
    {0x0,0x0,0x0,0x3,0x3,0x4,0x8,0x30},
    {0x0,0x0,0x0,0x37,0x3b,0x0,0x0,0x0},
    {0x30,0x30,0x8,0x7,0x3,0x0,0x0,0x0},
    {0x30,0x8,0x4,0x3,0x3,0x0,0x0,0x0},
    {0x30,0x8,0x4,0x3,0x3,0x0,0x0,0x0},
    };
     
    //Ecriture d'un caractere 8x8
    void Write_Max7219_byte(unsigned char DATA) 
    {   
                unsigned char i;
           digitalWrite(Max7219_pinCS,LOW);      
           for(i=8;i>=1;i--)
              {        
                 digitalWrite(Max7219_pinCLK,LOW);
                 digitalWrite(Max7219_pinDIN,DATA&0x80);// Extracting a bit data
                 DATA = DATA<<1;
                 digitalWrite(Max7219_pinCLK,HIGH);
               }                                 
    }
     
    //Ecriture elementaire d une seule rangee 
    void Write_Max7219(unsigned char address,unsigned char dat)
    {
            digitalWrite(Max7219_pinCS,LOW);
            Write_Max7219_byte(address);           //address,code of LED
            Write_Max7219_byte(dat);               //data,figure on LED 
            digitalWrite(Max7219_pinCS,HIGH);
    }
     
    //Initialisation du module Max 7219 
    void Init_MAX7219(void)
    {
     Write_Max7219(0x09, 0x00);       //decoding :BCD
     Write_Max7219(0x0a, 0x03);       //brightness 
     Write_Max7219(0x0b, 0x07);       //scanlimit;8 LEDs
     Write_Max7219(0x0c, 0x01);       //power-down mode:0,normal mode:1
     Write_Max7219(0x0f, 0x00);       //test display:1;EOT,display:0
    }
     
     
     
    //////////////////////////////////////////////////////////////MaTRIX ////////////////////////////////////////////////////////
     
     
     
    // --- Déclaration des variables globales ---
    const int LED=13; //declaration constante de broche 
     
    int nbAlea; // déclaration d'une variable aleatoire
     
    volatile int comptageImpulsion=0; // variable accessible dans la routine interruption externe 0
     
    int etatRelais = HIGH; //Etat du relais par defaut
     
    void setup() {
     
       //Pins a utiliser MATRIX
      pinMode(Max7219_pinCLK,OUTPUT);
      pinMode(Max7219_pinCS,OUTPUT);
      pinMode(Max7219_pinDIN,OUTPUT);
      delay(50);  //Initialiser
      Init_MAX7219();
     
      servo1.attach(pinServo1);  // utilise la broche 9 pour le contrôle du servomoteur 
      servo1.write(0); // positionne le servomoteur à 0° 
    //  servo2.attach(pinServo2);  // utilise la broche 9 pour le contrôle du servomoteur 
    //  servo2.write(0); // positionne le servomoteur à 0°
     
    pinMode(LED, OUTPUT); //met la broche en sortie 
    actionneur = 6; //numéro du pin du bouton actionneur
    pinMode(RELAIS1, OUTPUT);
     
    digitalWrite(RELAIS1, etatRelais); //On écrit l'état du relais
     
    Serial.begin(115200); // initialise connexion série à 115200 bauds
     
    attachInterrupt(0, gestionINT0, RISING); // attache l'interruption externe n°0 à la fonction gestionINT0()
    // mode déclenchement possibles = LOW, CHANGE, RISING, FALLING
     
    }
     
     
    void loop(){
     
    if (cycle == false) { //si variable "cycle" est en flase, alors c'est que le programme démarre. donc on joue la scene du OK 
     
      for(j=0;j<8;j++) {  //Faire défiler les caracteres a afficher
      for(int i=1;i<8;i++)  //Afficher un caractere à la fois
      Write_Max7219(i,debut[j][i-1]);
      delay(200);  //Attente pour laisser le temps de lire
      } 
     
      cycle = !cycle; //inverse la variable
     
    }
     
     
    while(comptageImpulsion < 1) {
              for(j=0;j<9;j++) {  //Faire défiler les caracteres a afficher
             for(int i=1;i<9;i++)  //Afficher un caractere à la fois
              Write_Max7219(i,fleche[j][i-1]);
             delay(30);  //Attente pour laisser le temps de lire
            } 
    }
     
     
     
    if (comptageImpulsion >= 1) {
              //nbAlea=random(2); //construit le nombre aléatoire
              int nbAlea=random(chance);
              digitalWrite(LED,HIGH); // met la broche au niveau haut (5V) – allume la LED
              delay(300); // pause de 500 millisecondes (ms)
              digitalWrite(LED,LOW); // met la broche au niveau bas (0V) – éteint la LED
              delay(300); // pause de 500ms
     
             for(j=0;j<9;j++) {  //Faire défiler les caracteres a afficher
             for(int i=1;i<9;i++)  //Afficher un caractere à la fois
              Write_Max7219(i,euro[j][i-1]);
             delay(100);  //Attente pour laisser le temps de lire
            } 
     
            if (nbAlea != 1) {
     
              Serial.println("0");
              //Serial.println("perdu"); 
     
             for(j=0;j<9;j++) {  //Faire défiler les caracteres a afficher
             for(int i=1;i<9;i++)  //Afficher un caractere à la fois
              Write_Max7219(i,perdu[j][i-1]);
             delay(300);  //Attente pour laisser le temps de lire
            } 
     
            } else {
     
     
              while(digitalRead(actionneur) != 0) {
                //Serial.println("action");
     
                for(j=0;j<23;j++) {  //Faire défiler les caracteres a afficher
                  for(int i=1;i<9;i++)  //Afficher un caractere à la fois
                  Write_Max7219(i,tirette[j][i-1]);
                  delay(80);  //Attente pour laisser le temps de lire
                }
              }
     
     
              digitalWrite(RELAIS1, LOW); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, HIGH); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, LOW); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, HIGH); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, LOW); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, HIGH); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, LOW); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, HIGH); //allume relais 1
              delay(clign);
              digitalWrite(RELAIS1, LOW); //allume relais 1
     
              for(j=0;j<19;j++) {  //Faire défiler les caracteres a afficher
                 for(int i=1;i<9;i++)  //Afficher un caractere à la fois
                  Write_Max7219(i,gagne[j][i-1]);
                 delay(100);  //Attente pour laisser le temps de lire
                }  
                Serial.println("1");
                //Serial.println("gagne");
     
     
                servo1.write(degresServo1); 
                delay(tempsServo1); 
                servo1.write(0);
     
                digitalWrite(RELAIS1, HIGH); //Eteint le relais1
     
    //            servo2.write(0); 
    //            delay(tempsServo2); 
    //            servo2.write(degresServo2);
            }
     
     
            comptageImpulsion=(comptageImpulsion - 1); //supprime le credit
            Serial.print("Nombre de pulsations = "); 
            Serial.println(comptageImpulsion); 
            Serial.print("Nombre random = "); 
            Serial.println(nbAlea);
     
    }
     
    } 
    void gestionINT0() {// la fonction appelée par l'interruption externe n°0
     
    comptageImpulsion=comptageImpulsion+1; // Incrémente la variable de comptage
    // ATTENTION : delay() et millis() non dispo ici - données série perdues
     
    //---- affiche le nombre d'impulsions sur le port série
    //Serial.print("Nombre de pulsations = "); 
    //Serial.println(comptageImpulsion); 
    }

    Code python : 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
    #!/usr/bin/env python3.4
    # -*-coding:Utf-8 -*
     
    import os
    import subprocess
    import serial
     
    ser = serial.Serial('/dev/ttyACM0', 115200)
     
    data = ser.readline()
     
    while True:
            if (data > 0):
                    os.system("play /home/music/yeah.mp3")
            elif (data < 1):
                    os.system("play /home/music/sous.mp3")

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    avec Serial.println("1") tu envoies 1 suivi d'un retour à la ligne : 1\r\n.
    https://www.arduino.cc/en/Serial/Println

    Je ferais :
    - côté Arduino :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.print("1");  // pour s'affranchir des caractères de retour à la ligne
    - côté Py :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    data = ser.read(1)  # lecture de 1 octet
    Mais la donnée récupérée par Python est un caractère pas un entier comme tu l'as écrit. Et je mettrais le readline() dans le while
    Code Python : 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
    import serial
    ser = serial.Serial()
    ser.port='/dev/ttyACM0'
    ser.baudrate = 115200
    ser.bytesize = serial.EIGHTBITS 
    ser.parity = serial.PARITY_NONE
    ser.stopbits = serial.STOPBITS_ONE
    ser.xonxoff = False     
    ser.rtscts = True     
    ser.dsrdtr = True
    ser.open()
    print('Ouverture du port serie')
     
    while True:
            data = ser.read(1) # lecture de 1 octet
     
            if (data == "0"):
                    os.system("play /home/music/yeah.mp3")
            elif (data == "1"):
                    os.system("play /home/music/sous.mp3")
            data = "" # reinitialiser la variable
            // ajouter une pause le temps que la lecture se fasse
     
    ser.close()

    Attention, en python, la fonction read() de l'objet serial est bloquante

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 17
    Points : 5
    Points
    5
    Par défaut
    C'est super, ça fonctionne 😉

    par contre quelle est la différence entre "ser.readline()" et "ser.read(1)" ?

    maintenant, pour que le programme tourne en boucle, c'est à dire recommence à attendre un valeur dans serial et jouer de la musique. comment dois-je faire.

    Par ce que j'ai le truc assez barbare en tête à mettre en fin de fichier du genre :

    os.system("python /home/doissier/monprogramme.py")

    mais je pense qu'il y a une autre solution.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    serial.readline()
    serial.read()
    En gros readline() attend des caractères avec une fin de ligne (EOL), la méthode read() attend un nombre d'octets (1 caractère = 1 char = 1 octet). Je m'affranchis ainsi des caractères de fin de ligne qui sont, selon les systèmes :
    \n ;
    \n\r ;
    \r\n ;
    \r.

    Donc si deux systèmes n'ont pas la même implémentation des fins de ligne, tu risques d'attendre longtemps ton code


    Citation Envoyé par Alexis55000 Voir le message
    maintenant, pour que le programme tourne en boucle, c'est à dire recommence à attendre un valeur dans serial et jouer de la musique. comment dois-je faire.
    Regarde j'ai mis la fonction read() dans ta boucle...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. probleme USB avec SAGEM FAST 800
    Par k_boy dans le forum Périphériques
    Réponses: 9
    Dernier message: 13/12/2005, 17h12
  2. [Système] Trouver une clef USB avec PHP
    Par chico_du_33 dans le forum Langage
    Réponses: 8
    Dernier message: 05/10/2005, 17h29
  3. Réponses: 1
    Dernier message: 25/09/2005, 16h18
  4. Erreur de connexion à une BDD SQL Server 2000 avec BDE
    Par SchpatziBreizh dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2005, 11h22

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