Dernière révision : septembre 2023










Projet Arduino n° 4

Philippe Notez (philippe.notez@musee-info.fr)





Sommaire

Introduction

L’électronique et l’informatique ont profondément modifié notre société. C’est certainement la révolution industrielle la plus rapide de l’histoire de l’humanité. En effet, l’ordinateur que nous connaissons aujourd’hui était tout simplement inimaginable il y a seulement une cinquantaine d’années. Et avec les Arduino, les ESP8266 ou les Raspberry Pi Pico, l'aventure est loin d'être terminée.

L’auteur ne pourra en aucun cas être tenu responsable des dommages qui résulteraient de l’utilisation des informations publiées sur ce site, sous licence Creative Commons BY-NC-SA. Toute reproduction ou modification d'un document, même partielle, est autorisée à condition que son origine et le nom de l'auteur soient clairement indiqués (BY), qu'il soit utilisé à des fins non commerciales (NC), que son mode de diffusion soit identique au document initial (SA), et que cela ne porte pas atteinte à l’auteur.

Ce document présente un projet utilisant une carte Arduino, en espérant toujours être le plus clair et précis possible. Malgré tout le soin apporté à la rédaction, l'auteur vous remercie de bien vouloir le contacter si vous relevez la moindre erreur ou omission, et vous souhaite une agréable lecture.

Si vous avez apprécié ce document, vous pouvez faire un don ici. Merci pour votre soutien.


Objectif

Gérer un lecteur MP3 (module YX5300) et un écran OLED 128 x 64 (module SSD1306),
afficher un chenillard sur 4 leds RVB (module KY-009).


Niveau




Matériel utilisé
  • un support pour Arduino Nano ou une plaque d'essai (breadboard) 170 / 400 / 830 points
  • une carte Arduino Nano
  • un module 5 boutons analogiques
  • quatre modules KY-009
  • rouge = 1,8 V : 4 résistances de 330 ohm (10 mA)
  • bleu et vert = 2,8 V : 8 résistances de 220 ohm (10 mA)
  • un module SSD1306
  • un module YX5300 et une carte µSD
  • un câble jack stéréo mâle / mâle
  • un module TDA2822M (amplificateur 2 x 1 W à 9 V) ou un module PAM8610
    (amplificateur 2 x 10 W à 13 V) ou un module TDA7297 (amplificateur 2 x 15 W à 16 V)
  • deux haut-parleurs 8 ohm (puissance à définir en fonction de l'amplificateur)
  • une alimentation stabilisée ou piles / accumulateurs / batterie pour une utilisation mobile
    (caractéristiques à définir en fonction de l'amplificateur)
  • des câbles Dupont
  • un câble USB pour la liaison avec l'ordinateur

Programme (sketch)

ky-009_mp3_ssd1306.ino
// gérer un lecteur MP3 (module YX5300) et un écran OLED 128 x 64 (module SSD1306),
// afficher un chenillard sur quatre leds RVB (module KY-009)

#include <Wire.h>
#include <Adafruit_SSD1306.h>

#define b1 13
#define r1 12
#define v1 11
#define b2 10
#define r2 9
#define v2 8
#define b3 7
#define r3 6
#define v3 5
#define b4 4
#define r4 3
#define v4 2
#define start_mp3 0x7E
#define version_mp3 0xFF
#define lon_cmd 0x06
#define stop_mp3 0xEF
#define carte_sd 0x02
#define temps 75

Adafruit_SSD1306 aff_oled(128,64,&Wire);

unsigned char play_pause=1;

void setup()
  {
  int test_btn;

  pinMode(b1,OUTPUT);
  pinMode(r1,OUTPUT);
  pinMode(v1,OUTPUT);
  pinMode(b2,OUTPUT);
  pinMode(r2,OUTPUT);
  pinMode(v2,OUTPUT);
  pinMode(b3,OUTPUT);
  pinMode(r3,OUTPUT);
  pinMode(v3,OUTPUT);
  pinMode(b4,OUTPUT);
  pinMode(r4,OUTPUT);
  pinMode(v4,OUTPUT);
  Serial.begin(9600);
  commande_mp3(0x0C,0x00);      // initialiser le module MP3
  commande_mp3(0x09,carte_sd);  // définir le support
  commande_mp3(0x1A,0x00);      // autoriser la sortie audio
  commande_mp3(0x06,0x1E);      // volume (0x00 <= volume <= 0x1E)
  Wire.begin();
  aff_oled.begin(SSD1306_SWITCHCAPVCC,0x3C);
  aff_oled.display();                   // afficher le motif intégré
  delay(1000);
  aff_oled.setTextColor(SSD1306_WHITE); // obligatoire !
  aff_oled.setTextSize(2);              // police 12 x 16
  aff_oled.clearDisplay();
  // ligne 1
  aff_oled.setCursor(0,0);
  aff_oled.print("Press a");
  // ligne 2
  aff_oled.setCursor(0,16);
  aff_oled.print("yellow");
  // ligne 3
  aff_oled.setCursor(0,32);
  aff_oled.print("button to");
  // ligne 4
  aff_oled.setCursor(0,48);
  aff_oled.print("start...");
  aff_oled.display();
  do test_btn=analogRead(A0);
  while (test_btn>1013);
  commande_mp3(0x03,0x01);  // lire le premier fichier
  commande_mp3(0x19,0x00);  // lire le fichier en boucle
  aff_oled.clearDisplay();
  // ligne 1
  aff_oled.setCursor(0,0);
  aff_oled.print("MP3 PLAYER");
  // ligne 2
  aff_oled.setCursor(12,16);
  aff_oled.print("--------");
  // ligne 4
  aff_oled.setCursor(0,48);
  aff_oled.print("Playing...");
  aff_oled.display();
  }

void loop()
  {
  chenillard_bleu_droite();
  chenillard_bleu_rouge_gauche();
  chenillard_rouge_droite();
  chenillard_rouge_vert_gauche();
  chenillard_vert_droite();
  chenillard_bleu_vert_gauche();
  chenillard_bleu_vert_droite();
  chenillard_vert_gauche();
  chenillard_rouge_vert_droite();
  chenillard_rouge_gauche();
  chenillard_bleu_rouge_droite();
  chenillard_bleu_gauche();
  }

void chenillard_bleu_droite()
  {
  digitalWrite(b1,HIGH);
  test_touche();
  digitalWrite(b2,HIGH);
  test_touche();
  digitalWrite(b3,HIGH);
  test_touche();
  digitalWrite(b4,HIGH);
  test_touche();
  digitalWrite(b1,LOW);
  test_touche();
  digitalWrite(b2,LOW);
  test_touche();
  digitalWrite(b3,LOW);
  test_touche();
  digitalWrite(b4,LOW);
  test_touche();
  }

void chenillard_rouge_droite()
  {
  digitalWrite(r1,HIGH);
  test_touche();
  digitalWrite(r2,HIGH);
  test_touche();
  digitalWrite(r3,HIGH);
  test_touche();
  digitalWrite(r4,HIGH);
  test_touche();
  digitalWrite(r1,LOW);
  test_touche();
  digitalWrite(r2,LOW);
  test_touche();
  digitalWrite(r3,LOW);
  test_touche();
  digitalWrite(r4,LOW);
  test_touche();
  }

void chenillard_vert_droite()
  {
  digitalWrite(v1,HIGH);
  test_touche();
  digitalWrite(v2,HIGH);
  test_touche();
  digitalWrite(v3,HIGH);
  test_touche();
  digitalWrite(v4,HIGH);
  test_touche();
  digitalWrite(v1,LOW);
  test_touche();
  digitalWrite(v2,LOW);
  test_touche();
  digitalWrite(v3,LOW);
  test_touche();
  digitalWrite(v4,LOW);
  test_touche();
  }

void chenillard_bleu_rouge_droite()
  {
  digitalWrite(b1,HIGH);
  digitalWrite(r1,HIGH);
  test_touche();
  digitalWrite(b2,HIGH);
  digitalWrite(r2,HIGH);
  test_touche();
  digitalWrite(b3,HIGH);
  digitalWrite(r3,HIGH);
  test_touche();
  digitalWrite(b4,HIGH);
  digitalWrite(r4,HIGH);
  test_touche();
  digitalWrite(b1,LOW);
  digitalWrite(r1,LOW);
  test_touche();
  digitalWrite(b2,LOW);
  digitalWrite(r2,LOW);
  test_touche();
  digitalWrite(b3,LOW);
  digitalWrite(r3,LOW);
  test_touche();
  digitalWrite(b4,LOW);
  digitalWrite(r4,LOW);
  test_touche();
  }

void chenillard_bleu_vert_droite()
  {
  digitalWrite(b1,HIGH);
  digitalWrite(v1,HIGH);
  test_touche();
  digitalWrite(b2,HIGH);
  digitalWrite(v2,HIGH);
  test_touche();
  digitalWrite(b3,HIGH);
  digitalWrite(v3,HIGH);
  test_touche();
  digitalWrite(b4,HIGH);
  digitalWrite(v4,HIGH);
  test_touche();
  digitalWrite(b1,LOW);
  digitalWrite(v1,LOW);
  test_touche();
  digitalWrite(b2,LOW);
  digitalWrite(v2,LOW);
  test_touche();
  digitalWrite(b3,LOW);
  digitalWrite(v3,LOW);
  test_touche();
  digitalWrite(b4,LOW);
  digitalWrite(v4,LOW);
  test_touche();
  }

void chenillard_rouge_vert_droite()
  {
  digitalWrite(r1,HIGH);
  digitalWrite(v1,HIGH);
  test_touche();
  digitalWrite(r2,HIGH);
  digitalWrite(v2,HIGH);
  test_touche();
  digitalWrite(r3,HIGH);
  digitalWrite(v3,HIGH);
  test_touche();
  digitalWrite(r4,HIGH);
  digitalWrite(v4,HIGH);
  test_touche();
  digitalWrite(r1,LOW);
  digitalWrite(v1,LOW);
  test_touche();
  digitalWrite(r2,LOW);
  digitalWrite(v2,LOW);
  test_touche();
  digitalWrite(r3,LOW);
  digitalWrite(v3,LOW);
  test_touche();
  digitalWrite(r4,LOW);
  digitalWrite(v4,LOW);
  test_touche();
  }

void chenillard_bleu_gauche()
  {
  digitalWrite(b4,HIGH);
  test_touche();
  digitalWrite(b3,HIGH);
  test_touche();
  digitalWrite(b2,HIGH);
  test_touche();
  digitalWrite(b1,HIGH);
  test_touche();
  digitalWrite(b4,LOW);
  test_touche();
  digitalWrite(b3,LOW);
  test_touche();
  digitalWrite(b2,LOW);
  test_touche();
  digitalWrite(b1,LOW);
  test_touche();
  }

void chenillard_rouge_gauche()
  {
  digitalWrite(r4,HIGH);
  test_touche();
  digitalWrite(r3,HIGH);
  test_touche();
  digitalWrite(r2,HIGH);
  test_touche();
  digitalWrite(r1,HIGH);
  test_touche();
  digitalWrite(r4,LOW);
  test_touche();
  digitalWrite(r3,LOW);
  test_touche();
  digitalWrite(r2,LOW);
  test_touche();
  digitalWrite(r1,LOW);
  test_touche();
  }

void chenillard_vert_gauche()
  {
  digitalWrite(v4,HIGH);
  test_touche();
  digitalWrite(v3,HIGH);
  test_touche();
  digitalWrite(v2,HIGH);
  test_touche();
  digitalWrite(v1,HIGH);
  test_touche();
  digitalWrite(v4,LOW);
  test_touche();
  digitalWrite(v3,LOW);
  test_touche();
  digitalWrite(v2,LOW);
  test_touche();
  digitalWrite(v1,LOW);
  test_touche();
  }

void chenillard_bleu_rouge_gauche()
  {
  digitalWrite(b4,HIGH);
  digitalWrite(r4,HIGH);
  test_touche();
  digitalWrite(b3,HIGH);
  digitalWrite(r3,HIGH);
  test_touche();
  digitalWrite(b2,HIGH);
  digitalWrite(r2,HIGH);
  test_touche();
  digitalWrite(b1,HIGH);
  digitalWrite(r1,HIGH);
  test_touche();
  digitalWrite(b4,LOW);
  digitalWrite(r4,LOW);
  test_touche();
  digitalWrite(b3,LOW);
  digitalWrite(r3,LOW);
  test_touche();
  digitalWrite(b2,LOW);
  digitalWrite(r2,LOW);
  test_touche();
  digitalWrite(b1,LOW);
  digitalWrite(r1,LOW);
  test_touche();
  }

void chenillard_bleu_vert_gauche()
  {
  digitalWrite(b4,HIGH);
  digitalWrite(v4,HIGH);
  test_touche();
  digitalWrite(b3,HIGH);
  digitalWrite(v3,HIGH);
  test_touche();
  digitalWrite(b2,HIGH);
  digitalWrite(v2,HIGH);
  test_touche();
  digitalWrite(b1,HIGH);
  digitalWrite(v1,HIGH);
  test_touche();
  digitalWrite(b4,LOW);
  digitalWrite(v4,LOW);
  test_touche();
  digitalWrite(b3,LOW);
  digitalWrite(v3,LOW);
  test_touche();
  digitalWrite(b2,LOW);
  digitalWrite(v2,LOW);
  test_touche();
  digitalWrite(b1,LOW);
  digitalWrite(v1,LOW);
  test_touche();
  }

void chenillard_rouge_vert_gauche()
  {
  digitalWrite(r4,HIGH);
  digitalWrite(v4,HIGH);
  test_touche();
  digitalWrite(r3,HIGH);
  digitalWrite(v3,HIGH);
  test_touche();
  digitalWrite(r2,HIGH);
  digitalWrite(v2,HIGH);
  test_touche();
  digitalWrite(r1,HIGH);
  digitalWrite(v1,HIGH);
  test_touche();
  digitalWrite(r4,LOW);
  digitalWrite(v4,LOW);
  test_touche();
  digitalWrite(r3,LOW);
  digitalWrite(v3,LOW);
  test_touche();
  digitalWrite(r2,LOW);
  digitalWrite(v2,LOW);
  test_touche();
  digitalWrite(r1,LOW);
  digitalWrite(v1,LOW);
  test_touche();
  }

// envoyer une commande au module MP3 via la liaison série de l'Arduino (broche TX1)
void commande_mp3(byte commande,byte par)
  {
  Serial.write(start_mp3);
  Serial.write(version_mp3);
  Serial.write(lon_cmd);  // longueur (en octets) de la commande, sans compter "start_mp3" et "stop_mp3"
  Serial.write(commande);
  Serial.write(0);        // pas d'information en retour (broche TX du module MP3 non connectée à la broche RX0 de l'Arduino)
  Serial.write(0);        // premier paramètre (poids fort)
  Serial.write(par);      // deuxième paramètre (poids faible)
  Serial.write(stop_mp3);
  delay(200);
  }

// tester l'appui sur une touche
void test_touche()
  {
  int test_btn;

  test_btn=analogRead(A0);
  // bouton gauche (previous song)
  if ((test_btn>77) && (test_btn<98))
    {
    commande_mp3(0x02,0x00);
    commande_mp3(0x19,0x00);  // lire le fichier en boucle
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Prev. song");
    aff_oled.display();
    delay(500);
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Playing...");
    aff_oled.display();
    }
  // bouton droit (next song)
  if ((test_btn>21) && (test_btn<42))
    {
    commande_mp3(0x01,0x00);
    commande_mp3(0x19,0x00);  // lire le fichier en boucle
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Next song");
    aff_oled.display();
    delay(500);
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Playing...");
    aff_oled.display();
    }
  // bouton haut (volume up)
  if (test_btn<10)
    {
    commande_mp3(0x04,0x00);
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Volume up");
    aff_oled.display();
    delay(500);
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Playing...");
    aff_oled.display();
    }
  // bouton bas (volume down)
  if ((test_btn>155) && (test_btn<176))
    {
    commande_mp3(0x05,0x00);
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Vol. down");
    aff_oled.display();
    delay(500);
    aff_oled.clearDisplay();
    // ligne 1
    aff_oled.setCursor(0,0);
    aff_oled.print("MP3 PLAYER");
    // ligne 2
    aff_oled.setCursor(12,16);
    aff_oled.print("--------");
    // ligne 4
    aff_oled.setCursor(0,48);
    aff_oled.print("Playing...");
    aff_oled.display();
    }
  // bouton décalé (play/pause)
  if ((test_btn>340) && (test_btn<361))
    {
    // play
    if (play_pause==0)
      {
      commande_mp3(0x0D,0x00);
      aff_oled.clearDisplay();
      // ligne 1
      aff_oled.setCursor(0,0);
      aff_oled.print("MP3 PLAYER");
      // ligne 2
      aff_oled.setCursor(12,16);
      aff_oled.print("--------");
      // ligne 4
      aff_oled.setCursor(0,48);
      aff_oled.print("Playing...");
      aff_oled.display();
      play_pause=1;
      }
    // pause
    else
      {
      commande_mp3(0x0E,0x00);
      aff_oled.clearDisplay();
      // ligne 1
      aff_oled.setCursor(0,0);
      aff_oled.print("MP3 PLAYER");
      // ligne 2
      aff_oled.setCursor(12,16);
      aff_oled.print("--------");
      // ligne 4
      aff_oled.setCursor(0,48);
      aff_oled.print("Pause");
      aff_oled.display();
      play_pause=0;
      }
    }
  // aucun bouton appuyé
  if (test_btn>1013) delay(temps);
  }







Documentation complémentaire

Haut de page