아두이노 개발환경 기본 구조
- 메뉴
- 컴파일, 업로드 버튼
- 시리얼 모니터 버튼
- 소스 수정 영역
- 메시지 영역
- 소스 기본구조
- 초기화 루틴
- 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(속도); 의 의미
✅ "시리얼 통신을 **초당 9600비트 속도(baud rate)**로 시작해라!"
즉, 아두이노가 컴퓨터와 대화를 시작하도록 준비시키는 함수예요.
📡 언제 필요하냐면?
- Serial.print(), Serial.println() 같은 함수로 컴퓨터 시리얼 모니터에 메시지를 출력할 때 반드시 Serial.begin()으로 통신을 먼저 열어야 해요.
- 디버깅, 센서 값 확인, 데이터 로그, PC와 통신 등 거의 대부분의 테스트 코드에서 사용됨
Serial.available():
- 이 함수는 시리얼 버퍼에 데이터가 있는지 확인하는 함수입니다.
- 데이터가 있으면 해당 데이터의 크기를 반환하고, 없으면 0을 반환합니다.
Serial.read():
- 이 함수는 시리얼 입력 버퍼에서 하나의 문자를 읽는 함수입니다.
LED
- 순방향 ( + -> -) 전압이 흘렸을 때 발광
- 극성 확인 방법
- 다리 길이:
- 애노드(+): 다리(리드)가 긴 쪽
- 캐소드(-): 다리(리드)가 짧은 쪽
- 내부 금속판:
- 캐소드(-): 내부 금속판이 큰 쪽
- 애노드(+): 내부 금속판이 작은 쪽
- 전류 테스트:
- LED에 전류를 흘렸을 때 불이 들어오면 애노드(+), 전류가 안 흐르는 쪽이 캐소드(-)입니다.
- 칼로 흠집:
- 칼로 흡집내있는 부분에 - 아닌쪽이 +
- 다리 길이:
- 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 사용
- 다중 FND
- 한 개씩 빠르게 돌아가면서 디스플레이하는 방식
- 눈의 잔상효과 때문에 동시에 디스플레이되는 것처럼 보임
- 최소 1/30 초 (33ms) 주기 필요
- 캐소드 방식
- 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);
}