マイコン内臓LEDチップWS2812bを使ってみました。プログラム(main編)
MCCが生成したソースファイルが[Source Files][Source Files->MCC Generated Files]にあります。
[Source Files]にある[main.c]の中に処理を記述します。
------------------------ここから----------------------------
#include <stdio.h>#include <string.h>#include "mcc_generated_files/mcc.h" /* Main application */#define LED_CNT 8uint8_t d_leds[LED_CNT*3];//const uint8_t t_leds_c[LED_CNT*3] = { 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00 }; //const uint8_t t_leds_g[LED_CNT*3] = { 0xff,0x00,0x00, 0xff,0x00,0x00, 0xff,0x00,0x00, 0xff,0x00,0x00, 0xff,0x00,0x00, 0xff,0x00,0x00, 0xff,0x00,0x00, 0xff,0x00,0x00 }; //const uint8_t t_leds_r[LED_CNT*3] = { 0x00,0xff,0x00, 0x00,0xff,0x00, 0x00,0xff,0x00, 0x00,0xff,0x00, 0x00,0xff,0x00, 0x00,0xff,0x00, 0x00,0xff,0x00, 0x00,0xff,0x00 }; //const uint8_t t_leds_b[LED_CNT*3] = { 0x00,0x00,0xff, 0x00,0x00,0xff, 0x00,0x00,0xff, 0x00,0x00,0xff, 0x00,0x00,0xff, 0x00,0x00,0xff, 0x00,0x00,0xff, 0x00,0x00,0xff }; void out_led(uint8_t *d, int s);static inline void ws2812_reset(void);void main(void){ int i; uint8_t buf[3]; // initialize the device SYSTEM_Initialize(); SPI2_Open(SPI2_DEFAULT); ws2812_reset(); while( 1 ) { memset( d_leds, 0x00, sizeof( d_leds )); for( i = 1; i <= 0x7f; i++ ) {// Green d_leds[0] = d_leds[3] = d_leds[6] = d_leds[9] = d_leds[12] = d_leds[15] = d_leds[18] = d_leds[21] = (uint8_t)i; out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } ws2812_reset(); memset( d_leds, 0x00, sizeof( d_leds )); for( i = 1; i <= 0x7f; i++ ) {// Red d_leds[1] = d_leds[4] = d_leds[7] = d_leds[10] = d_leds[13] = d_leds[16] = d_leds[19] = d_leds[22] = (uint8_t)i; out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } ws2812_reset(); memset( d_leds, 0x00, sizeof( d_leds )); for( i = 1; i <= 0x7f; i++ ) {// Blue d_leds[2] = d_leds[5] = d_leds[8] = d_leds[11] = d_leds[14] = d_leds[17] = d_leds[20] = d_leds[23] = (uint8_t)i; out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } ws2812_reset(); memset( d_leds, 0x00, sizeof( d_leds )); for( i = 1; i <= 0x7f; i++ ) {// Yellow d_leds[0] = d_leds[3] = d_leds[6] = d_leds[9 ] = d_leds[12] = d_leds[15] = d_leds[18] = d_leds[21] = (uint8_t)i; d_leds[1] = d_leds[4] = d_leds[7] = d_leds[10] = d_leds[13] = d_leds[16] = d_leds[19] = d_leds[22] = (uint8_t)i; out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } memset( d_leds, 0x00, sizeof( d_leds )); for( i = 1; i <= 0x7f; i++ ) {// light blue d_leds[0] = d_leds[3] = d_leds[6] = d_leds[9 ] = d_leds[12] = d_leds[15] = d_leds[18] = d_leds[21] = (uint8_t)i; d_leds[2] = d_leds[5] = d_leds[8] = d_leds[11] = d_leds[14] = d_leds[17] = d_leds[20] = d_leds[23] = (uint8_t)i; out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } ws2812_reset(); memset( d_leds, 0x00, sizeof( d_leds )); for( i = 1; i <= 0x7f; i++ ) {// Purple d_leds[1] = d_leds[4] = d_leds[7] = d_leds[10] = d_leds[13] = d_leds[16] = d_leds[19] = d_leds[22] = (uint8_t)i; d_leds[2] = d_leds[5] = d_leds[8] = d_leds[11] = d_leds[14] = d_leds[17] = d_leds[20] = d_leds[23] = (uint8_t)i; out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } ws2812_reset(); for( i = 1; i <= 0x7f; i++ ) {// White memset( d_leds, (uint8_t)i, sizeof( d_leds )); out_led( d_leds, sizeof( d_leds )); __delay_ms(10); } ws2812_reset(); memset( d_leds, 0x00, sizeof( d_leds )); for( i = 0; i < 8; i++ ) {// Green d_leds[(uint8_t)(i * 3)] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// Green back d_leds[(uint8_t)(i * 3)] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)] = 0x00; __delay_ms(200); } ws2812_reset(); for( i = 0; i < 8; i++ ) {// Red d_leds[(uint8_t)(i * 3)+1U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)+1U] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// Red Back d_leds[(uint8_t)(i * 3)+1U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)+1U] = 0x00; __delay_ms(200); } ws2812_reset(); for( i = 0; i < 8; i++ ) {// Blue d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// Blue Back d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } ws2812_reset(); for( i = 0; i < 8; i++ ) {// Yellow d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// Yellow Back d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = 0x00; __delay_ms(200); } ws2812_reset(); for( i = 0; i < 8; i++ ) {// light blue d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// light blue Back d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } ws2812_reset(); for( i = 0; i < 8; i++ ) {// Purple d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// Purple Back d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } ws2812_reset(); for( i = 0; i < 8; i++ ) {// White d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } for( i = 6; i >= 0; i-- ) {// White Back d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x7f; out_led( d_leds, sizeof( d_leds )); d_leds[(uint8_t)(i * 3) ] = d_leds[(uint8_t)(i * 3)+1U] = d_leds[(uint8_t)(i * 3)+2U] = 0x00; __delay_ms(200); } ws2812_reset(); d_leds[ 0] = d_leds[ 1] = d_leds[ 2] = 0x7f; d_leds[ 1] = d_leds[ 2] = 0x00; d_leds[ 3] = d_leds[ 4] = d_leds[ 5] = 0x7f; d_leds[ 3] = d_leds[ 5] = 0x00; d_leds[ 6] = d_leds[ 7] = d_leds[ 8] = 0x7f; d_leds[ 6] = d_leds[ 7] = 0x00; d_leds[ 9] = d_leds[10] = d_leds[11] = 0x7f; d_leds[11] = 0x00; d_leds[12] = d_leds[13] = d_leds[14] = 0x7f; d_leds[13] = 0x00; d_leds[15] = d_leds[16] = d_leds[17] = 0x7f; d_leds[15] = 0x00; d_leds[18] = d_leds[19] = d_leds[20] = 0x7f; for( i = 0; i < 32; i++ ) {// Multicolor out_led( d_leds, sizeof( d_leds )); memcpy( buf, &d_leds[0], 3 ); memcpy( &d_leds[0], &d_leds[3], (sizeof( d_leds ) - 3)); memcpy( &d_leds[21], buf, 3 ); __delay_ms(200); } ws2812_reset(); }} void out_led(uint8_t *d, int s){ int i; for( i = 0; i < s; i++ ) { SPI2_ExchangeByte( *d ); d++; }} static inline void ws2812_reset(void){ memset( d_leds, 0U, sizeof( d_leds )); out_led( d_leds, sizeof( d_leds )); __delay_us(50);}/** End of File*/
-------------------------ここまで-----------------------------
なんとも面白みのないベタベタのプログラムです。CLCで信号を生成するのが目的だったので、
目的を達成してしまったので、光らせる制御に思い入れは無く、もう触りたくないのでこのまま掲載します。(笑)
SPI2_Open(SPI2_DEFAULT); でSPI2をオープンして SPI2_ExchangeByte( *d );でひたすら
データーを出力するだけです。
データーは予めバッファーに用意して、一気に出力したほうが良いでしょう。Lowが50us続くと
リセットされるらしいので、出力するデーターの間隔は狭い方がいいでしょう。
少しだけデーターの事を書きますと、1個のLEDに対して3Byte(24Bit)のデーターが必要になります。
3Byteの中身は「GRB」の並びです。1個目のLEDが最初の3Byteを受け取ると、4Byte目からは2個めの
LEDへ転送します。
2個めのLEDも3Byte受信すると、7Byte目以後を次のLEDへ転送していきます。
8Bitのデーターは「GRB」それぞれのLEDチップの諧調となり、GRBそれぞれ255の諧調を持つことになります。
LEDの結線は13番PinにLEDのDINを接続、VDDを5VGNDをGNDに接続します。
ちなみに8個デイジーチェインされたWS2812bボードを利用しましたので、プログラムも8個用です。
LEDの数に合わせて、適宜プログラムを変更してください。
PICマイコン・スタートアップ Cプログラミングで定番マイコンを自在に操る (マイコン活用シリーズ) [ 山口晶大 ]
価格:3080円(税込、送料無料) (2021/3/26時点)楽天で購入
基板付きキット 絵解き マイコンCプログラミング教科書 加速度/温度/照度を測ったりLEDを光らせたり…ハードウェアを動かしながら学ぶ (トラ技ジュニア教科書) [ 鹿取 祐二 白阪 一郎 永原 柊 藤澤 幸穂 宮崎 仁 ]
価格:8800円(税込、送料無料) (2021/3/26時点)楽天で購入