T Shirt d'ambiance connecté

De Wiki d'activités IMA

T-Shirt d'ambiance musicale augmentée IotTCa3.jpg

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

(Démo des mathématiques ici :)