10
本文作者: 驛帆 | 2015-12-02 11:18 |
Liz:Alex是我十歲的兒子。最近他和我合作完成了一個(gè)學(xué)校布置的作業(yè)。這是一個(gè)很成功的作業(yè),同時(shí)作為父母的我們也給予他很好的指導(dǎo),因此我想在這里與大家分享這次經(jīng)歷。
以下是Alex的分享:
我媽想要一個(gè)數(shù)字時(shí)鐘,而我也需要完成我的作業(yè)。所以我花了兩個(gè)月把閑置的樹莓派小電腦做成了數(shù)字時(shí)鐘,一石二鳥,請叫我機(jī)智のboy。
爸爸給我提供了來自戰(zhàn)斗民族俄羅斯的一些數(shù)碼管和芯片,還買了一個(gè)170V的電池來當(dāng)數(shù)碼管的電源。我需要做的第一件事情就是測試這些原材料。
首先我把數(shù)碼管,芯片和電源安裝在了電路板上。芯片有ABCD四個(gè)輸入端口,這些端口用來指示亮哪一個(gè)燈。比如在二進(jìn)制里7表示為0111,所以我們需要把ABC設(shè)置為顯示,D設(shè)置為不顯示,(A=1, B=2, C=4 and D=8)來表示數(shù)字7。我測試的時(shí)候用一個(gè)跨線電纜使四個(gè)接口為0V(不顯示數(shù)字)或5V(顯示數(shù)字)。
在測試完第一個(gè)數(shù)碼管和芯片后,我在樹莓派電腦上編了一個(gè)程序進(jìn)行第二次測試。我用4個(gè) GPIO管腳連接到引腳A、B、C和D芯片。這個(gè)程序會(huì)從數(shù)字0到9循環(huán),然后在二進(jìn)制中用“high”和“l(fā)ow”的邏輯判斷來實(shí)現(xiàn)打開或關(guān)閉管腳的目的。
一旦這個(gè)程序順利運(yùn)行,那么接下來測試所有的芯片和數(shù)字時(shí)鐘數(shù)碼管就會(huì)變得so easy。每個(gè)部分都正常運(yùn)行,但有一個(gè)數(shù)碼管除外(測試時(shí)出現(xiàn)了3和9同時(shí)亮起的問題),所以我把這個(gè)數(shù)碼管用來表示小時(shí)的第一位,因?yàn)樾r(shí)的第一位只需要顯示數(shù)字1(采用12小時(shí)計(jì)時(shí)法)。
關(guān)于程序
當(dāng)樹莓派電腦啟動(dòng)時(shí),我的數(shù)字時(shí)鐘程序也會(huì)自動(dòng)啟動(dòng)。
我用geany編輯器在c盤寫好了數(shù)字時(shí)鐘的程序。
然后我打開管腳0,這也意味著用轉(zhuǎn)換器打開了高壓電源。
接著我測試了時(shí)鐘,讓時(shí)鐘的小時(shí)部分從1到12顯示,分鐘部分從0到59顯示。
開始循環(huán)時(shí),我是這樣做的:
和電腦對照時(shí)間(電腦連接互聯(lián)網(wǎng)以確保時(shí)間準(zhǔn)確)
小時(shí)的數(shù)字會(huì)在1和23之間循環(huán),所以當(dāng)小時(shí)大于12時(shí),我會(huì)減去12.
然后我將小時(shí)數(shù)和分鐘數(shù)都以二進(jìn)制表示。也就是說,用2整除十進(jìn)制整數(shù),可以得到一個(gè)商和余數(shù);再用2去除商,又會(huì)得到一個(gè)商和余數(shù),如此進(jìn)行,直到商為0時(shí)為止,然后把先得到的余數(shù)作為二進(jìn)制數(shù)的低位有效位,后得到的余數(shù)作為二進(jìn)制數(shù)的高位有效位,依次排列起來。
這樣一來,我們就得到了所有數(shù)字的二進(jìn)制。然后我們就可以用1和0所代表的高低接口來表示了。(比如7,我們就可以表示為低高高高,因?yàn)樗亩M(jìn)制寫法是0111 。)
如果你是條小懶蟲,下面是我為你準(zhǔn)備的完整表格,你可以參照。
接下來我們用C語言來寫入代碼:
#include /* These are libraries */
#include
#include
#include
// turns a pin on or off
void nixiePin(int p, int v){
if (p != -1) {
digitalWrite(p, v);
}
}
// converts to binary and sends values to 4 pins
void nixiePins(int p1, int p2, int p4, int p8, int v){
nixiePin(p1,v&1);
nixiePin(p2,v&2);
nixiePin(p4,v&4);
nixiePin(p8,v&8);
}
// splits the time into digits
void nixieTime(int h,int m, int s) {
nixiePins( 1, -1, -1, -1, h/10); /* quotient of hour / 10 */
nixiePins( 2, 3, 4, 5, h%10); /* remainder of hour / 10 */
nixiePins( 6, 7, 21, -1, m/10); /* quotient of minute / 10*/
nixiePins(22, 23, 24, 25, m%10); /* remainder or min / 10 */
}
// makue sure all the digits work
void testClock(void){
int i;
for (i=1; i<=12; i++) {
nixieTime(i,0,0);
delay(250);
}
for (i=1; i<=59; i++) {
nixieTime(12,i,i);
delay(250);
}
}
// set up the pins we will use
void initPin(int p) {
pinMode(p, OUTPUT);
digitalWrite(p, LOW);
}
// this is the main part of the program
int main (void) {
time_t now; /* its a variable that holds time info */
struct tm *ntm; /* it is a variable */
int i;
wiringPiSetup(); /* set up pins 0-7 and 21-29 to use */
for (i=0; i <=7;i++) {
initPin(i);
}
for (i=21; i <=29;i++) {
initPin(i);
}
digitalWrite(0, HIGH); /* turn on high voltage power */
testClock(); /* test all the digits */
while (1) { /*starts and infinite loop */
now=time(NULL); /* ask the computer for the time */
ntm=localtime(&now); /* it formats the time */
if (ntm->tm_hour > 12) { /* if hour is more than 12 - 12 */
ntm->tm_hour = ntm->tm_hour-12;
}
/* it tells it to write that number to the nixie tubes*/
nixieTime(ntm->tm_hour,ntm->tm_min,ntm->tm_sec);
delay (1000); /* wait for 1 second */
}
return(0);
}
電路板
爸比幫我焊接了一個(gè)塑料板,電路板上面接有四條數(shù)碼管,每個(gè)對應(yīng)了一個(gè)芯片(黃線就是了)。
黑色線用于接地線,紅色線為5V和12V的電線,而每個(gè)芯片則對應(yīng)了一條地線和一條5V線。
不過,數(shù)碼管要求在170V的高壓下工作,所以我們還需要接一個(gè)高壓電源,這里我們用的是綠色線。而且,我們還得外加一個(gè)2毫安的電阻,防止電流過大燒毀了我們的作品。
此外,我還加了一個(gè)晶體管和兩個(gè)電阻,以限制電流。這將等同于電源開關(guān),用于控制高壓電源。
我還加了一個(gè)USB端口,用于連接地線和5V線,作為供樹莓派的電源。
外殼
以上步驟完成后,我們就開始做外殼了。所謂人靠衣裝美靠亮噢不不不,美靠造型,我用的是木盒子,外加兩面的塑料透明板。這個(gè)盒子是爸爸幫我鋸的(人家還小嘛)。然后用鐵釘和螺絲固定,就完成了。
最后
曾經(jīng)有一個(gè)新聞,說一個(gè)學(xué)生帶了個(gè)自己做的電子鐘到學(xué)校去,老師以為是炸彈,都報(bào)警了!真是嚇?biāo)缹殞毼伊?,為了不讓我面臨這樣的人生大場面,爸比和媽咪事先打電話通知了老師。我覺得,老師一定會(huì)記得我的,因?yàn)樗龁柕梅浅T敿?xì),像查戶口一樣。
不過,這只是我的作品的開始啦。我準(zhǔn)備把它改進(jìn)一下,再送給媽媽。我想加一個(gè)報(bào)警器,還有攝像頭、麥克風(fēng)和揚(yáng)聲器,這樣就可以進(jìn)行人臉識別了。要是可以的話,我還想讓它變成更高級的東西,就像鋼鐵俠一樣。
via raspberry pi
2015-2016賽季全球創(chuàng)客馬拉松深圳大學(xué)站已經(jīng)開始接受報(bào)名啦!關(guān)注“硬創(chuàng)邦”(微信號:leiphone_bang),回復(fù)“深大”即可參與報(bào)名!而且,雷鋒網(wǎng)在未來三個(gè)月內(nèi)選一個(gè)合適的時(shí)間,在北上深選擇一個(gè)地點(diǎn),舉辦創(chuàng)馬“火星救援”專場!詳情可點(diǎn)此處了解。
此外還可加入全球創(chuàng)客馬拉松主群(群號:259592983),參與我們的互動(dòng)討論~
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。