はじめに
みなさまお元気ですか?会津大学学部二年のHAMADAです。
夏休みに入ったので色々あげていきたいという決心から第一弾のブログです!!
第二弾はあるのでしょうか.......
さて今回は、LINEからのメッセージでラズベリーパイを使ったLチカをした話を書いていきます。
動機・目的
後々、お風呂が溜まったことを知らせてくれるシステムを作ろうと考えているのですが、その足掛かりとして今回ラズパイで簡単なものを実装しようと考えました。今回は、少し長い内容ですがお付き合いいただけると幸いです。
開発準備
使用したもの
- Raspberry Pi 4 Model B 4GB
現在半導体不足で高い。昨年の夏買っていたので損はしていない。 - Node.js
Node.jsでLチカもやりました。line-bot-sdkもあるのでgood!!
- ngrok
ローカルサーバーを公開できるやつ。
- SDカード(32GB)
32GBは最低限必要なようです。 - Visual Studio Code
SSHをして、vscodeでスクリプトを書きます。 - 電子工作のパーツ
- ジャンパー線
- LED
- 330Ω抵抗
キットを購入しました。こういったパーツって見てるだけでワクワクしますよね?
実装内容について
ラズベリーパイのセッティング
ラズパイを触るのが初めてだったので、OSのインストールから始めました。
以下に手順を書いていきたいと思います。
- Raspberry Pi imagerをダウンロードして、起動する。
ダウンロードリンク->Raspberry Pi OS – Raspberry Pi
- OSを設定すると、上の画面のように歯車の設定が出てくる。そこを開いて以下のように設定する。現在は、SSHの設定も楽にできるようになっているようです。
セキュリティ的に一部設定は空欄にしていますが、赤くチェックされているところを設定してください。ロケール設定についても必要であれば設定しましょう。
- 次にラズベリーパイに差し込むSDカードを使っているPCに差し込んで、OSをインストールします。これが終わればOSの設定は終了です。
- 次にssh接続をします。ターミナルから打っても良いのですが、vscodeで設定して接続しました。
vscodeのリモートエクスプローラーから新しくsshの設定をします。+を押すとできます。拡張機能がない方は、vscode内でRemote-sshというものをいうものをインストールしましょう。ssh接続コマンドを入力するように求められるので以下のように入力します。ssh {usrname}@hostname
//今回は ssh pi@raspberrypi~/.ssh/configに以下のように記載する
これでssh接続ができるようになりました。Host raspberrypi.local
HostName raspberrypi.local
User pi - ラズパイ内でnodeをインストールする。
-
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install -g n
sudo n stable
sudo apt-get purge -y nodejs npm
//パスが通っているか確認する
printenv PATH
node -v
//これで出たバージョンを次の{node -v}に記入
export PATH="$PATH:/usr/local/n/versions/node/{node -v}"
とりあえず一旦Lチカしてみる
今回はNode.jsでLチカしてみました。(C言語とPythonでも一応できました)
コードは以下のようになります。
let gpio = require('rpi-gpio');
const LED_PIN = 40;
let ledOn = true;
gpio.setup(LED_PIN, gpio.DIR_OUT, () => {
setInterval(() => {
if (ledOn) {
gpio.write(LED_PIN, false);
ledOn = false;
console.log("fugafuga");
}
else {
gpio.write(LED_PIN, true);
ledOn = true;
console.log("hogehoge");
}
}, 500);
});
0.5秒ごとにLEDがチカチカするようなコードになっています。
GNDには6番のピンを入力には40番のピンを使用しました。
pinout
とコマンドを打つとピンを確認できます
他にもラズパイの基盤の配置なども表示されます。
簡単にメソッドの説明(のちに使うものも紹介しておきます)
rpi-gpioをインストールして利用できるものを使う。
setupメソッドはsetup(channel,[direction, edge], callback)というもの。
writeメソッドはwrite(channel, value, [callback])というもの。
destroyメソッドはdestroy()で今までのピンの設定を破棄してくれるもの。
~引数の説明~
channel・・・使うピンを決める。
direction・・・ピンの向きを決める。
edge・・・割り込みの状態を決める。
callback・・・ エラーが発生した場合、第一引数にErrorを指定する。
value・・・on、offを決める。
回路
こんな感じで繋ぎました。
デモといきたいところですが実際に光るのは、LINEとの連携の際にお見せします。
LINEBotとの連携
簡単に手順も含めて、説明していこうと思います。(以下のコマンドやファイル作成は全てSSH先のラズパイ上で行います)
まずは、LINEとngrokの設定
- まずはLINE Developersにログインして各種設定を行います。
- チャンネルを作り、チャネルアクセストークンとチャネルシークレットを入手します。
- ngrokにログインしてYour AuthTokenを手に入れる。そして以下のコマンドを実行する。
npx ngrok authtoken ここにngrokのYourAuthTokenを貼る
- .envを作成して次のように記載する
-
channelSecret= //ここにチャネルシークレットを貼る
channelAccessToken= //ここにチャネルアクセストークンを
次にサーバーをたてます。
npm start
を実行する。npx ngrok http ポート番号
を実行する。これはnpm start
とは別のターミナルで実行する。npx ngrok http ポート番号
で開かれたForwardingのhttpsの方をコピーする。- これをLINE Developersのチャンネルのwebhook URLに、3でコピーURLの後ろに/webhookをつけて貼り付ける。
- webhookの利用をオンにする。(これを忘れて何度か失敗しました)
LINEのメッセージからLチカをする
仕様としては、メッセージで"Lチカ"と送るとLチカをしてくれて、 "やめる"と送るとLチカを止めてくれるというもの。
server.jsを中心としてプログラムが実行されていくのですが、その辺りはgithubに公開するので、今回のトピックであるLチカのコード(blink.js)を以下に貼ります。
import gpio from 'rpi-gpio';
const LED_PIN = 40;
let ledOn = true;
let stopflag = false;
export const ledfunc = function (stopflag) {
if (stopflag === false) {
gpio.setup(LED_PIN, gpio.DIR_OUT, () => {
setInterval(() => {
if (ledOn) {
gpio.write(LED_PIN, false);
ledOn = false;
}
else {
gpio.write(LED_PIN, true);
ledOn = true;
}
}, 500);
});
}
else if (stopflag === true) {
gpio.setup(LED_PIN, gpio.DIR_OUT, pause);
};
};
function pause() {
setTimeout(closePins, 500);
}
function closePins() {
gpio.destroy(function () {
console.log('All pins unexported');
});
}
stopflagによってledfuncが呼び出された時に行う処理を変えています。
これは"Lチカ"と"やめる"のメッセージによって分けています。
blink.jsはLINEからのメッセージで処理を決めるtext.jsから呼び出されて実行されます。
デモ
いよいよLINEからメッセージを送るとLチカを実践します!!
繋げて撮るのが上手くできなかったので、分けていますがご容赦ください。
あとgifにしたら荒くなってしまいました。一個目が"Lチカ"で二個目が"やめる"です。
できた!!やったーー!!!
感想と展望
やる前はLINEBotとラズパイの連携はめちゃくちゃ難しいものだと思っていましたが、実際やってみると案外なんとかなって嬉しいです。電子部品などを触るのは、ワクワクするので夏休みの工作っぽくて非常に楽しかったです。実は、"やめる"の処理は誤魔化していて、再度"Lチカ"とメッセージを送ると、処理が重なってしまいチカチカが早くなってしまうのでこれをなんとかできるようにしたいと思います。お風呂の水位メーターシステムに一歩近づきました!!何かの参考になれば幸いです。ここまでお付き合い頂きありがとうございました!
参考リンク
所属サークル
私のTwitter
私のgithub