这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【JoyTag香蕉派学习:四】8x8 RGB LED 笑脸 (C, 香蕉派)

共4条 1/1 1 跳转至

【JoyTag香蕉派学习:四】8x8 RGB LED 笑脸 (C, 香蕉派)

专家
2015-01-12 10:04:53     打赏

感谢香蕉派,感谢源创,感谢老邓,感谢二叔科技,感谢球猫,感谢王师傅,感谢表妹,感谢余璇,感谢EEPW,感谢CCTV,感谢小撸,感谢.............................


首先,感谢源创和老邓提供了香蕉派和8*8 RGB LED。
感谢二叔,shepherd, FishX, yoyojacky 等小伙伴的探索。


模块技术资料:

技术资料:
1)共阳驱动
2)蓝色为扩展IO的IO0 - IO7
3)绿色为扩展IO的IO8 - IO15
4)蓝色为扩展IO的IO16-IO23
5)公共端为扩展IO的IO24-IO31
6)可使用WiringBPI-595库[模拟SPI驱动]或者WiringBPI-SPI[硬件SPI驱动].

本文参考资料:
http://www.52pi.net/portal.php?mod=view&aid=18
http://www.52pi.net/forum.php?mod=viewthread&tid=1297
http://www.52pi.net/forum.php?mod=viewthread&tid=1296

拿到模块后迫不及待的插上测试,
下载了几个小伙伴的程序,build,笑脸出现。

然后参考小伙伴的字节写了一个,直接上代码(rgbled.c):
[C] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 #include #include #include   #define bitRead(value, bit) (((value) >> (bit)) & 0x01)   unsignedcharsmile[8][8] = { \         {0, 0, 1, 1, 1, 1, 0, 0}, \         {0, 1, 0, 0, 0, 0, 1, 0}, \         {1, 0, 1, 0, 0, 1, 0, 1}, \         {1, 0, 0, 0, 0, 0, 0, 1}, \         {1, 0, 1, 0, 0, 1, 0, 1}, \         {1, 0, 0, 1, 1, 0, 0, 1}, \         {0, 1, 0, 0, 0, 0, 1, 0}, \         {0, 0, 1, 1, 1, 1, 0, 0}  \ };   voidset(intx,inty, unsignedcharcolor) {         intc;         for(c=0; c<=2; c++)         {                 if(bitRead(color, c))                         digitalWrite(x + 100 + 8*c, 0);                 else                         digitalWrite(x + 100 + 8*c, 1);           }           digitalWrite(y + 124, 1);         //digitalWrite(y + 124, 0);         digitalWrite(x + 116, 1);         digitalWrite(x + 108, 1);         digitalWrite(x + 100, 1);         digitalWrite(y + 124, 0); }     intmain(intargc,char*argv[]) {         inti, j, color;         wiringPiSetup();         sr595Setup(100, 32, 12, 14, 10);           for(i = 0; i < 32; i++)         {                 pinMode(100 + i, OUTPUT);         }   #if 1         for(i =0; i< 24; i++)         {                 digitalWrite(100 + i, 1);         }           for(i =0; i< 8; i++)         {                 digitalWrite(124 + i, 0);         }   #endif           if(argc > 1 )         {                 color =atoi(argv[1]);         }         else         {                 color = 0b010;         }           while(1)         {                 for(i=0; i<8; i++)                 {                         for(j=0; j<8; j++)                         {                                 if(smile[i][j] == 1)                                         set(i, j, color);                         }                 }         } }

(*贴代码真费劲,明明贴好的,贴回去就不好用了)

编译
gcc -lwiringPi rgbled.c -o rgbled
执行
nice -10 ./rgbled 7
执行程序时可加可不加参数,参数0到7代表7种颜色

为何用nice?
如果直接执行程序
./rgbled 1
那么会发现,间隔几秒,偶尔会有灯爆闪(特别亮一下)
分析程序,发现没有啥问题,遂猜测因为系统调度的问题,导致某个时间LED点亮的时间过长。
所以考虑提升程序的优先级应该能解决这个问题,试了一下,果然解决了。 VERY NICE!!

关于8色的问题
我们将颜色值表示为二进制,所以根据不同颜色LED的开关我们可以组合出8种颜色(都关了为黑色)
颜色组成为rgb各占bit, 比如B10(4)为红色, B010(2) 为绿色, B001(1)为蓝色, B000(0)为黑色, B011(3)为青色,B101(5)为粉色,B110(6)为黄色, B111(7)啥色我形容不出来。
之前一直没能组合出8色,发现颜色值大于B100时,都是显示红色,一度怀疑红色灯太刺眼的缘故
        digitalWrite(y + 124, 1);
        //digitalWrite(y + 124, 0);
        digitalWrite(x + 116, 1);
        digitalWrite(x + 108, 1);
        digitalWrite(x + 100, 1);
        digitalWrite(y + 124, 0);

后来将程序中注释的那行(原本位置)移到最下,8色工作正常。

关于笑脸的字模
笑脸的字模直接从小伙伴的代码中复制过来。感谢小伙伴无私奉献。
程序只是作为演示,你可以根据需要加载任何字模,或者利用算法显示内容,举例说,如果i == j 时点亮LED,就会显示出一个大X

图(请忽略手机拍照的烂效果,实际还是很好看的):

 



以上,水平有限,错漏难免。
欢迎各位小伙伴批评指正。



专家
2015-01-12 10:26:05     打赏
2楼

感谢媛媛大美女

谴责WP大衰锅


助工
2015-01-12 10:39:57     打赏
3楼
52pi的图不让外站引用,得重贴,转贴是个体力活儿

专家
2015-01-12 18:04:21     打赏
4楼
WiringPi中二进制操作
经过测试无法类似Arduino中直接使用B110类似这样二进制表示,于是用0b110这样的方式替代
另外,WiringPi中没有bitRead(),所以在程序的头部放了bitRead宏定义。

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]