상세 컨텐츠

본문 제목

기본 센서등 간단정리

아두이노

by sorrypark1127 2026. 6. 7. 00:25

본문

버저(buzzer)

-단순한 소리내는 장치

사용법: tone()함수

tone(핀번호, 주파수, 소리길이/밀리초)

 

모션감지센서(PIR센서)

-적외선 인체감지 센서라고도 함

사용법: pinMode()함수에 핀번호, INPUT으로 초기화한 다음 digitalRead(핀번호)로 정수값 반환

 

 

초음파센서(ultrasonic 센서)

 -초음파를 Trig로 내보내서 Echo로 받아옴
사용법: pinMode()함수를 사용해서 Trig핀을 OUTPUT, Echo핀을 INPUT으로 초기화


초음파를 10us 정도 발사하려면

digitalWrite(Trig핀, HIGH);

delayMicroseconds(10);

digitalWrite(Trig핀, LOW);

 

그리고 이 초음파의 거리를 받아오려면

int duration = pulseIn(Echo핀, HIGH);

초음파의 속도는 340 m/s -> 34,000 cm/s 이고, 1초는 1000밀리초 -> 1,000,000마이크로초 이므로
1마이크로초 동안 초음파는 34000/1000000 = 0.034cm/us 다.

여기서 Trig핀으로 발사된 초음파는 물체에 반사되어 Echo핀으로 돌아오는 것이므로

왕복거리까지 고려하여 계산한다면 0.034/2 = 0.017 cm/us고, duration에 0.017을 곱한값이 물체와 초음파센서의 거리(cm)다.

또는,

 

거리 = 속력x시간

시간 = 거리/속력

여기서 시간 t = 1cm/0.034us = 29.4... 이므로 

초음파는 29.4 us마다 1cm 이동한다.

int microsecondsToCentimeters(int microseconds) { return microseconds / 29 / 2; }

 

조이스틱
손가락 움직임을 두개의 가변저항으로 측정
-얘는 아날로그다.
사용법:
조이스틱버튼은 pinMode()의 INPUT_PULLUP으로 초기화하고,
이 버튼은 digitalRead를 통해 정수값으로 반환됨, HIGH일시 미클릭/ 아닐시 클릭
조이스틱은 각각 analogRead()를 통해 vertical, horizontal를 정수형으로 반환
vertical(x축)과 horizontal(y축)의 범위는 0~1023이다.
 
 가스센서
-공기 중 이산화탄소 측정함

 

사용법:

#include "MQ135.h" 라이브러리 불러오고,

MQ135 gasSensor = MQ135(아날로그핀)으로 객체생성,

 

float ppm = gasSensor.getPPM(); 으로 농도측정

 

 

RGB LED

-그냥 LED 빨강,초록,파랑 섞어놓은거

 

사용법:

포텐셔미터(가변저항기)로 읽는예제

 

서보모터

(모터의 종류는 DC모터,서보모터, 스텝모터가 있음)

 

-아날로그 출력기능으로 PWM신호 0~180도 자유조작

사용법:

#include <Servo.h> 라이브러리 사용

Servo servo; 객체선언

 

servo.attach(서보핀) 으로 서보 객체에 서보핀 초기화

servo.write(각도) 로 회전

 

여기서 포텐셔미터로 각도를 조절하려면

analogRead(포텐셔미터 핀)으로 정수값 0~1023을 받아오고

int angle = map(포텐셔미터값, 0, 1023, 0, 180); 으로 회전값 변환

 

map()함수는 특정값x를 a~z 에서 가-하 로 맵핑해서 선형적으로 변환함

 

온습도 센서

-말그대로 온도와 습도를 확인하는 센서

 

사용법:

#include <DHT.h> 라이브러리

DHT dht(핀,DHT11);  //객체생성

 

dht.begin()으로 초기화

 

dth.readTemperature() 이나 dth.readHumidity()로 온습도 float값으로 반환

 

그런데 분명히

#include  <Wire.h> 라이브러리랑

#include <DHT11.h> 불러오고

DHT11 dth; 객체 생성한다음에

 

int값으로 readTemperatureHumidity() 로 한번에 불러오는 방식이 있던것같은데 잊어먹음

 

 

 

적외선 센서

pinMode()로 INPUT(입력모드)로 초기화

digitalRead(핀)으로 정수값 반환하고, LOW면 탐지됨/HIGH면 탐지안된상태

 

 

LCD(Liquid Crystal Display 액정 디스플레이)

 

말그대로 액정을 사용한 디스플레이

사용법:

#include <LiquidCrystal_I2C.h> 라이브러리 사용

 

LiquidCrystal_I2C lcd(0x27, 16, 2); 객체생성, 0x27은 주소로 모듈마다 0x3F인 것도 있음/ 16열, 2행

 

lcd.init()

lcd.backlight()로 초기화

 

lcd.print()나 lcd.write()로 문자열출력

lcd.setCursor(0,1); 으로 개행가능

lcd.clear()로 다 지우기

 

LED matrix

 

-상점 간판의 LED 디스플레이와 유사

-8x8 = 64개의 LED

-세로(Column) 0~7, 가로(Row) 0~7

-세로/가로번호로 LED on/off가능

 

 블루투스

 

#include <SoftwareSerial.h>

 

SoftwareSerial BTSerial(2,3);으로 TX,RX핀 초기화 -> 0,1번핀은 작동안됨, 우노보드에서 이미 USB시리얼통신에 사용되기때문

 

BTSerial.begin(9600);으로 초기화

BTSerial.available()이나 read(), write()가능 / Serial과 유사

 

블루투스 기기이름 바꾸려면 시리얼모니터에 AT -> OK뜨면

AT+NAMExxxx : xxxx로 이름변경

AT+VERSION : 버전확인

AT+PINxxxx : 페어링 비밀번호 xxxx로 

 

 

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

Serial(UART)

 

Hardware Serial

-아두이노 시리얼 통신이 대표적임

2개의 통신 라인이 크로스 되어 연결됨 (RX, TX)

비동기식 : Clock 라인 없이 양측이 미리 합의된 클럭 사용

-> 두 장치의 클럭 간격을 미리 맞춰줘야함

클럭 동기화 문제

-> 두 장치가 사용하는 클럭 생성기(crystal)의 주파수가 틀린 경우

-> 문제 방지를 위해 start/stop 비트 추가

Baudrate(통신속도 BPS), Start/Stop bit, Parity bit, Data chunk 9600 8N1 -> 9600 bps, 8bit data, No parity, 1 stop bit

 

통신간 1:1연결만 지원함

start/stop 비트 때문에 오버헤드 발생

하드웨어 구성이 복잡해짐

 

Software Serial

하드웨어 UART포트가 부족할때 일반 디지털 핀을 이용해 가상의 시리얼 통신을 만드는 기능

-> 예를들어 블루투스 모듈과 같은 장치를 추가로 연결하려는데 시리얼 통신이 필요함

-> UNO보드는 UART가 1개뿐이기 때문에 SoftwareSerial 라이브러리가 디지털핀을 RX/TX처럼 소프트웨어ㄹ ㅗ동작

SoftwareSerial s(2,3); = 2번 핀 -> 수신(RX), 3번핀 -> 송신(TX)으로 가상의 시리얼포트 생성

CPU가 직접 타이밍을 계산하여 처리, 인터럽트를 사용하고 CPU 부하 증가됨

 

 

 

 

I2C는 대표적인 동기식 시리얼통신

클럭 핀과 데이터핀이 서로 연결됨 (SCL,SDA)

시리얼통신과는 다르게 1:N통신(Master-Slave 구조, 제한적 N:N)

연결이 간단하고 데이터1라인으로 양방향통신하므로 상대적으로 느림

여기서 Master는 아두이노, 다른기기가 Slave

Slave기기들은 고유 식별 ID(address)를 가짐

SCL(Serial Clock, 클럭 시그널), SDA (Serial Data, 데이터 전송)

-UNO 보드 계열 :A4(SDA), A5(SCL)

-Wire.h 라이브러리로 사용

 

I2C 통신구조

-메시지 기본구조 : 주소 프레임과 데이터 프레임 사용

-통신 시작 조건 : SCL(HIGH) -> SDA(HIGH to LOW)

-주소 프레임 : 통신 시작시 주소 프레임부터 전송, 수신할 slave 주소 표현, 1bit로 read/write, 마지막 1bit로 NACK/ACK표현