ããã«ã¡ã¯ãENGããŽã§ãã
VSCodeã®æ¡åŒµæ©èœã§ããPico SDKã䜿çšãããšRaspberry Pi Picoã«PIOãå®è£ ããããšãã§ããŸããPIOãšUARTã䜿ã£ãŠé»æã§RGB LEDã®è²ãä»»æã®è²ã§ç¹ç¯ãããæ¹æ³ããŸãšããŸããã
æ¬èšäºã¯äžèšèšäºã®PIOãšUARTãçµã¿åãããå¿çšäŸã§ãã
Raspberry Pi Picoã®PIOã§RGB LEDãæäœãã
Raspberry Pi Picoã§RTCãå®è£ ãã
RTCã®æå»ãèšå®ããããã«äœ¿çšããUARTã®é»æãRGB LEDçšã«æµçšããŠäœ¿çšããŸãã
ä»åã¯Grove Mech Keycap(Seeed StudioïŒç§æé»åã§è³Œå ¥)ã«äœ¿çšãããŠããRGB LEDãæäœããŸãã
Raspberry Pi PicoïŒä»¥äžPicoãšããïŒãšæ¡åŒµåºæ¿ã®Grove Shield for Pi Picoã䜿çšããŠããŸããPCãšPicoã®éä¿¡ã¯USBãä»ããŠè¡ããããAE-CH340E-TYPECïŒç§æé»åïŒã䜿çšããŠããŸãã
Picoã䜿çšããŠArduino IDEãVSCodeã§åäœç¢ºèªããããšããŸãšããŠããŸãã
Raspberry Pi Picoã§åŠã¹ããœããéçº
RGB LEDãæäœãã

Grove Mech Keycapã«äœ¿çšãããŠããRGB LEDã¯WS2812Bã䜿çšãããŠããŸããRGB LEDã®æäœã¯RGB LEDã¯ãŠãããŒã©ãŒã調æŽã³ãŒãã䜿çšããŸããäžè²ããã8ãããã®æ§æã«ãªããã256ãã¿ãŒã³ã®èª¿æŽãã§ããŸãã
RGB LEDã¯äœ¿çšãã補åã«ãã£ãŠè²ã®èª¿æŽãRGBã®é ã«æäœãããã®ãGRBã§æäœãããããã³ã«ããããŸããWS2812Bã¯GRBã§æäœãããããã³ã«ã§ãããè²ã®é ãç°ãªãã ãã§åºæ¬ã¯åããªã®ã§RGB LEDã§çµ±äžããŸãã
WS2812Bã¯ç·ã»èµ€ã»éã®é ã«24ãããã®å€ãæå®ããŸããSequence Chartã®ã¿ã€ãã³ã°ã«åŸã£ãŠHighã®é·ããšLowã®é·ãã«ãã£ãŠ1ããããã€1ã0ãæå®ããŠç¹ç¯ãã¿ãŒã³ãæäœããŸãã

RGB LEDã¯Sequence Chartã®ã¿ã€ãã³ã°ã«ãã£ãŠHighã®é·ããšLowã®é·ãã«ãã£ãŠ1ã®æå®ã0ã®æå®ããå€å®ããªãã24ãããã®ããŒã¿ãéä¿¡ããŠèµ€ã»ç·ã»éã®è²ã調æŽããŸãã
ããŒã¿ã·ãŒãã«ãããš1 codeãšããŠèªèãããããã«ã¯æšæºã§T1H(1 code, high voltage time)ã580nsïœ1usãšT1L(1 code, low voltage time)ã580nsïœ1uså¿ èŠã§ãã
0 codeãšããŠèªèãããå Žåã¯æšæºã§T0H(0 code, high voltage time)ã220nsïœ380nsãšT0L(1 code, low voltage time)ã580nsïœ1uså¿ èŠã§ãã
220nsïœ380nsãšé«éãªGPIOã®å¶åŸ¡ãå¿ èŠãšãªãããPIOã«ããå¶åŸ¡ã广çã§ãã1ãš0ã®é·ãã¯nopã«ãããŠã§ã€ãã§ç¯å²ä»¥å ã«åãŸãããã«å¶åŸ¡ããŠã¿ã€ãã³ã°æ³¢åœ¢ãçæããŸãã
RGB LEDãæäœããããã®ã¢ã»ã³ããªãã¡ã€ã«ã¯äžèšèšäºãšåæ§ã®ãã®ã䜿çšããŸãã
Raspberry Pi Picoã®PIOã§RGB LEDãæäœãã
PIOã®APIã䜿çšãã
PIOã®èšå®ãåæåãªã©äœ¿ç𿹿³ã¯äžèšèšäºã«ãŸãšããŠããŸãã
Raspberry Pi Picoã®PIOã§GPIOãæäœãã
ããã§ã¯ãWS2812Bãæäœããããã«å¿ èŠãªåŠçãäžå¿ã«èª¬æããŸãã
PIOã®èšå®
#include "ws2812asm.pio.h" //ã¢ã»ã³ããªãã¡ã€ã« .pioãã³ã³ãã€ã«ãããšçæããã
PIO pio = pio0;
uint offset = pio_add_program(pio, &ws2812_program);
// åæåæ§é äœãååŸïŒã¢ã»ã³ããªãã¡ã€ã«ã®å®çŸ©ã«ãã£ãŠåç§°ãç°ãªãããæ³šæïŒ
pio_sm_config c = ws2812_program_get_default_config(offset);
ããã©ã«ãã®ã³ãŒããæµçšããªããã¹ããŒããã·ã³ã®èšå®ãè¡ããŸããä»åã¯ã¹ããŒããã·ã³ã®èšå®ã¯åæååŠçå ã§å®çµããããã«å®è£ ããŸãã
æåã«ã¹ããŒããã·ã³çšã®ã¢ã»ã³ããªãã¡ã€ã«ã®ããããŒãã¡ã€ã«ãã€ã³ã¯ã«ãŒãããŸãã
ã³ã³ãã€ã«ãããšã¢ã»ã³ããªãã¡ã€ã«ã®åç§°ã«æ¡åŒµåã®.hãã€ããããããŒãã¡ã€ã«ãçæãããŸããäŸã¯ws2812asm.pioãã¢ã»ã³ããªãã¡ã€ã«ã®åç§°ã§ããã.hãã€ããããããŒãã¡ã€ã«ãæå®ããŠããŸãã
PIOãããã¯ãéžæããŸããPicoã®PIOãããã¯ã¯pio0ãšpio1ã®ïŒã€ããããŸãããããã§ã¯pio0ã䜿çšããŸãã
pio_add_program()颿°ã¯PIOã¢ã»ã³ããªããã°ã©ã ãPIOåœä»€ã¡ã¢ãªã«ããŒããããã®éå§äœçœ®ïŒoffsetïŒãååŸããŸãã第1åŒæ°ã«PIOãããã¯ãæå®ãã第2åŒæ°ã«ãœãŒã¹ã³ãŒãã瀺ãã¢ãã¬ã¹ãæå®ïŒã¢ã»ã³ããªãã¡ã€ã«å ã§å®çŸ©ããŠããïŒããŸãã
// åºåãã³ã®èšå®
sm_config_set_set_pins(&c, RGBLED_PIN, 1);
pio_gpio_init(pio, RGBLED_PIN);
sm_config_set_set_pins()颿°ã¯PIOã¹ããŒããã·ã³ã®SETåœä»€ã§å¶åŸ¡ããGPIOãã³ãæå®ããŸãã第1åŒæ°ã«ã¹ããŒããã·ã³ã®èšå®çšæ§é äœãæå®ããŸãã第2åŒæ°ã«GPIOãã³ã®éå§çªå·ãæå®ããŸãã第3åŒæ°ã«å¶åŸ¡ãããã³æ°ãæå®ããŸãã
第2åŒæ°ã«0ã第3åŒæ°ã«3ãæå®ããå Žåã¯GPIO0ïœGPIO2ãsetåœä»€ã®å¶åŸ¡å¯Ÿè±¡ã«ãªããŸãã
pio_gpio_init()颿°ã¯GPIOãã³ãPIOå¶åŸ¡ãã³ã«åãæ¿ããŸãã第1åŒæ°ã«PIOãããã¯ãæå®ãã第2åŒæ°ã«å¯Ÿè±¡ã®GPIOãã³çªå·ãæå®ããŸãã
//PIOã®å
¥åºåèšå®
pio_sm_set_consecutive_pindirs(pio,0, RGBLED_PIN, 1, true);
//ã¯ããã¯ååš
sm_config_set_clkdiv_int_frac(&c, 5, 0);
//åºåã·ããã¬ãžã¹ã¿ã®èšå®
sm_config_set_out_shift(&c,false,true,32);
pio_sm_set_consecutive_pindirs()颿°ã¯ã¹ããŒããã·ã³ã®GPIOãã³ã®æ¹åãèšå®ããŸãã第1åŒæ°ã«PIOãããã¯ãæå®ãã第2åŒæ°ã«ã¹ããŒããã·ã³ã®çªå·ïŒ0ïœ3ïŒãæå®ããŸãã第3åŒæ°ã¯èšå®ãéå§ããGPIOã®ãã³çªå·ãæå®ãã第4åŒæ°ã§èšå®ãããã³æ°ãæå®ããŸãã第5åŒæ°ã¯ãã³ã®æ¹åãèšå®ããŸããtrueã¯åºåãfalseã¯å ¥åã«ãªããŸãã
sm_config_set_clkdiv_int_frac()颿°ã¯ã·ã¹ãã ã¯ããã¯ã®ååšãæå®ããŸãã第1åŒæ°ã«ã¹ããŒããã·ã³ã®åæåæ§é äœãæå®ããŸãã第2åŒæ°ã«ã¯ããã¯ååšã®æŽæ°éšïŒ1ïœ65535ïŒãæå®ããŸãã第3åŒæ°ã«ã¯ããã¯ååšã®å°æ°éšïŒ0ïœ255ïŒãæå®ããŸãã
ä»åã¯æŽæ°éšã«5ãå°æ°éšã«0ãæå®ããã®ã§25MHzïŒ40nsïŒãã¹ããŒããã·ã³ã®åäœã¯ããã¯ã«ãªããŸãã
sm_config_set_clkdiv()颿°ã䜿çšããŠãåäœã¯ããã¯ãçæããããšãã§ããŸããã®å Žåã¯ç¬¬2åŒæ°ã«5ãæå®ããŠ25MHzãçæããŸãã
sm_config_set_out_shift()颿°ã¯æå®ããå€ãå³ã·ããããŠåºåããå·Šã·ããããŠåºåãããéžæããŸãã第1åŒæ°ã«ã¹ããŒããã·ã³ã®åæåæ§é äœãæå®ããŸãã第2åŒæ°ã«ã·ããããæ¹åãæå®ããŸããtrueãæå®ãããšLSBãã¡ãŒã¹ããfalseãæå®ãããšMSBãã¡ãŒã¹ãã«ãªããŸãã
第3åŒæ°ã¯ç¬¬ïŒåŒæ°ã§æå®ãããããåäœã§FIFOããããŒã¿ãèªã¿èŸŒããæå®ããŸããtrueãªãèªåçã«TX FIFOããæ¬¡ã®ããŒã¿ãèªã¿åºããŸãã第4åŒæ°ã¯TX FIFOããèªã¿åºããããæ°ãæå®ããŸãã
// ã¹ããŒããã·ã³ã«æ§æãé©çšããŠèµ·å
pio_sm_init(pio, 0, offset, &c);
pio_sm_set_enabled(pio, 0, true);
pio_sm_put_blocking(pio, 0, color ); //FIFOã«ããŒã¿ãéã
pio_sm_init()颿°ã¯ã¹ããŒããã·ã³ã«å¯ŸããŠåæåããèšå®ãé©çšãå®è¡æºåããŸãã第1åŒæ°ã«PIOãããã¯ãæå®ãã第2åŒæ°ã«ã¹ããŒããã·ã³ã®çªå·ïŒ0ïœ3ïŒãæå®ããŸãã
第3åŒæ°ã«pio_add_program()颿°ã§ååŸããéå§äœçœ®ãæå®ããŸãã第4åŒæ°ã«ã¹ããŒããã·ã³ã®åæåæ§é äœãæå®ããŸãã
pio_sm_set_enabled()颿°ã䜿çšãããšæå®ããã¹ããŒããã·ã³ã§åäœéå§ããŸãã第1åŒæ°ã«PIOãããã¯ãæå®ãã第2åŒæ°ã«ã¹ããŒããã·ã³ã®çªå·ïŒ0ïœ3ïŒãæå®ããŸãã第3åŒæ°ã§ã¹ããŒããã·ã³ãèµ·å/忢ãæå®ããŸããtrueã§èµ·åããfalseã§åæ¢ããŸãã
pio_sm_put_blocking()颿°ã䜿çšãããšæå®ããããŒã¿ãã¹ããŒããã·ã³ã«éä¿¡ããŸããTX FIFOã«ããŒã¿ãéããããsm_config_set_out_shift()颿°ã§èªåçã«éä¿¡ããããã«æå®ããããšã§éã£ãããŒã¿ã§ã¹ããŒããã·ã³ãæäœããããšãã§ããŸãã
第1åŒæ°ã«PIOãããã¯ãæå®ãã第2åŒæ°ã«ã¹ããŒããã·ã³ã®çªå·ïŒ0ïœ3ïŒãæå®ããŸãã第3åŒæ°ã«éä¿¡ãã32ãããããŒã¿ãæå®ããŸãã
UARTã«ããåä¿¡ã®ç¢ºèª
while(uart_is_readable(uart0)){
u0_rcvdata.buf[u0_rcvdata.wp] = uart_getc(uart0);
uart_putc(uart0,(char)u0_rcvdata.buf[u0_rcvdata.wp] );// PCããåä¿¡ããããŒã¿ã衚瀺
if( ++u0_rcvdata.wp >= RING_SZ ){
u0_rcvdata.wp = 0;
}
}
uart_is_readable()颿°ã§UARTã®åä¿¡ç¶æ ã確èªããŸããåŒæ°ã«æå®ããUARTã«åä¿¡ããŒã¿ãååšããå Žåã¯trueãæ»ãå€ã«ãªããŸãã
uart_getc()颿°ã§åŒæ°ã«æå®ããUARTã®åä¿¡ããŒã¿ãèªã¿èŸŒã¿ãŸããæ»ãå€ãèªã¿èŸŒãã§åä¿¡ããŒã¿ã«ãªãã®ã§å€æ°ã«æ ŒçŽïŒ3è¡ç®ïŒããŸãã
uart_putc()颿°ã¯ç¬¬1åŒæ°ã«æå®ããUARTã«å¯ŸããŠã第ïŒåŒæ°ã§æå®ããcharåã®ããŒã¿ãæ¹è¡å€æããã§éä¿¡ããŸããæåã®\nãéä¿¡ãããš\nã\r\nã«å€æããŠéä¿¡ããŸããã·ãªã¢ã«ã¢ãã¿ãŒã«æ¹è¡ããŠè¡šç€ºããå Žåã«äœ¿çšããŸãã
黿ããè²ã®ããŒã¿ãçæãã

ã·ãªã¢ã«ã¢ãã¿ãŒã䜿ã£ãŠRGB LEDã®è²ã®ããŒã¿éä¿¡ãã黿ãçæããŸãã黿ã¯ããããŒã«ãGRBãã®æååã«GïŒç·ïŒããBïŒéïŒãŸã§ãã-ãïŒãã€ãã³ïŒã§ç¹ãããã®ã§ãã
/* åä¿¡ããŒã¿ããããŒã¿ãçæ */
void rcvdatechk(void){
int8_t rxsz;
uint8_t allsz;
uint8_t rp = u0_rcvdata.rp;
uint8_t i;
uint8_t dat[3];
if( rxsz >= 3 ){
for( i = 0; i < 3; i++){//ããŒã¿ãµã€ãºç®åºã®ããä»®ãã
dat[i] = u0_rcvdata.buf[ rp ];
if(++rp >= sizeof(u0_rcvdata.buf) ) rp = 0;
}
if( dat[0] == 'G' && dat[1] == 'R' && dat[2] == 'B'){
allsz = sizeof(str) - 1;
if( rxsz >= allsz){
if( chkdata() == false ){
uart_puts(uart0, "GRBSET NG!\n");
}
}
}
}
}
åä¿¡ããããŒã¿ã®å é ãã3ãã€ããŸã§ã確èªããŠæååã®ãGRBãã§ããã°RGB LEDã®é»æãåä¿¡ãããšã¿ãªããŸããïŒ15è¡ç®ïŒ
åä¿¡ããŒã¿ã黿ã®ãµã€ãºä»¥äžã«ãªã£ããšãã黿ãå°éãããšå€æããŠé»æããè²ã®ããŒã¿ã«å€æããåŠçïŒ19è¡ç®ïŒãè¡ããŸããæç®åŠçãããŸããããªãã£ãå Žåã¯ãã·ãªã¢ã«ã¢ãã¿ãŒã«ãGRBSET NGïŒããéä¿¡ããŠå€±æãéç¥ããŸãã
/* ããŒã¿ã®ãã§ã㯠*/
bool chkdata(void){
uint8_t green=0;
uint8_t red=0;
uint8_t blue=0;
bool ret;
//GRB-255-255-255
green = strtol((const char*)&Rcvdata[4], NULL, 10);
red = strtol((const char*)&Rcvdata[8], NULL, 10);
blue = strtol((const char*)&Rcvdata[12], NULL, 10);
if( green >= 0x100 || red >= 0x100 || blue >= 0x100 ){
ret = false;
}
else{
color = (green << 24 ) + (red << 16 ) + (blue << 8 );
pio_sm_put_blocking(pio, 0, color ); //32bitã24BitãMSBãšããŠæå®
btnon= true;
ret = true;
}
return ret;
}
黿ããç·ãèµ€ãéã®ããŒã¿ã«æç®ããŸãã9ïœ11è¡ç®ã§é»æã®æååããstrtol()颿°ã䜿çšããŠè²ã®ããŒã¿ã«å€æããŠããŸãã
第1åŒæ°ã«å€æããæååã®å é ã¢ãã¬ã¹ãæå®ããŸãã第ïŒåŒæ°ã¯æå倿ãçµäºããäœçœ®ãæ ŒçŽãããã€ã³ã¿ã¢ãã¬ã¹ãæå®ããŸãã䜿çšããªãå Žåã¯NULLãšããŸãã
第3åŒæ°ã¯æ°å€ã®åºæ°ãæå®ããŸãã10鲿°ãªã10ã16鲿°ãªã16ãæå®ããŸãã
黿ã¯ç·ïœéã-ïŒãã€ãã³ïŒã§åºåã£ãŠãããããã€ãã³ãŸã§ã®æååã倿ããçµæãæŽæ°å€ã«å€æãããŠåè²ã®å€æ°ã«æ ŒçŽãããŸãã
倿ããè²ã®ããŒã¿ã0ïœ255ã®ç¯å²ä»¥å ã§ããããšã確èªïŒ13è¡ç®ïŒããç¯å²å ã§ããã°ç·ãèµ€ãéã®ããŒã¿ããããã·ããããŠ32ãããã®ããŒã¿ãçæïŒ17è¡ç®ïŒããŸãã
pio_sm_put_blocking()颿°ã§çæããè²ããŒã¿ãPIOã®ã¹ããŒããã·ã³ã«éä¿¡ããããšã§ä»»æã®è²ã§RGB LEDãç¹ç¯ãããããšãã§ããŸãã
åäœç¢ºèª

Picoã®UART0ãã·ãªã¢ã«ã¢ãã¿ãŒã§äœ¿çšããããUSBã¢ãžã¥ãŒã«ïŒAE-CH9102F-TYPECïŒã䜿çšããŠããŸããPicoã¯DC3.3Vã®ãã€ã³ã³ãªã®ã§USBã¢ãžã¥ãŒã«ã®åºåãDC3.3Vã«ãªãããã«ããŠããŸãã
Picoã®é»æºãå ¥ãããšPIOã¹ããŒããã·ã³ãåäœéå§ããŸããRGB LEDã®åæå€ã¯ç·ãèµ€ãéããã¹ãŠ255ã«ããŠããã®ã§çœè²ã«ãªããŸãã
Grove Mach keycapã®ãã¿ã³ãæŒããšRGB LEDã®ç¹ç¯/æ¶ç¯ãåãæ¿ããããšãã§ããŸãã
ã·ãªã¢ã«ã¢ãã¿ãŒãéããŠé»æã®ããŒã¿ãéä¿¡ãããšä»»æã®è²ã§RGB LEDãæäœããããšãã§ããŸãã

ã¡ãã»ãŒãžæ¬ã«ãGRB-255-000-000ãã®ããã«é»æãéä¿¡ããŸããè€æ°ã®ãã¿ãŒã³ã§é»æãéä¿¡ããŠåäœç¢ºèªãè¡ããŸããã

ç¹ç¯çµæã確èªãããšã255-000-000ãã®å Žåã¯ç·ã255ãèµ€ã0ãéã0ãªã®ã§ç·è²ã«ç¹ç¯ããŠããŸããåæ§ã«ã000-255-000ãã§ã¯èµ€è²ãã000-000-255ãã§ã¯éè²ã«ãªã£ãŠããŸãã
ã000-255-255ãã¯èµ€ãšéãå ã®ïŒåè²ã§åæãã玫è²ã«ãªã£ãŠããŸããã255-000-255ãã¯ç·ãšéã®åæã®æ°Žè²ã«ãªã£ãŠããŸããã255-255-000ãã¯ç·ãšèµ€ã®åæã®é»è²ã«ãªã£ãŠããŸãã
黿ã§RGB LEDãæäœã§ããŠããããšã確èªã§ããŸããã
ãœãŒã¹ã³ãŒãå šäœ
ãœãŒã¹ã³ãŒãã¯èšäºäœææç¹ã«ãããŠåäœç¢ºèªã§ããŠããŸããã䜿çšããŠããã©ã€ãã©ãªã®æŽæ°ã«ããåäœãä¿èšŒã§ããªããªãå¯èœæ§ããããŸãããŸãããœãŒã¹ã³ãŒãã䜿çšããããšã«ãã£ãŠçããäžå©çãªã©ã®äžåã®è²¬ä»»ãè² ããããŸããåèè³æãšããŠã䜿ããã ããã
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "ws2812asm.pio.h"
#include <stdlib.h> //strtol()ã䜿çšãããã
#define RGBLED_PIN 17
#define PIN_DI1 16
#define PIN_DO1 25
#define TIME_OFF -1 //ã¿ã€ããŒã䜿çšããªãå Žå
#define TIME_UP 0 //ã¿ã€ã ã¢ãã
#define BASE_CNT 10 //ããŒã¹ã¿ã€ãã«ãŠã³ãå€
#define LED_ONOFF 50
#define RING_SZ 128
#define TIM_RX_WAIT 5 //50ms
#define FILT_MIN 1
#define DI_FILT_MAX 4
struct RING_MNG{
uint8_t wp;
uint8_t rp;
uint8_t buf[RING_SZ];
};
struct DIFILT_TYP{
uint8_t wp;
uint8_t buf[DI_FILT_MAX];
uint8_t di1;
};
PIO pio = pio0;
uint32_t color = 0xFFFFFF00; //GRB
RING_MNG u0_rcvdata;
uint32_t beforetimCnt;
int16_t timled = LED_ONOFF;
int16_t timrcv = TIME_OFF;
int16_t timdifilt = TIME_OFF;
char str[] = {"GRB-255-255-255"};
uint8_t Rcvdata[sizeof(str)];
DIFILT_TYP difilt;
bool btnflg1;
bool btnon = false;
void mainApp(void);
void mainTimer(void);
void rcvdatechk(void);
void ReadPointerAdd(void);
bool chkdata(void);
void DiFilter(void);
int main()
{
stdio_init_all();
gpio_init(PIN_DO1); // ãã³åæå
gpio_set_dir(PIN_DO1, GPIO_OUT); //DOãã³
gpio_init(PIN_DI1); // ãã³åæå
gpio_set_dir(PIN_DI1, GPIO_IN); //DOãã³
gpio_pull_up(PIN_DI1);
uint offset = pio_add_program(pio, &ws2812_program);
// åæåæ§é äœãååŸ
pio_sm_config c = ws2812_program_get_default_config(offset);
// åºåãã³ã®èšå®
sm_config_set_set_pins(&c, RGBLED_PIN, 1);
pio_gpio_init(pio, RGBLED_PIN);
//PIOã®å
¥åºåèšå®
pio_sm_set_consecutive_pindirs(pio,0, RGBLED_PIN, 1, true);
//ã¯ããã¯ååš
sm_config_set_clkdiv_int_frac(&c, 5, 0);
sm_config_set_out_shift(&c,false,true,32);
// ã¹ããŒããã·ã³ã«æ§æãé©çšããŠèµ·å
pio_sm_init(pio, 0, offset, &c);
pio_sm_set_enabled(pio, 0, true);
pio_sm_put_blocking(pio, 0, color ); //TX FIFOã«ããŒã¿ãéã
timdifilt = FILT_MIN;
for( uint8_t i=0; i < 20; i++ ){
mainTimer();
DiFilter();
sleep_ms(100);
}
uart_puts(uart0, "Hello, PIO!\n");
while (true) {
mainApp();
mainTimer();
DiFilter();
}
}
/* ã¡ã€ã³åŠç */
void mainApp(void){
while(uart_is_readable(uart0)){
u0_rcvdata.buf[u0_rcvdata.wp] = uart_getc(uart0);
uart_putc(uart0,(char)u0_rcvdata.buf[u0_rcvdata.wp] );// PCããåä¿¡ããããŒã¿ã衚瀺
if( ++u0_rcvdata.wp >= RING_SZ ){
u0_rcvdata.wp = 0;
}
}
rcvdatechk();
if(difilt.di1 == 1){
if(btnflg1){
btnflg1 = false;
if( btnon ){
btnon = false;
pio_sm_put_blocking(pio, 0, 0 ); //32bitã24BitãMSBãšããŠæå®
}
else{
pio_sm_put_blocking(pio, 0, color ); //32bitã24BitãMSBãšããŠæå®
btnon = true;
}
}
}else{
btnflg1 = true;
}
if( timled == TIME_UP ){
timled = LED_ONOFF;
gpio_put(PIN_DO1, !gpio_get(PIN_DO1));
}
}
/* ã¿ã€ã管ç */
void mainTimer(void){
if( to_ms_since_boot(get_absolute_time()) - beforetimCnt > BASE_CNT ){
beforetimCnt = to_ms_since_boot(get_absolute_time());
//10msããšã«ããã«é·ç§»ãã
if( timled > TIME_UP ){
timled--;
}
if( timrcv > TIME_UP ){
timrcv--;
}
if( timdifilt > TIME_UP ){
timdifilt--;
}
}
}
/* åä¿¡ããŒã¿ããããŒã¿ãçæ */
void rcvdatechk(void){
int8_t rxsz;
uint8_t allsz;
uint8_t rp = u0_rcvdata.rp;
uint8_t i;
uint8_t dat[3];
if( timrcv == TIME_UP){
timrcv = TIME_OFF;
ReadPointerAdd();
}
rxsz = u0_rcvdata.wp - u0_rcvdata.rp; //åä¿¡ããŒã¿æ°ã®ç®åº
if( rxsz < 0 ){
rxsz = rxsz + sizeof(u0_rcvdata.buf);
}
if( rxsz == 0 ){
timrcv = TIME_OFF;
}
else{
if( timrcv == TIME_OFF ){
timrcv = TIM_RX_WAIT;
}
if( rxsz >= 3 ){
for( i = 0; i < 3; i++){//ããŒã¿ãµã€ãºç®åºã®ããä»®ãã
dat[i] = u0_rcvdata.buf[ rp ];
if(++rp >= sizeof(u0_rcvdata.buf) ) rp = 0;
}
if( dat[0] == 'G' && dat[1] == 'R' && dat[2] == 'B'){
allsz = sizeof(str) - 1;
if( rxsz >= allsz){
timrcv = TIME_OFF;
for(i=0; i < sizeof(Rcvdata); i++){
Rcvdata[i] = 0;
}
for( i=0; i < allsz; i++ ){
Rcvdata[i] = u0_rcvdata.buf[u0_rcvdata.rp];
ReadPointerAdd();
}
if( chkdata() == false ){
uart_puts(uart0, "GRBSET NG!\n");
}
}
}
}
}
}
/* èªã¿èŸŒã¿äœçœ®ã®æŽæ° */
void ReadPointerAdd(void){
if(++u0_rcvdata.rp >= sizeof(u0_rcvdata.buf) ){
u0_rcvdata.rp = 0;
}
}
/* ããŒã¿ã®ãã§ã㯠*/
bool chkdata(void){
uint8_t green=0;
uint8_t red=0;
uint8_t blue=0;
bool ret;
//GRB-255-255-255
green = strtol((const char*)&Rcvdata[4], NULL, 10);
red = strtol((const char*)&Rcvdata[8], NULL, 10);
blue = strtol((const char*)&Rcvdata[12], NULL, 10);
if( green >= 0x100 || red >= 0x100 || blue >= 0x100 ){
ret = false;
}
else{
color = (green << 24 ) + (red << 16 ) + (blue << 8 );
pio_sm_put_blocking(pio, 0, color ); //32bitã24BitãMSBãšããŠæå®
btnon= true;
ret = true;
}
return ret;
}
/* DiFilter function add */
void DiFilter(void){
if( timdifilt == TIME_UP ){
difilt.buf[difilt.wp] = gpio_get(PIN_DI1);
if( difilt.buf[0] == difilt.buf[1] &&
difilt.buf[1] == difilt.buf[2] &&
difilt.buf[2] == difilt.buf[3] ){ //4åäžèŽã確èª
difilt.di1 = difilt.buf[0];
}
if( ++difilt.wp >= DI_FILT_MAX ){
difilt.wp = 0;
}
timdifilt = FILT_MIN;
}
}
ã¢ã»ã³ããªãã¡ã€ã«ã®ãœãŒã¹ã³ãŒãã¯äžèšèšäºã®ãã®ã䜿çšããŠãã ããã
Raspberry Pi Picoã®PIOã§RGB LEDãæäœãã
ã¡ã€ã³ã®ãã¡ã€ã«ã®å 容ãã³ããŒããŠçœ®ãæããããšã§äœ¿çšã§ããŸãã
ãããžã§ã¯ããçææã®CMakeãã¡ã€ã«ã®æ§æã«ãã£ãŠåäœããªãå ŽåããããŸããCMakeLists.txtã®æ§æã§æ¡ä»¶ãäžè¶³ããŠããå¯èœæ§ãããããå¿ èŠã«å¿ããŠä¿®æ£ããŠãã ããã
é¢é£ãªã³ã¯
Arduinoã®ã©ã€ãã©ãªã䜿ã£ãŠåäœç¢ºèªãè¡ã£ãããšãäžèšãªã³ã¯ã«ãŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Seeeduino XIAOã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
ESP32-WROOM-32Eã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Raspberry Pi Picoã§åŠã¹ããœããéçº
PRïŒãã£ãªã¢åœ¢æã§ãæ©ã¿ã®ããªããžïŒååç¡æçžè«ã§çžè«ã§ãã[coachee]
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã

