Arduino MKR1000 WiFi Pick-to-Light System – Projekt 2
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino MKR1000 | 1 |
| LED (generic) | 2 |
| Steckbrücken (generic) | 1 |
| SparkFun Drucktaster 12 mm | 1 |
| Widerstand 10 kΩ | 1 |
| Widerstand 330 Ω | 4 |
| Steckbrett (generic) | 1 |
| USB-A auf Micro-USB Kabel | 1 |
| 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
- Gaslaternen: Entwicklung, Design und moderne Fertigung
- Laserpointer: Design, Fertigung und Sicherheitsübersicht
- Taschenlampe: Von der Erfindung zur modernen Innovation
- Das Kaleidoskop: Von Brewsters Wissenschaft zum modernen Design
- Halbleiterlaser: Präzise Lichtgenerierung für moderne Technologie
- Die Kunst und Wissenschaft fotografischer Prozesse: Von Daguerreotypien zum modernen Film
- Verkehrsampeln: Technik, Geschichte und zukünftige Innovationen
- Vom Feuer zum Glühfaden: Die Entwicklung und Produktion der modernen Glühbirne
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- DIY Guitar Speed Pick & Stomp Pedal – 3D-gedruckter motorisierter Plektrum