Joujoumus

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher
Joujoumus
Image défaut fiche idée.png


Pour modifier la page utiliser l'onglet Modifier avec formulaire.

Résumé Réaliser une peluche musicale
Auteur(s) Morora
Licence CC-BY-SA 3
Date de création 01 janvier 2016


Intentions / Contexte

Participer à l'élévation du niveau esthétique sonore

Principe de fonctionnement

Jouet musical et de Haute Qualité Sonore au fonctionnement intuitif

Besoins / Compétences

De l'électronique, beaucoup d'électronique et un peu de programmation

Documentation

Cahier des charges:

-jouet convenant à des personnes à partir de 1 an

-jouet produisant des sons avec les caractéristiques suivante: pas de réduction de débit (pas de mp3...), stéréo.

-les sons en mémoire peuvent être changés

-la lecture des sons est déclenchée par les mouvements imprimés à la peluche

Composants:

-un capteur de mouvement

-un microcontrôleur

-un lecteur de son

-une carte mémoire

-deux circuits d'amplification

-deux haut-parleur.


Historique: Ce projet a commencé pendant l'hiver 2015-2016. Il y a d'abord eu un croquis sur un ticket de caisse dessiné dans un café. Les composants ont rapidement été acheté puis assemblés sur une carte à pastille. Des obstacles terribles se sont aussitôt dressés en travers du chemin de l'accomplissement:

-faux contacts divers

-obstacle majeur: communication série entre arduino et lecteur de son.

Premièrement suivant la version de l'arduino utilisé il faut utiliser une bibliothèque particulière pour la communication série (Serial1 pour arduino micro et Leonardo)

Deuxièmement l'arduino utilise des niveaux logiques sur 5V tandis que le SOMO admet des niveaux logiques en 3,3V. Il faut réaliser un pont diviseur de tension.

Un premier prototype a été mis en place au bout de six mois environ, soit à l'été 2015. Mais il semblait fragile et le circuit a été gravé sur une plaque en utilisant le logiciel Eagle et une graveuse numérique pour mettre en place le deuxième prototype. Malheureusement, suite à une erreur humaine, la plaque a été gravée à l'envers et la soudure et surtout la recherche des causes de dysfonctionnement se sont avérées très très très ardus. Nombre de fois ce prototype a failli être jeté dans divers fleuves, mais la conscience écologique de la conceptrice l'en a empêchée.

Finalement, en janvier 2016, un espoir apparaît car les circuits d'amplifications fonctionnent à peu près et la communication entre l'arduino et le SOMOII est établie. Il reste la partie la plus intéressante: le comportement en fonction des données du capteur de mouvement.

Code minimal pour la communication série:

byte NEXT[8] = {0x7E, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xEF};
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial1.begin(9600);
  Serial.begin(9600);
  delay(1000);}
  void loop(){
 Serial1.write(NEXT, 8);
 Serial1.write('\n');
 digitalWrite(LED_BUILTIN, LOW);
 Serial.write("serial");
 Serial.write('\n');
 delay(8000);
 digitalWrite(LED_BUILTIN, HIGH);
 delay(3000);}


Étape Acquisition des données du capteur et Analyse

-utilisation d'une interruption au lieu d'un délai

// INTERRUPTION TIMER /////////////////Variables globales//
boolean cliclac=0;
int factDiv=0;
const int zpin = A2;                  
const int ypin = A3;                  
const int xpin = A4;
float valZ, valY, valX;
int beta=0.8; 
float valX_precedente;
int valY_precedente=0;
int valZ_precedente=0;
float vitesseX;
float vitesseY=0;
float vitesseYprime=0;
float vitesseZ=0;
float vitesse_precedenteX;
float vitesse_precedenteY=0;
float vitesse_precedenteZ=0; 
/////////////////////////////////////////////////////////////////
/////////////// INIT ////////////////////////////////////////////

/////////////////////////////////////////////////////////////////

void setup() {
 valX=analogRead(xpin);
 valX = 0;
 vitesseX = 0;
 vitesse_precedenteX = 0;
 pinMode(13, OUTPUT);
 Serial.begin(115200);
 delay(1000);
 valX_precedente = analogRead(xpin);
 valY_precedente = analogRead(ypin);
 valZ_precedente = analogRead(zpin);
 //cesse les interruptions
 cli(); 
 //configuration du timer1
 TCCR1A = 0; //mise à 0 du registre
 TCCR1B = 0;
 TCNT1 = 0; //initialisation du compteur à 0
 //initialisation du registre comparateur pour obtenir une sous-fréquence à 1Hz
 // correspond à (freqATMEL=16MHz)/(prescaler=1024*freq_voulue=100Hz) cette valeur doit être inférieure à 2exp16
 OCR1A = 624; 
 //mode CTC
 TCCR1B |= (1<<WGM12); 
 //définition du prescaler. Correspond à 256
 TCCR1B |=(1<<CS12);
 TIMSK1 |= (1 <<OCIE1A);
 sei(); //permet les interruptions}
ISR(TIMER1_COMPA_vect){
   valZ=analogRead(zpin);
   valY=analogRead(ypin);
   valX=analogRead(xpin);
 //Calcul de la "vitesse"
 //vitesseX = valX - valX_precedente + vitesse_precedenteX*beta;
 vitesseX = (valX - valX_precedente)*0.1 + vitesse_precedenteX;
 valX_precedente=valX;
 vitesse_precedenteX=vitesseX;
 Serial.println(vitesseX);
 //Calcul de la "vitesse"
 vitesseY = valY - valY_precedente + vitesse_precedenteY*beta;
 //vitesseY = (valY - valY_precedente)*0.01 + vitesse_precedenteY;
 valY_precedente=valY;
 vitesse_precedenteY=vitesseY;
 //Calcul de la "vitesse"
 vitesseZ = valZ - valZ_precedente + vitesse_precedenteZ*beta;
 //vitesseX = (valX - valX_precedente)*0.01 + vitesse_precedenteX;
 valZ_precedente=valZ;
 vitesse_precedenteZ=vitesseZ;}
////////////////////////////////////////////////////
 void loop() {}

</nowiki> -calcul de la vitesse par intégration