本帖最后由 iiv 于 2023-11-8 20:16 编辑
大家好,作为一个入门级点灯大侠的楼楼,每次在接触到新的mcu都会拿它点亮各种各样的灯,这也是老传统了,相信很多人都会像楼楼一样,楼楼最近用安信可的M61-32S-kit开发板做了一个摇摇棒,分享给大家,如果喜欢的话可以打一块玩玩。
工程链接:点我
效果展示:
楼楼最开始是想着让它朝一个方向转的,所以搞的是红外管,后来发现太重了,转不太动,然后就成了摇摇棒,可以把红外的位置换成震动开关,这样就可以定位啦。
实物展示:
正面就是这个样子,电路很简单,通过gpio直接驱动每一颗发光二极管,一共16颗,m61开发板直接扣在排母上面就可以了。
背面沾了一块3.7v锂电池
通电后的样子,楼楼没有搞开关,所以它上电就会启动。
摇起来的样子,我摇,我摇,我使劲摇(好累....)
大概就是这个样子,其实这个原理也很简单,没有什么可说的,通过取模软件把点阵数据取出来,然后通过逐列逐个取出每一位数据来控制led的亮灭,只要循环一直这样做,就可以达到摇摇棒的效果,别的也没什么可说的,非常简单。
代码部分:
main.c - #include "bflb_mtimer.h"
- #include "bflb_gpio.h"
- #include "board.h"
- struct bflb_device_s *gpio;
- uint8_t data[5][32] = {
- {0x80,0x00,0x90,0x80,0x8C,0x80,0x84,0x84,0x84,0x46,0x84,0x49,0xF5,0x28,0x86,0x10,0x84,0x10,0x84,0x2C,0x84,0x23,0x84,0x40,0x94,0x80,0x8C,0x00,0x80,0x00,0x00,0x00},/*"安",0*/
- {0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x04,0x00,0x24,0xF9,0x24,0x49,0x25,0x49,0x26,0x49,0x24,0x49,0x24,0x49,0x24,0xF9,0x04,0x00,0x00,0x00},/*"信",1*/
- {0x00,0x00,0x02,0x00,0x02,0x00,0xF2,0x0F,0x12,0x04,0x12,0x04,0x12,0x04,0xF2,0x0F,0x02,0x00,0x02,0x40,0x02,0x80,0xFE,0x7F,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00},/*"可",2*/
- {0x24,0x08,0x24,0x06,0xA4,0x01,0xFE,0xFF,0xA3,0x00,0x22,0x01,0x00,0x04,0x22,0x04,0xCC,0x04,0x00,0x04,0x00,0x04,0xFF,0xFF,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00},/*"科",3*/
- {0x10,0x04,0x10,0x44,0x10,0x82,0xFF,0x7F,0x10,0x01,0x90,0x80,0x08,0x80,0x88,0x40,0x88,0x43,0x88,0x2C,0xFF,0x10,0x88,0x28,0x88,0x46,0x88,0x81,0x08,0x80,0x00,0x00},/*"技",4*/
-
- };
- uint8_t leds[] = {10,11,12,13,14,15,16,17,18,19,20,23,24,25,26,27};
- void led_play(uint8_t idx, int delay){
- uint8_t index = 0;
- for(uint8_t i=0;i<16;i++){
- for(uint8_t n=0;n<8;n++){
- uint8_t d = data[idx][index];
- if(((d>>n) & 0x01) == 0){
- bflb_gpio_reset(gpio,leds[n]);
-
- }else{
- bflb_gpio_set(gpio,leds[n]);
-
- }
- }
- index++;
- for(uint8_t n=0;n<8;n++){
- uint8_t d = data[idx][index];
- if(((d>>n) & 0x01) == 0){
- bflb_gpio_reset(gpio,leds[n+8]);
- }else{
- bflb_gpio_set(gpio,leds[n+8]);
-
- }
- }
- index++;
- bflb_mtimer_delay_us(delay);
- }
- }
- void del_led(uint8_t idx, int delay){
- uint8_t index = 30;
- for(uint8_t i=0;i<16;i++){
- for(uint8_t n=0;n<8;n++){
- uint8_t d = data[idx][index];
- if(((d>>n) & 0x01) == 0){
- bflb_gpio_reset(gpio,leds[n]);
-
- }else{
- bflb_gpio_set(gpio,leds[n]);
-
- }
- }
- index++;
- for(uint8_t n=0;n<8;n++){
- uint8_t d = data[idx][index];
- if(((d>>n) & 0x01) == 0){
- bflb_gpio_reset(gpio,leds[n+8]);
- }else{
- bflb_gpio_set(gpio,leds[n+8]);
-
- }
- }
- index -= 3;
- bflb_mtimer_delay_us(delay);
- }
- }
- int main(void)
- {
- int dey = 800;
- board_init();
- gpio = bflb_device_get_by_name("gpio");
- for(uint8_t i=0;i<16;++i){
- bflb_gpio_init(gpio, leds[i], GPIO_OUTPUT|GPIO_PULLDOWN);
- bflb_gpio_reset(gpio,leds[i]);
- }
- printf("hello world\r\n");
- while (1) {
- for(int i=0;i<5;i++){
- led_play(i,dey);
- }
- // for(int j=5;j>0;j--){
- // del_led(j,dey);
- // }
- }
- }
复制代码
好啦,以上就是全部内容,代码比较简单,先把字模数据保存到数组,然后循环遍历每一个字,最后一直循环就可以了,楼楼这只是一个很简单的,只能显示固定的内容,我们可以使用小程序连接m61的蓝牙或者wifi来给摇摇棒进行更新显示的内容(图片或者文字),还可以增加灯珠的数量,做成旋转的led屏,如果大家有兴趣的话我们可以一下研究。
|