|
|
![]() ÂüÁ¶ : http://www.bryanchung.net/?p=177 Á¦¸ñ : 8x8 LED Matrix processing ¸ñÀû PC¿¡¼ ºñÆ®¸Ê À̹ÌÁö¸¦ ¼Û½ÅÇϸé, ¾ÆµàÀÌ³ë ±âÆÇ¿¡ ¿¬°áµÈ 8X8 LED ¸ðµâ¿¡ Ç¥½ÃÇÕ´Ï´Ù. PC ¼ÒÇÁÆ®´Â º°µµÀÇ ÄÄÆÄÀÏ·¯¸¦ ¼³Ä¡ÇÒ ÇÊ¿ä¾ø´Â, ¾ÆµàÀÌ³ë °³¹ßȯ°æ ¼ÒÇÁÆ®¿þ¾îÀÇ ÇÁ·Î¼¼½ÌÀ» »ç¿ëÇÕ´Ï´Ù, ¾ÆµàÀ̳ë¿Í PC¸¦ ¿¬°áÇÑ ÇÁ·Î¼¼½Ì ´ÙÀ½ ´Ü°è´Â ¾ÆµàÀÌ³ë ±âÆÇ°ú PC¸¦ Á÷·ÄÆ÷Æ®·Î ¿¬°áÇÕ´Ï´Ù.Åë½Å ÇÁ·ÎÄÚÄÝÀÌ ÇÊ¿äÇÕ´Ï´Ù. µ¿±âÈ´Â ¸Å¿ì °£´ÜÇÕ´Ï´Ù. 8x8 LED·Î 8 °³ÀÇ µ¥ÀÌÅ͸¦ ¼Û½ÅÇϱâ Àü¿¡ 0x55¸¦ Ãß°¡ÇÏ¸é µË´Ï´Ù. ¾ÆµàÀ̳ë´Â 0x55°¡ Çѹø µé¾î¿À¸é, 8°³ÀÇ ¹ÙÀÌÆ®¸¦ ±â´Ù¸®°í, µé¾î¿Â µ¥ÀÌÅ͸¦ 8x8 LED¿¡ Ç¥½ÃÇÕ´Ï´Ù. ![]() PC ¿¡¼ °£´ÜÇÏ°Ô È»óÁ¡(picell)À» ÄѰí, ²ô¸é, ¹öÆÛ¿¡ ÀúÀåµÈ °Í°ú ºñ±³Çؼ, Àü¼ÛÇÏ´Â ÇÁ·Î±×·¥À» 썻½À´Ï´Ù. ¾ÆµàÀÌ³ë ¼Ò½º : LED04.pde ÇÁ·Î¼¼½Ì ¼Ò½º : LEDCtrl02.pde LED.pde Light.pde ¾ÆµàÀÌ³ë ¼Ò½º ÀÌ ¼Ò½º´Â PC¿¡¼ Åë½ÅÆ÷Æ®·Î ¼Û½ÅÇÏ´Â 8x8 ºñÆ®¸Ê À̹ÌÁö¸¦, ¾ÆµàÀÌ³ë ±âÆÇ¿¡¼ ¼ö½ÅÇÏ¿©, ¾ÆµàÀÌ³ë ±âÆÇ Ãâ·Â¿¡ ¿¬°áµÈ 8x8 LED¿¡ Ç¥½ÃÇÕ´Ï´Ù. PC´Â ȸ鿡¼ 8x8 ºñÆ®¸ÊÀ» ¸¶¿ì½º·Î º¯°æÇϸé, º¯°æµÈ ºñÆ®¸ÊÀ» 8 ¹ÙÀÌÆ®·Î ¼Û½ÅÇÕ´Ï´Ù. int CLOCK = 12; // ½ÃÇÁÆ® ·¹Áö½ºÅ͸¦ ¿¬°áÇÏ´Â 3°³ÀÇ ÇÉ int LATCH = 13; int DATA = 11; byte matrix[8]; // LED Ç¥½Ã¿ë ºñÆ®¸Ê À̹ÌÁö¸¦ 8 ¹ÙÀÌÆ® º¯¼ö¿¡ ÀúÀå byte head; // ºñÆ®¸Ê ½ÃÀÛ Äڵ带 ÀúÀåÇÏ´Â º¯¼ö int state = 0; // ÇöÀçÀÇ Ç¥½Ã»óŸ¦ ÀúÀåÇÏ´Â º¯¼ö void setup() // ±âÆÇÀÇ Áغñ(ÃʱâÈ) { pinMode(CLOCK, OUTPUT); // 3°³ÀÇ ÇÉÀ» Ãâ·ÂÀ¸·Î ¹æÇâÀüȯ pinMode(LATCH, OUTPUT); pinMode(DATA, OUTPUT); digitalWrite(CLOCK, LOW); // 3°³ÀÇ Ãâ·ÂÇÉ¿¡ LOW¸¦ Ãâ·Â digitalWrite(LATCH, LOW); digitalWrite(DATA, LOW); initLED(); clearLED(); // MAX7219¸¦ ÃʱâÈÇϰí LED¸¦ ¸ðµÎ ²ö´Ù. Serial.begin(9600); // UART Åë½Å¼Óµµ´Â 9600 BPS·Î ¼ö½Å½ÃÀÛ head = (byte) 0x55; // ¼ö½ÅÇÑ ºñÆ®¸ÊÀÇ µ¥ÀÌÅÍ °¹¼ö. void loop() // ¹«Çѹݺ¹ ÁÖÇÔ¼öÀÇ ½ÃÀÛ { if (Serial.available()>0) // ¸¸ÀÏ Åë½ÅÆ÷Æ®¿¡ ¹«¾ùÀΰ¡ µé¾î ¿Ó´Ù¸é? { int input = Serial.read(); // ¼ö½Å°ªÀ» input º¯¼ö¿¡ ÀúÀå switch (state) // »óŰª¿¡ µû¶ó ºÐ±â¸¦ ÇÑ´Ù (»óÅ´ óÀ½¿¡ 0 ÀÌ´Ù. ±â´ÉÀ» ¹Ù²Û´Ù.) { case 0: // »óŹøÈ£°¡ 0 À̸é? if (input==head) state = 1; // ¼ö½Å°ªÀÌ 0x55 ÀÎÁö È®ÀÎÇϰí, state¸¦ 1·Î ÀúÀå (»óꝰæ) break; // case ±¸¹®À» ³¡³½´Ù. (case ±¸¹® ´ÙÀ½¿¡ ¾Æ¹«°Íµµ ¾øÀ¸¸é, óÀ½ºÎÅÍ ´Ù½Ã½ÃÀÛ) case 1: case 2: case 3: case 4: case 5: case 6: case 7: // »óÅ ¹øÈ£°¡ 1~7 À̸é, ºñÆ®¸Ê º¯¼ö¿¡ ÀúÀå matrix[state-1] = (byte) input; state++; // »óŹøÈ£¸¦ +1 Çϰí ÀúÀåÇÑ´Ù. break; case 8: // »óŹøÈ£°¡ 8 À̸é, ¼ö½Å°ªÀ» ºñÆ®¸Ê¿¡ ÀúÀåÇϰí, »óŸ¦ 0À¸·Î ¸®¼Â matrix[state-1] = (byte) input; state = 0; refreshLED(); // ÀÌÁ¦ »õ·Î µé¾î¿Â ºñÆ®¸Ê 8¹ÙÀÌÆ®¸¦ LED·Î Ãâ·ÂÇÑ´Ù break; // ¿¬¼ÓºÐ±â case ±¸¹®Àº break·Î ·çÇÁ¸¦ ³ª°£´Ù. } // case ±¸¹® ´ÙÀ½¿¡ ¾Æ¹«°Íµµ ¾øÀ¸¸é, óÀ½ºÎÅÍ ´Ù½Ã½ÃÀÛ. } // Åë½ÅÆ÷Æ®¿¡ µé¾î¿Â °ªÀÌ ¾øÀ¸¸é, ¿©±â·Î ¿Â´Ù. (½ÇÇ౸¹®ÀÌ ¾ø´Ù) } // ÁÖÇÔ¼öÀÇ ³¡ (loop ±¸¹® ½ÃÀÛÀ¸·Î º¹±Í = ¹«Çѹݺ¹) void ledOut(int n) // LED·Î º¯¼ö DATAÀÇ n°³ÀÇ ºñÆ®¸¦ Ãâ·ÂÇÏ°í ½ÃÇÁÆ® Ŭ·°À» ¹ß»ý { digitalWrite(LATCH, LOW); shiftOut(DATA, CLOCK, MSBFIRST, (n>>8)); shiftOut(DATA, CLOCK, MSBFIRST, (n)); digitalWrite(LATCH, HIGH); // ½ÃÇÁÆ®ÇÑ Ç¥½Ã°ªÀ» LED·Î Ãâ·Â delay(1); // 1ms Áö¿¬ (ÁÙÀ» Ç¥½ÃÇÏ´Â ½Ã°£) digitalWrite(LATCH, LOW); // ½ÃÇÁÆ® ·¹Áö½ºÅ͸¦ ½ÃÇÁÆ® ¸ðµå·Î º¯°æ } void initLED() // MAX7219ÀÇ ÃʱâÈ Àü¿ë¸í·É { ledOut(0x0B07); ledOut(0x0A0C); ledOut(0x0900); ledOut(0x0C01); } void clearLED() // 8x8°³ÀÇ LED¸¦ ¸ðµÎ ²ö´Ù. { for (int i=0;i<8;i++) matrix[i] = 0x00; // ºñÆ®¸Ê ÀúÀ庯¼ö¸¦ ÀüºÎ 0À¸·Î ÇÑ´Ù refreshLED(); // 0À¸·Î ¸¸µç ÀúÀ庯¼ö¸¦ ½ÇÁö·Î LED¿¡ Ãâ·ÂÇÏ´Â ÇÔ¼ö¸¦ ½ÇÇà } void refreshLED() // ºñÆ®¸Ê ÀúÀ庯¼ö¸¦ LED·Î Ãâ·ÂÇÏ´Â ÇÔ¼ö { int n1, n2, n3; // Áö¿ª º¯¼ö (º¸Á¶ÇÔ¼ö ¾È¿¡¼¸¸ »ç¿ëÇÏ´Â º¯¼ö) for (int i=0;i<8;i++) // ºñÆ®¸ÊÀÌ 8°³ÀÌ´Ù. 1ÁÙ¾¿ Ç¥½ÃÇÏ´Â ÇÔ¼ö¸¦ 8¹ø ½ÇÇàÇÑ´Ù { n1 = i+1; n2 = matrix[i]; // ºñÆ®¸Ê ÀúÀ庯¼ö¿¡¼ °ªÀ» Àд´Ù. n3 = (n1<<8)+n2; ledOut(n3); // ¼±ÅÃÇÑ 1¹ÙÀÌÆ®¸¦ LED¿¡ Ãâ·ÂÇÑ´Ù. } } void updateLED(int i, int j, boolean b) // »õ·Î µé¾î¿Â ºñÆ®¸ÊÀ¸·Î Ç¥½Ã¸¦ ¹Ù²Ü ¶§ ½ÇÇàÇÏ´Â ÇÔ¼ö { int t = 1; // ºñƮ󸮸¦ À§ÇØ, óÀ½¿¡ 1·Î ÀúÀå. ºñÆ®°¹¼ö m¸¸Å Á·Π¿òÁ÷ÀδÙ. (ºñÆ® ½ÃÇÁÆ®) int n = 0; // ´õÇϰųª Áö¿ì´Â ºñÆ®ÀÇ À§Ä¡°ª, int m = 0; // Áö¿ªº¯¼ö 3°³¸¦ ¼±¾ð if (j==0) m = 7; // j°¡ 0 À̸é mÀ» 7·Î ÀúÀå else m = j-1; // j°¡ 0 ÀÌ ¾Æ´Ï¸é m¿¡´Â j-1°ªÀ» ÀúÀå n = t<<m; // t¸¦ m ºñÆ®¸¸Å Á·Π½ÃÇÁÆ®ÇÏ¿© n¿¡ ÀúÀå if (b) matrix[i] = n | matrix[i]; // B°¡ 1 À̸é, ºñÆ®¸Ê ÀúÀå º¯¼ö¿¡ nÀ» ´õÇϰí ÀúÀåÇÑ´Ù. else // B°¡ 0 À̸é, ºñÆ®¸Ê ÀúÀå º¯¼ö¿¡¼ nÀ» »©°í ÀúÀåÇÑ´Ù { n = ~n; // º¯¼ö¾ÈÀÇ Æ¯Á¤ºñÆ® nÀ» Áö¿ì·Á¸é, nÀ» µÚÁý°í ANDÇϸé nºñÆ® À§Ä¡ÀÇ °ªÀÌ Áö¿öÁø´Ù. matrix[i] = n & matrix[i]; // 0xFF¸¦ 0x01·Î µÚÁý¾î ANDÇϸé, 0xFE°¡ µÈ´Ù (0x01 À§Ä¡ÀÇ ºñÆ®°¡ Áö¿öÁø´Ù) } } PC ÇÁ·Î¼¼½Ì import processing.serial.*; LED myLed; void setup() { size(300,300); background(0); rectMode(CORNER); noStroke(); myLed = new LED(this); println(Serial.list()); } void draw() { background(0); myLed.refresh(); } void mousePressed() { myLed.trackMouse(); } void serialEvent(Serial _p) { } // LED(PApplet _p), init(), refresh(), trackMouse(), updateScreen() class LED { final int XNUM = 8; final int YNUM = 8; int w, h; int w1, h1; int xOff, yOff; Light [][] board; Serial port; PApplet parent; byte [] msg = new byte[YNUM+1]; LED(PApplet _p) { parent = _p; board = new Light[XNUM][YNUM]; w = 30; h = 30; port = new Serial(parent,"COM6",9600); msg[0] = (byte) 0x55; init(); } void init() { w1 = w+4; h1 = h+4; xOff = (width-w1*XNUM)/2; yOff = (height-h1*YNUM)/2; for (int x=0;x<XNUM;x++) { for (int y=0;y<YNUM;y++) { int tx = xOff+x*w1; int ty = yOff+y*h1; board[x][y] = new Light(tx, ty, w, h); } } updateScreen(); } void refresh() { for (int x=0;x<XNUM;x++) { for (int y=0;y<YNUM;y++) { board[x][y].show(); } } } void trackMouse() { if (mouseX<xOff || mouseX>width-xOff || mouseY<yOff || mouseY>height-yOff) { return; } int x = (mouseX-xOff)/w1; int y = (mouseY-yOff)/h1; board[x][y].toggle(); updateScreen(); } void updateScreen() { for (int j=0;j<YNUM;j++) { int result = 0; for (int i=0;i<XNUM;i++) { int x1 = 8-i; x1 %= 8; result = result*2+board[x1][j].getLight(); } msg[j+1] = (byte) result; } port.write(msg); } } // Light(int _x, int _y, int _w, int _h), show(), toggle(), getLight() class Light { boolean on; int w, h; int x, y; Light(int _x, int _y, int _w, int _h) { x = _x; y = _y; w = _w; h = _h; } void show() { if (on) fill(255,255,0); else fill(50); rect(x+2,y+2,w,h); } void toggle() { on = !on; } byte getLight() { byte state = 0x00; if (on) state = 0x01; return state; } } MAX7219´Â ¿ì¸®³ª¶ó¿¡¼ Àß ¾È¾¹´Ï´Ù, ±×·¸Áö¸¸ ½ÃÇÁÆ®Ãâ·ÂÀ» À§Çؼ ¼³¸íÇÞ½À´Ï´Ù. ÀÌ ÀڷḦ 74HC595¿¡¼ ½ÃÇèÇØ º¸°í, °á°ú¸¦ ¼öÁ¤ÇØ¾ß ÇÒ °Í °°½À´Ï´Ù. PC¿ë ÇÁ·Î¼¼½ÌÀº 64x16, 64x16 RGB-LED Àü±¤ÆÇ¿¡ À̹ÌÁö¸¦ Àü¼ÛÇÏ´Â ¼ÒÇÁÆ®¿þ¾î·Î °³Á¶Çϸé ÁÁÀ» °Í °°½À´Ï´Ù. ÇÁ·Î¼¼½Ì Á¤¸» Æí¸®ÇÕ´Ï´Ù. º°´Ù¸¥ °ËÆÄÀÏ·¯¸¦ ±¸ÀÔÇϰųª, ¼³Ä¡ÇÏÁö ¾Ê¾Æµµ °¡º±°Ô ÀÛµ¿Çϳ׿ä,,, ÀÌ ÇÁ·Î±×·¥Àº ¹«·á ¼ÒÇÁÆ®¿þ¾î·Î, ½Åü¿Í Àç»ê »óÀÇ ¾î¶² À§Çè°ú ¼ÕÇØ¸¦ º¸»óÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ ÇÁ·Î±×·¥Àº GNU ¹«·á ¼ÒÇÁÆ®¿þ¾î ¹èÆ÷±ÔÁ¤À» µû¸¨´Ï´Ù. Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA AVRTOOLS¢â |
![]() ![]() ![]() ![]() | ![]() |
![]() |
![]() |