아두이노 기본 정리

행동하는 개발자·2024년 9월 29일

아두이노

목록 보기
1/2

피지컬 컴퓨팅

소프트웨어 + 하드웨어 -> 인간과 컴퓨터가 상호작용할 수 있도록 하는 기술

아두이노 vs 라즈베리 파이

아두이노 - 별도의 운영체제 없이 프로그램을 반복적으로 실행되는 펌웨어

adc(Analog to Digital Converter) 회로를 가지고 있어 센서 데이터를 디지털로 변환하여 컴퓨터나 마이크로 컨트롤러에서 처리할 수 있게 한다. 오디오 신호를 디지털화하여 컴퓨터에서 저장 및 처리가 가능하다. 다양한 측정 장비에서 실시간 데이터를 디지털화해 분석 및 처리한다.

아두이노 종류

  • 1단계: 아두이노 우노

  1. 입출력 핀, 아날로그 핀: 납땜을 하지않고 연결하기 위함

  2. 전원핀: 3.3볼트, 5볼트, 그라운드

  3. usb 포트(b타입)존재

  4. 전원 led, tx led, rx led 내장 led 존재

  5. 리셋 버튼, 독립적으로 전원 연결할 수 있는 전원 포트

  6. 마이크로 컨트롤러

  • 2단계: 아두이노 메가

  • 3단계: 아두이노 윤

사용

  1. 아두이노 앱 실행

  2. 툴 -> 아두이노 우노// 자신이 사용할 제품 선택

  3. 자신이 사용하는 usb 포트

  4. 시리얼 모니터창(서버속도(보드레이트) 9600을 많이 사용함)

시리얼 비긴(Serial.begin(9600);)
:주로 setup에서 사용

시리얼 프린트(Serial.print("Hello Arduino")) - 줄바꿈 x
시리얼 프린트(Serial.println("Hello Arduino")) - 줄바꿈
시리얼 리드(Serial.read()) 수신받은 데이터 읽기
:수신데이터가 비어있으면 -1 출력
:abc 입력하면 아스키코드 출력

시리얼 어베일러블(Serial.available()) - 시리얼 포트로부터 수신받은 데이터 확인
:0이 뜨면 읽지 않은 데이터가 0개라는 뜻
:abcd 입력하면 4가 출력됨

핀모드(pinMode(2, OUTPUT)) - 디지털핀 설정
:디지털 2번 핀을 OUTPUT으로 사용
-> 내장 LED가 깜빡 거리게됨

디지털롸이트(digitalWrite(2, HIGH)) - 디지털핀 값 전달
:디지털 2번핀에 HIGH 값 전달
-> HIGH값은 켠다는 뜻, LOW 값은 끈다는 뜻

디지털리드(digitalRead(2)) - 디지털 센서 값 읽음
:디지털 2번핀에 연결된 센서값읽음

아날로그리드(analogRead(2)) - 아날로그 센서 값 읽음
:아날로그 2번핀에 연결된 센서값 읽음

딜레이(delay(1000)) - 프로그램 실행 지연

  1. 파일 -> 예제 -> blink

변수와 상수(내가 아는 파이썬과 다른점을 중점으로)

  • HIGH(논리 1. 3.3볼트 OR 5볼트 OR 그라운드)/LOW(논리,0, 0볼트 근처)
    : 입출력 핀의 상태

  • INT형을 가장 많이 사용하지만 많은 자료형을 사용할 수 있다.

  • CHAR 사용하지만, 한글을 저장할 수는 없다.

변수

int value;
value = 13;

int value = 13;

연산자

in python 
x += 1
x and y
x or 
x != x

in arduino
x ++ 1
x && y
x || y
!x = x

조건문

if (조건식1)
{


}
else if (조건식2)
{

}

else
{

}

반복문

for (초기화; 조건; 증감표현)

{
	반복할 일
}

while (조건)
{
명력문1;
명령문2;
}

tinkercad circuits

저항

저항값을 알고 있어야 저항을 제대로 사용할 수 있음

스위치

브레드 보드

납땜할 필요없이 소켓으로 아두이노를 이용할 수 있음

신호등 만들기

순서도
  1. red on
  2. delay
  3. red off, yellow on
  4. delay
  5. yellow off, green on
  6. delay
  7. green off, red on
  8. 2부터 다시 시작
준비
  1. 아두이노 우노와 보드브레드 준비
  2. 저항(레지스터)과 led 3개씩 준비
규칙
  1. red는 7번

  2. yellow는 4번

  3. green은 2번에 연결

  4. 블록코드를 먼저 작성

실제

if 문 led 제어
for 문 led 제어

6개의 led 제어
1. 전체 켜기, 끄리
2. 오른쪽으로 하나씩 켜기
3. 왼쪽으로 하나씩 끄기
4. 오른쪽으로 하나씩 켜고 끄기
5. 왼쪽으로 하나씩 켜고 끄기

배열을 이용해 led 제어
배열 선언
int myInts[8];
int myInts[8] = {2,1,4,5,6,7,8};
int myInts[] = {2,1,4,5,6,7,8};
char mes[6] - "hello";
led 제어하기 위한 핀 번호를 선언
int led[6] = {13,12,11,10,9,8};
void setup()	{
	for(int i = 0; i<6; i++)
    	pinMode(led[i],OUTPUT);
}

void loop()	{
	for(int i = 0; i<6; i++)
    	digitalWrite(led[i], HIGH);
        delay(300);
        digitalWrite(led[i], LOW);
        delay(300);
}

아두이노 디지털 핀

디지털 신호와 풀업, 풀다운 저항

  • 디지털 신호는 0(0볼트, LOW)과 1(5볼트, HIGH)로 표현

  • 아두이노에서는 2.5V가 임계전압, 이걸 기준으로 LOW, HIGH 나뉨

  • PULLUP: 저항을 플러스에 위치
    스위치를 누르면 LOW

  • PULLDOWN: 저항을 마이너스에 위치
    스위치를 누르면 HIGH

디지털 핀 vs 아날로그 핀

  • 디지털은 입력과 출력
  • 아날로그는 입력만 가능

PWM핀과 아날로그 신호

  • PWM(Pulse Width Modulation)

: '~' 표시가 있는 핀을 사용해야 한다.
0% duty cycle
25% duty cycle(1.25볼트)
50% duty cycle
75% duty cycle(3.75볼트)
100% duty cycle

의 종류가 있고, 높아질수록 밝은 비율이 높아지는 것

int bright =0;
int fadeValue=5;

void loop () {
	analogWrite(led, brightness);
    bright = bright + fadeValue;
    if (bright < 0 || bright > 255)
    	fadeValue = -fadeValue
    delay(300);
}

PIR 센서

  • 주로 현관문이나 계단에 부착해 사람의 움직임이 있을 때, 조명을 켜주는 장치

EX) 초음파, 적외선 발사 후 돌아오는 것도 있지만, 열을 파악해서 움직임 감지

  • 입력: 움직임 감지(digitalRead())
  • 처리: 움직임이 있으면 led on, 없으면 led off
  • 출력: digitalWirte()
#define PIR 7
#define LED 4

void setup() {
	pinMode(PIR, INPUT);
	pinMode(LED, OUTPUT);
}

BUTTON

#define BUTTON 7
#define LED 4

void setup() {
	pinMode(BUTTON, INPUT);
	pinMode(LED, OUTPUT);
}

void loop()	{
	if(digitalRead(BUTTON)==HIGH)
    	{
        digitalWrite(LED, HIGH);
        }
    else
    	{
    	digitalWirte(LED,LOW);
		}
}

아두이노 아날로그 핀

  • HIGH와 LOW로만 나뉘는게 아닌, 연속적인 변수가 존재

  • 시간에 따라 연속적인 값을 표현하는 아날로그 신호(빛의 밝기, 온습도 등등)

  • 입력되는 0에서 5볼트가 0~1024으로 대응됨

가변저항 + LED

  • 가변저항: out
  • 아날로그 핀: A0
  • LED: +
  • 디지털 핀: 3
void setup(){
	Serial.begin(9600);
}

void loop(){
	int val = anlaogRead(A0);
    Serial.println(val);
    delay(100);
}

###################################

int led=3;
void setup(){
	pinMode(led, OUTPUT);
}

void loop(){
	int val = anlaogRead(A0);
    val = map(A0, 0,1024,0,255);
    analogWrite(led,val);
}
0~1024: 아날로그 값 범위
0~255: pwm 값 범위

온도센서 + LED

  • 접촉센서 + 비접촉센서

  • LM35, TMP36, DHT11, DHT22

  • 위 온도센서들의 사양을 DATASHEET를 통해 꼭 확인하고 필요한 것을 구비할 것

  • 0도는 0볼트, 1도가 증가하면 10미리볼트가 증가

#define LM35 A0
int led =2;
void setup(){
	Serial.begin(9600);
}
void loop(){
	int reading = analogRead(LM35);
    float tempC = (reading*5.0*100.0)/1024;
    delay(1000);
}
온습도 센서
  • 소자 방식 vs 모듈 방식
  1. DHT11

온도: 0~ 50도, 오차범위 2도,
습도 20~90, 오차범위 5

  1. DHT22

온도: -40~80도, 오차범위 0.5도
습도: 0~ 99.9, 오차범위 2

#include DHT.h
#define DHTPIN 7
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  delay(3000);
  int h = dht.readHumidity();
  int t = dht.readTemperature(); // 섭씨온도
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed"));
    return;
  }
}
// DHTtester에서 예제를 확인할 수 잇음

조도센서(cds) + LED

int led = 3;

void setup(){
	pinMode(led, OUTPUT);
}

void loop(){
	int light = analogRead(A0);
    light = map(light, 0, 1024, 0, 255);
    analogWrite(led, light);
}

초음파센서

  • 초음파센서는 임의로 20kHz에서 200MHz 대역의 초음파를 만들어 내고 이를 통해 물체와의 거리를 측정할 수 있는 센서

  • NewPing 라이브러리

#include <NewPing.h>

NewPing.ultrasonic(6,7);
void setup() {
  Serial.begin(9600);
}

void loop() {
  int dist = ultrasonic.ping_cm(); 
  delay(100);
  }
}

조이스틱

VRX: A0
VRY: A1
SW: 7

int btn = 7;

void setup(){
	Serial.begin(9600);
    pinMode(sw, INPUT_PULLUP);
}    
void loop(){
	int x =analogRead(A0);
    int y =analogRead(A1);
    int b =analogRead(sw); 
}

액추에이터(Actuator)

:시스템을 움직이거나 제어하는 기계 장치

Text LCD(Liquid Crystal Display)

  • 12C(Inter-Intergrated Circuit) 통신 프로토콜 모듈
    : 두개 의 전선만 사용하는 직렬 통신 프로토콜

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.println("Hello World");
  lcd.setCursor(5,1);
  lcd.println("123456789");
}

void loop() {
  
}
  • 글자가 잘 안 보일수 있는데, 그럴 때 뒤에 있는 나사를 돌려서 보이게 할 수 있다.

  • 아두이노 홈페이지에서 ic2_scanner 예제를 찾을 수 있다.

응용(DHT + Text LCD)

#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 7
#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27,16,2);
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
}

void loop() {
  h = dht.readHumidity();
  t = dht.readTemperature();

  if (isnan(t)  ||  isnan(h)) {
    Serial.print("fail");
    return;
  }
  lcd.setCursor(0,0);
  lcd.print(t);
  lcd.setCursor(1,1);
  lcd.print(h)
}

Buzzer(부저)

  1. 종류
  • Passive Buzzer
    : 떨림판과 자석만 있어 아두이노의 tone()이라는 함수를 통해 특정 주파수 신호를 보내면 그 주파수에 해당하는 소리가 나게 된다.
  • Active Buzzer
    : 떨림판과 자석 이외에 내장된 진동 회로가 있어 외부에서 전원만 인가해주면 자동으로 소리가 나는 방식. 사용이 간편하지만 미리 지정된 주파수 소리만 낼 수 있다.
  1. 구조

  1. 함수
  • tone(pin, frequency)
  • tone(pin, frequency, duration)
  • noTone(pin)

{262, 294, 330, 349, 392, 440, 494, 523}
{도, 레, 미, 파, 솔, 라, 시 도}

Motor(모터)

  1. 종류

서브모터, DC모터, 스태핑 모터

  1. 구조

아두이노 내 전용 라이브러리

센서

  • 센서는 감각을 알아내는 장치로써, 및, 온도, 소리, 움직임, 수분 등을 다양한 정보를 측정하여 데이터를 신호로 전송하는 물리적 장치

설치 후 사용 방법

메뉴: 스케치 > 라이브러리 포함하기 > 라이브러리 관리

#include library header file
profile
끊임없이 뭔가를 남기는 사람

0개의 댓글