Hace un año en Habré salió la
revisión del robot de escritorio Dobot Magician. En este artículo, propongo evaluar a su hermano mayor Dobot M1 en acción. También intentaré explicar por qué elegí este modelo en particular para mi proyecto, describiré el proceso de desarrollo de la demostración en Qt / c ++, así como algunos momentos desagradables que encontré durante el proceso de desarrollo.
Introduccion
Este año trabajé en uno de los institutos de investigación más comunes. Al principio, todo fue bastante casual, y el año no prometió nada interesante, hasta que un día en un mitin comenzó una discusión sobre cómo hacer un conjunto de celdas solares en mosaico (celdas solares de tejas). Este enfoque no es nada nuevo,
dicen , esta es una de las primeras formas de ensamblar paneles para satélites espaciales.
No sé qué tan cierto es esto porque no he visto artículos o patentes. Pero el interés del público en esta decisión se ha calentado, en parte también porque hace un par de años SunPower lanzó sus nuevos paneles, que llamó la
serie P. Sucedió que en el mundo de la energía fotovoltaica, dado que el sanpower está haciendo algo, entonces todos deben hacer esto también. Ahí estamos Todo es simple: preparamos los sustratos, los cortamos en tiras y los ensamblamos. En ese momento, noté que, personalmente, definitivamente no recogería nada manualmente, porque mis manos no diferían en particular en la uniformidad. De lo contrario, el resultado puede ser algo así como un
video en YouTube. Y, después de todo, somos una institución completa, si realmente hacemos algo, no es una granja tan colectiva. Ofrecí comprar robots y configurarlos para el proceso deseado, y me dieron el visto bueno.
Cabe señalar que decidimos comenzar de manera más simple y ensamblar mini paneles. Un mini panel es cualquier panel solar más pequeño que el estándar. Hacemos esto para resolver procesos tecnológicos. Primero, fui guiado por un panel con un tamaño de 1 celda solar estándar con planes para escalar a un panel de 2 x 2. El tamaño del lado de una celda solar es de 16 cm. En consecuencia, se necesitaban robots con un campo de acceso de 32 x 32 cm. Quería precisión con mayor precisión, y el precio era más barato . Entonces, armado con una barra de búsqueda, comencé a estudiar las oraciones. Decidí que no se necesitan 6 ejes para el proyecto, 4 son suficientes, por lo que la elección se redujo a los robots como una cicatriz. Descubrí que comprar robots industriales va acompañado de gastos adicionales, como diseñar un espacio de trabajo seguro y dejar al ingeniero de aplicaciones en el sitio de instalación, que programa el robot para su tarea. Los buenos robots industriales son caros en principio, y los servicios de los ingenieros aumentarán el precio aún más, además, fue interesante implementar el proyecto usted mismo. Por lo tanto, la elección se redujo a cobots, robots colaborativos, con requisitos de seguridad más bajos y más amigables para la auto-creación de prototipos. Entonces, rápidamente encontré la compañía Dobot. Inmediatamente dejé caer al Dobot Magician debido al tamaño y la precisión, que es de 100 micras. Les escribí una solicitud para dar especificaciones y les dije dónde comprar. Descubrí que con las API hay API y se pueden programar en C ++. Me convenía, pero no podía comprarlo directamente. Afortunadamente, encontré un proveedor en los Países Bajos, que me vendió 2 piezas por 8700 euros con IVA, con entrega desde China, y al mismo tiempo se hizo cargo de todo el despacho de aduanas.
Características amabilidad

Dobot M1 se posiciona como un robot colaborativo profesional de 4 ejes asequible. Puede soportar hasta 1,5 kg de carga (no probado), tiene un rango de hasta 400 mm (no en todas partes) y una precisión de hasta 20 micras (verificado). El espacio de trabajo de la bondad se ve en la figura a continuación. No es difícil notar que, debido a las características de diseño, hay una zona ciega con un radio de menos de 15 centímetros en el frente. Además, este mapa espacial no tiene en cuenta la orientación de la mano. Dobot puede ser diestro o zurdo, todavía no he descubierto cómo se puede cambiar sobre la marcha sin calibración adicional. Por defecto, Dobot es diestro, lo que significa que la zona derecha está limitada por el área de acceso de la segunda articulación, cuando la primera articulación se dirige hacia la derecha. Entonces, el área real del espacio de trabajo es aproximadamente 2/3 de lo que se muestra en el dibujo oficial.

La bondad tiene puertos de E / S: entradas y salidas digitales con niveles de 24 V (los niveles predeterminados son altos), así como entradas analógicas. Qué tipo de ADC hay, no lo sé. Los puertos están disponibles en el panel posterior del soporte y en la mano para trabajar con boquillas. Olvidé fotografiar el conector en el brazo, pero es un tipo de CAA. También hay una interfaz de expansión para la que puede comprar una tarifa adicional. Dobot se conecta a una PC a través de RS-232 o a través de una red.

Materiales de la carcasa: policarbonato, aparentemente, más un soporte de metal pintado en negro. Este diseño no causa una sensación de premium, sino también una sensación de artesanía. Compré uno completamente cargado y uno en la base. No probé la boquilla láser y la impresión 3D.
Para probar la bondad de la amabilidad, utilicé el programa M1Studio para Windows, que se descarga del sitio web de la compañía. Pero eso es todo. Además, armado con api, Qt y una estación de trabajo con avispas elementales, me senté a escribir una demostración para trabajar con varios altibajos.
Estamos escribiendo una demo
En realidad, la demo ya está disponible en el
github . La documentación para la API y el protocolo de comunicación se puede descargar desde el sitio web del fabricante.
En primer lugar, utilizamos el método SearchDobot () de api, que no mostraba nada en Linux, y solo funcionaba en Windows si el dobot estaba conectado a través de RS-232. Es extraño, porque M1Studiya define perfectamente dobotov a través de la red. Con direcciones IP conocidas, el método ConnectDobot () funciona bien. Está bien, pensé, configuraré el enrutador y dejaré que la dirección IP se adjunte a la amapola. Al día siguiente me sorprendió el hecho de que las bondades no reaccionan. Resultó que cuando se enciende, el dobot tiene una dirección de amapola aleatoria. Esta es una característica del firmware, que se corrigió en la nueva versión en mayo, pero que, sin embargo, tenía miedo de instalar.
Armado con un programa para analizar paquetes de red, descubrí que Dobot responde a la solicitud UDP al puerto 6000 con el texto "WhoisDobotM1" Respuesta UDP con texto que contiene el número de modelo de Dobot. En base a esto, se escribió un método personalizado que envía solicitudes a través de toda la subred y, en el caso de una respuesta, inicializa la amabilidad.
void MainWindow::on_buttonSearch_clicked() { QHostAddress host; QList<QHostAddress> list = QNetworkInterface::allAddresses(); for (int i=0; i<list.count(); i++) { if ((!list.at(i).isLoopback()) && (list.at(i).protocol() == QAbstractSocket::IPv4Protocol)) host = list.at(i); } QString subnet = host.toString().section('.',0,2) + "."; QByteArray data = "WhoisDobotM1"; QUdpSocket udpSocketSend; udpSocketSend.writeDatagram(data);
void MainWindow::readUdpData() { while (udpSocketGet.hasPendingDatagrams()) { QNetworkDatagram data = udpSocketGet.receiveDatagram(); QByteArray ip = data.senderAddress().toString().toUtf8(); QString name = QString(data.data()).section('_',0,0);
La interfaz de demostración es bastante simple y se presenta en la imagen a continuación.

Para inicializar y controlar la amabilidad, escribí una clase en la que me di cuenta de las funciones que necesito: control de ejes, movimiento de un punto a otro en línea recta y en una curva, retorno a la posición inicial, control de la bomba de aire y también monitoreo de posiciones y errores. Vamos a turnarnos. Cuando se inicializa la clase, la dirección IP de amabilidad se almacena en la variable, se produce la primera conexión, se limpia toda la cola de comandos, incluso si la cola está vacía, y se establecen los parámetros de aceleración y velocidad para los motores.
class MyDobot : public QObject { Q_OBJECT public: explicit MyDobot(QObject *parent = nullptr); ~MyDobot(); void initDobot(QByteArray IPaddress); Pose getCurrentPosition(); void goHomeSafe(); void goHome(); void goSafe(); void goPosition(float x, float y, float z, float r); void goPositionStraight(float x, float y, float z, float r); void goJog(int index); void setAirPump(int status, int direction);
Decidí usar un vector con elementos de mi clase para controlar dobot cuando su número es mayor que 1. Cada elemento del vector tiene una variable que almacena la dirección IP del dobot. Porque la biblioteca es una, y hay varios dobotov, luego, en cada método de la clase, primero debe llamar al método de conexión a un dobot específico. Puede parecer torcido, pero todo está bajo el capó, y luego trabajar con esta clase es muy conveniente.
void MyDobot::setAirPump(int status, int direction) { ConnectDobot(thisDobotIP, 115200, nullptr, nullptr); ...
El movimiento de punto a punto en API Goodness se implementa mediante varios métodos: en línea recta, en curva y de alguna otra manera que no recuerdo. En la figura a continuación, son visibles dos trayectorias de movimiento entre 2 puntos. Una es una línea recta, que con la calibración adecuada del dispositivo no se bifurca cuando se mueve hacia adelante y hacia atrás. La segunda trayectoria es la línea curva que obtienes, porque el firmware de bondad ajusta secuencialmente los motores para lograr la coordenada deseada. Cabe señalar que el movimiento en línea recta no siempre es posible, algunas posiciones de las articulaciones no permiten llegar desde el punto A al punto B en línea recta.

La supervisión de la posición de Dobot se implementa utilizando la clase Qtimer, cuya señal Qtimer :: timeout está vinculada a mi método MainWindow :: on_getPoseTimer. Debo admitir que esta es una solución regular, porque la operación receptiva de la aplicación con ups solo es posible si configura un tiempo de espera de 1000 ms. Con tiempos más cortos, los tirones comienzan a sentirse al administrar los ups. Noté que a veces Dobot puede ser estúpido durante un tiempo al recibir un comando, y si envía comandos con bastante frecuencia, entonces aumenta la probabilidad de meterse en un estúpido. Quizás esto se deba a la llamada constante a ConnectDobot, que puede parecer innecesario en esta demostración, pero la demostración se escribió en paralelo con el proyecto principal, y en el proyecto principal realmente necesito dicha implementación. Sin embargo, para monitorear la conexión no siempre se llama, pero el problema con la suspensión persiste. Desafortunadamente, un tiempo de espera de 1 s no proporciona una medición tan suave de la posición de bondad en el espacio, que, por ejemplo, se implementa en el M1 Studio, pero, por otro lado, esto no es importante.
En el mismo método, se produce una solicitud de errores. En api kindness, la transmisión del código de error se implementa a través de la estructura AlarmState.
struct alarmState { uint8_t value[32]; };
Esta estructura es una matriz de elementos de 8 bits, y el código de error está codificado en la representación binaria de uno de los varios elementos de la matriz. Para calcular el código de error, debe encontrar "1" en el elemento y agregar su número de descarga (unidad) a 8 * n elementos (que contengan o no otros errores) antes de él en la matriz de valores. Sí, puede haber más de un error a la vez. A continuación, el código de error debe encontrarse en el documento, que está disponible para descargar en el sitio web del fabricante. El contenido de pdfk se copió a un archivo de texto, que se atornilla al proyecto como un recurso. Si el código de error difiere de 8 * 32 (es decir, no hay error), entonces este código aparece en el campo de error y al hacer clic en el botón Alarma, su descripción se analiza en el archivo y luego se muestra en el campo de texto. Por cierto, la decodificación y el análisis de errores se realizan fuera de la clase para controlar los ups. Eso ahora me parece que no es la idea correcta.
Se incluye una bomba de aire en el kit, que en el manual de instrucciones sugiere conectarse a las salidas digitales 17 y 18. Una salida controla el encendido / apagado de la bomba y la segunda controla la dirección del movimiento del aire. Así, por ejemplo, se activa una pinza neumática, que también se suministra.
Malezas
En el proceso de explotar el Dobot, me encontré con algunos problemas.
- Los agujeros en el soporte no están hechos para el paso de los agujeros en la placa óptica estándar. Por otro lado, una vez cuando, por error, mis amabilidades chocaron entre sí, una de ellas simplemente se desplazó alrededor del eje del perno de fijación, lo que, creo, evitó daños severos.
- Del primer párrafo se desprende el segundo. Después de la colisión del Dobot, sus hachas se movieron. Al principio, esto no daba miedo, porque escribí un método para calibrar el eje del Dobot en relación con la cámara. Lo terrible sucedió en el párrafo 3.
- El eje vertical también ha cambiado y ahora mi normalidad no es normal. Esto puede ser detectado por la cámara si dibuja dos perpendiculares con los puntos. Puede asegurarse de que, debido a la inclinación vertical, dobot ahora dibuja con un lápiz no sus verdaderos ejes X e Y, sino sus proyecciones. Y estas proyecciones pueden tener un ángulo de menos de 90 grados. En realidad, esto lleva a un pequeño error de alineación. Por otro lado, no da tanto miedo porque el error es lineal.
- Dobot firmware, en principio, aprox. Había una pequeña jamba con una dirección de amapola, hay algunos problemas al esperar las respuestas a las solicitudes UDP, pero de lo contrario funciona bien.
- El diseño proporciona una batería, que es necesaria para mantener las últimas coordenadas después de desactivar la amabilidad. Cuando la batería se agota, el voltaje cae, lo que borra estos datos. Debido a esto, el dobot se carga en un estado de error. Para deducir de estos estados, primero debe llamar al método de limpieza de mensajes de error, y luego llamar al método de búsqueda para la posición de "inicio". Puede reemplazar la batería, el beneficio está incluido. Sin embargo, la batería está oculta en el soporte, y para llegar a ella tuvo que desenroscar 4 pernos. La ranura de uno de ellos es derribada.
- En mi proyecto, utilicé 3 láminas de vidrio para aumentar el nivel de la mesa. Decisión regular, porque el vidrio está torcido. El hecho es que Dobot comienza a generar errores cuando su eje vertical tiene un valor de menos de 15 mm, y parece que no todas las funciones están disponibles. Por lo tanto, es necesario que el espacio de trabajo se encuentre justo encima del plano de conexión del Dobot.
Conclusión
La amabilidad me permitió implementar un proyecto para ensamblar células solares en un mini enchufe con azulejos, que se puede ver en video. La precisión de posicionamiento se verificó en las mismas obleas de silicio y estaba en el límite de 1 píxel en un eje y 10 píxeles en otro. La cámara en este proyecto se usó con una resolución de 20 MP, y el campo de visión de la cámara a lo largo del lado largo fue de aproximadamente 17 cm, no es difícil calcular que 1 píxel correspondía a un tamaño lineal de aproximadamente 30 micras. Dio la casualidad de que la óptica utilizada, aunque de alta calidad, permite observar claramente obleas de silicio solo en su centro, mientras que los bordes de las obleas se vuelven muy borrosos, lo que conduce a una incertidumbre en la determinación de sus caras a lo largo de lados cortos, y en consecuencia a una incertidumbre en la determinación del centro de la oblea. Después de calibrar los ejes, configuré el foco de la cámara en los lados cortos de las placas. Cabe señalar que, en principio, era imposible enfocar allí como en el centro del campo de visión, pero aún así. Debido a este efecto, el error de posicionamiento a lo largo del eje a lo largo del lado largo de la célula solar estaba en el límite de 10 píxeles, pero solo 1 píxel en el lado corto. Lo que corresponde a aproximadamente 300 y 30 micras. Esto me permitió verificar la integridad de las especificaciones para la precisión.