Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Выберите для Light Project 2 WiFi

Компоненты и расходные материалы

Arduino MKR1000
× 1
LED (общий)
× 2
Перемычки (общие)
× 1
Кнопочный переключатель SparkFun, 12 мм
× 1
Резистор 10 кОм
× 1
Резистор 330 Ом
× 4
Макет (общий)
× 1
Кабель USB-A - Micro-USB
× 1
NPN-транзистор общего назначения
× 1

Об этом проекте

Это второй проект, который я выбрал для исследования света. В первом я обрисовал в общих чертах, как я вижу, как работает простой светильник, и создал простой светильник, используя последовательную связь (пожалуйста, прочтите это, если вы хотите больше понять, что я здесь делаю).

Он работал, но был привязан к ПК кабелем. В этом проекте я хочу разработать процесс с использованием Wi-Fi, и, кроме того, я хочу включить порядковый номер в подтверждение выбора, чтобы в случае чего-то пойдет не так, система знала, где подхватил рабочий. Я собираюсь использовать MKR1000 так же, как и в проекте 1, но общаться с помощью Wi-Fi. Для этого я собираюсь использовать UDP (протокол пользовательских дейтаграмм). Хотя я никогда не использовал это раньше, благодаря библиотекам в Arduino и Python, это оказалось относительно легко создать.

Следующие шаги в целом аналогичны проекту 1, поэтому, если вы выполнили их, то вы уже будете знакомы с некоторыми шагами, и их не нужно будет повторять.

Шаг 1

Для начала нам понадобится Python версии 3.6 или выше на нашем ноутбуке или ПК. Вы можете скачать это здесь:

https://www.python.org/downloads/

Шаг 2

На этот раз мы будем использовать для связи библиотеку сокетов Python, и она уже установлена, поэтому для работы UDP ничего делать не нужно.

Шаг 3

Нам также понадобится Arduino IDE либо для ПК, либо для веб-версии. Их можно скачать здесь:

https://www.arduino.cc/en/Main/Software

или подключен сюда:

https://create.arduino.cc/

Инструкции на сайте являются исчерпывающими, поэтому я не буду дублировать их без надобности.

Шаг 4

Запустите Python IDLE на своем ПК или ноутбуке и введите:import os press:enter.

Затем введите:os.getcwd (), это даст вам текущий рабочий каталог (cwd).

Рабочий каталог Python

Шаг 5

В Блокноте я создал файл значений, разделенных запятыми, и он довольно просто содержит порядковый номер, отформатированный так, чтобы он всегда состоял из 4 цифр, и номер ячейки, разделенный запятой. См. Снимок экрана Блокнота ниже, а также прикрепленный текстовый файл, который вы можете скачать. Я сохранил его как sequence1.txt в cwd, который мы собрали на шаге 4 (вы можете сохранить файл с расширением csv, но для работы csv это не обязательно). Сохранение файла в cwd упрощает работу, когда мы приступаем к чтению файла с помощью скрипта python, поскольку нам не нужно указывать место, где хранится файл, потому что он будет автоматически искать в cwd.

txt файл, содержащий последовательность csv

Шаг 6

Мы будем использовать серийный номер в скетче Arduino, но только для того, чтобы мы могли видеть напечатанные сообщения на мониторе последовательного порта.

Шаг 7

Сценарий Python должен считывать содержимое файла csv по одной строке за раз и отправлять порядковый номер и номер ячейки через UDP-соединение, а затем ждать, пока Arduino не вернет подтверждение, которое является порядковым номером последнего номера ячейки. , чтобы сказать, что деталь выбрана. Если полученный порядковый номер не совпадает с последним отправленным порядковым номером, программа Python остановится с сообщением об ошибке с указанием порядкового номера. Это позволит перезапустить последовательность в правильном месте. Я добавил комментарии к сценарию, чтобы вы могли понять, что я написал.

Скопируйте сценарий, затем запустите IDLE, а затем> Файл> Новый файл и вставьте сценарий в окно. Затем> Файл> Сохранить как дайте ему имя (неважно, как вы его называете, если вы знаете имя).

Шаг 8

Скетч Arduino должен подключиться к Интернету, а затем дождаться получения данных udp от ПК для следующего выбора. Затем он воздействует на то, что получает, зажигая светодиод, который соответствует бункеру в последовательности. Затем ему необходимо следить за кнопкой, которая представляет эту корзину, чтобы увидеть, нажата ли она. Как только рабочий нажимает кнопку, чтобы сказать, что деталь выбрана, в эскизе выключается светодиод и отправляется сообщение, содержащее последний порядковый номер, обратно на ПК или ноутбук, чтобы сообщить, что деталь выбрана. Затем он ожидает получения деталей для следующего выбора.

Поэтому, если вы используете веб-редактор Arduino, скопируйте эскиз снизу и в веб-редакторе Arduino выберите> альбом> НОВЫЙ ЭСКИЗ

Веб-редактор Arduino

Затем вставьте скрипт в новый набросок, полностью заменив все, что там есть.

Если вы используете веб-редактор Arduino, как только вы вставляете эскиз, редактор определяет необходимость создания секретного файла, который будет содержать SSID и пароль для этого сервера.

Это простой случай добавления соответствующих деталей в файл в отведенных для этого местах.

С Arduino IDE это может быть так же просто, но если это так, я не смог его найти. Однако, поскольку я начал свой скетч с примера скетча WiFiUdpSendReceiveString.

Если вы откроете его, вы обнаружите, что внутри него уже есть вкладка arduino_secrets.h. Добавьте свой SSID и пароль, затем вставьте эскиз ниже поверх уже существующего эскиза и сохраните его под любым именем.

Если вы используете IDE Arduino, вам нужно будет включить библиотеку WiFi101, по следующей ссылке объясняется, как добавить библиотеку, если вы не знаете.

https://www.arduino.cc/en/Guide/Libraries

Загрузите в MKR1000.

Шаг 9

Подключите все согласно схеме фритзинга. Если вы следовали проекту 1, вы увидите, что я подключил его по-другому. Причина в том, что как только Wi-Fi на MKR1000 становится активным, по какой-то причине мощность падает на контактах 8 и 9, и светодиоды не загораются. Я не смог найти в сети кого-либо еще, кто бы опубликовал что-либо об этой проблеме, поэтому я использовал транзистор, чтобы обойти ее. Я уверен, что этому будет объяснение, но пока я его не нашел.

Предупреждение! Убедитесь, что используемые резисторы подходят для используемого светодиода и NPN-транзистора. Также убедитесь, что вы подключили его правильно, так как замыкание 5 В на контакты 8 и 9 может вывести из строя ваш Arduino. Если вы не уверены, используйте диод.

Шаг 10

Убедитесь, что Arduino подключился к серверу, а затем запустите скрипт Python с помощью F5, и загорится светодиод, представляющий Bin1. Нажатие кнопки для подтверждения выбора детали отправит порядковый номер обратно в программу Python, где он будет проверен, и, если он верен, будет отправлена ​​следующая последовательность.

Вывод Python будет выглядеть следующим образом

Выходные данные монитора последовательного порта будут выглядеть следующим образом:

Вы можете проверить сбой последовательности, прокомментировав строку:

myseq.toCharArray (ReplyBuffer, 5);

и раскомментируя строку:

// char ReplyBuffer [5] ="0001";

следующим образом;

Теперь, когда вы запустите программу python, выполнение остановится после второй корзины, так как она сообщит порядковый номер первой корзины.

В случае сбоя последовательности человеку, создающему последовательность, потребуется отредактировать файл, содержащий последовательность, и перезапустить Arduino и программу Python.

Заключение

Что ж, я думаю, что добился того, что намеревался сделать. Это просто и легко масштабируется до полноразмерной рабочей версии. Тем не менее, я уже вижу, что проект 3 может быть улучшен, и даже несмотря на то, что конкурс будет завершен, прежде чем у меня появится возможность выполнить следующий проект, я думаю, что хотел бы сделать это, чтобы увидеть, как я могу его улучшить, но все же сохраняя первоначальную идею простоты.

Код

  • Эскиз Arduino
  • Скрипт Python
  • Последовательность
Эскиз Arduino Arduino
Скетч для загрузки в MKR1000
 #include  #include  #include  const int OKbutton =2; // устанавливаем контакт для кнопки ОК / switchconst int Bin1 =8; // вывод, к которому подключен светодиод для бункера 1 const int Bin2 =9; // вывод, к которому подключен светодиод для корзины 2, toString mydata =""; // пустая переменная для чтения входящих последовательных данных stringString myseq =""; int buttonPress =0; // переменная для хранения состояния кнопки / switchint status =WL_IDLE_STATUS; #include "arduino_secrets.h" /////// пожалуйста, введите ваши конфиденциальные данные на вкладке Secret / arduino_secrets.hchar ssid [] =SECRET_SSID; // SSID вашей сети (имя) char pass [] =SECRET_PASS; // ваш сетевой пароль (используйте для WPA или используйте как ключ для WEP) int keyIndex =0; // номер индекса вашего сетевого ключа (необходим только для WEP) unsigned int localPort =2390; // локальный порт для прослушивания пакета onchar packetBuffer [255]; // буфер для хранения входящего пакетаchar ReplyBuffer [5] =""; // строка для отправки backString mystring; WiFiUDP Udp; void setup () {// Инициализируем последовательный порт и ждем открытия порта:Serial.begin (9600); // все операторы последовательного интерфейса не нужны после настройки // while ( ! Serial) {// ждем подключения последовательного порта. Требуется только для собственного USB-порта} // проверка наличия экрана:if (WiFi.status () ==WL_NO_SHIELD) {Serial.println («WiFi Shield отсутствует»); // не продолжать:while (true); } // пытаемся подключиться к сети Wi-Fi:while (status! =WL_CONNECTED) {Serial.print ("Попытка подключиться к SSID:"); Serial.println (ssid); // Подключаемся к сети WPA / WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:status =WiFi.begin (ssid, pass); // ждем 10 секунд подключения:delay (10000); } Serial.println («Подключен к Wi-Fi»); printWiFiStatus (); Serial.println ("\ nНачало подключения к серверу ..."); // если вы установили соединение, сообщите через последовательный порт:Udp.begin (localPort);} void loop () {// если есть данные, прочитать пакет int packetSize =Udp.parsePacket (); if (packetSize) {Serial.print ("Размер полученного пакета"); Serial.println (размер пакета); Serial.print («От»); IP-адрес remoteIp =Udp.remoteIP (); Serial.print (удаленный IP); Serial.print (", порт"); Serial.println (Udp.remotePort ()); // считываем пакет в packetBufffer int len ​​=Udp.read (packetBuffer, 255); если (len> 0) packetBuffer [len] =0; Serial.println ("Содержание:"); Serial.println (packetBuffer); String mystring (packetBuffer); mydata =mystring.substring (4); myseq =mystring.substring (0,4); Serial.println (мои данные); Serial.println (myseq); while (mydata! ="") {// Проверяем, пусты ли mydata, если не проверяем, какой лоток должен светиться if (mydata =="Bin1") {// запускать подпрограмму бункера 1 digitalWrite (Bin1 , ВЫСОКИЙ); // зажечь светодиод для бункера 1, установив на выводе высокий уровень digitalWrite (Bin2, LOW); // выключаем светодиод для бункера 2, устанавливая на выводе низкий уровень while (buttonPress! =HIGH) {// ждем цикла нажатия кнопки buttonPress =digitalRead (OKbutton); // продолжаем проверять кнопку mydata =""; // возвращаем mydata в пустую строку} digitalWrite (Bin1, LOW); // выключаем светодиод для корзины 1 Serial.println ("Picked"); // отправляем сообщение на ПК buttonPress =0; // кнопка сброса low delay (1000); } if (mydata =="Bin2") {// запуск подпрограммы бункера 2 digitalWrite (Bin2, HIGH); // зажечь светодиод для бункера 2, установив на выводе высокий уровень digitalWrite (Bin1, LOW); // выключаем светодиод для бункера 1, устанавливая на выводе низкий уровень while (buttonPress! =HIGH) {// ждем цикла нажатия кнопки buttonPress =digitalRead (OKbutton); // продолжаем проверять кнопку mydata =""; // возвращаем mydata в пустую строку} digitalWrite (Bin2, LOW); // выключаем светодиод для бункера 1 Serial.println ("Picked"); // отправляем сообщение на ПК buttonPress =0; // кнопка сброса low delay (1000); }} // отправляем ответ на IP-адрес и порт, которые отправили нам полученный пакет myseq.toCharArray (ReplyBuffer, 5); // char ReplyBuffer [5] ="0001"; // только для тестирования Udp.beginPacket (Udp.remoteIP (), Udp.remotePort ()); Udp.write (ReplyBuffer); Udp.endPacket (); Serial.println (ReplyBuffer); }} void printWiFiStatus () {// распечатываем SSID сети, к которой вы подключены:Serial.print ("SSID:"); Serial.println (WiFi.SSID ()); // выводим IP-адрес вашего WiFi-экрана:IPAddress ip =WiFi.localIP (); Serial.print ("IP-адрес:"); Serial.println (ip); // выводим мощность полученного сигнала:long rssi =WiFi.RSSI (); Serial.print ("мощность сигнала (RSSI):"); Серийный принт (RSSI); Serial.println ("дБм");} 
Скрипт Python Python
Скрипт Python для запуска.
 ## загрузить необходимые библиотекиimport csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## IP-адрес нашего ArduinoUDP_PORT =2390 ## порт, с которым мы хотим общаться на принтере ("UDP target IP:" , UDP_IP) ## отобразить ip для userprint ("UDP target port:", UDP_PORT) ## отобразить порт для usersock =socket.socket (socket.AF_INET, socket.SOCK_DGRAM) # создать sockettime.sleep (5) ## open csv и прочитайте его по одной строке за раз с open ('sequence1.txt') как csvDataFile:csvReader =csv.reader (csvDataFile) для строки в csvReader:## для каждой строки выполните следующее myseq =row [0] # # читать в порядковом номере mystate =row [1] ## читать в ячейке номер myrow =row [0] + row [1] print («Текущая выбранная последовательность», myseq, «from», mystate) sock.sendto (bytes (myrow, "utf-8"), (UDP_IP, UDP_PORT)) # отправить seq и номер бункера data ="" # установить пустые данные для ввода while loop i =до тех пор, пока данные не будут получены while data =="":# пока данные не будут получены, продолжаем цикл (data, addr) =soc k.recvfrom (1024) # установить данные для данных, полученных из сокета mytest =data.decode ("utf-8") # установить mytest равным значению, полученному через сокет print ("Pick =", mytest) # распечатать полученное значение, если mytest! =myseq:# проверка того, что получено, совпадает с ожидаемым, т. е. последняя отправленная seq print ("в последовательности есть ошибка последовательности", mytest) # выводить сообщение, указывающее на ошибку sys.exit () # завершать выполнение программы, если ошибка существует 
Последовательность Обычный текст
Файл последовательности для программы Python
 0001, Bin10002, Bin20003, Bin10004, Bin20005, Bin10006, Bin20007, Bin10008, Bin20009, Bin10010, Bin20011, Bin10012, Bin20013, Bin1 

Схема

Подключения для UDP Pick to Light picktolightudp_OCbpNt9XPK.fzz

Производственный процесс

  1. Газовый фонарь
  2. Лазерная указка
  3. Фонарик
  4. Калейдоскоп
  5. Полупроводниковый лазер
  6. Фотография
  7. Сигнал трафика
  8. Лампочка
  9. Простой датчик препятствий с Arduino
  10. Гитарный медиатор и педаль Stomp!