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

Arduino MKR1000 WiFi Pick-to-Light System – Projekt 2

Komponenten und Zubehör

KomponenteMenge
Arduino MKR10001
LED (generic)2
Steckbrücken (generic)1
SparkFun Drucktaster 12 mm1
Widerstand 10 kΩ1
Widerstand 330 Ω4
Steckbrett (generic)1
USB-A auf Micro-USB Kabel1
NPN-Transistor (Allzweck)1

Projektbeschreibung

Dies ist das zweite Projekt in der Pick-to-Light-Reihe. Während Projekt 1 noch per Kabel (serielle Kommunikation) an den PC gebunden war, nutzt dieses Projekt WiFi (UDP) für die drahtlose Kommunikation. Zudem wird eine Sequenznummer in die Bestätigung aufgenommen, um Fehler bei der Entnahme zu erkennen.

Schritt 1: Python installieren

Python 3.6+ wird benötigt (Download).

Schritt 2: Python socket-Bibliothek

Die socket-Bibliothek ist standardmäßig installiert und unterstützt UDP.

Schritt 3: Arduino IDE

Arduino IDE (Desktop oder Web) installieren: Desktop oder Web Editor.

Schritt 4: Python-Arbeitsverzeichnis ermitteln

In der Python IDLE: import os → os.getcwd().

Schritt 5: Sequenzdatei erstellen

Eine CSV-Datei (sequence1.txt) im Arbeitsverzeichnis enthält Sequenznummer (4-stellig) und Fachnummer (z. B. 0001,Bin1).

Schritt 6: Serielle Ausgabe im Arduino-Sketch

Serielle Kommunikation dient nur zum Debugging am Serial Monitor.

Schritt 7: Python-Skript

Das Skript liest die CSV zeilenweise, sendet Sequenznummer und Fachnummer per UDP an den Arduino und wartet auf Bestätigung (Sequenznummer). Bei Abbruch wird das Programm beendet.

Schritt 8: Arduino-Sketch

Der Sketch verbindet sich mit WiFi, empfängt UDP-Pakete, steuert die LEDs für die Fächer, überwacht den Taster und sendet die Sequenznummer zurück.

Schritt 9: Verkabelung

Aufgrund eines Spannungseinbruchs an den Pins 8/9 bei aktivem WiFi wurde ein Transistor zur LED-Ansteuerung verwendet. Warnung: Passende Widerstände für LED und Transistor verwenden; 5 V nicht kurzschließen.

Schritt 10: Test

Nach Verbindungsaufbau wird das Python-Skript gestartet (F5). Die LED für Bin1 leuchtet; Tastendruck bestätigt die Entnahme. Ein Sequenzfehler kann zum Testen simuliert werden.

Fazit

Das System funktioniert einfach und ist skalierbar. Ein drittes Projekt könnte weitere Verbesserungen bringen.

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 Skript

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()

Sequenzdatei (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

Schaltplan

Fritzing-Datei: picktolightudp_OCbpNt9XPK.fzz

Herstellungsprozess

  1. Gaslaternen: Entwicklung, Design und moderne Fertigung
  2. Laserpointer: Design, Fertigung und Sicherheitsübersicht
  3. Taschenlampe: Von der Erfindung zur modernen Innovation
  4. Das Kaleidoskop: Von Brewsters Wissenschaft zum modernen Design
  5. Halbleiterlaser: Präzise Lichtgenerierung für moderne Technologie
  6. Die Kunst und Wissenschaft fotografischer Prozesse: Von Daguerreotypien zum modernen Film
  7. Verkehrsampeln: Technik, Geschichte und zukünftige Innovationen
  8. Vom Feuer zum Glühfaden: Die Entwicklung und Produktion der modernen Glühbirne
  9. Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
  10. DIY Guitar Speed Pick & Stomp Pedal – 3D-gedruckter motorisierter Plektrum