I am using Python to communicate with Arduino. The python code uses OpenCV and sends some data to the Arduino.
import cv2
import numpy as np
import serial
import time
arduino = serial.Serial('COM3', 9600)
time.sleep(2)
print("Connection to arduino...")
frameWidth = 640
frameHeight = 480
cY1=0
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)
cap.set(4, frameHeight)
def empty(a):
pass
#colour
cv2.namedWindow("HSV1")
cv2.resizeWindow("HSV1", 640, 240)
cv2.createTrackbar("HUE Min", "HSV1", 0, 179, empty)
cv2.createTrackbar("HUE Max", "HSV1", 179, 179, empty)
cv2.createTrackbar("SAT Min", "HSV1", 0, 255, empty)
cv2.createTrackbar("SAT Max", "HSV1", 255, 255, empty)
cv2.createTrackbar("VALUE Min", "HSV1", 0, 255, empty)
cv2.createTrackbar("VALUE Max", "HSV1", 255, 255, empty)
while True:
success, img = cap.read()
imgHsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#colour 1
h_min1 = cv2.getTrackbarPos("HUE Min","HSV1")
h_max1 = cv2.getTrackbarPos("HUE Max", "HSV1")
s_min1 = cv2.getTrackbarPos("SAT Min", "HSV1")
s_max1 = cv2.getTrackbarPos("SAT Max", "HSV1")
v_min1 = cv2.getTrackbarPos("VALUE Min", "HSV1")
v_max1 = cv2.getTrackbarPos("VALUE Max", "HSV1")
lower1 = np.array([h_min1,s_min1,v_min1])
upper1 = np.array([h_max1,s_max1,v_max1])
mask1 = cv2.inRange(imgHsv,lower1,upper1) #changed mask to mask1
cv2.imshow('Mask1', mask1)
#Moment 1
M1 = cv2.moments(mask1)
if M1["m00"] != 0 :
cX1 = int(M1["m10"] / M1["m00"])
cY1 = int(M1["m01"] / M1["m00"])
cv2.circle(img, (cX1,cY1), 5, (255, 255, 255), -1)
cv2.imshow('centroid1', img)
print(cX1, cY1)
data = "A{0:d}E".format(cY1)
print("output = '" + data + "'")
arduino.write(data.encode())
if cv2.waitKey(1) and 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
The arduino part is
#include<Servo.h>
Servo servo1;
int y1;
int prevy1;
void setup()
{
Serial.begin(9600);
servo1.attach(9);
servo1.write(0);
}
void Pos()
{
if(prevy1 != y1)
{ int servo1w = map(y1, 0, 0, 479, 179);
servo1.write(servo1w);
}
}
void loop()
{
if(Serial.available() > 0)
{
if(Serial.read() == 'A')
{
y1 = Serial.parseInt();
Pos();
}
while(Serial.available() > 0)
{
Serial.read();
}
}
}
The Python code works at least till what's visible. It prints the data right before it sends it to arduino also properly. The Arduino does receive data as it starts blinking but the servo doesn't move.
I added code to move servo right after void loop() and one inside the first if statement [if(Serial.available()>0], the first time it moves (right after loop), but it doesn't seem to enter the if block