반응형

목차

1. HC-05, HC-06 테스트 및 설정 : https://coding-yoon.tistory.com/206

 

글을 시작하기 전에 내가 대학생일 때 들었었으면 좋았을 강의 하나가 있다. 이용성 교수님께서 강의해 주시는 건데 회로부터 하나하나 설명해 주시니 진짜 너무 좋은 영상이다.

아두이노 UNO 와 블루투스 모듈과 0, 1번을 사용하면 안 되는 이유

가끔 블로그를 보면 아두이노와 블루투스 모듈을 0, 1번에 서로 연결하는 경우가 있다. 완성 시 컴퓨터와 분리했을 때는 문제가 되지 않고, 아두이노에 코딩을 할 때 문제가 발생한다.

아두이노에서 통신 방식은 대표적으로 UART, I2C, SPI 방식이 있다. 특히 UART를 조심히 사용해야 한다.

가장 많이 사용되는 아두이노 UNO 같은 경우 UART는 한 개이며, 각각 0번 핀(RX:수신), 1번 핀(TX:송신)이다. 그런데 아두이노는 이상한 특징을 가지고 있다. UART 0, 1번 핀이 컴퓨터와 연결되는 USB 케이블 부분과 연결돼 있다.

우리는 아두이노에서 출력되는 값을 아두이노 serial monitor를 통해서 확인할 수 있다. USB 케이블을 통해 데이터가 출력되지만, 이 USB 케이블은 0, 1번과 연결돼있다. 정리하자면 컴퓨터에 아두이노를 연결하는 순간 이미 아두이노와 컴퓨터는 서로 serial 통신을 하고 있다.

그렇다면 블루투스 모듈을 0, 1번에 사용하면 어떻게 될까? 당연히 충돌 난다. 하지만 간혹 운이 좋아 동작할 수 있지만 올바른 동작이라고 할 수 없다.

그렇다면 아두이노 UNO는 UART를 사용할 수 없는가?

하나밖에 없는 UART는 이미 사용하고 있기 때문에, 아두이노는 softwareserial를 사용해 uart를 사용할 수 있다. 몇 개든 uart를 선언해서 사용할 수 있지만 software로 구현돼있기 때문에 굉장히 느리다. 그렇기 때문에 아두이노 코딩 할 때는 softwareserial을 사용할 수 밖에 없고, 완성 후에 하드웨어 serial을 사용하면 된다. 이것에 대한 팁은 나중에 올리려고 한다.

*아두이노에 대한 UART를 더 알고 싶으시면 아래 블로그를 참고하시길 바랍니다.

아두이노 UNO 와 블루투스 모듈(HC-05, HC-06) 연결

아래와 같이 아두이노와 블루투스 모듈을 연결했고, 코드는 아래와 같다.

코드는 굉장히 간단하다. 블루투스로 수신 받은 값을 serial monitor에 출력하는 코드이다. 

#include <SoftwareSerial.h>

#define BT_RXD 3
#define BT_TXD 2
SoftwareSerial bluetooth(BT_RXD, BT_TXD);

void setup() {
  Serial.begin(115200);     // 이전 글 참고
  bluetooth.begin(115200);  // 이전 글 참고
}

void loop() {
  if (bluetooth.available()) {
    Serial.write(bluetooth.read());
  }
  if (Serial.available()) {
    bluetooth.write(Serial.read());
  }
}

 

올바르게 연결하고 펌웨어에 코드를 입혔다면, Arduino bluetooth controller를 설치해서 Terminal mode로 테스트한다. Hello를 입력해보면, Arduino IDE의 Serial monitor에서 값을 확인할 수 있다.

 

 

HC-05, HC-06

블루투스 모듈인 HC-05와 HC-06에서 LED를 확인할 수 있는데, 이는 state에 대한 LED이다.

LED 점멸 : 기기 Pair 가능 상태

LED 꺼짐 : 연결 상태

HC-05, HC-06에는 VCC, GND, TX, RX 외에도 state, EN 단자가 있다. state는 블루투스 상태를 출력하는 단자로 위 LED에 연결돼있다. EN 단자는 만약 블루투스가 연결 상태라면 강제로 신호를 주어 블루투스 연결을 끊을 수 있다.

728x90
반응형
반응형

아두이노 블루투스 모듈 중 가장 유명한 것은 HC-05, HC-06이다.

이번 블루투스 프로젝트를 진행하면서 많은 사람들이 놓치고 가는 것을 짚고 가려 한다.

이 글은 HC-05, HC-06 모듈이 있다는 가정하에 진행된다.

 

HC-05, HC-06

수중에 가지고 있는 블루투스 모듈인 HC-05이다.

HC-05, HC-06과 같은 블루투스 모듈은 사전에 프로그래밍 된 AT 명령어를 통해 쉽게 제어할 수 있어 많은 인기가 있다.

블루투스 모듈에는 이미 기능이 구현돼있으며, 우리는 AT 명령어만 사용하면 되니 굉장히 간편하다. 만약 블루투스 모듈을 구매하기 전이라면, UART to USB 도같이 구매하는 것을 추천하고 싶다.

이유는 나중에 아두이노 구조에 대해 설명할 때 작성하겠다.

 

선 연결

HC-05를 설정하기 위해 HC-05와 UART to USB를 연결해야 한다.

UART to USB는 HC-05, HC-06 와 컴퓨터 연결을 도와주는 역할을 한다. 만약 UART to USB를 구매하지 않았다면, 아두이노로 대체 가능하다.

UART to USB와 HC-05, HC-06의 선 연결은 그림과 같다. TX와 RX는 서로 교차하는 것이 맞다.

GND - GND

VCC(5V) - VCC(5V)

TX - RX

RX -TX

UART to USB와 HC-05, HC-06을 올바르게 연결했다면, UART to USB를 컴퓨터에 연결한다.

올바르게 연결됐으면, [장치 관리자]에서 확인할 수 있다.

 

Teraterm

터미널 프로그램인 teraterm은 인터넷에서 쉽게 다운로드 받을 수 있다. 아두이노 serial monitor을 사용해도 되는데 굉장히 답답하다.

1. Teraterm을 실행하면 아래와 터미널 창이 열린다. 시리얼 포트는 우리가 연결한 UART to USB를 선택한다.

2. [설정] - [시리얼 포트]를 클릭한다.

 

3. [시리얼 포트]를 클릭하여 HC-05, HC-06 모듈에 맞게 설정한다. 만약 처음 구매 시 사용하는 것이라면 기본적으로 아래와 같을 것이다. 만약 제대로 동작하지 않는다면 속도를 115200으로 다시 설정해 볼 것.

속도 (Baudrate) - 9600 or 115200

데이터 비트 - 8bit

패리티 비트 - none

스톱 비트 - 1bit

4. 이제 터미널을 설정해야 한다. [설정] - [터미널]을 클릭한다.

5. [줄바꿈]에서 수신(R)과 송신(M)을 CR에서 CR+LF로 변경한다. 왜 이렇게 변경해야 하는지는 나중에 포스팅하겠다. 우선 정의만 알고 넘어간다.

(CR : Carriage Return (\r) LF : Line Feed (\n). 해당 용어(CR, LF)와 이 용어들의 조합(CRLF)은 새로운 줄 (New line)으로 바꾸는 방식)

 

AT command 테스트

AT command를 사용하는 모듈 같은 경우, 처음 테스트를 위해 "AT"를 입력하여 "OK"를 확인다. 올바르게 UART to USB와 HC-05, HC-06 모듈이 연결됐다면, 터미널에 OK라고 출력된다. 만약 아무 값도 출력되지 않는다면, 위 과정을 천천히 다시 해본다.

 

그럼에도 아무 반응이 나오지 않는다면 추측건대 HC-05, HC-06의 UART 설정값을 올바르게 설정하지 않은 것이다. 나 같은 경우에도 예전에 사용했던 HC-05를 다시 사용하는 것이므로 설정값을 잊어 먹을 수 있으므로 모듈 뒤편에 설정값을 따로 적어 놓았다. 설정값을 따로 알 수 있는 방법이 없으므로, 결국 때려 맞추는 수밖에 없다.

 

HC-05 AT command 설정
1. 버전 확인
AT+VERSION  //  VERSION:3.0-20170609   OK

2. 블루투스 이름 "Test"로 변경
AT+NAME=Test  //  OK

3. 블루투스 이름 확인
AT+NAME?      // +NAME:Test   OK

4. 블루투스 연결을 위한 비밀번호 변경, 초기 비밀번호 : 1234
AT+PSWD=9999  // OK

5. 블루투스 비밀번호 확인
AT+PSWD?     // +PIN:"9999"

6. UART 설정 확인  
AT+ UART?    // +UART:115200,0,0

Baudrate는 115200으로 올렸지만, 스탑비트나 패리티 비트는 따로 설정하지 않았다.

더 다양한 AT명령어를 확인하기 위해 아래의 HC-05, HC-06 데이터시트를 확인하면 된다. 혹시 몰라 나는 HC-05 모듈을 사용하기 때문에 위 명령어를 사용했지만, HC-06 AT 명령어는 HC-05 명령어와 살짝 다르므로 HC-06 데이터시트를 따로 참고해야 한다.

HC-06 Datasheet.pdf
0.74MB
HC-05 Datasheet (4).pdf
0.82MB

728x90
반응형
반응형

https://blog.arduino.cc/2021/03/01/announcing-the-arduino-ide-2-0-beta/

 

Announcing the Arduino IDE 2.0 (beta) | Arduino Blog

The Arduino IDE is the well-known software we all use to program our boards. Its development started in 2005 based on the graphical interface of the Processing project and has never stopped since. During these years, countless hours of development by the A

blog.arduino.cc

 

아두이노 IDE를 사용하면서 자동완성, 디버깅하는 것이 굉장히 불편합니다. 많은 사람들이 Visual studio, Platform IO 등을 이용했습니다. 

 

2021년에 3월 후, Arduino IDE 2.0 베타를 다운로드할 수 있으며 해당 코드 리포지토리가 오픈 소스가 배포됐습니다.

 

우선 가장 마음에 드는 것은 인터페이스가 매우 친숙하다는 것입니다.  인터페이스는 기존 Arduino IDE를 유지하고 필요한 기능을 추가한 듯 합니다.

 

https://github.com/arduino/arduino-ide

 

GitHub - arduino/arduino-ide: Arduino IDE

Arduino IDE. Contribute to arduino/arduino-ide development by creating an account on GitHub.

github.com

Arduino IDE 2.0 설치

위 github 주소를 통해 자신의 OS에 맞춰 설치합니다. 

 

 

첫 번째, 추가된 기능으로 입력하는 동안 편집기는 포함된 라이브러리에 따라 변수 및 함수의 자동 완성을 제공합니다. 하지만, 아직 베타버전이라 생각보다 버그가 많아 제대로 되지 않을 때가 많습니다.

자동완성

두번 째, 제가 가장 마음에 들어하는 기능입니다. 변수나 함수를 마우스 오른쪽 버튼으로 클릭하면 상황에 맞는 메뉴에서 선언된 줄(및 파일)로 이동할 수 있는 탐색 바로 가기를 제공합니다. 아두이노 특성상 라이브러리를 분석할 때, github에서 찾아보곤 했는데, 변수 및 함수를 추적할 때 우클릭으로 쉽게 이용할 수 있습니다. 

이 또한,  가끔 어떠한 이유로 탐색기가 제대로 동작하지 않을 때가 있습니다. 

탐색기

세번 째, 보드에서 코드를 대화식으로 실행하고 실행을 검사할 수 있는 라이브 디버거입니다. 디버그 패널을 실행하고 실행을 일시 중지하고 변수의 내용을 검사할 중단점을 설정하기만 하면 됩니다. 즉석에서 변수의 내용을 변경하고 실행을 재개할 수도 있습니다.

라이브 디버거

네 번째, 현재 디버거는 SAMD 플랫폼(MKR 제품군, Nano 33 IoT, Zero)의 모든 Arduino 보드를 지원합니다. mbed 플랫폼(Nano 33 BLE, Portenta, Nano RP2040 Connect)에 대한 지원이 구현되고 있지만 시간이 걸릴 수 있습니다. 타사 보드용 Arduino 코어 유지 관리자는 관련 구성 매개변수를 추가하여 디버깅 지원을 추가할 수 있습니다. 이에 대한 기술 가이드가 제공됩니다. Segger J-link와 같은 디버깅 프로브를 보드의 SWD 핀에 연결해야 사용할 수 있습니다.

 

큰 특징으로 자동완성, 탐색기, 라이브 디버거, 타사 보드 지원이 있습니다. 

 

처음 설치 후, 사용해보면 인터페이스는 크게 바뀌지 않았기 때문에 쓰는데 큰 지장은 없습니다. 하지만 팁을 하나 드리자면, 시리얼 모니터를 사용할 때 입니다. 

시리얼 모니터에 값을 입력할 때, 엔터가 아니라 Ctrl + 엔터 키입니다. 저는 제대로 읽어보지 않고 엔터키만 갈겼는데 여러분들은 조심하시길 바랍니다. 

 

베타 버전이므로, 아직 잔 버그가 많습니다. 그 부분을 유의하고 사용하시면 문제 없습니다. 

728x90
반응형
반응형

안녕하세요. 아두이노 MQ Series PPM으로 변환하기 번외 편입니다. 

 

저번 글은 회로도를 보았고, 오늘은 파이썬으로 PPM으로 변환하도록 하겠습니다.

 

파이썬으로 굳이 사용한 이유는 급하게 실험하느라, 센서 값을 PPM으로 변환하지 않고 그대로 CSV파일 형식으로 받았기 때문에 파이썬으로 데이터를 전처리해야만 했습니다.

 

import csv
import numpy as np
import math
import matplotlib.pyplot as plt

"""
PPM 
VCC = 3.3V
RL = 10k

VL = VCC*(RL/(RS+RL)
RS = (RL*VCC)/VL-RL

PPM = a * ratio * b
"""

vcc = 3.3
rl = 10
mq3, mq4, mq6, mq7, mq8, mg811 = 7, 8, 9, 10, 11, 12


#  Calculate Rs 
def rs_cal(vl):
    return ((vcc * rl) / vl) - rl


# Calculate Ro
def ro_cal(rs, num, clean_air_ppm):
    ro_tmp = 0
    for i in range(num):
        ro_tmp += rs[i] / clean_air_ppm
    return ro_tmp/num


# Calculate ratio 
def ratio_cal(rs_, ro_):
    return rs_/ro_


# Calculate PPM 
def ppm_cal(ratio, a, b):
    return a * pow(ratio, b)

# Calculate logscale PPM
def ppm_log_cal(ratio, a, b):
    return (math.log10(ratio)-b)/a


def co2_cal(adc_v):
    return pow(10, ((adc_v / 8.5) - 0.220) / (0.020 / (2.602 - 3)) + 2.602)


constant = {"mq3": ['Alcohol', "mq3", 0.3934, -1.504],
            "mq4": ['CH4', "mq4", 1012.7, -2.786],
            "mq6": ['LPG', "mq6", 1009.2, -2.35],
            "mq7": ['CO', "mq7", 99.042, -1.518],
            "mq8": ['H2', "mq8", 976.97, -0.688]}


file_name_1 = '2020923_105132.csv'
file_name_2 = '2020923_113418.csv'
file_name_3 = '2020923_125810.csv'

header = ['boot_ms[ms]',
          'latitude[degE7]', 'longitude[degE7]', 'relative altitude[mm]',
          'local position x[m]', 'local position y[m]', 'local position z[m]',
          'mq3', 'mq4', 'mq6', 'mq7', 'mq8', 'mq811',
          'PM1.0', 'PM2.5', 'PM10.0', 'ozone', 'gamma']


csv_1 = np.loadtxt(file_name_1, delimiter=",")
# file = np.vstack([header, csv_1])

adc_v_list = []
rs_list = []
ratio_list = []
ppm_list = []

tmp = []

for i in range(len(csv_1)):
    adc_v_list.append(csv_1[i][mq4])

for i in range(len(csv_1)):
    rs_list.append(rs_cal(csv_1[i][mq4]))

ro = ro_cal(rs=rs_list, num=10, clean_air_ppm=4.4)

for i in range(len(csv_1)):
    ratio_list.append(ratio_cal(rs_list[i], ro))

for i in range(len(csv_1)):
    ppm_list.append(ppm_cal(ratio_list[i], constant['mq4'][2], constant['mq4'][3]))

time = []

for i in range(len(csv_1)):
    time.append((csv_1[i][0]-csv_1[0][0])/1000/60)

print("time :", time)
print("adc_v :", adc_v_list)
print("ro :", ro)
print("rs :", rs_list)
print("ratio : ", ratio_list)
print("ppm :", ppm_list)
print("clean air :", 1012.7 * pow(4.4, -2.786))

plt.plot(time, [300 for _ in range(len(csv_1))], color='red')
# plt.plot(time, [10000 for _ in range(len(csv_1))], color='red')
plt.plot(time, ppm_list, color='green')
plt.xlabel('[Minute]')
plt.ylabel('[PPM]')
plt.title("MQ4 - CH4( 300~10000ppm )")
plt.show()

 

위 소스코드 같은 경우는 프로젝트에서 중요하다고 생각한 부분만 가져왔습니다. 

 

아래는 PPM으로 변환할 때 필요한 함수입니다.

#  Calculate Rs 
def rs_cal(vl):
    return ((vcc * rl) / vl) - rl


# Calculate Ro
def ro_cal(rs, num, clean_air_ppm):
    ro_tmp = 0
    for i in range(num):
        ro_tmp += rs[i] / clean_air_ppm
    return ro_tmp/num


# Calculate ratio 
def ratio_cal(rs_, ro_):
    return rs_/ro_


# Calculate PPM 
def ppm_cal(ratio, a, b):
    return a * pow(ratio, b)

# Calculate logscale PPM
def ppm_log_cal(ratio, a, b):
    return (math.log10(ratio)-b)/a

 

그리고 기억은 잘나지 않지만, CO2 센서는 위 공식 말고 다른 식을 사용합니다. 

# Calculate CO2 PPM
def co2_cal(adc_v):
    return pow(10, ((adc_v / 8.5) - 0.220) / (0.020 / (2.602 - 3)) + 2.602)

 

1편

coding-yoon.tistory.com/98

 

[아두이노] MQ 시리즈 공기질 센서 PPM으로 변환하기! (1) Feat. MQ2, MQ3, MQ4, MQ5, MQ6, MQ7, MQ8, MQ9, MG-811

안녕하세요. 약 두 달만에 글을 씁니다. 공모전과 기사 시험의 지옥을 뒤로 잠시 여유가 생겨 시간을 냅니다. 오늘은 MQ 시리즈에서 공기질 센서를 PPM으로 변환하는 방법에 대해 글을 쓰겠습니

coding-yoon.tistory.com

 

2편

coding-yoon.tistory.com/121

 

[아두이노] MQ 시리즈 공기질 센서 PPM으로 변환하기! (2) 회로도 (Schematic)

안녕하세요. MQ시리즈 두 번째 글을 작성합니다. 확실히 글은 바로 바로 작성하는 것이 중요한 것 같습니다. 글을 쓰려고 보니 기억이 안 나서 다시 새로 공부했습니다. 저번 글은 아두이노 라이

coding-yoon.tistory.com

 

728x90
반응형
반응형

안녕하세요. 

 

MQ시리즈 두 번째 글을 작성합니다. 

 

확실히 글은 바로 바로 작성하는 것이 중요한 것 같습니다. 글을 쓰려고 보니 기억이 안 나서 다시 새로 공부했습니다.

 

저번 글은 아두이노 라이브러리를 이용하여 단순히 PPM을 구하였다면, 오늘은 조금 더 자세히 회로를 통해 좀 더 MQ 시리즈와 친해지는 것이 목적입니다. 

coding-yoon.tistory.com/98

 

[아두이노] MQ 시리즈 공기질 센서 PPM으로 변환하기! (1) Feat. MQ2, MQ3, MQ4, MQ5, MQ6, MQ7, MQ8, MQ9, MG-811

안녕하세요. 약 두 달만에 글을 씁니다. 공모전과 기사 시험의 지옥을 뒤로 잠시 여유가 생겨 시간을 냅니다. 오늘은 MQ 시리즈에서 공기질 센서를 PPM으로 변환하는 방법에 대해 글을 쓰겠습니

coding-yoon.tistory.com

 

 

MQ Series Schematic 를 구글링 하면 굉장히 많은 회로도가 나옵니다.

 

그중 가장 직관적인 회로도를 가져왔습니다. 

 

어려운 회로도가 아니기 때문에 편하게 보시면 될 것 같습니다. 

 

Heater가 회로에 있습니다. MQ 원리는 Heater를 통해 기체를 태운 반응으로 측정을 하는 방법입니다. 

 

센서가 어느 정도 가열이 돼야 센서 값의 신뢰도가 높아지므로 실내용 공기 센서로 많이 알려져 있습니다.

(이런 센서를 가지고 드론에 달았으니...)

 

이 회로를 쉽게 읽을 수 있게 다르게 그리겠습니다. 

 

이렇게 표현하면 전자회로를 한 번이라도 들은 사람이라면 많이 본 회로입니다. 

 

전압 분배 법칙을 이용해서 Vout을 구할 수 있습니다. 

 

1. Vcc는 아두이노에서 인가한 전압

2. Rs는 센서 저항으로 공기질에 대한 센서 저항

3. RL은 아래와 같이 감도조정이라고 십자 드라이버로 돌리는 곳이 있습니다. ( 최대로 돌리면 10Ω )

 

 

 

 

① Rs 구하기 

전압분배법칙

 

 

정리1
정리2
정리3 

 

② Ratio 구하기 ( 1편을 보시면 쉽게 알 수 있습니다. )

 

*Rs = 센서저항 

*Ro = 칼리브레이션 저항 

 

 

③ PPM 구하기 

// a, b 는 상수

 

Result = a * ratio ^ b[ppm]

 

 

이런 순서로 보시면은 괜찮을 것 같습니다.

728x90
반응형

+ Recent posts