Vous ne pouvez pas modifier cette page, pour les raisons suivantes :
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 [[Catégorie:Arduino]]
Résumé :
Modification mineure Suivre cette page
Annuler