Enceintes Bluetooth connectées

De Wiki de Projets IMA

Cahier des charges

Présentation générale du projet

Contexte

Lorsqu'on écoute de la musique chez soi, on ne peut profiter du son (sauf si on monte le volume très fort) quand on se déplace dans les différentes pièces. L'idée serait d'avoir une enceinte dans chaque pièce et que la musique suive notre déplacement.

Objectif du projet

L'objectif du projet est donc de créer un réseau d'enceintes bluetooth qui émettent du son en fonctione de la pièce dans laquelle on se trouve.

Description du projet

L'idée du projet est de permettre à un utilisateur d'envoyer de la musique de son téléphone via bluetooth afin d'écouter sa playlist dans toute sa maison. Les enceintes diffuseront de la musique dans la pièce où se trouve l'utilisateur. Ainsi, il pourra écouter ce qui lui plaît sans avoir à se soucier du volume de la musique.

Choix techniques : matériel et logiciel

  • Micro-contrôleur équipé d'un module bluetooth : RFDuino RFD22301
  • Téléphone mobile : LG G4C (Android)
  • IDE : Arduino

Étapes du projet

Partie 1 : Code Arduino

Notre premier code nous a permis de nous familiariser avec l'IDE Arduino avec des LED. Nous l'avons ensuite modifié pour comprendre l'utilisation des fonctionnalités bluetooth du microcontrôleur.

#include "RFduinoBLE.h"
//définition de la broche 2 de la carte en tant que variable
const int led_rouge = 2;
const int led_vert= 3;
 
//fonction d'initialisation de la carte
void setup()
{
    Serial.begin(9600); 
    RFduinoBLE.advertisementData = "CouDow";
    RFduinoBLE.deviceName = "Zizou"; // name of your RFduino.
    //initialisation de la broche 2 comme étant une sortie
    pinMode(led_rouge, OUTPUT);
    pinMode(led_vert, OUTPUT);
    
    RFduinoBLE.begin(); // activation bluetooth
    digitalWrite(led_rouge, HIGH);
    Serial.println("setup");
}

//fonction principale, elle se répète (s’exécute) à l'infini


void RFduinoBLE_onReceive(char *data, int len)
{
  Serial.println("avant réception");
  // display the first recieved byte
  Serial.println(data[0]);
}

void RFduinoBLE_onConnect()
{
  Serial.print("Nous sommes connectes\n");
  digitalWrite(led_vert, HIGH);
  digitalWrite(led_rouge, LOW);
} 

void RFduinoBLE_onDisconnect()
{
  Serial.print("Nous sommes deconnectes\n");
  digitalWrite(led_vert, LOW);
  digitalWrite(led_rouge, HIGH);
}

void loop()
{
}

Le second code concerne la génération d'un son pour tester le circuit avec l'enceinte.

#include "RFduinoBLE.h"
#include <Tone.h>


void setup()
{
  RFduinoBLE.deviceName = "Zizou";
  RFduinoBLE.advertisementData = "CouDow";
  pinMode(2,OUTPUT);
}

void loop()
{ 
  tone(2,660,100);
  delay(75);tone(2,660,100);
  delay(150);tone(2,660,100);
  delay(150);tone(2,510,100);
  delay(50);tone(2,660,100);
  delay(150);tone(2,770,100);
  delay(275);tone(2,380,100);
  delay(287);tone(2,510,100);
  delay(225);tone(2,380,100);
  delay(200);tone(2,320,100);
  delay(250);tone(2,440,100);
  delay(150);tone(2,480,80);
  delay(165);tone(2,450,100);
  delay(75);tone(2,430,100);
  delay(150);tone(2,380,100);
  delay(100);tone(2,660,80);
  delay(100);tone(2,760,50);
  delay(75);tone(2,860,100);
  delay(150);tone(2,700,80);
  delay(75);tone(2,760,50);
  delay(175);tone(2,660,80);
  delay(150);tone(2,520,80);
  delay(75);tone(2,580,80);
  delay(75);tone(2,480,80);
  delay(175);tone(2,510,100);
  delay(275);tone(2,380,100);
  delay(200);tone(2,320,100);
  delay(250);tone(2,440,100);
  delay(150);tone(2,480,80);
  delay(165);tone(2,450,100);
  delay(75);tone(2,430,100);
  delay(150);tone(2,380,100);
  delay(100);tone(2,660,80);
  delay(100);tone(2,760,50);
  delay(75);tone(2,860,100);
  delay(150);tone(2,700,80);
  delay(75);tone(2,760,50);
  delay(175);tone(2,660,80);
  delay(150);tone(2,520,80);
  delay(75);tone(2,580,80);
  delay(75);tone(2,480,80);
  delay(250);tone(2,500,100);
  delay(150);tone(2,760,100);
  delay(50);tone(2,720,100);
  delay(75);tone(2,680,100);
  delay(75);tone(2,620,150);
  delay(150);tone(2,650,150);
  delay(150);tone(2,380,100);
  delay(75);tone(2,430,100);
  delay(75);tone(2,500,100);
  delay(150);tone(2,430,100);
  delay(75);tone(2,500,100);
  delay(50);tone(2,570,100);
  delay(110);tone(2,500,100);
  delay(150);tone(2,760,100);
  delay(50);tone(2,720,100);
  delay(75);tone(2,680,100);
  delay(75);tone(2,620,150);
  delay(150);tone(2,650,200);
  delay(150);tone(2,1020,80);
  delay(150);tone(2,1020,80);
  delay(75);tone(2,1020,80);
  delay(150);tone(2,380,100);
  delay(150);tone(2,500,100);
  delay(150);tone(2,760,100);
  delay(50);tone(2,720,100);
  delay(75);tone(2,680,100);
  delay(75);tone(2,620,150);
  delay(150);tone(2,650,150);
  delay(150);tone(2,380,100);
  delay(75);tone(2,430,100);
  delay(75);tone(2,500,100);
  delay(150);tone(2,430,100);
  delay(75);tone(2,500,100);
  delay(50);tone(2,570,100);
  delay(110);tone(2,500,100);
  delay(150);tone(2,760,100);
  delay(50);tone(2,720,100);
  delay(75);tone(2,680,100);
  delay(75);tone(2,620,150);
  delay(150);tone(2,650,200);
  delay(150);tone(2,1020,80);
  delay(150);tone(2,1020,80);
  delay(75);tone(2,1020,80);
  delay(150);tone(2,380,100);
  delay(150);tone(2,500,100);
  delay(150);tone(2,760,100);
  delay(50);tone(2,720,100);
  delay(75);tone(2,680,100);
  delay(75);tone(2,620,150);
  delay(150);tone(2,650,150);
  delay(150);tone(2,380,100);
  delay(75);tone(2,430,100);
  delay(75);tone(2,500,100);
  delay(150);tone(2,430,100);
  delay(75);tone(2,500,100);
  delay(50);tone(2,570,100);
  delay(210);tone(2,585,100);
  delay(275);tone(2,550,100);
  delay(210);tone(2,500,100);
  delay(180);tone(2,380,100);
  delay(150);tone(2,500,100);
  delay(150);tone(2,500,100);
  delay(75);tone(2,500,100);
  delay(150);tone(2,500,60);
  delay(75);tone(2,500,80);
  delay(150);tone(2,500,60);
  delay(175);tone(2,500,80);
  delay(75);tone(2,580,80);
  delay(175);tone(2,660,80);
  delay(75);tone(2,500,80);
  delay(150);tone(2,430,80);
  delay(75);tone(2,380,80);
  delay(300);tone(2,500,60);
  delay(75);tone(2,500,80);
  delay(150);tone(2,500,60);
  delay(175);tone(2,500,80);
  delay(75);tone(2,580,80);
  delay(75);tone(2,660,80);
  delay(225);tone(2,870,80);
  delay(162);tone(2,760,80);
  delay(300);tone(2,500,60);
  delay(75);tone(2,500,80);
  delay(150);tone(2,500,60);
  delay(175);tone(2,500,80);
  delay(75);tone(2,580,80);
  delay(175);tone(2,660,80);
  delay(75);tone(2,500,80);
  delay(150);tone(2,430,80);
  delay(75);tone(2,380,80);
  delay(300);tone(2,660,100);
  delay(75);tone(2,660,100);
  delay(150);tone(2,660,100);
  delay(150);tone(2,510,100);
  delay(50);tone(2,660,100);
  delay(150);tone(2,770,100);
  delay(225);tone(2,380,100);
  //tells the user it is over and delays it a little before going to the top again
  delay(1000);
  tone(2,440,200);
  delay(200);
  delay(200);
  tone(2,440,400);
  delay(200);
  delay(200);
  delay(5000); 
  
}


Le dernier code est une adaptation du second avec la connection bluetooth. Un problème persiste cependant, le programme ne joue que les deux ou trois premières notes lors de la connection d'un appareil via bluetooth malgré de nombreuses recherches.

void setup()
{
  RFduinoBLE.deviceName = "Zizou";
  RFduinoBLE.advertisementData = "CouDow";
  pinMode(2,OUTPUT);
  RFduinoBLE.begin(); // activation bluetooth
}

void RFduinoBLE_onReceive(char *data, int len) {
 if (data[0]) { 
// les "tones"
 }
 else{}
}
void loop()
{ }


Partie 2 : Câblage électrique

La partie centrale de notre circuit est un microprocesseur RFDuino, qui permet de recevoir les informations (la musique) du téléphone via bluetooth afin de les transmettre aux enceintes. Nous l'avons connecté à un Wireless SD Shield pour permettre de stocker la musique utilisée ainsi qu'à un haut-parleur permettant la diffusion de cette musique.

Img circuit.jpg

Partie 3 : Communication Smartphone-Microprocesseur

La communication entre les deux composants se fait via une application Android.

Celle-ci permet de se connecter à l'enceinte et d'envoyer une valeur pour enclencher la fonction lecture du programme.

Suivi de l'avancement du Projet

Séance 1

Séance de découverte
- IDE arduino
- premiers essais : création d'un circuit simple avec une LED

Séance 2

Début du travail avec une enceinte : tentative d'envoi de données via bluetooth à l'enceinte.

Séance 3

Test et adaptation d'applications Android déjà existantes

Séance 4

Finalisation du câblage électrique avec le Wireless SD Shield avec les Schematics des différents composants

Tentative de lecture de fichier son .wav sur la carte SD à partir du téléphone en bluetooth

#include <SD.h>
#include <SPI.h>
#include <AudioZero.h>

void setup()
{
  // debug output at 115200 baud
  Serial.begin(115200);

  // 44100kHz stereo => 88200 sample rate
  AudioZero.begin(2*44100);
}

void loop()
{

  // open wave file from sdcard
  File myFile = SD.open("test.wav");
  // until the file is not finished  
  AudioZero.play(myFile);

  Serial.println("End of file. Thank you for listening!");
  while (true) ;
}

Problèmes rencontrés :
- toutes les librairies "audio" utilisées ne sont pas compatibles avec l'architecture de RFDUINO
- la bibliothèque "SD.h" renvoie des erreurs de compilation

  library AudioZero claims to run on [samd] architecture(s) and may be incompatible with your current board which runs on [RFduino] architecture(s)

Séance 5

Finalisation du poster

Derniers essais