3일차 라즈베리파이 색깔 추적 자동차 코딩하기 | ||
안녕하세요~!!
구독자 여러뷴~
디바이스마트 엔지니어 흥프로 입니다~~!!~!
이번 포스팅은
3일차 라즈베리파이 색깔 추적 자동차 코딩하기를 할 껍니다.!!
아래 1일차에서 구성 목록 보시고 준비 해주시면 됩니다.!!
https://devicemart.blogspot.com/2019/04/1_24.html
해보시고 안되면 댓글에 달아주세요!!
저도 직접 확인해보고 답글 달아 드릴께요!!
아래는 코드인데요!!!
1. follower_car.py를 만들고 코드1를 복사하여 저장합니다.
2. dc_motor.py를 만들고 코드2를 복사하여 저장합니다.
같은 폴더내에 두 파일이 존재 해야 합니다.
복사 후에 들여쓰기 꼭 확인 바랍니다.
3. 코드 실행
$ python follower_car.py
3일차 라즈베리파이 색깔 추적 자동차 코딩하기를 할 껍니다.!!
아래 1일차에서 구성 목록 보시고 준비 해주시면 됩니다.!!
https://devicemart.blogspot.com/2019/04/1_24.html
라즈베리파이는 아두이노와 다르게 공부가 많이 필요한 플렛폼이니까
이거 해보시고 왜 그런지 어떻게 되는지 확인 하셔야 해요!!
해보시고 안되면 댓글에 달아주세요!!
저도 직접 확인해보고 답글 달아 드릴께요!!
아래는 코드인데요!!!
1. follower_car.py를 만들고 코드1를 복사하여 저장합니다.
2. dc_motor.py를 만들고 코드2를 복사하여 저장합니다.
같은 폴더내에 두 파일이 존재 해야 합니다.
복사 후에 들여쓰기 꼭 확인 바랍니다.
3. 코드 실행
$ python follower_car.py
코드 1은 OpenCV기반 라이브러리를 활용해서 짜여진 코드입니다.
감지 영역 설정 및 감지 되는 대상의 모양을 같이 사용하였고
그 대상이 파란색이고 원이면 인식을 합니다.
감지 범위에 따라 실행될 함수가 다릅니다.
예를 들어 왼쪽 영역에 감지가 되면
왼쪽으로 차체를 틀어서 중앙으로 맞추려고 합니다.
또한 인식 되는 원의 크기에 따라서 전 후진을 결정하며,
일정 크기 이하면 전진
일정 크기 이상이면 정지
일정 크기 보다 더 크면 후진
이런 루틴으로 코딩하였습니다.
코드 2는 모터 제어를 위한 파이썬 기반의 코드 입니다.
모터드라이버로 모터를 구동하기 위한 코딩입니다.
모터드라이버에서 모터 1,2를 Enable을 시키고
어떤 신호를 주었을때 좌 우 전 후 동작을 하는지
크기에 따른 전 후진 속도 조절을 위해 구역 별 속도로 제어 합니다.
여기에 함수를 만들면
감지 된 물체의 크기에 따라
속도 조절을 비율로 조절 하실 수도 있겠죠?
제가 최대한 안되는 영어로 설명을 적어 드렸습니다.
복붙으로 바로 하시는것도 좋지만 한번 쯤 어떻게 코딩 되었는지
읽어보시고 분석해 보시는 것을 추천합니다.
저희는 공부 중이니까요!!!! ㅎㅎㅎ
솔직히 저도 OpenCV는 잘 몰라서
여기 저기서 공부해서 구현을 성공하였습니다..
감지 영역 설정 및 감지 되는 대상의 모양을 같이 사용하였고
그 대상이 파란색이고 원이면 인식을 합니다.
감지 범위에 따라 실행될 함수가 다릅니다.
예를 들어 왼쪽 영역에 감지가 되면
왼쪽으로 차체를 틀어서 중앙으로 맞추려고 합니다.
또한 인식 되는 원의 크기에 따라서 전 후진을 결정하며,
일정 크기 이하면 전진
일정 크기 이상이면 정지
일정 크기 보다 더 크면 후진
이런 루틴으로 코딩하였습니다.
코드 2는 모터 제어를 위한 파이썬 기반의 코드 입니다.
모터드라이버로 모터를 구동하기 위한 코딩입니다.
모터드라이버에서 모터 1,2를 Enable을 시키고
어떤 신호를 주었을때 좌 우 전 후 동작을 하는지
크기에 따른 전 후진 속도 조절을 위해 구역 별 속도로 제어 합니다.
여기에 함수를 만들면
감지 된 물체의 크기에 따라
속도 조절을 비율로 조절 하실 수도 있겠죠?
제가 최대한 안되는 영어로 설명을 적어 드렸습니다.
복붙으로 바로 하시는것도 좋지만 한번 쯤 어떻게 코딩 되었는지
읽어보시고 분석해 보시는 것을 추천합니다.
저희는 공부 중이니까요!!!! ㅎㅎㅎ
솔직히 저도 OpenCV는 잘 몰라서
여기 저기서 공부해서 구현을 성공하였습니다..
코드 1
|
#! /usr/bin/python
#################################################################################
# Copyright 2019 NTREX CO.
# http://www.ntrex.co.kr
# http://www.devicemart.co.kr/
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#################################################################################
# Authors: HeungPRO #
# Date : 16/01/2019
# Usage : follower_car.py
import cv2
import dc_motor as motor
# Set the color recognition range
# If you want a different color, change it.(Blue)
Color_Lower = (36,130,46)
Color_Upper = (113, 255, 255)
# Camera Frame Range and Setting
Frame_Width = 320
Frame_Height = 240
camera = cv2.VideoCapture(0)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, Frame_Width)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, Frame_Height)
try:
while True:
#Camera Option
(_, frame) = camera.read()
# Do gaussian blur if needed
frame = cv2.GaussianBlur(frame, (11, 11),1)
# Convert to HSV color space
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Convert to binary with given color
mask = cv2.inRange(hsv, Color_Lower, Color_Upper)
# Do erode if needed
#mask = cv2.erode(mask, None, iterations=2)
# Do dilate if needed
#mask = cv2.dilate(mask, None, iterations=2)
# Find the contours
_, contours,_ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
center = None
if len(contours) > 0:
# Find the max length of contours
c = max(contours, key=cv2.contourArea)
# Find the x, y, radius of given contours
((x, y), radius) = cv2.minEnclosingCircle(c)
# Find the moments
M = cv2.moments(c)
try:
# mass center
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
# process every frame
cv2.circle(frame, (int(x), int(y)), int(radius),(0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
# Forward, backward, Turn rules
# Size of the recognized object
if radius < 25 and radius > 5 :
if center[0] > Frame_Width/2 + 55 : #turnRight_Area Set
motor.turnRight()
elif center[0] < Frame_Width/2 -55 : #turnLeft_Area Set
motor.turnLeft()
else:
motor.forward_2() #Fast Run
elif radius < 45 and radius > 25 :
if center[0] > Frame_Width/2 + 55 :
motor.turnRight()
elif center[0] < Frame_Width/2 -55 :
motor.turnLeft()
else:
motor.forward_1() #Low Run
elif radius > 65:
motor.Reverse()
else:
motor.brake()
except:
pass
else:
motor.stop()
cv2.imshow("Frame", frame) # if you don't need to display and the car will get faster
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
finally:
motor.cleanup()
camera.release()
cv2.destroyAllWindows()
|
코드 2
|
#! /usr/bin/python
#################################################################################
# Copyright 2019 NTREX CO.
# http://www.ntrex.co.kr
# http://www.devicemart.co.kr/
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#################################################################################
# Authors: HeungPRO #
# Date : 16/01/2019
# Usage : dc_motor.py
import RPi.GPIO as GPIO
import time
#Delay time
t = 0.01
#Set Used GPIO
Motor_R1_Pin = 21
Motor_R2_Pin = 20
Motor_L1_Pin = 27
Motor_L2_Pin = 17
Enable_1 = 23
Enable_2 = 24
GPIO.setmode(GPIO.BCM)
GPIO.setup(Motor_R1_Pin, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Motor_R2_Pin, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Motor_L1_Pin, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Motor_L2_Pin, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Enable_1, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(Enable_2, GPIO.OUT, initial=GPIO.LOW)
pwm_e1 = GPIO.PWM(Enable_1, 500)
pwm_e2 = GPIO.PWM(Enable_2, 500)
pwm_e1.start(0)
pwm_e2.start(0)
# Use reverse rotation to hold the brakes.
def brake():
pwm_e1.ChangeDutyCycle(10)
pwm_e2.ChangeDutyCycle(10)
GPIO.output(Motor_R1_Pin, False)
GPIO.output(Motor_R2_Pin, True)
GPIO.output(Motor_L1_Pin, False)
GPIO.output(Motor_L2_Pin, True)
time.sleep(t)
GPIO.output(Motor_R1_Pin, False)
GPIO.output(Motor_R2_Pin, False)
GPIO.output(Motor_L1_Pin, False)
GPIO.output(Motor_L2_Pin, False)
print("BR")
# Use Stalled status
def stop():
pwm_e1.ChangeDutyCycle(100)
pwm_e2.ChangeDutyCycle(100)
GPIO.output(Motor_R1_Pin, False)
GPIO.output(Motor_R2_Pin, False)
GPIO.output(Motor_L1_Pin, False)
GPIO.output(Motor_L2_Pin, False)
print("s")
# Low speed
def forward_1():
pwm_e1.ChangeDutyCycle(40)
pwm_e2.ChangeDutyCycle(40)
GPIO.output(Motor_R1_Pin, True)
GPIO.output(Motor_R2_Pin, False)
GPIO.output(Motor_L1_Pin, True)
GPIO.output(Motor_L2_Pin, False)
print("F_L")
time.sleep(t)
# Fast speed
def forward_2():
pwm_e1.ChangeDutyCycle(65)
pwm_e2.ChangeDutyCycle(65)
GPIO.output(Motor_R1_Pin, True)
GPIO.output(Motor_R2_Pin, False)
GPIO.output(Motor_L1_Pin, True)
GPIO.output(Motor_L2_Pin, False)
print("F_F")
time.sleep(t)
# Reverse
def Reverse():
pwm_e1.ChangeDutyCycle(45)
pwm_e2.ChangeDutyCycle(45)
GPIO.output(Motor_R1_Pin, False)
GPIO.output(Motor_R2_Pin, True)
GPIO.output(Motor_L1_Pin, False)
GPIO.output(Motor_L2_Pin, True)
print("Re")
time.sleep(t)
# turnRight
def turnRight():
pwm_e1.ChangeDutyCycle(100)
pwm_e2.ChangeDutyCycle(100)
GPIO.output(Motor_R1_Pin, True)
GPIO.output(Motor_R2_Pin, False)
GPIO.output(Motor_L1_Pin, False)
GPIO.output(Motor_L2_Pin, True)
print ("T_R")
time.sleep(t)
# turnLeft
def turnLeft():
pwm_e1.ChangeDutyCycle(100)
pwm_e2.ChangeDutyCycle(100)
GPIO.output(Motor_R1_Pin, False)
GPIO.output(Motor_R2_Pin, True)
GPIO.output(Motor_L1_Pin, True)
GPIO.output(Motor_L2_Pin, False)
print("T_L")
time.sleep(t)
#If you want to test the motor, use the script below
#while True:
# a = input("")
# a = int(a)
# if a == 1:
# turnRight()
# elif a == 2:
# turnLeft()
# elif a ==3:
# forward()
# elif a ==4:
# Reverse()
#GPIO Initialization
def cleanup():
stop()
pwm_e1.stop()
pwm_e2.stop()
GPIO.cleanup()
|
오늘은 여기까지 포스팅하고요
추가로 궁금하신게 있으신 분들은
댓글 달아 주시면 답변 드리겠습니다~
▼▼▼라즈베리파이 3B+ 스타터 키트▼▼▼
http://www.devicemart.co.kr/goods/view?no=1385489
감사합니다!!~ 안뇽!!!
추가로 궁금하신게 있으신 분들은
댓글 달아 주시면 답변 드리겠습니다~
▼▼▼라즈베리파이 사러가기▼▼▼
▼▼▼가장 기본 구성 라즈베리파이 사러가기▼▼▼
▼▼▼라즈베리파이 3B+ 스타터 키트▼▼▼
http://www.devicemart.co.kr/goods/view?no=1385489
감사합니다!!~ 안뇽!!!
5 댓글
Exception has occurred: ValueError
답글삭제not enough values to unpack (expected 3, got 2)
File "/home/pi/COS/follower_car.py", line 36, in
_, contours, _= cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
위 에러로 실행이 안되는데 도움 부탁드려요.
안녕하세요 36번 라인에 문제가 있다네요 아마 OS가 부스터로 올라오면서 버전이 달라지며 생긴 문제 같아요 해당 내용으로 구글링 해보시면 해결법이 있긴 있을겁니다.
삭제작성자가 댓글을 삭제했습니다.
답글삭제작성자가 댓글을 삭제했습니다.
답글삭제안녕하세요 한파일에 follower_car.py와 dc-motor.py를 다 넣고
답글삭제코드를 붙여넣었는데
오류뜨는것도 고치고 실행을 했습니다
그런데 follower를 실행하니 결과창에 T-R 또는 F-F, F-L이 문자가 뜨는거보니 실행은 되는거같은데,,, 우선 카메라가 실시간으로 현재 현재 비추고있는 화면이 안뜹니다..
그냥 실행결과창에 F_F F_L 이런것만 쭉쭊 뜨고 카메라가 보고있는 창 이런게 안뜨네요,,,
한 파일에 follower_car.py와 dc_motor.py두개다 저장해놓고
그냥 follower_car만 디버깅하면 되는건가요?