I have started a new little project in order to find out how works an RGB led. Right now the software is pratically inexistent. I have writed just a few lines of code in order to test the circuit and RGB stripes made in China (I have found out that the blue and the green labels on stipes are inverted). I'm using an STM32F303 Discovery board and obviously ChibiOS\RT
[youtube]oMMXDLboix0[/youtube]
Code: Select all
/*
This file has been written by Guglielmi Rocco Marco.
This is part of Led Stipes Controller project <http://www.chibios.org>.
*/
#include "ch.h"
#include "hal.h"
#define GPIO_S1_RED ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIO_S1_GREEN ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIO_S1_BLUE ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIO_S2_RED ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIO_S2_GREEN ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIO_S2_BLUE ((GPIO_TypeDef *) GPIOF_BASE)
#define S1_RED 6
#define S1_GREEN 9
#define S1_BLUE 1
#define S2_RED 1
#define S2_GREEN 9
#define S2_BLUE 10
static double duty = 0.2f;
static int period = 10000;
/*===========================================================================*/
/* THREADS */
/*===========================================================================*/
static WORKING_AREA(waThdOut_1, 512);
static void clear_all(void){
palClearPad(GPIOE, GPIOE_LED3_RED);
palClearPad(GPIO_S1_RED, S1_RED);
palClearPad(GPIOE, GPIOE_LED6_GREEN);
palClearPad(GPIO_S1_GREEN, S1_GREEN);
palClearPad(GPIOE, GPIOE_LED4_BLUE);
palClearPad(GPIO_S1_BLUE, S1_BLUE);
palClearPad(GPIOE, GPIOE_LED10_RED);
palClearPad(GPIO_S2_RED, S2_RED);
palClearPad(GPIOE, GPIOE_LED7_GREEN);
palClearPad(GPIO_S2_GREEN, S2_GREEN);
palClearPad(GPIOE, GPIOE_LED9_BLUE);
palClearPad(GPIO_S2_BLUE, S2_BLUE);
}
static msg_t ThdOut_1(void *arg){
(void) arg;
while (TRUE){
/*palClearPad(GPIOE, GPIOE_LED3_RED);
palClearPad(GPIO_S1_RED, S1_RED);
chThdSleepMilliseconds(5);*/
clear_all();
palSetPad(GPIOE, GPIOE_LED3_RED);
palSetPad(GPIO_S1_RED, S1_RED);
chThdSleepMilliseconds(1000);
clear_all();
palSetPad(GPIOE, GPIOE_LED6_GREEN);
palSetPad(GPIO_S1_GREEN, S1_GREEN);
chThdSleepMilliseconds(1000);
clear_all();
palSetPad(GPIOE, GPIOE_LED4_BLUE);
palSetPad(GPIO_S1_BLUE, S1_BLUE);
chThdSleepMilliseconds(1000);
clear_all();
palSetPad(GPIOE, GPIOE_LED10_RED);
palSetPad(GPIO_S2_RED, S2_RED);
chThdSleepMilliseconds(1000);
clear_all();
palSetPad(GPIOE, GPIOE_LED7_GREEN);
palSetPad(GPIO_S2_GREEN, S2_GREEN);
chThdSleepMilliseconds(1000);
clear_all();
palSetPad(GPIOE, GPIOE_LED9_BLUE);
palSetPad(GPIO_S2_BLUE, S2_BLUE);
chThdSleepMilliseconds(1000);
}
return (msg_t) 0;
}
static msg_t ThdOut_2(void *arg){
(void) arg;
while (TRUE){
//palClearPad(GPIOE, GPIOE_LED6_GREEN);
//palClearPad(GPIO_S1_GREEN, S1_GREEN);
chThdSleepMilliseconds(5);
}
return (msg_t) 0;
}
static msg_t ThdOut_3(void *arg){
(void) arg;
while (TRUE){
//palClearPad(GPIOE, GPIOE_LED4_BLUE);
//palClearPad(GPIO_S1_BLUE, S1_BLUE);
chThdSleepMilliseconds(5);
}
return (msg_t) 0;
}
static msg_t ThdOut_4(void *arg){
(void) arg;
while (TRUE){
//palClearPad(GPIOE, GPIOE_LED10_RED);
//palClearPad(GPIO_S2_RED, S2_RED);
chThdSleepMilliseconds(5);
}
return (msg_t) 0;
}
static msg_t ThdOut_5(void *arg){
(void) arg;
while (TRUE){
//palClearPad(GPIOE, GPIOE_LED7_GREEN);
//palClearPad(GPIO_S2_GREEN, S2_GREEN);
chThdSleepMilliseconds(5);
}
return (msg_t) 0;
}
static msg_t ThdOut_6(void *arg){
(void) arg;
while (TRUE){
//palClearPad(GPIOE, GPIOE_LED9_BLUE);
//palClearPad(GPIO_S2_BLUE, S2_BLUE);
chThdSleepMilliseconds(5);
}
return (msg_t) 0;
}
/*===========================================================================*/
/* END OF THREADS */
/*===========================================================================*/
/*
* Application entry point.
*/
int main(void) {
/*
* System initializations.
* - HAL initialization, this also initializes the configured device drivers
* and performs the board-specific initializations.
* - Kernel initialization, the main() function becomes a thread and the
* RTOS is active.
*/
bool_t CHECK = TRUE;
halInit();
chSysInit();
/*
* PC6 is red channel of strip 1
*/
palSetPadMode(GPIO_S1_RED, S1_RED, PAL_MODE_OUTPUT_PUSHPULL
| PAL_STM32_OSPEED_HIGHEST);
/*
* PD9 is green channel of strip 1
*/
palSetPadMode(GPIO_S1_GREEN, S1_GREEN, PAL_MODE_OUTPUT_PUSHPULL
| PAL_STM32_OSPEED_HIGHEST);
/*
* PB1 is blue channel of strip 1
*/
palSetPadMode(GPIO_S1_BLUE, S1_BLUE, PAL_MODE_OUTPUT_PUSHPULL
| PAL_STM32_OSPEED_HIGHEST);
/*
* PC1 is red channel of strip 2
*/
palSetPadMode(GPIO_S2_RED, S2_RED, PAL_MODE_OUTPUT_PUSHPULL
| PAL_STM32_OSPEED_HIGHEST);
/*
* PB9 is green channel of strip 2
*/
palSetPadMode(GPIO_S2_GREEN, S2_GREEN, PAL_MODE_OUTPUT_PUSHPULL
| PAL_STM32_OSPEED_HIGHEST);
/*
* PF10 is blue channel of strip 2
*/
palSetPadMode(GPIO_S2_BLUE, S2_BLUE, PAL_MODE_OUTPUT_PUSHPULL
| PAL_STM32_OSPEED_HIGHEST);
clear_all();
chThdCreateStatic(waThdOut_1, sizeof(waThdOut_1), NORMALPRIO - 1,
ThdOut_1, NULL);
chThdCreateStatic(waThdOut_2, sizeof(waThdOut_2), NORMALPRIO - 2,
ThdOut_2, NULL);
chThdCreateStatic(waThdOut_3, sizeof(waThdOut_2), NORMALPRIO - 3,
ThdOut_3, NULL);
chThdCreateStatic(waThdOut_4, sizeof(waThdOut_4), NORMALPRIO - 4,
ThdOut_4, NULL);
chThdCreateStatic(waThdOut_5, sizeof(waThdOut_5), NORMALPRIO - 5,
ThdOut_5, NULL);
chThdCreateStatic(waThdOut_6, sizeof(waThdOut_6), NORMALPRIO - 6,
ThdOut_6, NULL);
while (TRUE) {
if (CHECK){
duty = (duty + 0.001);
if (duty >= 0.990){
CHECK = FALSE;
}
}
else{
duty = (duty - 0.001);
if (duty <= 0.010){
CHECK = TRUE;
}
}
chThdSleepMilliseconds(5);
}
return (msg_t)0;
}