아래 내용은 도트매트리스와 8개의 저항을 이용하여 16개의 핀을 아두이노와 연결하여

문자를 흐르는 표현을 구성한 것이다.

조금 더 편하게 5개의 핀으로 구성하려면 아래링크의 모듈 추천!!

https://www.icbanq.com/P014162738 

 

도트 매트릭스를 이용하여 문자가 흐르는 표현 하기

gitgub에서 라이브러리 검색 FrequencyTimer2

FrequencyTimer2 라이브러리는  루키와 paulstoffregen 중

paulstoffregen을 사용

https://github.com/PaulStoffregen/FrequencyTimer2

매트릭스는

공통 애노드 공통 캐소드 형에 따라

스케치 소스 중 일부를 HIGH와 LOW를 변형해야 함.

 

  • 원형 숫자는 매트릭스 핀번호임.

  • 매트릭스 뒷면 핀 번호 순서

  • 아두이노와 매트릭스 연결

#include <FrequencyTimer2.h>

#define SPACE { \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0} \
 }
 #define H { \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 1, 1, 1, 1, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0} \
 }
 #define E { \
 {0, 1, 1, 1, 1, 1, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 1, 1, 1, 1, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 1, 1, 1, 1, 1, 0} \
 }
 #define L { \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 1, 1, 1, 1, 1, 1, 0} \
 }
 #define O { \
 {0, 0, 0, 1, 1, 0, 0, 0}, \
 {0, 0, 1, 0, 0, 1, 0, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 1, 0, 0, 0, 0, 1, 0}, \
 {0, 0, 1, 0, 0, 1, 0, 0}, \
 {0, 0, 0, 1, 1, 0, 0, 0} \
}


/// 미리 문자를 만들어 놓고


byte col = 0;
 byte leds[8][8];
 
 // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy
 int pins[17]= {-1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 };     //  매트릭스의 핀번호 1~16 번까지 연결되는 아두이노 핀을  순서대로 
                                                                   // 맨 앞 -1은 임의용
 // col[xx] of leds = pin yy on led matrix
 int cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[06], pins[11], pins[15], pins[16] };
 
 // row[xx] of leds = pin yy on led matrix
 int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5] };

const int numPatterns = 6;        // 글자수를 늘리려면 그수만큼 넘버패턴 수 지정
byte patterns[numPatterns][8][8] = { 
  H,E,L,L,O,SPACE                // 도트메트릭스에 지나갈 문자 넣기
};
 
 int pattern = 0;
 
 void setup() {
   // sets the pins as output
   for (int i = 1; i <= 16; i++) {
     pinMode(pins[i], OUTPUT);
   }
 
   // set up cols and rows
   for (int i = 1; i <= 8; i++) {
     digitalWrite(cols[i - 1], LOW);
   }
 
   for (int i = 1; i <= 8; i++) {
     digitalWrite(rows[i - 1], LOW);
   }
 
   clearLeds();
 
   // Turn off toggling of pin 11
   FrequencyTimer2::disable();
   // Set refresh rate (interrupt timeout period)
   FrequencyTimer2::setPeriod(2000);
   // Set interrupt routine to be called
   FrequencyTimer2::setOnOverflow(display);
 
   setPattern(pattern);
 }
 
 void loop() {
    pattern = ++pattern % numPatterns;
    slidePattern(pattern, 80);       // 80은 속도
}




void clearLeds() {
   // Clear display array
   for (int i = 0; i < 8; i++) {
     for (int j = 0; j < 8; j++) {
       leds[i][j] = 0;
     }
   }
 }
 void setPattern(int pattern) {
   for (int i = 0; i < 8; i++) {
     for (int j = 0; j < 8; j++) {
       leds[i][j] = patterns[pattern][i][j];
     }
   }
 }
 void slidePattern(int pattern, int del) {
   for (int l = 0; l < 8; l++) {
     for (int i = 0; i < 7; i++) {
       for (int j = 0; j < 8; j++) {
         leds[j][i] = leds[j][i+1];
       }
     }
     for (int j = 0; j < 8; j++) {
       leds[j][7] = patterns[pattern][j][0 + l];
     }
     delay(del);
   }
 }
 // Interrupt routine
 void display() {
   digitalWrite(cols[col], HIGH);  // Turn whole previous column off==>다이오드 타입에 따라 LOW(cathode일떄)
   col++;
   if (col == 8) {
     col = 0;
   }
   for (int row = 0; row < 8; row++) {
     if (leds[col][7 - row] == 1) {
       digitalWrite(rows[row], HIGH);  // Turn on this led ==>다이오드 타입에 따라 LOW
     }
     else {
       digitalWrite(rows[row], LOW); // Turn off this led ==>다이오드 타입에 따라 HIGH
     }
   }
   digitalWrite(cols[col],LOW); // Turn whole column on at once (for equal lighting times) ==>다이오드 타입에 따라 HIGH
}

작동 영상

https://youtube.com/shorts/l02p5KTeGF8

 

도트매트릭스(dot matrix) 제어 2

이전글 도트매트릭스(dot matrix) 제어 1: http://eskelt.tistory.com/30

도트매트릭스의 제어를 통해

센서의 입력을 받아 도트매트릭스에 표현해보자

도트매트릭스에 얼굴을 표현하고 마치 말하는 것같은 모습을...

즉 sound센서의 입력을 받아

센서값에 따른 얼굴모양이 바뀌도록하여

입을 움직이는 것 처럼 표현해보자.

기본적인 작동은 이전글을 참고하자.

일단 여러가지 얼굴모양을 만들어 배열하고

간단한 수식으로 센서값에 따라 얼굴모양을 선택할 수 있도록 한다.

스케치 소스

-----------------------------------------------------------------------------

/* 말하는 매트릭스*/

int clock = 2;  //74HC595의 클럭핀과 연결

int latch = 3;  //74HC595의 래치핀과 연결

int data = 4;  //74HC595의 데이터핀과 연결

int a;

int dataval[6][8]={

  {0x66,0x99,0x00,0x00,0x00,0x00,0x00,0x00},

  {0x66,0x99,0x00,0x00,0x18,0x00,0x00,0x00},

  {0x66,0x99,0x00,0x00,0x3c,0x24,0x18,0x00},

  {0x66,0x99,0x00,0x00,0x7e,0x42,0x3c,0x00},

  {0x66,0x99,0x00,0x00,0x3c,0x24,0x24,0x18},

  {0x66,0x99,0x00,0x00,0x7e,0x42,0x42,0x3c}};    //6개의 입모양이 다른 얼굴 

int scanval[8] ={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

void setup(){

  pinMode(clock, OUTPUT);

  pinMode(latch, OUTPUT);

  pinMode(data, OUTPUT);

  Serial.begin(9600);

}

void loop(){

  a = analogRead(A0)/150;   // 사운드 센서의 입력을 받아 값을 6단계로 표현하도록 계산

  if(a>5){a=5;}                    // 총 6개의 모습이므로 5를 넘지 않도록 함.

  for(int i=0; i<8; i++){

    digitalWrite(latch, LOW);   //래치를 내리고

    shiftOut(data,clock,LSBFIRST, scanval[i]);

    shiftOut(data,clock,LSBFIRST, dataval[a][i]);         // 센서에서 계산된 a값을 통해 입모양 선택

    digitalWrite(latch, HIGH);   //래치를 올린다. 74HC595에서 데이터를  출력함

    delay(2);

    }

digitalWrite(latch, LOW);  

shiftOut(data,clock,MSBFIRST, 0x00); // 매트릭스를 끄는 시간을 줌

shiftOut(data,clock,MSBFIRST, 0x00);

digitalWrite(latch, HIGH);

delay(3);

}

----------------------------------------------------------------------------------

작동영상

 

 

참조 : http://cafe.naver.com/arduinostory/6869  (카페 : 아두이노 스토리)

'아두이노_프로세싱 > 아두이노' 카테고리의 다른 글

xbee 통신 + 기울기센서로 모터제어  (3) 2012.08.29
아두이노 포토인터럽터  (0) 2012.08.24
도트매트릭스(dot matrix) 제어 1  (3) 2012.06.27
아두이노간 xbee통신  (4) 2012.06.27
xbee 통신  (0) 2012.06.27

+ Recent posts