LED pásek a akcelerometr

V této kapitole se seznámíš s ovládáním digitálního LED pásku. V druhé části předvedu jak spojit LED pásek s hodnotami z akcelerometru.

Digitální LED pásek

Je na čase pořádně rozblikat LED pásek na power modulu. Připoj Power Module, LED pásek a napájecí adaptér. Pásek z důvodu velkého příkonu nelze napájet jen z USB.

Nejprve se podíváme na jednoduchý příklad jak pásek oživit. V dalších kapitolách mu budeme již nastavovat vlastní barvy.

Následující kód po startu spustí funkcí bc_led_strip_effect_test(bc_led_strip_t *self), která zobrazí testovací animaci na pásku. Další stisk tlačítka B na Core Module provede tento test znova.

    #include <application.h>
    #include <bcl.h>

    //Instance tlačítka
    bc_button_t button;
    //Instance pásku
    bc_led_strip_t led_strip;

    void button_event_handler(bc_button_t *self, bc_button_event_t event, void *param)
    {
        (void) self;
        (void) param;
        if (event == BC_BUTTON_EVENT_PRESS)
        {
            bc_led_strip_effect_test(&led_strip);
        }
    }

    void application_init(void)
    {
        bc_button_init(&button, BC_GPIO_BUTTON, BC_GPIO_PULL_DOWN, false);
        bc_button_set_event_handler(&button, button_event_handler, NULL);

        // Inicializuj Power Module
        bc_module_power_init();
        // Inicializuj driver, buffer, délku a typ pásku
        bc_led_strip_init(&led_strip, bc_module_power_get_led_strip_driver(), &bc_module_power_led_strip_buffer_rgbw_144);

        // Spusť testovací animaci
        bc_led_strip_effect_test(&led_strip);
    }

Akcelerometr

Druhá ukázka je spojení předchozího LED pásku a akcelerometru, který je součástí Core Module. Na LED pásku se uprostřed rozsvítí jeden pixel a bude se posouvat v závislosti na náklonu Core Module doprava a doleva.

Opět musíme vytvořit instanci lis2dh12 pro objekt akcelerometru. Po inicializaci je třeba nastavit rychlost vzorkování a callback funkci. Tato funkce bude volána pokaždé, když akcelerometr naměří novou hodnotu. V této funkci potom voláním bc_lis2dh12_get_result_g získáme výsledné hodnoty zrychlení ve všech třech osách.

My použijeme pouze osu X a rozsah mezi +1g a -1g přepočteme na pozici na LED pásku. Pokud hodnota akcelerometru v ose X bude nulová, bude svítit prostřední pixel s indexem 72.

Podmínkou if(position >= 0 && position < 144) si musíme ohlídat rozsahy, protože akcelerometr může vracet i hodnoty větší jak 1 g pokud s ním pohybujeme.

#include <application.h>
#include <bcl.h>

// Počet pixelů
#define MAX_PIXELS 144

// Vytvoření interního DMA bufferu
static uint32_t _dma_buffer[MAX_PIXELS * 4 * 2];

// Struktura nastavující počet pixelů a interní buffer
static bc_led_strip_buffer_t led_strip_buffer =
{
    .type = BC_LED_STRIP_TYPE_RGBW,
    .count = MAX_PIXELS,
    .buffer = _dma_buffer
};

// Instance LED pásku
static bc_led_strip_t led_strip;

// Instance akcelerometru
bc_lis2dh12_t lis2dh12;

// Callback funkce pro zpracování naměřených dat z akcelerometru
void lis2dh12_event_handler(bc_lis2dh12_t *self, bc_lis2dh12_event_t event, void *event_param)
{
   (void) event_param;

   if (event == BC_LIS2DH12_EVENT_UPDATE)
   {
       // Struktura pro naplnění naměřenými hodnotami
       bc_lis2dh12_result_g_t result;

       // Načti naměřené hodnoty do struktury result
       if (bc_lis2dh12_get_result_g(self, &result))
       {
           uint32_t i;
           // Vymaž led pásek
           for( i = 0; i < 144; i++)
           {
               bc_led_strip_set_pixel_rgbw(&led_strip, i, 0 ,0 ,0, 0);
           }

           // Přepočti osu X akcelerometru na pozici  pixelu na LED pásku
           int32_t position = (result.x_axis * 72) + 72;

           if(position >= 0 && position < 144)
           {
               // Nastav bílou barvu na jeden pixel
               bc_led_strip_set_pixel_rgbw(&led_strip, position, 0, 0, 0, 100);
           }

           // Překresli LED pásek
           bc_led_strip_write(&led_strip);
       }
   }
}


void application_init(void)
{
   bc_led_strip_init(&led_strip, bc_module_power_get_led_strip_driver(), &led_strip_buffer);

   // Inicializace akcelerometru s nastavením sběrnice I2C0 a adresy 0x19
   bc_lis2dh12_init(&lis2dh12, BC_I2C_I2C0, 0x19);
   // Vzorkuj data každých 20ms
   bc_lis2dh12_set_update_interval(&lis2dh12, 20);
   // Registruj funkci
   bc_lis2dh12_set_event_handler(&lis2dh12, lis2dh12_event_handler, NULL);
}

results matching ""

    No results matching ""