Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Pick to Light Project 2 WiFi

Composants et fournitures

Arduino MKR1000
× 1
LED (générique)
× 2
Câbles de raccordement (générique)
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
× 1
Résistance 10k ohm
× 1
Résistance 330 ohm
× 4
Planche à pain (générique)
× 1
Câble USB-A vers Micro-USB
× 1
Transistor à usage général NPN
× 1

À propos de ce projet

C'est le deuxième projet de mon choix pour l'exploration lumineuse. Dans le premier, j'ai expliqué comment je vois le fonctionnement d'un simple pick to light et j'ai créé un simple pick to light utilisant la communication série (veuillez lire ceci si vous souhaitez en savoir plus sur ce que je fais ici).

Cela a fonctionné mais a été attaché au PC par le câble. Dans ce projet, je souhaite développer le processus à l'aide du Wi-Fi et, en outre, je souhaite inclure le numéro de séquence dans la confirmation de prélèvement afin que, en cas de problème, le système sache où le travailleur a récupéré. Je vais utiliser un MKR1000 de la même manière que dans le projet 1 mais communiquer en WiFi. Pour ce faire, je vais utiliser UDP (User Datagram Protocol). Bien que je n'aie jamais utilisé cela auparavant, grâce aux bibliothèques dans Arduino et Python, cela s'est avéré relativement facile à créer.

Les étapes suivantes sont globalement similaires au projet 1, donc si vous les avez suivies, vous serez déjà familiarisé avec certaines des étapes et elles n'auront pas besoin d'être répétées.

Étape 1

Pour commencer, nous devons avoir Python v 3.6 ou supérieur sur notre ordinateur portable ou PC. Vous pouvez le télécharger ici :

https://www.python.org/downloads/

Étape 2

Cette fois, nous utiliserons la bibliothèque de socket Python pour communiquer et elle est déjà installée, donc rien n'a besoin de faire pour faire fonctionner UDP.

Étape 3

Nous avons également besoin de l'IDE Arduino, soit la version PC, soit la version Web. Ceux-ci peuvent être téléchargés ici :

https://www.arduino.cc/en/Main/Software

ou connecté à ici :

https://create.arduino.cc/

Les instructions sur le site sont complètes donc je ne vais pas les dupliquer inutilement.

Étape 4

Lancez Python IDLE sur votre PC ou ordinateur portable et tapez :import os press :enter.

Tapez ensuite :os.getcwd() cela devrait vous donner votre répertoire de travail actuel (cwd).

Répertoire de travail Python

Étape 5

Dans le Bloc-notes, j'ai créé un fichier de valeurs séparées par des virgules et il contient tout simplement un numéro de séquence formaté pour toujours être à 4 chiffres et un numéro de bac séparé par une virgule. Voir la capture d'écran du Bloc-notes ci-dessous et également le fichier texte joint que vous pouvez télécharger. J'ai enregistré ceci en tant que sequence1.txt dans le cwd que nous avons rassemblé à l'étape 4 (vous pouvez enregistrer le fichier avec l'extension csv mais il n'est pas nécessaire que le csv fonctionne). L'enregistrement du fichier dans le cwd simplifie les choses lorsque nous arrivons à lire le fichier avec le script python car nous n'aurons pas à spécifier un emplacement où le fichier est stocké car il cherchera automatiquement dans le cwd.

txt contenant la séquence csv

Étape 6

Nous utiliserons la série dans le croquis Arduino, mais uniquement pour pouvoir voir les messages imprimés sur le moniteur série.

Étape 7

Le script Python doit lire le contenu du fichier csv une ligne à la fois et envoyer le numéro de séquence et le numéro de bac via la connexion UDP, puis attendre que l'Arduino renvoie l'accusé de réception, qui est le numéro de séquence du dernier numéro de bac , pour dire que la pièce est cueillie. Si le numéro de séquence reçu ne correspond pas au dernier numéro de séquence envoyé, le programme Python s'arrêtera avec un message d'erreur indiquant le numéro de séquence. Cela permettra de redémarrer la séquence au bon endroit. J'ai ajouté des commentaires au script afin que vous puissiez comprendre ce que j'ai écrit.

Copiez le script puis lancez IDLE puis>Fichier>Nouveau fichier et collez le script dans la fenêtre. Puis>Fichier>Enregistrer sous donnez-lui un nom (peu importe comment vous l'appelez tant que vous connaissez le nom).

Étape 8

L'esquisse Arduino doit se connecter à Internet, puis attendre de recevoir les données udp du PC pour le prochain choix. Il agit alors sur ce qu'il reçoit en allumant la LED qui correspond au bac dans la séquence. Il doit ensuite surveiller le bouton qui représente ce bac pour voir s'il est enfoncé. Une fois que le travailleur appuie sur le bouton pour dire que la pièce est choisie, le croquis éteint la LED et envoie un message contenant le dernier numéro de séquence au PC ou à l'ordinateur portable pour dire que la pièce a été choisie. Il attend ensuite de recevoir les détails de la prochaine sélection.

Donc, si vous utilisez la copie de l'éditeur Web Arduino sous l'esquisse et dans l'éditeur Web Arduino, sélectionnez> carnet de croquis>NOUVEAU SKETCH

Éditeur Web Arduino

Collez ensuite le script dans la nouvelle esquisse en remplaçant complètement tout ce qui s'y trouve.

Si vous utilisez l'éditeur Web Arduino dès que vous collez le croquis, l'éditeur identifie la nécessité de créer un fichier secret qui contiendra le SSID et le mot de passe de ce serveur.

Il s'agit simplement d'ajouter les détails pertinents au fichier dans les espaces prévus.

Avec Arduino IDE, cela peut être tout aussi simple, mais si c'est le cas, je ne l'ai pas trouvé. Cependant, parce que j'ai commencé mon sketch avec l'exemple de sketch WiFiUdpSendReceiveString.

Si vous l'ouvrez, vous trouverez déjà un onglet arduino_secrets.h à l'intérieur. Ajoutez votre SSID et votre mot de passe, puis collez le croquis ci-dessous sur le croquis déjà présent et enregistrez-le sous le nom de votre choix.

Si vous utilisez l'IDE Arduino, vous devrez inclure la bibliothèque WiFi101. Le lien suivant explique comment ajouter une bibliothèque si vous ne le savez pas.

https://www.arduino.cc/en/Guide/Bibliothèques

Téléchargez sur le MKR1000.

Étape 9

Connectez tout selon le schéma fritzing. Si vous avez suivi le projet 1, vous verrez que j'ai câblé cela différemment. La raison en est que dès que le WiFi sur le MKR1000 devient actif pour une raison quelconque, l'alimentation chute sur les broches 8 et 9 et les LED ne s'allument pas. Je n'ai trouvé personne d'autre sur le Web qui ait publié quoi que ce soit à propos de ce problème, j'ai donc utilisé le transistor pour le contourner. Je suis sûr qu'il y aura une explication à cela, mais pour l'instant je ne l'ai pas trouvée.

Attention ! Veuillez vous assurer que les résistances que vous utilisez sont adaptées à la LED et au transistor NPN que vous utilisez. Assurez-vous également que vous le câblez correctement, car laisser le 5V court-circuiter les broches 8 et 9 pourrait détruire votre Arduino. Utilisez une diode si vous n'êtes pas sûr.

Étape 10

Vérifiez que l'Arduino est connecté au serveur, puis exécutez le script Python à l'aide de F5 et la LED qui représente Bin1 s'allumera. En appuyant sur le bouton pour confirmer que la pièce a été choisie, le numéro de séquence sera renvoyé au programme Python où il sera vérifié et, s'il est correct, la séquence suivante est envoyée.

La sortie Python ressemblera à ceci

La sortie du moniteur série ressemblera à ceci :

Vous pouvez tester l'échec de la séquence en commentant la ligne :

myseq.toCharArray(ReplyBuffer, 5);

et décommenter la ligne :

//car ReplyBuffer[5] ="0001" ;

comme suit ;

Lorsque vous exécutez le programme python maintenant, l'exécution s'arrêtera après le deuxième bac car elle rapportera le numéro de séquence du premier bac.

En cas d'échec de la séquence, la personne créant la séquence devra éditer le fichier contenant la séquence et redémarrer l'arduino et le programme Python.

Conclusion

Eh bien, je pense que j'ai atteint ce que j'avais prévu de faire. C'est simple et il serait facile de passer à une version de travail pleine grandeur. Cependant, je peux déjà voir qu'un projet 3 pourrait apporter des améliorations et même si le concours sera terminé, avant d'avoir la chance de faire un autre projet, je pense que j'aimerais le faire pour voir comment je peux l'améliorer mais quand même en gardant l'idée initiale de simplicité.

Code

  • Croquis Arduino
  • Script Python
  • Séquence
Croquis ArduinoArduino
Le sketch à charger sur le MKR1000
#include #include #include const int OKbutton =2 ; // définit la broche pour le bouton OK/switchconst int Bin1 =8; // la broche à laquelle la LED du bac 1 est attachée const int Bin2 =9; // la broche à laquelle la LED du bac 2 est attachée String mydata =" "; // une variable pour lire les données série entrantes dans une valeur stringString vide myseq =" ";int buttonPress =0; // une variable pour stocker l'état du bouton/switchint status =WL_IDLE_STATUS;#include "arduino_secrets.h" ///////veuillez entrer vos données sensibles dans l'onglet Secret/arduino_secrets.hchar ssid[] =SECRET_SSID; // votre réseau SSID (nom) char pass[] =SECRET_PASS; // votre mot de passe réseau (à utiliser pour WPA ou comme clé pour WEP)int keyIndex =0; // votre numéro d'index de clé réseau (nécessaire uniquement pour WEP)unsigned int localPort =2390; // port local pour écouter onchar packetBuffer[255]; //tampon pour contenir les paquets entrants ReplyBuffer[5] =" "; // une chaîne à renvoyerString mystring;WiFiUDP Udp;void setup() { //Initialiser la série et attendre que le port s'ouvre :Serial.begin(9600);// toutes les instructions série ne sont pas nécessaires une fois configurées//pendant que ( !Serial) {// attendre que le port série se connecte. Nécessaire pour le port USB natif uniquement} // vérifier la présence du shield :if (WiFi.status() ==WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // ne continue pas :while (true); } // tentative de connexion au réseau WiFi :while ( status !=WL_CONNECTED) { Serial.print("Tentative de connexion au SSID :"); Serial.println(ssid); // Connectez-vous au réseau WPA/WPA2. Modifiez cette ligne si vous utilisez un réseau ouvert ou WEP :status =WiFi.begin(ssid, pass); // attend 10 secondes pour la connexion :delay(10000); } Serial.println("Connecté au wifi"); printWiFiStatus(); Serial.println("\nDémarrage de la connexion au serveur..."); // si vous obtenez une connexion, faites un rapport via série :Udp.begin(localPort);}void loop() { // si des données sont disponibles, lisez un paquet int packetSize =Udp.parsePacket(); if (packetSize) { Serial.print("Paquet reçu de taille "); Serial.println(packetSize); Serial.print("De "); IPAddress remoteIp =Udp.remoteIP(); Serial.print(remoteIp); Serial.print(", port "); Serial.println(Udp.remotePort()); // lit le paquet dans packetBufffer int len ​​=Udp.read(packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Contenu :"); Serial.println(packetBuffer); String machaîne(packetBuffer); mesdonnées =machaîne.sous-chaîne(4) ; myseq =machaîne.sous-chaîne(0,4) ; Serial.println(mesdonnées); Serial.println(myseq); while (mydata !=" "){ //Test pour voir si mydata est toujours vide si ce n'est pas le cas vérifie quel bac doit être allumé if (mydata =="Bin1"){ // démarre la routine bin 1 digitalWrite(Bin1 , HAUT); // allume la LED pour le bac 1 en définissant la broche haute digitalWrite (Bin2, LOW); // éteint la LED du bac 2 en réglant la broche à l'état bas pendant que (buttonPress !=HIGH) { // attend que le bouton appuie sur loop buttonPress =digitalRead(OKbutton); //Continuez à vérifier le bouton mydata =" "; //remet mes données à une chaîne vide } digitalWrite(Bin1, LOW); // éteint la led pour le bac 1 Serial.println("Picked"); //Envoyer un message au PC buttonPress =0; //bouton de réinitialisation faible délai (1000); } if (mydata =="Bin2"){// démarrer la routine bin 2 digitalWrite(Bin2, HIGH);// allumer la LED pour bin 2 en réglant la broche haute digitalWrite(Bin1, LOW); // éteint la LED du bac 1 en réglant la broche à l'état bas pendant que (buttonPress !=HIGH) { // attend que le bouton appuie sur loop buttonPress =digitalRead(OKbutton); //Continuez à vérifier le bouton mydata =" "; //remet mes données à la chaîne emty } digitalWrite(Bin2, LOW); // éteint la led du bac 1 Serial.println("Picked"); //Envoyer un message au PC buttonPress =0; //bouton de réinitialisation faible délai (1000); } } // envoyer une réponse, à l'adresse IP et au port qui nous ont envoyé le paquet que nous avons reçu myseq.toCharArray(ReplyBuffer, 5); //car ReplyBuffer[5] ="0001"; // pour tester uniquement Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(ReplyBuffer); Udp.endPacket(); Serial.println(ReplyBuffer); }}void printWiFiStatus() { // imprime le SSID du réseau auquel vous êtes connecté :Serial.print("SSID:"); Serial.println(WiFi.SSID()); // affiche l'adresse IP de votre bouclier WiFi :IPAddress ip =WiFi.localIP(); Serial.print("Adresse IP :"); Serial.println(ip); // affiche la force du signal reçu :long rssi =WiFi.RSSI(); Serial.print("force du signal (RSSI):"); Serial.print(rssi); Serial.println(" dBm");}
Script PythonPython
Script Python à exécuter.
## chargez les bibliothèques nécessairesimport csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## l'ip de notre ArduinoUDP_PORT =2390 ## le port que nous souhaitons communiquer onprint ("UDP target IP:" , UDP_IP) ## afficher l'ip à userprint("UDP target port:", UDP_PORT) ## afficher le port à usersock =socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # créer un sockettime.sleep(5)##open csv et lisez-le ligne par ligne avec open('sequence1.txt') en tant que csvDataFile :csvReader =csv.reader(csvDataFile) pour la ligne dans csvReader :## pour chaque ligne, procédez comme suit myseq =row[0] # #lire dans le numéro de séquence mystate =row[1] ##lire dans le numéro de bin myrow =row[0] + row[1] print("Séquence actuelle sélectionnée ",myseq,"from ", mystate) sock.sendto (bytes(myrow, "utf-8"), (UDP_IP, UDP_PORT)) # envoyer les données de séquence et de numéro de bin ="" # définir les données à vide pour entrer pendant la boucle i=jusqu'à ce que les données soient reçues tandis que les données =="":# jusqu'à ce que les données soient reçues, continuez à parcourir (data, addr) =soc k.recvfrom(1024) # définir les données sur les données reçues de la socket mytest =data.decode( "utf-8") # définir mytest sur la même valeur reçue sur la socket print ("picked =", mytest) # imprimer la valeur reçue si mytest !=myseq:# teste ce qui a été reçu correspond à ce qui était attendu c'est-à-dire la dernière seq envoyée print ("il y a une erreur de séquence à la séquence", mytest) # affiche un message pour indiquer une erreur sys.exit() # termine l'exécution du programme si le défaut existe
SéquenceTexte brut
Fichier de séquence pour le programme python
0001,Bin10002,Bin20003,Bin10004,Bin20005,Bin10006,Bin20007,Bin10008,Bin20009,Bin10010,Bin20011,Bin10012,Bin20013,Bin1

Schémas

Connexions pour l'UDP Pick to Light picktolightudp_OCbpNt9XPK.fzz

Processus de fabrication

  1. Lanterne à gaz
  2. Pointeur laser
  3. Lampe de poche
  4. Kaléidoscope
  5. Laser à semi-conducteur
  6. Photographie
  7. Feux de signalisation
  8. Ampoule
  9. Pédale de vitesse et pédale pour guitare !