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
[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;
}

