LoginSignup
15
9

More than 3 years have passed since last update.

Twitterでプチバズってたスマートロックをリスペクトを込めてobnizで再現してみた

Last updated at Posted at 2020-07-28

まず最初にこのTwitterの投稿をご覧ください。



先日、このスマートロックの製作者うこさんのお話を聞く機会がありました。
今まで私は、スマートロックって、なんかスゴい仕組みでスゴいことやっていて私には関係ない世界かと思っていました。
それが、うこさんの作品では、まさかサーボモーターとダブルクリップで実現できていました。
目からウロコ、まさにコロンブスの卵でした。

2020-07-28 23.00.26.png

作ったもの

さっそく、リスペクトを込めて obnizで再現してみました。
私が作ったものはこちらです。

環境

Node 14.5.0

必要なもの

obniz Board
マイクロサーボ SG-5010
・ケーブル(オスーオス)
・ダブルクリップ (100円ショップで購入)
・タッパー (100円ショップで購入)
IMG_7032.jpeg

原理

ダブルクリップで錠のつまみを掴み、サーボモータでつまみを回して開閉します。
2020-07-28 22.04.42.png

工程

錠にタッパーを合わせ、
IMG_7036.jpeg

ダブルクリップで錠のつまみを掴んで、タッパーをかぶせます
IMG_7031.jpeg

横から見た構図
IMG_7041.jpeg

構成図

scheme.png

コード

LINE BOT

linebot.js
'use strict';
const request = require('request');
const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;
const config = {
    channelSecret: 'channelSecret',
    channelAccessToken: 'channelAccessToken'
};

const app = express();
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

async function handleEvent(event) {
  //obnizクラウドへPOST
  const options = {
    url: "https://obniz.io/events/XXXX/ABCDEFGHIJKLMN/run",
    method: 'POST',
    form: {"order":event.message.text }
  }
  request(options, function (error, response, body) {
    console.log(body);
  })
  //LINEチャットボットへ返信
  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: event.message.text //実際に返信の言葉を入れる箇所
  });
}
app.listen(PORT);
console.log(`Server running at ${PORT}`);

obnizクラウド

smart_lock.html
<!-- HTML Example -->
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@3.7.0/obniz.js"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>ServoMotor</h1>

<script>
const obniz = new Obniz("obniz ID");
obniz.onconnect = async function () {
     const servo = obniz.wired('ServoMotor', {gnd:0,vcc:1,signal:2});
     obniz.display.clear();  //  ディスプレイを一旦クリアする
    //ドアを開く
    if (req.body.order=="open") {
      obniz.display.print("OPEN");
      servo.angle(0.0);
    }
    //ドアを閉める
    else if (req.body.order=="lock") {
      obniz.display.print("LOCK");
      servo.angle(90.0);
    } 
}
</script>
</body>
</html>

はまったところ

pwmって何?

最初は obnizクラウドを利用せずに、LINEのチャットボットと「obniz+サーボモータ」を同じプログラム上で実行していました。
その場合、LINEで開閉(投稿)すると、毎回7回目に以下のエラーが出て途方にくれました。

UnhandledPromiseRejectionWarning: Error: No More pwm Available.

ある方から、このエラーは、サーボモータを動かすごとにpwmが消費され、最終的にpwmが枯渇したのではないかご指摘いただきました。
いろいろ試行錯誤して、最終的にはサーボモーターの処理をobnizクラウドに移したら、エラーが出なくなりました。
結局、pwmのことはよく分からず・・・

obonizクラウドでのライブラリ?

Node.jsでは、post通信を受信するには、requestライブラリ、expressライブラリが必要ですが、obnizクラウドではその使い方がわからず、ハマりました。

結局は、req.body にpost通信されたものが入ってることに気がついて事なきを得ました。

そのあたりのことは、こちらをご参照ください。
サーバーレスイベントセットアップ(obniz公式)

最後に

今回私が作ったスマートロックは、たまにエラーはないのに動かなくなるなど不安定です。
それにwifiに依存していること、電源をどうするかなど、実用化するにはまだまだです。

ただ、自分がスゴいと思ったものを真似することで、多くのことを学びました。
お金をかけてなんかスゴいことをしなくても、おおげさにシステム開発しなくても、このように100円ショップで売っているものを有効活用する等のちょっとした工夫でスゴいものができるということを教えてもらいました。
※「ちょっとした」と言いましたが、実はその「ちょっとした」ことを思いつくのがとてもとても難しいです。コロンブスの卵の話のように。

おかげさまで、物事を見る目、電子工作の幅が広がりました。

うこさん、ありがとうございました。

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9