BASIC4MCU | 질문게시판 | 아두이노와 파이썬(중점좌표) 시리얼 통신 질문드립니다.
페이지 정보
작성자 아두이노어렵잖아 작성일2023-03-16 19:10 조회341회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22348
첨부파일
본문
안녕하세요.
우선 우분투 환경에서 파이썬을 사용하여 yolov5를 통하여 딥러닝을 실행하였습니다.
딥러닝 바운딩박스의 중심좌표를 아두이노에 전달하고, 그 전달된 좌표로 모터를 움직이도록 구동하는 것이 최종 목표인 대학생입니다.
아두이노 : 아두이노 메가2560 사용
포트 : /dev/ttyACM0/ 알맞게 설정
프로그래머 : 아두이노 as ISP 사용
<파이썬내 yolov5의 detect.py 안에 중점좌표 + 시리얼 통신 코드를 추가>
# Write results for *xyxy, conf, cls in reversed(det): c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])) center_point = round((c1[0]+c2[0])/2), round((c1[1]+c2[1])/2) cv2.circle(im0,center_point,5,(0,255,0),2) cv2.putText(im0,str(center_point),center_point,cv2.FONT_HERSHEY_PLAIN,2,(0,0,255)) # 아두이노와 시리얼 통신을 위한 설정 ser = serial.Serial('/dev/ttyACM0', 9600) # 포트와 전송속도는 아두이노에 맞게 설정 # 중점 좌표 시리얼 통신 전송 center_points = [(c1,c2)] for center_point in center_points: x, y = center_point obj_name = "person" # obj_name에 적절한 값 입력 ser.write(f"{obj_name}:{x},{y}\n".encode()) ser.flush() ser.close() # 데이터 전송 def send_data(obj_name, x, y): # 데이터 전송 코드 pass<아두이노의 코드>void setup() {Serial.begin(9600);}void loop() {if (Serial.available()) {String data = Serial.readStringUntil('\n'); // 데이터를 읽어서 문자열로 저장if (data.length() > 0) { // 입력된 데이터가 있는 경우에만 처리Serial.println(data); // 데이터를 시리얼 모니터에 출력}}}하지만 코딩을 조금씩 수정해도 계속 해서 오류가 나고 시리얼 모니터로 좌표를 전달 받는것을 확인하고 싶지만 너무나 많은 시행착오를 겪고 있는 중입니다.
+
다음과 같이 한번의 좌표만 전달 되고 바로 웹캠이 꺼지는 현상이 발생합니다.
어떤 부분이 잘못 되었는지 감이 잡히지 않습니다. 오류가 나지 않고 계쏙해서 좌표를 전달 받을 수 있는 방법을 알고 싶습니다.
댓글 1
조회수 341master님의 댓글
master 작성일
2바이트가 넘는 데이터 및 2개 이상의 데이터 전송 시에는 데이터포멧을 만들어서 전송해야 합니다.
가급적 수신 측 입장을 고려해서 전송해야 하고요
X,Y 좌표 숫자와 구분자(',') 및 종료코드('\n')만으로 작성하시고
아두이노 GPS 예제를 참고해서 파싱해보세요