serial read proyectos encender control con comunicacion python c++ opencv arduino raspberry-pi3

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.