가끔 블로그를 보면 아두이노와 블루투스 모듈을 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을 사용하면 된다. 이것에 대한 팁은 나중에 올리려고 한다.
코드는 굉장히 간단하다. 블루투스로 수신 받은 값을 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 단자는 만약 블루투스가 연결 상태라면 강제로 신호를 주어 블루투스 연결을 끊을 수 있다.
설정을 건들면서 error가 발생하여 되지 않을 경우, log를 확인하면서 error를 고쳐야 함.
메모장으로 하는 것보다 VSCode 같은 편집기로 해야 실수가 덜 나옴. space 하나만 잘못쳐도 error 발생함.
블로그를 참고하면서 만들지만 500 error 메세지 발생. 서버까지 접근은 됐으나 내부 설정이 잘못되어 접근하지 못한 것.
C:\Apache24\logs\error.log
error는 error.log에 기록되므로 무슨 error인지 확인 가능.
[client 192.168.0.1:53099] AH01615: need AuthName: /data/
경로의 AuthName이 없어 error가 발생한 것.
# dav 관련 파일에 AuthName을 추가
C:\Apache24\conf\extra\httpd-dav.conf
DavLockDB "${SRVROOT}/var/DavLock"
Alias /data "Z:"
<Location "/data">
Dav On
# 인증 타입
AuthType Basic
#### 수정 사항 ####
AuthName WebDAV
###################
# You can use the htdigest program to create the password database:
# htpasswd -c "${SRVROOT}/user.passwd" admin
AuthUserFile "${SRVROOT}/user.passwd"
AuthGroupFile "${SRVROOT}/groups.htgroup"
AuthDigestProvider file
<RequireAny>
Require user admin
</RequireAny>
</Location>
<Directory "Z:">
Order Allow,Deny
Allow from all
AllowOverride None
Options Indexes
<RequireAny>
Require user admin
</RequireAny>
</Directory>
위 블로그를 따라하다 보면 오타가 조금씩 있음. 예를 들어 아래 코드를 그대로 긁어 왔는데 그대로 복붙으로 실행하면 에러 발생. "가 빠졌기 때문에 형식을 맞춰줘야 함.
cd C:\Apache24\bin
htpasswd.exe -c "C:\Apache24\user.passwd admin
cd C:\Apache24\bin
htpasswd.exe -c "C:\Apache24\user.passwd" admin
pandas_datareader을 이용해서 데이터 처리를 하기 위해 아래 문구처럼 에러문이 뜨는 경우가 있습니다.
FutureWarning: pandas.util.testing is deprecated. Use the functions in the public
API at pandas.testing instead. from pandas.util.testing import assert_frame_equal
아래 에러문이 뜨더라도 실제 코딩하는데는 아무 문제 없습니다.
위 에러문은 pandas.util.testing 에서 더 이상 사용되지 않기 때문에 뜹니다.
대신, pandas.testing에서 사용할 수 있으니 수정하라는 권고문 같은 정도입니다.
실행될 때마다 에러문이 발생하면 기분이 별로 좋지 않으니 에러문이 뜨지 않도록 수정해주겠습니다.
에러문 옆을 보면 pandas_datareader/compat/__init__.py에서 7번 째 줄에서 해당 에러문이 발생하는 것을 알 수 있습니다.