Arduino MKR1000 WiFi Pick-to-Light Systeem – Project 2
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino MKR1000 | 1 |
| LED (generiek) | 2 |
| Breadboard draden (generiek) | 1 |
| SparkFun Drukknop 12mm | 1 |
| Weerstand 10k ohm | 1 |
| Weerstand 330 ohm | 4 |
| Breadboard (generiek) | 1 |
| USB-A naar Micro-USB kabel | 1 |
| Algemene NPN Transistor | 1 |
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
- Gaslampen: Evolutie, Ontwerp en Moderne Productie
- Laser Pointer: Ontwerp, Productie en Veiligheidsoverzicht
- Zaklamp: van ontstaan tot moderne innovatie
- De Kaleidoscoop: Van Brewsters Wetenschap tot Modern Ontwerp
- Semiconductor Lasers: Precieze Lichtgeneratie voor Moderne Technologie
- De kunst en wetenschap van fotografische processen: Van daguerreotypen tot moderne film
- Verkeerslichten: Techniek, Geschiedenis en Toekomstige Innovaties
- Van Vuur tot Draad: De Evolutie en Productie van de Moderne Glühlampe
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Slimme Draadloze Lichtschakelaar Controller: Arduino-gebaseerde Remote Switch Manipulator
- DIY Gitaar Speed Pick & Stomp Pedal – Bouw Je Eigen 3D-Gemotoriseerde Plektron