RRoy 发表于 2021-7-21 17:51:35

7块钱可以做什么?用ATtiny13做一个非常酷的PoV显示器!

本帖最后由 RRoy 于 2021-7-21 17:51 编辑



前俩天我在浏览购物网站的时候,被一个购物清单吸引住了,

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中再改变一些选项,

打开工具,并设置以下值:

OptionValue
BoardATtiny13
BOD2.7v
Clock9.6Mhz internal Osc.
Timing"Micors Disabled"
PortSelect Serial Port in which your Arduino is connected
ProgrammerArduino as ISP (MicroCore)



对ATtiny13进行编程
现在可以把ATtiny连接到我们的Arduino了。

把ATtiny连接到Arduino,如下所示(在ATtiny中,针脚1将用一个点. 标记。)



ATtiny13 PinArduino Pin
110
511
612
713
85v
4Ground (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 <avr/pgmspace.h>

#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, OUTPUT);
}
}

const PROGMEM uint8_t alphabets[] = {
{ 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, (line & keys) == keys);
}
}

void displayLetter(uint8_t n) {
for (uint8_t i = 0; i < 5; i++) {
    displayLine(pgm_read_word_near(alphabets + i));
    delay(DELAY_TIME);
}
displayLine(0);
}

void displayString(char *s) {
for (uint8_t i = 0; i < strlen(s); i++) {
    uint8_t index;

    if (s == ' ') {
      index = 0;
    } else if (isalpha(s)) {
      index = (uint8_t)toupper(s) - 64;
    } else if (isdigit(s)) {
      index = (uint8_t)(s) - 21;
    }

    displayLetter(index);
    delay(CHAR_BREAK);
}
}

void loop() {
displayString("HELLO 123 ");
}

如果你想改变显示的文本,可以修改最后一行。

displayString("HELLO 123 "); // 替换成你想要显示的文本

根据你要使用的电机的速度,你可能还需要调整代码,更新变量DELAY_TIME和CHAR_BREAK。

代码解释
你可能会盯着这段代码思考,一些随机数怎么样能代表一个字符,我们如何用它们来正确地闪烁LED?

我们可能对使用数组来表示字符和图像比较熟悉,像类似这样:
int a[] = {
    {0, 1, 1, 0, 0},
    {1, 0, 0, 1, 0},
    {1, 1, 1, 1, 0},
    {1, 0, 0, 1, 0},
    {1, 0, 0, 1, 0},
};

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
      digitalWrite(LEDs, a);
    }
}


但是,这种方法会占用大量的内存,而且我们还必须使用多个循环来迭代它们。

现在,对于没有多少处理能力的ATtiny13来说,这并不是一个好方法。
标记的枚举法
我们不使用矩阵来表示一个字符,而是使用一个数组来表示它。

PoV显示器有5行和5列,所以我们可以使用一个长度为5的数组。

该数组中的每个元素将告诉我们是否需要打开某个特定的LED。

我们给每个LED分配一个数字(枚举),这些数字都是2的幂级数。

LEDEnum
LED 12^0= 1
LED 22^1= 2
LED 32^2= 4
LED 42^3= 8
LED 52^4= 16



这些数字有一个特点,用他们组合,所产生的每一个数字的方式是唯一的。

比如:如果我们把2、4和8相加,就会得到14,而这些数字的其他组合不会产生14。

如果一个LED是关闭的,我们用0来表示它。

让我们来看看我们如何表示字母 "A"。



在第一列中,我们必须关闭LED1并打开所有其他的LED。因此,我们可以用0(LED1关闭)+2+4+8+16=30表示。

数组中的其他元素将是:

列值
第1列0 + 2 + 4 + 8 + 16 = 30
第2列1 + 0 + 4 + 0 + 0 = 5
第3列1 + 0 + 4 + 0 + 0 = 5
第4列0 + 2 + 4 + 8 + 16 = 30
第5列0 + 0 + 0 + 0 + 0 = 0 (所有LED全不亮)



我们如何根据这些数字来开启和关闭LED?

很简单,你对数字和LED的枚举进行按位与运算(只有对应的两个二进位都为1时,结果位才为1),如果结果是枚举,我们就需要打开相应的LED。

拿数字30来举个例子:

运算结果LED状态
30 & 1 == 1false关闭LED1
30 & 2 == 2true点亮LED2
30 & 4 == 4true点亮LED3
30 & 4 == 8true点亮LED4
30 & 16 == 16true点亮LED5



30二进制是11110

这个概念通常被称为标记的枚举。

你可以添加更多的字母和数字。

手动生成这些数组是很难的,所以我做了两个应用程序方便大家更好更快地生成数组。

第一个是用Preact编写的,它是专门为这个项目制作的,最多支持5个LED。



地址:https://pov-display-calc.vercel.app/

第二个是用Angular编写的,它可以支持n个LED。



地址:https://po-v-display-calculator.vercel.app/

你也可以用这俩个网页来为其他PoV项目生成代码。

只要使用这些应用程序生成数组,并将代码添加到程序中的数组即可。

建立PoV显示电路
PoV显示电路是相当简单的,可以用下面的电路图来连接电路。





你可以使用原型电路板来焊接电路。

我已经为这个电路设计了一块PCB。如果你使用的是PCB,那么你就不用做任何布线,只需焊接元件就好了。

PCB文件可以在文末下载。

焊接好所有部件,加入电池,打开开关,把它连接到可以旋转的东西上,比如一个微型电机甚至风扇(别忘了根据角速度调整代码中的延迟,这一块儿可能需要一些试验)。

好了,现在你就有一个元件总成本不到1美元地PoV显示器了,试试效果怎么样,祝你玩得开心!

原文链接:https://www.hackster.io/B45i/mak ... tiny13-for-1-e94b25

项目作者: Amal Shajan
转载请务必注明项目出处与原作者信息

hnyzcj 发表于 2021-7-22 06:01:25

发表于 2022-5-13 08:33:11

本帖最后由 诩 于 2022-5-13 08:34 编辑

确定只要七块钱?

发表于 2022-5-13 08:37:07

诩 发表于 2022-5-13 08:33
确定只要七块钱?

我怕一会儿整太多钱了我妈会问候我{:5_121:}{:5_135:}{:5_133:}{:5_125:}
页: [1]
查看完整版本: 7块钱可以做什么?用ATtiny13做一个非常酷的PoV显示器!