來自高中的小同志的作品
兄弟,
情同手足,肝膽相照
手拉手,心連心,一起走
從高二上學期開始,漸漸感受到班里一種團結,兄弟的情義正在匯聚,微妙而又美好。
在下學期開始的通用技術作品制作中,這種情義越來越濃,小組們一起努力,做出了七件精致的作品。有海盜船、萬寧大橋、古代戰車、傻妞智能家居、風車、沙漠酒吧,還有溫馨的臺燈。還有接下來的電子套件的焊接制作等活動。
漸漸展現出制作的興趣和熱情,
基于這份珍貴情感,我制作了這么一個趣味性電子作品“兄弟之心”,以紀念這美好的三年。
像往常一樣,用法,原理,制作過程,程序源代碼,總結,尾巴,一個也不少。
用法:
兄弟兩人將兄弟之心懸掛于胸前,心正在緩慢跳動。
當彼此在一起的時候,兩顆心,相應相伴,一起同頻率快速跳動。
原理:
通過紅外通訊協議(非標準協議),兩顆心互相握手通訊,協議達成即完成非己識別,改變LED閃動頻率。
制作過程:
2014年5月1日
繪制電路圖

單片機采用便捷的STC單片機,STC12LE5608AD。該單片機為3.3V單片機,我電池部分打算用紐扣電池,直接扣在電路板上,方便攜帶。更別說要掛一個電池盒了。我主打輕量級的設計方案。
為了使表面更加簡潔,電阻、三極管等,全部換成了貼片的封裝,額外增加了四個測試點,VCC、GND、RXD、TXD,用來串口通信的,編程 ,調試離不開這個,同時,也設計為貼片的形式,就是一個焊盤,不穿孔,到時候編程的時候把線頭焊上去就行。
外接12M晶振,也采用貼片封裝。LED用5mm白發紅,各串聯1.5K的電阻。至于紅外LED,用一個3mm的,接收頭用紅外一體化接收頭。本來是一起在網上買的,后來居然發現漏了接收頭,無奈,在欽州的電子商場里一找,幸好,有!價格。。汗顏吶!五元一個。
兩個NPN三極管控制紅外LED、心形LED。雖然STC單片機的IO普遍具有強推挽輸出功能,但是為了降低芯片負擔,用兩個小三極管也不是什么難事。
檢查設計規則無沖突后,進入PCB制作階段。
設定電路板尺寸,自動導入電子元件封裝。?上,STC單片機這個封裝沒有,自己畫了一個。一片混亂哈哈!!但不要討厭這亂七八糟的連線,暫時無視它先把元件布局好。主要是先將LED擺出個心形。后面你不得不依靠這些飛線完成PCB的設計。


人工布線完成。加上了版權作者信息。在你布局好元件后,在進行布線的時候,系統會屏蔽掉所有飛線,只保留且突出顯示你正在布的這條,利用這些飛線一路指引你要連通哪個地方。這就是CAD和人工制圖的區別之一了。自動完成由電路圖到PCB的轉換,只要你電路圖沒畫錯,PCB也肯定不會錯,除非你違反規則。線寬20mil,電路密度不高的情況下,對于自制PCB,盡量寬線寬。
因為我不需要絲印層,所以那些黃色的標識符可以無視了。
這次PCB設計,相比以前,有兩大特點:
一、走線走曲線,一方面是好看,另一方面邊緣平滑,不僅干擾低,而且是在以后的使用中不會刮、碰到有鋒利的角,增加線路穩定性。
二、走線與焊盤的連接處通通進行“補淚滴”處理,是為了防止鉆孔精確度造成的誤差損失和讓焊接更牢固。 
通過DRC檢查后,將線路圖用噴墨打印機打印到菲林膠片上,同時導出鉆孔位圖。又進入下一階段啦!準備覆銅板進行PCB制作。

打印出來的菲林膠片,打印質量調到最高,對比度最大。一定要黑,高端大氣上檔次的黑!如果有地方不夠黑,用黑色油性筆修補。

刷上UV自干型感光油墨,自然晾干三四個小時就可以進行下一步了。

一定要確保油墨完全干了,不粘了,再將膠片放在板上。否則等下一曝光,紫外線燈的溫度會讓油墨和膠片粘在一起,等下你把油墨都給拔了就完了。對齊平行邊線,然后用一塊透明玻璃壓住。



用黑燈泡發出紫外線燈光照射電路板曝光。曝光時間6分鐘,我每次都是用這個時間,感覺效果不錯,沒有過度曝光,也沒有沒曝光完全。自己的經驗啦。跟你之前刷的油墨厚度有關,兩者互相配合才行。
然后丟進顯影液顯影。顯影液濃度不能貪快而調高,否則會抑制油墨的脫落,這種抑制你怎么掃也掃不掉,但當你稍微加一點水進去后,你會發現,嘩啦瞬間全部脫完了,連線路部分都不剩,光碌碌的……


放進三氯化鐵溶液腐蝕掉多余的銅。抱歉,我真的沒有找到有什么環保點的試劑,網上流傳有一種藍色環保蝕刻劑,但效果不如三氯化鐵來得好,而且需要持續震蕩。



噔噔噔!蝕刻、脫模完成。

接下來,這個作品,我有個特別的地方,那就是自己做貼圖,做外觀。
怎么做呢? 不可能有什么現成的符合我的主題的貼圖吧。
這種方法是我首次應用啊,直接用感光油墨來印刷圖案。
其實電路板印制圖案一般用其他更加穩固的油墨,比如文字UV油墨等…但我沒有買,直接用抗蝕刻的感光油墨來做了。
電腦通過PS,畫好之后,同樣打印到菲林膠片上。黑色部分建議做得大一點,你等一下涂油墨的時候如果不小心涂得太廣了,導致那部分沒有被遮擋到,曝光之后,那部分油墨就沒辦法弄掉了,會很難看。除非你愿意一舉丟進脫模劑里,然后重新來過。


在電路板的正面,即沒有銅的那一面涂上感光油墨,還是吸附得上的。

同樣,進行曝光,顯影,馬上得到了效果。為了更加牢固,顯影之后,再放回紫外燈下重復曝光一次,時間十幾分鐘。同時,為了防止平時玩著玩著刮掉,我最后在上面粘了一層透明膠帶,也算是貼膜了吧,哈哈!

接下來進行鉆孔。
由鉆孔的位圖生成CNC雕刻機的刀路圖,生成G代碼,導入CNC。
電路板放平后,精度好的話,你只需要找一個定位點就夠了。
接下來,就是CNC的Show Time !~~~
我泡杯茶,聽音樂,看報紙去了哈哈哈!




鉆孔完成。看!還是很準滴!

接下來用萬用表進行飛針檢查,確認沒有短路的地方,就可以焊接了。這個檢查,要是在工廠里,試想一下,一塊板被固定在墻上,然后成百上千的針如暴風驟雨般刺向電路板的每一個焊盤……啊啊啊啊!我仿佛聽到了電路板的慘叫,那叫一個慘不忍睹吶!!
首先焊接芯片,我用的是先破壞后修復的焊接方法。使勁堆錫,讓每個引腳充分浸透焊錫,然后蘸松香,焊錫輕輕松松就可以被烙鐵頭帶走。前提是你的烙鐵要有很強的吸焊能力,這種能力源自于第一次使用時的錫化和后期的保養,還有熟練的操作技能,否則你要不就用一些銅線輔助帶錫,要不就不要玩這招了……

我還沒堆滿錫就拍了的照片,大家不要以為這樣就可以了。
然后,吸走焊錫后,引腳與焊盤緊密相連,同時又不會與相鄰引腳粘連。注意用放大鏡仔細查看是否真的有粘連。
其實,放大鏡對我來說真的好難看,看得我眼都暈了。那是九十年代那些老電工師傅用的裝備了,現在我們21世紀來點高科技的,用什么呢?
嘻嘻!!!手機!現在的智能手機,好的攝像頭,其微距拍攝能力不是蓋的,拍得比放大鏡還清晰。同時,還有閃光燈功能,讓閃光燈在背后照射,不管多小的錫球,總能產生一個違和的點,你不可能看不到。

焊接程序調試線,從此,這根線一直跟隨著裝置的成長……直到那一天的到來。
還有一個LED燈,紅外發射燈,接收頭。
電源開關部分真是失策,焊接的時候一不小心發現沒有這種推拉式的開關了,可是線路封裝、鉆孔已經定型,欽州沒有這種開關賣,我只好臨時改一下,用一些自鎖開關代替了。


分別對兩塊電路板寫入程序,用數字示波表輔助調試紅外通訊的協議。測量下降沿的實際時間與理論值的誤差,等。幫助更快地解決通訊問題。
這里單片機是沒有片上調試功能的,調試程序沒有那么方便。當然你可以借助一些信號,比如那盞紅色LED燈,本來是要做顯示的,你可以在程序中判斷執行到哪里了,哪里有沒有被執行,執行了就順便插一句代碼讓它點亮。或者往PC機送回一些數據。這樣你就知道程序的問題所在了。當然什么單步調試之類的在這里真算是是奢侈品,別想啦,因地制宜,隨機應變了。


這就是兩個裝置之間互相發送的信號的數據段的波形,有經驗的朋友應該可以讀出是0x42吧。對我來說,42是初中生活里一個充滿意義的數字,高中里則是14 。但為什么這里不用14而用42?隨便隨便了,通訊協議的東西,你可以自己定義。真想找個理由的話,那便是:人總是在現在懷念過去。

紅外數據收發測試成功!最遠達到2.4米。由于雙方遵守紅外編碼協議,載波了的信號,具有很強的抗干擾性能。同時,達到這個距離也是載波的功勞,38KHz脈沖波給LED帶來的峰值電流很大,可以瞬間發射出很亮的紅外燈光,使之傳播更遠。
當然這距離還可以更遠。像電視機、空調遙控器那些,不來個三四米以上你是沒法用的。

至此,這四根調試線的使命也就到了盡頭,標志著芯片程序調試完成,從電路板上脫離。唯一留下的,就是芯片里的程序和即將帶給大家的歡樂,還有那四個孤零零的焊點。





最后,把所有元器件焊接完畢。作品做成了!兄弟之心。
程序源代碼:
討厭的QQ空間,一發上來,那些原有的代碼縮進沒了。
/* 2014年5月11日00:05:20
單片機型號: STC12LE5608AD
程序編寫:楊宇慶
晶振:12M
*/
#include "STC.h"
#include <intrins.h>
sbit LED=P3^5;
sbit IRS=P3^7;
sbit IRR=P3^2;//also P1^3
//P01、P02被固定為GND。為方便電路板布線。
bit F_SendWave=0;//是否亮起紅外LED燈,若不亮起,發射過程相當于等待N個脈沖
unsigned int WaveTimes=0;//脈沖計數
unsigned int IRtime[16]={0};//數據段里每次脈沖相隔的時間
bit IRrecvOK=0;
void Timer0Init(void);
void Send_low(void);
void Send_high(void);
void Send_data_0(void);
void Send_data_1(void);
void SendDat(unsigned char dat);
void Recive();
void Delay50ms()//@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 72;
k = 161;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms()//@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void)//9600bps@12.000MHz
{
PCON &= 0x7F;//波特率不倍速
SCON = 0x50;//8位數據,可變波特率
AUXR |= 0x40;//定時器1時鐘為Fosc,即1T
AUXR &= 0xFE;//串口1選擇定時器1為波特率發生器
TMOD &= 0x0F;//清除定時器1模式位
TMOD |= 0x20;//設定定時器1為8位自動重裝方式
TL1 = 0xD9;//設定定時初值
TH1 = 0xD9;//設定定時器重裝值
ET1 = 0;//禁止定時器1中斷
TR1 = 1;//啟動定時器1
ES=1;
EA=1;
}
void UartSendChar(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void Timer0Init(void)//13微秒@12.000MHz
{
AUXR |= 0x80;//定時器時鐘1T模式
TMOD &= 0xF0;//設置定時器模式
TMOD |= 0x01;//設置定時器模式
TL0 = 0x64;//設置定時初值
TH0 = 0xFF;//設置定時初值
TF0 = 0;//清除TF0標志
TR0 = 1;//定時器0開始計時
ET0=1;
EA=1;
}
void tm0_isr() interrupt 1
{
if (F_SendWave)//中斷兩次,完成高低的跳變才算發射了一個脈沖,所以定時器周期是13us,這樣才是26us的脈沖即38KHz
{
IRS=!IRS;
}
else
IRS=0;
WaveTimes++;
TL0 = 0x64;//設置定時初值
TH0 = 0xFF;//設置定時初值
}
void Send_high(void)
{
WaveTimes=0;
F_SendWave=1;
while(WaveTimes<40);
}//電平跳變一次算為一個脈沖
void Send_low(void)
//發送寬度0.52ms的低電平延時,40個脈沖。脈沖寬度0.52ms
{
WaveTimes=0;
F_SendWave=0;
while(WaveTimes<40);
}
void Send_data_1(void)//發送編碼1
{//120
Send_low();//40
Send_low();//40
Send_high();
}
void Send_data_0(void) //發送編碼0
{
Send_low();//40
Send_high();
}
void SendDat(unsigned char dat)
{
unsigned char i=0;
unsigned char Sdat1=~dat;
TL0 = 0x64;//設置定時初值
TH0 = 0xFF;//設置定時初值
Send_high();
Send_high();
Send_high();
Send_high();
Send_high();
Send_high();
Send_low();//40
Send_high();//引導的終止信號,下降沿到來開始計時
//240個脈沖3.12ms+80個脈沖,非標準9ms
for (i=0;i<8;i++)//發送數據碼
{
if (dat&0x01==0x01)
Send_data_1();
else
Send_data_0();
dat>>=1;
}
//地址碼、地址反碼、數據反碼部分不發送。
Send_low();
Send_low();
Send_low();
Send_low();
Send_low();
Send_low();
//結尾
}
void Recive()
{
F_SendWave=0;
TL0 = 0x64;//設置定時初值
TH0 = 0xFF;//設置定時初值
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
}
void Ex0_isr(void) interrupt 0
{
static unsigned char i=0;
//紅外一體接收頭保持高電平。接收到38KHz的紅外光時,會拉下低電平,直到500ms左右超時或者紅外光消失。
if (WaveTimes>240)//理論值260
{
i=0;
WaveTimes=0;
//LED=!LED;
//LED=1;
//SBUF=WaveTimes;
}
else
{
IRtime[ i]=WaveTimes;
WaveTimes=0;
i++;
if (i==8)
{
IRrecvOK=1;
EX0=0;
i=0;
}
}
}
unsigned char IRproc()
{
unsigned char i=0;
unsigned char dat1=0;
if (IRrecvOK)
{
//LED=!LED;
for (i=0;i<8;i++)//接收數據碼
{
dat1>>=1;
if (IRtime[ i]>100 && IRtime[ i]<150)//理論值80~120
{
dat1|=0x80;
//LED=!LED;
}
}
IRrecvOK=0;
}
return dat1;
/*數據反碼驗證,由于不發送,所以此處驗證取消。
//if (((dat1&0xFF00)>>8)==(~(dat1&0x00FF)))
if (dat1&0x00FF == ~0x42)
return 0x42;
else
return 0;
*/
}
void LEDfast()
{
unsigned char i=0;
for (i=0;i<10;i++)
{
LED=!LED;
Delay50ms();
}
}
void LEDslow()
{
unsigned char i=0;
LED=!LED;
Delay500ms();
}
void main()
{
unsigned int r1=0;
Timer0Init();
//UartInit();
//SBUF=0x88;
//LED=0;
while(1)
{
SendDat(0x42);
Delay50ms();//此處延時50ms,
//發射出去的光的能量已經耗盡得差不多了,然后再開始接收,不會接收到自己發出的信號
//同時,此處的延時會導致傳輸距離縮短。
//如若沒有延時,需要兩塊電路板燒寫不同的程序,即發射不同的信號,互相識別對方的。
Recive();
Delay50ms();
if(IRproc()==0x42)
{
LEDfast();
//SBUF=0xF5;
}
else
{
LEDslow();
}
}
}
總結:
在本次制作中,流程還可以優化一下。應該先鉆孔,后做圖案。因為鉆孔時的震動很容易把圖案給抹掉。
在調試程序的時候,對于這種數字電路的信號,邏輯分析儀比示波器來得更直接,更方便。而且價格也很便宜,還能解析各種總線。示波器主要用來檢測模擬電路中的波形,有沒有毛刺,是否平緩等。
之所以不采用標準紅外通訊協議,是因為采用它會容易對周圍具有紅外遙控功能的電器設備產生干擾。我在這協議的基礎上進行了部分修改。另外,基于虛擬語氣,這顆心能利用這種紅外線,心靈感應地控制身邊的電器那是再好不過的了。
剛才也說了,傳輸距離還可以更長。但是,追求再高超的技術 ,也得要考慮實際需要啊。本作品的實際功能是要表達兄弟之間見面的激動之情和心中永不消退的默契。距離要適中,如果老遠就能感應到兄弟的存在,你會不會為找不到對方,而擔心發愁呢?心知就在身邊卻仍無法遇見。
紅外通訊技術在以前,可是蓬勃發展的一項技術,不亞于現在的NFC 。其成本極低,不需要實線連接,但傳輸速率較慢,丟包率不理想。這項技術漸漸被人們遺棄,由原來的雙工到現在只用在遙控器上的“你發我收”——單發單收。其實,一項技術有一半是不應該因為其缺點而放棄,人們還應該更多地尊重它的優點,在未來合適的地方說不定它還能派上用場。
比如,這項技術在現在可以用在智能家居里,主機對各個開關,傳感器的控制上。墻壁開關等都是在很長一段時間里不會移動的物體,使用紅外通訊技術比使用WiFi無線網絡所帶來的電磁輻射小很多,很多。維修成本也很低。過多的依賴WiFi網絡會使得信號變得擁擠。
尾巴:
一個城市的落后,給人們帶來的不便真是不小。昂貴的價錢,甚至連貨都沒有,越來越發展的科技技術和停滯不前的物質供給的矛盾,不得不迫使人們產生了網購的想法,也因此促進了電子商務和物流業的繁榮。但若是要想被網購,這基礎還是要打牢呀!
|