2016年1月30日 星期六

Arduino UNO學習440.8*8點陣LED燈16腳1088BS

Arduino UNO學習440.8*8點陣LED燈16腳1088BS

點陣8*8共64個燈,由8+8個腳位控制,
也有12+12腳位控制雙色8*8燈,
以下為1088BS點陣燈腳對應圖,接腳位順序不等同燈號順序,
當X13,Y9一正一負交叉時左上燈亮起,由於燈有分正負,
需依共陽或共陰,來調整X列為正或負,以及Y列為正或負,↓
 

燈在裝上麵包板時會發現,燈太大了,所以此學習需使用2個麵包板,
點陣8*8共有8+8=16支腳,而Arduino UNO的數位腳只有D0~D13,
因此需用到類比腳位A0~A5,來代替為第A14~A19,
為避免用到D0和D1的通訊腳位,所以從D2腳位開始接起,
也就是燈1腳接D2,,燈2腳接D3,,依序到燈12接D13,,
再轉到燈13腳接A0,,一樣依序接到燈16腳接A3,,共16腳位,
此範例是作動態閃燈,每顆亮燈時間不長,故省略了電阻,
若要長時間點亮還是要加上電阻保護,以免燒燈↓
 
燈的順序和腳位順序是不同步的,故接好後的燈對應Arduino腳位圖↓
 
ArduBlock先寫副函式,手邊的燈X負Y正時點亮,想要將燈關閉,所以X列設高Y列設低,
並將X列和Y列熄燈腳位設定為副程式以便每燈亮後作熄燈用,↓
 
依序要點亮每個燈,X列腳位順序即為D14,D4,D5…一直到D17,因為要亮8排,
所以可設成副程式以便亮8次,每顆燈亮100毫秒就熄燈,再亮下一顆燈,
若要讓燈由右燈亮起,也可設成反順序D17,D16,D12…一直到D14,
要換下一排前記得讓燈全部熄滅,所以在程式尾要呼叫對映副函式X1和Y0↓
 

主程式部分每次開始前先讓點亮的燈熄滅,所以先呼叫對映副函式X1和Y0,
Y列第一排腳為D10,加上X列由D14腳逐一往右亮起,
再亮Y列下一排D15一樣加上X列由D17由右往左亮起,
如此便可讓Y列8排都逐一亮點亮,ArduBlock的主程式拼圖↓
 
void Y0();
void X1();
void X14();
void X17();

void setup()
{
    pinMode( 10 , OUTPUT);
    pinMode( 15 , OUTPUT);
    pinMode( 9 , OUTPUT);
    pinMode( 13 , OUTPUT);
    pinMode( 2 , OUTPUT);
    pinMode( 8 , OUTPUT);
    pinMode( 3 , OUTPUT);
    pinMode( 6 , OUTPUT);
    pinMode( 17 , OUTPUT);
    pinMode( 16 , OUTPUT);
    pinMode( 12 , OUTPUT);
    pinMode( 7 , OUTPUT);
    pinMode( 11 , OUTPUT);
    pinMode( 5 , OUTPUT);
    pinMode( 4 , OUTPUT);
    pinMode( 14 , OUTPUT);
}

void loop()
{
    X1();
    Y0();
    digitalWrite( 10 , HIGH );
    X14();
    digitalWrite( 15 , HIGH );
    X17();
    digitalWrite( 9 , HIGH );
    X14();
    digitalWrite( 13 , HIGH );
    X17();
    digitalWrite( 2 , HIGH );
    X14();
    digitalWrite( 8 , HIGH );
    X17();
    digitalWrite( 3 , HIGH );
    X14();
    digitalWrite( 6 , HIGH );
    X17();
}

void X17()
{
    digitalWrite( 17 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 16 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 12 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 7 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 11 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 5 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 4 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 14 , LOW );
    delay( 10 );
    X1();
    Y0();
}

void X1()
{
    digitalWrite( 14 , HIGH );
    digitalWrite( 4 , HIGH );
    digitalWrite( 5 , HIGH );
    digitalWrite( 11 , HIGH );
    digitalWrite( 7 , HIGH );
    digitalWrite( 12 , HIGH );
    digitalWrite( 16 , HIGH );
    digitalWrite( 17 , HIGH );
}

void X14()
{
    digitalWrite( 14 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 4 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 5 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 11 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 7 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 12 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 16 , LOW );
    delay( 10 );
    X1();
    digitalWrite( 17 , LOW );
    delay( 10 );
    X1();
    Y0();
}

void Y0()
{
    digitalWrite( 10 , LOW );
    digitalWrite( 15 , LOW );
    digitalWrite( 9 , LOW );
    digitalWrite( 13 , LOW );
    digitalWrite( 2 , LOW );
    digitalWrite( 8 , LOW );
    digitalWrite( 3 , LOW );
    digitalWrite( 6 , LOW );
}


以下世界高手的作品分享,遵循Arduino精神把大家的作品放上網路分享吧
http://blog.bsoares.com.br/arduino/ping-pong-with-8x8-led-matrix-on-arduino


www.ee543.com

沒有留言:

張貼留言