#1 2020-05-15 09:46:59

Javokhir_Nurov
Учасник
Зареєстрований: 2020-05-15
Повідомлень: 1

Помогите настроить передачу данных с ПК(Python, Pyserial) на Ардуино

Доброго дня суток!
Работаю над роботом(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()

Неактивний

#2 2020-05-30 08:48:00

merlin
Учасник
Зареєстрований: 2020-05-30
Повідомлень: 3

Re: Помогите настроить передачу данных с ПК(Python, Pyserial) на Ардуино

Я вот вижу что у вас в коде на питоне стоит задержка 500мс (if millis-lastTime>=500). Или имеется в виду что если ее уменьшить, то возникают какие-то проблемьі? Если да, то какие именно?

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму