Des buzzers électronique arduino qui ne buzzent plus ...

+ buzzer et led qui fonctionne aléatoirement ...

a marqué ce sujet comme résolu.

Bonjour,

En ayant assez des disputes lors de repas festifs avec divers jeux ou blind test qui commencent toujours par cette phrase "C'est moi qui l'ai dit en premier" (ou similaire), j'ai décidé de confectionner des buzzers électronique avec arduino. Tout d'abord comment j'ai prévu la chose : - un boitier maitre avec un écran lcd, 4 boutons poussoirs, son arduino nano et son module NRF24L01 - deux, trois, quatres… boitiers buzzers avec pour chacun son arduino nano, son module NRF24L01 et un piezo pour capter la frappe sur le buzzer et une bande led RGB. Lorsque le jeu démarre, les buzzers s'allument, la première équipe ou personne qui frappe sur son buzzer éteint celui ou ceux des équipes adverses et attend la réponse du boitier maitre pour savoir si la réponse est bonne ou non. Une fois la réponse donnée, les deux buzzers sont à nouveau actifs et on recommence.

J'explique donc maintenant mon problème : En fait je n'arrive pas à expliquer ce qu'il se passe. Le jeu démarre et tout se passe bien, une équipe frappe, elle a bon ou non, on recommence, à nouveau une frappe sur un buzzer et ainsi de suite. Puis d'un coup (parfois après 3 frappes sur les buzzers, parfois plus ce n'est pas quelque chose de constant) seul le dernier buzzer qui a été frappé continue de fonctionner normalement. J'ai prévu un bouton pour mettre fin au jeu et retourner à l'état de départ mais même après cela toujours qu'un buzzer qui fonctionne normalement. Pour être un peu plus précis, le buzzer "défectueux" continue à s'allumer ou s'éteindre normalement mais on dirait qu'il n'envoie plus de message au boitier maitre lorsqu'on frappe dessus et je n'ai plus qu'à tout éteindre et rallumer pour que ça refonctionne (un peu). J'ai donc l'impression que le problème est plus matériel qu'au niveau de mon code ou alors mon code utilise mal le matériel.

Enfin voici mon code si jamais le problème vient de là

boitier maitre (juste la partie concernant le jeu, pour info son RADDR est "maitr"):

  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
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
/* pour info :
unsigned long depart = 10;
unsigned long pret = 20;
unsigned long attente_reponse = 30;
unsigned long correct = 50;
unsigned long faux = 60;
unsigned long pause = 70;
unsigned long fin = 100;*/

void loop()
{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Buzzer electronique!");
    lcd.setCursor(5,1);
    lcd.print("Par Pierro");
    lcd.setCursor(1,3);
    lcd.print("Appuyer pour jouer");
    while (1) // boucle d'attente_reponse d'appui sur un bouton
    {
        etat_bp_ok = digitalRead(bp_ok);
        etat_bp_bas = digitalRead(bp_bas);
        etat_bp_haut = digitalRead(bp_haut);
        etat_bp_retour = digitalRead(bp_retour);
        if (etat_bp_haut == LOW || etat_bp_retour == LOW || etat_bp_bas == LOW || etat_bp_ok == LOW){delay(250);lcd.clear();tone(buzz,500,150);nombre_de_buzzer();}
    } // fin while
} // fin void loop

void nombre_de_buzzer()
{
    lcd.clear();
    nombre_buzzer = 2;
    lcd.setCursor(2,0);
    lcd.print("Nombre de buzzer");
    lcd.setCursor(6,1);
    lcd.print("en jeu :");
    do
    {
        suivant = false;
        lcd.setCursor(9,3);
        lcd.print(nombre_buzzer);
        etat_bp_ok = digitalRead(bp_ok);
        etat_bp_retour = digitalRead(bp_retour);
        etat_bp_haut = digitalRead(bp_haut);
        etat_bp_bas = digitalRead(bp_bas);
        if (etat_bp_bas == LOW)
        {
            nombre_buzzer = nombre_buzzer - 1;
            tone(buzz,200,150);
            delay(250);
            if (nombre_buzzer < 2){nombre_buzzer = 2;}
        }
        if (etat_bp_haut == LOW)
        {
            nombre_buzzer = nombre_buzzer + 1;
            tone(buzz,400,150);
            if (nombre_buzzer > 4){nombre_buzzer = 4;}
            delay(250);
        }
        if (etat_bp_retour == LOW){delay(250);lcd.clear();tone(buzz,500,150);loop();}
        if (etat_bp_ok == LOW){lcd.clear();tone(buzz,500,150);suivant = true;}
    }
    while (suivant != true);
    delay(250);
    lcd.setCursor(1,0);
    lcd.print("Vous avez choisi :");
    lcd.setCursor(5,2);
    lcd.print(nombre_buzzer);
    lcd.print(" buzzers");
    lcd.setCursor(1,3);
    lcd.print("Appuyer pour jouer");
    do
    {
        suivant = false;
        etat_bp_ok = digitalRead(bp_ok);
        etat_bp_retour = digitalRead(bp_retour);
        etat_bp_haut = digitalRead(bp_haut);
        etat_bp_bas = digitalRead(bp_bas);
        if (etat_bp_retour == LOW){delay(250);lcd.clear();tone(buzz,500,150);loop();}
        if (etat_bp_ok == LOW || etat_bp_haut == LOW || etat_bp_bas == LOW){delay(250);tone(buzz,500,150);lcd.clear();suivant = true;}
    }
    while (suivant != true);
    jeu();
} // fin void nombre de buzzer

void jeu()
{
    RAZ:
    score_buzzer1 = 0;
    score_buzzer2 = 0;
    score_buzzer3 = 0;
    score_buzzer4 = 0;
    start();
}

void start()
{
    Mirf.setTADDR((byte *)"buzz1");
    Mirf.send((byte *) &pret);
    while (Mirf.isSending());
    delay(20);
    Mirf.setTADDR((byte *)"buzz2");
    Mirf.send((byte *) &pret);
    while (Mirf.isSending());
    delay(20);
    Mirf.setTADDR((byte *)"buzz3");
    Mirf.send((byte *) &pret);
    while (Mirf.isSending());
    delay(20);
    Mirf.setTADDR((byte *)"buzz4");
    Mirf.send((byte *) &pret);
    while (Mirf.isSending());
    delay(20);
    affichage_score();
}

void affichage_score()
{
    lcd.clear();
    if (nombre_buzzer == 2)
    {
        lcd.setCursor(0,0);
        lcd.print("Buzzer 1 = ");
        lcd.print(score_buzzer1);
        lcd.setCursor(0,1);
        lcd.print("Buzzer 2 = ");
        lcd.print(score_buzzer2);
    }
    if (nombre_buzzer == 3)
    {
        lcd.setCursor(0,0);
        lcd.print("Buzz1 = ");
        lcd.print(score_buzzer1);
        lcd.setCursor(10,0);
        lcd.print("Buzz2 = ");
        lcd.print(score_buzzer2);
        lcd.setCursor(7,1);
        lcd.print("Buzz3 = ");
        lcd.print(score_buzzer3);
    }
    if (nombre_buzzer == 4)
    {
        lcd.setCursor(0,0);
        lcd.print("Buzz1 = ");
        lcd.print(score_buzzer1);
        lcd.setCursor(10,0);
        lcd.print("Buzz2 = ");
        lcd.print(score_buzzer2);
        lcd.setCursor(0,1);
        lcd.print("Buzz3 = ");
        lcd.print(score_buzzer3);
        lcd.setCursor(10,1);
        lcd.print("Buzz4 = ");
        lcd.print(score_buzzer4);
    }
    wait_for_buzz();
}

void wait_for_buzz()
{
    while (1)
    {
        etat_bp_retour = digitalRead(bp_retour);
        etat_bp_haut = digitalRead(bp_haut);
        if (etat_bp_haut == LOW)
        {
            delay(500);
            tone(buzz,500,150);
            Mirf.setTADDR((byte *)"buzz1");
            Mirf.send((byte *)&pause);
            while (Mirf.isSending());
            delay(20);
            Mirf.setTADDR((byte *)"buzz2");
            Mirf.send((byte *)&pause);
            while (Mirf.isSending());
            delay(20);
            Mirf.setTADDR((byte *)"buzz3");
            Mirf.send((byte *)&pause);
            while (Mirf.isSending());
            delay(20);
            Mirf.setTADDR((byte *)"buzz4");
            Mirf.send((byte *)&pause);
            while (Mirf.isSending());
            delay(20);
            jeu_en_pause();
        }
        if (etat_bp_retour == LOW)
        {
            delay(250);
            lcd.clear();
            tone(buzz,500,150);
            Mirf.setTADDR((byte *)"buzz1");
            Mirf.send((byte *)&fin);
            while (Mirf.isSending());
            delay(20);
            Mirf.setTADDR((byte *)"buzz2");
            Mirf.send((byte *)&fin);
            while (Mirf.isSending());
            delay(20);
            Mirf.setTADDR((byte *)"buzz3");
            Mirf.send((byte *)&fin);
            while (Mirf.isSending());
            delay(20);
            Mirf.setTADDR((byte *)"buzz4");
            Mirf.send((byte *)&fin);
            while (Mirf.isSending());
            delay(20);
            loop();
        }
        if (Mirf.dataReady())
        {
            Mirf.getData((byte *) &data);
            first_buzzer();
        }
    }
}

void jeu_en_pause()
{
    suivant = false;
    do
    {
        lcd.setCursor(4,3);
        lcd.print("JEU EN PAUSE");
        etat_bp_haut = digitalRead(bp_haut);
        if (etat_bp_haut == LOW){delay(500);tone(buzz,500,150);suivant = true;}
    }
    while (suivant != true);
    start();
}

void first_buzzer() // quel est le premier buzzer frappé ?
{
    if (data == buzz1)
    {
        Mirf.setTADDR((byte *)"buzz1");
        Mirf.send((byte *) &wait_reponse);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz2");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz3");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz4");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
    }
    if (data == buzz2)
    {
        Mirf.setTADDR((byte *)"buzz2");
        Mirf.send((byte *) &wait_reponse);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz1");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz3");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz4");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
    }
    if (data == buzz3)
    {
        Mirf.setTADDR((byte *)"buzz3");
        Mirf.send((byte *) &wait_reponse);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz2");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz1");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz4");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
    }
    if (data == buzz4)
    {
        Mirf.setTADDR((byte *)"buzz4");
        Mirf.send((byte *) &wait_reponse);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz2");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz3");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
        Mirf.setTADDR((byte *)"buzz1");
        Mirf.send((byte *) &pause);
        while (Mirf.isSending());
        delay(20);
    }
    wait_reponse();
}

void wait_reponse()
{
    lcd.setCursor(4,2);
    lcd.print("Est-ce correct ?");
    lcd.setCursor(0,3);
    lcd.print("NON");
    lcd.setCursor(17,3);
    lcd.print("OUI");
    while (1)
    {
        etat_bp_ok = digitalRead(bp_ok);
        etat_bp_retour = digitalRead(bp_retour);
        if (etat_bp_ok == LOW)
        {
            delay(500);
            if (data == buzz1)
            {
                score_buzzer1++;
                Mirf.setTADDR((byte *)"buzz1");
                Mirf.send((byte *) &correct);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                lcd.clear();
            }
            if (data == buzz2)
            {
                score_buzzer2++;
                Mirf.setTADDR((byte *)"buzz2");
                Mirf.send((byte *) &correct);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                lcd.clear();
            }
            if (data == buzz3)
            {
                score_buzzer3++;
                Mirf.setTADDR((byte *)"buzz3");
                Mirf.send((byte *) &correct);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                lcd.clear();
            }
            if (data == buzz4)
            {
                score_buzzer4++;
                Mirf.setTADDR((byte *)"buzz4");
                Mirf.send((byte *) &correct);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                delay(400);
                tone(buzz,900,300);
                lcd.clear();
            }
            start();
        }
        if (etat_bp_retour == LOW)
        {
            delay(500);
            if (data == buzz1)
            {
                Mirf.setTADDR((byte *)"buzz1");
                Mirf.send((byte *) &faux);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                lcd.clear();
            }
            if (data == buzz2)
            {
                Mirf.setTADDR((byte *)"buzz2");
                Mirf.send((byte *) &faux);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                lcd.clear();
            }
            if (data == buzz3)
            {
                Mirf.setTADDR((byte *)"buzz3");
                Mirf.send((byte *) &faux);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                lcd.clear();
            }
            if (data == buzz4)
            {
                Mirf.setTADDR((byte *)"buzz4");
                Mirf.send((byte *) &faux);
                while (Mirf.isSending());
                delay(20);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                delay(400);
                tone(buzz,100,300);
                lcd.clear();
            }
            start();
        }
    }
}

et pour un buzzer (ils ont tous le même code ) à l'exception de la donnée qu'ils envoient et leur RADDR):

  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
void setup()
{
    Serial.begin(9600);
    Mirf.cePin = 8;
    Mirf.csnPin = 7;
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();
    Mirf.channel = 0;
    Mirf.payload = sizeof(unsigned long);
    Mirf.config();
    Mirf.setTADDR((byte *)"maitr");
    Mirf.setRADDR((byte *)"buzz1");
    pinMode(led_vert, OUTPUT);
    pinMode(led_rouge, OUTPUT);
    digitalWrite(led_vert, LOW);
    digitalWrite(led_rouge, LOW);
} // fin void setup

void loop()
{
    digitalWrite(led_rouge, HIGH);
    digitalWrite(led_vert, LOW);
    while (Mirf.dataReady())
    Mirf.getData((byte *) &data);
    if (data == pret){jeux();}
} // fin void loop

void start()
{
    while (!Mirf.dataReady())
    Mirf.getData((byte *) &data);
    if (data == pret){jeux();}
    if (data == pause){wait();}
    if (data == fin){loop();}
} // fin void start

void jeux()
{
    while (1) // boucle loop du jeu
    {
        digitalWrite(led_vert, HIGH);
        digitalWrite(led_rouge, HIGH);
        if (Mirf.dataReady()) // si on reçoit des données
        {
            Mirf.getData((byte *) &data); // réception des données
            if (data == pause){wait();} // si donnée = pause >> wait
            if (data == fin){loop();} // si donnée = fin >> loop
        } // fin if données reçues
        // frappe sur le buzzer 1
        valpoc = analogRead(piezzo);
        if (valpoc >= sensibilitepiezzo) // si frappe sur le buzzer 1 est supérieur au seuil défini
        {
            Mirf.send((byte *)&envoi); // envoi de l'info au boitier maitre
            while (Mirf.isSending());
            delay(500);
            first_buzzer();
        } // fin if buzzer 1 frappé
    }
} // fin void jeux

void first_buzzer() // est ce que j'ai buzzé le premier ?
{
    while (!Mirf.dataReady()) // tant que des donnes ne sont pas reçues
    Mirf.getData((byte *) &data); // réception des données
    if (data == attente_reponse){wait_reponse();} // si donnée = attente_reponse >> wait_reponse (j'ai buzzé le premier)
    if (data == pause){wait();} // si donnée = pause >> wait (je n'ai pas buzzé le premier j'attends)
} // fin void first buzzer

void wait_reponse() // est ce que j'ai la bonne réponse ?
{
    digitalWrite(led_rouge, HIGH);
    digitalWrite(led_vert, HIGH);
    while (!Mirf.dataReady())
    Mirf.getData((byte *) &data);
    if (data == correct){yes();}
    if (data == faux){no();}
    else {jeux();}
} // fin void wait_reponse

void wait() // en attente
 {
    digitalWrite(led_rouge, LOW);
    digitalWrite(led_vert, LOW);
    start();
 } // fin void wait

 void yes() // bonne reponse
 {
    digitalWrite(led_rouge, LOW);
    digitalWrite(led_vert, HIGH);
    delay(300);
    digitalWrite(led_vert, LOW);
    delay(100);
    digitalWrite(led_vert, HIGH);
    delay(300);
    digitalWrite(led_vert, LOW);
    delay(100);
    digitalWrite(led_vert, HIGH);
    delay(300);
    jeux();
 } // fin void yes

 void no() // mauvaise reponse
 {
    digitalWrite(led_vert, LOW);
    digitalWrite(led_rouge, HIGH);
    delay(300);
    digitalWrite(led_rouge, LOW);
    delay(100);
    digitalWrite(led_rouge, HIGH);
    delay(300);
    digitalWrite(led_rouge, LOW);
    delay(100);
    digitalWrite(led_rouge, HIGH);
    delay(300);
    jeux();
 } // fin void no

Merci d'avance pour votre aide

edit : mise à jour du code

+0 -0

Personne n'aurait une idée ? Deuxième question : Est ce que vous auriez une idée pour expliquer pourquoi le buzzer ne fonctionne pas sauf quand j'appui sur le bouton retour (ligne 47 du boitier maitre) et pour indiquer une bonne ou une mauvaise réponse, et pourquoi les led des buzzers ne clignotent-elles pas (les bandes de led restent jaune) ? (est-ce que vous pensez que cela peut venir de ma copie arduino made in china ?)

+0 -0

Oula.

Bon alors :

  1. Bonjour :)
  2. Tu as posté un assez gros bout de code. Les gens sont feignants.
  3. Quelques conseils sur ton code :
    • ENLEVE CES GOTO
    • Préfère faire plusieurs fonctions, ça permet de découper ton code, plus facile à lire
    • Pourquoi un while (1), alors que tu as une fonction loop ?
    • Ça sera déjà pas mal :)
  4. Pour ton probleme, je n'ai pas lu le code, je regarderais dès que j'ai un peu plus de temps (au pire remonte le sujet :) ). Mais après, les joies de la démo, surtout sur du matériel :). Dans tous les cas. Tu as vérifié tes cables ? Tu peux mettre une image de ton montage, même si je pense pas que ça vienne de la.

Merci de tes conseils. Pour répondre à tes commentaires le code que j'ai posté avec tous les goto n'est qu'une version de tout ce que j'ai pu tester, j'ai déjà essayer de les retirer en utilisant plusieurs fonctions mais je me retrouve avec le même problème. ensuite j'ai mis un while (1) car j'utilise la loop pour mettre le boitier maitre et le jeu en veille en attendant le départ. Bon je ne dis pas que mon code est parfait très loin de là mais vu que j'ai le même problème malgré plusieurs essais en repartant à chaque fois à zéro je ne comprends pas. Enfin concernant le cablage oui j'ai déjà tout vérifié quand j'ai eu mes soucis avec les leds, au début tout fonctionnait normalement puis d'un coup plus possible de les faire clignoter… Je vais essayer de mettre un schéma de mon montage si ça peut aider.

Salut :)

Tu peux détailler comment est câblé le capteur piézo ? Je me demande s'il ne devrait pas être polarisé à l'alimentation. Je ne vois pas non plus l’intérêt de la résistance en parallèle du capteur piézo … :o

Avec une 1 Méga on a un circuit ouvert, et donc le capteur piézo simplement connecté à une broche d'entrée, je pense que tu ne peux pas lire une valeur correctement :)

Ce serait possible d'avoir la référence du capteur ? Pour l'instant je ne vois que ça s'il s'agit bien d'un problème de buzzers ;)

Edit: Orthographe

+0 -0

Bonjour,

Alors pour le capteur piézo je ne saurai pas expliquer pourquoi il "faut" une résistance c'est juste ce que j'ai vu sur ce tuto de ciblerie électronique que j'ai fait et ça fonctionne parfaitement ainsi (précisé dans la vidéo à environ 11 minutes sans réelles explications).

J'ai acheté ceux-là

Ce qui est étonnant c'est que ça fonctionne parfaitement au départ et que d'un coup, de façon aléatoire, il n'y a plus qu'un voir plus aucun buzzer qui fonctionne.

edit : orthographe

+0 -0

Alors il y a bien un problème à ce niveau ;)

Le convertisseur analogique-numérique de l'arduino nano est un convertisseur 10 bits (on parle de résolution du convertisseur). Sur 10 bits, on a donc 2^10 valeurs possibles, soit 1024 (entre 0 et 1023) et non 256 valeurs.

Pour identifier que le problème provient bien de là, tu peux essayer de taper plus ou moins fort sur le buzzer.

Je pense que si tu tapes doucement, la valeur devrait rester en dessous de 255 et donc il ne devrait pas y avoir de problème, si tu tapes plus fort, la valeur lue sera supérieure à 255. Comment as-tu fait la déclaration de la variable "valpoc" ? Elle est codé sur 8 bits ou plus ?

+0 -0

Alors ma variable valpoc est un int (donc 16 bits si je ne me trompe pas ?).

Concernant la frappe sur le buzzer j'ai essayé en tapant vraiment doucement (juste ce qu'il faut pour capter la frappe) et ça ne change pas au bout d'un moment un buzzer ne fonctionne plus, si j'appuie sur le bouton pause, les buzzers deviennent inactifs comme prévu et quand je rappuie pour retourner au jeu, il arrive que les deux buzzers refonctionnent pendant une durée toujours aussi aléatoire ou un seul voir aucun…

Et je n'arrive toujours pas à expliquer pourquoi ma bande led des buzzers ne clignote pas en vert ou rouge quand j'indique une réponse correct ou fausse alors qu'avant ça fonctionnait…

+0 -0

Et le fait que ce soit une valeur jusqu'à 1023 ne change rien au reste ?

Sinon, tu n'as pas suivi les recommandations d'AmarOk, notamment les gotos qui amélioreraient la visibilité du code …

Ah oui, et j'ai du mal à comprendre comment on peut concevoir un tel système sans savoir faire la différence entre courants et tensions :o

Je suppose que tu t'es servis de montages trouvés sur internet, et d'un peu de logique, bien joué d'être arrivé jusque-là mais je ne suis pas choqué qu'il y ait des dysfonctionnements du coup (mais ça reste pas mal du tout ;) ).

+0 -0

Alors en fait si j'ai suivi les recommandations d'AmarOk et refait mes codes il n'y a plus de goto mais pas d'améliorations.

Concernant la différence entre courant et tension pour moi la tension est une mesure de l'électricité en volt et le courant est s'il y a ou non de l'électricité.

Après pour le code je n'ai rien trouvé sur internet qui me convenait car je ne comprenais pas le code et je ne veux pas faire du simple copié collé. Donc je me suis inspiré de ce que j'avais fait pour la ciblerie où je m'étais également inspiré du code trouvé sur le lien mis un peu plus haut.

Enfin le fait que cela puisse être une valeur jusqu'à 1023 ne doit pas déranger, enfin je pense car ceux du tuto pour la ciblerie utilise également un arduino nano et le même montage de piezo et je me suis inspiré de leur façon de récupérer l'information d'un impact.

Mais selon toi, si tu as lu le code, est-ce que ça pourrait venir de là ? Je n'arrive pas à expliquer que ça fonctionne correctement puis plus du tout ou de façon aléatoire ni pourquoi la bande de led ne clignote pas.

Alors après avoir retravaillé sur mon code j'ai résolu lé problème de buzzer/son (erreur très bête de ma part…) par contre pas d'amélioration pour les led qui ne clognotent pas et les buzzers qui fonctionnent comme ils veulent…

Si quelqu'un aurait une idée

Bon j'ai beau chercher je ne comprends toujours pas pourquoi mes buzzers fonctionnent de façon aléatoire… de même que pour les leds.

J'ai beau essayé de refaire mon code de différentes manières mais rien à faire je n'y arrive pas ?

Une âme charitable (comme celle de Spit qui a déjà tenté) aurait-elle une idée ?

Comme spitrou, je suis admiratif de la complexité des projets que tu arrive à réaliser sans avoir ne serait-ce que les notions de courant et de tension.

je suis aussi étonné de la manière dont tu code, parce que j'ai jamais vu un code aussi peu fragmenté en fonction, même après les multiples refontes que t'ont montrées Amarok et spitrou.

si tu es d'accord, je peux essayer de te guider pour refaire ce projet depuis le départ, c'est-à-dire de 0. si tu décide de faire ça, garde quand même tes sources actuels quelque part, au cas où quelqu'un tombe du ciel et ait la solution à tes deux problèmes. (ce serait étonnant, vu le code, mais on a vu plus rare).

pour tes leds, ça serait pas forcément un problème de code, mais matériel, pour des raisons que j'aurais beaucoup de mal à expliquer à quelqu'un qui n'a pas les notions de courant et tension, sache que changer les composants pour des équivalents super chers européens n'améliorera pas la situation si j'ai la bonne intuition du problème. (une histoire de transistor qui amplifie le courant même quand il est pas saturé, etc…)

pour les buzzers qui arrêtent de vibrer à un moment aléatoire, vu comme tu as construit ton code, par contre, ça m'étonnerait pas que ça vienne de là.

+0 -0

Oui je suis prêt à repartir de 0 sans problème du moment que j'arrive au bout cette fois-ci, toute aide est la bienvenue ;)

Concernant la question de Spit sur le signal que je récupère du signal piezo, j'ai relu le blog d'Eskimon que j'ai suivi pour apprendre les bases et en particulier la partie sur les capteurs (ici) et je récupère donc une tension sous forme de valeur entre 0 et 1023 et non 255 comme je l'avais dit précédemment.

Après pour améliorer mon code je suis à l'écoute de toutes critiques qui pourront m'aider à progresser.

Sinon pour mieux m'exprimer (parce que je me rends compte que je n'ai pas été très claire jusqu'ici) j'avais un problème de haut parleur qui ne fonctionnait pas mais cela était de ma faute (erreur dans le code). Mes buzzers (boitiers de jeu à frapper), ce sont eux qui fonctionnent aléatoirement (piezo? nrf24l01? autre chose?).

Enfin pour les leds elles fonctionnaient correctement au départ maintenant elle sont rouge au départ, puis sont soit jaunes soit éteintes (mais plus de clignotement). Je ne comprends pas non plus le problème car j'utilise exactement les mêmes composants que pour un autre projet qui lui fonctionne sans soucis avec les leds.

Donc j'ai enregistré ce que j'ai fait et mis dans un coin et j'attends tes conseils pour être guidé ;)

Merci d'avance à toi

déjà ce que tu pourrais essayer de faire c'est créer un projet pour chaque fonctionnalité, par exemple:

  • 1 pour explorer la communication avec les modules NRF et le fait de créer des scénarios en fonction de ce que tu veux faire,
  • 1 pour l'allumage des leds, voir si c'est pas juste que tu les as cramées (c'est un motif pour les couleurs cheloues, le fait de cramer, pour une diode) ou que t'as des courants de fuite dans tes transistors
  • 1 pour faire fonctionner tes buzzers (et aussi vérifier qu'ils sont toujours en bon état)

ça te permettrait de mieux comprendre comment ça fonctionne, et de mieux les emboiter après…

+0 -0

Ok je peux essayer de faire ça.

J'avais déjà fait un projet simple pour comprendre la programmation des modules NRF (un module avec un bouton poussoir et un avec une led qui s'allume quand on appuie sur le bouton) et ça fonctionnait parfaitement.

Pour les leds je vais tester voir si la bande est toujours fonctionnel "simplement". Si c'est un problème de courant de fuite d'où est-ce que ça peut venir ? De mauvaises soudures ? Mauvais montage ? Élément défaillant ?

Pour les buzzers si tu veux dire mes haut parleurs c'est un problème résolu j'avais simplement fait une erreur dans mon code maintenant plus de soucis. Si tu veux parler de mon boitier dans sa totalité étant donné que la partie "buzzer" se limite à un boitier de dérivation électrique et un piezo je ne pense pas qu'il y est de soucis de ce côté mais je vais également tester ça.

Je teste donc ça de mon côté et je reviens poster le résultat.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte