아두이노
1. 디지털신호와 아날로그 신호
디지털(Digital) 신호
디지털 신호는 0과 1로 표현할 수 있는 신호입니다. 시간에 따라 디지털 신호를 표현하면 1을 전압 값으로 표현하면 5V(볼트), 0은 0V(볼트)를 의미합니다. 아두이노에서 5V는 HIGH, 0V는 LOW 값으로 표현합니다. 시간의 흐름에 따라 항상 HIGH 또는 LOW의 값을 표현하기 때문에 불연속적인 신호라고 부릅니다. 이는 HIGH, LOW 외에 중간 값을 가질 수 없다는 의미입니다.
전압(V)의 크기는 아두이노 보드의 동작 전압과 연관이 있습니다. 5V에서 동작하는 아두이노 우노(UNO)의 경우 HIGH의 값은 5V이고, LOW의 값은 0V입니다. 한편, 3.3V에서 동작하는 아두이노 듀(Due)의 경우 HIGH의 값은 3.3V가 되고, LOW의 값은 0V가 됩니다. 이렇게 보드에 따라 다른 동작전압을 갖고 있기 때문에 HIGH, LOW의 기준 전압은 아두이노 보드에 따라 달라집니다.
디지털 신호는 LED의 불빛을 켜거나 끌 때 사용되거나 인체감지 센서가 사람이나 동물의 움직임을 식별해 존재 여부를 알려주는 등 두 가지 상태를 표현하는 데 사용합니다. 또한 비트(bit) 수를 늘려 다양한 경우의 수도 표현할 수 있습니다. 예를 들어, 1비트로 표현할 수 있는 수가 0과 1이라면 2비트로 표현할 수 있는 수는 00, 01, 10, 11, 3비트로 표현할 수 있는 수는 000, 001, 010, 011, 100, 101, 110, 111 이렇게 비트 수가 증가함에 따라 표현할 수 있는 경우의 수는 2의 비트 승수(2n비트)만큼 증가합니다. 7비트를 알파벳 문자에 대응해 표현한 것을 아스키코드(ASCII)라고 하는데, 디지털 신호를 이용해 다수의 문자를 표현하는 대표적 사례입니다.
아날로그(Analog) 신호
아날로그 신호는 디지털 신호에 비해 시간에 따라 연속적인 값을 표현할 수 있습니다. 0과 1뿐만 아니라 그 사이에 있는 값인 0.1, 0.2도 표현할 수 있고 0.1과 0.2 사이에 있는 0.11, 0.12도 표현할 수 있습니다. 즉, 시간에 따라 디지털신호가 HIGH, LOW 두 가지 값만 표현할 수 있었다면 아날로그 신호는 훨씬 다양한 값을 표현할 수 있습니다.
아날로그 신호를 통해 온도와 습도 값을 측정하거나 빛의 밝기를 측정할 수 있고, 모터의 움직임을 각도 단위로 정밀하게 제어할 수 있습니다. 또한 초음파 센서를 통해 물체와 초음파 센서 사이의 거리도 측정할 수 있습니다.
디지털 신호를 활용한 장치
아두이노 시뮬레이터에서 디지털 신호를 활용한 장치는 크게 입력과 출력으로 구분할 수 있습니다. 디지털 입력은 HIGH, LOW 신호를 사용자 또는 특정 신호에 따라 입력받을 수 있는 장치이며, 디지털 출력은 LED를 켜거나 끄고, 모터를 동작시키고 멈추는 행위를 수행할 수 있습니다.
아날로그 신호를 활용한 장치
아두이노 시뮬레이터에서 아날로그 신호를 활용한 장치는 아날로그 입력과 아날로그 출력으로 구분할 수 있습니다. 아날로그 입력은 아두이노에 내장된 ADC(Analog Digital Converter)를 거쳐 0V에서 5V 사이의 값을 0에서 1023의 범위의 값으로 변환해 줍니다. ADC는 아날로그 신호를 디지털로 변환해 주는 장치이며, 10비트 ADC가 표현할 수 있는 수의 범위가 210 = 1024이기 때문에 0을 포함해서 1023까지 표현할 수 있습니다. 아두이노 우노(UNO)에서 아날로그 입력을 받을 수 있는 핀은 A0, A1, A2, A3, A4, A5까지 총 6개의 핀이 있습니다. 디지털 핀은 0번부터 13번까지 총 14개가 존재하는데 디지털 핀은 하나의 핀으로 입력과 출력이 모두 가능하지만 아날로그 핀은 입력만 가능합니다. 그럼 아날로그 출력은 어떻게 사용해야 할까요? 아날로그 출력은 PWM(Pulse Width Modulation)이라고 하는 펄스폭 변조 기능을 통해 디지털 신호를 마치 아날로그 출력처럼 사용할 수 있는 기법을 활용합니다. 여기에서는 디지털 핀 번호 앞에 물결무늬(~)가 있는 핀인 3번, 5번, 6번, 9번, 10번, 11번 핀이 PWM을 지원하는 디지털 핀이라는 것만 기억하면 됩니다.
아날로그 입력 핀에 연결된 가변저항이나 조도센서, 온도센서 등의 범위는 0에서 1023까지이며 온도센서(TMP36)의 경우 입력 전압 값을 온도 값으로 변환하는 과정을 거칩니다. 디지털 출력에서는 단순히 모터를 동작하거나 멈추었지만 아날로그 출력을 이용하면 모터의 속도를 빠르게 또는 느리게 제어할 수 있게 하거나 스텝모터의 경우 각도에 맞춰 움직이도록 할 수 있습니다. RGB LED도 마찬가지로 디지털 출력으로는 빛의 삼원색인 빨강, 파랑, 초록색으로 8가지 색(28)을 만들어 낼 수 있지만 아날로그 출력으로는 더 많은 색을 표현할 수 있습니다.
(출처: https://wikidocs.net/30776)
03-1 디지털과 아날로그 신호
## **디지털(Digital) 신호** 디지털 신호는 0과 1로 표현할 수 있는 신호입니다. 시간에 따라 디지털 신호를 표현하면 아래 그림과 같으며 1을 전압 값으로 표현하면…
wikidocs.net
풀업(Pull-up)저항과 풀다운(Pull-down) 저항
푸시버튼을 누르면 HIGH 값을 가지고 떼면 LOW 값을 가진다고 푸시버튼 예제를 통해 설명한 바 있습니다. 하지만 어떤 값을 가질지는 저항을 어디에 연결하는지에 따라 달라집니다. 푸시버튼 예제에서 푸시버튼에 연결된 저항은 그라운드에 연결되었습니다. 이렇게 그라운드에 연결된 저항을 풀다운(Pull-down) 저항이라고 하며 전원에 연결된 저항을 풀업(Pull-up) 저항이라고 합니다.
풀(Pull)이 잡아 당기다라는 의미를 가지는데 풀업 저항은 상대적으로 높은 5V의 전원 전압으로 잡아당기고, 풀다운 저항은 상대적으로 낮은 0V 그라운드 전압으로 잡아당긴다라고 생각하면 이해하기 쉽습니다.
풀다운 저항에서 푸시버튼을 누르기 전 초기 값은 LOW입니다. 왜냐하면 디지털 7번 핀에 연결된 배선이 저항을 거쳐 그라운드로 바로 연결되었기 때문입니다. 하지만 버튼을 누르면 전류가 전원에서 푸시버튼과 저항을 거쳐 그라운드로 흐르게 됩니다. 그 사이에 디지털 핀 7번에서 전압 값을 측정하기 때문에 5V인 HIGH 값을 가져올 수 있습니다. 따라서 푸시버튼을 누르기 전에는 LED가 꺼진 상태에 있다가 푸시버튼을 누르면 LED가 켜집니다.
그럼 이번에는 풀업 저항을 연결한 상태에서는 어떻게 동작하는지 살펴보겠습니다. 준비물과 스케치 코드는 풀다운 저항 예제와 동일합니다.
풀업 저항의 회로구성이 풀다운 저항의 회로구성과 다른 점은 푸시버튼에 연결된 전원과 그라운드가 서로 바뀌었다는 것입니다. 풀다운 저항에서 푸시버튼에 직접 연결된 선이 전원인 반면 풀업 저항의 경우 그라운드에 연결됩니다. 그리고 풀다운 저항에서 푸시버튼과 저항에 연결된 선이 그라운드였다면 풀업 저항에서는 전원에 연결됩니다.
푸시버튼을 누를 때와 뗄 때의 값도 달라집니다. 풀업 저항에서 푸시버튼을 누르기 전 초기 값은 HIGH가 되며, 푸시버튼을 누르면 LOW 값을 가집니다. 따라서 시뮬레이션을 시작하면 LED가 먼저 켜집니다. 일반적으로 버튼을 누를 때 어떤 행위를 수행하는 것이 당연하다는 생각을 할 수 있지만 풀업 저항의 경우 그와는 반대로 동작하기 때문에 풀업 저항과 풀다운 저항을 구분하는 이유를 궁금해할 수 있습니다. 풀업 저항은 평상시에는 전원을 공급하다 누르면 전원 공급을 멈추는 리셋(Reset) 버튼과 같은 곳에 사용됩니다. 아두이노 보드에도 붉은색 리셋 버튼이 존재하는데 실행 중 리셋 버튼을 누르면 프로그램을 초기화하고 처음부터 다시 시작합니다.
풀업 저항의 스케치 코드는 풀다운 저항의 스케치 코드와 동일합니다. 하지만 실행 결과는 다릅니다. 풀업 저항에서는 digitalRead() 함수에 의해 읽어온 초기 값이 HIGH이기 때문에 처음부터 LED의 불빛이 켜져 있으며 푸시버튼을 누르는 동안 LOW 값을 읽어 LED의 불빛이 꺼집니다. 이러한 차이는 풀업 저항과 풀다운 저항의 연결 방식과 동작 원리에 기인합니다. 이를 이해하면 아두이노와 같은 디지털 시스템에서 입력 장치의 동작 방식을 더욱 잘 이해하고 활용할 수 있습니다.
- 수위 센서
void setup(){
Serial.begin(9600); // Communication started with 9600 baud
}
void loop(){
int sensor=analogRead(A0); // Incoming analog signal read and appointed sensor
Serial.println(sensor); //Wrote serial port
}
+ 수위 측정 기능 추가
int resval = 0;
int respin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int sensor=analogRead(A0);
resval = analogRead(respin); // Read analog data
if (resval <= 10) {
Serial.println(sensor);
Serial.println("The Cup is Empthy /n");
}
else if (resval > 10 && resval <= 12) {
Serial.println(sensor);
Serial.println("Water Level is Low /n");
}
else if (resval > 12 && resval <= 16) {
Serial.println(sensor);
Serial.println("Water Level is Medium /n");
}
else if (resval > 16 && resval <= 20) {
Serial.println(sensor);
Serial.println("The Cup is full of water /n");
}
delay(1000); // delay 1 second
}
++ Tone 기능 추가
int resval = 0;
int respin = A0;
int buzzer = 12; // Buzzer connected to digital pin 8
void setup() {
pinMode(buzzer, OUTPUT); // Set buzzer pin as output
Serial.begin(9600);
}
void loop() {
resval = analogRead(respin);
if (resval <= 10) {
Serial.println(resval);
Serial.println("The Cup is Empty \n");
digitalWrite(buzzer, LOW); // Turn off the buzzer
}
else if (resval > 10 && resval <= 12) {
Serial.println(resval);
Serial.println("Water Level is Low \n");
digitalWrite(buzzer, LOW); // Turn off the buzzer
}
else if (resval > 12 && resval <= 16) {
Serial.println(resval);
Serial.println("Water Level is Medium \n");
tone(buzzer, 1000, 5); // 수위센서가 12 초과 16 이하 일때 경고음 울림
}
else if (resval > 16) {
Serial.println(resval);
Serial.println("The Cup is full of water \n");
tone(buzzer, 5000); // 수위센서가 16 초과일 때 경고음 지속적으로 울림
}
delay(1000); // delay 1 second
}
- 온도 측정
출처(https://wikidocs.net/30792)
06-3 온도센서(TMP36) 사용하기
## **온도센서(TMP36) 소개** 온도센서는 온도를 감지해 전기신호로 바꿔주는 센서를 의미합니다. 아두이노 시뮬레이터는 TMP36이라는 온도센서를 지원하며 아래와 같이 세…
wikidocs.net

void setup()
{
Serial.begin(9600); // 시리얼 통신 초기화
}
void loop()
{
int readValue = analogRead(A0); // TMP36 값 측정
float voltage = readValue*5.0/1024.0; // 전압 값 변환
float temperature = voltage*100-50; // 온도 값 변환
Serial.print("Temperature is: "); // 온도 값 시리얼 모니터에 출력
Serial.println(temperature);
delay(500);
}

+ 일정 온도 보다 올라가면 모터 돌리기

int motorPin = 8;
void setup()
{
Serial.begin(9600); // 시리얼 통신 초기화
pinMode(motorPin, OUTPUT);
}
void loop()
{
int readValue = analogRead(A0); // TMP36 값 측정
float voltage = readValue*5.0/1024.0; // 전압 값 변환
float temperature = voltage*100-50; // 온도 값 변환
if (temperature >= 26) {
Serial.print("Temperature is: "); // 온도 값 시리얼 모니터에 출력
Serial.println(temperature);
digitalWrite(motorPin, HIGH);
delay(3000);
}
else
Serial.print("Temperature is: "); // 온도 값 시리얼 모니터에 출력
Serial.println(temperature);
digitalWrite(motorPin, LOW);
delay(1000);
}
int motorPin = 8;
void setup()
{
Serial.begin(9600); // 시리얼 통신 초기화
pinMode(motorPin, OUTPUT);
}
void loop()
{
int readValue = analogRead(A0); // TMP36 값 측정
float voltage = readValue*5.0/1024.0; // 전압 값 변환
float temperature = voltage*100-50; // 온도 값 변환
if (temperature >= 26) {
Serial.print("Temperature is: "); // 온도 값 시리얼 모니터에 출력
Serial.println(temperature);
digitalWrite(motorPin, HIGH);
delay(3000);
}
else
Serial.print("Temperature is: "); // 온도 값 시리얼 모니터에 출력
Serial.println(temperature);
digitalWrite(motorPin, LOW);
delay(1000);
}
* 위에 코드에서는 온도가 26 이상으로 올라가면 모터를 동작시키도록 했다.
MQTT(Message Queueing Telemetry Transport)
: MQTT는 2016년에 국제 표준화된 발행-구독(Publish-Subscribe) 기반의 메시지 송수신 프로토콜입니다. 이 프로토콜은 작은 코드 공간이 필요하거나 네트워크 대역폭이 제한되는 원격 통신, 즉 IoT와 같은 제한된, 혹은 대규모 트래픽 전송을 위해 만들어졌습니다. MQTT는 TCP/IP 프로토콜 위에서 동작하며, 많은 통신 제약들을 해결해 줍니다.
- MQTT의 주요 특징
- 연결지향적(Connection Oriented): MQTT 브로커와 연결을 요청하는 클라이언트는 TCP/IP 소켓 연결을 한 후 명시적으로 연결을 끊거나 네트워크 사정에 의해 연결이 끊어질 때까지 상태를 유지합니다.
- 브로커를 통한 통신: MQTT의 발행-구독 메시징 패턴은 오로지 브로커를 통해서만 통신할 수 있으며 개설된 Topic에 메시지를 발행하면 해당 Topic을 구독하는 클라이언트들에게 메시지를 발행할 수 있습니다.
- QoS (Quality of Service): MQTT는 QoS를 제공하며, 이는 메시지 전달의 신뢰성을 보장합니다. QoS는 다음 세 가지 수준으로 나뉩니다:
- 최대 1회 전송. Topic을 통해 메시지를 전송할 뿐 보장은 하지 않습니다.
- 최소 1회 전송. 구독하는 클라이언트가 메시지를 받았는지 불확실하면 정해진 횟수만큼 재전송합니다.
- 구독하는 클라이언트가 요구된 메시지를 정확히 한 번 수신할 수 있도록 보장합니다.
- 메시지 유형: MQTT는 다양한 메시지 유형을 지원합니다. 이에는 연결하기, 연결 끊기, 발행하기 등이 포함됩니다.
- 다양한 개발언어의 다양한 클라이언트 지원: C/C++/Java/Node.js/Python/Arduino 등 여러 종류로 브로커와 라이브러리가 존재합니다.

'AIoT' 카테고리의 다른 글
AIoT 정규 61일차 (0) | 2024.04.05 |
---|---|
AIoT 정규 60일차 - Git (0) | 2024.04.04 |
AIoT 정규 58일차 (2) | 2024.04.02 |
AIoT 정규 57일차 (0) | 2024.04.02 |
AIoT 정규 56일차 (0) | 2024.03.29 |