今天為大家分享一個(gè)DIY產(chǎn)品,如下:
前兩天天我在瀏覽購(gòu)物網(wǎng)站的時(shí)候,被一個(gè)購(gòu)物清單吸引住了,5個(gè)ATtiny13單片機(jī)售價(jià)1.5美元。你敢相信,一個(gè)可編程的微控制器,只要0.3美元!于是我打算撿個(gè)便宜,買(mǎi)幾個(gè)回來(lái)玩玩。為了讓買(mǎi)回來(lái)的ATtiny13不落在角落里吃灰,我上網(wǎng)搜索了 "ATtiny13 Arduino"的關(guān)鍵詞,發(fā)現(xiàn)Arduino支持ATtiny13,所以我準(zhǔn)備拿他搞些事情。ATtiny13對(duì)庫(kù)的支持有限,所以除了讓它點(diǎn)亮幾個(gè)LED之外,我暫時(shí)沒(méi)有想到其他玩法。正當(dāng)我苦苦思索還能做什么時(shí),突然想到了一個(gè)很久以前的項(xiàng)目。那是一個(gè)使用ATtiny85的PoV
顯示器。
(拍出來(lái)的效果會(huì)閃爍,眼睛看就不會(huì))PoV顯示器基本上是一堆閃爍的LED,并有一些精心安排的延遲。而我發(fā)現(xiàn)ATtiny13和ATtiny85都有相同的引腳布局。那么…… 嘿嘿,我也來(lái)做一個(gè)!
材料準(zhǔn)備
- 1 x ATtiny13
- 5個(gè)3毫米的LED(也可以用5毫米的LED,3毫米的看起來(lái)更好,因?yàn)榭梢愿拷黀CB)
- 1個(gè)CR2032電池
- 1個(gè)CR2032電池座
- 1個(gè)滑動(dòng)開(kāi)關(guān)
- 原型PCB或定制PCB
- 電烙鐵
什么是PoV顯示器,它們是如何工作的?
人眼在觀察景物時(shí),光信號(hào)傳入大腦神經(jīng),需經(jīng)過(guò)一段短暫的時(shí)間(1/16秒),光的作用結(jié)束后,視覺(jué)形象并不立即消失,這種殘留的視覺(jué)稱“后像”,視覺(jué)的這一現(xiàn)象則被稱為“視覺(jué)暫留”。比如你看一個(gè)正常的顯示器,像素是以矩陣方式排列的,但在PoV
顯示器中,像素或者LED則是排列成一個(gè)陣列的。就像是你快速翻動(dòng)小人書(shū)那邊,由于視覺(jué)暫留效應(yīng),小人書(shū)的人會(huì)動(dòng)起來(lái),這邊我們看到的,也不會(huì)是一排LED,而是一串字母或者是一幅圖像。
Arduino IDE相關(guān)設(shè)置
你可能正盯著ATtiny13,想知道 "我到底該怎樣為這個(gè)東西編程,它又沒(méi)有像Arduino那樣的USB接口"。好吧,要為這個(gè)微控制器編程,你需要另一個(gè)Arduino,Arduino Nano或Arduino Uno都可以。下載并安裝Arduino IDE。用USB線將你的Arduino Nano / Uno連接到電腦上。打開(kāi)?
工具
->
開(kāi)發(fā)板
,選擇你的主控板(注意選Uno/Nano而不是ATtiny13)。現(xiàn)在我們需要將我們的Arduino轉(zhuǎn)換成一個(gè)編程器。在Arduino IDE中,打開(kāi)
文件
?->?
示例
?->?
11.ArduinoISP
?->?
ArduinoISP
并點(diǎn)擊
上傳
按鈕。如果上傳成功,就可以用我們的Arduino為其他微控制器編程了。現(xiàn)在我們還需要在Arduino IDE上安裝ATtiny13的硬件包,因?yàn)镮DE默認(rèn)不支持ATtiny13。打開(kāi)
文件
?->?
首選項(xiàng)
?->?
附加開(kāi)發(fā)版管理器網(wǎng)址
然后粘貼上下面的鏈接:
https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
然后打開(kāi)
工具
?->?
開(kāi)發(fā)板
?->?
開(kāi)發(fā)板管理器
。從列表中找到
MicroCore
并點(diǎn)擊安裝。
ok,現(xiàn)在你就可以從Arduino IDE中選擇到ATtiny13了。選擇
工具
?->?
開(kāi)發(fā)板
?->?
MicroCore
?->?
ATtiny13
我們需要在Arduino IDE中再改變一些選項(xiàng),打開(kāi)
工具
,并設(shè)置以下值:
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) |
對(duì)ATtiny13進(jìn)行編程
現(xiàn)在可以把ATtiny連接到我們的Arduino了。把ATtiny連接到Arduino,如下所示(在ATtiny中,針腳1將用一個(gè)點(diǎn)
.
?標(biāo)記。)
ATtiny13 Pin | Arduino Pin |
---|
1 | 10 |
5 | 11 |
6 | 12 |
7 | 13 |
8 | 5v |
4 | Ground (GND) |
燒錄引導(dǎo)程序到ATtiny13
這是一個(gè)一次性的設(shè)置,不用在每次上傳代碼到ATtiny時(shí)都重復(fù)這個(gè)設(shè)置。點(diǎn)擊?
工具
->
燒錄引導(dǎo)程序
。
這將把引導(dǎo)程序燒到ATtiny上,現(xiàn)在我們就可以用Arduino IDE把程序上傳到ATtiny了。
上傳PoV程序到ATtiny
在Arduino中新建一個(gè)程序。復(fù)制代碼并將其粘貼到新創(chuàng)建的程序中。
//?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?