前言:
呀,今天晚上不才又有空了
應該吧......
.
呀,就如各位所期待的(?),不才把程式碼放了上來wwwwww
.
https://drive.google.com/file/d/0ByFM53DUVTU9Z2xVUG5UNENqcmc/edit?usp=sharing
.
接下來來解釋要怎麼運作吧~
雖然說有些無聊,但請大家別拿了程式碼後就跑走呀OAQ
.
在複習一下要接的 訊號 Pin腳好了
.
因為怕接腳接到TX RX那裏會影響程式燒入所以那兩個腳位(Pin 0 跟 1)就先空著
然後Pin2 跟Pin 3分別是接 後方 跟 前方 的伺服馬達的
Pin4 接 latch ,相對於矩陣LED上的 LI
Pin5 接 clock ,相對於矩陣LED上的 SK
Pin6 接 data ,相對於矩陣LED上的 R1
Pin7 接到開關上,當作開關的輸入
Pin8 輸出高電位,也是接到開關上
Pin9~12分別接A~D
.
剩下接地5V的就隨便接吧
.
接下來就拿著剛剛給的程式碼邊對邊看吧~
.
|
byte motion8_1[16][4]= { {0b00000000,0b00000000,0b00000000,0b00000000}, {0b00000000,0b00000000,0b00000000,0b00000000}, {0b00000000,0b00000100,0b00000000,0b00100000}, {0b00100000,0b00001000,0b00000000,0b00010100}, {0b01000000,0b00010011,0b00000000,0b11001010}, {0b10001001,0b01000100,0b10000001,0b00100001}, {0b10001001,0b01000100,0b10000001,0b00100001}, {0b10001001,0b01000011,0b00000000,0b11000001}, {0b10001001,0b01000000,0b00111100,0b00000001}, {0b10001001,0b01000000,0b00100100,0b00000001}, {0b10001001,0b01000000,0b00100100,0b00000001}, {0b10001001,0b01000000,0b01000100,0b00000001}, {0b01001001,0b00000000,0b11111110,0b00000010}, {0b00101000,0b00000000,0b10000010,0b00000100}, {0b00000000,0b00000000,0b00000000,0b00000000}, {0b00000000,0b00000000,0b00000000,0b00000000} }; |
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
接下來是有關上面這個到底是什麼鬼東西的
因為呢,由於74HC595這個IC的驅動方法是一次傳送一個Byte的資料到IC上,如果後面有串接相同的資料就流到後面
這塊矩陣顯示器控制單行的部分是用兩顆MBI5026,用法相當於四顆74HC595
.
這裡 motion8_1[16][4]
裡面儲存的是一個16*32的臉的資料,其中0b00111100
代表一個Byte的二進位碼
0b00111100的1的部分就單行中是要讓它亮的那顆燈
.
也就是說,其中一行
{0b10001001,0b01000100,0b10000001,0b00100001},
裡面16*32的顯示器長度為32的那一行
意思說由左邊數過來,第1 5 8 10 14 17 24 27 32顆LED會亮
.
如果你會16進位的話,0b00111100也可以寫成0x3C
但相對的難以直接用肉眼判別自己究竟畫了些什麼
.
然後在 void loop()裡面
有一個 Main_script() ,這裡面是撰寫腳本的地方
簡單來說,在幾秒內如果觸發幾次開關,就會呼叫相對應動作 ,例如script1()
.
script1()~ script3()裡面是被包好的動作
主要功能是呼叫表情,還有伺服馬達的轉動速度,間隔時間等等
.
裡面的
for(int i=0;i<60;i++) p="">
line(1);
是說呼叫60次 line(1),每呼叫一次line(1)臉的畫面會閃過一次
說呼叫60次 line(1),差不多會顯示 臉部1 一秒又多一點
如果不呼叫,整個LED顯示器就會暗掉了
.
|
void line(int select) { for(int i=0;i<16;i++) span=""> { int k; k=i-1; if(k%2==1) { digitalWrite(A, HIGH); } if((k/2)%2==1) { digitalWrite(B, HIGH); } if((k/4)%2==1) { digitalWrite(C, HIGH); } if((k/8)%2==1) { digitalWrite(D, HIGH); } Play_motion(i,select); digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); } } |
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
而Line(X),而X可以放入1~4
這裡主要是驅動兩顆74LS138
簡單來說,就是分別控制A B C D的高和低電位,來讓單行的LED發亮
也就是一般矩陣LED,或是顯示器的驅動方式
.
簡單來說,能夠讓這片16*32矩陣LED顯示出畫面的方式就是
先讓第一列亮出 第一列該亮的 LED,
然後快速的切換到第二列 亮出 第二列該亮的 LED
......
等亮到16列之後,就完成一個畫面,
靠著偉大人類的視覺暫留,如果第一列~到16列刷過一圈
然後不到1/30秒,眼睛就可以保留完整的畫面一下下
每一秒這樣刷過30次以上,就可以看到連續的畫面了wwwwwww
.
也就是說,每一秒會呼叫大約16(形成一個畫面的LED行數)*60(每秒針數)
差不多960次的 Play_motion(i,select);
.
i 是行號,select是要顯示的畫面
.
基本上除非是要改變LED顯示器的行數,例如改成32*32,不然即使擴充功能也不需要動到這裡wwwww
.
|
void Play_motion(int i,int select) { digitalWrite(latchPin, LOW); for(int j=0;j<4;j++) p=""> { switch(select) { case 1: shiftOut(dataPin, clockPin, MSBFIRST, motion1_1[i][j]); break; case 2: shiftOut(dataPin, clockPin, MSBFIRST, motion1_2[i][j]); break; case 3: shiftOut(dataPin, clockPin, MSBFIRST, motion2_1[i][j]); break; case 4: shiftOut(dataPin, clockPin, MSBFIRST, motion2_2[i][j]); break; } } digitalWrite(latchPin, HIGH); } |
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
最後就只剩下這個要解釋了
Play_motion(i,select)這個函數個功能主要就是顯是單一行LED用的
.
因為這塊矩陣顯示器控制單行的部分是用兩顆MBI5026,用法相當於四顆74HC595
74HC595的驅動方式是靠輸入一個Byte,然後轉成二進位,例如二進位的0b11001100
二進位中3 4 7 8 是1
相對應的Pin腳就會輸出高電位或是低電位,然後接到高電位Pin腳的LED就會發亮
.
這裡的做法是先把Lateh輸出低電位,讓資料能夠輸入進去
然後輸入四個Byte,剛剛的Select就是選擇要用哪個Byte陣列裡面的臉譜
如果之後畫出新的臉譜也要在Switch(Case)裡面新增選項
輸出完後再把Lateh輸出高電位,不讓資料進來wwwwww
.
結束了~
如果要擴充的話,大家應該知道要從哪裡著手了吧~
很好,不才要去尻尻洗睡睡了
.
7/7補充
.
這個是最後做出來的效果
如果之後還有更新的話會用Part 3 Part4來繼續補充
之後如果會用Mini板的話在考慮要不要加暴走功能好了XD
.
1樓. zhen2015/12/30 00:30請問我買到的LED矩陣上面的接腳是
LATCH_B SRCLK_B SER_B LATCH SRCLK SERC 這幾個
程式應該怎麼改比較好
(asasaew123@gmail.com)







