라즈베리파이에 온/습도 센서인 DHT-11은 GPIO핀에 그냥 꽂고, 기존에 퍼져있는 Adafruit의 라이브러리를 사용하니
금방 해결되었습니다. 하지만 먼지 센서인 PM1001은 자료가 별로 없었습니다. 심지어 영어로된 자료 조차도....
한글로 포스팅하신 분이 한분 계셨는데 그나마 파이썬이 아닌 C언어로 짜셨고, WiringPi 라이브러리를 사용하셨네요.
해당 블로그로 이동
저는 무조건 파이썬으로 해결하고 싶어서 그냥 뛰어들었습니다. 운영체제는 라즈베리안이 아닌 Ubuntu Mate입니다.
PM1001 센서를 라즈베리파이3에 연결하고 사용하기 위해서는
1. 물리적인 핀 연결
2. 코드 상의 시리얼 확인, 포트 확인
3. 신호를 주고 받아 데이터가 제대로 나오는지 확인
4. 데이터를 실제 사용되는 단위로 변환
해야 합니다.
먼저 주의 해야 할 점은 PM1001은 UART 통신을 합니다. UART 통신이란?
시리얼 통신입니다. 센서에서 나오는 TX, RX 핀의 경우 5V로 나오지만 라즈베리파이에서 나오는 TX, RX핀의 경우 3.3V입니다.
이 상태 그대로 연결했다가는 전압의 차이로 인해 얼마 못가서 라즈베리파이가 망가질 확률이 높습니다.
이 상황을 해결하기 위해 나온 물건이 "레벨 컨버터"라고 있지만, 너무 비싸서.... 그냥 저항 분압을 사용하기로 합니다.
네이버지식인이지만설명이있는 저항분압이란?
저항과 핀을 연결해서 전압을 다운시키는 방법입니다.
1. 핀을 연결하는 방법은 다음과 같습니다. 제가 만든 것이 아니라 링크로 대체합니다. 사진보기
주의해야 할 점은 저항은 1Kohm 이상을 사용하셔야 합니다.
2. 핀을 다 연결하신 후에는 라즈베리파이에서 센서를 제대로 인식을 하는지 확인해야 합니다.
저는 파이썬을 이용하기로 했으니, 다음과 같이 입력해 현재 연결되어있는 포트를 확인합니다.
"python -m serial.tools.list_ports"
아무 설정도 하지 않고 포트 확인을 했을 경우 "/dev/ttyAMA0"가 나옵니다. 실제로도 사용하는 포트는 이 포트입니다.
설명서에는 pyserial을 사용해서 해당 포트로 특정 값을 보내라고 나와 있습니다. 설명서1 설명서2
하지만 실제로 해보면 아무 반응도 오지 않습니다. 이 부분에서 헤매다가 찾아보니 원인은 라즈베리파이에 있었습니다.
관련링크1 관련링크2 관련링크3
라즈베리파이3는 와이파이와 블루투스 모듈이 내장되어 있습니다. 라즈베리파이2 까지는 없던 항목입니다.
하여 UART 통신 관련 기능을 찾아보면 cmdline.txt에서 tty관련 항목을 제거하라는 부분이 있는데 우분투 때문인지는 확인하지 못했지만
라즈베리파이3에서는 관련 항목이 존재하지 않습니다. *해당항목은 확인 후 수정하겠습니다.
원인은 내장 블루투스 였습니다. 내장 블루투스가 "/dev/ttyAMA0" 포트를 차지하고 있어 해당 포트를 사용해도 아무 반응이 없습니다.
그래서 내장 블루투스를 죽이고 해당 포트를 사용하는 방법이있습니다. 위의 관련링크1 에 해당 방법이 존재합니다.
The latest emonSD for
emonPi / emonBase seemed to work out of the box with the RasPi3,
however it became apparent that something rather important was
missing...serial comms with the emonPi's ATmega328!
The emonPi communicates with the RasPi via GPIO 14/15 which on the
Model B,B+ and Pi2 is mapped to UART0. However on the Pi3 these pins are
mapped to UART1 since UART0 is now used for the Bluetooth module.
However UART1 is software UART and baud rate is dependent to clock speed
which can change with the CPU load, under voltage and temperature;
therefore not stable enough. One hack is to force the CPU to a lower
speed ( add core_freq=250 to /boot/cmdline.txt)which cripples the Pi3
performance.
A better solution for the emonPi is to disable BT and map UART1 back
to UART0 (ttyAMA0) so we can talk to the emonPi in the same way as
before.
First update:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rpi-update
To disable onboard Pi3 Bluetooth and restore UART0/ttyAMA0 over GPIOs 14 & 15 modify:
sudo nano /boot/config.txt
Add to the end of the file
dtoverlay=pi3-disable-bt
We also need to run to stop BT modem trying to use UART
sudo systemctl disable hciuart
See RasPi device tree commit for pi3-disable-bt and raspi forum thread discussion.
Reboot and test serial coms with:
sudo minicom -D /dev/ttyAMA0 -b38400
입니다. 해당 방법을 적용한 후에 다시 신호를 보내면 정상 작동합니다.
이로써 시리얼 포트에 관련된 에러는 해결 했습니다. 이제 파이썬으로 코드를 작성하고, 변환하는 일이 남았습니다.
너무 길어서 파트2에서 쓰도록하겠습니다.