|
首先,感谢源创和老邓提供了香蕉派和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
Shift Register: 74×595资料:
http://wiringpi.com/extensions/shift-register-74x595/
代码
拿到模块后迫不及待的插上测试,
下载了几个小伙伴的程序,build,笑脸出现。
然后参考小伙伴的字节写了一个,直接上代码(rgbled.c):
- #include <stdio.h>
- #include <wiringPi.h>
- #include <sr595.h>
-
- #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
-
- unsigned char smile[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} \
- };
-
- void set(int x, int y, unsigned char color)
- {
- int c;
- 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);
- }
-
-
- int main(int argc, char *argv[])
- {
- int i, 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);
- }
- }
- }
- }
复制代码 (*贴代码真费劲,明明贴好的,贴回去就不好用了)
WiringPi中二进制操作
经过测试无法类似Arduino中直接使用B110类似这样二进制表示,于是用0b110这样的方式替代
另外,WiringPi中没有bitRead(),所以在程序的头部放了bitRead宏定义。
编译
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
图(请忽略手机拍照的烂效果,实际还是很好看的):
以上,水平有限,错漏难免。
欢迎各位小伙伴批评指正。
|
|