3647| 3
|
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/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中再改变一些选项, 打开工具,并设置以下值: [td]
对ATtiny13进行编程 现在可以把ATtiny连接到我们的Arduino了。 把ATtiny连接到Arduino,如下所示(在ATtiny中,针脚1将用一个点. 标记。) [td]
烧录引导程序到ATtiny13 这是一个一次性的设置,不用在每次上传代码到ATtiny时都重复这个设置。 点击 工具->烧录引导程序。 这将把引导程序烧到ATtiny上,现在我们就可以用Arduino IDE把程序上传到ATtiny了。 上传PoV程序到ATtiny 在Arduino中新建一个程序。 复制代码并将其粘贴到新创建的程序中。
如果你想改变显示的文本,可以修改最后一行。
根据你要使用的电机的速度,你可能还需要调整代码,更新变量DELAY_TIME和CHAR_BREAK。 代码解释 你可能会盯着这段代码思考,一些随机数怎么样能代表一个字符,我们如何用它们来正确地闪烁LED? 我们可能对使用数组来表示字符和图像比较熟悉,像类似这样:
但是,这种方法会占用大量的内存,而且我们还必须使用多个循环来迭代它们。 现在,对于没有多少处理能力的ATtiny13来说,这并不是一个好方法。 标记的枚举法 我们不使用矩阵来表示一个字符,而是使用一个数组来表示它。 PoV显示器有5行和5列,所以我们可以使用一个长度为5的数组。 该数组中的每个元素将告诉我们是否需要打开某个特定的LED。 我们给每个LED分配一个数字(枚举),这些数字都是2的幂级数。 [td]
这些数字有一个特点,用他们组合,所产生的每一个数字的方式是唯一的。 比如:如果我们把2、4和8相加,就会得到14,而这些数字的其他组合不会产生14。 如果一个LED是关闭的,我们用0来表示它。 让我们来看看我们如何表示字母 "A"。 在第一列中,我们必须关闭LED1并打开所有其他的LED。因此,我们可以用0(LED1关闭)+2+4+8+16=30表示。 数组中的其他元素将是: [td]
我们如何根据这些数字来开启和关闭LED? 很简单,你对数字和LED的枚举进行按位与运算(只有对应的两个二进位都为1时,结果位才为1),如果结果是枚举,我们就需要打开相应的LED。 拿数字30来举个例子: [td]
这个概念通常被称为标记的枚举。 你可以添加更多的字母和数字。 手动生成这些数组是很难的,所以我做了两个应用程序方便大家更好更快地生成数组。 第一个是用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 转载请务必注明项目出处与原作者信息 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed