T Shirt d'ambiance connecté
T-Shirt d'ambiance musicale augmentée
Sommaire
Présentation du projet
Ce projet de création d'objet connecté part d'une idée toute simple : rendre de la musique visuelle. L'objectif est de créer, pour un utilisateur, un avatar musical reflétant son ambiance sonore du moment.
Visible directement sur son T-shirt par exemple, le projet consiste à animer un visage (smiley) constitué de leds multicolores en fonction du son (à la manière d'un spectroscope). Le son peut être diffusé via un media quelconque (lecteur mp3, téléphone...) possédant une prise jack ou bien par WiFi, puis ressortable vers un casque ou éventuellement une enceinte connectée par exemple.
Objectifs
- Acquérir et échantillonner un signal audio (analogique)
- Le traiter en le décomposant selon les fréquences qui le constituent (FFT)
- Commander les matrices de leds NeoPixels en fonction des composantes fréquentielles du son échantillonné
Solution technique retenue et étude de faisabilité
Étude de faisabilité via un Intel Edison
Etude de l'utilisation d'un FPGA pour le traitement du son
Solution retenue : Arduino !
Partie Edison
#include "mraa/aio.h" #define GPIO_NUMBER 12 #define GPIO_BASE_OFFSET 2 int init_gpio(mraa_gpio_context* gpios){ int i; for(i=0; i<GPIO_NUMBER; i++) gpios[i] = NULL; for(i=0; i<GPIO_NUMBER; i++){ gpios[i] = mraa_gpio_init(GPIO_BASE_OFFSET+i); if(gpios[i] == NULL){ printf("Unable to get context for pin %d\n", i); return 1; } mraa_gpio_dir(gpios[i], MRAA_GPIO_OUT); } return 0; } int main(){ uint8_t ret; uint16_t adc_value = 0; mraa_aio_context adc_a0 = NULL; mraa_gpio_context gpio[GPIO_NUMBER]; mraa_init(); adc_a0 = mraa_aio_init(0); mraa_aio_set_bit(adc_a0, 12); // 12 bits resolution ret = init_gpio(gpio); if (adc_a0 == NULL){ printf("Unable to initialize ADC\n"); return 1; } if(ret != 0){ printf("Unable to initialize GPIOs\n"); return 2; } for (;;){ adc_value = mraa_aio_read(adc_a0); fprintf(stdout, "ADC A0 read %X - %d\n", adc_value, adc_value); mraa_gpio_write(gpio[0x0], ((adc_value & 0x001) == 0x001)); mraa_gpio_write(gpio[0x1], ((adc_value & 0x002) == 0x002)); mraa_gpio_write(gpio[0x2], ((adc_value & 0x004) == 0x004)); mraa_gpio_write(gpio[0x3], ((adc_value & 0x008) == 0x008)); mraa_gpio_write(gpio[0x4], ((adc_value & 0x010) == 0x010)); mraa_gpio_write(gpio[0x5], ((adc_value & 0x020) == 0x020)); mraa_gpio_write(gpio[0x6], ((adc_value & 0x040) == 0x040)); mraa_gpio_write(gpio[0x7], ((adc_value & 0x080) == 0x080)); mraa_gpio_write(gpio[0x8], ((adc_value & 0x100) == 0x100)); mraa_gpio_write(gpio[0x9], ((adc_value & 0x200) == 0x200)); mraa_gpio_write(gpio[0xA], ((adc_value & 0x400) == 0x400)); mraa_gpio_write(gpio[0xB], ((adc_value & 0x800) == 0x800)); } mraa_aio_close(adc_a0); return MRAA_SUCCESS; }
... and NOPE
Partie Artix 7 NOPE
Partie Arduino Ultimate tuto, a preview of the simplicity : Free efficient project here