?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

OLED 관련 질문드립니다.

페이지 정보

작성자 코다 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-01-25 12:59 조회1,898회 댓글8건

본문

안녕하세요. 스마트워치 프로젝트를 보고 저도한번 해보고싶어 진행중 OLED가 작동이 잘 안되서 질문드립니다.

구매한 OLED는 디바이스마트에서 Monochrome 0.96" 128x64 OLED graphic display 를 구매하였습니다.

1.jpg

http://www.devicemart.co.kr/1272120

기본적으로 spi통신을 지원하지만 뒤에 납땜을 통하여 i2c 모드를 지원하기에 

i2c 사용을 위해 납땜을 진행하엿습니다.

1.jpg?type=w740

 

 

 

 납땜후 다음과 같이 결선을 하엿구요

 

1.jpg?type=w740

 

그뒤 홈페이지에서 제공하는 Adafruit_SSD1306 , Adafruit_GFX 라이브러리를 추가한뒤

 

128x64 i2c 테스트 코딩을 돌리자 

 

ssd1306_128x64_i2c.ino:54:2: error: #error ("Height incorrect, please fix Adafruit_SSD1306.h!"); 라는 오류가 발생하여

#define SSD1306_LCDHEIGHT 64 라고 하자 업로드가 되엇습니다.

그뒤엔 로고가 짤리고 시작합니다.

1.jpg?type=w740

 

약 1/4 밖에 보이지 않는상태이구요

i2c모드에서 spi 모드로 전환뒤에도 로고가 1/4짤리고잇습니다;;;;;

또한 spi모드에서는 u8glib가 동작을 잘 하며 위와 같이 짤리는 현상은 전혀없지만

i2c 모드에서는 u8glib가 전혀 동작을 안하고 있습니다;

 

사정상 spi모드보다는 i2c 모드를 사용하고싶은데요; ( 다른센서를 스마트워치에 추가하려는데 spi통신을 사용합니다; 센서와 디스플레이 둘다 spi 사용시 cs핀으로 조절이 가능하지만 둘다 동시에 사용이 불가하여 많이 번거로우므로 디스플레이를 i2c로 사용하고싶습니다)

ssd1306라이브러리라도 제대로 동작한다면 i2c 모드로 사용하고싶은데; 

헤더파일이 잘못된건지 처음시작 로고도 짤리며, display 함수를 이용하여 "a"라는 문자를 각 모서리 마다 출력하여보니

display.setCursor(121,.25); 할시

1.jpg?type=w740

이렇게 5시방향 구석에 출력되게 됩니다;

SSD1306 라이브러리 이용시 해상도 128x64로 동작을 안하고 잇습니다;;

 

혹시 아시는게 잇으시다면 답변부탁드립니다 

 

감사합니다

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

이미지가 안보이네요;; 이미지 다시 확인해주세요.
Adafruit OLED를 보니... I2C로 쓰려면 2개의 점퍼를 납땜해줘야 하네요.(SJ1, SJ2) 그리고 아래처럼 연결해줘야 한다고 합니다.

참고 : https://learn.adafruit.com/monochrome-oled-breakouts/wiring-1-dot-3-128x64

GND ==> ground
Vin ==> 5V
Data ==> I2C SDA (on the Uno, this is A4 on the Mega it is 20 and on the Leonardo digital 2)
Clk ==> I2C SCL (on the Uno, this is A5 on the Mega it is 21 and on the Leonardo digital 3)
RST ==> digital 4 (you can change this pin in the code, later)

이 모듈은 Reset 핀도 사용하네요. Reset 핀을 아두이노에 연결해주고(D4 핀) 해당 핀 넘버를 소스에도 적어줘야 합니다. Adafruit 라이브러리 예제코드를 보시면 Reset 핀 넘버 지정하는 코드가 있을거에요. D4 혹은 연결하신 핀 넘버로 변경해주고 테스트 해보세요.
u8glib의 경우도 Reset 핀 넘버를 입력가능한 초기화 코드를 사용해야 할 것 같네요. 아니면 해당 Reset 핀을 수동으로 컨트롤 해줘야 할 것 같습니다.

코다님의 댓글

코다 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

답변감사합니다.
이미지가 저한테는 보이는데 다른분들께는 안보이나보네요 ;;
위의 사진 2개는 올려주신 참고 사이트주소에서 캡쳐해서 그대로 옮긴거구요

핀은 말씀하신대로 GND, VDD ,SDA, SCL 그리고 RST 도 4번핀에 따로 연결을 해주엇습니다.

라이브러리 예제코드에서도 Reset핀 넘버를 4번으로 지정해주고 테스트해주엇습니다.
#define OLED_RESET 4

그뒤에 테스트 해본사진은 글 수정으로 첨부파일로 업로드 해두겟습니다
확인부탁드립니다.

또 u8glib경우 reset핀넘버를 입력가능한 초기화 코드를 제공하지 않던거같더라구요 제가 SSD1306 128x64 I2C 용 초기화 코드 제공하는걸 모두 돌려보앗는데 작동하질않고잇습니다;
수동으로 컨트롤은 어떤식으로해야할가요?

코다님의 댓글

코다 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

첨부파일로 업로드하니 제일꼭대기에 사진이 올라가네요;;;

첫번째 사진은 SSD1306 라이브러리 사용시 SPI ,I2C 모두 처음 로고가 저렇게 1/4만 출력 되구요
두번째 사진은 SSD1306 라이브러리를 이용하여 display.setCursor(121,.25); 로 a 하나만 출력시 저렇게 나오네요;

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

u8glib 수동 컨트롤은 Adafruit 라이브러리를 참고해야 할 것 같아요. Adafruit 라이브러리에서 Reset 핀을 언제 HIGH/LOW 상태로 바꾸는지 확인해봐야할것 같아요. 디스플레이 초기화 하기 전에 Reset을 한번 할 것 같은데...
잘못 표시된 이미지를 보니 원래 이미지가 2배로 확대되어서 표시되는것 같네요.. 라이브러리의 디스플레이 사이즈 설정이 잘못된거 아닌가 싶기도 하고.. 정확한 건 아닙니다;;; 라이브러리를 최신으로 다시 다운로드 받아 사용해보시는 건 어떨까 싶어요.

코다님의 댓글

코다 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

답변해주신걸 토대로 adafruit_ssd1306 라이브러리 이용하여 oled 사용시 라이브러리내 define이 잘못되어잇어서 2배확대 되어 잇는것을 토대로 define 수정후 잘 나오고 잇습니다 . 감사합니다!

u8glib 또한 i2c 통신시 어드레스 디폴트 값이 0x3c로 되어잇는데 제 oled는 0x3d로 되어잇어서 수정하엿고 , 리셋핀은 setup 함수내에 pinMode( pin , OUTPUT); , digitalWrite( pin , LOW) , delay(1); , digitalWrite(pin , HIGH);로 선언해주니 예제가 다 잘돌아가고잇습니다
감사합니다

코다님의 댓글

코다 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

이걸 토대로 제가 사용중인 심박센서의 심박수 값을 OLED에 디스플레이 하고자하는데

심박센서 센서값을 읽을시에 ms 마다 인터럽트를 걸어주어야 작동을 하게되는데;
adafruit_ssd1306라이브러리를 이용하여 bpm을 출력해주려하니 display.setCursor(0,0);  display.print("BPM:"); 이라고 사용시 delay를 주지않으면 함수가 루프문내에서 계속 돌다보니 화면이 계속 번쩍 거리는 현상이 나타나내요;
화면이 번쩍거리는 현상을 막고자 delay를 넣어주면 심박센서의 샘플링에 영향을 주어 쓸수가 없는데;; 번쩍거리는 현상을 없앨수 잇는 방법이없을가요?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

delay() 함수를 이용하면 아두이노가 다른 작업을 못하고 멈춰서 그렇습니다.
millis() 함수를 이용하면 현재 시간(아두이노 시작후 경과한 milli-second 단위 시간)을 알 수 있는데.. loop() 함수 반복할 때마다 현재 시간이 얼마나 결과했는지 체크해서 일정 시간 간격으로 작업이 수행되도록 할 수 있습니다. 아래 링크 내용을 참고하세요.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_begin&wr_id=18

코다님의 댓글

코다 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

그렇군요. 보드간 연결 처리가 불편하실수도 있겠네요. 32bit 보드로 업글하시는 것도... 아무튼 프로젝트 잘 진행하시길!!