Digispark ATtiny85配合Prismatik软件DIY屏幕流光溢彩效果

  • 一、硬件准备
    • 1.Digispark ATtiny85
    • 2.CH340 USB转TTL
    • 3.WS2812灯带
  • 二、开发环境与软件
    • 1.Arduino IDE安装
    • 2.添加开发板和驱动
    • 3.安装所需的库
    • 4.重刷ATtiny85的BootLoader
  • 三、程序编写
    • 1.ATtiny85点亮WS2812
    • 2.ATtiny85 SoftSerial
    • 3.Prismatik配置与数据结构
    • 4.ATtiny85通信Prismatik
  • 四、DIY成品
    • 1.硬件接连方法
    • 2.效果展示视频
  • 五、结语

之前偶然间看到了飞利浦电视的流光溢彩效果,淘宝看了一下,最便宜都要一百多一套,懂单片机的我当然不会花这个冤枉钱。

在CSDN搜索了一下,果然有好多大神用Arduino NANO DIY电脑显示器的流光溢彩效果,可是Arduino NANO十几块钱的价格对于我来说也很贵。

手边只有一个Digispark ATtiny85,怎么办?反正都是在Arduino IDE里面搞开发,为了省钱,当然是要用Digispark ATtiny85 DIY流光溢彩效果啦。

为了省下几块钱的预算,我们搞起。

一、硬件准备

使用的硬件包括:Digispark ATtiny85,CH340USB转TTL,WS2812灯带
调试工具包括:另一个CH340USB转TTL

1.Digispark ATtiny85

ATtiny85是个非常好玩的芯片,体积小巧功能强悍,最开始是用来玩BadUSB的,后来发现功能很强悍,Arduino里面关于ATtiny85的例子也很多,正好有WS2812的例子,就拿过来做流光溢彩效果。

Digispark ATtiny85在淘宝上非常便宜,一般价格都在6-8元还包邮,自行购买即可。我买的是左上角的那种,可以直接插电脑,不再需要USB线连接,做BadUSB拿出去装B携带方便。

ATtiny85官方文档放在了最后的网盘里。

2.CH340 USB转TTL

CH340用于电脑与ATtiny85的串口通信,这个就不多赘述了,大家都常用。

3.WS2812灯带

WS2812灯带有30、60、144株/每米几种规格,价格分别为12、18、58元/米左右,推荐60株/每米的规格,既便宜,做出来效果的细腻程度也还可以。

开发时用的是下面这个8灯珠的板子,价格大约2.8元/个,1米需要17个,换算后大概50元/米,136株/米,和买灯带价格差不多,并且有PCB板,可能更耐操一点。

关于WS2812的文档,放在了最后的网盘里。

二、开发环境与软件

1.Arduino IDE安装

直接从Arduino中文社区下载安装就行,文章最后的网盘里也有。过程不多赘述,CSDN上有很多教程。
链接:https://www.arduino.cn/

2.添加开发板和驱动

可以参考下面的文章,在Arduino中添加ATtiny85开发板和安装驱动。
链接:https://blog.csdn.net/wwwwyccom/article/details/95652417

Arduino添加Digistump AVR Boards开发板。点击Arduino-文件-首选项-设置-附加开发板管理器网址-点击查看非官方开发板支持网址列表。点进去过后我们下拉查看,会看到下面这个,我就是用的这个网址。

最近遇到”下载http://digistump.com/package_digistump_index.json时出错“问题的,可能是IP地址解析问题,可以把网址复制到浏览器打开看是不是IP地址解析出错,如下图。

如果是IP地址解析出错,那么可以参考下面修改Hosts的的解决方法。
链接:https://blog.csdn.net/Bily_on/article/details/105705332

添加好开发板后还需要安装驱动程序,我的文件位置是在C:\Users\Administrator\AppData\Local\Arduino15\packages\digistump\tools\micronucleus\2.0a4\DPinst64.exe
我也把单独的驱动文件Digistump.Drivers.zip放在了文章最后的网盘里。

3.安装所需的库

Arduino中开发板添加后,会显示Digistump的一些库,我们需要用到的有以下这些,添加开发板后就有了,不用额外安装库。
#include <WS2811.h> //用于控制WS2812灯带
#include <SoftSerial.h> //用于模拟串口通信
#include <TinyPinChange.h> //用于定义引脚

4.重刷ATtiny85的BootLoader

这一步不是必须的,要谨慎进行!!!
ATtiny85的出厂BootLoader可用空间稍微小一点,有需要的话可以刷最新的BootLoader,当然刷了BootLoader后可用空间变大,还需要在Arduino的开发板文件里也修改一下。
以下是GitHub链接,文章最后的网盘里我也放了一份。
链接:https://github.com/micronucleus/micronucleus
之前从网友那里了解到的,所以我去刷了新的,新BootLoader可用空间 6522 Byte(我的ATtiny85淘宝刚买来时可用空间 6012 Byte),刷写速度变快,而且修复了时钟校正、HUB/USB3.0下不识别、Win10驱动等问题。
但是!!!2.0以后的版本不如1.0版本健壮,上电时经常会把自己抹掉。。。所以不建议随便刷BootLoader!!!!!!

三、程序编写

1.ATtiny85点亮WS2812

Arduino点击文件–示例–WS2811–digispark,另存为一个文件。
示例原代码如下:

#include <WS2811.h>
DEFINE_WS2811_FN(WS2811RGB, PORTB, 1)
RGB_t rgb[1]; //1 for 1 pixelvoid setup() {                pinMode(1,OUTPUT);}void loop() {setPixel(0,255,0,0); //set first pixel (zero indexed) to redupdatePixels(); //show the change
}void setPixel(i,r,g,b){rgb[r].r=r;rgb[g].g=g;rgb[b].b=b;
}void updatePixels(){WS2811RGB(rgb, ARRAYLEN(rgb));
}

然后我们点击验证,发现报错如下。

报错信息是i,r,g,b都没有定义,所以我觉得
void setPixel(i,r,g,b)应该改为
void setPixel(uint8_t i,uint8_t r,uint8_t g,uint8_t b)
改完后确实编译通过了,问题解决。
有兴趣的同学可以仔细看一下WS2811.h文件。

阅读代码,我发现真正有用的只有:
1句命令:WS2811RGB(rgb, ARRAYLEN(rgb));
和3个值rgb[r].r,rgb[g].g,rgb[b].b
所以我重新改了一下代码,让8个灯显示红橙黄绿青蓝紫白8个颜色:

//LD
#include <WS2811.h>
DEFINE_WS2811_FN(WS2811RGB, PORTB, 1)
RGB_t rgb[1]; //1 for 1 pixel
uint8_t g;
uint8_t r;
uint8_t b;
uint8_t i;
uint8_t NUM_LEDS=8; //你的灯珠数量unsigned char red[] = { 255, 255, 255, 0, 0, 0, 150, 255};
unsigned char green[] = { 0, 100, 255, 255, 255, 0, 0, 255};
unsigned char blue[] = { 0, 0, 0, 0, 255, 255, 255, 255};void setup() {                pinMode(1,OUTPUT);delay(1000);
}void loop() {for(i = 0; i < NUM_LEDS; i++) {rgb[r].r = red[i];rgb[g].g = green[i];rgb[b].b = blue[i];WS2811RGB(rgb, ARRAYLEN(rgb));// Shows new values}delay(100);//其实没必要放loop()中循环,WS2811会保持最后一次的颜色。
}

2.ATtiny85 SoftSerial

同样,Digistump开发板下自带的SoftSerial示例程序如下,作用是在loop循环中,发送接收到的数据。但是实测下来,软件模拟的串口,波特率太高的话丢数据严重,可能9600波特率是比较稳定的。(这个涉及到晶振频率、波特率和丢包率之间的问题,感兴趣的同学可以深入学习。)

/*Software serial multiple serial testReceives from the hardware serial, sends to software serial.Receives from software serial, sends to hardware serial.The circuit: * RX is digital pin 2 (connect to TX of other device)* TX is digital pin 3 (connect to RX of other device)created back in the mists of timemodified 9 Apr 2012by Tom Igoebased on Mikal Hart's exampleThis example code is in the public domain.<SoftSerial> adapted from <SoftwareSerial> for <TinyPinChange> library which allows sharing the Pin Change Interrupt Vector.Single difference with <SoftwareSerial>: add #include <TinyPinChange.h>  at the top of your sketch.RC Navy (2012): http://p.loussouarn.free.fr*/
#include <SoftSerial.h>     /* Allows Pin Change Interrupt Vector Sharing */
#include <TinyPinChange.h>  /* Ne pas oublier d'inclure la librairie <TinyPinChange> qui est utilisee par la librairie <RcSeq> */SoftSerial mySerial(2, 3); // RX, TXvoid setup()
{// Open serial communications and wait for port to open:Serial.begin(57600);while (!Serial) {; // wait for serial port to connect. Needed for Leonardo only}Serial.println("Goodnight moon!");// set the data rate for the SoftwareSerial portmySerial.begin(4800);mySerial.println("Hello, world?");
}void loop() // run over and over
{if (mySerial.available())Serial.write(mySerial.read());if (Serial.available())mySerial.write(Serial.read());
}

3.Prismatik配置与数据结构

Prismatik软件的GitHub和下载地址如下,适用Windows,Ubuntu,OS,Android多种系统,Windows版本的安装包,文章最后的网盘里有一份。
GitHub:https://github.com/psieg/Lightpack
下载地址:https://lightpack.tv/pages/downloads

之前看的最多的是用Arduino NANO做流光溢彩效果,有很多大神写的很详细,我主要参考的是下面这位大神的,包括所需的Prismatik最开始也是从这篇文章里得到的下载地址。
链接:https://blog.csdn.net/u012963827/article/details/89640175

但是,我用的是ATtiny85芯片+WS2811.h库,上面文章用的是Arduino NANO+FastLED.h库,所以只能理解代码后移植。

为了详细了解数据结构,做了如下工作。
先把CH340插到电脑上,找到对应的COM口,设置Prismatik。将CH340的TX脚接到另一个CH340的RX脚,并打开串口调试助手接收Prismatik发送出去的数据,在EXCEL整理数据结构如下。

可以看到,开头是固定的Ada指令。
随后的灯泡个数信息和校验码,我参考了上面提到的Arduino NANO的代码,其中一段如下:

  // Hi, Lo, Checksum  while (!mySerial.available()) ;;hi=mySerial.read();while (!mySerial.available()) ;;lo=mySerial.read();while (!mySerial.available()) ;;chk=mySerial.read();// If checksum does not match go back to waitif (chk != ((hi ^ lo) ^ 0x55)) {i=0;goto waitLoop;}

所以0x00应该是灯珠个数高8位。正常情况下我们不会用到这位数据,因为低8位的0xFF就可以有256个灯珠数量了,我们DIY一般用不到这么多灯珠。
再其后的0x07应该是灯珠个数的低8位,是因为我在Prismatik软件中把灯珠数量设置成了8个,所以这一位数据是0x07。
0x52是校验码,
0x52==(0x00 ^ 0x07) ^ 0x55

再其后的0x16,0x16,0x00,0x16,0x16,0x00这些数据就是第1、2、3……个灯珠的R,G,B数值了。

4.ATtiny85通信Prismatik

有了上面的基础,我的代码如下:
定义1脚发送WS2812的RGB数据。
定义0、2脚为SoftSerial的RX, TX。
loop命令中,循环等待并校验Ada命令。
然后检验灯珠个数hi、lo、chk三个数据。
随后把串口发过来的RGB数据放入缓存区。
数据全部接收完毕后,用WS2811RGB(rgb, ARRAYLEN(rgb));指令发送给WS2812灯带。

#include <WS2811.h>
#include <SoftSerial.h>
#include <TinyPinChange.h>#define DATA_PIN 1          //RGB输出针脚
SoftSerial mySerial(0,2);   // RX, TXDEFINE_WS2811_FN(WS2811RGB, PORTB, 1)
RGB_t rgb[1];               //1 for 1 pixel
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk;uint8_t g,r,b;
uint8_t i,j;uint8_t Brightness=30;      //亮度30%
uint8_t NUM_LEDS=24;        //你的灯珠数量
uint8_t red[60],green[60],blue[60];void setup()
{                pinMode(1,OUTPUT);//让灯珠闪一下表明单片机正常运行起来了for(j=2;j>=1;j--){rgb[r].r=100*(j-1)*Brightness/100;rgb[g].g=100*(j-1)*Brightness/100;rgb[b].b=100*(j-1)*Brightness/100;for(i=0;i<NUM_LEDS;i++){WS2811RGB(rgb, ARRAYLEN(rgb));}delay(500);}Serial.begin(9600);Serial.println("Ada\n");mySerial.begin(9600);mySerial.println("Ada\n");
}void loop()
{for(i = 0; i < sizeof prefix; ++i) {waitLoop: while (!mySerial.available()) ;;if(prefix[i] == mySerial.read()) continue;i = 0;goto waitLoop;}// Hi, Lo, Checksum  while (!mySerial.available()) ;;hi=mySerial.read();while (!mySerial.available()) ;;lo=mySerial.read();while (!mySerial.available()) ;;chk=mySerial.read();// If checksum does not match go back to waitif (chk != ((hi ^ lo) ^ 0x55)) {i=0;goto waitLoop;}// Read the transmission data and set LED valuesfor(i = 0; i < NUM_LEDS; i++) { while(!mySerial.available());;red[i] = mySerial.read();while(!mySerial.available());;green[i] = mySerial.read();while(!mySerial.available());;blue[i] = mySerial.read();}//hi和lo表示灯珠数量的高8位和低8位//如果灯珠个数超过256个,需要把高8位的hi也算进来NUM_LEDS=lo+1;for(i = 0; i < NUM_LEDS; i++) {rgb[r].r = red[i];rgb[g].g = green[i];rgb[b].b = blue[i];WS2811RGB(rgb, ARRAYLEN(rgb));// Shows new values}
}

四、DIY成品

1.硬件接连方法

我的是笔记本电脑,背面的WS2812灯珠只有24个,实测最大不超过0.2A电流,可以用USB口直接供电。如果灯珠数量特别多,那么就需要额外的供电了,记得把灯带和ATtiny85共地。

2.效果展示视频

这个是我早期在B站发的的一个演示视频
链接:https://www.bilibili.com/video/BV18J411P7L5/
下面这个是近期刚录制的,播放是飞利浦官方的演示视频,网盘里也放了这个原视频。
链接:https://www.bilibili.com/video/BV1ag4y1v787

五、结语

其实最终看来,Digispark ATtiny85的流光溢彩效果还可以,虽然只有10FPS但是足够用。后来我又咬咬牙买了Arduino NANO,虽然贵,但是真香,呵呵呵。

这是我第一次在CSDN发博客,之前只是自己玩玩单片机,直到有一个网友看了我的成果视频希望我出个教程,正好端午假期有空,就写了这个不算是教程的教程。我发现ATtiny85芯片真的足够好玩,以后有好的项目我还会在发出来与大家分享。

文章的最后,我把一些用得到的文件、软件打包放网盘了,大家自行取阅。
百度网盘:https://pan.baidu.com/s/1MIcNYL0Lk_GhttbfXHRu1A
提取码:zfyc

Digispark ATtiny85配合Prismatik软件DIY屏幕流光溢彩效果(见坑填坑)相关推荐

  1. ubuntu18.04安装常用软件(QQ、WPS等)(缓慢填坑)

    目录 ubuntu18.04安装deepin-wine ubuntu18.04安装QQ ubuntu18.04安装迅雷极速版 ubuntu18.04安装网易云音乐 ubuntu18.04安装WPS u ...

  2. jetson windows_生命不息,折腾不止:Jetson Nano填坑之软件篇

    题图:摄于武大凌波门 作为一名每天对着各种裸板的系统工程师,对Jetson Nano会踩到各种坑是做好了充分准备的,本着踩坑填坑的精神,在这里记录一下踩坑经历,供大家一乐.如何避开这些坑?想多了,因为 ...

  3. 生命不息,折腾不止:Jetson Nano填坑之软件篇

    [外链图片转存失败(img-xESuaLE9-1568108074549)(http://images.ilego.club/blog/2019/05/Jetson_nano_%E5%A1%AB%E5 ...

  4. 软件登录软件 DIY

    软件登录软件 DIY     Http 协议是 Web 服务的主要协议之一,网页的浏览和网站动态数据的提交就是由这个协议实现的.实现的过程是通过 Http 会话,向 Web 服务器进行数据请求(读取. ...

  5. RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本

    RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本 在 mac 升级到 10.12 之后,karabiner 软件就一直在开发中.以至于我一直都没有使用这个软件来修改键盘映射. ...

  6. pr文字转语音有插件吗_自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配...

    原标题:自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配 大家都知道抖音越来越火,里面有很多小姐姐.小哥哥声音都是那么甜蜜好听,有很多微信公证号里面都插入语音了,有很好的电影片段想要配音,可惜 ...

  7. Element-ui配合Vue实现走马灯图片自适应效果

    elementUI配合Vue实现走马灯图片自适应效果(等比缩放,使得图片缩小不挤压,放大不拉伸变形) 解决方法的原理:监听屏幕视口大小如果'resize',发生改变了,就获取图片的高度height,然 ...

  8. 三步集成美图软件背景虚化景深效果【iOS篇】

    ######[前文提要] 因工作一直没有接触过滤镜领域,所以在闲暇之余阅读了下官方文档,本文尝试实现通用美图软件背景虚化景深效果,纯属娱乐,大神无视勿喷. 左侧为原图,右侧为背景虚化后的效果图 大致为 ...

  9. unity 给图片边缘_Unity Shader 屏幕后效果——边缘检测

    关于屏幕后效果的控制类详细见之前写的另一篇博客: 这篇主要是基于之前的控制类,实现另一种常见的屏幕后效果--边缘检测. 概念和原理部分: 首先,我们需要知道在图形学中经常处理像素的一种操作--卷积. ...

  10. DIY M328晶体管测试仪 挖坑 填坑

    网上挺火的晶体管测试仪看着很不错,买成品感觉不个性.!嘿嘿.没事网上爬了几天感觉也不是很复杂,所以就有了以下的坎坷.其实这东西是个老外开发的.咱们今天只聊硬件不聊软件.第一编程环境为GCC AVR俺不 ...

最新文章

  1. 查看、分析memcached使用状态
  2. CentOS7安装RabbitMQ集群
  3. Interview Q A 程序会在哪一行死掉
  4. 数据降维(特征提取)和特征选择有什么区别?
  5. C语言宏的副作用的简单实例
  6. vysor原理以及Android同屏方案
  7. (74)分析 APC 插入过程 —— KeInsertQueueApc , KiInsertQueueApc
  8. 【Linux】一步一步学Linux——domainname命令(172)
  9. springboot+sockjs进行消息推送(群发)
  10. GAE 随机获取实体
  11. mysql cache lock_MySQL:query cache lock
  12. scala 偏函数及其用途
  13. 从零开始学Android应用安全测试
  14. mysql ibd恢复数据_mysql通过ibd恢复数据
  15. CPU使用率过高应该如何处理
  16. 牛客输入输出(依图科技)
  17. 中国开发者将迎来黄金十年
  18. 大病众筹平台会成为下一个“网络诈骗”工具吗?
  19. 零信任网络ZTNA及SDP概念理解 身份认证 安当加密
  20. 微端更新慢、甚至不更新是怎么回事?

热门文章

  1. 台式计算机怎么把声音输出,台式电脑音频管理器的设置教程 台式电脑音响没声音怎么弄...
  2. 输入法变成繁体后改回简体中文
  3. OneNote2013打开共享
  4. 基于BERT阅读理解框架的司法要素抽取方法
  5. Rust LLDB 调试入门指北
  6. hget和get redis_redis使用手册-hset,hget 和 hmset,hmget
  7. RTKLIB的一些个人实用总结
  8. GEF入门级的helloword教程和示例工程代码
  9. 债券收益率预测模型_股债收益率模型看A股估值 股债收益率模型(EYBY)是一个经典的股市估值模型,其基本思想是将“股票收益率”(EY)与“债券收益率”(BY)进行对比... - 雪球...
  10. python 画图 线标注_Python中画图时候的线类型