STM32Butterfly2: sterowanie LED RGB za pomocą wyspecjalizowanego sterownika PCA9633
W dużej liczbie realizowanych projektów niezbędne jest zapewnienie komunikacji z elementami zewnętrznymi, w tym celu stosowane są różne standardy. Poniższy projekt przedstawia użycie jednego ze stosowanych standardów w komunikacji – magistrali I2C. Do tego celu wykorzystano moduł KAmodRGB, którego sercem jest czterokanałowy sterownik diod LED firmy NXP – PCA9633. Powyższy sterownik na płytce steruje diodami LED: jednokolorową oraz zintegrowaną diodą RGB.
Działanie przedstawionej aplikacji polega na zwiększaniu, poprzez odchylenie joysticka w odpowiednim kierunku, jasności świecenia diody LED podłączonej do danego kanału. Dłuższe przytrzymanie joysticka w jednej pozycji spowoduje powtórzenie czynności. Natomiast wciśnięcie joysticka prowadzi do zgaszenia wszystkich diod LED. W przykładzie wykorzystano gotowy moduł z układem PCA9633 i LED-RGB – KAmodRGB (fotografia 1), którego schemat pokazano na rysunku 2.
Fot. 1. Wygląd modułu KAmodRGB
Rys. 2. Schemat elektryczny modułu KAmodRGB
Projekt został przygotowany dla zestawów STM32Butterfly2 oraz STM32Butterfly. Ze względu na różnice w podłączonych liniach do joysticka projekt wymaga oddzielnej kompilacji. Sprowadza się to do wywołania kompilacji z argumentem BOARD=1, w przypadku wykorzystania zestawu STM32Butterfly.
Zestaw uruchomieniowy STM32Butterfly2 i STM32Butterfly wyposażono w złącze dedykowane do komunikacji w standardzie I2C, identyczne złącze występuje w module KAmodRGB. W związku z powyższym połączenie zestawu ewaluacyjnego z modułem ogranicza się do połączenia wykonanego 1:1 obu złącz I2C, do tego celu można zastosować przewód połączeniowy CAB_HU04-30. W przypadku stosowaniu przewodów pojedynczych połączenia wykonujemy zgodnie z rysunkiem 3.
Rys. 3. Schemat połączeń pomiędzy STM32Butterfly2 i KAmodRGB (można je wykonać za pomocą kabla CAB_HU04-30 z oferty KAMAMI.pl)
Poniżej przedstawiono listing głównej części programu sterującego pracą mikrokontrolera.
int main(void) { //JOY pin configuration input pullup VCC RCC->APB2ENR |= JOY_PORT_APB2; io_config_ext(JOY_PORT, JOY_BITS, GPIO_MODE_INPUT, GPIO_CNF_IN_PULLUP ); io_set_clr_mask( JOY_PORT, JOY_BITS, JOY_BITS ); //Initialize system timer time_init(); //Initialize the i2c module i2cm_init(I2C_SPEED); //Initialize the RGB controler int res = rgb_init(); if(res<0) { for(;;); //Doesn't work hangup } uint8_t r=0; uint8_t g=0; uint8_t b=0; uint8_t a=0; //Main loop for(;;) { //Read joy state int jstate1 = joy_keys(); wait_ms(KBD_DEBOUNCE_TIME); int jstate2 = joy_keys(); if(jstate1 && jstate1==jstate2) { switch(jstate1) { case JOY_U: r++; break; case JOY_D: g++; break; case JOY_L: b++; break; case JOY_R: a++; break; case JOY_OK: r=0; g=0; b=0; a=0; break; } rgb_set_color(RGBA(r,g,b,a)); } } return 0; }