嵌入式系统与单片机| 技术阅读
登录| 注册

您现在的位置是: 嵌入式系统与单片机 > 技术阅读 > 7块钱可以做什么?用ATtiny13做一个非常酷的PoV显示器!

7块钱可以做什么?用ATtiny13做一个非常酷的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中再改变一些选项,

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

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[] = { 01234 };
uint8_t keys[] = { 124816 };

void setup() {
  for (uint8_t i = 0; i < 5; i++) {
    pinMode(leds[i], OUTPUT);
  }
}

const PROGMEM uint8_t alphabets[][5] = {
  { 00000 },       // Space
  { 3055300 },     // A
  { 312121100 },   // B
  { 141717100 },   // C
  { 311717140 },   // D
  { 312121170 },   // E
  { 312020160 },   // F
  { 141719100 },   // G
  { 3144431 },     // H
  { 01731170 },    // I
  { 01730160 },    // J
  { 31410170 },    // K
  { 311110 },      // L
  { 311231231 },   // M
  { 31123310 },    // N
  { 141717140 },   // O
  { 31202080 },    // P
  { 141719142 },   // Q
  { 31202290 },    // R
  { 8212120 },     // S
  { 1616311616 },  // T
  { 3011300 },     // U
  { 2461624 },     // V
  { 28312328 },    // W
  { 171041017 },   // X
  { 17104816 },    // Y
  { 192121250 },   // Z
  { 31173100 },    // 0
  { 18311600 },    // 1
  { 29212300 },    // 2
  { 21213100 },    // 3
  { 743140 },      // 4
  { 23212900 },    // 5
  { 31212900 },    // 6
  { 113100 },      // 7
  { 31213100 },    // 8
  { 23213100 },    // 9
};

void displayLine(uint8_t line) {
  for (uint8_t i = 0; i < 5; i++) {
    digitalWrite(leds[i], (line & keys[i]) == keys[i]);
  }
}

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

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

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

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

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

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

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

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

代码解释

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

我们可能对使用数组来表示字符和图像比较熟悉,像类似这样:

  int a[][5] = {
    {01100},
    {10010},
    {11110},
    {10010},
    {10010},
  };

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

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

现在,对于没有多少处理能力的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/make-a-pov-display-with-attiny13-for-1-e94b25

项目作者: Amal Shajan

中文译文首发于DF创客社区

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

推荐文章

天下网标王巩义网站推广优化哪家售后好烟台做网站优化哪家好玉田效果好的网站优化哪家好深圳怎么做免费网站优化效果好seo实操方法之网站结构优化清远网站优化托管业务武汉网站搜索优化团队定位网站优化网站优化推广营销费用上海网站优化哪家好优化网站补偿选云速捷热门太康网站seo优化报价河源网站优化入门宁夏网站优化建设荥阳市网站优化怎么做机械网站推广优化利川网站排名优化泗水县网站seo优化排名阳江企业网站排名优化网站文章优化不收录原因解决办法优化网站时淘宝优化上的网站靠谱吗公司网站优化外包平台网站优化哪个公司好网站优化好还是外包好秦皇岛网站优化售价信息类网站如何优化皇姑区品牌网站建设优化价格网站优化推广公司有哪些中山湖南网站优化推广香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化