網路城邦
上一篇 回創作列表 下一篇   字體:
[放生DIY專區]無用盒子製作Part2(所謂貓箱嗎?)
2014/07/02 21:18:40瀏覽3094|回應1|推薦0

前言:

呀,今天晚上不才又有空了

應該吧......


.

呀,就如各位所期待的(?),不才把程式碼放了上來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

.

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=andy840119&aid=14719922

 回應文章

zhen
2015/12/30 00:30

請問我買到的LED矩陣上面的接腳是

LATCH_B SRCLK_B SER_B LATCH SRCLK SERC 這幾個 

程式應該怎麼改比較好

(asasaew123@gmail.com)
他喵的(andy840119) 於 2015-12-30 18:54 回覆:

那個顯示器目前不在我身邊
我也沒辦法幫你看ODO

可以先照文章說明接接看

之後再改相對的pin角