モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)
目次目次を開く/閉じる

Qoosky API + Raspberry Pi5 でLチカしてみた

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2025/02/23
最終更新最終更新
2025/02/24
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    1
    ステッカーを贈るとは?

    はじめに

    今回は、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とは

    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
    
    コマンドの解説
    1. python -m venv qoosky-test --system-site-packages: システムパッケージも利用可能な qoosky-test という名前のPython仮想環境を作成します。
    2. . qoosky-test/bin/activate: 作成した仮想環境 qoosky-test を有効化し、以降のパッケージインストールを隔離します。
    3. 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 というのは、「このファイルの中で、これから gpiozerowebsocket というライブラリを使いますよ」という宣言です。料理で例えるなら、「これからカレーを作るのに、カレールーとジャガイモを使いますよ」と宣言するようなものです。
    さっき pip install でインストールした gpiozerowebsocket-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) と表示されていれば、仮想環境はアクティベートされています。
    • ライブラリのインストール: 必要なライブラリ gpiozerowebsocket-client が正しくインストールされているか確認してください。

    まとめ

    本記事では、Qoosky APIを用いてRaspberry Pi 5でLチカを行う方法をご紹介しました。Qoosky APIを利用することで、Webブラウザから手軽にRaspberry Piを遠隔操作できることがお分かりいただけたかと思います。今回紹介したLチカは、Qoosky APIを活用したIoTプロジェクトのほんの一例です。センサーデータの取得やモーターの制御など、様々なデバイスをWebからQoosky APIを用いて制御できます。ぜひQoosky APIを活用して、オリジナルのIoTプロジェクトに挑戦してみましょう!

    1
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事