Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Pick to Light Project 2 WiFi

Componenten en benodigdheden

Arduino MKR1000
× 1
LED (generiek)
× 2
Jumperdraden (algemeen)
× 1
SparkFun Drukknopschakelaar 12 mm
× 1
Weerstand 10k ohm
× 1
Weerstand 330 ohm
× 4
Broodplank (algemeen)
× 1
USB-A naar micro-USB-kabel
× 1
Transistor-NPN voor algemeen gebruik
× 1

Over dit project

Dit is het tweede project in mijn keuze voor verkenning van het licht. In de eerste heb ik geschetst hoe ik een simpele pick to light zie werken en ik heb een simpele pick to light gemaakt met behulp van seriële communicatie (lees dit als je meer wilt weten van wat ik hier doe).

Het werkte maar was met de kabel aan de pc vastgemaakt. In dit project wil ik het proces ontwikkelen met behulp van wifi en daarnaast wil ik het volgnummer in de pickbevestiging opnemen, zodat als er iets misgaat het systeem weet waar de werknemer heeft opgepikt. Ik ga een MKR1000 op dezelfde manier gebruiken als in project 1, maar communiceren via wifi. Om dit te doen ga ik UDP (User Datagram Protocol) gebruiken. Hoewel ik dit nog nooit eerder heb gebruikt, bleek dit dankzij de bibliotheken in Arduino en Python relatief eenvoudig te maken.

De volgende stappen lijken in grote lijnen op project 1, dus als je die hebt gevolgd, ben je al bekend met enkele van de stappen en hoeven ze niet herhaald te worden.

Stap 1

Om te beginnen hebben we Python v 3.6 of hoger op onze laptop of pc nodig. Je kunt dat hier downloaden:

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

Stap 2

Deze keer gebruiken we de Python-socketbibliotheek om te communiceren en deze is al geïnstalleerd, dus er hoeft niets te worden gedaan om UDP te laten werken.

Stap 3

We hebben ook de Arduino IDE nodig, ofwel de pc-versie of de webversie. Deze kunnen hier worden gedownload:

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

of verbonden met hier:

https://create.arduino.cc/

De instructies op de site zijn uitgebreid, dus ik zal ze niet onnodig dupliceren.

Stap 4

Start Python IDLE op uw pc of laptop en typ:import os druk op:enter.

Typ dan:os.getcwd() dit zou je je huidige werkdirectory (cwd) moeten geven.

Python-werkmap

Stap 5

In Kladblok heb ik een door komma's gescheiden waardebestand gemaakt en het bevat eenvoudig een volgnummer dat is opgemaakt om altijd uit 4 cijfers te bestaan ​​en een bingetal gescheiden door een komma. Zie de schermafdruk van Kladblok hieronder en ook het bijgevoegde tekstbestand dat u kunt downloaden. Ik heb dit opgeslagen als sequence1.txt in de cwd die we in stap 4 hebben verzameld (je kunt het bestand opslaan met de extensie csv, maar het is niet nodig dat de csv werkt). Het opslaan van het bestand naar de cwd vereenvoudigt de dingen wanneer we het bestand gaan inlezen met het python-script, omdat we geen locatie hoeven op te geven waar het bestand is opgeslagen omdat het automatisch in de cwd zal kijken.

txt-bestand met csv-reeks

Stap 6

We zullen serienummer gebruiken in de Arduino-schets, maar alleen zodat we de afgedrukte berichten op de seriële monitor kunnen zien.

Stap 7

Het Python-script moet de inhoud van het csv-bestand regel voor regel inlezen en het volgnummer en het bin-nummer over de UDP-verbinding verzenden en vervolgens wachten tot de Arduino de bevestiging retourneert, wat het volgnummer is van het laatste bin-nummer , om te zeggen dat het onderdeel is gekozen. Als het ontvangen volgnummer niet overeenkomt met het laatst verzonden volgnummer, stopt het Python-programma met een foutmelding die het volgnummer aangeeft. Hierdoor kan de reeks op de juiste plaats opnieuw worden gestart. Ik heb opmerkingen aan het script toegevoegd, zodat je kunt begrijpen wat ik heb geschreven.

Kopieer het script en start vervolgens de IDLE en vervolgens> Bestand> Nieuw bestand en plak het script in het venster. Dan>Bestand>Opslaan als geef het een naam (het maakt niet uit hoe je het noemt, zolang je de naam maar kent).

Stap 8

De Arduino-schets moet verbinding maken met internet en vervolgens wachten om de udp-gegevens van de pc te ontvangen voor de volgende keuze. Het reageert vervolgens op wat het ontvangt door de LED te laten branden die in de volgorde overeenkomt met de bak. Vervolgens moet het de knop controleren die die bak vertegenwoordigt om te zien of er op wordt gedrukt. Zodra de werknemer op de knop drukt om te zeggen dat het onderdeel is gekozen, gaat de schets uit de LED en stuurt een bericht met het laatste volgnummer terug naar de pc of laptop om te zeggen dat het onderdeel is gekozen. Vervolgens wacht het op het ontvangen van de details voor de volgende pick.

Dus als u de Arduino-webeditor gebruikt, kopieer dan de schets van onderaf en selecteer in de Arduino Web Editor>schetsboek>NEW SKETCH

Arduino-webeditor

Plak vervolgens het script in de nieuwe schets en vervang alles wat erin staat.

Als u de Arduino-webeditor gebruikt, identificeert de editor zodra u de schets plakt de noodzaak om een ​​geheim bestand te maken dat de SSID en het wachtwoord voor die server bevat.

Het is gewoon een kwestie van de relevante details aan het bestand toevoegen in de daarvoor bestemde ruimten.

Met Arduino IDE is het misschien net zo eenvoudig, maar als dat zo is, kon ik het niet vinden. Echter, omdat ik mijn schets begon met de voorbeeldschets WiFiUdpSendReceiveString.

Als u dit opent, vindt u er al een tabblad arduino_secrets.h in. Voeg je SSID en wachtwoord toe en plak de onderstaande schets over de schets die er al is en sla op als elke gewenste naam.

Als je de Arduino IDE gebruikt, moet je de bibliotheek WiFi101 toevoegen. De volgende link legt uit hoe je een bibliotheek kunt toevoegen als je het niet weet.

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

Downloaden naar de MKR1000.

Stap 9

Sluit alles aan volgens het fritzing-diagram. Als je project 1 hebt gevolgd dan zul je zien dat ik dit anders heb aangesloten. De reden hierachter is dat zodra de WiFi op de MKR1000 om de een of andere reden actief wordt, de stroom over pin 8 en 9 wegvalt en de LED's niet oplichten. Ik kon niemand anders op internet vinden die iets over dit probleem postte, dus ik gebruikte de transistor om het te omzeilen. Ik weet zeker dat hier een verklaring voor zal zijn, maar tot nu toe heb ik die niet gevonden.

Waarschuwing! Zorg ervoor dat de weerstanden die u gebruikt geschikt zijn voor de LED en de NPN-transistor die u gebruikt. Zorg er ook voor dat u dit correct aansluit, want als u de 5V over de pinnen 8 en 9 laat kortsluiten, kan dit uw Arduino vernietigen. Gebruik een diode als u het niet zeker weet.

Stap 10

Controleer of de Arduino verbinding heeft gemaakt met de server en voer vervolgens het Python-script uit met F5 en de LED die Bin1 vertegenwoordigt, gaat branden. Door op de knop te drukken om te bevestigen dat het onderdeel is gekozen, wordt het volgnummer teruggestuurd naar het Python-programma waar het wordt gecontroleerd en als het correct is, wordt de volgende volgorde verzonden.

De Python-uitvoer ziet er als volgt uit

De uitgang van de seriële monitor ziet er als volgt uit:

U kunt de sequentiefout testen door commentaar te geven op de regel:

myseq.toCharArray(ReplyBuffer, 5);

en uncommentaar van de regel:

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

als volgt;

Wanneer u nu het python-programma uitvoert, stopt de uitvoering na de tweede bak omdat het het volgnummer van de eerste bak zal rapporteren.

In het geval dat een reeks mislukt, moet de persoon die de reeks maakt, het bestand met de reeks bewerken en de Arduino en het Python-programma opnieuw opstarten.

Conclusie

Nou, ik denk dat ik heb bereikt wat ik wilde bereiken. Het is eenvoudig en zou gemakkelijk kunnen worden opgeschaald naar een werkende versie op volledige grootte. Ik kan echter al zien dat een project 3 verbeteringen zou kunnen aanbrengen en hoewel de competitie afgelopen zal zijn, voordat ik de kans krijg om een ​​volgend project te doen, denk ik dat ik dit zou willen doen om te zien hoe ik het beter kan maken, maar toch het aanvankelijke idee van eenvoud behouden.

Code

  • Arduino-schets
  • Python-script
  • Volgorde
Arduino schetsArduino
De schets die moet worden geladen in de MKR1000
#include #include #include const int OKbutton =2; // stel de pin in voor de oke-knop/switchconst int Bin1 =8; // de pin waaraan de LED voor bin 1 is bevestigd, const int Bin2 =9; // de pin waaraan de LED voor bin 2 is bevestigdString mydata =" "; // een variabele om binnenkomende seriële gegevens in te lezen in set to lege stringString myseq =" ";int buttonPress =0; // een variabele om de status van de knop op te slaan/switchint status =WL_IDLE_STATUS;#include "arduino_secrets.h" ///////voer uw gevoelige gegevens in op het tabblad Secret/arduino_secrets.hchar ssid [] =SECRET_SSID; // uw netwerk SSID (naam) char pass [] =SECRET_PASS; // uw netwerkwachtwoord (gebruik voor WPA of gebruik als sleutel voor WEP) int keyIndex =0; // uw netwerksleutel Indexnummer (alleen nodig voor WEP) unsigned int localPort =2390; // lokale poort om te luisteren naar onchar packetBuffer [255]; //buffer om inkomend pakket vast te houden ReplyBuffer [5] =" "; // een string om backString mystring te verzenden;WiFiUDP Udp;void setup() {// Initialiseer serieel en wacht tot de poort wordt geopend:Serial.begin (9600);// alle seriële instructies zijn niet nodig eenmaal ingesteld// terwijl ( !Serial) {// wacht tot de seriële poort verbinding maakt. Alleen nodig voor native USB-poort} // controleer op de aanwezigheid van het schild:if (WiFi.status() ==WL_NO_SHIELD) { Serial.println("WiFi-schild niet aanwezig"); // ga niet verder:while (true); } // poging om verbinding te maken met WiFi-netwerk:while (status!=WL_CONNECTED) { Serial.print("Poging om verbinding te maken met SSID:"); Serieel.println(ssid); // Maak verbinding met het WPA/WPA2-netwerk. Wijzig deze regel als u een open of WEP-netwerk gebruikt:status =WiFi.begin(ssid, pass); // wacht 10 seconden op verbinding:vertraging (10000); } Serial.println("Verbonden met wifi"); printWiFiStatus(); Serial.println("\nVerbinding met server starten..."); // als je verbinding krijgt, rapporteer dan via serieel:Udp.begin(localPort);}void loop() { // als er gegevens beschikbaar zijn, lees een pakket int packetSize =Udp.parsePacket(); if (packetSize) { Serial.print("Ontvangen pakket van grootte"); Serial.println (pakketgrootte); Serial.print("Van "); IPAddress remoteIp =Udp.remoteIP(); Serial.print(remoteIp); Serial.print(", poort "); Serial.println(Udp.remotePort()); // lees het pakket in packetBufffer int len ​​=Udp.read (packetBuffer, 255); if (len> 0) packetBuffer[len] =0; Serial.println("Inhoud:"); Serial.println(pakketbuffer); String mystring (pakketbuffer); mijndata =mijnstring.substring(4); myseq =mijnstring.substring(0,4); Serial.println(mijngegevens); Serial.println(myseq); while (mydata !=" "){ // Test om te zien of mydata nog steeds leeg is als dit niet het geval is, controleer welke bin moet worden verlicht als (mydata =="Bin1"){ // start bin 1 routine digitalWrite(Bin1 , HOOG); // licht-LED voor bak 1 door pin hoog in te stellen digitalWrite (Bin2, LOW); // zet LED voor bak 2 uit door pin laag in te stellen terwijl (knopDruk! =HOOG) { // wacht op knop druk op lusknop Druk op =digitalRead (OKknop); // blijf de knop mydata =" " controleren; // zet mijn gegevens terug naar een lege string} digitalWrite (Bin1, LOW);// zet de led voor bin 1 uit Serial.println ("Picked"); // stuur bericht naar pc-knop Druk op =0; // resetknop lage vertraging (1000); } if (mydata =="Bin2") {// start bin 2 routine digitalWrite (Bin2, HIGH);// licht-LED voor bin 2 door pin hoog in te stellen digitalWrite (Bin1, LOW); // zet LED voor bak 1 uit door pin laag in te stellen terwijl (knopDruk! =HOOG) { // wacht op knop druk op lusknop Druk op =digitalRead (OKknop); // blijf de knop mydata =" " controleren; // stel mijn gegevens terug in op lege string} digitalWrite (Bin2, LOW); // zet led voor bak 1 uit Serial.println ("Picked"); // stuur bericht naar pc-knop Druk op =0; // resetknop lage vertraging (1000); } } // stuur een antwoord naar het IP-adres en de poort die ons het pakket hebben gestuurd dat we hebben ontvangen myseq.toCharArray (ReplyBuffer, 5); //char ReplyBuffer [5] ="0001"; // alleen voor testen Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(Antwoordbuffer); Udp.endPacket(); Serial.println (Antwoordbuffer); }}void printWiFiStatus() { // print de SSID van het netwerk waarmee je bent verbonden:Serial.print("SSID:"); Seriële.println(WiFi.SSID()); // druk het IP-adres van uw WiFi-schild af:IPAddress ip =WiFi.localIP(); Serial.print("IP-adres:"); Serieel.println(ip); // print de ontvangen signaalsterkte:lange rssi =WiFi.RSSI(); Serial.print("signaalsterkte (RSSI):"); Seriële.print(rssi); Serial.println(" dBm");}
PythonscriptPython
Python-script dat moet worden uitgevoerd.
## laad de benodigde bibliothekenimport csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## het IP-adres van onze ArduinoUDP_PORT =2390 ## de poort die we willen communiceren op print("UDP-doel-IP:" , UDP_IP) ## display ip to userprint("UDP target port:", UDP_PORT) ## display port naar usersock =socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # maak een sockettime.sleep(5)##open csv-bestand en lees het in één regel tegelijk met open('sequence1.txt') als csvDataFile:csvReader =csv.reader(csvDataFile) voor rij in csvReader:##doe voor elke regel het volgende myseq =row[0] # #read in het volgnummer mystate =row[1] ##read in the bin number myrow =row[0] + row[1] print("Huidige reeks wordt gekozen", myseq,"from ", mystate) sock.sendto (bytes(myrow, "utf-8"), (UDP_IP, UDP_PORT)) # send seq and bin number data ="" # stel gegevens in op blanco om in te voeren terwijl lus i=totdat gegevens worden ontvangen terwijl data =="":# totdat de gegevens zijn ontvangen, blijf doorlopen (data, addr) =soc k.recvfrom (1024) # stel gegevens in op gegevens ontvangen van socket mytest =data.decode ("utf-8") # stel mytest in op gelijke waarde ontvangen via socket print ("picked =", mytest) # druk de ontvangen waarde af als mytest !=myseq:# test wat er is ontvangen komt overeen met wat werd verwacht, dwz de laatste seq verzonden print ("er is een volgordefout in de volgorde", mytest) # displaybericht om een ​​fout aan te geven sys.exit() #einde programma-uitvoering als fout bestaat
OpeenvolgingPlatte tekst
Sequentiebestand voor het python-programma
0001,Bin10002,Bin20003,Bin10004,Bin20005,Bin10006,Bin20007,Bin10008,Bin20009,Bin10010,Bin20011,Bin10012,Bin20013,Bin1

Schema's

Aansluitingen voor de UDP Pick to Light picktolightudp_OCbpNt9XPK.fzz

Productieproces

  1. Gaslantaarn
  2. Laseraanwijzer
  3. Zaklamp
  4. Caleidoscoop
  5. Halfgeleiderlaser
  6. Foto
  7. Verkeerssignaal
  8. Gloeilamp
  9. Eenvoudige obstakelsensor met Arduino
  10. Draadloze lichtschakelaarmanipulator
  11. Gitaar Speed ​​Pick en Stomp Pedaal!