DIY一个非常酷的PoV显示器(附源码)
扫描二维码
随时随地手机看文章
前两天天我在浏览购物网站的时候,被一个购物清单吸引住了,5个ATtiny13单片机售价1.5美元。你敢相信,一个可编程的微控制器,只要0.3美元!于是我打算捡个便宜,买几个回来玩玩。为了让买回来的ATtiny13不落在角落里吃灰,我上网搜索了 "ATtiny13 Arduino"的关键词,发现Arduino支持ATtiny13,所以我准备拿他搞些事情。ATtiny13对库的支持有限,所以除了让它点亮几个LED之外,我暂时没有想到其他玩法。正当我苦苦思索还能做什么时,突然想到了一个很久以前的项目。那是一个使用ATtiny85的PoV显示器。(拍出来的效果会闪烁,眼睛看就不会)PoV显示器基本上是一堆闪烁的LED,并有一些精心安排的延迟。而我发现ATtiny13和ATtiny85都有相同的引脚布局。那么…… 嘿嘿,我也来做一个!
材料准备
- 1 x ATtiny13
- 5个3毫米的LED(也可以用5毫米的LED,3毫米的看起来更好,因为可以更靠近PCB)
- 1个CR2032电池
- 1个CR2032电池座
- 1个滑动开关
- 原型PCB或定制PCB
- 电烙铁
什么是PoV显示器,它们是如何工作的?人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间(1/16秒),光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。比如你看一个正常的显示器,像素是以矩阵方式排列的,但在PoV显示器中,像素或者LED则是排列成一个阵列的。就像是你快速翻动小人书那边,由于视觉暂留效应,小人书的人会动起来,这边我们看到的,也不会是一排LED,而是一串字母或者是一幅图像。
Arduino IDE相关设置
你可能正盯着ATtiny13,想知道 "我到底该怎样为这个东西编程,它又没有像Arduino那样的USB接口"。好吧,要为这个微控制器编程,你需要另一个Arduino,Arduino Nano或Arduino Uno都可以。下载并安装Arduino IDE。用USB线将你的Arduino Nano / Uno连接到电脑上。打开工具
->开发板
,选择你的主控板(注意选Uno/Nano而不是ATtiny13)。现在我们需要将我们的Arduino转换成一个编程器。在Arduino IDE中,打开文件
-> 示例
-> 11.ArduinoISP
-> ArduinoISP
并点击上传
按钮。如果上传成功,就可以用我们的Arduino为其他微控制器编程了。现在我们还需要在Arduino IDE上安装ATtiny13的硬件包,因为IDE默认不支持ATtiny13。打开文件
-> 首选项
-> 附加开发版管理器网址
然后粘贴上下面的链接:https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
然后打开工具
-> 开发板
-> 开发板管理器
。从列表中找到MicroCore
并点击安装。ok,现在你就可以从Arduino IDE中选择到ATtiny13了。选择工具
-> 开发板
-> MicroCore
-> ATtiny13
我们需要在Arduino IDE中再改变一些选项,打开工具
,并设置以下值:Option | Value |
---|---|
Board | ATtiny13 |
BOD | 2.7v |
Clock | 9.6Mhz internal Osc. |
Timing | "Micors Disabled" |
Port | Select Serial Port in which your Arduino is connected |
Programmer | Arduino as ISP (MicroCore) |
对ATtiny13进行编程
现在可以把ATtiny连接到我们的Arduino了。把ATtiny连接到Arduino,如下所示(在ATtiny中,针脚1将用一个点.
标记。)ATtiny13 Pin | Arduino Pin |
---|---|
1 | 10 |
5 | 11 |
6 | 12 |
7 | 13 |
8 | 5v |
4 | Ground (GND) |
烧录引导程序到ATtiny13
这是一个一次性的设置,不用在每次上传代码到ATtiny时都重复这个设置。点击工具
->烧录引导程序
。这将把引导程序烧到ATtiny上,现在我们就可以用Arduino IDE把程序上传到ATtiny了。上传PoV程序到ATtiny
在Arduino中新建一个程序。复制代码并将其粘贴到新创建的程序中。// https://github.com/B45i/Tiny-PoV
// App to calculate array values: https://pov-display-calc.vercel.app/
// Preact app source: https://github.com/B45i/pov-display-calc
#include
#define DELAY_TIME 1
#define CHAR_BREAK 2
uint8_t leds[] = { 0, 1, 2, 3, 4 };
uint8_t keys[] = { 1, 2, 4, 8, 16 };
void setup() {
for (uint8_t i = 0; i < 5; i ) {
pinMode(leds[i], OUTPUT);
}
}
const PROGMEM uint8_t alphabets[][5] = {
{ 0, 0, 0, 0, 0 }, // Space
{ 30, 5, 5, 30, 0 }, // A
{ 31, 21, 21, 10, 0 }, // B
{ 14, 17, 17, 10, 0 }, // C
{ 31, 17, 17, 14, 0 }, // D
{ 31, 21, 21, 17, 0 }, // E
{ 31, 20, 20, 16, 0 }, // F
{ 14, 17, 19, 10, 0 }, // G
{ 31, 4, 4, 4, 31 }, // H
{ 0, 17, 31, 17, 0 }, // I
{ 0, 17, 30, 16, 0 }, // J
{ 31, 4, 10, 17, 0 }, // K
{ 31, 1, 1, 1, 0 }, // L
{ 31, 12, 3, 12, 31 }, // M
{ 31, 12, 3, 31, 0 }, // N
{ 14, 17, 17, 14, 0 }, // O
{ 31, 20, 20, 8, 0 }, // P
{ 14, 17, 19, 14, 2 }, // Q
{ 31, 20, 22, 9, 0 }, // R
{ 8, 21, 21, 2, 0 }, // S
{ 16, 16, 31, 16, 16 }, // T
{ 30, 1, 1, 30, 0 }, // U
{ 24, 6, 1, 6, 24 }, // V
{ 28, 3, 12, 3, 28 }, // W
{ 17, 10, 4, 10, 17 }, // X
{ 17, 10, 4, 8, 16 }, // Y
{ 19, 21, 21, 25, 0 }, // Z
{ 31, 17, 31, 0, 0 }, // 0
{ 18, 31, 16, 0, 0 }, // 1
{ 29, 21, 23, 0, 0 }, // 2
{ 21, 21, 31, 0, 0 }, // 3
{ 7, 4, 31, 4, 0 }, // 4
{ 23, 21, 29, 0, 0 }, // 5
{ 31, 21, 29, 0, 0 }, // 6
{ 1, 1, 31, 0, 0 }, // 7
{ 31, 21, 31, 0, 0 }, // 8
{ 23, 21, 31, 0, 0 }, // 9
};
void displayLine(uint8_t line) {
for (uint8_t i = 0; i < 5; i ) {
digitalWrite(leds[i], (line