본문 바로가기
카테고리 없음

IoT ( 아두이노 )

by 뱅뱅뱅뱅뱅 2024. 10. 19.

아두이노 개발환경 기본 구조

  • 메뉴
  • 컴파일, 업로드 버튼
  • 시리얼 모니터 버튼
  • 소스 수정 영역
  • 메시지 영역

 

  • 소스 기본구조
    • 초기화 루틴
      • setup() 함수
      • 최초 1회 수행
    • 반복 루틴
      • loop() 함수
      • setup() 이후 작동하는 동안 무한 반복

 

  • GND  (Ground, 디지털 접지)
    • 반드시 순환 구조 
    • 전류는 양극(VCC)에서 시작해 GND로 흐릅니다
    • 전류가 들어가는 곳 (전기적 기준점)

 

  • 툴체인과 교차 컴파일러
    • 툴체인
      • 컴퓨터에서 다른 CPU에 실행될 기계어 프로그램을 생성하기 위한 프로그래밍 툴
    • 교차 컴파일러
      • 컴퓨터 언어로 프로그램을 PC에서 코딩
      • 컴파일 후 PC에서 아두이노 ISP를 이용하여 마이크로컨트롤러에 입력
      • 컴파일하는 교차 컴파일러 필요

 

 

 

pinMode()를 설정하는 이유는?

"이 핀이 입력용인지 출력용인지 아두이노에게 알려주는 것

 

디저털 핀 (INPUT / OUTPUT) (2~13번)

  • 5V 출력 / 입력 (전압 조절은 불가)
  • HIGH (5V, on), LOW (0V, off)
  • GPIO (General Purpose Input Output)
  • 전원 공급(LED 예제) / 신호 전달용(모르스 부호)
  • 0 또는 1의 값을 처리

 

 

아날로그 핀 (INPUT) (A0~A5)

  • input 전용
  • 들어오는 전압에 따라 구분된 값을 읽을 수 있음
  • 0~5V의 아날로그 신호를 받으며, 이를 10비트 해상도디지털 값으로 변환

 

아날로그 저항기를 보면 저항기에서 보내는 값만 받아들인다.

저항기로 보내는 OUTPUT이 없는걸 생각하자

 

 

 

  • analogRead():
    • 입력에서 0~1023 값을 처리 (아날로그 입력).
  • analogWrite():
    • PWM 출력에서 0~255 값을 처리 (아날로그처럼 보이는 디지털 출력). 
    • 사실상 디지털핀에서 처리

 

 

편집기에서 코드 작성 -> 컴파일 및 아두이노에 업로드 -> 아두이노 실행

 

 

 

Serial.begin()은 아두이노와 컴퓨터(또는 다른 시리얼 장치) 사이에서 데이터 통신을 시작할 때 꼭 필요한 함수예요.


🔌 Serial.begin(속도); 의 의미

 
Serial.begin(9600);

✅ "시리얼 통신을 **초당 9600비트 속도(baud rate)**로 시작해라!"
즉, 아두이노가 컴퓨터와 대화를 시작하도록 준비시키는 함수예요.


📡 언제 필요하냐면?

  • Serial.print(), Serial.println() 같은 함수로 컴퓨터 시리얼 모니터에 메시지를 출력할 때 반드시 Serial.begin()으로 통신을 먼저 열어야 해요.
  • 디버깅, 센서 값 확인, 데이터 로그, PC와 통신 등 거의 대부분의 테스트 코드에서 사용됨

Serial.available():

  • 이 함수는 시리얼 버퍼에 데이터가 있는지 확인하는 함수입니다. 
  • 데이터가 있으면 해당 데이터의 크기를 반환하고, 없으면 0을 반환합니다.

Serial.read():

  • 이 함수는 시리얼 입력 버퍼에서 하나의 문자를 읽는 함수입니다.

 

 

 

 

 

 

 

 

 

 

 

 

LED

  • 순방향 ( + -> -) 전압이 흘렸을 때 발광
  • 극성 확인 방법
    • 다리 길이:
      • 애노드(+): 다리(리드)가 긴 쪽
      • 캐소드(-): 다리(리드)가 짧은 쪽
    • 내부 금속판:
      • 캐소드(-): 내부 금속판이 큰 쪽
      • 애노드(+): 내부 금속판이 작은 쪽
    • 전류 테스트:
      • LED에 전류를 흘렸을 때 불이 들어오면 애노드(+), 전류가 안 흐르는 쪽이 캐소드(-)입니다.
    • 칼로 흠집:
      • 칼로 흡집내있는 부분에 - 아닌쪽이 +

 

 

8번핀 Anode

- CODE

LED ON, OFF 

 

  • LED 선언 
    • #define or int
    • int 써도 문제없음 

 

int led = 8;

void setup() {

pinMode(led, OUTPUT);

}



void loop() {

digitalWrite(led, HIGH);

delay(100);

digitalWrite(led, LOW);

delay(100);

}

 

 

 

 

 

PWM

on, off 를 빠르게 반복하여 평균전압조절

  • 아두이노의 디지털핀
    • HIGH(5V)
    • LOW(0V)
    • 두 가지 신호 외에는 출력할 수 없음
  • PWM (pulse width modulation, 펄스 폭 변조) 기능을 이용
    • 2V, 3.5V 등 출력을낼 수 있음
    • LED의 밝기를 제어
    • 모터의 회전 속도를 제어에 사용
    • PWM은 진정한 의미의 아날로그 출력
  • 동작 주파수
  • 3, 5, 6, 9, 0, 11 번 핀 ~로 표시

  • 980Hz : 5, 6
  • 490Hz : 3, 9, 10, 11
  • analogWrite()
    • 기능: 디지털 핀에 PWM (Pulse Width Modulation) 신호를 출력하는 함수입니다.
    • 사용할 수 있는 핀: PWM 기능이 있는 디지털 핀에서만 사용 가능 (~ 표시가 있는 핀: 3, 5, 6, 9, 10, 11).
    • 출력: 0~255 사이의 값을 입력받아 아날로그 신호처럼 보이는 PWM 신호를 출력합니다. (255는 최대 출력, 0은 최소 출력)
    • 실제 아날로그 신호는 아님: 완전한 아날로그 신호가 아니라, 고속으로 전압을 켜고 끄는 방식(PWM)으로 평균 전압을 조절해 아날로그처럼 보이게 만드는 방식
    • analogWrite()는 LED 밝기 조절이나 모터 속도 제어 등에서 사용
  • digitalWrite, analogWrite 차이
    • digitalWrite(): 디지털 신호만 출력 (ON/OFF).
    • analogWrite(): PWM 신호를 사용해 아날로그처럼 보이는 신호를 출력 (0~255 범위).

 

 

 

  • 빨간색 전선
    • 아두이노의 디지털 핀 5번에서 시작되어 브레드보드에 연결된 저항을 통해 LED의 양극(+)(긴 다리)에 연결되어 있습니다. 이쪽이 전류가 흐르는 방향입니다.
  • 검은색 전선
    •  LED의 음극(-)(짧은 다리)에서 브레드보드를 통해 아두이노의 GND(Ground) 핀에 연결되어 있습니다. 이는 전류가 흐르는 반대쪽, 즉 접지입니다.

 

 

 

서서히 밝아졌다가 꺼지고 다시 밝아지는 동작

define LED 5
int val = 0; 

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

void loop() 
{ 
analogWrite(LED,val); 
delay(15);
val+= 1; 
if(val >= 255) 
val = 0; 
}
  • pinMode(LED, OUTPUT)
    • LED 핀( 5번 핀 ) 을 출력 모드( OUTPUT ) 로 설정
    • 아두이노가 해당 핀을 통해 전류 출력할 수 있다.
    • OUTPUT
      • 해당 핀을 출력 모드로 설정
      • 아두이노는 이 핀을 통해 전류를 공급하여 LED, 모터 등을 제어
    • INPUT
      • 해당 핀을 입력 모드로 설정
      • 버튼이나 센서 등의 입력을 읽음
  • analogWrite(LED, val);
    • LED: 핀
    • val: 밝 
    • LED 핀(5번 핀)에 PWM 신호를 출력하여 val에 따라 LED의 밝기를 조절합니다.
    • val의 값은 0에서 255 사이로, 0은 LED가 꺼진 상태, 255는 최대 밝기를 의미합니다.

 

 

 

 

 

 

서서히 밝아졌다가 다시 서서히 어두워지는 동작을 하는 LED

#define LED 5 
void setup() 
{ 
    pinMode(LED,OUTPUT); 
}

void loop() 
{ 
for (int k=0; k<256; k++) 
{ 
    analogWrite(LED,k); delay(15);
}
delay(1000); 

for (int k=255; k>=0; k--) 
{ 
    analogWrite(LED, k); delay(15);
}
delay(1000);
}

 

 

버튼

  • 사용자의 누름 또는 누르지 않음으로 입력이 구분되는 입력 장치
  • 버튼은 푸시(누름 또는 누르지 않음)을 통해 사용자의 입력을 판단
  • 버튼은 극성이 없음
  • 회로를 연결할 때의 극성에 따른 방향을 고려하지 않아도 됨
  • 버튼이 눌리지 않았을 때에는 가운데가 개방되어있는 회로로 전기적 신호가 흐르지 않는다.

 

 

 

const int led = 13;  // LED 핀: 보통 내장 LED
const int bt = 4;    // 버튼 핀: D4에 연결

void setup() 
{   
  pinMode(led, OUTPUT);           // LED 출력 모드
  pinMode(bt, INPUT_PULLUP);     // 버튼 입력, 풀업저항 활성화
}

void loop() 
{  
  int btState = digitalRead(bt);   // 버튼 상태 읽기
  digitalWrite(led, btState);      // 버튼 상태 그대로 LED 출력
}

 

✅ 버튼을 누르지 않았을 때

  • D4는 내부 저항을 통해 5V에 연결됨.
  • 즉, digitalRead(bt)는 HIGH (== 1)
  • 따라서 digitalWrite(led, HIGH) → LED 켜짐

✅ 버튼을 눌렀을 때

  • D4가 버튼을 통해 GND로 바로 연결
  • GND가 더 "강하게" 작용해서, D4 핀은 LOW로 떨어짐
  • 즉, digitalRead(bt)는 LOW (== 0)
  • 따라서 digitalWrite(led, LOW) → LED 꺼짐

 

 

 

버튼은 반대와 연결을 해주는 스위치일 뿐

반대가 gnd냐 5v냐에 따라 달라짐

 

 

 

 

 

 

TEXT LCD

 

- i2c는 lcd 제어하기 위함
- i2c는 sdl, scl 두개의 선을 받음

 
- I2C LCD 연결 개요

  • I2C LCD는 I2C 통신을 사용하여 LCD 디스플레이를 제어할 수 있게 해주는 모듈입니다.
  • 이 모듈은 일반적인 16x2 LCD(16개의 문자, 2개의 행)와 같은 LCD 화면에 I2C 인터페이스를 추가한 형태입니다.
  • I2C LCD는 두 개의 선만으로 여러 장치와 통신할 수 있도록 도와줍니다.


- I2C LCD 연결

  • SDA (Serial Data Line) - 데이터 전송용.
  • SCL (Serial Clock Line) - 클럭 신호 전송용.
  • VCC - 전원 공급 (일반적으로 5V).
  • GND - 접지 연결.


**클럭(Clock)**

데이터를 언제 송수신할지 알려주는 주기적인 신호입니다.

 


- LCD의 동작원리 

  • LCD(Liquid Crystal Display) 는 후면에 백라이트가 있다. - 전면에는 액정
  • 전기 신호에 따라 빛을 차단하거나 통과시키는 방식으로 빛을 내는 액정 표시장치
  • I2C모듈은 LCD 뒷면에 I2C 변환 모듈을 부탁하여 3단 4개의 핀으로 제어가 가능하도록 하는 것
  • I2C 모듈 뒷면의 가변저항으로 화면의 밝기를 조절


LiquidCrystal 라이브러리 = LCD 제어.

 

 





0x3F
I2C 통신에서는 모든 장치가 고유한 주소를 가져야 함

이 LCD 모듈의 주소가 0x3F

 

 

Wire.h I2C 통신을 위한 라이브러리 Wire.begin(), Wire.read()
LiquidCrystal_I2C.h I2C 방식 LCD 제어 라이브러 lcd.print(), lcd.setCursor()

 


- 코드 1

#include <Wire.h>                         // I2c 통신을 위한 라이브러리 
#include <LiquidCrystal_I2C.h>        // LCD 1602 I2C용 라이브러리 
LiquidCrystal_I2C mylcd(0x3F,16,2);      // 접근주소: 0x3F or 0x27

void setup() {
mylcd.init();                      // LCD 초기화 lcd.begin(); // Print a message to the LCD. 
mylcd.backlight();          // 백라이트 켜기 

mylcd.setCursor(0,0);             // 1번째, 1라인 (3, 0) 으로 변경해 볼것 
mylcd.print("Hello, world!");

mylcd.setCursor(0,1);             // 1번째, 2라인 
mylcd.print(“I am ARDUINO"); 
}

void loop()
{ 
}


- 코드 2

#include <Wire.h>                         // i2C 통신을 위한 라이브러리 
#include <LiquidCrystal_I2C.h>        // LCD 1602 I2C용 라이브러리 
LiquidCrystal_I2C mylcd(0x3F,16,2);      // 접근주소: 0x3F or 0x27

void setup() {
mylcd.begin();                      // lcd.init() == begin -> LiquidCrystal_I2C 라이브러리
mylcd.backlight();
mylcd.setCursor(0,0);             // 1번째, 1라인
mylcd.print("Hello, world!"); 
}

void loop() 
{ 
mylcd.setCursor(0, 1);
mylcd.print("sec = "); 
mylcd.print(millis()/1000); 
}

 

 

 

 

 

 

 

 

C# Serial 통신

using System.IO.Ports;				// 시리얼 포트(SerialPort)를 제어하기 위한 네임스페이스
namespace SerialComm
{
    public partial class Form1 : Form
    {
        SerialPort sPort;	// 시리얼 포트  선언

        public Form1()
        {
        	InitializeComponent();					// Windows Forms UI 초기화
            sPort = new SerialPort("COM3", 9600);         // COM3 포트를 9600 baud rate로 설정
            sPort.Open();                                 // 포트를 엽니다.
            sPort.DataReceived += SPort_DataReceived;     // 수신 이벤트 핸들러 등록
        }

        // 시리얼 포트의 Data_Received 이벤트
        private void SPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string s = sPort.ReadLine();
            this.BeginInvoke((new Action(delegate { showValue(s); })));
        }
        private void showValue(string s)
        {
            label1.Text = "Serial Value : " + s;
        }
    }
}

 

 

System.IO.Ports:

시리얼 포트(SerialPort)를 제어하기 위한 네임스페이스입니다

 

 

  • InitializeComponent()
    • Windows Forms 디자이너에서 만든 UI 요소를 초기화
  • SerialPort("COM3", 9600)
    • COM3 포트를 9600 보드레이트로 설정
    • 실제 연결된 아두이노 등 외부 장치에 따라 포트를 설정해야 합니다.
  • DataReceived
    • 데이터를 수신했을 때 자동으로 호출되는 이벤트입니다.

 

 

  • private void SPort_DataReceived
    • 이 메서드는 시리얼 포트에서 데이터가 수신될 때마다 호출됩니다.
    • ReadLine()은 개행 문자를 기준으로 문자열을 읽습니다.
    • BeginInvoke()
      • UI 스레드에서 안전하게 showValue를 호출

 

 

 

 

 

 

 

C# OLEDB Connect

 

 

 

 

 

  • 모터란
    • 고정자로 영구자석 사용
    • 회전자로 코일을 사용
    • 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발
    • 흡인력으로 회전력을 생성

 

  • 서보 모터 (Servo)
    • 무선 조종비행기, 자동차
    • PWM 신호의 펄스 폭으로 조정
    • 각도로 조정
    • 선이 3개 간단한 조작 (전원 2, 신호선 1)


    • void attach(pin): 서보 모터의 신호선이 연결된 핀을 지정
    • void attach(pin. min_us, max_us): 펄스폭 A의 최소, 최대값까지 지정
    • void write(angle) : 각도를 지정
    • void writeMicroseconds(us) : 펄스폭 A를 us 단위로 지정
    • int read() : 현재 각도 읽음 (반환 값 정수)
    • boolean attached() : 서보 모터 핀이 지정되어 있는지 검사
    • void detach() : 서보모터의 지정된 핀을 내부적으로 제거

아두이노

#include<Servo.h>
Servosm;
intpos=0;//서보의 위치

voidsetup(){
	sm.attach(9);    //디지털 입출력 9번 핀연결
	Sm.write(0);     // 0도 중심 각도로 회전

}

voidloop(){
    for(pos=0;pos<=180;pos+=1){    //0~180도 회전
    sm.write(pos);
    delay(15);//15ms대기
	}

    for(pos=180;pos>=0;pos-=1){    //180~0도 회전
    sm.write(pos);
    delay(15);
    }
}



 

#include <Servo.h>
	Servo sm;

void setup() 
{
sm.attach(9);  // 9번 핀에 서보 모터의 신호선을 연결 
Sm.write(90);  // 90도 중심 각도로 회전
}

void loop()
{
sm.write(0);
delay(2000);
sm.write(180);
delay(2000);
}

 

 


 

 

 

 

 

 

 

 

 

콘덴서

+ 용량의 단위 F (패러드) 기호는 C
+ 두개의 전극이 마주 보는 구조, 일정한 전하 저장
+ 전극의 면적이 넓을수록, 전극 간 거리가 가까울수록 콘덴서의 용량은 증가
+ 교류만 통과
+ 콘덴서를 통과한 전류는 위상이 전압보다 90도 앞섬
+ 전기를 일시적 저장 장치
+ 전하량은 전압에 비례

 

콘덴서 종류

 

  • 전해 콘덴서
    • 비교적 용량이 큼
      극성이 있음
      정격 전압이 있음
      비교적 허용차가 큼
      비교적 저주파 대역용
      직류 회로의 전원 필터에 주로 사용
      사용 가능 주파수가 비교적 낮기에 주의 필요
  • 탄탈 콘덴서
    • 비교적 용량이 큼
      극성이 있음
      정격 전압이 있음
      전해 콘덴서보다 주파성 좋음
      주파수 특성이 비교적 좋기에 노이즈 진폭 제한기나 바이패스, 커플링, 전원 필터에 사용
  • 세라믹 콘덴서, 적층 콘덴서
    • 비교적 용량이 작음
      정격 전압이 있으며 고전압용도 있음
      온도 특성이 좋음
      극성이 없으며 허용차가 큼
      적용 주파수 대역 넓음
      고주파 대역에서 적합하기에 고주파용 바이패스, 동조용, 고주파 필터에 사용
  • 전기 이중층 콘덴서
    • 특히 대용량 콘덴서
      정격 전압이 비교적 낮음
      주파수 특성 나쁨
      직류의 축전용, 배터리의 대용 사용 가능
      대전류 공급이 어려우며 메모리의 백업전지 대용 사용

 

 

 

 

FND ( Flexible, Numeric, Display )

  • ANODE 방식은 Vcc
    • LED ON -> LOW
  • CATHODE 방식은 Gnd
    • LED ON -> HIGH

 

 

 

  • 7-Segment 란
    • 7개의 LED를 사용하여 숫자 혹은 문자를 표시하는 부품
    • 공통음극(Cathode)은 LED를 켤 때 HIGH, LED를 끌 때 LOW 사용
    • 공통양극(Anode)은 LED를 켤 때 LOW, LED를 끌 때 HIGH 사용

7-Segment

 

7-Segment 접속방식

 

 

  • 다중 FND
    • 한 개씩 빠르게 돌아가면서 디스플레이하는 방식
    • 눈의 잔상효과 때문에 동시에 디스플레이되는 것처럼 보임
    • 최소 1/30 초 (33ms) 주기 필요

다중 FND

 

  • 캐소드 방식
    • LED 켤 때 HIGH
    • LED 끌 때 LOW
  • 애노드 방식
    • LED 켤 때 LOW
    • LED 끌 때 HIGH

캐서드 방식
애노드 방식

 

 

 

tmp36

±2°C의 정확도

-40도 ~ 125도 사양이 지정됨 ( 150도까지 작동)

저전압 작동(2.7V ~ 5.5V)

 

 

 

Pulse Width Modulation:

펄스 폭 변조

 

General Purpose Input Output:

 

범용 입력 출력

 

 

 

 

 

 


저항값

마지막 값은 오차율
마지막 -1 값은 승수 ( 10^ )
나머지는 앞 수

ex.. 일반적으로 4색 5색을 씀 6색은 마지막 색 온도계수를 나타냄

4색 OR 5색

마지막 색은 오차율

  • 4색 저항
    갈색(갈) - 흑색(흑) - 적색(적) - 금색(금)
    (갈색): 첫 번째 숫자 1.
    (흑색): 두 번째 숫자 0.
    (적색): 승수, 10^2 = 100.
    (금색): 오차율 ±5%

10 × 10^2 = 1000Ω = 1KΩ.

  • 5색 밴드 저항
    적 - 황- 녹 - 갈- 은

첫 번째 숫자 2.
두 번째 숫자 4.
세 번째 숫자 5.
승수, 10^1 = 10.
다섯 번째 색 (은색): 오차율 ±10%.
이걸 계산하면:

저항값 = 245 × 10 = 2450Ω = 2.45KΩ.

 


가변저항

저항의 값을 임의로 바꿔줄 수 있는 저항기
회전부로 조절

  • 아날로그 신호를 10비트로 디지털화하면 0~5V 의 신호를 입력받을 경우 0~1023 ( 1024 개의 값 )
    • 0V 입력 시 : 디지털 값은 0
    • 5V 입력 시 : 디지털 값은 1023
    • 0V == 0, 5V == 1023
    • 비트 수는 2^n

analogRead(A0)에서 A0는 아날로그 입력 핀 A0를 의미하는데,

이 핀에 연결된 센서나 장치의 아날로그 신호(전압)를 읽어옵니다,

 

저항기의 신호출력핀은 아두이노 A0핀에 연결되어 있음

  • analogRead 
    • 아날로그 값을 읽는 함수로, 0에서 1023 사이의 값을 반환
    • 아날로그 핀에 연결된 센서나 신호의 전압을 10비트 해상도로 변환한 값

 

int val = 0; // 변수 val 틀 선언하고 0 으로 초기화

void setup( )
    Serial.begin(9600); 
    // 아두이노와 컴퓨터 간의 시리얼 통신을 설정합니다. 9600bps의 전송 속도로 통신을 설정합니다.
    // 아두이노에서 발생한 데이터를 컴퓨터에 전송 -> 컴퓨터에서 처리하기위한 통신 설정 
}

void Ioop(){
val = analogRead(A0); // 변수 val 메 A0 핀외 아날로그 입력 대입
 Serial.println(val); // 시리얼 모니터에 val 값 출력
delay(100);	// 0.1 sec
}
int val = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  val = map(analogRead(A0), 0, 1023, 0, 10000);

  Serial.println(val);
  delay(1000);
}