로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2008/09/10
첨부#1 8x8led-processing.zip (2KB) (Down:1063)
Link#1 ?p=177 (Down:317)
ㆍ추천: 0  ㆍ조회: 4005   
  아듀이노 8x8 LED 프로세싱
참조 : 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™

   
윗글 아듀이노 24x6 LED 전광판
아래글 아듀이노 32x16 RGB 전광판
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 565 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 17617 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 2724 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 2829 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 5627 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 4702 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3242 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 2887 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3268 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 2870 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3129 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 7749 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 4035 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3463 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5113 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 4017 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3544 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3227 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6434 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 3897 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5431 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 7026 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 8059 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4417 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 4733 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5333 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9431 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 16793 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 6584 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5419 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 4690 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 4009 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 5908 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4524 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4545 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 4752 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5274 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 4005 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13527 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9264 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 5737 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 6595 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 4028 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3343 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3149 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 5056 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 4989 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5667 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4084 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3387 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4622 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9658 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3462 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 4901 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6286 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 4773 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 4744 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5078 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 4590 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7345 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 6421 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0