Ви не увійшли.
Доброго дня суток!
Работаю над роботом(Line follower), который должен определять по камере траектрорию линии. Передача данных осуществляется через serial порт. Проблема в том что робот работает только при отправке данных один раз за секунду. Если быстрее, то не получается. Можете подсказать как можно убрать эту задержку и сделать так чтоб ардуино принимал данные несколько раз за секунду.
Ниже приведен код на Ардуино и Python для ПК
int value;
int absoluteVal;
int derVal;
int in1 = 7;
int in2 = 6;
int in3 = 5;
int in4 = 4;
int ena = 9;
int enb = 3;
boolean stringComplete;
void setup()
{
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ena, OUTPUT);
pinMode(enb, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
digitalWrite(ena, LOW);
digitalWrite(enb, LOW);
Serial.begin(9600);
}
void loop()
{
if (stringComplete == true)
{
if (value == 10) {
analogWrite(ena, 70);
analogWrite(enb, 0);
}
else if (value == 20) {
analogWrite(ena, 70);
analogWrite(enb, 25);
}
else if (value == 30) {
analogWrite(ena, 70);
analogWrite(enb, 50);
}
else if (value == 40) {
analogWrite(ena, 70);
analogWrite(enb, 70);
}
else if (value == 50) {
analogWrite(ena, 50);
analogWrite(enb, 70);
}
else if (value == 60) {
analogWrite(ena, 25);
analogWrite(enb, 70);
}
else if (value == 70) {
analogWrite(ena, 0);
analogWrite(enb, 70);
}
else {
analogWrite(ena, 0);
analogWrite(enb, 0);
}
stringComplete = false;
}
}
void serialEvent()
{
if (Serial.available())
{
value = Serial.parseInt();
stringComplete = true;
}
}
import imutils
import numpy as np
import cv2
import serial
import threading
import time
flag = 0
lastTime = 0
global D
global thread1
class myThread (threading.Thread):
def __init__(self, distance):
threading.Thread.__init__(self)
self.distance = distance
def run(self):
send_data(self.distance)
def send_data(data):
global lastTime
millis = int(round(time.time()*1000))
if millis-lastTime>=500:
if (data > 100):
d = 70
print("Повернуть на право на", D)
ser.write(str(d).encode())
elif (abs(data) < 100 and abs(data) > 0):
d = 40
print("Прямо", abs(D))
ser.write(str(d).encode())
elif (data < -100):
d = 10
print("Повернуть на лево на", D)
ser.write(str(d).encode())
elif(data == 0):
d = 0
print("stop")
ser.write(str(d).encode())
lastTime = millis
ser = serial.Serial(
port='\\\\.\\COM10',
baudrate=9600,
parity=serial.PARITY_ODD,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
cap = cv2.VideoCapture(1)
while True:
D = 0
_, frame = cap.read()
blurred = cv2.GaussianBlur(frame, (5, 5), 0)
hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)
part_1 = hsv[140:240, 0:640]
part = frame[140:240, 0:640]
lower_b = np.array([0, 60, 118])
upper_b = np.array([179, 255, 221])
mask = cv2.inRange(part_1, lower_b, upper_b)
# find contours in the mask image
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# loop over the contours
for c in cnts:
# compute the center of the contour
M = cv2.moments(c)
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
else:
cX, cY = 0, 0
# draw the contour and center of the shape on the image
area = cv2.contourArea(c)
if (area > 5000):
cv2.drawContours(part, [c], 0, (0, 255, 0), 2)
cv2.circle(part, (cX, 60), 7, (255, 255, 255), -1)
D = (320 - cX)
else:
D = 0
thread1 = myThread(D)
thread1.start()
cv2.circle(part, (320, 60), 7, (0, 0, 255), -1)
cv2.imshow("frame", frame)
key = cv2.waitKey(10) & 0xFF
if key == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
Неактивний
Я вот вижу что у вас в коде на питоне стоит задержка 500мс (if millis-lastTime>=500). Или имеется в виду что если ее уменьшить, то возникают какие-то проблемьі? Если да, то какие именно?
Неактивний