jatson과 gps모듈을 연결시켜 gps값을 보기가 생각보다 쉽지 않았다.(나의 검색 실력이 부족했을 수도...)
jatson에 올려둔 우분투 환경의 터미널에서 아래와 같은 명령어를 치면 쉽게 gps값을 볼 수 있었다.
git clone https://github.com/JetsonHacksNano/UARTDemo
cd UARTDemo/
ls
sudo python3 uart_example.py
systemctl stop nvgetty
systemctl disable nvgetty
udevadm trigger
sudo python3 uart_example.py
import serial
import signal
import threading
port = '/dev/ttyTHS1' # 시리얼 포트
baud = 9600 # 시리얼 보드레이트(통신속도)
line = []
exitThread = False # 쓰레드 종료용 변수
class Gps:
def __init__(self):
self.lon = 0
self.lat = 0
#쓰레드 종료용 시그널 함수
def handler(signum, frame):
exitThread = True
#데이터 처리할 함수
def parsing_data(self, data):
tmp = ''.join(data)
data_list = list(tmp.split(','))
if data_list[0] == '$GPGGA':
if data_list[3] == 'N':
self.lat = float(data_list[2][:-7]) + float(data_list[2][-7:]) / 60
if data_list[5] == 'E':
self.lon = float(data_list[4][:-7]) + float(data_list[4][-7:]) / 60
# print(tmp)
#본 쓰레드
def readThread(self, ser):
global line
global exitThread
# 쓰레드 종료될때까지 계속 돌림
while not exitThread:
#데이터가 있있다면
for c in ser.read():
#line 변수에 차곡차곡 추가하여 넣는다.
line.append(chr(c))
if c == 10: #라인의 끝을 만나면..
#데이터 처리 함수로 호출
self.parsing_data(line)
in_str = "S, " + str(self.lat) + ', ' + str(self.lon) + ", E"
ser.write(in_str.encode('utf-8'))
#line 변수 초기화
del line[:]
def detect_gps(self):
#종료 시그널 등록
signal.signal(signal.SIGINT, self.handler)
#시리얼 열기
ser = serial.Serial(port, baud, timeout=0)
#시리얼 읽을 쓰레드 생성
thread = threading.Thread(target=self.readThread, args=(ser,))
#시작!
thread.start()
#include <HardwareSerial.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
HardwareSerial lcd_display(2); //3개의 시리얼 중 2번 채널을 사용
String inputString = "";
String sub = "";
float indata[5]={0,0,0,0,0};
int ind = -1;
int inds = -1;
void setup() {
Serial.begin(115200);
lcd_display.begin(9600, SERIAL_8N1, 16, 17);/// RX핀번호, TX핀번호
tft.init();
tft.fillScreen(TFT_BLACK);
tft.setRotation(1);
tft.setTextColor(TFT_WHITE,TFT_BLACK);
}
void loop() {
if (lcd_display.available()) {
Serial.print('a');
char inChar = (char)lcd_display.read();
inputString += inChar;
if (inChar == 'E') {
Serial.println(inputString);
inds=inputString.indexOf('S');
sub=inputString.substring(inds+1,inputString.length());
for(int i=0;i<5;i++){
ind=sub.indexOf(',');
if(ind!=-1){
indata[i]=sub.substring(0,ind).toFloat();
if(isnan(indata[i]))indata[i]=0;
sub=sub.substring(ind+1,sub.length());
}
}
String N = String(indata[1]);
String E = String(indata[2]);
tft.fillRect(0,0,160,40,TFT_BLACK);
tft.drawString(inputString,0,0);
tft.drawString("N:"+N,0,10);
tft.drawString("E:"+E,0,20);
inputString = "";
}
}
}