はじめに
今回は、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 設定を行っておいてください。 




