Sistem Pick-to-Light Arduino MKR1000 WiFi – Proyek 2
Komponen dan Perlengkapan
- Arduino MKR1000 – 1 unit
- LED (generik) – 2 unit
- Kabel jumper (generik) – 1 set
- Tombol Tekan SparkFun 12mm – 1 unit
- Resistor 10k ohm – 1 unit
- Resistor 330 ohm – 4 unit
- Papan Roti (generik) – 1 unit
- Kabel USB-A ke Micro-USB – 1 unit
- Transistor Tujuan Umum NPN – 1 unit
Tentang Proyek Ini
Ini adalah proyek kedua dalam eksplorasi pick-to-light saya. Dalam yang pertama, saya menjelaskan bagaimana saya melihat pick-to-light sederhana bekerja dan saya membuat pick-to-light sederhana menggunakan komunikasi serial. Ini bekerja tetapi terhubung ke PC melalui kabel. Dalam proyek ini saya ingin mengembangkan proses menggunakan Wi-Fi dan tambahan saya ingin menyertakan nomor urutan dalam konfirmasi pemilihan sehingga jika ada yang salah sistem tahu sampai mana pekerja telah mengambil. Saya akan menggunakan MKR1000 dengan cara yang sama seperti yang saya lakukan dalam proyek 1 tetapi berkomunikasi menggunakan WiFi. Untuk ini saya akan menggunakan UDP (User Datagram Protocol). Meskipun saya belum pernah menggunakannya sebelumnya, berkat library di Arduino dan Python, hal ini ternyata relatif mudah dibuat.
Langkah 1
Untuk memulai kita perlu memiliki Python v 3.6 atau lebih tinggi di laptop atau pc kita. Anda dapat mengunduhnya dari sini: https://www.python.org/downloads/
Langkah 2
Kali ini kita akan menggunakan library socket Python untuk berkomunikasi dan sudah terinstal jadi tidak perlu melakukan apa-apa untuk membuat UDP bekerja.
Langkah 3
Kita juga membutuhkan Arduino IDE baik versi PC atau versi Web. Ini dapat diunduh di sini: https://www.arduino.cc/en/Main/Software atau terhubung ke sini: https://create.arduino.cc/ Instruksi di situs cukup komprehensif jadi saya tidak akan menduplikasi mereka secara tidak perlu.
Langkah 4
Jalankan Python IDLE di PC atau Laptop Anda dan ketik: import os tekan: enter. Lalu ketik: os.getcwd() ini akan memberi Anda direktori kerja saat ini (cwd).
Langkah 5
Dalam Notepad saya membuat file nilai yang dipisahkan koma dan cukup sederhana berisi nomor urutan yang diformat untuk selalu 4 digit dan nomor bin yang dipisahkan oleh koma. Saya menyimpannya sebagai sequence1.txt di cwd yang kita kumpulkan dalam langkah 4 (Anda dapat menyimpan file dengan ekstensi csv tetapi tidak perlu agar csv bekerja). Menyimpan file ke cwd memudahkan hal-hal ketika kita akan membaca file dengan skrip python karena kita tidak perlu menentukan lokasi tempat file disimpan karena secara otomatis akan mencari di cwd.
Langkah 6
Kita akan menggunakan serial dalam sketsa Arduino tetapi hanya sehingga kita dapat melihat pesan yang dicetak pada serial monitor.
Langkah 7
Skrip Python perlu membaca isi file csv satu baris pada satu waktu dan mengirim nomor urutan dan nomor Bin melalui koneksi UDP lalu menunggu sampai Arduino mengembalikan pengakuan, yaitu nomor urutan dari nomor bin terakhir, untuk mengatakan bagian telah diambil. Jika nomor urutan yang diterima tidak cocok dengan nomor urutan terakhir yang dikirim, program Python akan berhenti dengan pesan kesalahan yang menunjukkan nomor urutan. Ini akan memungkinkan urutan untuk dimulai ulang di tempat yang benar. Saya telah menambahkan komentar ke skrip sehingga Anda dapat memahami apa yang telah saya tulis.
Langkah 8
Sketsa Arduino perlu terhubung ke internet lalu menunggu untuk menerima data udp dari PC untuk pemilihan berikutnya. Lalu bertindak pada apa yang diterima dengan menyala-kan LED yang cocok dengan bin dalam urutan. Lalu perlu memantau tombol yang mewakili bin itu untuk melihat apakah ditekan. Setelah pekerja menekan tombol untuk mengatakan bagian telah diambil sketsa mematikan LED dan mengirim pesan yang berisi nomor urutan terakhir kembali ke PC atau Laptop untuk mengatakan bagian telah diambil. Lalu menunggu untuk menerima detail untuk pemilihan berikutnya.
Langkah 9
Hubungkan semuanya sesuai dengan diagram fritzing. Jika Anda telah mengikuti proyek 1 maka Anda akan melihat bahwa saya mengkabel ini secara berbeda. Alasan di balik ini adalah segera WiFi pada MKR1000 menjadi aktif untuk alasan tertentu daya jatuh di pin 8 dan 9 dan LED tidak akan menyala. Saya tidak dapat menemukan siapa pun di web yang memposting sesuatu tentang masalah ini jadi saya menggunakan transistor untuk mengatasi hal ini. Saya yakin akan ada penjelasan untuk ini tetapi sejauh ini saya belum menemukannya.
Peringatan! Pastikan resistor yang Anda gunakan sesuai untuk LED dan transistor NPN yang Anda gunakan. Juga pastikan Anda mengkabel ini dengan benar karena membiarkan 5V bersilang di pin 8 dan 9 dapat merusak Arduino Anda. Gunakan dioda jika Anda tidak yakin.
Langkah 10
Periksa apakah Arduino telah terhubung ke server lalu jalankan skrip Python menggunakan F5 dan LED yang mewakili Bin1 akan menyala. Menekan tombol untuk mengonfirmasi bagian telah diambil akan mengirim nomor urutan kembali ke program Python tempat akan diperiksa dan jika benar, urutan berikutnya dikirim.
Kesimpulan
Well I think I have achieved what I set out to do. It is simple and would be easy to scale up to a full size working version. Namun, saya sudah dapat melihat bahwa proyek 3 dapat membuat perbaikan dan meski kompetisi akan selesai, sebelum saya mendapat kesempatan untuk melakukan proyek lebih lanjut, saya pikir saya ingin melakukan ini untuk melihat bagaimana saya dapat membuatnya lebih baik tetapi tetap mempertahankan ide awal kesederhanaan.
Kode
Sketsa Arduino
#include <SPI.h> #include <WiFi101.h> #include <WiFiUdp.h> const int OKbutton = 2; // set the pin for the okay button/switch const int Bin1 = 8; // the pin that the LED for bin 1 is attached to const int Bin2 = 9; // the pin that the LED for bin 2 is attached to String mydata = " "; // a variable to read incoming serial data into set to empty string String myseq = " "; int buttonPress = 0; // a variable to store state of the button/switch int status = WL_IDLE_STATUS; #include "arduino_secrets.h" ///////please enter your sensitive data in the Secret tab/arduino_secrets.h char ssid[] = SECRET_SSID; // your network SSID (name) char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key Index number (needed only for WEP) unsigned int localPort = 2390; // local port to listen on char packetBuffer[255]; //buffer to hold incoming packet char ReplyBuffer[5] = " "; // a string to send back 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); 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); 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"); } Skrip Python
import csv import socket import time import sys UDP_IP = "192.168.1.119" 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 = "" i=0 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() File Urutan
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
Skematik
Koneksi untuk Pick to Light UDP tersedia dalam file fritzing proyek.