工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

スマートパーキングシステム

コンポーネントと消耗品

>
Raspberry Pi3モデルB
× 1
Arduino Mega 2560
× 1
超音波センサー-HC-SR04(汎用)
× 3

アプリとオンラインサービス

>
Samsung ARTIK Cloud for IoT
Googleマップ
Arduino IDE

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

バンガロールのような混雑した都市で無料の駐車場を見つけるのは非常に困難です。ここで、誰かが個人の車で家から外に出たいと思うなら、彼の最初のことは彼が彼の車を駐車する駐車についてです。ほとんどの場合、人々は駐車場に行き、すべての駐車スロットがいっぱいになっていることに気づき、それから彼は別の駐車場を探す必要があります。それで、それは大きな面倒であり、彼が彼の車で降りるとき、多くの人々は彼の車の駐車を恐れ続けます。

そこで、どうすれば問題が解決できるのかを考え、ついにクラウドベースのスマートパーキングシステムの構築に成功し、このシステムを導入することで、私の街の駐車問題を解消できることを願っています。 ARTIK Cloudは、そのような仕事に最適なプラットフォームです。

このシステムを使用すると、ユーザーはどこからでもモバイルまたはWebアプリを使用して利用可能な駐車場を簡単に見つけることができます。システムは30秒ごとに駐車データを更新します。

このプロジェクトでは、このようなスマートシステムを簡単に構築する方法を紹介します。間違いなく、私は最もクールなIoTクラウドプラットフォームであるARTIKクラウドプラットフォームを使用します。詳細に進む前に、私のデモプロジェクトのデモビデオをお楽しみください。

このデモシステムでは、Samsung ArtikCloudプラットフォームで新しいデバイスを1つだけ作成する必要があります。ここでお見せします。デバイスにレインボーパーキングという名前を付け、空きスロットなどの駐車データを駐車場に保存しました。 Raspiは、事前に設定されたルールに従って駐車情報を送信します。

このプロジェクトに関連する手順:

1。 Artikクラウドプラットフォームで1つのデバイスを作成する

2。 ArtikCloudで1つのアプリケーションを作成する

3。 ArtikCloudで1つのルールを作成する

4。 Arduinoの準備

5。センサーの接続

6。ラズベリーパイの準備

7。 Webアプリケーションの開発

それでは、一つずつ始めましょう。まず最初に。 Artikクラウドプラットフォームで新しいデバイスを作成することから始めましょう。

ステップ1:Artikクラウドプラットフォームで新しいデバイスを作成する

A) Samsungアカウントにログインし、右上隅にある[開発者]オプションをクリックします。

<図>

B) ダッシュボードから[デバイスタイプ]を選択し、[新規]をクリックします

<図>

C) [デバイスの表示名]にデバイスの名前を入力し、一意の名前を付けてから、[デバイスタイプの作成]をクリックします。

<図>

D) +新しいマニフェスト

をクリックします <図>

E) ここにアップロードして保存するセンサーデータのフィールド名を入力し、データタイプを整数として指定します。次に、[保存]をクリックします。

<図>

F) 次に、[次へ:デバイスアクション

]をクリックします <図>

G) アクションを実行するか、標準アクションから選択します。クリックして保存します。私たちのプロジェクトでは、アクションは必要ありません。次に、[次へ:アクティブマニフェスト]をクリックします。

<図>

H) デバイスフィールドを確認し、もう一度[次へ:アクティブマニフェスト]をクリックします。

<図>

私) おめでとうございます!最初のデバイスを正常に作成しました。次に、デバイスをArtikクラウドに接続する必要があります。それでは、やってみましょう。

<図>

J) 右上隅からMYARTIKCLOUDに移動します。

<図>

K) MY ARTIK CLOUDをクリックして、[デバイス]を選択します。

<図>

L) クリックして+別のデバイスを追加します。

<図>

M) 作成したデバイスの名前を入力してクリックします。

<図>

N) [デバイスを接続...]ボタンをクリックします。

<図>

O) デバイスがクラウドに接続されています。

<図>

P) クリックして。トークンを生成し、デバイスIDとデバイストークンを書き留めます。これらは、物理デバイス、Webアプリ、またはAndroidアプリからデバイスに接続するたびに必要になります。

<図>

ステップ2:Artikクラウドでルールを作成する

このステップでは、条件が満たされ、アクションにサブスクライブされたデバイスとアプリケーションが即座にメッセージを受信したときにArtikクラウドがアクションを生成する条件を設定するルールを作成します。

A) MY ARTIK CLOUDメニューからルールを選択し、新しいルールをクリックします

<図>

B) [IF]選択ボックスから、デバイスのデータフィールドを選択し、値と条件を設定します。次に、[THEN]フィールドから特定のデバイスのアクションを選択します。一定のパラメータ値を設定することも、別のデバイスデータから値を選択することもできます。別のデバイスからデータフィールドを定義するには、赤いボックスに表示されているダウンロードアイコンをクリックします。

<図>

C) ドロップダウンからデバイスを選択してから、データフィールドを選択します。

<図>

D) 次に、[ルールを保存]をクリックします。

<図>

ステップ3.Arduinoの準備

私のプロジェクトでのArduinoの主な作業は、駐車場に接続されたセンサーからデータを収集し、シリアルポートを使用してデータをRaspberrypiに送信することです。ここで使用したArduinoMegaは、1つの駐車ステーションに実装されています。さまざまなパーキングステーション用に、より多くのArduinoボードを接続できます。ここでは超音波センサーを使用しており、どこでも使用できます。

超音波センサーには、Arduinoデジタルピンが使用されました。 Arduinoスケッチ超音波センサーが付属しています。適切なスケッチをArduinoボードにアップロードします。

超音波センサーの詳細については、こちらをご覧ください。

ステップ4:センサーを接続する

すべてのセンサーをArduinoに接続するには、回路図のセクションを参照してください。

<図>

ステップ5:ラズベリーパイの準備

私は、あなたがラズベリーパイを使った経験があると思います。初心者向けのチュートリアルがインターネットでたくさん利用できます。

ラズベリーパイから始めましょう。 Raspberry piはWebSocketクライアントとして機能しており、WebSocketプロトコルを使用してArtikクラウドと通信します。プログラミングにはNode.jsを使用しました。 Pythonノードとは異なり、RaspberryPiにはプレインストールされていません。

A)。 ターミナルで次のコマンドを使用して、RaspberrypiにNodeとnpmをインストールします。

  sudo apt-get updatedsudo apt-get install nodejs npm  

B)。 WebSocketクライアントwsをラズベリーパイにインストールします

  npm install --save ws  

C)。 ラズベリーパイにシリアルポートをインストールする

  npm install serialport  

3つの手順をすべて正常に完了すると、piはシリアルポートを使用してArduinoと通信し、WebSocketを使用してArtikクラウドと通信する準備が整います。前に言ったように、2つの駐車場には2つのラズベリーパイが必要です。したがって、これのソースコードをGithubからダウンロードします。 FileZillaなどのftpクライアントを使用して、ラズベリーパイにコードをアップロードできます。ソースコードのDEVICEIDとDEVICETOKENを変更することを忘れないでください。

D) ラズベリーパイにコードをアップロードした後、ターミナルウィンドウに次のコマンドを入力してコードを実行します。

  sudo node staff-parking.js  

ステップ6.Webアプリケーションの開発

Webアプリケーションの開発には、HTMLとJavaScriptが使用されました。ここでArtikクラウドと通信するために、私は再びWebSocketプロトコルを使用しました。 Mapをアプリケーションに統合するために、Google MapAPIを使用しました。

Githubからweb-appフォルダーをダウンロードし、デバイスIDとデバイストークンを独自のデバイスIDとトークンで変更します。受信した新しいデータ(私の場合はedison)に対してアクションを生成するデバイスのIDを使用します。 Webブラウザを使用してwebsocket.htmlを開き、お楽しみください。デモビデオを見る...

コード

  • ラズベリーパイ(スタッフパーキング)
  • Arduino(ソナー)
  • Webアプリ(HTML)
  • Webアプリ(クライアント側)
Raspberry Pi(スタッフパーキング) JavaScript
RaspberryPiのソースコード
 //スタッフパーキングデータtransfervarwebSocketUrl ="wss://api.artik.cloud/v1.1/websocket?ack =true"; var device_id ="Your Device id"; //スタッフパーキングDEVICEIDvar device_token ="デバイストークン"; //スタッフパーキングデバイストークン//接続するためにwebsocketモジュールが必要// piのターミナルに次の2つのコマンドを実行// sudo apt-get update // npm install websocketvar WebSocket =require( 'ws'); var isWebSocketReady =false; var data =""; var ws =null; //ラズベリーpiにシリアルポートモジュールを要求する//ターミナルに次のコマンドを実行する// npm install serialportvar serialport =require( "serialport"); var SerialPort =serialport.SerialPort; var sp =new SerialPort( "/ dev / ttyACM0"、{// arduino baudrateとのシリアル通信の場合:9600、// UNOを使用しているため、baudrateは9600であるため、モデルパーサーに応じて変更する必要があります:serialport.parsers.readline( " \ n ")}); var Parking_state =0; //パーキング状態をチェックする変数state_gate / ***現在の時刻をミリ秒単位で取得します* / function getTimeMillis(){return parseInt(Date.now()。toString());} / ** * / websocket接続を作成してGPIOピンを設定します* / function start(){// WebSocket接続を作成しますisWebSocketReady =false; ws =new WebSocket(webSocketUrl); //接続が成功するとこの関数が呼び出されますws.on( 'open'、function(){console.log( "WebSocket接続が開いています...."); //データ送信を成功させるには登録する必要があります//登録は認証または安全なデータ転送レジスタ();}); ws.on( 'message'、function(data){//このループは、クライアントがメッセージを送信するたびに呼び出されますhandleRcvMsg(data); //データは関数handleRcvMsg()に送信されます}); ws.on( 'close'、function(){console.log( "WebSocket接続が閉じられました....");}); } / ** * / websocketエンドポイントに登録メッセージを送信します* ///クライアントは、デバイスがherefunction register(){console.log( "WebSocket接続でのデバイスの登録");から登録された場合にのみ機能します。 try {var registerMessage ='{"type": "register"、 "sdid": "' + device_id + '"、 "Authorization": "bearer' + device_token + '"、 "cid": "' + getTimeMillis()+ ' "} '; console.log( 'レジスタメッセージの送信' + registerMessage + '\ n'); ws.send(registerMessage、{マスク:true}); isWebSocketReady =true; } catch(e){console.error( 'メッセージの登録に失敗しました。メッセージの登録中にエラーが発生しました:' + e.toString()); }} //受信後のデータは処理のためにここに送信されます//この場合、ラズベリーパイではアクションを受信しないため、この関数は使用されません//これは将来の変更のためです。functionhandleRcvMsg(msg){//受信した文字列を解析する必要がありますvar msgObj =JSON.parse(msg); if(msgObj.type!="action")return; //早期に戻る; varアクション=msgObj.data.actions; var actionName =アクション[0] .name; console.log( "受信したアクションは" + actionName); //一致を実行するには、登録されているアクションを知っている必要がありますif(actionName.toLowerCase()=="settext"){// 'parking_state'を受け取った後にここで何かを行うconsole.log( '認識されたアクションを受け取る' + actionName); } else {//このループは、未登録のアクションを受信した場合に実行されます//したがって、すべてのアクションをクラウドに登録する必要がありますconsole.log( '認識されないアクションを受信して​​から何もしない' + actionName);戻る; }} / ** * ARTIKクラウドに1つのメッセージを送信します* ///この関数はクラウドにコマンドを送信します//関数sendStateToArtikCloud(parking)は無料の駐車スロットの数をartikクラウドに送信しますfunction sendStateToArtikCloud(parking_slot){try {ts ='、 "ts":' + getTimeMillis(); var data ={"parking_slot":parking_slot //引数からクラウド変数 "parking_value"へのパーキング値を設定します}; varpayload ='{"sdid": "' + device_id + '"' + ts + '、 "data":' + JSON.stringify(data)+ '、 "cid": "' + getTimeMillis()+ '"}'; console.log( 'ペイロードの送信' +ペイロード+ '\ n'); ws.send(payload、{mask:true}); } catch(e){console.error( 'メッセージの送信中にエラーが発生しました:' + e.toString()+ '\ n'); }} function exitClosePins(){console.log( 'すべてのピンを終了して破棄します!'); process.exit(); } start(); // arduinoからデータを受信するたびに実行(arduinoから30秒のプログラム遅延)sp.on( "open"、function(){sp.on( 'data'、function(data){console .log( "シリアルポート受信データ:" + data); // sendStateToArtikCloud(data); //空きパーキングスロットvarparking_slot =parseInt(data); sendStateToArtikCloud(parking_slot);});}); process.on( ' SIGINT '、exitClosePins); 
Arduino(ソナー) C / C ++
Arduinoを使用したソナーセンサーインターフェイスのソースコード
 #define echoPin1 2 //ソナー1のエコーピン#definetrigPin1 3 //ソナー1のトリガーピン#defineechoPin2 4 //ソナー2のエコーピン#definetrigPin2 5 //ソナーのトリガーピン2#define echoPin3 6 //ソナーのエコーピン3#define trigPin3 7 //ソナーのトリガーピン3 //#define echoPin4 9 //ソナーのエコーピン4 //#define trigPin4 8 //トリガーピンソナー4longduration1、distance1の場合; // distancelong duration2、distance2; long duration3、distance3; // long duration4、distance4;の計算に使用される期間int count =0; int freeSlot =0; void setup(){Serial.begin(9600); //ラズベリーパイへのシリアル通信を開始しますpinMode(trigPin1、OUTPUT); //ピンを出力としてトリガーしますpinMode(echoPin1、INPUT); //入力としてピンをエコーし​​ますpinMode(trigPin2、OUTPUT); pinMode(echoPin2、INPUT); pinMode(trigPin3、OUTPUT); pinMode(echoPin3、INPUT); // pinMode(trigPin4、OUTPUT); // pinMode(echoPin4、INPUT); } void loop(){/ *次のtrigPin / echoPinサイクルは、音波を跳ね返らせることによって最も近いオブジェクトの距離を決定するために使用されます。 * / / *ピンをトリガーするには、少なくとも10マイクロ秒の高レベル信号が必要です。 * _____ * | | * -------------! !--------- * ..... | 10us | ........ *次に、モジュールは8つの40KHzパルス信号を生成し、エコーの受信を待機します* / digitalWrite(trigPin1、LOW); delayMicroseconds(2); digitalWrite(trigPin1、HIGH); delayMicroseconds(10); digitalWrite(trigPin1、LOW); // pulseIn()関数は時間のパルス幅を決定します//パルスの持続時間は障害物の距離に比例しますduration1 =pulseIn(echoPin1、HIGH); digitalWrite(trigPin2、LOW); delayMicroseconds(2); digitalWrite(trigPin2、HIGH); delayMicroseconds(10); digitalWrite(trigPin2、LOW); duration2 =pulseIn(echoPin2、HIGH); digitalWrite(trigPin3、LOW); delayMicroseconds(2); digitalWrite(trigPin3、HIGH); delayMicroseconds(10); digitalWrite(trigPin3、LOW); duration3 =pulseIn(echoPin3、HIGH); // digitalWrite(trigPin4、LOW); // delayMicroseconds(2); // digitalWrite(trigPin4、HIGH); // delayMicroseconds(10); // digitalWrite(trigPin4、LOW); // duration4 =pulseIn(echoPin4、HIGH); //距離=(音の高レベル時間速度(340M / S)/ 2、//センチメートル単位=uS / 58 distance1 =duration1 / 58.2; if(distance1 <10)distance1 =1; else distance1 =0; distance2 =duration2 / 58.2; if(distance2 <10)distance2 =1; else distance2 =0; distance3 =duration3 / 58.2; if(distance3 <10)distance3 =1; else distance3 =0; // distance4 =duration4 / 58.2; // if (distance4 <10)// distance4 =1; // else distance4 =0; //すべてのセンサーからの結果を追加して合計車数をカウント=distance1 + distance2 + distance3;; //空きスロット=合計スロット-合計車freeSlot =3-count; //合計スロット数がusbSerial.println(freeSlot);を使用してラズベリーパイに送信されます; //ステータスは30秒ごとに更新されます。delay(5000); // freeSlot =0; // distance1 =0; // distance2 =0; // distance3 =0; // distance4 =0;} 
Webアプリ(HTML) HTML
フロントエンドWebアプリケーションのソースコード
 <!DOCTYPE html>     ARTIKクラウドベースのスマートパーキングシステム     

ARTIKクラウドベースのスマートパーキングシステム

スタッフの駐車場

メインCmapusの近く

データを受信して​​います...

1

学生/ゲスト用駐車場

正門、ユニオン銀行の近く

データを受信して​​います...
パーキングシステムへの接続を閉じる

出力コンソール

Webアプリ(クライアント側) JavaScript
 // WebSocketを使用してリアルタイムの対話が可能です// ws:に注意してください。これは、WebSocket接続の新しいURLスキーマです。 // wss:も同じように安全なWebSocket接続に使用されます// https:は安全なHTTP接続に使用されます。//Artikクラウドのドキュメントから入手できますpagevar wsUri ="wss://api.artik.cloud/v1 .1 / websocket?ack =true "; var device_id ="デバイスID "; // raspi3 DEVICE IDvar device_token ="デバイストークン"; // raspi3 DEVICE TOKENvar output; var attribute_log; var websocket; function init(){// document.getElementById()htmlページに何かを書き込みますoutput =document.getElementById( "output"); attribute_log =document.getElementById( "attributes_log"); if(browserSupportsWebSockets()===false){//ブラウザがWebSocketプロトコルをサポートしているかどうかを確認するwriteToScreen( "申し訳ありませんが、お使いのWebブラウザはWebSocketをサポートしていません。GoogleChromeまたはFirefoxの最新バージョンを使用してみてください"); var element =document.getElementById( "websocketelements"); element.parentNode.removeChild(element);戻る; //} // WebSocketコンストラクターを呼び出すだけでWebSocket接続を開きますwebsocket =new WebSocket(wsUri); //接続が開いているとき、関数は自動的に呼び出されますwebsocket.onopen =function(){// writeAttributeValues( 'onOpen Event Fired'); writeToScreen( "パーキングシステムに正常に接続されました"); //接続が開いた後、安全なデータ送信のために登録が必要ですregister(); }; //新しいメッセージが受信されたときに呼び出されますwebsocket.onmessage =function(evt){onMessage(evt); }; //エラーを受信したとき//エラーイベントをリッスンすることで発生するエラーを処理できます。 websocket.onerror =function(evt){onError(evt); };} function onClose(evt){// WebSocketを使い終わったら、close()メソッドを使用して接続を終了できます。 websocket.close(); // writeAttributeValues( 'onClose Event Fired'); writeToScreen( "DISCONNECTED");} //メッセージが受信されると、メッセージイベントが発生します。 function onMessage(evt){writeToScreen( ' RESPONSE:' + evt.data + ''); // writeAttributeValues( 'onMessage Event Fired'); handleRcvMsg(evt.data); //データは関数handleRcvMsg()}に送信されますfunction onError(evt){writeToScreen( 'エラー:' + evt.data); // writeAttributeValues( 'onError Event Fired');} function doSend(message){// WebSocket接続を介してメッセージを送信するには、WebSocketインスタンスでsend()メソッドを呼び出しますwebsocket.send(message); // writeAttributeValues( 'onSend Event Fired'); writeToScreen( "SENT:" + message);} function writeAttributeValues(prefix){var pre =document.createElement( "p"); pre.style.wordWrap ="break-word"; pre.innerHTML ="INFO" + getCurrentDate()+ "" +プレフィックス+ " readyState:" + websocket.readyState + "bufferedAmount:" + websocket.bufferedAmount + "";; attribute_log.appendChild(pre);} function writeToScreen(message){var pre =document.createElement( "p"); pre.style.wordWrap ="break-word"; pre.innerHTML =メッセージ; output.appendChild(pre);} function getCurrentDate(){var now =new Date(); var datetime =now.getFullYear()+ '/' +(now.getMonth()+ 1)+ '/' + now.getDate(); datetime + ='' + now.getHours()+ ':' + now.getMinutes()+ ':' + now.getSeconds(); return datetime;} function browserSupportsWebSockets(){if( "WebSocket" in window){return true; } else {falseを返す; }} function getTimeMillis(){return parseInt(Date.now()。toString());} function register(){writeToScreen( "WebSocket接続でのデバイスの登録"); try {var registerMessage ='{"type": "register"、 "sdid": "' + device_id + '"、 "Authorization": "bearer' + device_token + '"、 "cid": "' + getTimeMillis()+ ' "} '; writeToScreen( 'レジスタメッセージの送信' + registerMessage + '\ n'); websocket.send(registerMessage、{マスク:true}); isWebSocketReady =true; //document.getElementById("rainbow").innerHTML =""; //document.getElementById("rainbow").innerHTML ="Capacity:" + ' 50 ' + "空きスロット:" + '  '+" 50 "; //document.getElementById("indigo").innerHTML ="容量:60、空きスロット:5"; } catch(e){writeToScreen( 'メッセージの登録に失敗しました。メッセージの登録中にエラーが発生しました:' + e.toString()); }} //受信後のデータは処理のためにここに送信されますfunctionhandleRcvMsg(msg){//メッセージは次の文字列として受信されます// {"actions":[{"name": "setText"、 "parameters":{"text" : "4"、 "text2": "5"}}]} //解析する必要がありますvarmsgObj =JSON.parse(msg); if(msgObj.type!="action")return; //早期に戻る; varアクション=msgObj.data.actions; var rainbowData =アクション[0] .parameters.text; var indigoData =アクション[0] .parameters.text2; console.log( "受信したアクションは" +アクション); document.getElementById( "rainbow")。innerHTML ="容量:50、空きスロット:" + rainbowData; document.getElementById( "indigo")。innerHTML ="容量:60、空きスロット:" + indigoData; } 
スマートパーキングシステムのSoucreコード
必要なすべてのコードとファイルは、このGithubリポジトリに含まれています。https://github.com/husinul/Smart-Car-Parking

回路図


製造プロセス

  1. C# コンストラクター
  2. C# を使用して
  3. スマートバーテンダー
  4. ビル管理システム:スマートシティへのチケット
  5. 温室用のスマート照明制御はコストを削減します
  6. スマートレーザーカッターシステムがさまざまな素材を検出
  7. コンベアシステムを理解する
  8. 自動車のジャッキシステムを理解する
  9. サスペンションシステムを理解する
  10. 車のヒーターが運転中にしか機能しないのはなぜですか?
  11. スマート コンプレッサー システムの機能