Raspberry pi 4 к arduino через usb серийный номер для автомобиля-робота

Я пытаюсь закодировать машину следящего за линией, используя 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()

Совет: удалите все лишние пустые строки. Это заставляет ваш код прокручиваться и его становится намного труднее понять.

tadman 09.12.2020 20:49

«Я немного борюсь» — это не вопрос. С чем вы боретесь? Что делает код? Что вы ожидаете от кода? Пожалуйста, прочитайте страницы справочного центра и пройдите тур, чтобы узнать, как написать хороший вопрос для этого сайта.

AdrianHHH 09.12.2020 23:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам не хватает команд последовательного порта на обоих концах. Отправлять команды на последовательный порт, как это на 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
    }
  }
}

Другие вопросы по теме