현실감각 0% :: '분류 전체보기' 카테고리의 글 목록 (5 Page)

컴퓨터 관련 2014. 11. 15. 08:52

[Arduino] HT1621 LCD Segment 아두이노와 연결하기



[Arduino] HT1621 LCD Segment 아두이노와 연결하기


네트워크로 온습도를 실시간으로 기록하는 온습도계를 만들일이 있어서 아두이노를 가지고 끄적끄적 하는데 LCD 패널도 있으면 좋겠다 싶어서 한진데이터에서 나온 TF4-8B LCD 세그먼트를 싼맛에 하나 사서 박았다... 문제는 일반 LCD패널도 아니고 7 세그먼트형식? 아무튼 이놈을 돌리는 방법을 모른다는 것이었다...

그래서 구글신에게 부탁드렸더니 답변들이 죄다 데이터시트 보고 알아서 만들라는 말들뿐... 나는 전자과 근처에는 얼씬도 못해본 컴퓨터전공인데... 데이터시트를 보고 만들기는 커녕.. 무슨뜻인지도 잘 모르는데...

아무튼 2시간동안의 계속되는 헤딩끝에 결국 구글신이 중국사이트 하나를 알려주심!!

(http://blog.sina.com.cn/s/blog_569a20780101hqoa.html)

여기가니까 내가 산 TF4-8B 모듈은 아니지만 HT1621칩을 쓰는 다른 LCD 세그먼트 구동방법이 올라와있어서 얼릉 복사해서 돌려봤는데 LCD가 안들어온다..ㅠㅠ 그래서 뭐가문제지 하고 소스를 뜯고 별짓을 다했는데 결국 아두이노에 들어가는 볼트가 3볼트 미만이라서 LCD가 정신못차리고 깨어나지 못하는것이었다...

정말 만날 어플리케이션만 개발하다가 임베디드관련된걸 하게되니 뭐가뭔지 모르겠음ㅠㅠ

아무튼 나처럼 HT1621칩을 쓰는 LCD 세그먼트를 아두이노와 연결못하는 사람들을 위해 위 소스를 살짝 고친 소스를 공개



// LCD 관련 변수

int CS =2 ;

int WR = 3;

int DATA =4 ;

int led = 5;

   

#define  ComMode    0x52

#define  RCosc      0x30

#define  LCD_on     0x06

#define  LCD_off    0x04

#define  Sys_en     0x02

#define  CTRl_cmd   0x80

#define  Data_cmd   0xa0

#define WDTDIS      0X0A

#define SYSDIS      0X00

 


int cnt = 0;

void setup() {

  Serial.begin(9600);

  while (!Serial) {;}

  pinMode(led, OUTPUT);   

  pinMode(CS,OUTPUT); 

  pinMode(WR,OUTPUT); 

  pinMode(DATA,OUTPUT);

  Init_1621() ;

  delay(2000);

}


void loop() 

{

  displays(0, 1);

  displays(2, 2);

  displays(4, 3);

  displays(6, 4);

  delay(3000);

}


void Init_1621(void)

{

  SendCmd_1621(Sys_en);

  SendCmd_1621(RCosc);

  SendCmd_1621(ComMode);

  SendCmd_1621(LCD_on);

}


void SendCmd_1621(uint8_t command)

{

  digitalWrite(CS,LOW);

  SendBit_1621(0x80,4);

  SendBit_1621(command,8);

  digitalWrite(CS,HIGH);

}

void SendBit_1621(uint8_t sdata,uint8_t cnt)

{

  uint8_t i;

  for(i=0;i<cnt;i++) {

    digitalWrite(WR,LOW);

    delay(1);

    if(sdata&0x80) digitalWrite(DATA,HIGH);

    else digitalWrite(DATA,LOW);

    delay(1);

    digitalWrite(WR,HIGH);

    delay(1);

    sdata<<=1;

  }

  delay(1);

}  


void Write_1621(uint8_t addr,uint8_t sdata)

{

  addr<<=2;

  digitalWrite(CS,LOW);

  SendBit_1621(0xa0,3);

  SendBit_1621(addr,6);

  SendBit_1621(sdata,8);

  digitalWrite(CS,HIGH);

}


void displays(int location, int displayednum)

{

  if(displayednum == 0)

  {

    Write_1621(location,0b10111110);

  }

  else if(displayednum == 1)

  {

    Write_1621(location,0b00000110);

  }

  else if(displayednum == 2)

  {

    Write_1621(location,0b01111100);

  }

  else if(displayednum == 3)

  {

    Write_1621(location,0b01011110);

  }

  else if(displayednum == 4)

  {

    Write_1621(location,0b11000110);

  }

  else if(displayednum == 5)

  {

    Write_1621(location,0b11011010);

  }

  else if(displayednum == 6)

  {

    Write_1621(location,0b11111010);

  }

  else if(displayednum == 7)

  {

    Write_1621(location,0b00001110);

  }

  else if(displayednum == 8)

  {

    Write_1621(location,0b11111110);

  }

  else if(displayednum == 9)

  {

    Write_1621(location,0b11011110);

  }

  else if(displayednum == -10)

  {

    Write_1621(location,0b10111111);

  }

    else if(displayednum == 11)

  {

    Write_1621(location,0b10111000);

  }

  else if(displayednum == 12)

  {

    Write_1621(location,0b11100110);

  }

  else if(displayednum == 13)

  {

    Write_1621(location,0b10111111);

  }

  

  else if(displayednum == -1)

  {

    Write_1621(location,0b00000111);

  }

  else if(displayednum == -2)

  {

    Write_1621(location,0b01111101);

  }

  else if(displayednum == -3)

  {

    Write_1621(location,0b01011111);

  }

  else if(displayednum == -4)

  {

    Write_1621(location,0b11000111);

  }

  else if(displayednum == -5)

  {

    Write_1621(location,0b11011011);

  }

  else if(displayednum == -6)

  {

    Write_1621(location,0b11111011);

  }

  else if(displayednum == -7)

  {

    Write_1621(location,0b00001111);

  }

  else if(displayednum == -8)

  {

    Write_1621(location,0b11111111);

  }

  else if(displayednum == -9)

  {

    Write_1621(location,0b11011111);

  }

}



원 개발자가 만든 소스에 보면 Write_1621()라는 함수가 있는데 이녀석이 바로 숫자를 출력해주는 역할을 한다.

매개변수의 맨 앞쪽은 자릿수, 두번째 0b0000...는 숫자를 구성하는 각각의 비트를 의미한다.(아래그림 참고)

예를 들어 비트가 0b11111010 으로 입력되어 있다면 (0)번째와 (2)번째 부분만 0이고 나머지는 모두 1이니 6 형태의 디지털 숫자가 출력된다.





소스에 보면 displays()라는 함수를 하나 새로 만들었는데 Write_1621함수에서 숫자를 어떻게 하면 편하게 출력할수 있을까 하다가 만든 함수로 앞의 매개변수에 자리수, 뒤에 출력하고자 하는 숫자를 쓰면 된다. 단 자릿수는 소수점 표시때문인지는 몰라도 내가 사용한 LCD는 자리수를 0, 2, 4, 6과 같이 2의 배수로 써야 제대로 동작했다. 음수도 구별하는데 이건 그냥 소수점 표기때문에 넣은것으로 없어도 무방하다.

예를들어 사진과 같이 4자리수 LCD에 1234라고 쓰고싶다면


Write_1621(0, 1);

Write_1621(2, 2);

Write_1621(4, 3);

Write_1621(6, 4);

이렇게 쓰고 실행하면 성공!!





컴퓨터 관련 2014. 9. 19. 17:37

[Android] Back버튼에 이벤트 넣기



[Android] Back버튼에 이벤트 넣기


안드로이드 앱을 하나 만들다가 사이드메뉴가 필요해서 Simple Side Drawer 라이브러리를 사용하게 되었다. 여는건 큰 어려움 없이 해결! 그런데 문제는 이녀석을 백버튼으로 닫으려는데 자꾸 프로그램이 닫힌다...ㅠㅠ 그래서 백 버튼에 이벤트를 넣어서 사이드메뉴가 열려있을 경우에는 프로그램은 그대로있고 사이드메뉴만 닫으려 하는데 도대체 백 버튼에 이벤트를 어떻게 줘야하는건지를 몰라 또 구글링..

찾아보니까 별거없다. 그냥 onBackPressed() 사용하면 된다.


// 종료버튼 처리(최근버전용)

@Override

public void onBackPressed() {

   // 여기에 코드 입력

if(mSlidingMenu.isClosed())

{

FrmMain.this.finish();

}

else

mSlidingMenu.toggleLeftDrawer();

}

// 종료버튼 처리(구버전용)

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

   if (keyCode == KeyEvent.KEYCODE_BACK) {

     // 여기에 코드 입력

    if(mSlidingMenu.isClosed())

{

    FrmMain.this.finish();

}

else

mSlidingMenu.toggleLeftDrawer();

       return true;

   }


구버전(영어로 써있어서 자세히 보진 않았지만 버전 프로요까지인듯)은 onBackPressed가 지원되지 않는지 onKeyDown에서 백버튼인지 확인해서 백버튼이면 동작하게 코딩하라고 나와있었다. 암튼 두개 다 넣고 돌렸는데 별 이상은 없었음.

사이드메뉴가 닫혔는지 열렸는지 받아온 후 닫혀있으면 액티비티를 종료하고, 열려있으면 사이드메뉴를 닫아주게 코딩하면 끗!



컴퓨터 관련 2014. 8. 18. 17:14

[MATLAB] CT와 MCT 소스코드



[MATLAB] CT(Census Transform)와 MCT(Modified Census Transform) MATLAB 소스코드


요즘 연구하는 인식 오브젝트가 별다른 특징이 없어서 왠만한 특징검출방법으로는 특징비스므리한것조차 찾아지지도 않는 문제에 봉착..ㅠ 그래서 이런저런 특징검출 방법을 사용하다가 MCT(Modified Census Transform) 소스를 구한김에 포스팅!

MCT는 주로 얼굴탐지/인식하는데 사용하는 특징이어서 여기저기 검색하면 얼굴 검출하는 방법과 함께 나오지만 여기 올린 소스는 어디까지나 그냥 MCT 특징맵만을 생성함을 미리 알려드림(-_-);


원본 소스는 여기 : https://siddhantahuja.wordpress.com/tag/matlab-code/


소스를 무상으로 공개해주신 위 블로그의 주인은 CT를 구현해놨다. CT 소스 뿐만 아니라 각종 스테레오비전 관련 소스도 있으니까 관심있으면 클릭클릭! 

CT나 MCT나 차이점은 중점으로 픽셀값을 각각 비교하느냐, 마스크의 평균값을 가지고 픽셀값을 각각 비교하느냐의 차이일뿐이므로 내가 필요한 MCT를 위해 소스를 살짝 수정해봤다.


% ************************************************************************* % Title: Function-Rank Transform of a given Image % Author: Siddhant Ahuja <=원작자 https://siddhantahuja.wordpress.com/ % Created: May 2008 % Copyright Siddhant Ahuja, 2008 % Inputs: Image (var: inputImage), Window size assuming square window (var: % windowSize) % Outputs: Rank Tranformed Image (var: rankTransformedImage), % Time taken (var: timeTaken) % Example Usage of Function: [a,b]=funcRankOneImage('Img.png', 3) % ************************************************************************* function [censusTransformedImage, timeTaken] = mct(inputImage, windowSize) % Grab the image information (metadata) using the function imfinfo try imageInfo=imfinfo(inputImage); % Since Census Transform is applied on a grayscale image, determine if the % input image is already in grayscale or color if(getfield(imageInfo,'ColorType')=='truecolor') % Read an image using imread function, convert from RGB color space to % grayscale using rgb2gray function and assign it to variable inputImage inputImage=rgb2gray(imread(inputImage)); else if(getfield(imageInfo,'ColorType')=='grayscale') % If the image is already in grayscale, then just read it. inputImage=imread(inputImage); else error('The Color Type of Input Image is not acceptable. Acceptable color types are truecolor or grayscale.'); end end catch inputImage=inputImage; end % Find the size (columns and rows) of the image and assign the rows to % variable nr, and columns to variable nc [nr,nc] = size(inputImage); % Check the size of window to see if it is an odd number. if (mod(windowSize,2)==0) error('The window size must be an odd number.'); end if (windowSize==3) bits=uint8(0); % Create an image of size nr and nc, fill it with zeros and assign % it to variable censusTransformedImage of type uint8 censusTransformedImage=uint8(zeros(nr,nc)); elseif (windowSize==5) bits=uint32(0); % Create an image of size nr and nc, fill it with zeros and assign % it to variable censusTransformedImage of type uint32 censusTransformedImage=uint32(zeros(nr,nc)); else error('The size of the window is not acceptable. Just 3x3 and 5x5 windows are acceptable.'); end % Initialize the timer to calculate the time consumed. tic; % Find out how many rows and columns are to the left/right/up/down of the % central pixel dImg = double(inputImage); C= (windowSize-1)/2; for(j=C+1:1:nc-C) % Go through all the columns in an image (minus C at the borders) for(i=C+1:1:nr-C) % Go through all the rows in an image (minus C at the borders) census = 0; % Initialize default census to 0 for (a=-C:1:C) % Within the square window, go through all the rows for (b=-C:1:C) % Within the square window, go through all the columns if (~(a==0 && b==0)) % Exclude the centre pixel from the calculation census=bitshift(census,1); %Shift the bits to the left by 1 % If the intensity of the neighboring pixel is less than % that of the central pixel, then add one to the bit % string % 이부분을 중심 픽셀이 아닌 평균과의 차로 변환하면 MCT %% CT 알고리즘(사용하려면 주석 제거하고, 아래 MCT소스는 주석치고 돌리면 됨) %if (inputImage(i+a,j+b) < inputImage(i,j)) % CT 알고리즘 % census=census+1; %end %% MCT 알고리즘 (귀찮아서 마스크사이즈 3만 구현. 다른 마스크 사이즈로 사용하려면 for문 넣어서 수정ㄱㄱ) sumv = dImg(i - 1,j - 1) + dImg(i - 1,j) + dImg(i - 1,j + 1) + dImg(i,j - 1) + dImg(i,j) + dImg(i,j + 1) + dImg(i + 1,j - 1) + dImg(i + 1,j) + dImg(i + 1,j + 1); avgv = sumv / 9.0; if (inputImage(i+a,j+b) < avgv) census=census+1; end end end end % Assign the census bit string value to the pixel in imgTemp censusTransformedImage(i,j) = census; end end % Stop the timer to calculate the time consumed. timeTaken=toc;


사용법은 저거 mct.m 파일로 저장한다음에 MATLAB에서 아래와 같이 엔터치면 끝 

inputImage = imread('kakaka.jpg'); 

windowSize = 3; %일단 3으로만 했는데 5로 하려면 MCT는 좀 바꿔야함(진작 for문으로 만들었어야 했는데...귀찮아서..) 

[censusTransformedImage, timeTaken] = mct(inputImage, windowSize);

figure, imshow(censusTransformedImage);


아래는 결과영상

원본영상


CT 영상

MCT 영상