狗趴(GodPub),开源硬件学习与实践

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 7050|回复: 0
打印 上一主题 下一主题

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

[复制链接]

84

主题

143

帖子

725

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
725
QQ
跳转到指定楼层
楼主
发表于 2015-1-12 17:21:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先,感谢源创和老邓提供了香蕉派和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):
  1. #include <stdio.h>
  2. #include <wiringPi.h>
  3. #include <sr595.h>

  4. #define bitRead(value, bit) (((value) >> (bit)) & 0x01)

  5. unsigned char smile[8][8] = { \
  6.         {0, 0, 1, 1, 1, 1, 0, 0}, \
  7.         {0, 1, 0, 0, 0, 0, 1, 0}, \
  8.         {1, 0, 1, 0, 0, 1, 0, 1}, \
  9.         {1, 0, 0, 0, 0, 0, 0, 1}, \
  10.         {1, 0, 1, 0, 0, 1, 0, 1}, \
  11.         {1, 0, 0, 1, 1, 0, 0, 1}, \
  12.         {0, 1, 0, 0, 0, 0, 1, 0}, \
  13.         {0, 0, 1, 1, 1, 1, 0, 0}  \
  14. };

  15. void set(int x, int y, unsigned char color)
  16. {
  17.         int c;
  18.         for(c=0; c<=2; c++)
  19.         {
  20.                 if(bitRead(color, c))
  21.                         digitalWrite(x + 100 + 8*c, 0);
  22.                 else
  23.                         digitalWrite(x + 100 + 8*c, 1);

  24.         }

  25.         digitalWrite(y + 124, 1);
  26.         //digitalWrite(y + 124, 0);
  27.         digitalWrite(x + 116, 1);
  28.         digitalWrite(x + 108, 1);
  29.         digitalWrite(x + 100, 1);
  30.         digitalWrite(y + 124, 0);
  31. }


  32. int main(int argc, char *argv[])
  33. {
  34.         int i, j, color;
  35.         wiringPiSetup();
  36.         sr595Setup(100, 32, 12, 14, 10);

  37.         for(i = 0; i < 32; i++)
  38.         {
  39.                 pinMode(100 + i, OUTPUT);
  40.         }

  41. #if 1
  42.         for(i =0; i< 24; i++)
  43.         {
  44.                 digitalWrite(100 + i, 1);
  45.         }

  46.         for(i =0; i< 8; i++)
  47.         {
  48.                 digitalWrite(124 + i, 0);
  49.         }

  50. #endif

  51.         if(argc > 1 )
  52.         {
  53.                 color = atoi(argv[1]);
  54.         }
  55.         else
  56.         {
  57.                 color = 0b010;
  58.         }

  59.         while(1)
  60.         {
  61.                 for(i=0; i<8; i++)
  62.                 {
  63.                         for(j=0; j<8; j++)
  64.                         {
  65.                                 if(smile[i][j] == 1)
  66.                                         set(i, j, color);
  67.                         }
  68.                 }
  69.         }
  70. }
复制代码
(*贴代码真费劲,明明贴好的,贴回去就不好用了)

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

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








以上,水平有限,错漏难免。
欢迎各位小伙伴批评指正。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
天理路上甚宽,稍游心,胸中便觉广大宏朗;
人欲路上甚窄,才寄迹,眼前俱是荆棘泥涂。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|狗趴(GodPub) Arduino&Raspberry Pi开源硬件学习与实践[QQ群:20085629]  

GMT+8, 2024-4-28 17:14 , Processed in 0.076177 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表