Digispark ATtiny85配合Prismatik软件DIY屏幕流光溢彩效果(见坑填坑)
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屏幕流光溢彩效果(见坑填坑)相关推荐
- ubuntu18.04安装常用软件(QQ、WPS等)(缓慢填坑)
目录 ubuntu18.04安装deepin-wine ubuntu18.04安装QQ ubuntu18.04安装迅雷极速版 ubuntu18.04安装网易云音乐 ubuntu18.04安装WPS u ...
- jetson windows_生命不息,折腾不止:Jetson Nano填坑之软件篇
题图:摄于武大凌波门 作为一名每天对着各种裸板的系统工程师,对Jetson Nano会踩到各种坑是做好了充分准备的,本着踩坑填坑的精神,在这里记录一下踩坑经历,供大家一乐.如何避开这些坑?想多了,因为 ...
- 生命不息,折腾不止:Jetson Nano填坑之软件篇
[外链图片转存失败(img-xESuaLE9-1568108074549)(http://images.ilego.club/blog/2019/05/Jetson_nano_%E5%A1%AB%E5 ...
- 软件登录软件 DIY
软件登录软件 DIY Http 协议是 Web 服务的主要协议之一,网页的浏览和网站动态数据的提交就是由这个协议实现的.实现的过程是通过 Http 会话,向 Web 服务器进行数据请求(读取. ...
- RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本
RK61 蓝牙机械键盘配合 karabiner 软件适配 MAC 系统脚本 在 mac 升级到 10.12 之后,karabiner 软件就一直在开发中.以至于我一直都没有使用这个软件来修改键盘映射. ...
- pr文字转语音有插件吗_自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配...
原标题:自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配 大家都知道抖音越来越火,里面有很多小姐姐.小哥哥声音都是那么甜蜜好听,有很多微信公证号里面都插入语音了,有很好的电影片段想要配音,可惜 ...
- Element-ui配合Vue实现走马灯图片自适应效果
elementUI配合Vue实现走马灯图片自适应效果(等比缩放,使得图片缩小不挤压,放大不拉伸变形) 解决方法的原理:监听屏幕视口大小如果'resize',发生改变了,就获取图片的高度height,然 ...
- 三步集成美图软件背景虚化景深效果【iOS篇】
######[前文提要] 因工作一直没有接触过滤镜领域,所以在闲暇之余阅读了下官方文档,本文尝试实现通用美图软件背景虚化景深效果,纯属娱乐,大神无视勿喷. 左侧为原图,右侧为背景虚化后的效果图 大致为 ...
- unity 给图片边缘_Unity Shader 屏幕后效果——边缘检测
关于屏幕后效果的控制类详细见之前写的另一篇博客: 这篇主要是基于之前的控制类,实现另一种常见的屏幕后效果--边缘检测. 概念和原理部分: 首先,我们需要知道在图形学中经常处理像素的一种操作--卷积. ...
- DIY M328晶体管测试仪 挖坑 填坑
网上挺火的晶体管测试仪看着很不错,买成品感觉不个性.!嘿嘿.没事网上爬了几天感觉也不是很复杂,所以就有了以下的坎坷.其实这东西是个老外开发的.咱们今天只聊硬件不聊软件.第一编程环境为GCC AVR俺不 ...
最新文章
- 查看、分析memcached使用状态
- CentOS7安装RabbitMQ集群
- Interview Q A 程序会在哪一行死掉
- 数据降维(特征提取)和特征选择有什么区别?
- C语言宏的副作用的简单实例
- vysor原理以及Android同屏方案
- (74)分析 APC 插入过程 —— KeInsertQueueApc , KiInsertQueueApc
- 【Linux】一步一步学Linux——domainname命令(172)
- springboot+sockjs进行消息推送(群发)
- GAE 随机获取实体
- mysql cache lock_MySQL:query cache lock
- scala 偏函数及其用途
- 从零开始学Android应用安全测试
- mysql ibd恢复数据_mysql通过ibd恢复数据
- CPU使用率过高应该如何处理
- 牛客输入输出(依图科技)
- 中国开发者将迎来黄金十年
- 大病众筹平台会成为下一个“网络诈骗”工具吗?
- 零信任网络ZTNA及SDP概念理解 身份认证 安当加密
- 微端更新慢、甚至不更新是怎么回事?
热门文章
- 台式计算机怎么把声音输出,台式电脑音频管理器的设置教程 台式电脑音响没声音怎么弄...
- 输入法变成繁体后改回简体中文
- OneNote2013打开共享
- 基于BERT阅读理解框架的司法要素抽取方法
- Rust LLDB 调试入门指北
- hget和get redis_redis使用手册-hset,hget 和 hmset,hmget
- RTKLIB的一些个人实用总结
- GEF入门级的helloword教程和示例工程代码
- 债券收益率预测模型_股债收益率模型看A股估值 股债收益率模型(EYBY)是一个经典的股市估值模型,其基本思想是将“股票收益率”(EY)与“债券收益率”(BY)进行对比... - 雪球...
- python 画图 线标注_Python中画图时候的线类型