Jetson nano와 GPS모듈을 이용하여 GPS 값 받아오고 아두이노 디스플레이에 띄우기

YeongUk·2022년 7월 20일
3

Edge Computing

목록 보기
1/3
post-thumbnail

Jatson Nano Setting

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

Serial 통신 python code

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() 

Arduino display에 serial 값 출력

#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 = "";
    }
  }
}


profile
소통과 배움을 통해 개인이 가진 맹점을 극복하려 노력하고 있습니다.

0개의 댓글