Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Pick to Light Project 2 WiFi

Komponenten und Verbrauchsmaterialien

Arduino MKR1000
× 1
LED (generisch)
× 2
Jumper (generisch)
× 1
SparkFun Drucktastenschalter 12 mm
× 1
Widerstand 10k Ohm
× 1
Widerstand 330 Ohm
× 4
Breadboard (generisch)
× 1
USB-A auf Micro-USB-Kabel
× 1
Allzwecktransistor NPN
× 1

Über dieses Projekt

Dies ist das zweite Projekt in meiner Auswahl an Lichterkundungen. Im ersten habe ich skizziert, wie ich ein einfaches Pick-to-Light funktionieren sehe, und ich habe ein einfaches Pick-to-Light mit serieller Kommunikation erstellt (Bitte lesen Sie dies, wenn Sie mehr darüber erfahren möchten, was ich hier tue).

Es funktionierte, war aber über das Kabel mit dem PC verbunden. In diesem Projekt möchte ich den Prozess über Wi-Fi entwickeln und zusätzlich die Sequenznummer in die Kommissionierbestätigung aufnehmen, damit das System im Fehlerfall weiß, wo der Mitarbeiter abgeholt hat. Ich werde einen MKR1000 auf die gleiche Weise wie in Projekt 1 verwenden, aber über WLAN kommunizieren. Dazu verwende ich UDP (User Datagram Protocol). Obwohl ich dies noch nie zuvor verwendet habe, erwies es sich dank der Bibliotheken in Arduino und Python als relativ einfach zu erstellen.

Die folgenden Schritte sind im Großen und Ganzen ähnlich wie bei Projekt 1. Wenn Sie diese Schritte befolgt haben, sind Sie mit einigen Schritten bereits vertraut und müssen nicht wiederholt werden.

Schritt 1

Um loszulegen, benötigen wir Python v 3.6 oder höher auf unserem Laptop oder PC. Sie können das hier herunterladen:

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

Schritt 2

Dieses Mal verwenden wir die Python-Socket-Bibliothek für die Kommunikation und sie ist bereits installiert, sodass Sie nichts tun müssen, damit UDP funktioniert.

Schritt 3

Wir benötigen auch die Arduino IDE entweder die PC-Version oder die Web-Version. Diese können hier heruntergeladen werden:

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

oder verbunden mit hier:

https://create.arduino.cc/

Die Anweisungen auf der Website sind umfassend, sodass ich sie nicht unnötig duplizieren werde.

Schritt 4

Starten Sie Python IDLE auf Ihrem PC oder Laptop und geben Sie Folgendes ein:import os press:enter.

Geben Sie dann Folgendes ein:os.getcwd() Dies sollte Ihnen Ihr aktuelles Arbeitsverzeichnis (cwd) anzeigen.

Python-Arbeitsverzeichnis

Schritt 5

In Notepad habe ich eine durch Kommas getrennte Wertedatei erstellt und sie enthält ganz einfach eine fortlaufende Nummer, die immer vierstellig formatiert ist, und eine durch ein Komma getrennte Bin-Nummer. Siehe Notepad-Screenshot unten und auch angehängte Textdatei, die Sie herunterladen können. Ich habe dies als Sequence1.txt in der cwd gespeichert, die wir in Schritt 4 gesammelt haben (Sie können die Datei mit der Erweiterung CSV speichern, aber dies ist nicht erforderlich, damit CSV funktioniert). Das Speichern der Datei in cwd vereinfacht die Dinge, wenn wir die Datei mit dem Python-Skript einlesen, da wir keinen Speicherort angeben müssen, an dem die Datei gespeichert ist, da sie automatisch in der cwd gesucht wird.

txt-Datei mit CSV-Sequenz

Schritt 6

Wir werden seriell in der Arduino-Skizze verwenden, aber nur, damit wir die gedruckten Nachrichten auf dem seriellen Monitor sehen können.

Schritt 7

Das Python-Skript muss den Inhalt der CSV-Datei Zeile für Zeile einlesen und die Sequenznummer und die Bin-Nummer über die UDP-Verbindung senden und dann warten, bis das Arduino eine Bestätigung zurückgibt, die die Sequenznummer der letzten Bin-Nummer ist , um zu sagen, dass das Teil kommissioniert ist. Wenn die empfangene Sequenznummer nicht mit der zuletzt gesendeten Sequenznummer übereinstimmt, stoppt das Python-Programm mit einer Fehlermeldung, die die Sequenznummer angibt. Dadurch kann die Sequenz an der richtigen Stelle neu gestartet werden. Ich habe dem Skript Kommentare hinzugefügt, damit Sie verstehen können, was ich geschrieben habe.

Kopieren Sie das Skript und starten Sie dann IDLE und dann>Datei>Neue Datei und fügen Sie das Skript in das Fenster ein. Dann>Datei>Speichern unter geben Sie ihm einen Namen (egal wie Sie es nennen, solange Sie den Namen kennen).

Schritt 8

Die Arduino-Skizze muss eine Verbindung zum Internet herstellen und dann warten, um die UDP-Daten vom PC für die nächste Auswahl zu erhalten. Es reagiert dann auf das, was es empfängt, indem es die LED aufleuchtet, die dem Behälter in der Sequenz entspricht. Es muss dann die Schaltfläche überwachen, die diesen Behälter darstellt, um zu sehen, ob sie gedrückt wird. Sobald der Arbeiter die Taste drückt, um zu sagen, dass das Teil entnommen wurde, schaltet die Skizze die LED aus und sendet eine Nachricht mit der letzten Sequenznummer an den PC oder Laptop zurück, um zu sagen, dass das Teil entnommen wurde. Es wartet dann darauf, die Details für die nächste Auswahl zu erhalten.

Wenn Sie also den Arduino Web Editor verwenden, kopieren Sie von unten die Skizze und wählen Sie im Arduino Web Editor> Sketchbook> NEW SKETCH

Arduino-Webeditor

Fügen Sie dann das Skript in die neue Skizze ein und ersetzen Sie alles, was darin enthalten ist.

Wenn Sie den Arduino-Webeditor verwenden, erkennt der Editor beim Einfügen der Skizze die Notwendigkeit, eine geheime Datei zu erstellen, die die SSID und das Passwort für diesen Server enthält.

Es ist nur ein einfacher Fall, die relevanten Details in die dafür vorgesehenen Felder einzufügen.

Mit Arduino IDE kann es genauso einfach sein, aber wenn ja, konnte ich es nicht finden. Da ich meine Skizze jedoch mit der Beispielskizze WiFiUdpSendReceiveString begonnen habe.

Wenn Sie diese öffnen, finden Sie darin bereits eine Registerkarte arduino_secrets.h. Fügen Sie Ihre SSID und Ihr Passwort hinzu, fügen Sie dann die Skizze unten über die bereits vorhandene Skizze ein und speichern Sie sie unter einem beliebigen Namen.

Wenn Sie die Arduino IDE verwenden, müssen Sie die Bibliothek WiFi101 einbinden. Der folgende Link erklärt, wie Sie eine Bibliothek hinzufügen, wenn Sie nicht wissen.

https://www.arduino.cc/en/Guide/Libraries

Auf den MKR1000 herunterladen.

Schritt 9

Schließen Sie alles gemäß dem Fritzing-Diagramm an. Wenn Sie Projekt 1 verfolgt haben, werden Sie sehen, dass ich dies anders verdrahtet habe. Der Grund dafür ist, dass, sobald das WiFi auf dem MKR1000 aus irgendeinem Grund aktiv wird, die Leistung an den Pins 8 und 9 abfällt und die LEDs nicht leuchten. Ich konnte im Internet niemanden finden, der etwas zu diesem Problem veröffentlicht hat, also habe ich den Transistor verwendet, um es zu umgehen. Ich bin mir sicher, dass es dafür eine Erklärung geben wird, aber bisher habe ich sie nicht gefunden.

Warnung! Bitte stellen Sie sicher, dass die von Ihnen verwendeten Widerstände für die von Ihnen verwendete LED und den verwendeten NPN-Transistor geeignet sind. Stellen Sie auch sicher, dass Sie dies richtig verdrahten, da die 5V über die Pins 8 und 9 kurzgeschlossen werden können, um Ihr Arduino zu zerstören. Verwenden Sie eine Diode, wenn Sie sich nicht sicher sind.

Schritt 10

Überprüfen Sie, ob Arduino mit dem Server verbunden ist, und führen Sie dann das Python-Skript mit F5 aus. Die LED, die Bin1 darstellt, leuchtet auf. Wenn Sie die Schaltfläche drücken, um zu bestätigen, dass das Teil entnommen wurde, wird die Sequenznummer an das Python-Programm zurückgesendet, wo sie überprüft wird und wenn sie korrekt ist, wird die nächste Sequenz gesendet.

Die Python-Ausgabe sieht so aus

Die Ausgabe des seriellen Monitors sieht so aus:

Sie können den Sequenzfehler testen, indem Sie die Zeile kommentieren:

myseq.toCharArray(ReplyBuffer, 5);

und Auskommentieren der Zeile:

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

wie folgt;

Wenn Sie das Python-Programm jetzt ausführen, wird die Ausführung nach dem zweiten Bin gestoppt, da die Sequenznummer des ersten Bins angezeigt wird.

Im Falle eines Sequenzfehlers muss die Person, die die Sequenz erstellt, die Datei mit der Sequenz bearbeiten und das Arduino- und das Python-Programm neu starten.

Fazit

Nun, ich denke, ich habe erreicht, was ich mir vorgenommen hatte. Es ist einfach und könnte leicht auf eine Arbeitsversion in voller Größe hochskaliert werden. Ich sehe jedoch bereits, dass ein Projekt 3 Verbesserungen bringen könnte und obwohl der Wettbewerb beendet sein wird, bevor ich die Chance habe, ein weiteres Projekt durchzuführen, würde ich dies gerne tun, um zu sehen, wie ich es verbessern kann, aber trotzdem die ursprüngliche Idee der Einfachheit beibehalten.

Code

  • Arduino-Skizze
  • Python-Skript
  • Sequenz
Arduino-SkizzeArduino
Der in den MKR1000 zu ladende Sketch
#include #include #include const int OKbutton =2; // Setzen Sie den Pin für die OK-Taste / Switchconst Int Bin1 =8; // der Pin, an dem die LED für Bin 1 befestigt ist const int Bin2 =9; // der Pin, mit dem die LED für Bin 2 verbunden ist, anString mydata =" "; // eine Variable zum Einlesen eingehender serieller Daten in set to empty stringString myseq =" ";int buttonPress =0; // eine Variable zum Speichern des Zustands der Schaltfläche/switchint status =WL_IDLE_STATUS;#include "arduino_secrets.h" ///////bitte geben Sie Ihre sensiblen Daten in die Registerkarte Secret ein/arduino_secrets.hchar ssid[] =SECRET_SSID; // Ihre Netzwerk-SSID (Name)char pass[] =SECRET_PASS; // Ihr Netzwerk-Passwort (für WPA oder als Schlüssel für WEP verwenden)int keyIndex =0; // Ihr Netzwerkschlüssel Indexnummer (wird nur für WEP benötigt)unsigned int localPort =2390; // lokaler Port zum Abhören von onchar packetBuffer[255]; //Puffer zum Halten des eingehenden Paketschar ReplyBuffer[5] =" "; // eine Zeichenfolge zum Senden backString mystring;WiFiUDP Udp;void setup () { // Seriell initialisieren und warten, bis der Port geöffnet wird:Serial.begin (9600); // alle seriellen Anweisungen werden nach der Einrichtung nicht benötigt // while ( !Seriell) {// warten, bis die serielle Schnittstelle eine Verbindung herstellt. Nur für nativen USB-Port erforderlich} // Überprüfen Sie das Vorhandensein des Schilds:if (WiFi.status () ==WL_NO_SHIELD) { Serial.println ("WiFi-Schild nicht vorhanden"); // nicht fortfahren:while (true); } // Versuch, eine Verbindung zum WLAN-Netzwerk herzustellen:while ( status !=WL_CONNECTED) { Serial.print ( "Versuch, eine Verbindung zu SSID herzustellen:"); Serial.println (ssid); // Verbindung zum WPA/WPA2-Netzwerk herstellen. Ändern Sie diese Zeile, wenn Sie ein offenes oder WEP-Netzwerk verwenden:status =WiFi.begin(ssid, pass); // 10 Sekunden auf Verbindung warten:delay(10000); } Serial.println ("Mit WLAN verbunden"); printWiFiStatus(); Serial.println("\nVerbindung zum Server wird gestartet..."); // Wenn Sie eine Verbindung erhalten, melden Sie sich über die serielle Schnittstelle:Udp.begin(localPort);}void loop() { // Wenn Daten verfügbar sind, lesen Sie ein Paket int packetSize =Udp.parsePacket(); if (packetSize) {Serial.print ( "Empfangenes Paket der Größe"); Serial.println (Paketgröße); Serial.print ("Von"); IPAddress remoteIp =Udp.remoteIP(); Serial.print (remoteIp); Serial.print (, Port "); Serial.println (Udp.remotePort ()); // das Paket in den packetBuffer einlesen int len ​​=Udp.read (packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Inhalt:"); Serial.println (Paketpuffer); String mystring(packetBuffer); mydata =mystring.substring(4); myseq =mystring.substring(0,4); Serial.println (mydata); Serial.println (myseq); while (mydata !=" "){ //Testen, ob mydata noch leer ist, wenn nicht, überprüfen, welcher Behälter beleuchtet werden soll, wenn (mydata =="Bin1"){ // bin 1-Routine starten digitalWrite(Bin1 , HOCH); // Licht-LED für Bin 1 durch Setzen von Pin High DigitalWrite (Bin2, LOW); // LED für Bin 2 ausschalten, indem der Pin niedrig gesetzt wird, während (buttonPress ! =HIGH) {// warten, bis die Taste Loop gedrückt wird buttonPress =digitalRead (OKbutton); // Schaltfläche überprüfen mydata =" "; // mydata zurück auf leere Zeichenfolge setzen} digitalWrite (Bin1, LOW); // LED für Bin 1 aus Serial.println ("Picked"); // Nachricht an PC senden buttonPress =0; // Reset-Taste niedrige Verzögerung (1000); } if (mydata =="Bin2") {// Bin 2 Routine starten digitalWrite (Bin2, HIGH); // LED für Bin 2 durch Setzen von Pin High DigitalWrite (Bin1, LOW); // LED für Bin 1 ausschalten, indem der Pin niedrig gesetzt wird, während (buttonPress! =HIGH) {// warten, bis die Taste Loop gedrückt wird buttonPress =digitalRead (OKbutton); // Schaltfläche überprüfen mydata =" "; // setze meine Daten auf leere Zeichenfolge zurück} digitalWrite (Bin2, LOW); // LED für Bin 1 ausschalten Serial.println ( "Picked"); // Nachricht an PC senden buttonPress =0; // Reset-Taste niedrige Verzögerung (1000); } } // eine Antwort an die IP-Adresse und den Port senden, die uns das Paket gesendet haben, das wir erhalten haben myseq.toCharArray(ReplyBuffer, 5); //char ReplyBuffer[5] ="0001"; // nur zum Testen Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write (ReplyBuffer); Udp.endPacket(); Serial.println (ReplyBuffer); }}void printWiFiStatus () {// Drucken Sie die SSID des Netzwerks, mit dem Sie verbunden sind:Serial.print ( "SSID:"); Serial.println (WiFi.SSID()); // drucke die IP-Adresse deines WiFi-Shields:IPAddress ip =WiFi.localIP(); Serial.print ("IP-Adresse:"); Serial.println (ip); // die empfangene Signalstärke ausgeben:long rssi =WiFi.RSSI(); Serial.print ("Signalstärke (RSSI):"); Serial.print (rssi); Serial.println(" dBm");}
Python-SkriptPython
Python-Skript soll ausgeführt werden.
## Laden Sie die erforderlichen Bibliothekenimport csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## die IP unseres ArduinoUDP_PORT =2390 ## der Port, den wir mit onprint("UDP target IP:" , UDP_IP). csv-Datei und lese sie zeilenweise mit open('sequence1.txt') als csvDataFile:csvReader =csv.reader(csvDataFile) for row in csvReader:##mache für jede Zeile folgendes myseq =row[0] # #die Sequenznummer einlesen mystate =row[1] ##die Bin-Nummer einlesen myrow =row[0] + row[1] print("Aktuelle Sequenz wird ausgewählt ",myseq,"from ", mystate) sock.sendto (bytes(myrow, "utf-8"), (UDP_IP, UDP_PORT)) # send seq und bin number data ="" # setze die Daten zum Eingeben auf leer, während Schleife i=bis Daten empfangen werden while data =="":# bis Daten empfangen werden weiterschleifen (data, addr) =soc k.recvfrom(1024) # setze die Daten auf die vom Socket empfangenen Daten mytest =data.decode( "utf-8") #setze mytest auf den gleichen Wert, der über den Socket empfangen wurde print ("picked =", mytest) # gebe den empfangenen Wert aus, wenn mytest !=myseq:# Test, was empfangen wurde, stimmt mit dem überein, was erwartet wurde, dh zuletzt gesendete Sequenz print ("Es gibt einen Sequenzfehler bei Sequenz", mytest) # Anzeige einer Fehlermeldung sys.exit() #Programmausführung beenden if Fehler vorhanden
SequenzKlartext
Sequenzdatei für das Python-Programm
0001,Bin10002,Bin20003,Bin10004,Bin20005,Bin10006,Bin20007,Bin10008,Bin20009,Bin10010,Bin20011,Bin10012,Bin20013,Bin1

Schaltpläne

Anschlüsse für UDP Pick to Light picktolightudp_OCbpNt9XPK.fzz

Herstellungsprozess

  1. Gaslaterne
  2. Laserpointer
  3. Taschenlampe
  4. Kaleidoskop
  5. Halbleiterlaser
  6. Fotografieren
  7. Verkehrssignal
  8. Glühbirne
  9. Einfacher Hindernissensor mit Arduino
  10. Guitar Speed ​​Pick and Stomp Pedal!