工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
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

このプロジェクトについて

これは、光探査への私の選択の2番目のプロジェクトです。最初に、簡単なピック・トゥ・ライトが機能している様子を概説し、シリアル通信を使用して簡単なピック・トゥ・ライトを作成しました(私がここで行っていることをもっと理解したい場合は、これを読んでください)。

動作しましたが、ケーブルでPCに接続されていました。このプロジェクトでは、Wi-Fiを使用してプロセスを開発し、さらに、ピッキング確認にシーケンス番号を含めて、問題が発生した場合にシステムがワーカーがどこでピッキングしたかを認識できるようにします。プロジェクト1と同じようにMKR1000を使用しますが、WiFiを使用して通信します。これを行うには、UDP(ユーザーデータグラムプロトコル)を使用します。これまで使用したことはありませんが、ArduinoとPythonのライブラリのおかげで、これは比較的簡単に作成できることがわかりました。

次の手順はプロジェクト1とほぼ同じであるため、これを実行した場合は、いくつかの手順に既に精通しているため、繰り返す必要はありません。

ステップ1

開始するには、ラップトップまたはPCにPython v3.6以降がインストールされている必要があります。こちらからダウンロードできます:

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

ステップ2

今回は通信にPythonソケットライブラリを使用します。これはすでにインストールされているため、UDPを機能させるために何もする必要はありません。

ステップ3

また、PCバージョンまたはWebバージョンのArduinoIDEも必要です。これらはここからダウンロードできます:

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

またはここに接続:

https://create.arduino.cc/

サイトの説明は包括的であるため、不必要に複製することはありません。

ステップ4

PCまたはラップトップでPythonIDLEを起動し、次のように入力します。importos press:Enter。

次に、次のように入力します。os.getcwd()これにより、現在の作業ディレクトリ(cwd)が表示されます。

Python作業ディレクトリ

ステップ5

メモ帳でコンマ区切りの値ファイルを作成しました。このファイルには、常に4桁になるようにフォーマットされたシーケンス番号と、コンマで区切られたビン番号が含まれています。以下のメモ帳のスクリーンショットと、ダウンロード可能な添付のテキストファイルを参照してください。これを手順4で収集したcwdにsequence1.txtとして保存しました(ファイルをcsvの拡張子で保存できますが、csvが機能する必要はありません)。ファイルをcwdに保存すると、ファイルが自動的にcwdを検索するため、ファイルの保存場所を指定する必要がないため、Pythonスクリプトを使用してファイルを読み取る際の作業が簡単になります。

csvシーケンスを含むtxtファイル

ステップ6

Arduinoスケッチではシリアルを使用しますが、シリアルモニターで印刷されたメッセージを確認できるようにするためだけです。

ステップ7

Pythonスクリプトは、csvファイルのコンテンツを一度に1行ずつ読み込み、UDP接続を介してシーケンス番号とビン番号を送信し、Arduinoが最後のビン番号のシーケンス番号である確認応答を返すまで待機する必要があります。 、パーツが選択されていると言います。受信したシーケンス番号が最後に送信されたシーケンス番号と一致しない場合、Pythonプログラムは、シーケンス番号を示すエラーメッセージで停止します。これにより、シーケンスを正しい場所で再開できるようになります。私が書いたものを理解できるように、スクリプトにコメントを追加しました。

スクリプトをコピーしてからIDLEを起動し、> [ファイル]> [新しいファイル]を選択して、スクリプトをウィンドウに貼り付けます。次に、> [ファイル]> [名前を付けて保存]に名前を付けます(名前がわかっている限り、何と呼んでもかまいません)。

ステップ8

Arduinoスケッチはインターネットに接続し、次のピックのためにPCからudpデータを受信するのを待つ必要があります。次に、シーケンス内のビンに一致するLEDを点灯することにより、受信したものに作用します。次に、そのビンを表すボタンを監視して、押されているかどうかを確認する必要があります。作業者がボタンを押して部品が選択されたことを通知すると、スケッチはLEDを点灯し、最後のシーケンス番号を含むメッセージをPCまたはラップトップに送信して部品が選択されたことを通知します。次に、次のピックの詳細を受け取るのを待ちます。

したがって、スケッチの下からArduino Webエディターのコピーを使用している場合は、ArduinoWebエディターで> sketchbook> NEW SKETCH

を選択します。

ArduinoWebエディター

次に、スクリプトを新しいスケッチに貼り付けて、そこにあるすべてのものを完全に置き換えます。

スケッチを貼り付けるとすぐにArduinoWebエディターを使用している場合、エディターは、そのサーバーのSSIDとパスワードを含むシークレットファイルを作成する必要があることを識別します。

これは、提供されたスペースのファイルに関連する詳細を追加する単純なケースです。

Arduino IDEを使えば、それは同じくらい簡単かもしれませんが、それなら私はそれを見つけることができませんでした。ただし、スケッチをサンプルスケッチWiFiUdpSendReceiveStringで開始したためです。

これを開くと、すでにタブarduino_secrets.hがあります。 SSIDとパスワードを追加し、下のスケッチをすでにそこにあるスケッチの上に貼り付けて、好きな名前で保存します。

Arduino IDEを使用している場合は、ライブラリWiFi101を含める必要があります。わからない場合は、次のリンクでライブラリを追加する方法を説明しています。

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

MKR1000にダウンロードします。

ステップ9

フリッツの図に従ってすべてを接続します。プロジェクト1を実行した場合は、これを別の方法で配線したことがわかります。この背後にある理由は、MKR1000のWiFiが何らかの理由でアクティブになるとすぐに、ピン8と9で電力が低下し、LEDが点灯しないためです。この問題について何も投稿していないウェブ上の人を見つけることができなかったので、トランジスタを使用して問題を回避しました。これについては説明があると思いますが、今のところ見つかりません。

警告! 使用する抵抗が、使用するLEDとNPNトランジスタに適していることを確認してください。また、ピン8と9の間で5Vを短絡させると、Arduinoが破壊される可能性があるため、これを正しく配線するようにしてください。よくわからない場合は、ダイオードを使用してください。

ステップ10

Arduinoがサーバーに接続していることを確認してから、F5を使用してPythonスクリプトを実行すると、Bin1を表すLEDが点灯します。ボタンを押してパーツが選択されたことを確認すると、シーケンス番号がPythonプログラムに返され、そこでチェックされ、正しい場合は次のシーケンスが送信されます。

Pythonの出力は次のようになります

シリアルモニターの出力は次のようになります:

次の行にコメントを付けることで、シーケンスの失敗をテストできます。

myseq.toCharArray(ReplyBuffer、5);

行のコメントを外す:

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

次のように;

Pythonプログラムを実行すると、最初のビンのシーケンス番号が報告されるため、2番目のビンの後で実行が停止します。

シーケンスに障害が発生した場合、シーケンスを作成する人は、シーケンスを含むファイルを編集して、arduinoとPythonプログラムを再起動する必要があります。

結論

さて、私は自分がやろうとしていたことを達成したと思います。シンプルで、フルサイズの作業バージョンに簡単にスケールアップできます。しかし、プロジェクト3は改善の余地があることはすでにわかっており、競争は終了しますが、次のプロジェクトを行う機会を得る前に、どうすれば改善できるかを確認したいと思います。シンプルさの最初のアイデアを維持します。

コード

  • Arduinoスケッチ
  • Pythonスクリプト
  • シーケンス
Arduinoスケッチ Arduino
MKR1000にロードされるスケッチ
 #include  #include  #include  const int OKbutton =2; // OKボタン/ switchconstのピンを設定しますintBin1 =8; //ビン1のLEDが接続されているピンconstint Bin2 =9; //ビン2のLEDが接続されているピンStringmydata =""; //着信シリアルデータを読み込んで空の文字列に設定する変数stringStringmyseq =""; int buttonPress =0; //ボタンの状態を保存する変数/ switchint status =WL_IDLE_STATUS; #include "arduino_secrets.h" ///////機密データを[シークレット]タブに入力してください/arduino_secrets.hcharssid [] =SECRET_SSID; //ネットワークSSID(name)char pass [] =SECRET_PASS; //ネットワークパスワード(WPAに使用、またはWEPのキーとして使用)int keyIndex =0; //ネットワークキーのインデックス番号(WEPにのみ必要)unsigned int localPort =2390; // onchar packetBuffer [255]をリッスンするローカルポート; //着信パケットを保持するバッファcharReplyBuffer [5] =""; //送信する文字列backStringmystring; WiFiUDP Udp; void setup(){//シリアルを初期化し、ポートが開くのを待ちます:Serial.begin(9600); //一度設定すると、すべてのシリアルステートメントは必要ありません// while( !Serial){//シリアルポートが接続するのを待ちます。ネイティブUSBポートにのみ必要} //シールドの存在を確認します:if(WiFi.status()==WL_NO_SHIELD){Serial.println( "WiFiシールドが存在しません"); //続行しない:while(true); } // WiFiネットワークへの接続を試みます: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(packetSize); Serial.print( "From"); IPアドレスremoteIp =Udp.remoteIP(); Serial.print(remoteIp); Serial.print( "、ポート"); Serial.println(Udp.remotePort()); //パケットをpacketBuffferに読み込みますintlen =Udp.read(packetBuffer、255); if(len> 0)packetBuffer [len] =0; Serial.println( "コンテンツ:"); Serial.println(packetBuffer);文字列mystring(packetBuffer); mydata =mystring.substring(4); myseq =mystring.substring(0,4); Serial.println(mydata); Serial.println(myseq); while(mydata!=""){//どのビンを点灯させるかをチェックしない場合はmydataがまだ空かどうかをテストif(mydata =="Bin1"){//ビン1ルーチンを開始digitalWrite(Bin1 、 高い); //ピンをハイに設定してビン1のLEDを点灯digitalWrite(Bin2、LOW); //ピンをローに設定してビン2のLEDをオフに設定しますwhile(buttonPress!=HIGH){//ボタンが押されるのを待つloop buttonPress =digitalRead(OKbutton); //ボタンをチェックし続けますmydata =""; // mydataを空の文字列に戻します} digitalWrite(Bin1、LOW); //ビン1のLEDをオフにしますSerial.println( "Picked"); //メッセージをPCに送信buttonPress =0; //ボタンをリセットしますlowdelay(1000); } if(mydata =="Bin2"){//ビン2ルーチンを開始digitalWrite(Bin2、HIGH); //ピンをハイに設定してビン2のLEDを点灯digitalWrite(Bin1、LOW); //ピンをローに設定してビン1のLEDをオフに設定しますwhile(buttonPress!=HIGH){//ボタンが押されるのを待つloop buttonPress =digitalRead(OKbutton); //ボタンをチェックし続けますmydata =""; // mydataを空の文字列に戻します} digitalWrite(Bin2、LOW); //ビン1のLEDをオフにしますSerial.println( "Picked"); //メッセージをPCに送信buttonPress =0; //ボタンをリセットしますlowdelay(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()); // WiFiシールドのIPアドレスを出力します:IPAddress ip =WiFi.localIP(); Serial.print( "IPアドレス:"); Serial.println(ip); //受信信号強度を出力します:long rssi =WiFi.RSSI(); Serial.print( "信号強度(RSSI):"); Serial.print(rssi); Serial.println( "dBm");} 
Pythonスクリプト Python
実行するPythonスクリプト。
 ##必要なライブラリをロードしますimportcsvimport 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ファイルを一度に1行ずつ、open( 'sequence1.txt')としてcsvDataFileとして読み取ります。csvReader=csv.reader(csvDataFile)for row in 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とbin番号を送信data =""#データを空白に設定してwhileループに入るi =データが受信されるまでdata =="": #データが受信されるまで、ループを続けます(data、addr)=soc k.recvfrom(1024)#データをソケットから受信したデータに設定mytest =data.decode( "utf-8")#mytestをソケットで受信した値と等しく設定print( "picked ="、mytest)#受信した値を出力if mytest!=myseq:#受信したものが期待したものと一致するかどうかをテストします。つまり、最後に送信されたseqが印刷されます(「シーケンスにシーケンス障害があります」、mytest)#障害を示すメッセージを表示しますsys.exit()#プログラムの実行を終了しますif障害が存在します
シーケンスプレーンテキスト
Pythonプログラムのシーケンスファイル
 0001、Bin10002、Bin20003、Bin10004、Bin20005、Bin10006、Bin20007、Bin10008、Bin20009、Bin10010、Bin20011、Bin10012、Bin20013、Bin1 

回路図

UDP Pick toLightの接続 picktolightudp_OCbpNt9XPK.fzz

製造プロセス

  1. ガスランタン
  2. レーザーポインター
  3. 懐中電灯
  4. 万華鏡
  5. 半導体レーザー
  6. 写真
  7. 信号機
  8. 電球
  9. Arduinoを搭載したシンプルな障害物センサー
  10. ワイヤレスライトスイッチマニピュレーター
  11. ギタースピードピックとストンプペダル!