【电子DIY作品】LED摇摇棒 - AI-M61-32S-kit开发板

[复制链接]
查看2331 | 回复17 | 2023-11-7 22:31:51 | 显示全部楼层 |阅读模式
本帖最后由 iiv 于 2023-11-8 20:16 编辑

大家好,作为一个入门级点灯大侠的楼楼,每次在接触到新的mcu都会拿它点亮各种各样的灯,这也是老传统了,相信很多人都会像楼楼一样,楼楼最近用安信可的M61-32S-kit开发板做了一个摇摇棒,分享给大家,如果喜欢的话可以打一块玩玩。

工程链接:点我

效果展示:


output.gif



楼楼最开始是想着让它朝一个方向转的,所以搞的是红外管,后来发现太重了,转不太动,然后就成了摇摇棒,可以把红外的位置换成震动开关,这样就可以定位啦。


实物展示:


0.jpg

正面就是这个样子,电路很简单,通过gpio直接驱动每一颗发光二极管,一共16颗,m61开发板直接扣在排母上面就可以了。



1.jpg

背面沾了一块3.7v锂电池



3.jpg

通电后的样子,楼楼没有搞开关,所以它上电就会启动。


4.jpg

摇起来的样子,我摇,我摇,我使劲摇(好累....)


大概就是这个样子,其实这个原理也很简单,没有什么可说的,通过取模软件把点阵数据取出来,然后通过逐列逐个取出每一位数据来控制led的亮灭,只要循环一直这样做,就可以达到摇摇棒的效果,别的也没什么可说的,非常简单。



                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

代码部分:

main.c
  1. #include "bflb_mtimer.h"
  2. #include "bflb_gpio.h"
  3. #include "board.h"

  4. struct bflb_device_s *gpio;

  5. uint8_t data[5][32] = {
  6.               {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*/
  7.               {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*/
  8.               {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*/
  9.               {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*/
  10.               {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*/
  11.               
  12.               };

  13. uint8_t leds[] = {10,11,12,13,14,15,16,17,18,19,20,23,24,25,26,27};


  14. void led_play(uint8_t idx, int delay){
  15.     uint8_t index = 0;
  16.     for(uint8_t i=0;i<16;i++){
  17.         for(uint8_t n=0;n<8;n++){
  18.             uint8_t d = data[idx][index];
  19.             if(((d>>n) & 0x01) == 0){
  20.                 bflb_gpio_reset(gpio,leds[n]);
  21.                
  22.             }else{
  23.                 bflb_gpio_set(gpio,leds[n]);
  24.                
  25.             }
  26.         }

  27.         index++;
  28.         for(uint8_t n=0;n<8;n++){
  29.             uint8_t d = data[idx][index];
  30.             if(((d>>n) & 0x01) == 0){
  31.                 bflb_gpio_reset(gpio,leds[n+8]);

  32.             }else{
  33.                 bflb_gpio_set(gpio,leds[n+8]);
  34.    
  35.             }
  36.         }

  37.         index++;
  38.         bflb_mtimer_delay_us(delay);
  39.     }

  40. }

  41. void del_led(uint8_t idx, int delay){
  42.     uint8_t index = 30;
  43.     for(uint8_t i=0;i<16;i++){
  44.         for(uint8_t n=0;n<8;n++){
  45.             uint8_t d = data[idx][index];
  46.             if(((d>>n) & 0x01) == 0){
  47.                 bflb_gpio_reset(gpio,leds[n]);
  48.                
  49.             }else{
  50.                 bflb_gpio_set(gpio,leds[n]);
  51.                
  52.             }
  53.         }

  54.         index++;
  55.         for(uint8_t n=0;n<8;n++){
  56.             uint8_t d = data[idx][index];
  57.             if(((d>>n) & 0x01) == 0){
  58.                 bflb_gpio_reset(gpio,leds[n+8]);

  59.             }else{
  60.                 bflb_gpio_set(gpio,leds[n+8]);
  61.    
  62.             }
  63.         }

  64.         index -= 3;
  65.         bflb_mtimer_delay_us(delay);
  66.     }

  67. }

  68. int main(void)
  69. {
  70.     int dey = 800;
  71.     board_init();
  72.     gpio = bflb_device_get_by_name("gpio");
  73.     for(uint8_t i=0;i<16;++i){
  74.         bflb_gpio_init(gpio, leds[i], GPIO_OUTPUT|GPIO_PULLDOWN);
  75.         bflb_gpio_reset(gpio,leds[i]);
  76.     }

  77.     printf("hello world\r\n");
  78.     while (1) {
  79.         for(int i=0;i<5;i++){
  80.             led_play(i,dey);
  81.         }
  82.         // for(int j=5;j>0;j--){
  83.         //     del_led(j,dey);
  84.         // }

  85.     }
  86. }
复制代码

好啦,以上就是全部内容,代码比较简单,先把字模数据保存到数组,然后循环遍历每一个字,最后一直循环就可以了,楼楼这只是一个很简单的,只能显示固定的内容,我们可以使用小程序连接m61的蓝牙或者wifi来给摇摇棒进行更新显示的内容(图片或者文字),还可以增加灯珠的数量,做成旋转的led屏,如果大家有兴趣的话我们可以一下研究。


本帖被以下淘专辑推荐:

回复

使用道具 举报

jkernet | 2023-11-7 22:43:52 | 显示全部楼层
棒棒哒
回复

使用道具 举报

妖猊 | 2023-11-7 22:51:36 | 显示全部楼层
完全看不懂,都不知道写的啥
回复 支持 反对

使用道具 举报

WangChong | 2023-11-7 23:10:58 | 显示全部楼层
学习了,跟我猜的一样
回复 支持 反对

使用道具 举报

bzhou830 | 2023-11-8 08:26:05 | 显示全部楼层
以前用51单片机做过,七哥这个不用水银开关吗?
直接就循环扫描?
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

Mr.Tail | 2023-11-8 08:35:12 | 显示全部楼层
这手速 可以的
回复 支持 反对

使用道具 举报

WangChong | 2023-11-8 08:35:27 | 显示全部楼层
完全看不懂不知道写的啥
回复 支持 反对

使用道具 举报

爱笑 | 2023-11-8 08:36:04 | 显示全部楼层
没有视频效果吗七哥~
用心做好保姆工作
回复 支持 反对

使用道具 举报

ai_mcu | 2023-11-8 09:51:58 | 显示全部楼层
就说七哥有货
明天总会更好
回复 支持 反对

使用道具 举报

iiv | 2023-11-8 20:08:03 | 显示全部楼层
bzhou830 发表于 2023-11-8 08:26
以前用51单片机做过,七哥这个不用水银开关吗?
直接就循环扫描?

要,不然没法搞位置,我瞎玩的,留了红外的位置,后来发现转不起来太重了,后面再改一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则