Система Pick-to-Light на Arduino MKR1000 с WiFi (UDP) — Проект 2
Компоненты и материалы
- Arduino MKR1000 — 1 шт. (встроенный WiFi)
- Светодиоды (generic) — 2 шт. (для двух ячеек)
- Провода-перемычки — 1 набор
- Кнопка SparkFun 12 мм — 1 шт. (подтверждение комплектации)
- Резистор 10 кОм — 1 шт. (подтяжка кнопки)
- Резистор 330 Ом — 4 шт. (для светодиодов и транзистора)
- Платы для прототипирования (breadboard) — 1 шт.
- Кабель USB-A — Micro-USB — 1 шт.
- Транзистор NPN (generic) — 1 шт. (для усиления тока светодиодов)
О проекте
Это второй проект в серии Pick-to-Light. Первый проект использовал последовательное соединение (Serial) и был привязан к ПК кабелем. В этой версии реализовано беспроводное управление по WiFi с использованием протокола UDP. Добавлена нумерация последовательности (sequence number) для отслеживания прогресса сборки: если рабочий пропустил ячейку или ошибся, система определит точное место сбоя.
Используется Arduino MKR1000 и Python-скрипт на компьютере. Обмен данными происходит по UDP (User Datagram Protocol). Благодаря библиотекам Arduino и Python реализация оказалась простой.
Пошаговая инструкция
Шаг 1: Установка Python
Требуется Python 3.6+. Скачать: python.org/downloads
Шаг 2: Библиотека socket
Встроенная библиотека socket уже поддерживает UDP — ничего устанавливать не нужно.
Шаг 3: Arduino IDE
Скачать: Arduino IDE или использовать Web Editor.
Шаг 4: Рабочая директория Python
Запустите IDLE, выполните:
import os
os.getcwd()
Получите путь к текущей рабочей директории (cwd).
Шаг 5: Файл последовательности (CSV)
Создайте в cwd файл sequence1.txt (или .csv) с содержимым:
0001,Bin1
0002,Bin2
0003,Bin1
0004,Bin2
...
Формат: 4-значный номер последовательности, запятая, номер ячейки (Bin1/Bin2).
Шаг 6: Serial в скетче Arduino
Используется только для отладки через Serial Monitor.
Шаг 7: Python-скрипт
Скрипт читает CSV построчно, отправляет по UDP номер последовательности и ячейку, ждет подтверждения (последний полученный номер последовательности) от Arduino. Если номера не совпадают — скрипт останавливается с ошибкой, указывая проблемный номер. Это позволяет возобновить процесс с правильного места.
import csv, socket, time, sys
UDP_IP = "192.168.1.119" # IP Arduino
UDP_PORT = 2390
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()
Шаг 8: Скетч Arduino
Скетч подключается к WiFi, слушает UDP-порт 2390. При получении данных зажигает соответствующий светодиод (Bin1 или Bin2), ждет нажатия кнопки, гасит светодиод, отправляет обратно номер последовательности.
Важно: при использовании Web Editor автоматически создается вкладка arduino_secrets.h для SSID и пароля. В классической IDE можно взять пример WiFiUdpSendReceiveString, в нем уже есть эта вкладка.
#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) {
// Чтение пакета, разбор sequence (первые 4 символа) и bin (остальное)
// Зажигание соответствующего LED, ожидание кнопки, отправка ответа
}
}
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");
}
Полный скетч доступен в оригинале статьи.
Шаг 9: Сборка схемы
Схема соединений (Fritzing) отличается от Проекта 1: при активации WiFi на MKR1000 напряжение на пинах 8 и 9 проседает, поэтому светодиоды управляются через NPN-транзистор. Внимание! Подбирайте резисторы под ваши светодиоды и транзистор. Не допускайте замыкания 5В на пины 8/9 — это может убить плату. Используйте диод, если не уверены.
Шаг 10: Запуск и тестирование
- Проверьте подключение Arduino к WiFi (Serial Monitor).
- Запустите Python-скрипт (F5 в IDLE).
- Загорится светодиод Bin1. Нажмите кнопку — отправится подтверждение.
- Python проверит номер последовательности и отправит следующий.
Для теста ошибки последовательности закомментируйте строку myseq.toCharArray(ReplyBuffer, 5); и раскомментируйте char ReplyBuffer[5] = "0001";. Программа остановится на второй ячейке с ошибкой последовательности.
Заключение
Цель достигнута: простое, масштабируемое Pick-to-Light по WiFi с контролем последовательности. Планируется Проект 3 с улучшениями.
Код
- Arduino Sketch — полный код выше и в оригинале
- Python Script — полный код выше
- Sequence file — пример CSV выше
Схемы
Файл Fritzing: picktolightudp_OCbpNt9XPK.fzz (в оригинале).
Производственный процесс
- Газовые фонари: эволюция, дизайн и современное производство
- Лазерный указатель: дизайн, производство и обзор безопасности
- Фонарик: от изобретения к современным инновациям
- Калейдоскоп: от науки Брюстера к современному дизайну
- Полупроводниковые лазеры: точное генерирование света для современных технологий
- Искусство и наука фотографических процессов: от dageерротипов к современной пленке
- Светофоры: инженерия, история и будущие инновации
- От огня к нити накаливания: эволюция и производство современной лампы накаливания
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- DIY Guitar Speed Pick & Stomp Pedal — моторизированный медиатор на Arduino