はじめに
今回は、Qoosky APIという、WebSocketを利用してインターネット接続されているArduinoやラズパイと通信できるAPIを利用して、Rapsberry Pi 5 でLチカをしてみました!
この記事では、Qoosky APIの概要や特徴に触れたあと、Qoosky APIを利用したRapsberry Pi 5 でのLチカまでの方法についてご紹介させていただきます!
Qoosky APIとは
まずは、Qoosky APIについて軽く紹介します
Qoosky APIはWifiや有線LANなどでインターネットに接続されたRaspberry Pi等のSBCやArduino、ESP32等のマイコンボードを、スマートフォンやPC、タブレット等のブラウザ上からリアルタイムにWebScoketを用いて通信・遠隔操作できるAPIです!
下の図のように、Qoosky APIの運営元である工作HardwareHubのサーバーを介して通信するので、Qoosky APIに接続するだけで通信・遠隔操作ができます。
Qoosky API+Raspberry Pi5でLチカしてみる
Qoosky APIの登録・トークン発行
Qoosky APIを利用するためには、登録とトークンの発行が必要です(Googleアカウントをご用意ください)
Qoosky API : https://www.qoosky.dev/docs/apis/
上リンク先にアクセスし、ページ上部の「Log in」をクリックし、Googleアカウントでログインします
ログインが完了したら、ログイン時と同一ページ下部の管理コンソールにアクセスをクリックします
管理コンソール画面では、QooskyAPIとラズパイやArduinoとの連携に必要なトークンを管理できます。
「新しいトークンを発行」をクリックします
トークンが発行されたら、メモしておきます(後で必要になります)
Rapsberry Pi 5 でのLチカ(ハードウェアの準備)
今回は、Raspberry Pi5の26番ポートに にLEDを下の図のように接続します。
Rapsberry Pi 5 でのLチカ(ソフトウェアの準備)
Raspberry Pi の環境構築を行います。
Raspberry Pi 5(8GB)に64bitのRaspberry Pi OS (Debian 12)、Python 3.11.2をインストールしていることを前提とします
ターミナルを開き、作業用ディレクトリに移動したら、以下のコマンドを実行します。
python -m venv qoosky-test --system-site-packages
. qoosky-test/bin/activate
pip install gpiozero
pip install websocket-client
コマンドの解説
python -m venv qoosky-test --system-site-packages
: システムパッケージも利用可能なqoosky-test
という名前のPython仮想環境を作成します。. qoosky-test/bin/activate
: 作成した仮想環境qoosky-test
を有効化し、以降のパッケージインストールを隔離します。pip install gpiozero websocket-client
: Raspberry PiのGPIO制御に必要なgpiozero
と、Qoosky APIとのWebSocket通信に必要なwebsocket-client
ライブラリを仮想環境にインストールします。
次に、同じディレクトリに「qoosky-test.py」という名称でPythonソースコードを作成します。
ソースコード中のトークンは、先ほど自分で発行したトークンに置き換えてください。
# -*- coding: utf-8 -*-
import gpiozero
import websocket
ledPin =26
led = gpiozero.DigitalOutputDevice(ledPin)
def on_open(ws):
print("Successfully connected to the API server.")
ws.send('{"token":"AAAA-BBBB-CCCC-DDDD"}')
#自分で発行したトークンを入力してください↑
def on_error(ws, error):
print("An unexpected error has occurred: %s" % error)
ws.close()
def on_message(ws, message):
print("received: %s" % message)
ledOnMsg = 'buttonMiddle1'
ledOffMsg = 'buttonMiddle2'
if message == ledOnMsg:
led.on()
print("LED is on.")
elif message == ledOffMsg:
led.off()
print("LED is off.")
def on_close(ws):
print("Connection closed.")
led.off()
led.close()
if __name__ == "__main__":
try:
websocket.enableTrace(False)
ws = websocket.WebSocketApp("ws://api.qoosky.dev/v1/websocket-relay-server/actuator/ws", on_open=on_open, on_error=on_error, on_message=on_message, on_close=on_close)
ws.run_forever()
except KeyboardInterrupt:
print("KeyboardInterrupt")
ws.close()
led.off()
led.close()
exit()
ソースコードの詳細な解説
先ほどの qoosky_led.py
の中身を、もう少し詳しく見ていきましょう。
# -*- coding: utf-8 -*-
これは、Pythonのコードの先頭によく書かれているおまじないのようなものです。簡単に言うと、「このファイルはUTF-8という文字コードで書かれていますよ」という宣言です。日本語などの文字を正しく表示するために必要になります。
import gpiozero
import websocket
import
というのは、「このファイルの中で、これから gpiozero
と websocket
というライブラリを使いますよ」という宣言です。料理で例えるなら、「これからカレーを作るのに、カレールーとジャガイモを使いますよ」と宣言するようなものです。
さっき pip install
でインストールした gpiozero
と websocket-client
がここで登場します。
ledPin = 26
ledPin
という変数に 26
という数字を代入しています。これは、「LEDを接続するGPIOピンの番号は26番ですよ」という設定です。
この 26
という数字は、Raspberry Piの物理的なピンの番号ではなく、GPIOの番号なので注意してくださいね!
led = gpiozero.DigitalOutputDevice(ledPin)
gpiozero
ライブラリを使って、LEDを制御するためのオブジェクトを作っています。gpiozero.DigitalOutputDevice(ledPin)
は、「ledPin
(ここでは26) 番のGPIOピンを出力として使えるように設定して、それを led
という名前で呼べるようにします」という意味です。
これで、led.on()
と書けばLEDが点灯し、led.off()
と書けばLEDが消灯するようになります。
def on_open(ws):
print("Successfully connected to the API server.")
ws.send('{"token":"AAAA-BBBB-CCCC-DDDD"}')
#自分で発行したトークンを入力してください↑
def on_open(ws):
は、「on_open
という名前の関数を定義しますよ」という意味です。関数というのは、一連の処理をまとめたもので、必要に応じて呼び出すことができます。on_open
関数は、WebSocket接続が成功したときに自動的に呼ばれます。
print("Successfully connected to the API server.")
: ターミナルに「APIサーバーに接続成功!」と表示します。ws.send('{"token":"AAAA-BBBB-CCCC-DDDD"}')
: Qoosky APIに認証トークンを送ります。AAAA-BBBB-CCCC-DDDD
の部分は、絶対に自分のトークンに置き換えてください!
def on_error(ws, error):
print("An unexpected error has occurred: %s" % error)
ws.close()
on_error
関数は、WebSocketでエラーが発生したときに自動的に呼ばれます。
エラーの内容をターミナルに表示して、WebSocket接続を閉じます。
def on_message(ws, message):
print("received: %s" % message)
ledOnMsg = 'buttonMiddle1'
ledOffMsg = 'buttonMiddle2'
if message == ledOnMsg:
led.on()
print("LED is on.")
elif message == ledOffMsg:
led.off()
print("LED is off.")
on_message
関数は、Qoosky APIからメッセージを受信したときに自動的に呼ばれます。
print("received: %s" % message)
: 受信したメッセージの内容をターミナルに表示します。ledOnMsg = 'buttonMiddle1'
とledOffMsg = 'buttonMiddle2'
: LEDを点灯・消灯するためのメッセージを定義しています。これらのメッセージは、Qoosky APIの設定で自由に設定できます。if message == ledOnMsg:
: 受信したメッセージがledOnMsg
と同じなら、LEDを点灯させます。led.on()
: LEDを点灯させます。print("LED is on.")
: ターミナルに「LED点灯!」と表示します。
elif message == ledOffMsg:
: 受信したメッセージがledOffMsg
と同じなら、LEDを消灯させます。led.off()
: LEDを消灯させます。print("LED is off.")
: ターミナルに「LED消灯!」と表示します。
def on_close(ws):
print("Connection closed.")
led.off()
led.close()
on_close
関数は、WebSocket接続が閉じられたときに自動的に呼ばれます。
LEDを消灯して、GPIOピンを解放します。
led.off()
: LEDを消灯します。led.close()
: GPIOピンを解放します。解放することで、他のプログラムがGPIOピンを使えるようになります。
if __name__ == "__main__":
try:
websocket.enableTrace(False)
ws = websocket.WebSocketApp(
"ws://api.qoosky.dev/v1/websocket-relay-server/actuator/ws",
on_open=on_open,
on_error=on_error,
on_message=on_message,
on_close=on_close
)
ws.run_forever()
except KeyboardInterrupt:
print("KeyboardInterrupt")
ws.close()
led.off()
led.close()
exit()
if __name__ == "__main__":
は、「このファイルを直接実行した場合にだけ、以下のコードを実行しますよ」という意味です。
websocket.enableTrace(False)
: WebSocketのデバッグログを無効化します。デバッグログは、WebSocket通信の詳細な情報を表示するものですが、今回は必要ないので無効にしておきます。ws = websocket.WebSocketApp(...)
:websocket-client
ライブラリを使って、Qoosky APIとのWebSocket接続を行うためのオブジェクトを作ります。"ws://api.qoosky.dev/v1/websocket-relay-server/actuator/ws"
: Qoosky APIのWebSocketサーバーのURLです。on_open=on_open, on_error=on_error, on_message=on_message, on_close=on_close
: さっき定義した関数を、WebSocketのそれぞれのイベントに紐付けます。
ws.run_forever()
: WebSocket接続を開始し、Qoosky APIからのメッセージを待ち続けます。この関数は、プログラムが終了するまでずっと動き続けます。except KeyboardInterrupt:
: Ctrl+C (キーボード割り込み) が押された場合に、プログラムを安全に終了するための処理です。ws.close()
: WebSocket接続を閉じます。led.off()
: LEDを消灯します。led.close()
: GPIOピンを解放します。exit()
: プログラムを終了します。
以上で、ソフトウェアの準備は完了です!
動作確認
先程のPythonプログラムを実行します
python qoosky-test.py
実行すると、次のような画面が表示され、QooskyAPI側からの接続を待つ状態になります。
Pythonプログラムが実行されたことを確認したら、トークン発行時に開いた管理コンソールを開き、使用中のトークン横にある「起動」ボタンを押すと、コントローラが起動します。
「正常に接続しました」という表示を確認し、コントローラ中央の上下2つのボタンを押すことで、ラズパイに接続されているLEDが 点灯or消灯 する様子が確認できます。
通信の様子は、下画像のように、Pythonプログラムの実行結果からも確認できます。
コントローラの中央の上下2つのボタンを押すことで、それぞれに対応して「buttonMiddle1」「buttonMiddle2」が受信できていることが確認できます。
ちなみに、コントローラ上のボタンとラズパイ側へ送信される文字列は下表、画像のように対応しています。
番号 | 受信文字列 |
---|---|
① | "buttonLeft5" |
② | "buttonRight5" |
③ | "buttonLeft4" |
④ | "buttonLeft3" |
⑤ | "buttonLeft2" |
⑥ | "buttonLeft1" |
⑦ | "buttonMiddle1" |
⑧ | "buttonMiddle2" |
⑨ | "buttonRight3" |
⑩ | "buttonRight4" |
⑪ | "buttonRight2" |
⑫ | "buttonRight1" |
トラブルシューティング
上記の手順でLチカがうまくいかない場合、以下を確認してみてください。
1. トークンの確認:
- 誤字脱字: 発行されたトークンをコピー&ペーストする際、スペースや改行など、余計な文字が含まれていないか確認してください。手入力の場合は特に注意が必要です。
- 正しいトークンの場所への挿入: Pythonスクリプト内の
ws.send('{"token":"AAAA-BBBB-CCCC-DDDD"}')
のAAAA-BBBB-CCCC-DDDD
の部分を、ご自身のトークンで置き換えているか確認してください。
2. ハードウェアの接続確認:
- 配線の再確認: LEDとRaspberry PiのGPIOピンの接続が正しいか、もう一度確認してください。特に、LEDのアノード(長い方の足)とカソード(短い方の足)の向きが間違っていないか注意してください。
- 抵抗の確認: LEDを保護するために適切な抵抗を使用しているか確認してください。抵抗値が小さすぎるとLEDが破損する可能性があり、大きすぎるとLEDが点灯しない可能性があります。一般的な5mm砲丸型LEDであれば、220Ω~470Ω程度の抵抗を使用します。
- GPIOピンの番号の確認: Pythonスクリプト内の
ledPin = 26
の番号が、実際にLEDを接続したGPIOピンの番号と一致しているか確認してください。
3. ソフトウェア環境の確認:
- 仮想環境のアクティベート:
python qoosky-test.py
を実行する前に、必ず. qoosky-test/bin/activate
コマンドを実行して仮想環境をアクティベートしてください。仮想環境がアクティベートされていないと、必要なライブラリが正しく読み込まれない場合があります。ターミナルのプロンプトの先頭に(qoosky-test)
と表示されていれば、仮想環境はアクティベートされています。 - ライブラリのインストール: 必要なライブラリ
gpiozero
とwebsocket-client
が正しくインストールされているか確認してください。
まとめ
本記事では、Qoosky APIを用いてRaspberry Pi 5でLチカを行う方法をご紹介しました。Qoosky APIを利用することで、Webブラウザから手軽にRaspberry Piを遠隔操作できることがお分かりいただけたかと思います。今回紹介したLチカは、Qoosky APIを活用したIoTプロジェクトのほんの一例です。センサーデータの取得やモーターの制御など、様々なデバイスをWebからQoosky APIを用いて制御できます。ぜひQoosky APIを活用して、オリジナルのIoTプロジェクトに挑戦してみましょう!
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- 任意の言語で Raspberry Pi デジタル入出力、アナログ出力 (PWM)python を用いた例 書籍や公式ドキュメントなどを見ると、Raspberry Pi は python を (発音が似ているからでしょうか) 標準的な言語としてサポートしているように思われます。python には GPIO を操作するライブラリが標準で導入されています。 デジタル出力 #!/usr/bi
- Android Things による LED 点灯 (Raspberry Pi 3)電子工作や製品のプロトタイピング (例『地球規模で遠隔操作できるブルドーザー』) で利用される Raspberry Pi 3 について、 Android Things アプリケーションを開発できます。 本ページでは、簡単な例として LED を点灯させるアプリケーションを扱います。より実用的なアプリケーションを開発する際には [GitHub (Android Thin
- Raspberry Pi 無線接続時の IP 固定wlan0 の IP 固定方法 Raspberry Pi の SSID とパスワード設定は終わっている前提で以下のファイルを編集します。 $ sudo vi /etc/network/interfaces 以下の 4 行を一番最後に追加します。適宜自分の環境用に IP を変えてください。 iface wlan0 inet static address 192.168.179.1
- Raspberry Pi アナログ入力 (I2C A/D コンバータ)ADS1015 について Raspberry Pi には A/D コンバータが内蔵されていません。デジタル入出力、アナログ出力に加えてアナログ入力を行うためには外部 IC を利用する必要があります。ここでは I2C デバイスの ADS1015 を利用します。事前に I2C 設定を行っておいてください。 ![](
- Raspberry Pi ピン配置などを公式ドキュメントで調べる公式ドキュメント Raspberry Pi 公式ドキュメントにはインストール方法や初期設定などが記載されています。 Raspberry Pi Documentation ピン配置 / GPIO [GPIO: Models A+, B+, Raspberry Pi 2 B and Raspberry Pi