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

ArduinoをWebパターンロックで保護 - 簡単セットアップとリモート制御

必要な部品と材料

Arduino UNO ×1
PHPoC WiFi Shield for Arduino ×1
Seeed サーボモーター SG92R ×1
ジャンパーワイヤー ×1

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

はじめに

初心者の方は、以下のチュートリアルを先に読むことをおすすめします:

スマートフォンのロック解除パターンをご存知でしょうか。この機能がArduinoでも利用できるようになりました。不正なユーザーによるArduinoの制御や監視を防止します。

このプロジェクトのコードは他のアプリケーションにも自由に再利用できます。わかりやすくするため、ここではサーボモーターの制御を例として紹介します。

このアイデアは、PHPoCプラットフォーム向けに書かれた2つのプロジェクトから着想を得ています:

これらをArduino用にアレンジしました。

このプロジェクトでは、以下の理由でPHPoC WiFi Shieldを使用してArduinoをインターネットに接続しています:

PHPoC Shieldにはいくつかの組み込みWebアプリケーションがあり、Webプログラミングの知識がなくてもArduinoの制御・監視が可能です。また、Webアプリケーション開発のスキルがあるユーザーは、独自のWebアプリケーションを開発してPHPoC Shieldに保存できます。

デモンストレーション

Webブラウザでパターンを描画し、認証後にサーボモーターを制御する様子をご覧いただけます。

データフロー

Webブラウザ ↔ PHPoC WiFi Shield ↔ Arduino

ArduinoをWebパターンロックで保護 - 簡単セットアップとリモート制御

仕組み

ユーザーがWebブラウザでパターンを描くと、そのパターンは文字列にマッピングされます。このパターン文字列はWebSocket経由でPHPoC Shieldを通じてArduinoに送信されます。

Arduinoが入力パターン文字列を受信すると、Arduinoにハードコードされたパターン文字列と比較します。一致する場合、Arduinoはクライアント(Webブラウザ)に「ACCEPTED(202)」コードを返し、認証済み変数をtrueに設定します。一致しない場合は「DENIED(401)」コードを返し、変数をfalseに設定します。

ユーザーから制御コマンドを受信した際、Arduinoはまず認証済み変数の値を確認します。trueであれば対応するタスクを実行し、falseであれば「DENIED」コードをクライアントに送信します。

パターンのマッピング

ArduinoをWebパターンロックで保護 - 簡単セットアップとリモート制御

パターンは文字列にマッピングされます。上図の例では、パターン文字列は「1, 4, 8, 6, 3」となります。

タイムアウトが設定されています。一定時間ユーザーの操作がない場合、認証が期限切れとなり、再度パターン入力が必要になります。

ソースコード構成

必要な作業

PHPoC ShieldのWiFi設定

こちらの手順を参照してください。

新しいWeb UIのPHPoC Shieldへのアップロード

ArduinoをWebパターンロックで保護 - 簡単セットアップとリモート制御
ArduinoをWebパターンロックで保護 - 簡単セットアップとリモート制御

Arduinoコードの作成

動作確認

初心者向けおすすめArduinoスターターキット

Arduinoキットをお探しの方は、「初心者向けベストArduinoキット」をご覧ください。

関数リファレンス

コード

unlock.php (PHP)

Webユーザーインターフェース

<!DOCTYPE html>
<html>
<head>
<title>Arduino - PHPoC Shield</title>
<meta name="viewport" content="width=device-width, initial-scale=0.7, maximum-scale=0.7">
<meta charset="utf-8">
<style>
body { text-align: center; font-size: width/2pt; }
h1 { font-weight: bold; font-size: width/2pt; }
h2 { font-weight: bold; font-size: width/2pt; }
button { font-weight: bold; font-size: width/2pt; }
</style>
<script>
// パターンロックとサーボ制御のJavaScriptコード
// 詳細は元のソースコードを参照
</script>
</head>
<body>
<h1>Arduino - Web Pattern Unlock</h1>
<div id="unlock_area" style="display:block;">
<canvas id="unlock"></canvas>
</div>
<div id="control_area" style="display:none;">
<canvas id="servo"></canvas>
<p>Angle : <span id="debug">0</span></p>
</div>
<h2>
<p>WebSocket : <span id="ws_state">null</span></p>
<button id="bt_connect" type="button" onclick="connect_onclick();">Connect</button>
</h2>
</body>
</html>

ArduinoUnlockExample (Arduino)

/* Arduino Webサーバー - パターンロック */
#include "SPI.h"
#include "Phpoc.h"
#include <Servo.h>

#define CMD_AUTH 0
#define CMD_CTRL 1
#define ACCEPTED "202"
#define UNAUTHORIZED "401"

PhpocServer server(80);
Servo servo;
String pattern;
bool authenticated;
unsigned long timeout;
unsigned long lastActiveTime;

void setup() {
  Serial.begin(9600);
  while(!Serial) ;
  Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
  server.beginWebSocket("web_pattern");
  Serial.print("WebSocket server address : ");
  Serial.println(Phpoc.localIP());
  servo.attach(8);
  servo.write(90);
  pattern = String("1,4,8,6,3");
  authenticated = false;
  timeout = 10000;
  lastActiveTime = 0;
}

void loop() {
  PhpocClient client = server.available();
  if (client) {
    String data = client.readLine();
    if(data) {
      int pos = data.indexOf(':');
      int cmd = data.substring(0, pos).toInt();
      if(cmd == CMD_AUTH) {
        String reqPattern = data.substring(pos+1);
        reqPattern.remove(reqPattern.indexOf(13));
        reqPattern.remove(reqPattern.indexOf(10));
        if(pattern.equals(reqPattern)) {
          authenticated = true;
          sendResponse(ACCEPTED, 3);
          lastActiveTime = millis();
        } else {
          authenticated = false;
          sendResponse(UNAUTHORIZED, 3);
        }
      } else if(cmd == CMD_CTRL) {
        if(authenticated) {
          int angle = data.substring(pos+1).toInt();
          angle = map(angle, 90, -90, 0, 180);
          servo.write(angle);
          lastActiveTime = millis();
          Serial.println(angle);
        } else {
          sendResponse(UNAUTHORIZED, 3);
        }
      }
    }
  }
  if (authenticated && ((millis() - lastActiveTime) > timeout)){
    authenticated = false;
    sendResponse(UNAUTHORIZED, 3);
  }
}

void sendResponse(char *data, int len) {
  server.write(data, len);
}

回路図

ArduinoをWebパターンロックで保護 - 簡単セットアップとリモート制御

製造プロセス

  1. 大量生産洋裁パターンの進化と製造
  2. Web制御DMX照明システム:Arduino Megaマスターコントローラー
  3. Bluetooth操作のArduinoスパイボットを自作する
  4. FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
  5. 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
  6. 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
  7. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  8. Arduinoプロジェクトのための最適化電源ソリューション
  9. Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
  10. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  11. Arduino UNO + WiFiシールドで温度をWebリアルタイム表示 — シリアル出力だけでグラフ化