ARDUINO Uno - "Remplacement" du Bus SPI par du Bluetooth pour streaming MP3

Bonjour tout le monde,

Je suis nouveau dans le monde Arduino et j'ai un petit souci dans le cadre de mon projet. Je vous explique globalement l'idée :

L'idée de base c'est de faire du Streaming MP3 via Bluetooth.

Matériel employé :
Mon projet se divise en deux parties, un partie "émetteur" qui est composée d'un arduino uno et d'un shield µSD de chez Sparkfun où se trouve mon fichier mp3.

L'autre partie "récepteur" se compose aussi d'un Uno avec un Shield mp3 de chez SparkFun qui décode le mp3 récupéré.

Mon problème :

Je pensais transférer morceau par morceau (octet par octet) le contenu de mon fichier mp3 via UART et le stocker temporairement dans une carte SD du shield mp3 de réception (qui ferait office de mémoire tampon). Seulement en réception l'UART de mon Uno est extrêmement long...... Il m'a fallu 20 minutes en optimisant tout pour récupérer un fichier audio d'une minute (encodé à 96 kbps).

Je me suis donc décidé à passer par le bus SPI pour effectuer mon transfert. Sauf que je ne trouve personne ayant fait cela et j'ai du mal à savoir quels chip bluetooth pourraient m'aider.

Mon idée:
Le must serait que mes trois signaux du bus soit "transmis" par le module bluetooth. C'est à dire que mon bus SPI est "virtualisé" et que, même si j'ai un transfert bluetooth entre les deux arduinos, c'est comme s'il y avait encore des fils.

Sauf que la ligne SCK me semble impossible à re-générer en réception par un quelconque module bluetooth.

C'est ici que je ne sais plus comment faire... =( Comment envoyer cette donnée suffisament vite via bluetooth pour streamer?

Le Bluetooth Bee de seedstudio possède une entrée SPI mais je ne sais pas si je peux la faire fonctionner comme je le veux. Je leur ai envoyé un mail malgré tout pour avoir plus d'infos.

Merci d'avance pour votre aide,
Brian

Bonjour,

je peux me tromper mais intuitivement j'aurais plutôt tendance à dire que c'est plutôt la vitesse d'écriture sur la carte SD qui te ralentit.
À peu de choses prêt, la vitesse d'échantillonnage de ton fichier (96kbps) est du même ordre de grandeur que la vitesse de la liaison série (si on considère un paramétrage à 115200 baud). Donc un fichier d'une minute doit être transféré en une minute. Si ça va moins vite c'est que le problème est ailleurs. Ou alors que je me suis trompé :slight_smile:

Bonsoir et merci pour ta réponse rapide. Effectivement cela peut être possible, je vais essayer.

Pour moi la vitesse du bus SPI est suffisament supérieure à celle de l’UART, sa clock étant de 4 MHz max. Mon code pour la réception en UART était le suivant avec un BaudRate de 256000 et où data est mon buffer de réception:

const int chipSelect = 9;

#include <SdFat.h>
SdFat sd;
SdFile myFile;

char data[512];
int writtenBytes;
int flag;

void setup() {
  Serial.begin(256000);
  Serial.setTimeout(3000);
  // Initialize SdFat or print a detailed error message and halt
  // Use half speed like the native library.
  // change to SPI_FULL_SPEED for more performance.
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

  // delete possible existing file
  sd.remove("track001.mp3");

  // open the file for write at end like the Native SD library
  if (!myFile.open("track001.mp3", O_RDWR | O_CREAT | O_AT_END)) {
    sd.errorHalt("opening track001.mp3 for write failed");
  }

  // close the file:
  myFile.close();
}

void loop() {
  
     }
     
/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  //myFile.open("track001.mp3", O_RDWR | O_AT_END);
  Serial.readBytes(data,512);
  //myFile.write(data,512);
  //myFile.close();
  Serial.write('s');
}

Je vais tester le temps de réception sans copie vers la carte SD pour voir et je reviendrai par ici ^^

Bonjour !! :smiley:

Sincèrement merci, j'ai repensé à ce que tu m'as dit et j'ai directement renvoyé le contenu du buffer de l'UART dans le décodeur en modifiant la librairie de Bill Porter.

A 115200 Baud le son n'est pas extra mais en passant à 256000 Baud c'est parfait (pour du son encodé à 96 kbps) .

Plus besoin de passer par le SPI du coup c'est génial.
Encore merci pour ton intuition ^^