Embedded System/AVR 13

[AVR] 캐릭터 LCD (CLCD, LMC1623A) 소스코드

이미 AVR LCD관련 글을 올렸지만(http://embejied.tistory.com/15) 이후 작성하는 글에서 올리는 소스에는 따로 헤더파일로 만들어서 "lcd.h"를 사용했는데 생각보다 요걸 물어보는 사람이 상당수 있었다... 사실 내용은 별거 없는뎈ㅋㅋ 그냥 메인에 있던 함수들을 헤더파일로 빼주고 매크로상수 몇개 넣어줬다... 그래도 혹시나 하는 마음에 정리해서 간단한 설명과 예제소스를 올려본다. 일단 헤더파일이다. #ifndef LCD_H_ #define LCD_H_ #define F_CPU 16000000UL #include #include #define RS 7 // RRL BOARD #define RW 6 #define E 5 #define DATABUS PORTC #define CTRL..

Embedded System/AVR 2017.04.02

[AVR] 적외선 통신(IR) - 2. 구현(코딩)

이론에 대해서 알아보았으면 실제로 어떻게 구현하는지 보자. 먼저 변조를 하고 프로토콜(너무 거창한가...?)을 정해야하는데 적외선통신에서 일반적으로 사용하는 변조방식은 다음과 같다. ▶ Bi-Phase ▶ ASK or OOK (Amplitude Shift Keying or On-Off Keying) ▶ PDM or PWM(Pulse Duration or Width Modulation) 먼저 Bi-Phase 방식은 한 비트를 반으로 쪼개서 상승엣지면 "1", 하강엣지면 "0"을 의미한다. 두 번째로 ASK 혹은 OOK방식인데 가장 단순한 진폭변조방식이다. high인 시간은 같고 low인 시간을 달리하여 "0"과 "1"을 구별한다. 세 번째로 PDM 혹은 PWM방식인데 high인 시간을 달리하여 "0"과 "..

Embedded System/AVR 2017.04.02

[AVR] 적외선 통신(IR) - 1. 이론

무선통신은 블루투스밖에 해보지 않아서 적외선통신을 시도해 보았다. 요즘 블로그에 업데이트를 안하다 보니 올려야 할 자료들이 무지하게 많다. 이놈의 귀차니즘... 어쨌든 적외선통신에 간략히 설명하자면 다음과 같다. ◎ 적외선(IR : Infrared Ray) 가시광선에서 적색 바깥쪽(파장 750nm~1000um)의 영역에 위치한 광선 적외선 영역중에서도 근적외선, 중간적외선, 원적외석으로 나뉘는데 우리가 보통 라인트레이서나 리모컨등에 사용되는 적외선은 근적외선 영역을 사용한다. 이유는 모른다. 디바이스마트 같은곳에서 파는 적외선 센서는 대개 근적외선을 사용한다. ◎ 전송특성 ▶장점 - 빛을 매체로 사용하기 때문에 전파규제가 없다. - 전파에 비해 넓은 대역폭을 쉽게 획득할 수 있다. ▶단점 - 통신거리가 ..

Embedded System/AVR 2017.04.02

[AVR] 다중 ADC 사용시 주의점!

드디어 알아냈다. 왜인지는 모르겠는데 ADC 여러개 사용할 때 ADMUX랑 ADCSRA 레지스터 설정하고 조금의 딜레이를 주어야한다!!! 안그러면 채널이 바뀌기 전에 변환해버려서 데이터 밀림현상이 나타난다. 예를 들어서 이라는 소스에서는 ADC값이 저장되는 배열에서 데이터의 순서가 한칸씩 밀리게 된다. 8번째 ADC값이 배열의 첫 번째로 들어가버리고 한칸씩 당겨져서 저장이 되었다. 실제로 텀프로젝트 때문에 ADC사용할 일이 있어서 값을 확인했더니 x값, mic값, PSD값 순서대로 출력되어야 하는데 아래 사진처럼 PSD값, x값, mic값 순서대로 출력되었다ㅜㅜ 이러한 문제를 해결하기 위해 다음과 같이 GET_ADC함수안에서 변환완료 플래그를 확인하기 전에 약 100us정도의 딜레이를 넣어주면 된다. 이..

Embedded System/AVR 2017.04.02

[AVR] Atmel studio 6 sprintf함수 사용하기

Atmel Studio 6 환경에서 sprintf 함수를 사용하면 LCD에 문자열을 쉽게 표시할 수 있다. 정수를 표현하고 싶다면 그냥 string.h 을 추가하여 그냥 사용해도 되지만 실수형도 표시하고 싶으면 약간의 설정이 필요하다. 프로젝트를 켜고 Alt + F7 키를 눌러서 프로젝트 설정창으로 이동한다. 그리고 왼쪽 AVR/GNU Linker의 Libraries를 눌러 아래 그림과 같이 설정해준다. 추가버튼을 눌러서 아래 그림처럼 libprintf_flt 라고 적어주고 OK를 눌러준다. 그리고 General로 이동하여 아래 그림에서 빨간 밑줄들을 체크해준다. 그리고 저장하면 사용준비 완료다~! 간단하게 테스트 해보았다. DC모터 엔코더 값을 출력해 보았다. 먼저 char arr[16]을 선언해주고 ..

Embedded System/AVR 2017.04.02

[AVR] I2C(TWI) 통신

I2C(Inter-Intergrated Circuit) 통신은 필립스에서 개발한 직렬 컴퓨터 버스이며 저속의 주변 기기를 연결하기 위해 사용된다. Atmel에서는 TWI(Two-Wire Serial Interface)라고 하는데 통신에 필요한 선이 겨우 2개만 있으면 되기 때문이다. 처음에 I2C 통신을 공부하기 전에는 서로 뭔가 다른게 있을 줄 알았는데 알아보니까 완전히 같은거라고 한단다. -_-; 사람 헷갈리게시리... AVR에서는 I2C통신으로 128개의 서로 다른 디바이스와 통신할 수 있다고 나온다. 이는 디바이스의 주소가 7bit이기 때문이란다. 기본적인 구조는 다음과 같다. 위 그림에서 보이듯 SDA라는 Data Bus와 SCL이라는 Clock Bus로 디바이스가 연결된다. Bus에 연결된 모..

Embedded System/AVR 2017.04.02

[AVR] ISP 커넥터(6핀, 10핀)

여러 AVR 모듈을 쓰다 보면 종종 ISP 커넥터가 안 맞는 경우가 있다. 10핀 배열이 많이 쓰이지만 6핀 배열도 은근히 많이 보인다. 그럴때 변환 커넥터를 만들어 줘야 하는데 매번 자료 찾는게 짜증나서 블로그에 올려버린다. 한번 보고나면 그걸로 끝내서 자료를 정리해놓지 않았는데 이번에 정리해놔야지... 핀 배열도 간간히 쓰일때가 있으므로 여기에 올린다.

Embedded System/AVR 2017.04.02

[AVR] SPI 통신

SPI(Serial Peripheral Interface)는 직렬 주변기기 인터페이스다. CPU와 다수의 CPU들 또는 CPU와 다수의 주변장치들 사이에 고속으로 데이터를 동기 전송하는데 사용되는 직렬 통신 방법 중에 하나이다. 장치들은 마스터 슬레이브 모드로 통신하며 여러 슬레이브 장치들은 개별 슬레이브 셀렉트(SS or Chip Select(CS)) 라인과 함께 동작할 수 있다. [그림 1] 싱글 마스터와 싱글 슬레이브 SPI 통신은 4가지 논리신호를 지정한다. ◎ SCLK(Serial Clock) : 직렬클럭 ◎ MOSI(Mater Output Slave Input) : 마스터 출력, 슬레이브 입력 ◎ MISO(Mater Input Slave Output) : 마스터 입력, 슬레이브 출력 ◎ SS(..

Embedded System/AVR 2017.04.02

[AVR] 모터드라이버 변경!!(V6 엔진 장착)

이전 글에서 만들었던 모터드라이버는 MOSFET을 이용한 모터드라이버였다. 하지만 전류가 조금 딸리는 면이 있는것 같아서 회로를 바꾸어 보았다. 기존에 MOSFET으로 할때 모터가 생각보다 빨리 돌지 않고 토크가 약해서 장애물을 만나면 멈추어 버렸다. 전압을 높이면 될거 같았지만 근본적인 해결방법을 찾기위해 예전에 가지고 놀던 깡통RC를 뜯어보았다. 분명 깡통RC는 전압을 3V(1.5건전지 2개) 밖에 사용하지 않는데 모터가 미친듯이 잘 돌아갔다. PCB를 잘 보면 전부 BJT 밖에 없었다. 그래서 나도 BJT로 만들기로 결심하고 아래회로를 따라 만들었다. 참고로 저항값은 내가 끼워맞춘 값이다. 사용부품은 A1015 2개, C1815 2개, 2N3904 2개 1K, 47옴 저항 2개씩... 그냥 PNP ..

Embedded System/AVR 2017.04.02

[AVR] 소형 모터드라이버 만들기

AVR의 출력포트를 이용하여 모터를 제어하는것은 무리였다. 전압은 문제가 없는데 전류가 문제다. 핀 하나당 뽑아줄 수 있는 전류가 제한되어있으니 말이다. 15mA였나? 기억이 잘 안난다. 모터 돌려주려면 적어도 100mA정도는 필요하지 않을까? 어쨌든 사람들이 비싼돈 주고 모터드라이버를 이용하는데는 다 이유가 있다. 모터드라이버를 검색하다가 LB1630 이라는 소형 모터드라이버를 알게되었다. 서면에 협신전자(ic114.com)싸이트를 검색해보니 1200원인데 재고가 없었다. 디바이스마트(devicemart.co.kr)에 검색해 보니 무려 2200원 이었다... 거기에 배송비까지 합치면 ㅎㄷㄷ.... 그래서 그냥 만들어 보기로 했다. 필요한 준비물은 N-Channel MOSFET 4개, 선, 지네발 등....

Embedded System/AVR 2017.04.02