HAMADAの語り草

興味のある技術のアウトプットをしたいと思います

LINEからのメッセージでラズベリーパイを使ったLチカをした話

 

はじめに

みなさまお元気ですか?会津大学学部二年のHAMADAです。

夏休みに入ったので色々あげていきたいという決心から第一弾のブログです!!

第二弾はあるのでしょうか.......

さて今回は、LINEからのメッセージでラズベリーパイを使ったLチカをした話を書いていきます。

 

動機・目的

後々、お風呂が溜まったことを知らせてくれるシステムを作ろうと考えているのですが、その足掛かりとして今回ラズパイで簡単なものを実装しようと考えました。今回は、少し長い内容ですがお付き合いいただけると幸いです。

 

開発準備

使用したもの
  • Raspberry Pi 4 Model B 4GB
    現在半導体不足で高い。昨年の夏買っていたので損はしていない。

  • Node.js
    Node.jsでLチカもやりました。line-bot-sdkもあるのでgood!!
  • ngrok
    ローカルサーバーを公開できるやつ。
  • LINE Messaging API
    LINE Bot開発に使いました。
  • SDカード(32GB)
    32GBは最低限必要なようです。

  • Visual Studio Code
    SSHをして、vscodeスクリプトを書きます。

  •  電子工作のパーツ
    • ジャンパー線
    • LED
    • 330Ω抵抗

    キットを購入しました。こういったパーツって見てるだけでワクワクしますよね?

 

 

実装内容について

ラズベリーパイのセッティング

ラズパイを触るのが初めてだったので、OSのインストールから始めました。

以下に手順を書いていきたいと思います。

  1. Raspberry Pi imagerをダウンロードして、起動する。 
    ダウンロードリンク->Raspberry Pi OS – Raspberry Pi

    Raspberry Pi imager 画面


  2. OSを設定すると、上の画面のように歯車の設定が出てくる。そこを開いて以下のように設定する。現在は、SSHの設定も楽にできるようになっているようです。

    設定前半

    設定後半

    セキュリティ的に一部設定は空欄にしていますが、赤くチェックされているところを設定してください。ロケール設定についても必要であれば設定しましょう。

  3. 次にラズベリーパイに差し込むSDカードを使っているPCに差し込んで、OSをインストールします。これが終わればOSの設定は終了です。

  4. 次にssh接続をします。ターミナルから打っても良いのですが、vscodeで設定して接続しました。
    vscodeのリモートエクスプローラーから新しくsshの設定をします。+を押すとできます。拡張機能がない方は、vscode内でRemote-sshというものをいうものをインストールしましょう。ssh接続コマンドを入力するように求められるので以下のように入力します。
    ssh {usrname}@hostname
    //今回は ssh pi@raspberrypi

    ~/.ssh/configに以下のように記載する

    Host raspberrypi.local
    HostName raspberrypi.local
    User pi
    これでssh接続ができるようになりました。

  5. ラズパイ内でnodeをインストールする。
  6. 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の設定

  1. まずはLINE Developersにログインして各種設定を行います。
  2. チャンネルを作り、チャネルアクセストークンとチャネルシークレットを入手します。
  3. ngrokにログインしてYour AuthTokenを手に入れる。そして以下のコマンドを実行する。
    npx ngrok authtoken  ここにngrokのYourAuthTokenを貼る
  4. .envを作成して次のように記載する
  5. channelSecret=       //ここにチャネルシークレットを貼る
    channelAccessToken= //ここにチャネルアクセストークンを

 

次にサーバーをたてます。

  1. npm startを実行する。
  2. npx ngrok http ポート番号を実行する。これはnpm startとは別のターミナルで実行する。
  3. npx ngrok http ポート番号で開かれたForwardingのhttpsの方をコピーする。
  4. これをLINE Developersのチャンネルのwebhook URLに、3でコピーURLの後ろに/webhookをつけて貼り付ける。
  5. 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チカ"とメッセージを送ると、処理が重なってしまいチカチカが早くなってしまうのでこれをなんとかできるようにしたいと思います。お風呂の水位メーターシステムに一歩近づきました!!何かの参考になれば幸いです。ここまでお付き合い頂きありがとうございました!

 

参考リンク

qiita.com

www.npmjs.com

qiita.com

所属サークル

A-PxL (@aizu_PxL) / Twitter

私のTwitter

HAMADA (@AHMOS_HMD) / Twitter

私のgithub

ahmos0 (HAMADA) · GitHub