組員:411114231蔣承翰、411114201 黃兆賢、411114315林伯叡
學長:411014320 羅得豪、411014222 蘇義人
一.作品介紹:
1.輝光管簡介 :
輝光管也被稱為陰冷極輝光放電指示管,它誕生於上世紀的50年代,由美國一家名叫海頓兄弟實驗 室的小型真空管制造商發明製造。美國寶來公司將這種陰冷極輝光放電指示管命名為NIXIE,輝光管自誕生之後,就受到了許多電子產品的追捧,因為在那個科技還不是特別發達的年代,輝光管是唯一可以顯示數字和符號的電子元件。所以我們現在看到很多誕生在上世紀50-90年代的電子設備上,都會有輝光管的身影。比如常見的收音機、計時器、計算器、計數器等等的測量儀器,甚至在一些老舊的電梯上還有使用輝光管來顯示樓層的數字。
2.輝光管原理:
在數位管中充以低壓氣體,通常大部分為氖加上一些汞或氬。給某個陰極充電就會發出顏色光,視管內的氣體而定,一般都是橙色或綠色。儘管在外觀上和真空管相似,其原理並非為加熱陰極放射電子,因而它被稱為冷陰極管或霓虹燈的一個變種。在室溫下,即使處於極端的室內工作條件,這種管子的溫度很少超過40℃。
數位管的最常見形式有10個陰極,形狀為數字0到9,某些數位管還有一個或兩個小數點。然而也有其他類型的數位管顯示字母、標記和符號。如一種「數位管」,其陰極為一個模板製成的面具,上面有數字形狀的孔。
我們打算利用掃描電路的方式,利用人眼視覺暫留的原理,快速的閃爍顯示器,在短時間一次只點亮一個,但看起來會是全部同時點亮。使輝光管能不用一次性全部點亮,只需一個個點亮,不僅能省電也能延長輝光管的壽命。
二.程式碼:
#include <Wire.h>
#include "RtcDS1302.h"
ThreeWire myWire(A5,SCL,A4); //接腳: DAT/IO, SCLK/CLK, RST/CE (DS1302的接線自行更改)
RtcDS1302<ThreeWire> Rtc(myWire);
#include "CompileTime.h"
using namespace CompileTime;
int j;
int k;
const int nixie_0 = 2;
const int nixie_1 = 3;
const int nixie_2 = 4;
const int nixie_3 = 5;
const int nixie_4 = 6;
const int nixie_5 = 7;
const int nixie_6 = 8;
const int nixie_7 = 9;
const int nixie_8 = 10;
const int nixie_9 = 11;
const int row_1 = 12;
const int row_2 = 13;
const int row_3 = A0;
const int row_4 = A1;
const int row_5 = A2;
const int row_6 = A3;
const int time_on = 1;
void setup() {
// DateTime now = RTC.now();
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(_DATE_, _TIME_);
CompileTime::setCompileTime(6); // pass the number of seconds it takes to upload
printDateTime(compiled);
if (!Rtc.IsDateTimeValid())
{
// Common Causes:
// 1) first time you ran and the device wasn't running yet
// 2) the battery on the device is low or even missing
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Rtc.SetIsRunning(true);
}
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
// Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
}
pinMode(nixie_0, OUTPUT);
pinMode(nixie_1, OUTPUT);
pinMode(nixie_2, OUTPUT);
pinMode(nixie_3, OUTPUT);
pinMode(nixie_4, OUTPUT);
pinMode(nixie_5, OUTPUT);
pinMode(nixie_6, OUTPUT);
pinMode(nixie_7, OUTPUT);
pinMode(nixie_8, OUTPUT);
pinMode(nixie_9, OUTPUT);
pinMode(row_1, OUTPUT);
pinMode(row_2, OUTPUT);
pinMode(row_3, OUTPUT);
pinMode(row_4, OUTPUT);
pinMode(row_5, OUTPUT);
pinMode(row_6, OUTPUT);
Serial.begin(9600); //should NOT use seiral println, it will effect to output pin D0 & D1
Wire.begin();
}
void loop() {
//-------------------get clock value---------------------------
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
}
void on_number(int row, int nixie){
digitalWrite(row, HIGH);
digitalWrite(nixie, HIGH);
}
void off_all(){
digitalWrite(row_1, LOW);
digitalWrite(row_2, LOW);
digitalWrite(row_3, LOW);
digitalWrite(row_4, LOW);
digitalWrite(row_5, LOW);
digitalWrite(row_6, LOW);
digitalWrite(nixie_0, LOW);
digitalWrite(nixie_1, LOW);
digitalWrite(nixie_2, LOW);
digitalWrite(nixie_3, LOW);
digitalWrite(nixie_4, LOW);
digitalWrite(nixie_5, LOW);
digitalWrite(nixie_6, LOW);
digitalWrite(nixie_7, LOW);
digitalWrite(nixie_8, LOW);
digitalWrite(nixie_9, LOW);
delayMicroseconds(400); //to prevent "ghost" effect to other tube
}
void printDateTime(const RtcDateTime& dt)
{
static int16_t lasth = hour, lastm = minute, lasts = second;
updateTime(micros());
if (lasts != second || lastm != minute || lasth != hour) {
lasts = second; lastm = minute; lasth = hour;
char buff[16];
sprintf(buff, "%s%d %d - %2d:%02d:%02d", month, day, year, hour, minute, second);
Serial.println(buff);
}
dt.Hour();
dt.Minute();
dt.Second();
j = lasts/10;
k = lasts%10;
//-----------show first number of second
off_all();
on_number(0,k+2);
delay(time_on);
//-----------show second number of second
off_all();
on_number(1,j+2);
delay(time_on);
j = lastm/10;
k = lastm%10;
//-----------show first number of minute
off_all();
on_number(A0,k+2);
delay(time_on);
//-----------show second number of minute
off_all();
on_number(A1,j+2);
delay(time_on);
j = lasth/10;
k = lasth%10;
//-----------show first number of hour
off_all();
on_number(A2,k+2);
delay(time_on);
//-----------show second number of hour
off_all();
on_number(A3,j+2);
delay(time_on);}
三.所需材料:
<(圖一).電晶體
(圖二).>直流電變壓器
<(圖三).輝光管
(圖四).>Arduino板子
四.成品實際照片:
↑ 輝光管的二維簡示線路圖
這張電路圖是採用矩陣的方式,讓輝光管在兩個電晶體都開啟時形成通路,點亮對應的數字,比如說我要讓第一顆輝光管點亮數字7,那我就要控制六顆電晶體的行一開啟,控制列8的電晶體開啟。但接下來增加顆數後就會出現一個問題,我假如要讓第一顆顯示7,第二顆顯示5,如果我將兩者所對應的電晶體同時打開,那不就會讓第一顆與第二顆的5與7都亮起?所以我們所參考的作者利用高頻率的開關電晶體,比如說我先通no.17,再通no.25,每次只開啟幾毫秒,並且讓兩個通路之間間隔幾微秒再動作避免干擾,如此循環直到一秒過後換控制其他電晶體,這樣子的循環反覆構建出人眼看不出閃爍的影像。但我們最後並未使用RTC模組,而是直接從電腦上傳時間給Arduino板子。
資料來源:https://projecthub.arduino.cc/whitebank/nixie-clock-with-arduino-simplest-design-474fc6
<(圖一).配線圖,輝光管為由燈管為上往下看。
<(圖二).成功將輝光管點亮
(圖三).>電源供應器
< (圖四).六根輝光管的第一版線路
<(圖五).電晶體接上後
(圖六).>接上Arduino
↑(圖八).點火成功,但未成時間排序 ↑ (圖七).第一次成功的畫面,但是由於接線的方向相
反,本應由左向右的時,分,秒相反,畫面中呈現的
是由右向左的17時25分13秒
<(圖八).最終成品,從左向右完整呈現的輝光管時鐘
最終成品影片如下
五.組員心得:
(1).411114201 黃兆賢:這學期因為在4月發生了大地震,導致我有長達一個半月沒有在學校,導致我無法和組員蔣承翰以及羅得豪學長共同做實驗,因此我負責的是做報告及整理資料,在整理完相關的資料以及看完組員和學長做的成果,我真心覺得佩服,因為在做實驗前就了解到要藉由供應器來調整電流及電壓或增加串聯電阻來使輝光管不會燒壞,但是組員及學長卻克服了這個問題,在期末讓6根會輝光管全部點亮了,另外,在編寫程式碼的方面,因為最初是想一起使用電子開關來一併控制時鐘是否開啟,但是,後來發現店員會無法供應及無法利用開關的程式碼和時鐘的程式碼合併,所以放棄使用開關,如果之後還有機會的話,我會想要實驗如何再增加輝光管的數量,讓其也具有顯示日期的功能。
(2).411114231 蔣承翰:這次報告我認知到一件事情,學習要一步一步,別想著事情在death line前用幾天的時間趕出來,在這次的報告中,我認為我們缺乏對於工作的分配、報告所需器材的確認、成品的試做與時間分配。我們線下與羅得豪學長、林柏叡組員討論只有一次,我發現這種類型的線上討論實在是沒有太大效益。我們到在期中都還在找電源供應器,要報告前一周才終於把一顆管子亮起來,再將第一顆管子亮起來的隔天,在實驗室與蘇義人學長挑燈夜戰的將輝光管時鐘的線路接完,由於實驗室最不缺麵包版與杜邦線,所以我採用杜邦線去接線,與電路板不同,雖然在視覺上杜邦線會擋到時鐘部分,以及看起來凌亂,但好在杜邦線擁有十種色系,剛好與輝光管負極會用到的根數剛好,可以用顏色去理線,杜邦線的好插拔修改讓我們在對線路進行改動時可以迅速找出問修錯,非常適合我們在沒有百分百把握下做出成品的情況。再將線路插好後,我們一共歷經了三次的突破。第一次是與羅得豪學長將線路整理完並且修正線路錯誤,把電阻及穩壓二極體接上,使燈管能夠穩定亮度並增加整體穩定性;第二次是程式碼的修改,這部分是助教的血C我們,辛苦了一下午將程式碼編改完成,確定了當下的問題是程式碼造成;第三次是我在實驗室利用改變電阻、調整變壓器變壓大小與電源供應器,尋找電源供應器的電流電壓值,讓時鐘可以在較低功率以及轉換耗損的情況下穩定運行,不用再擔心電路上的節點會負荷不了而燒掉,最終我們只讓一個15K的電阻承受1安培多、13V大小的功率而陣亡(對不起我手麻轉太多)的情況下將輝光管變成富有意境的時鐘。在將最終成品完成前,輝光管的分秒部分重疊,我曾一度想放棄秒的功能(其實說真的時跟分的輝光管比較美,不帶私心與偷懶),降低功率的方式將重疊的秒淡化,使之不會干擾到分,但是助教卻不離不棄的發現了程式碼的最後一點問題,讓秒的部分能夠正常運行,至此讓這個時鐘完成,當下的感覺是我許久未體驗到的開心,原來苦盡甘來的感受是如此美好。
感謝在實驗中施以援手的各位。放棄很簡單,但放棄不僅只是讓自己先前努力付之一炬,也辜負他人的援助。
(3).411114315 林伯叡:歷經前一學期的課程後,這學期我們將自己想出一個主題並完成,但4月初遇到地震,讓所有事情都變了調,宿舍不能住,實驗室也燒掉,因此許多組員都分隔兩地,討論困難,很難做實驗,導致許多問題,例如:溝通障礙以及實驗時間延長等......在這之中,我也很懷疑能不能做完,但我內心的聲音一直在跟我說:你不要相信自己,要相信相信著你的組員們!最後我們所有組員一起共同面對各式各樣的困難,並且突破他,最終使我們的期末報告能突破天際。