728x90
반응형

제품을 설계하다 보면 전압의 변동이나 혹은 Battery의 사용시간을 검토해야 합니다. 이런 일들을 진행하기 위해서는 꾸준히 전압을 측정해야 하기에 오늘은 아두이노(ARDUINO)의 ADC Pin을 이용하여 5Channel의 전압을 측정하는 법을 진행 하겠습니다.

 

Arduino UNO ADC Pin Map

 

▲Arduino uno ADC PIN

아두이노 우노(Arduino UNO)같은 경우는 총 6개의 ADC Pin을 가지고 있습니다. 즉, 6개의 아날로그 신호를 읽을 수 있다는 애기죠 이를 이용하기 위해서 Firmware작업을 진행합니다.

 

Arduino 전압측정 Firmaware작업
▲ADC 전압측정 Setup

 

각 채널을 정수로 선언 -> ADC값을 선언 -> ADC를 전압으로 표현하기 위해 Float를 이용해 실수로 선언 -> ADC0 ~ 4번까지 사용설정 ->Searial통신 시작시 TEST Start를 뿌려주고 진행

 

▲ 전압측정 값 Serial로 날려줌

각 ADC채널로 읽어 드린 값을 Value1 ~5번이라고 표현 -> Value 1~5번은 ADC가 10BIT이기에 2^10=1024 값 으로 나눠 준다.(0.034는 그냥 제가 넣은 보정 값 입니다.) -> 계산된 출력 Vout 1~5번을 시리얼 통신을 통해서 출력한다.

 

Firmware작업은 비교작 아주 간단 합니다. 어떠한 조건문도 필요 없죠 단순히 측정만 하면 되기 때문입니다. 제대로 동작되는 것을 확인하기 위해서 아래와 같이 작업을 진행합니다.

 

전압측정 H/W작업
▲ 전압측정 H/W작업

5개의 2.3V Battery를 측정해서 전압을 확인 해보겠습니다.

 

▲ 측정 간격을 1초로 진횅

 

측정 간격을 1초로 진행하니 5개의 각 data가 잘나오는 것을 확인했습니다. 단점이 있다면 Arduino에서 지원하는 시리얼 모니터를 통해서 진행할 경우 data가 3만~3만5천줄이 넘어가면 초기 DATA가 지워지는 현상이 보이네요 이 부분은 향후 다른 개선법을 찾아봐야 겠습니다.

반응형
728x90
반응형

[아두이노]를 이용하여 온도 값을 0.91인치 OLED에 Display하는 작업을 진행합니다.

 

▲ MLX90614측정 값 OLED에 Display된 이미지

위 작업은 최종적으로 작업이 끝난 사진입니다. 아래 부터는 온도를 OLED에 Display하는 작업내용 입니다.

 

1-1. MLX90614 - I2C

Melexis업체에서 개발한 MLX90614입니다. 온도측정 용도로 사용되며 Measurement Resolution은 0.02°C입니다.

0.02°C면 의료용으로도 사용할 수 있을것으로 보입니다. 아마, 체온에 가까운 온도범위는 정확도가 높고 고온에서 범위는 정확도가 낮을 것으로 보입니다.

 

▲MLX90614제품 구성도

SCL,SDA를 이용한 I2C통신 방식이며, VDD와 VSS사이에 0.1uF와 I2C풀업저항 4.7K옴이 각각 달려있으니 외부에 따로 작업할 필요는 없습니다. 만약 단품으로 구입하신다면 외부에 회로를 따로 작업해주셔야 합니다. 

 

1-2. 0.91Inch OLED Module 128X32 - I2C

▲ 0.91inch OLED Module 128x32

0.91inch OLED Module이미지 입니다. 저는 2가지 Type중 저는 BLUE Type제품을 구매 하였습니다.

이 제품도 MLX90614와 마찬가지로 제품에 I2C라인 회로가 포함되어 있어 별도의 회로는 구성하지 않아도 됩니다.

 

(ARDUINO UNO)에 대한 설명은 많기 때문에 제외하겠습니다.

 

▲ Connection 구성도

 

Connection구성도는 I2C Line 풀업저항이 제품 내부에 있기에 비교적 간단합니다.

 

▲ Arduino UNO I2C Pin MAP

 

Arduino UNO Pin MAP은 위 이미지와 같이 A4는 SDA, A5는 SCL로 정의되어 있습니다.

MLX90614, OLED제품 VCC,GND(VSS),SDA,SCL을 Arduino UNO Board에 묶어주면 Connection은 끝입니다.

 

MLX90614와 OLED를 사용하기 위해서는 2가지의 라이브러리를 설치해줘야 합니다.

▲ 라이브러리 설치 작업

 

Arduino IDE를 실행시키고 Tool -> 라이브러리 관리를 실행 시킵니다.

 

▲ Adafruit_MLX90614 라이브러리 설치

먼저, 적외선 Sensor인 Adafruit_MLX90614라이브러리를 설치합니다.

 

▲ Adafruit SSD1306 라이브러리 설치

 

그 다음 작업으로 OLED 라이브러리  Adafruit SSD1306을 설치합니다. 저는 2개다 설치되어 있기에 옆에 초록색으로 INSTALLED라고 되어 있습니다.

 

▲ 최종 F/W 

 

설치한 라이브러리들을 불러온 후 F/W를 간단하게 필요한기능 만가져다가 사용했습니다. Error부분은 없어도 됩니다. 주석은 달았으니 필요하신분은 참고하여 수정하시면 되며, 추가적으로 궁금한 부분이 있을 것 같아서 소스에 대한 설명을 조금 추가합니다.

 

▲ Adafruit_MLX90614.CPP파일

다운받으신 Adafruit_MLX90614 라이브러리에 들어가시면 Adafruit_MLX90614.CPP, Adafruit_MLX90614.h파일이 있습니다.헤더파일은 정의된 내용이고 온도에 계산식을 보고싶은 분들은 .CPP파일이 있습니다. 여기서 Value가 TOBJ1과 TA가 있습니다.

 

 MLX90614제품에는 이 2가지가 측정이 가능한데 TOBJ1은 실제 측정 온도이고 TA는 외부온도 입니다.

위 이미지는 외부온도에 따라서 오차율이 다르다는 것을 나타낸 이미지 입니다.

 

제가 위에 작성안 소스도 TOBJ1만 사용한 이유가 그때문입니다. 외부온도 까지 확인하면서 외부온도에 따른 보상해주는 계산식을 넣을 만큼 중요한 작업을 진행하는게 아니기 때문입니다. DATASHEET와 다운받은 소스파일을 보시면 이외에도 많은 수식적 용어가 들어가있으니 필요하신분은 확인하고 응용하시면 됩니다.

 

▲ MLX90614 OLED 온도 측정 동작 영상

 

동작 검토 결과 종이컵 물에 온도 손에 온도를 측정한 영상입니다. 실제로 이마 쪽을 측정하면 대략 36~36.58정도 나옵니다. 아무래도 이마쪽에 측두동맥이 있어서 정확이 되는 것 같습니다.

 

적외선 온도측정에 원리에 대해서 자세히 알고싶은 분들은 아래 링크를 참고하시길 바랍니다.

https://partlist.tistory.com/34?category=1072841

반응형
728x90
반응형

1. 아두이노 우노 I/O 핀 출력 전류

▲출처 : The Enginnering Project

 

Arduino Uno Board에 사용되는 ATmega328p에 대한 PIN Mapping입니다. 즉, 아두이노의 I/O Port관련된 출력 전류나 허용할 수 있는 전압 혹은 전류는 ATmega328p DataSheet에서 확인하실 수 있습니다.

 

▲ ATmega328p I/O PIN Cuurent

 

ATmega328p에 I/O Port 전류는 40mA입니다. 이 말은 아두이노 I/O출력 또한 40mA임을 뜻합니다. 그래서, 이번자료에는 I/O Port를 이용해서 40mA이상의 제품을 구동시킬 방법을 다루고자 합니다.

 

2. 사용 소스 코드

사양할 소스코드는 매우 간단합니다. 기존에 사용하시는 코딩이 있으시고 전류만 높게 사용하실 분들은 기존 코드에서 회로만 약간 수정하시면 됩니다.

▲스위치 입력을 받아 출력

 

코드는 7번스위치 입력을 받아 12pin으로 출력하는 소스입니다.

 

3. I/O Port 40mA사용시 구성도

▲ 아두이노 일반 I/O Port 사용시 구성도

 

I/O Port 40mA사용시 구성도 입니다.별도로 외부전원 없이 Pin에서 다이렉트로 신호를 뽑아서 사용 하시면 되나, 그 이상의 전류가 필요한 제품은 동작하지 않습니다.

 

 

▲전류 부족으로 인한 제품 동작X

 

위 동영상은 40mA 이상의 전류가 필요한 펜을 2개로 연결 하였습니다. 전류가 부족하여 멈칫거리나 동작은하지 않습니다.

 

4. I/O Port 100mA~450mA사용시 구성도

▲ TR을 이용하여 USB전원의 전류를 사용

100mA~450mA정도는 USB전원을 트랜지스터 컬렉터(C)로 받고, 베이스(B)쪽에 아두이노 출력 포트를 넣어주는 방법입니다.(USB PORT규격 및 컴퓨터 마다 정격 및 기준이 다르기에 100~450mA라고 표시함)

 

저는 C3203이라는 제품을 사용했습니다. 위 사진은 C3203 Pin Map입니다. 꼭, C3203이 아니더라도 NPN 트랜지스터를 사용하시면 되니 쉽게 구할 수있는 부품입니다.(단, 부품 품번마다 PIN MAP이 다르니 DATASHEET를 숙지하시고 사용하세요)

 

▲TR(NPN트랜지스터)를 이용한 모터3개 구동

트랜지스터를 이용하여 외부전원없이 모터 3개를 구동했습니다. 대략적으로 전류는 200mA정도 됩니다.

 

5. I/O Port 450mA이상 사용시 구성도

▲ 외부 전원을 이용한 방법 2가지

 

마지막 방법으로는 외부전원과 트랜지스터를 이용하는 방법입니다. 4번과 같은 상태에서 USB전원이아닌 외부 아답터나, 1.5V건전지 3개를 이용하는 방법으로 그 전원의 용량 (EX) 5V 3A면 3A만큼의 제품을 구동가능)으로 구동하게 되는 것입니다.

 

 즉 위처럼 몇개의 제품을 연결하 더라도 외부전원 용량 만큼 사양하게 되는 것입니다. 하지만, 여기서 주의하셔 야할 점은 에미타(E)부분에 저항을 달아서 전류 보호를 해주어야 합니다.

 

6. 온도센서를 이용한 회로도 첨부

▲ 온도센서를 이용한 회로도 첨부

 

7. 4번 방식을 이용한 온도센서 첨부 구성도

 

▲온도센서 포함 구성도

 

반응형
728x90
반응형

기존에 자료에서 추가적으로 온도센서 ADC값을 CLCD로 디스플레이 하려고 합니다.

기존에 사용하던 LCD가 너무 오래되서 2번째 줄에 디스플레이가 안되서 I2C가 달려있는 LCD를 하나 구해왔습니다. 납땜이 되어있어서 빼지도 못하는 구조로 되어 있습니다..

<구성도>

뒤쪽 I2C모듈을 위와 같이 연결 합니다. SDA데이터핀은 A4, SCL클락핀은0 A5입니다.

저희가 사용할 헤더파일이 <Wire.h>, <LiquidCrystal_I2C.h> 2개입니다. 아두이노 사이트에 보면 A4,A5로 설정되 어있는걸 확인할 수 있습니다. 제가 전에 올린 자료를 이용해서 LCD를 한다면 따로 필요는 없습니다.

 

<LiquidCrystal_I2C.h> 설치

<Wire.h>은 기본적으로 아두이노에서 제공하는 Header파일 이기때문에 따로 설치가 필요 없음

<LiquidCrystal_I2C.h>를 사용하기위해서는 위처럼 라이브러리 관리에서 설치를 해줘야합니다.

검색 필터에 LiquidCrystal을 검색하시고 버전을 선택하시는데 1.1.1말고 1.1.2를 설치하시는걸 추천드립니다.

그 이유는 제가 1.1.1버전을 써봤는데 LCD에 출력시에 한글자씩만 출력되는 문제가 있었습니다.

<소스 코딩>

LiquidCrystal_I2C(0X27)은 I2C통신시 주소 값인데 이건 제품 출하시에 정해 지는 것입니다. 이건 0X27인데 제가보니 0X20, 0X3F제품도 있는 것으로 보입니다.

V=전압, T=온도, A=센서 ADC값입니다.

SetCursor 함수를 이용하여 ADC값은 첫번째줄 11번째칸에(0~10 이니 11번째에 표현) V전압은 2번째줄 첫번째, 온도 값 2번째줄 7번째에 디스플레이 하였습니다.

 

 

 

 

 

 

반응형
728x90
반응형

아두이노 사이트에 들어가면 LiquidCrystal이라는 라이브러리가 있습니다.

CLCD라이브러리

이 라이브러리에 있는 함수를 전부 다루어볼 예정입니다.

1. <구성도 및 회로>

전자 공작 사이트에서 가져온 자료 입니다. 위와 같이 회로를 구성하시고 RS, R/W , EN, D4, D5, D6, D7만 사용합니다.

RS : 12

R/W : GND

EN :11

D4 : 5

D5 : 4

D6 : 3

D7: 2

2. <PIN MAP>

3.< lcd.begin(), lcd.write()>

lcd.begin() : LCD 화면에 대한 인터페이스를 초기화하고 디스플레이의 크기 (너비 및 높이)를 지정, 다른 LCD 라이브러리 명령보다 먼저 begin ()을 호출해야함

lcd.write() : lcd.write(data) display할 문자나 data를 입력하면 됩니다.

lcd.begin(), lcd.write() 이용 소스코드

lcd.begin(), lcd.write() 동작화면

4.< lcd.blink(), lcd.noBlink()>

lcd.blink() : 깜빡이는 LCD 커서를 표시해줍니다.

lcd.blink() : 커서를 off 시킴

lcd.blink(), lcd.noBlink() 소스

lcd.blink(), lcd.noBlink() 동작 사진

직접 확인해보시면 2초마다 오른쪽 끝에있는 커서가 깜빡입니다.

5.< lcd.cursor(),lcd.noCursor()>

lcd.cursor() : 다음 문자가 쓰여질 위치에 밑줄 선을 표시

lcd.noCursor() : 밑줄선 off

lcd.cursor(),lcd.noCursor() 소스

lcd.cursor(),lcd.noCursor() 동작

6.< lcd.display(),lcd.noDisplay()>

lcd.display() : LCD를 noDisplay로 인해 꺼지면 이 함수로 킴

lcd.noDisplay() :LCD를 끔

lcd.display(),lcd.noDisplay() 소스

lcd.display(),lcd.noDisplay() 동작

display꺼짐 켜짐을 반복(data나, 문자가 지워지는건 아닙니다.)

7.<lcd.scrollDisplayLeft(), lcd.scrollDisplayRight() >

lcd.scrollDisplayLeft() :LCD Display내용을 한칸 왼쪽으로 쉬프팅함

lcd.scrollDisplayRight() :LCD Display내용을 한칸 오른쪽으로 쉬프팅함

lcd.scrollDisplayLeft(), lcd.scrollDisplayRight()소스

한칸씩 쉬프팅하기 때문에 for문을 이용했습니다. 문자는 총 15글자이기때문에 15번 왼쪽으로 밀어내고 다시 15문자를 가져오고 LCD문자표시가 16자이기 때문에 31만큼 오른쪽으로 밀어 냅니다.

그리고 16글자를 다시 왼쪽으로 끌어오면 원래위치에서 반복하게 되는 것입니다.

위 소스를 동작해보면 문자열이 쉬프팅 되는 것을 확인 할 수 있습니다.

 

반응형

+ Recent posts