두 장치간 데이터를 송수신 하는데, 유선통신
과 무선통신
이 있습니다.
무선통신은 노이즈 등 신뢰성이 보장되지 않는다.
간단한 데이터만 주고 받을 때는 GPIO
로도 충분하지만, 빠른 성능 및 다량의 신호
를 전달하기 위해서는 프로토콜
을 사용한다.
유선 통신 프로토콜 종류
1. UART
2. SPI
3. I2C - IspareC로 읽을것
4. CAN - 차량내 네트워크
무선 통신 프로토콜 종류
1. 적외선
2. RFID
3. 블루투스
4. Wifi
소수의 pin 으로 다량의 장치를 Control
MCU PC
간 신호를 주고 받음 - MCU 의 로그 데이터를 PC 에 전달함
센서 MCU
간 , 신호 전달 - 센서 모듈별로 사용하는 프로토콜이 다름
센서 구매할 때 , 통신 프로토콜 확인 필수
유선통신
= 직렬(Serial)통신 + 병렬(Parallel)통신
병렬은 다량의 신호를 한꺼번에 전달하기 위해 PIN
도 많이 필요하고, 전력소모도 크고 느리다
. 따라서, 직렬통신
을 더 많이 사용한다.
BMP 280
: 정밀한 대기압
센서, 온도
측정 가능하다.
SDA / SCL핀 이 존재하며, I2C 통신을 하는 센서이다
1. SDA : Serial Data
2. SCL : Serial Clock
I2C가 GPIO 연결보다 좋은점은 핀 2개
로 다량의 장치를 연결하여 각각 제어
할 수 있다.
VCC( 3.3V ), GND, SCL, SDA 연결한다. SDO / CSB 는 연결하지 않는다.
Slave 들은 자기만의 주소값
을 가진다. i2cdetect -y 1
를 통해 주소값을 확인할 수 있고 기억해두자!
I2C 값 읽기
import smbus
from time import sleep
DEVICE_BUS = 1
DEVICE_ADDR = 0x76 # 본인 Slave 주소
bus = smbus.SMBus(DEVICE_BUS)
while True:
a = bus.read_byte_data(DEVICE_ADDR, 0x00)
print(a)
sleep(0.5)
데이터시트 p.24 , p.27 참고한다.
import smbus
from time import sleep
DEVICE_BUS = 1
DEVICE_ADDR = 0x76
bus = smbus.SMBus(DEVICE_BUS)
while True:
a = bus.read_byte_data(DEVICE_ADDR, 0xFB)
b = bus.read_byte_data(DEVICE_ADDR, 0xFA)
c = bus.read_byte_data(DEVICE_ADDR, 0xFC)
print(a,b,c)
result = (a<<12) | (b<<4) | ((c&0xF0) >> 4)
print(result)
sleep(0.5)
한계점
: 온도 계산하는데에는 매우 복잡한 과정을 거쳐야 한다. 따라서, 저는 LIB
를 사용한다.
cmd 창에서 git clone https://github.com/pimoroni/bmp280-python
를 설치해준다.
cd bmp280-python
후 sudo ./install.sh
로 추가 설치해준다.
LIB 사용 코드
import time
from bmp280 import BMP280
from smbus import SMBus
bus = SMBus(1)
bmp280 = BMP280(i2c_dev=bus)
while True:
temperature = bmp280.get_temperature()
pressure = bmp280.get_pressure()
print('{:05.2f}*C {:05.2f}hPa'.format(temperature, pressure))
time.sleep(1)
Master/Slave 통신, 쌍방 동시 통신
가능, 빠르다
. 하지만, SPI는 4개 핀(CS, SCK, MOSI) 필요하다.
1. CS slave 선택 (chip select)
2. SCK : 클럭
3. MOSI : Master Out Slave In 마스터 말한다 , 슬레이브 듣는다
4. MISO : Master In Slave Out 마스터 듣는다 , 슬레이브 말한다