感谢香蕉派,感谢源创,感谢老邓,感谢二叔科技,感谢球猫,感谢王师傅,感谢表妹,感谢余璇,感谢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
图(请忽略手机拍照的烂效果,实际还是很好看的):
以上,水平有限,错漏难免。
欢迎各位小伙伴批评指正。