14 September 2016

由於上一篇寫了一個Telegram Bot,最近就在幫它加feature,

  1. 出build時會通知
  2. 開會時會通知
  3. 11:30提醒要吃飯了

總覺得少了點什麼,於是就想說來做個機器人自動開門。
在開始之前,先準備以下材料:

  1. Raspberry Pi 3: 1台
  2. 杜邦線: 至少4條
  3. 麵包板: 1塊
  4. 漆包線: 可有可無
  5. 一顆勇敢的心(因為你可能用壞,導致整個公司的人被反鎖)

下圖為完成品,

Ticket



1. 拆開電源座


大部分的公司,門旁邊應該都有一個開關,不管是感應式的或者是按鈕式的也好,只要一trigger,門就會打開。
也就是說開關一定接著門的trigger,所以我們要做man in the middle hack…LOL…
所以首先要把電源拆掉,然後拿出來(如下圖),

Ticket

拿出來以後會看到有二條線接在電源開關上,分別為一紅一黑,把這二條線從開關中拔出來,
然後你要先找出你的正極跟負極分別為哪一條,我的黑色是正,紅色是負。



2. 接線 (backward compatible)


為了讓原本的開關也可以正常work,所以我們必須把上面拆出來的電源線接在麵包板上,然後在接另外2條杜邦線,
一頭接在開關上面,另一頭接在麵包板上面,如下圖。

Ticket



3. 接上Raspberry Pi 3


接著要再接上2條杜邦線,一頭接在Pi上的GPIO,另一頭一樣接在麵包板上,
如果不知道接在哪個Pin腳,可以Google一下Raspberry Pi 3的GPIO圖
我自己是接在Pin 7 and 6上面,正極在7,負極在6,如下圖。然後分別把它接在對應的麵包板位置上。

Ticket



4. 寫Code


最後就要來寫code,我這裡是使用NodeJS加上Python,因為用NodeJS setup web server很快速簡單,
然後用python控制GPIO也很簡單,所以就用這二種組合。
首先先寫Python來透過GPIO來開門,由於現在的Raspbian預設就有Rpi.GPIO,所以你可以直接使用。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)

GPIO.output(7, GPIO.LOW)
time.sleep(0.5)
GPIO.output(7, GPIO.HIGH)

GPIO.cleanup()


接著就來用NodeJS來建立Web Server,詳細的步驟就參考上一篇
如果建立完Web Server以後,我們得加裝另一個module,因為我們要call python script,

npm install --save python-shell


接著就可以在index.js裡面加入下面的code,

const https     = require("https");
const express   = require("express");
const bodyParser    = require('body-parser');
const logger        = require('morgan');
const fs            = require('fs');
const request     = require('request');
const logStream     = fs.createWriteStream('/var/log/bot/access.log', {flags: 'a'});
var PythonShell = require('python-shell');

.... ignore ....

if (cmd == '/open') {
    PythonShell.run('open.py', {}, function (err, results) {
        if (err) {
	        console.log(err);
	     }
	 });
}


然後記得restart。

pm2 restart index



5. Test


完成上面的步驟以後,你就可以跟你的機器人講/open,他就會幫你開門了!

Ticket



blog comments powered by Disqus