산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Pick to Light Project 2 WiFi

구성품 및 소모품

Arduino MKR1000
× 1
LED(일반)
× 2
점퍼 와이어(일반)
× 1
SparkFun 푸시버튼 스위치 12mm
× 1
저항 10k 옴
× 1
저항 330옴
× 4
브레드보드(일반)
× 1
USB-A-마이크로 USB 케이블
× 1
범용 트랜지스터 NPN
× 1

이 프로젝트 정보

이것은 내가 선택한 빛 탐색의 두 번째 프로젝트입니다. 처음에는 간단한 pick to light 작업을 보는 방법을 설명했고 직렬 통신을 사용하여 간단한 pick to light를 만들었습니다(여기서 내가 하는 일에 대해 더 알고 싶다면 이 글을 읽으십시오).

작동했지만 케이블로 PC에 연결되었습니다. 이 프로젝트에서는 Wi-Fi를 사용하여 프로세스를 개발하고 추가로 피킹 확인에 시퀀스 번호를 포함하여 문제가 발생하면 시스템이 작업자가 픽업한 위치를 알 수 있도록 하고 싶습니다. 저는 프로젝트 1에서 했던 것과 같은 방식으로 MKR1000을 사용하지만 WiFi를 사용하여 통신할 것입니다. 이를 위해 UDP(User Datagram Protocol)를 사용할 것입니다. 저는 이것을 사용한 적이 없지만 Arduino와 Python의 라이브러리 덕분에 비교적 쉽게 만들 수 있었습니다.

다음 단계는 프로젝트 1과 대체로 유사하므로 이 단계를 따랐다면 이미 일부 단계에 익숙할 것이며 반복할 필요가 없습니다.

1단계

시작하려면 랩톱이나 PC에 Python v 3.6 이상이 있어야 합니다. 여기에서 다운로드할 수 있습니다:

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

2단계

이번에는 통신을 위해 Python 소켓 라이브러리를 사용할 것이며 이미 설치되어 있으므로 UDP가 작동하도록 할 필요가 없습니다.

3단계

또한 PC 버전 또는 웹 버전의 Arduino IDE가 필요합니다. 여기에서 다운로드할 수 있습니다.

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

또는 여기에 연결:

https://create.arduino.cc/

사이트의 지침은 포괄적이므로 불필요하게 복제하지 않겠습니다.

4단계

PC나 노트북에서 Python IDLE을 실행하고 import os press:enter를 입력합니다.

그런 다음 다음을 입력하십시오. os.getcwd() 이것은 현재 작업 디렉토리(cwd)를 제공해야 합니다.

파이썬 작업 디렉토리

5단계

메모장에서 쉼표로 구분된 값 파일을 만들었습니다. 이 파일에는 항상 4자리로 형식이 지정된 시퀀스 번호와 쉼표로 구분된 빈 번호가 포함되어 있습니다. 아래 메모장 스크린샷과 다운로드할 수 있는 첨부된 텍스트 파일을 참조하십시오. 나는 이것을 4단계에서 수집한 cwd에 sequence1.txt로 저장했습니다(csv 확장자로 파일을 저장할 수 있지만 csv가 작동할 필요는 없습니다). 파일을 cwd에 저장하면 파일이 자동으로 cwd에서 검색되기 때문에 파일이 저장된 위치를 지정할 필요가 없기 때문에 Python 스크립트로 파일을 읽을 때 작업이 간소화됩니다.

csv 시퀀스가 ​​포함된 txt 파일

6단계

우리는 Arduino 스케치에서 직렬을 사용할 것이지만 직렬 모니터에서 인쇄된 메시지를 보기 위해서만 사용할 것입니다.

7단계

Python 스크립트는 csv 파일의 내용을 한 번에 한 줄씩 읽고 UDP 연결을 통해 시퀀스 번호와 Bin 번호를 보낸 다음 Arduino가 마지막 bin 번호의 시퀀스 번호인 승인을 반환할 때까지 기다려야 합니다. , 부품이 선택되었음을 나타냅니다. 수신된 시퀀스 번호가 전송된 마지막 시퀀스 번호와 일치하지 않으면 Python 프로그램은 시퀀스 번호를 나타내는 오류 메시지와 함께 중지됩니다. 이렇게 하면 시퀀스가 ​​올바른 위치에서 다시 시작될 수 있습니다. 내가 쓴 내용을 이해할 수 있도록 스크립트에 주석을 추가했습니다.

스크립트를 복사한 다음 IDLE을 시작한 다음>파일>새 파일을 실행하고 스크립트를 창에 붙여넣습니다. 그런 다음>파일>다른 이름으로 저장 이름을 지정합니다(이름을 알고 있는 한 어떤 이름을 불러도 상관 없음).

8단계

Arduino 스케치는 인터넷에 연결한 다음 다음 선택을 위해 PC에서 udp 데이터를 수신할 때까지 기다려야 합니다. 그런 다음 시퀀스의 빈과 일치하는 LED를 켜서 수신한 내용에 따라 작동합니다. 그런 다음 해당 빈을 나타내는 버튼을 모니터링하여 눌렸는지 확인해야 합니다. 작업자가 부품이 선택되었다고 버튼을 누르면 스케치가 LED를 끄고 마지막 시퀀스 번호가 포함된 메시지를 PC 또는 노트북으로 다시 보내 부품이 선택되었음을 알려줍니다. 그런 다음 다음 선택에 대한 세부 정보를 받을 때까지 기다립니다.

따라서 Arduino 웹 편집기를 사용하는 경우 스케치 아래에서 복사하고 Arduino 웹 편집기에서>sketchbook>NEW SKETCH

를 선택합니다.

Arduino 웹 편집기

그런 다음 새 스케치에 스크립트를 붙여넣고 거기에 있는 모든 것을 완전히 대체합니다.

Arduino 웹 편집기를 사용하는 경우 스케치에 붙여넣는 즉시 편집기에서 해당 서버의 SSID와 암호를 포함할 비밀 파일을 생성해야 할 필요성을 식별합니다.

제공된 공간에 파일에 관련 세부 정보를 추가하는 간단한 경우입니다.

Arduino IDE를 사용하면 간단할 수 있지만 찾을 수 없습니다. 그러나 WiFiUdpSendReceiveString 예제 스케치로 스케치를 시작했기 때문에.

이것을 열면 이미 그 안에 arduino_secrets.h 탭이 있습니다. SSID와 비밀번호를 추가한 다음 이미 있는 스케치 위에 아래 스케치를 붙여넣고 원하는 이름으로 저장하세요.

Arduino IDE를 사용하는 경우 라이브러리 WiFi101을 포함해야 합니다. 다음 링크는 모르는 경우 라이브러리를 추가하는 방법을 설명합니다.

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

MKR1000으로 다운로드합니다.

9단계

fritzing 다이어그램에 따라 모든 것을 연결하십시오. 프로젝트 1을 따랐다면 내가 이것을 다르게 연결했음을 알 수 있을 것입니다. 그 이유는 MKR1000의 WiFi가 어떤 이유로든 활성화되자마자 핀 8과 9에서 전원이 떨어지고 LED가 켜지지 않기 때문입니다. 웹에서 이 문제에 대해 게시하는 다른 사람을 찾을 수 없었기 때문에 트랜지스터를 사용하여 문제를 해결했습니다. 이에 대한 설명이 있을 것이라고 확신하지만 아직까지는 찾지 못했습니다.

경고! 사용하는 저항이 사용하는 LED 및 NPN 트랜지스터에 적합한지 확인하십시오. 또한 핀 8과 9에서 5V가 단락되도록 허용하면 Arduino가 손상될 수 있으므로 올바르게 배선해야 합니다. 확실하지 않은 경우 다이오드를 사용하십시오.

10단계

Arduino가 서버에 연결되었는지 확인한 다음 F5를 사용하여 Python 스크립트를 실행하면 Bin1을 나타내는 LED가 켜집니다. 부품이 선택되었는지 확인하기 위해 버튼을 누르면 시퀀스 번호가 Python 프로그램으로 다시 전송되어 검사되고 정확하면 다음 시퀀스가 ​​전송됩니다.

Python 출력은 다음과 같습니다.

직렬 모니터 출력은 다음과 같습니다.

다음 줄을 주석 처리하여 시퀀스 실패를 테스트할 수 있습니다.

myseq.toCharArray(응답 버퍼, 5);

줄의 주석 처리를 제거합니다.

//문자 응답버퍼[5] ="0001";

다음과 같이;

이제 파이썬 프로그램을 실행하면 첫 번째 빈의 시퀀스 번호를 보고하므로 두 번째 빈 이후에 실행이 중지됩니다.

시퀀스 실패의 경우 시퀀스를 만드는 사람은 시퀀스가 ​​포함된 파일을 편집하고 arduino와 Python 프로그램을 다시 시작해야 합니다.

결론

글쎄요, 저는 제가 하려고 했던 것을 달성했다고 생각합니다. 간단하고 전체 크기 작업 버전으로 쉽게 확장할 수 있습니다. 그러나 이미 프로젝트 3이 개선될 수 있다는 것을 알 수 있으며 경쟁이 종료되더라도 추가 프로젝트를 수행할 기회가 있기 전에 이 작업을 수행하여 어떻게 더 잘 만들 수 있는지 확인하고 싶지만 여전히 단순함의 초기 아이디어를 유지합니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Arduino 스케치
  • Python 스크립트
  • 시퀀스
  • Arduino 스케치Arduino
    MKR1000에 로드할 스케치
    #include #include #include const int OKbutton =2; // OK 버튼/switchconst에 대한 핀 설정 int Bin1 =8; // bin 1의 LED가 연결된 핀 const int Bin2 =9; // bin 2의 LED가 연결된 핀 toString mydata =" "; // 들어오는 직렬 데이터를 읽을 변수를 공백으로 설정 stringString myseq =" ";int buttonPress =0; // 버튼의 상태를 저장할 변수/switchint status =WL_IDLE_STATUS;#include "arduino_secrets.h" ///////비밀 탭에 민감한 데이터를 입력하세요/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 not present"); // 계속하지 않음:while(true); } // WiFi 네트워크 연결 시도:while ( status !=WL_CONNECTED) { Serial.print("Attempting to connect to SSID:"); Serial.println(ssid); // WPA/WPA2 네트워크에 연결합니다. 개방형 또는 WEP 네트워크를 사용하는 경우 이 줄을 변경하십시오. status =WiFi.begin(ssid, pass); // 연결을 위해 10초 대기:delay(10000); } Serial.println("와이파이에 연결되었습니다"); 인쇄WiFi 상태(); 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); if (len> 0) packetBuffer[len] =0; Serial.println("내용:"); Serial.println(패킷 버퍼); 문자열 mystring(패킷 버퍼); mydata =mystring.substring(4); myseq =mystring.substring(0,4); Serial.println(mydata); Serial.println(myseq); while (mydata !=" "){ // mydata가 비어 있는지 테스트하지 않으면 어떤 bin을 켜야 하는지 확인합니다. if (mydata =="Bin1"){ // bin 1 루틴 시작 digitalWrite(Bin1 , 높은); // 핀을 높게 설정하여 빈 1의 LED를 켜십시오. digitalWrite(Bin2, LOW); // 핀을 로우로 설정하여 빈 2의 LED를 끕니다. while (buttonPress !=HIGH) { // 버튼 누름 루프를 기다립니다. buttonPress =digitalRead(OKbutton); //계속 버튼 확인 mydata =" "; // mydata를 다시 빈 문자열로 설정 } digitalWrite(Bin1, LOW);// bin 1의 led를 끕니다. Serial.println("Picked"); //PC로 메시지 보내기 buttonPress =0; //리셋 버튼 낮은 지연(1000); } if (mydata =="Bin2"){// 빈 2 루틴 시작 digitalWrite(Bin2, HIGH);// 핀을 높게 설정하여 빈 2의 LED 켜기 digitalWrite(Bin1, LOW); // 핀을 로우로 설정하여 빈 1의 LED를 끕니다. while (buttonPress !=HIGH) { // 버튼 누름 루프를 기다립니다. buttonPress =digitalRead(OKbutton); //계속 버튼 확인 mydata =" "; // mydata를 emty 문자열로 다시 설정 } digitalWrite(Bin2, LOW); // 빈 1의 led를 끕니다. Serial.println("Picked"); //PC로 메시지 보내기 buttonPress =0; //리셋 버튼 낮은 지연(1000); } } // 우리가 받은 패킷을 보낸 IP 주소와 포트로 응답을 보냅니다. myseq.toCharArray(ReplyBuffer, 5); //문자 응답버퍼[5] ="0001"; // 테스트 전용 Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(응답 버퍼); Udp.endPacket(); Serial.println(응답 버퍼); }}void printWiFiStatus() { // 연결된 네트워크의 SSID를 인쇄합니다. Serial.print("SSID:"); Serial.println(WiFi.SSID()); // WiFi 실드의 IP 주소를 인쇄합니다. IPAddress ip =WiFi.localIP(); Serial.print("IP 주소:"); 직렬.println(ip); // 수신된 신호 강도를 출력합니다. long rssi =WiFi.RSSI(); Serial.print("신호 강도(RSSI):"); Serial.print(rssi); Serial.println("dBm");}
    파이썬 스크립트파이썬
    실행할 Python 스크립트.
    ## 필요한 라이브러리 로드import csvimport socketimport timeimport sysUDP_IP ="192.168.1.119" ## ArduinoUDP_PORT의 ip =2390 ## 통신하려는 포트 onprint("UDP target IP:" , UDP_IP) ## display ip to userprint("UDP target port:", UDP_PORT) ## display port to usersock =socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # sockettime.sleep(5)##open 생성 csv 파일을 열고('sequence1.txt') csvDataFile:csvReader =csv.reader(csvDataFile) for row in csvReader:##for each line 수행 myseq =row[0] # # 시퀀스 번호 읽기 mystate =row[1] ##bin 번호 읽기 myrow =row[0] + row[1] print("현재 시퀀스 선택 중 ",myseq,"from ", mystate) sock.sendto (bytes(myrow, "utf-8"), (UDP_IP, UDP_PORT)) # send seq 및 bin number data ="" # 루프 i=데이터가 수신될 때까지 데이터가 수신될 때까지 while 루프에 들어가기 위해 데이터를 공백으로 설정 =="":# 데이터가 수신될 때까지 계속 반복(data, addr) =soc k.recvfrom(1024) # 소켓에서 받은 데이터로 데이터 설정 mytest =data.decode( "utf-8") # mytest를 소켓을 통해 받은 값과 동일하게 설정 print("picked =", mytest) # 다음과 같은 경우 받은 값을 출력 mytest !=myseq:# 받은 내용이 예상한 내용과 일치하는지 테스트합니다. 즉, 마지막 seq가 보낸 내용과 일치합니다. 결함이 존재합니다
    시퀀스일반 텍스트
    파이썬 프로그램의 시퀀스 파일
    0001,Bin10002,Bin20003,Bin10004,Bin20005,Bin10006,Bin20007,Bin10008,Bin20009,Bin10010,Bin2001  

    회로도

    UDP Pick to Light 연결 picktolightudp_OCbpNt9XPK.fzz

    제조공정

    1. 가스 랜턴
    2. 레이저 포인터
    3. 손전등
    4. 만화경
    5. 반도체 레이저
    6. 사진
    7. 교통 신호
    8. 전구
    9. Arduino를 사용한 간단한 장애물 센서
    10. 기타 스피드 픽 및 스톰프 페달!