У меня есть приложение, где мне нужно:Синхронизация между Python и Arduino с использованием последовательной связи
- движение серводвигателем с помощью Arduino в положение и остановки в этом положении
- иметь камеру под контролем питона приобретают изображение в этой позиции
- когда изображение приобретается, сервопривод должен переместиться в симметричном положении
последовательность повторяется несколько N времени
Итак, я попытался синхронизировать arduino и код python с помощью последовательной связи. На стороне arduino, когда сервопривод достигает позиции, он отправляет строку в код python, используя последовательную связь. Строка является либо «Крест», либо «Со» в зависимости от достигнутого положения. Ардуино должен дождаться, когда строка «Ok» будет отправлена последовательной связью с помощью кода python (после получения изображения). После получения этой строки ардуино должно приводить в действие сервопривод, чтобы он переместился в другое положение.
На стороне Python кода, я прочитал последовательные данные и в зависимости от строки, полученные (Cross или Co):
- имя строка определяется
- Изображение приобретается с помощью камеры
- изображение сохраняется или добавляется в список
- Строка «Ok» отправляется в arduino.
коды прилагаются ниже.
Проблема в том, что мне не удается правильно синхронизировать положения сервопривода и получение изображения. Сервопривод просто запускается между двумя позициями и, похоже, не читает ни одной строки из последовательной связи. Это никогда не останавливается на самом деле. Однако код arduino отправляет «Cross» и «Co» в код python, и код python позволяет читать и получать и сохранять изображения, но часто с неправильными именами. Наличие кода arduino достаточно долго для каждой позиции не является решением, так как мне нужна приличная частота получения изображения.
Итак, я хотел бы знать, что является лучшим способом синхронизации двух кодов и быть уверенным, что правильное имя моих изображений будет соответствовать правильному положению сервопривода?
Заранее благодарим за любые ссылки или идеи.
Грег
Arduino код `
#include <Servo.h>
//servo
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
//camera
const int CameraPin = 53; // the number of the camera trigg
int CameraState = LOW; // ledState used to set the LED
const int ledPin = 13; // the number of the LED pin
String Str = "c";
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
// set the digital LED pin as output:
pinMode(CameraPin, OUTPUT);
// set the digital camera pin as output:
pinMode(ledPin, OUTPUT);
//serial communication
Serial.begin(9600);
Serial.println("Ready");
}
void loop() {
Serial.flush();
// go to Co position and wait
ServoCo(15); // go to Co position
Serial.println("Co"); //send signal Co to python
while(!Serial.available()) {} // wait for python to send data acquired
while ((Serial.available()<2)) // Test on the length of the serial string
{
delay(1);
String Str = Serial.readStringUntil('\n');
Serial.println(Str);
}
// go to cross position and wait
ServoCross(15); // go to Cross position
Serial.println("Cross");
while(!Serial.available()) {}
while ((Serial.available()<2))
{
delay(1);
String Str = Serial.readStringUntil('\n');
Serial.println(Str);
}
}
delay(100);
}
void ServoCross(int ServoDelay)
{
for (pos = 105; pos >= 75; pos -= 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(ServoDelay);
}
}
void ServoCo(int ServoDelay)
{
for (pos = 75; pos <= 105; pos += 1)
{ // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(ServoDelay);
}`
Python код:
from time import sleep
import serial
import scipy
ser = serial.Serial('COM10', 9600) # Establish the connection on a specific port
Nb_total_image = 100
imagergb_cross = np.zeros((480,640))
imagergb_co = np.zeros((480,640))
counter_image = 0;
ser.write('start')
while counter_image<Nb_total_image:
ser.flush()
ReadArduino = ser.readline().split('\r')[0] # Read the newest output from the Arduino
print(ReadArduino)
if ReadArduino == 'Cross':
nameImage = 'CrossImage' + str(counterImageCross)
cam.reset_frame_ready() # reset frame ready flag
# send hardware trigger OR call cam.send_trigger() here
cam.send_trigger()
cam.wait_til_frame_ready(1000) # wait for frame ready due to trigger
imageRawcross = cam.get_image_data()
ser.write("Ok\n")
else:
nameImage = 'CoImage' + str(counterImageCo)
cam.reset_frame_ready() # reset frame ready flag
# send hardware trigger OR call cam.send_trigger() here
cam.send_trigger()
cam.wait_til_frame_ready(1000) # wait for frame ready due to trigger
ImageRawCo = cam.get_image_data()
ser.write("Ok\n")
imagergb = imageRawCo-imageRawcross
counter_image = counter_image + 1
Передает ли Arduino принимаемый 'Ok' назад? –
'Serial.available() <2' будет true, если в буфере имеется один байт. 'Ok \ n' - три байта. И вы никогда не очищаете буфер, читая его. –
Да, я хотел, чтобы код ожидал в цикле while, пока есть только 2 байта, и переходит, когда есть три (например, с «Ok \ n»). Когда вы говорите, очистите буфер, вы имеете в виду флеш-память? – gregory