Я пытаюсь закодировать машину следящего за линией, используя Raspberry Pi с камерой, Arduino и драйвером двигателя l298n. Я пытаюсь заставить Raspberry Pi связываться с Arduino с помощью последовательного порта USB, и я немного борюсь.
Вот код, который у меня есть для Arduino:
#define leftEnable 6 // EnA
#define leftReverse 8 // IN1
#define leftForward 9 // IN2
#define rightEnable 5 //EnB
#define rightReverse 11 //IN4
#define rightForward 10 //IN3
void setup() { // put your setup code here, to run once:
pinMode(leftEnable, OUTPUT);
pinMode(rightEnable, OUTPUT);
pinMode(leftReverse, OUTPUT);
pinMode(rightReverse, OUTPUT);
pinMode(leftForward, OUTPUT);
pinMode(rightForward, OUTPUT);
// Configure for forward direction only
digitalWrite(leftReverse, LOW);
digitalWrite(rightReverse, LOW);
digitalWrite(leftForward, HIGH);
digitalWrite(rightForward, HIGH);
}
void loop() { // put your main code here, to run repeatedly:
analogWrite(leftEnable, 255);
analogWrite(rightEnable, 255);
delay(1000);
// Slow down
analogWrite(leftEnable, 200);
analogWrite(rightEnable, 200);
delay(1000);
//stop
analogWrite(leftEnable, 0);
analogWrite(rightEnable, 0);
delay(2000);
//turn right
analogWrite(leftEnable, 255);
analogWrite(rightEnable, 0);
delay(1000);
analogWrite(leftEnable, 0);
analogWrite(rightEnable, 255);
delay(1000);
}
И для малины:
import serial
import time
import numpy as np
import cv2
from picamera import PiCamera
with PiCamera() as src:
src.resolution = (640,480)
src.framerate = 20
src.shutter_speed = 75000
output = np.empty((480,640, 3), dtype=np.uint8)
while(True):
start_time = time.time()
src.capture(output, format='bgr', use_video_port=True)
gray = cv2.cvtColor(output, cv2.COLOR_BGR2GRAY)
gray[gray < 50] =0
gray[gray > 50] = 255
top_center = np.average(np.where(gray[0] ==0 ))
bottom_center = np.average(np.where(gray[-1] ==0))
if top_center - bottom_center > 25:
print("Turn right")
elif top_center - bottom_center <-25:
print("Turn left")
else:
print("Stay on course")
cv2.imshow('Output', output)
key = cv2.waitKey(1)&0xFF
if key==ord("q"):
break
cv2.waitKey(8)
cv2.destroyAllWindows()
«Я немного борюсь» — это не вопрос. С чем вы боретесь? Что делает код? Что вы ожидаете от кода? Пожалуйста, прочитайте страницы справочного центра и пройдите тур, чтобы узнать, как написать хороший вопрос для этого сайта.
Вам не хватает команд последовательного порта на обоих концах. Отправлять команды на последовательный порт, как это на raspberry pi
ser = serial.Serial()
ser.baudrate = 19200
ser.port = '/dev/ttyACM0'
ser.write(b'L') # send codes like 'L' for left,;'R' for Right
Читать команды на ардуино вот так
void setup() {
// initialize serial:
Serial.begin(19200);
}
void loop() {
while (Serial.available() > 0) {
if (Serial.read() == 'L'){
// write code for left turn
}
}
}
Совет: удалите все лишние пустые строки. Это заставляет ваш код прокручиваться и его становится намного труднее понять.