00 はじめに
アドカレ記事の続きです。
RaspberryPi+discord.pyで何かできないかなーと思ってやってみました。
前に作ったラズパイBlynkリモコンがラズパイ側の不調(おそらくSDカード)でお亡くなりになったのでこれを機にやろうかなと。
01 準備するもの
基本的なパーツは秋月電商で揃います。
(はんだこてやブレッドボード、ジャンパーワイヤーはある前提で進めています)
品目 | 値段(円) |
---|---|
RaspberryPiZeroW(単体) | 1,320 |
赤外線リモコン受信モジュールOSRB38C9AA(2個入) | 100 |
赤外線LED OSI5FU5111C-40(5個入) | 100 |
カーボン抵抗(炭素皮膜抵抗) 1/4W1kΩ (100本入) | 100 |
カーボン抵抗(炭素皮膜抵抗) 1/4W10Ω (100本入) | 100 |
トランジスタ 2SC2120-Y (20個入) | 110 |
根気 | 時価 |
02 リモコンの赤外線を学習させる
まずは赤外線を受信するために、受信モジュールをこの表のように繋ぎます。
RaspberryPi側 | モジュール側(受信部分が自分に向いている状態) |
---|---|
input用GPIO | 左 |
GND | 中央 |
3.3V | 右 |
赤外線のやりとりに関してはLircをしようとしたのですが、自分の部屋の環境が悪く、うまく設定できなかったので、WiringPiを用います。
こちらの記事が参考になりました。
Raspberry PiのGPIOを利用して赤外線リモコンの信号をスキャン・送信
03 赤外線送信モジュールを作る
以上の様に作りました。 送信用GPIOピンは**PWMに対応したピン番号**を選んでください。04 discord.pyで実行させる
シェルスクリプトで間接的に実行させるようにすると、メンテが楽です。
python側からの実行はsubprocessを使います。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import discord
from discord.ext import commands
import subprocess
from subprocess import PIPE
# DiscordToken
TOKEN = 'Your Token'
# 接続に必要なオブジェクトを生成
client = discord.Client()
# 起動時に動作する処理
@client.event
async def on_ready():
# 起動したらターミナルにログイン通知が表示される
print('ready...')
# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
# メッセージ送信者がBotだった場合は無視する
if message.author.bot:
return
# 照明スイッチ
if message.content == 'on light':
# ユーザ選別
if (str)(message.author) == me_id:
# ONコマンド
subprocess.run("[ABSOLUTE PATH]/lightOn.sh",shell=True, text=True)
await message.channel.send('照明をONにセットしました'+rasp)
else: # 自分以外のユーザーが操作しようとした時
await message.channel.send(f'{message.author.mention} 命令権がありません')
# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)
05 systemctlで常駐化させる
/etc/systemd/system/
下に、
[Unit]
Description=Discord Bot Service
[Service]
ExecStart=pythonファイルの絶対パス
Restart=no
Type=simple
[Install]
WantedBy=multi-user.target
を保存して、
raspberryPi$ sudo systemctl enable discordBot.service # 有効化
raspberryPi$ sudo systemctl start discordBot.service # 開始
を実行します。
これでbotの常駐化ができました。
エラーが起きた場合・botが起動しない場合
ターミナルで
raspberryPi$ sudo systemctl status discordBot.service
を実行するとログの確認ができるのでエラーの対処をしましょう。
06 結果
うまくいくと、Discordのトーク画面から指定したコマンドで部屋の照明を制御できます。
他にエアコンなども設定しました。
また、Bot名は好きなキャラクター名をもじりました。
とても良い。(良い)
一応ソースコードはこちら(githubに飛びます)
discord.pyは便利なフレームワークがあるらしいのでそれを使いたかったのですが、前に似た様なbotのソースコードがあったので流用しました。
07 参考リンク
Raspberry PiのGPIOを利用して赤外線リモコンの信号をスキャン・送信
schemeit
discord.py Document
TVアニメ アイドルマスター公式