캔위성대회 2차 통과하고 어느정도 캔위성 제작이 진행된김에 글을 써봅니다.
우리 팀은 이번 캔 위성 통신에 Xbee라는 통신모듈을 쓰기로 하였습니다.
우선 Xbee의 특성에 관해 소개해드리겠습니다.
Xbee란 무엇일까?
Xbee는 사진처럼 안테나, 고주파회로, 신호처리 회로 등 무선통신에 필요한 하드웨어가 통합되어있는 모듈입니다.
사양은 다음과 같습니다.
Specification
일반 Xbee S1 은 야외 최대 송수신 거리가 90m에 불과하므로 저의 선택지에서 아예 제외하였고, 최대 1.6km까지 송수신이 가능한 Xbee Pro S1으로 선택하였습니다.
세팅법은 https://xbplib.readthedocs.io/en/latest/getting_started_with_xbee_python_library.html을 참고하였습니다.
아래에서 보여드리는 코드는 라즈베리파이의 자이로 데이터를 Xbee를 통해 송신하는 코드입니다.
import smbus # import SMBus module of I2C
from time import sleep # import
from digi.xbee.devices import *
device = XBeeDevice("/dev/ttyUSB0",9600)
device.open()
device.set_sync_ops_timeout(1000)
remote_device = RemoteXBeeDevice(device, XBee64BitAddress.from_hex_string("주소값"))
# some MPU6050 Registers and their Address
PWR_MGMT_1 = 0x6B
SMPLRT_DIV = 0x19
CONFIG = 0x1A
GYRO_CONFIG = 0x1B
INT_ENABLE = 0x38
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
GYRO_XOUT_H = 0x43
GYRO_YOUT_H = 0x45
GYRO_ZOUT_H = 0x47
TEMP = 0x41
wait_time = 0.05
def MPU_Init():
# write to sample rate register
bus.write_byte_data(Device_Address, SMPLRT_DIV, 7)
# Write to power management register
bus.write_byte_data(Device_Address, PWR_MGMT_1, 1)
# Write to Configuration register
bus.write_byte_data(Device_Address, CONFIG, 0)
# Write to Gyro configuration register
bus.write_byte_data(Device_Address, GYRO_CONFIG, 24)
# Write to interrupt enable register
bus.write_byte_data(Device_Address, INT_ENABLE, 1)
def read_raw_data(addr):
# Accelero and Gyro value are 16-bit
high = bus.read_byte_data(Device_Address, addr)
low = bus.read_byte_data(Device_Address, addr + 1)
# concatenate higher and lower value
value = ((high << 8) | low)
# to get signed value from mpu6050
if (value > 32768):
value = value - 65536
return value
bus = smbus.SMBus(1) # or bus = smbus.SMBus(0) for older version boards
Device_Address = 0x68 # MPU6050 device address
MPU_Init()
# cycles = 1000000000
while 1:
# Read Accelerometer raw value
acc_x = read_raw_data(ACCEL_XOUT_H)
acc_y = read_raw_data(ACCEL_YOUT_H)
acc_z = read_raw_data(ACCEL_ZOUT_H)
# Read Gyroscope raw value
gyro_x = read_raw_data(GYRO_XOUT_H)
gyro_y = read_raw_data(GYRO_YOUT_H)
gyro_z = read_raw_data(GYRO_ZOUT_H)
# Full scale range +/- 250 degree/C as per sensitivity scale factor
Ax = acc_x / 16384.0
Ay = acc_y / 16384.0
Az = acc_z / 16384.0
Gx = gyro_x / 131.0
Gy = gyro_y / 131.0
Gz = gyro_z / 131.0
messages = '{},{},{},{},{},{}'.format(Ax, Ay, Az,Gx, Gy, Gz)
print('Sending Gyro: %s' % messages)
try:
# device.send_data_async(remote_device,'Sending Gyro Data')
device.send_data_async(remote_device,messages)
print('Data sent success')
except Exception as e:
print('Transmit Fail : %s' % str(e))
pass
sleep(wait_time)
여기서 중요한 부분은 두 부분입니다.
from digi.xbee.devices import *
device = XBeeDevice("/dev/ttyUSB0",9600)
device.open()
device.set_sync_ops_timeout(1000)
remote_device = RemoteXBeeDevice(device, XBee64BitAddress.from_hex_string("End Device 주소"))
device에서 원하는 포트, Baud Rate 를 각각 정해줍니다. 저는 라즈베리파이와 Xbee를 USB를 통해 연결하였기때문에 USB로 설정하였습니다.
그 다음으로 Try, Except를 통해 송신을 하고 실패했을시 무엇이 문제인지 표시해주는 코드를 작성합니다.
try:
# device.send_data_async(remote_device,'Sending Gyro Data')
device.send_data_async(remote_device,messages)
print('Data sent success')
except Exception as e:
print('Transmit Fail : %s' % str(e))
pass
sleep(wait_time)
Exception을 통해 송신이 불량할 경우 어떤것이 문제인지 즉각적으로 알 수 있습니다. 보통 통신모듈을 사용하는 경우 한번에 한개의 프로그램만 실행이 가능하므로 두개의 통신모듈을 이용한 프로세스를 돌렸을때 오류가 뜨게 됩니다.
다음은 라즈베리파이 제로에 Opencv를 단시간에 설치하는 방법을 포스팅하겠습니다. 감사합니다.
'Projects > CanSatellite' 카테고리의 다른 글
[캔위성] 2020 캔위성대회 수상 후기 (0) | 2020.10.15 |
---|---|
가상머신을 이용하여 크로스 컴파일(Cross Compile)을 이용한 라즈베리파이 제로 W OpenCV 설치 (0) | 2020.08.12 |
캔위성 대회 후기 (0) | 2020.08.11 |
프로젝트를 위한 NVIDIA Jetson 구입기 (0) | 2020.05.20 |
캔위성 프로젝트의 시작 (1) | 2020.05.18 |