由於上一篇寫了一個Telegram Bot,最近就在幫它加feature,
- 出build時會通知
- 開會時會通知
- 11:30提醒要吃飯了
總覺得少了點什麼,於是就想說來做個機器人自動開門。
在開始之前,先準備以下材料:
- Raspberry Pi 3: 1台
- 杜邦線: 至少4條
- 麵包板: 1塊
- 漆包線: 可有可無
- 一顆勇敢的心(因為你可能用壞,導致整個公司的人被反鎖)
下圖為完成品,
1. 拆開電源座
大部分的公司,門旁邊應該都有一個開關,不管是感應式的或者是按鈕式的也好,只要一trigger,門就會打開。
也就是說開關一定接著門的trigger,所以我們要做man in the middle hack…LOL…
所以首先要把電源拆掉,然後拿出來(如下圖),
拿出來以後會看到有二條線接在電源開關上,分別為一紅一黑,把這二條線從開關中拔出來,
然後你要先找出你的正極跟負極分別為哪一條,我的黑色是正,紅色是負。
2. 接線 (backward compatible)
為了讓原本的開關也可以正常work,所以我們必須把上面拆出來的電源線接在麵包板上,然後在接另外2條杜邦線,
一頭接在開關上面,另一頭接在麵包板上面,如下圖。
3. 接上Raspberry Pi 3
接著要再接上2條杜邦線,一頭接在Pi上的GPIO,另一頭一樣接在麵包板上,
如果不知道接在哪個Pin腳,可以Google一下Raspberry Pi 3的GPIO圖,
我自己是接在Pin 7 and 6上面,正極在7,負極在6,如下圖。然後分別把它接在對應的麵包板位置上。
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
,他就會幫你開門了!