read - python y arduino pdf
El código Python de Raspberry Pi 3 colgando en ser.write a Arduino (0)
Estoy trabajando en un proyecto que implica el envío de coordenadas desde un Pi a un brazo robótico (el UArm vendido por UFactory si te lo estás planteando. Pasé por alto el tablero de control y puse los servos enganchados directamente a un arduino) controlado por un arduino. Estoy usando OpenCV en el Pi para encontrar las coordenadas de un objeto, que van desde (0,0) a (400,300) <y quiero centrar el brazo y la cámara sobre el objeto para que Pi lea las coordenadas como (200, 150), o tan cerca como sea posible. Obtuve dos segmentos de código diferentes para centrar el brazo a lo largo de cada uno de los ejes xey. Me las arreglé para hacer que funcionen simultáneamente, pero cuando arranqué mi pi al día siguiente, el código que estaba funcionando ya no funcionaba, y no ha funcionado desde entonces.
aquí está mi código python en mi Pi para encontrar y mover el brazo hacia el centro para el eje individual
# Only send coordinates if and the object is in screen
if contarea < 100
#while x is not already at 200
while not xCentered:
# only send an x Coordinate if it has changed as to not
# overflow the arduino with information
if cX != xPosition:
# convert 0-400 to 0-255 since you cant write a value
# larger than 255 to serial
ser.write(struct.pack(''>B'', int(cX*0.6375)))
# update xPosition for if statement check
xPosition = cX
else:
break
#while y is not already at 155
while not yCentered:
# only send an x Coordinate if it has changed as to not
# overflow the arduino with information
if cY != yPosition:
# convert 0-300 to 0-255 since you cant write a value
# larger than 255 to serial
ser.write(struct.pack(''>B'', int(cY*0.85)))
# update yPosition for if statement check
yPosition = cY
else:
break
y aquí está el código arudino correspondiente
void loop(){
if(Serial.available() > 0){
rpi = Serial.read(); //read serial input from Pi
xpos = rpi*1.5686245098; //convert from 0-255 back to 0-400
ypos = rpi*1.17647058824; //convert from 0-255 back to 0-300
xrotate = (200 - xpos)/24; //find how many degrees to turn xservo
ymove = (150 - ypos)/13; //find how many degrees to turn yservos
if(xpos != prevxpos){ //if the x coordinate has changed
prevxpos = xpos; //update check
indexRotation(xrotate); //move servo
}
if(ypos != prevypos){ // if the y coordinate has changed
prevypos = ypos //update check
moveY(-ymove); //need to invert ymove due to orientation of the camera
moveX(-ymove); //move servos
}
}
}
Solo usaría los ypos o los xpos por ellos mismos, y comentaría lo que no estaba usando tanto en el guión python como en el boceto arduino. Este código funcionó, pero solo para controlar un eje a la vez, como mencioné anteriormente.
A continuación se muestra cómo traté de combinar los bocetos para controlar ambos ejes al mismo tiempo. Funcionó hasta que apagué todo y lo volví a intentar al día siguiente.
if contarea < 100:
while not centered:
if cX != xPosition:
ser.write(struct.pack(''>B'', int(cX*0.6375)))
xPosition = cX
# check if arduino is ready for y coordinate
if(ser.read() == ''0''):
if(cY != yPosition):
ser.write(struct.pack(''>B'', int(cY*0.85)))
yPosition = cY
else:
break
y el código arduino correspondiente
void loop(){
rpi = Serial.read(); //read serial input
xpos = rpi*1.5686245098;
xrotate = (200 - xpos)/24;
if(xpos != prevxpos){
prevxpos = xpos;
indexRotation(xrotate);
if(ypos != prevypos){
Serial.write(''0'');
rpi = Serial.read();
ypos = rpi*1.17647058824;
ymove = (150 - ypos)/13;
moveY(-ymove);
moveX(-ymove);
}
}
}
Mi código python parece estar estancado en la línea
if(ser.read() == ''0''):
y el ciclo de la cámara OpenCV se detiene y aparece una pantalla en blanco, así como el programa deja de actualizar. ¿Alguien tiene alguna idea sobre cómo puedo combinar mis segmentos de código de trabajo para escribir simultáneamente las coordenadas x e y, o qué está mal con mi segundo segmento de código? Realmente agradecería cualquier aporte. ¡Gracias!
Editar - También debo agregar que ahora cuando convierto las coordenadas de un int a un byte para escribirlo en serie y en el arduino, luego las vuelvo a convertir en una int en el lado arduino, obtengo 0 o 255, que descubrí después de imprimir los valores en el monitor serial.