RRoy | NPC | 创造力: | 帖子: | 发消息 | 串个门 | 加好友 | 打招呼
2021-7-21 17:51:35 [显示全部楼层]
825浏览
查看: 825|回复: 1

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

[复制链接]
本帖最后由 RRoy 于 2021-7-21 17:51 编辑

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

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

5个ATtiny13单片机售价1.5美元。

你敢相信,一个可编程的微控制器,只要0.3美元!于是我打算捡个便宜,买几个回来玩玩。

为了让买回来的ATtiny13不落在角落里吃灰,我上网搜索了 "ATtiny13 Arduino"的关键词,发现Arduino支持ATtiny13,所以我准备拿他搞些事情。

ATtiny13对库的支持有限,所以除了让它点亮几个LED之外,我暂时没有想到其他玩法。

正当我苦苦思索还能做什么时,突然想到了一个很久以前的项目。

那是一个使用ATtiny85的PoV显示器。

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

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,而是一串字母或者是一幅图像。


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

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

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

并点击上传按钮。

如果上传成功,就可以用我们的Arduino为其他微控制器编程了。

现在我们还需要在Arduino IDE上安装ATtiny13的硬件包,因为IDE默认不支持ATtiny13。

打开文件 -> 首选项 -> 附加开发版管理器网址

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

然后粘贴上下面的链接:

https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json

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

然后打开工具 -> 开发板 -> 开发板管理器。

从列表中找到MicroCore并点击安装。

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

ok,现在你就可以从Arduino IDE中选择到ATtiny13了。

选择工具 -> 开发板 -> MicroCore -> ATtiny13

我们需要在Arduino IDE中再改变一些选项,

打开工具,并设置以下值:
[td]
OptionValue
BoardATtiny13
BOD2.7v
Clock9.6Mhz internal Osc.
Timing"Micors Disabled"
PortSelect Serial Port in which your Arduino is connected
ProgrammerArduino as ISP (MicroCore)

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

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

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

7块钱可以做什么?用ATtiny13做一个非常酷的PoV显示器!qw10.jpg
[td]
ATtiny13 PinArduino Pin
110
511
612
713
85v
4Ground (GND)

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

烧录引导程序到ATtiny13
这是一个一次性的设置,不用在每次上传代码到ATtiny时都重复这个设置。

点击 工具->烧录引导程序。

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

这将把引导程序烧到ATtiny上,现在我们就可以用Arduino IDE把程序上传到ATtiny了。

上传PoV程序到ATtiny
在Arduino中新建一个程序。

复制代码并将其粘贴到新创建的程序中。
  1. // https://github.com/B45i/Tiny-PoV
  2. // App to calculate array values: https://pov-display-calc.vercel.app/
  3. // Preact app source: https://github.com/B45i/pov-display-calc
  4. #include <avr/pgmspace.h>
  5. #define DELAY_TIME 1
  6. #define CHAR_BREAK 2
  7. uint8_t leds[] = { 0, 1, 2, 3, 4 };
  8. uint8_t keys[] = { 1, 2, 4, 8, 16 };
  9. void setup() {
  10.   for (uint8_t i = 0; i < 5; i++) {
  11.     pinMode(leds[i], OUTPUT);
  12.   }
  13. }
  14. const PROGMEM uint8_t alphabets[][5] = {
  15.   { 0, 0, 0, 0, 0 },       // Space
  16.   { 30, 5, 5, 30, 0 },     // A
  17.   { 31, 21, 21, 10, 0 },   // B
  18.   { 14, 17, 17, 10, 0 },   // C
  19.   { 31, 17, 17, 14, 0 },   // D
  20.   { 31, 21, 21, 17, 0 },   // E
  21.   { 31, 20, 20, 16, 0 },   // F
  22.   { 14, 17, 19, 10, 0 },   // G
  23.   { 31, 4, 4, 4, 31 },     // H
  24.   { 0, 17, 31, 17, 0 },    // I
  25.   { 0, 17, 30, 16, 0 },    // J
  26.   { 31, 4, 10, 17, 0 },    // K
  27.   { 31, 1, 1, 1, 0 },      // L
  28.   { 31, 12, 3, 12, 31 },   // M
  29.   { 31, 12, 3, 31, 0 },    // N
  30.   { 14, 17, 17, 14, 0 },   // O
  31.   { 31, 20, 20, 8, 0 },    // P
  32.   { 14, 17, 19, 14, 2 },   // Q
  33.   { 31, 20, 22, 9, 0 },    // R
  34.   { 8, 21, 21, 2, 0 },     // S
  35.   { 16, 16, 31, 16, 16 },  // T
  36.   { 30, 1, 1, 30, 0 },     // U
  37.   { 24, 6, 1, 6, 24 },     // V
  38.   { 28, 3, 12, 3, 28 },    // W
  39.   { 17, 10, 4, 10, 17 },   // X
  40.   { 17, 10, 4, 8, 16 },    // Y
  41.   { 19, 21, 21, 25, 0 },   // Z
  42.   { 31, 17, 31, 0, 0 },    // 0
  43.   { 18, 31, 16, 0, 0 },    // 1
  44.   { 29, 21, 23, 0, 0 },    // 2
  45.   { 21, 21, 31, 0, 0 },    // 3
  46.   { 7, 4, 31, 4, 0 },      // 4
  47.   { 23, 21, 29, 0, 0 },    // 5
  48.   { 31, 21, 29, 0, 0 },    // 6
  49.   { 1, 1, 31, 0, 0 },      // 7
  50.   { 31, 21, 31, 0, 0 },    // 8
  51.   { 23, 21, 31, 0, 0 },    // 9
  52. };
  53. void displayLine(uint8_t line) {
  54.   for (uint8_t i = 0; i < 5; i++) {
  55.     digitalWrite(leds[i], (line & keys[i]) == keys[i]);
  56.   }
  57. }
  58. void displayLetter(uint8_t n) {
  59.   for (uint8_t i = 0; i < 5; i++) {
  60.     displayLine(pgm_read_word_near(alphabets[n] + i));
  61.     delay(DELAY_TIME);
  62.   }
  63.   displayLine(0);
  64. }
  65. void displayString(char *s) {
  66.   for (uint8_t i = 0; i < strlen(s); i++) {
  67.     uint8_t index;
  68.     if (s[i] == ' ') {
  69.       index = 0;
  70.     } else if (isalpha(s[i])) {
  71.       index = (uint8_t)toupper(s[i]) - 64;
  72.     } else if (isdigit(s[i])) {
  73.       index = (uint8_t)(s[i]) - 21;
  74.     }
  75.     displayLetter(index);
  76.     delay(CHAR_BREAK);
  77.   }
  78. }
  79. void loop() {
  80.   displayString("HELLO 123 ");
  81. }
复制代码


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

  1. displayString("HELLO 123 "); // 替换成你想要显示的文本
复制代码


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

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

我们可能对使用数组来表示字符和图像比较熟悉,像类似这样:
  1.   int a[][5] = {
  2.     {0, 1, 1, 0, 0},
  3.     {1, 0, 0, 1, 0},
  4.     {1, 1, 1, 1, 0},
  5.     {1, 0, 0, 1, 0},
  6.     {1, 0, 0, 1, 0},
  7.   };
  8.   for (int i = 0; i < 5; i++) {
  9.     for (int j = 0; j < 5; j++) {
  10.       digitalWrite(LEDs[j], a[j][i]);
  11.     }
  12.   }
复制代码



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

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

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

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

我们给每个LED分配一个数字(枚举),这些数字都是2的幂级数。
[td]
LEDEnum
LED 12^0= 1
LED 22^1= 2
LED 32^2= 4
LED 42^3= 8
LED 52^4= 16

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

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

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

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

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

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

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

数组中的其他元素将是:
[td]
第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全不亮)

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

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

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

拿数字30来举个例子:
[td]
运算结果LED状态
30 & 1 == 1false关闭LED1
30 & 2 == 2true点亮LED2
30 & 4 == 4true点亮LED3
30 & 4 == 8true点亮LED4
30 & 16 == 16true点亮LED5

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

30二进制是11110

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PCB文件可以在文末下载。

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

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

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

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

pov-circuit_83pXycyOYv.png

Tiny-PoV-master.zip

3 MB, 下载次数: 16

Tiny PoV Gerber.zip

39.55 KB, 下载次数: 6

hnyzcj  版主

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail