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

Arduino MKR1000 WiFi Pick-to-Light Systeem – Project 2

Onderdelen en benodigdheden

OnderdeelAantal
Arduino MKR10001
LED (generiek)2
Breadboard draden (generiek)1
SparkFun Drukknop 12mm1
Weerstand 10k ohm1
Weerstand 330 ohm4
Breadboard (generiek)1
USB-A naar Micro-USB kabel1
Algemene NPN Transistor1

Over dit project

Dit is het tweede project in de pick-to-light serie. Het eerste project gebruikte seriële communicatie; deze versie gebruikt WiFi via UDP (User Datagram Protocol) voor draadloze bediening. Een MKR1000 communiceert met een Python-script op de PC. Het systeem bevat een volgnummer in de bevestiging, zodat fouten in de pick-volgorde gedetecteerd kunnen worden.

Stap 1: Python installeren

Installeer Python 3.6 of hoger van python.org.

Stap 2: Python socket bibliotheek

De standaard socket bibliotheek ondersteunt UDP; geen extra installatie nodig.

Stap 3: Arduino IDE

Download de Arduino IDE van arduino.cc of gebruik de Web Editor.

Stap 4: Werkmap bepalen

Open Python IDLE, voer import os en os.getcwd() uit om de huidige werkmap te zien.

Stap 5: CSV-bestand met pick-volgorde

Maak een tekstbestand (bijv. sequence1.txt) in de werkmap met regels als 0001,Bin1, 0002,Bin2, etc. Het volgnummer is altijd 4 cijfers.

Stap 6: Seriële monitor

De Arduino sketch gebruikt seriële communicatie alleen voor debugging op de seriële monitor.

Stap 7: Python script

Het script leest het CSV-bestand regel voor regel, stuurt volgnummer en bin-nummer via UDP naar de Arduino, en wacht op bevestiging (het volgnummer). Bij een mismatch stopt het script met een foutmelding.

Stap 8: Arduino sketch

De sketch verbindt met WiFi, luistert op UDP-poort 2390, ontvangt de pick-instructie, laat de bijbehorende LED branden, wacht op drukknopindruk, dooft de LED en stuurt het volgnummer terug. Gebruik de WiFi101 bibliotheek en een arduino_secrets.h bestand voor SSID/wachtwoord.

Stap 9: Aansluiten

Volg het Fritzing-schema. Let op: de WiFi-module zakt de spanning op pinnen 8 en 9; daarom wordt een transistor gebruikt om de LED's aan te sturen. Gebruik geschikte weerstanden en een diode ter bescherming.

Stap 10: Testen

Start de Python-script (F5). De LED voor Bin1 gaat branden. Druk op de knop om te bevestigen; de volgende instructie wordt gestuurd. Test foutafhandeling door de terugstuur-regel uit te commentariëren.

Conclusie

Het systeem werkt en is eenvoudig uit te breiden. Toekomstige verbeteringen zijn mogelijk (project 3).

Code

Arduino Sketch

#include <SPI.h>
#include <WiFi101.h>
#include <WiFiUdp.h>
const int OKbutton = 2;
const int Bin1 = 8;
const int Bin2 = 9;
String mydata = "";
String myseq = "";
int buttonPress = 0;
int status = WL_IDLE_STATUS;
#include "arduino_secrets.h"
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
int keyIndex = 0;
unsigned int localPort = 2390;
char packetBuffer[255];
char ReplyBuffer[5] = "";
String mystring;
WiFiUDP Udp;

void setup() {
  Serial.begin(9600);
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true);
  }
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
    delay(10000);
  }
  Serial.println("Connected to wifi");
  printWiFiStatus();
  Serial.println("\nStarting connection to server...");
  Udp.begin(localPort);
}

void loop() {
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len] = 0;
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    String mystring(packetBuffer);
    mydata = mystring.substring(4);
    myseq = mystring.substring(0,4);
    Serial.println(mydata);
    Serial.println(myseq);
    while (mydata != "") {
      if (mydata == "Bin1") {
        digitalWrite(Bin1, HIGH);
        digitalWrite(Bin2, LOW);
        while (buttonPress != HIGH) {
          buttonPress = digitalRead(OKbutton);
          mydata = "";
        }
        digitalWrite(Bin1, LOW);
        Serial.println("Picked");
        buttonPress = 0;
        delay(1000);
      }
      if (mydata == "Bin2") {
        digitalWrite(Bin2, HIGH);
        digitalWrite(Bin1, LOW);
        while (buttonPress != HIGH) {
          buttonPress = digitalRead(OKbutton);
          mydata = "";
        }
        digitalWrite(Bin2, LOW);
        Serial.println("Picked");
        buttonPress = 0;
        delay(1000);
      }
    }
    myseq.toCharArray(ReplyBuffer, 5);
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
    Serial.println(ReplyBuffer);
  }
}

void printWiFiStatus() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Python Script

import csv
import socket
import time
import sys

UDP_IP = "192.168.1.119"
UDP_PORT = 2390
print("UDP target IP:", UDP_IP)
print("UDP target port:", UDP_PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
time.sleep(5)

with open('sequence1.txt') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    for row in csvReader:
        myseq = row[0]
        mystate = row[1]
        myrow = row[0] + row[1]
        print("Current sequence being picked", myseq, "from", mystate)
        sock.sendto(bytes(myrow, "utf-8"), (UDP_IP, UDP_PORT))
        data = ""
        while data == "":
            (data, addr) = sock.recvfrom(1024)
            mytest = data.decode("utf-8")
            print("picked =", mytest)
            if mytest != myseq:
                print("there is a sequence fault at sequence", mytest)
                sys.exit()

Volgordebestand (sequence1.txt)

0001,Bin1
0002,Bin2
0003,Bin1
0004,Bin2
0005,Bin1
0006,Bin2
0007,Bin1
0008,Bin2
0009,Bin1
0010,Bin2
0011,Bin1
0012,Bin2
0013,Bin1

Schema's

Fritzing-bestand: picktolightudp_OCbpNt9XPK.fzz

Productieproces

  1. Gaslampen: Evolutie, Ontwerp en Moderne Productie
  2. Laser Pointer: Ontwerp, Productie en Veiligheidsoverzicht
  3. Zaklamp: van ontstaan tot moderne innovatie
  4. De Kaleidoscoop: Van Brewsters Wetenschap tot Modern Ontwerp
  5. Semiconductor Lasers: Precieze Lichtgeneratie voor Moderne Technologie
  6. De kunst en wetenschap van fotografische processen: Van daguerreotypen tot moderne film
  7. Verkeerslichten: Techniek, Geschiedenis en Toekomstige Innovaties
  8. Van Vuur tot Draad: De Evolutie en Productie van de Moderne Glühlampe
  9. Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
  10. Slimme Draadloze Lichtschakelaar Controller: Arduino-gebaseerde Remote Switch Manipulator
  11. DIY Gitaar Speed Pick & Stomp Pedal – Bouw Je Eigen 3D-Gemotoriseerde Plektron