Pick to Light Project 2 WiFi
Componentes y suministros
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Acerca de este proyecto
Este es el segundo proyecto de mi elección para la exploración ligera. En el primero, describí cómo veo que funciona una selección simple para iluminar y creé una selección simple para iluminar utilizando comunicación en serie (lea esto si desea comprender más de lo que estoy haciendo aquí).
Funcionó, pero estaba atado a la PC por el cable. En este proyecto quiero desarrollar el proceso usando Wi-Fi y, además, quiero incluir el número de secuencia en la confirmación de picking para que si algo sale mal, el sistema sepa dónde ha recogido el trabajador. Voy a usar un MKR1000 de la misma manera que lo hice en el proyecto 1 pero me comunico usando WiFi. Para hacer esto, voy a usar UDP (Protocolo de datagramas de usuario). Aunque nunca había usado esto antes, gracias a las bibliotecas de Arduino y Python, resultó relativamente fácil de crear.
Los siguientes pasos son muy similares al proyecto 1, por lo que si los ha seguido, ya estará familiarizado con algunos de los pasos y no será necesario repetirlos.
Paso 1
Para comenzar, necesitamos tener Python v 3.6 o superior en nuestra computadora portátil o PC. Puede descargarlo desde aquí:
https://www.python.org/downloads/
Paso 2
Esta vez usaremos la biblioteca de sockets de Python para comunicarnos y ya está instalada, por lo que no es necesario hacer nada para que UDP funcione.
Paso 3
También necesitamos el IDE de Arduino, ya sea la versión para PC o la versión web. Estos se pueden descargar aquí:
https://www.arduino.cc/en/Main/Software
o conectado aquí:
https://create.arduino.cc/
Las instrucciones del sitio son completas, por lo que no las duplicaré innecesariamente.
Paso 4
Inicie Python IDLE en su PC o computadora portátil y escriba:import os presione:enter.
Luego escriba:os.getcwd () esto debería darle su directorio de trabajo actual (cwd).
Directorio de trabajo de Python
Paso 5
En el Bloc de notas, creé un archivo de valores separados por comas y simplemente contiene un número de secuencia formateado para ser siempre de 4 dígitos y un número de contenedor separado por una coma. Vea la captura de pantalla del Bloc de notas a continuación y también el archivo de texto adjunto que puede descargar. Guardé esto como sequence1.txt en el cwd que recopilamos en el paso 4 (puede guardar el archivo con la extensión csv pero no es necesario para que el csv funcione). Guardar el archivo en el cwd simplifica las cosas cuando llegamos a leer en el archivo con el script de Python, ya que no tendremos que especificar una ubicación donde se almacena el archivo porque se buscará automáticamente en el cwd.
txt que contiene la secuencia csv
Paso 6
Usaremos serial en el boceto de Arduino pero solo para que podamos ver los mensajes impresos en el monitor serial.
Paso 7
La secuencia de comandos de Python debe leer el contenido del archivo csv una línea a la vez y enviar el número de secuencia y el número de Bin a través de la conexión UDP y luego esperar hasta que Arduino devuelva el reconocimiento, que es el número de secuencia del último número de bin. , para decir que se elige la pieza. Si el número de secuencia recibido no coincide con el último número de secuencia enviado, el programa Python se detendrá con un mensaje de error que indica el número de secuencia. Esto permitirá que la secuencia se reinicie en el lugar correcto. He añadido comentarios al guión para que entiendas lo que he escrito.
Copie el script y luego inicie IDLE y luego> Archivo> Nuevo archivo y pegue el script en la ventana. Luego> Archivo> Guardar como, asígnele un nombre (no importa cómo lo llame siempre que sepa el nombre).
Paso 8
El boceto de Arduino debe conectarse a Internet y luego esperar a recibir los datos de udp de la PC para la próxima selección. Luego actúa sobre lo que recibe encendiendo el LED que coincide con el contenedor en la secuencia. Luego necesita monitorear el botón que representa ese contenedor para ver si está presionado. Una vez que el trabajador presiona el botón para decir que se eligió la pieza, el boceto apaga el LED y envía un mensaje que contiene el último número de secuencia a la PC o computadora portátil para indicar que se seleccionó la pieza. Luego, espera recibir los detalles para la próxima selección.
Entonces, si está utilizando el editor web Arduino, copie desde debajo del boceto y en el Editor web Arduino seleccione> cuaderno de bocetos> NUEVO BOSQUEJO
Editor web Arduino
Luego pegue el script en el nuevo boceto reemplazando completamente todo lo que está allí.
Si está utilizando el editor web Arduino tan pronto como lo pegue en el boceto, el editor identificará la necesidad de crear un archivo secreto que contendrá el SSID y la contraseña para ese servidor.
Es solo un caso simple de agregar los detalles relevantes al archivo en los espacios provistos.
Con Arduino IDE puede ser igual de fácil, pero si lo es, no podría encontrarlo. Sin embargo, debido a que comencé mi boceto con el boceto de ejemplo WiFiUdpSendReceiveString.
Si abre esto, encontrará una pestaña arduino_secrets.h que ya está dentro. Agregue su SSID y contraseña, luego pegue el boceto a continuación sobre el boceto que ya está allí y guárdelo con el nombre que desee.
Si está utilizando el IDE de Arduino, deberá incluir la biblioteca WiFi101, el siguiente enlace explica cómo agregar una biblioteca si no lo sabe.
https://www.arduino.cc/en/Guide/Libraries
Descarga al MKR1000.
Paso 9
Conecte todo según el diagrama de fritzing. Si ha seguido el proyecto 1, verá que he conectado esto de manera diferente. La razón detrás de esto es que tan pronto como el WiFi en el MKR1000 se activa por alguna razón, la energía cae en los pines 8 y 9 y los LED no se iluminan. No pude encontrar a nadie más en la web publicando nada sobre este problema, así que usé el transistor para solucionarlo. Estoy seguro de que habrá una explicación para esto, pero hasta ahora no la he encontrado.
¡Advertencia! Asegúrese de que las resistencias que utiliza sean adecuadas para el LED y el transistor NPN que utilice. También asegúrese de conectar esto correctamente, ya que permitir que los 5V hagan un cortocircuito entre los pines 8 y 9 podría destruir su Arduino. Utilice un diodo si no está seguro.
Paso 10
Verifique que Arduino se haya conectado al servidor y luego ejecute el script Python usando F5 y el LED que representa Bin1 se iluminará. Al presionar el botón para confirmar que se seleccionó la pieza, se enviará el número de secuencia de regreso al programa Python, donde se verificará y, si es correcto, se enviará la siguiente secuencia.
La salida de Python se verá así
La salida del monitor en serie se verá así:
Puede probar el error de secuencia comentando la línea:
myseq.toCharArray (ReplyBuffer, 5);
y descomentar la línea:
// char ReplyBuffer [5] ="0001";
de la siguiente manera;
Cuando ejecute el programa Python ahora, la ejecución se detendrá después del segundo contenedor, ya que informará el número de secuencia del primer contenedor.
En el caso de una falla en la secuencia, la persona que crea la secuencia deberá editar el archivo que contiene la secuencia y reiniciar el arduino y el programa Python.
Conclusión
Bueno, creo que he logrado lo que me propuse. Es simple y sería fácil de escalar a una versión de trabajo de tamaño completo. Sin embargo, ya puedo ver que un proyecto 3 podría hacer mejoras y aunque la competencia habrá terminado, antes de que tenga la oportunidad de hacer un proyecto adicional, creo que me gustaría hacer esto para ver cómo puedo mejorarlo, pero aún así. manteniendo la idea inicial de sencillez.
Código
- Bosquejo de Arduino
- Secuencia de comandos de Python
- Secuencia
Boceto de Arduino Arduino
El boceto que se cargará en el MKR1000#include#include #include const int OKbutton =2; // establece el pin para el botón OK / switchconst int Bin1 =8; // el pin al que está conectado el LED del contenedor 1 const int Bin2 =9; // el pin al que está conectado el LED del contenedor 2String mydata =""; // una variable para leer los datos seriales entrantes en un conjunto vacío stringString myseq =""; int buttonPress =0; // una variable para almacenar el estado del botón / switchint status =WL_IDLE_STATUS; #include "arduino_secrets.h" /////// por favor ingrese sus datos confidenciales en la pestaña Secreto / arduino_secrets.hchar ssid [] =SECRET_SSID; // su SSID de red (nombre) char pass [] =SECRET_PASS; // su contraseña de red (úsela para WPA o úsela como clave para WEP) int keyIndex =0; // su clave de red Número de índice (necesario solo para WEP) unsigned int localPort =2390; // puerto local para escuchar onchar packetBuffer [255]; // búfer para contener los paquetes entrantes ReplyBuffer [5] =""; // una cadena para enviar backString mystring; WiFiUDP Udp; void setup () {// Inicializar serial y esperar a que se abra el puerto:Serial.begin (9600); // todas las declaraciones serial no son necesarias una vez configuradas // while ( ! Serial) {// espera a que se conecte el puerto serie. Necesario solo para puerto USB nativo} // comprobar la presencia del escudo:if (WiFi.status () ==WL_NO_SHIELD) {Serial.println ("No hay escudo WiFi"); // no continúe:while (verdadero); } // intenta conectarse a la red WiFi:while (status! =WL_CONNECTED) {Serial.print ("Intentando conectarse a SSID:"); Serial.println (ssid); // Conéctese a la red WPA / WPA2. Cambie esta línea si usa una red abierta o WEP:status =WiFi.begin (ssid, pass); // esperar 10 segundos para la conexión:delay (10000); } Serial.println ("Conectado a wifi"); printWiFiStatus (); Serial.println ("\ nIniciando la conexión al servidor ..."); // si obtiene una conexión, informe a través de serial:Udp.begin (localPort);} void loop () {// si hay datos disponibles, lea un paquete int packetSize =Udp.parsePacket (); if (packetSize) {Serial.print ("Paquete recibido de tamaño"); Serial.println (tamaño del paquete); Serial.print ("Desde"); IPAddress remoteIp =Udp.remoteIP (); Serial.print (remoteIp); Serial.print (", puerto"); Serial.println (Udp.remotePort ()); // lee el paquete en packetBufffer int len =Udp.read (packetBuffer, 255); if (len> 0) packetBuffer [len] =0; Serial.println ("Contenido:"); Serial.println (packetBuffer); String mystring (packetBuffer); mydata =mystring.substring (4); myseq =mystring.substring (0,4); Serial.println (mydata); Serial.println (myseq); while (mydata! ="") {// Prueba para ver si mydata todavía está vacío si no es así, comprueba qué bin debe estar iluminado if (mydata =="Bin1") {// inicia la rutina bin 1 digitalWrite (Bin1 , ALTO); // LED de luz para el contenedor 1 estableciendo el pin high digitalWrite (Bin2, LOW); // apaga el LED para el contenedor 2 configurando el pin bajo mientras (buttonPress! =HIGH) {// espera a que se presione el botón loop buttonPress =digitalRead (OKbutton); // sigue revisando el botón mydata =""; // volver a establecer mydata en una cadena vacía} digitalWrite (Bin1, LOW); // apagar el led del bin 1 Serial.println ("Picked"); // enviar mensaje a la PC buttonPress =0; // botón de reinicio de retardo bajo (1000); } if (mydata =="Bin2") {// iniciar la rutina bin 2 digitalWrite (Bin2, HIGH); // iluminar el LED del bin 2 estableciendo el pin high digitalWrite (Bin1, LOW); // apaga el LED del contenedor 1 configurando el pin bajo mientras (buttonPress! =HIGH) {// espera a que se presione el botón loop buttonPress =digitalRead (OKbutton); // sigue revisando el botón mydata =""; // volver a establecer mydata en una cadena vacía} digitalWrite (Bin2, LOW); // apaga el led del contenedor 1 Serial.println ("Picked"); // enviar mensaje a la PC buttonPress =0; // botón de reinicio de retardo bajo (1000); }} // enviamos una respuesta, a la dirección IP y al puerto que nos envió el paquete que recibimos myseq.toCharArray (ReplyBuffer, 5); // char ReplyBuffer [5] ="0001"; // para probar solo Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (ReplyBuffer); Udp.endPacket (); Serial.println (ReplyBuffer); }} void printWiFiStatus () {// imprime el SSID de la red a la que está conectado:Serial.print ("SSID:"); Serial.println (WiFi.SSID ()); // imprime la dirección IP de tu escudo WiFi:IPAddress ip =WiFi.localIP (); Serial.print ("Dirección IP:"); Serial.println (ip); // imprime la intensidad de la señal recibida:long rssi =WiFi.RSSI (); Serial.print ("intensidad de la señal (RSSI):"); Serial.print (rssi); Serial.println ("dBm");}
Secuencia de comandos de Python Python
Python Script para ser ejecutado.## cargue las bibliotecas necesariasimport csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## la ip de nuestro ArduinoUDP_PORT =2390 ## el puerto que deseamos comunicar onprint ("UDP target IP:" , UDP_IP) ## mostrar ip a userprint ("puerto de destino UDP:", UDP_PORT) ## mostrar puerto a usersock =socket.socket (socket.AF_INET, socket.SOCK_DGRAM) # crear un sockettime.sleep (5) ## abrir csv y léalo en una línea a la vez con open ('sequence1.txt') como csvDataFile:csvReader =csv.reader (csvDataFile) para la fila en csvReader:## para cada línea haga lo siguiente myseq =row [0] # # leer en el número de secuencia mystate =fila [1] ## leer en el número de bin myrow =fila [0] + fila [1] print ("Se está recogiendo la secuencia actual", myseq, "from", mystate) sock.sendto (bytes (myrow, "utf-8"), (UDP_IP, UDP_PORT)) # enviar seq y bin number data ="" # establecer datos en blanco para ingresar while loop i =hasta que se reciban datos while data =="":# hasta que se reciban los datos, siga recorriendo (data, addr) =soc k. mytest! =myseq:# prueba que lo que ha recibido coincide con lo esperado, es decir, la última secuencia enviada print ("hay una falla de secuencia en la secuencia", mytest) # muestra un mensaje para indicar una falla sys.exit () # finaliza la ejecución del programa si existe falla
Secuencia Texto sin formato
Archivo de secuencia para el programa Python0001, Bin10002, Bin20003, Bin10004, Bin20005, Bin10006, Bin20007, Bin10008, Bin20009, Bin10010, Bin20011, Bin10012, Bin20013, Bin1
Esquemas
Conexiones para UDP Pick to Light picktolightudp_OCbpNt9XPK.fzzProceso de manufactura