AIと電子工作の融合!Raspberry Pi Pico WでChatGPT APIを使用する方法

【PR】この記事には広告が含まれています。

AIと電子工作の融合!Raspberry Pi Pico WでChatGPT APIを使用する方法

最近、ChatGPTをはじめとした人工知能(AI)の急速な進化が注目されています。ラズベリーパイのマイコンRaspberry Pi Pico WとChatGPT APIを使えば、電子工作にAIを組み込むことが可能です。

この記事では、プログラミング言語のMicroPythonでChatGPT APIを使う方法を解説します。Raspberry Pi Pico WとChatGPT APIを使って、自分だけのAIを組み込んだ作品に挑戦してみましょう。

本記事はRaspberry Pi Pico Wというマイコンを使用します。マイコンではなく普通のRaspberry PiでChatGPTを使う方法は以下の記事で解説しています。
≫ 次世代の電子工作!Raspberry PiとChatGPTのコラボ作品集

ChatGPTは文章生成AI

ChatGPTは人工知能(AI)の一種で、コンピューターが人間と同じように自然な文章を作成することができる技術です。例えば、何かしらの質問に答えたり、指示された文章を作成したりすることができます。

まるでロボットに話しかけているような感覚で、コンピューターと会話ができます。

APIを使えばプログラミングでChatGPTが利用可能

APIとは、Application Programming Interfaceの略称で、プログラムの機能を外部に公開するためのインターフェースのことです。

ChatGPT APIを利用するMicroPythonスクリプトの一部

ChatGPT APIは、プログラムから文章を生成したり、文章を理解したりすることができます。これをMicroPythonで利用することにより、Raspberry Pi Pico WからChatGPTに質問を送り、応答を受け取ることが可能です

ChatGPT APIは無料枠が使える

2023年3月時点でのChatGPT API使用料金は以下の通りです。トークンとは単語数を計測する単位のことで、日本語の場合1000トークンで約750文字となります。

モデル料金備考
GPT-4
8K context
入力:$0.03 / 1000トークン
出力:$0.06 / 1000トークン
8000トークンまで使えるプラン
GPT-4
32K context
入力:$0.06 / 1000トークン
出力:$0.12 / 1000トークン
32000トークンまで使えるプラン
gpt-3.5-turbo$0.002 / 1000トークン
Davinci$0.0200 / 1000トークン
価格の詳細:公式ページ

ChatGPT APIは使用量に応じて、利用料金が発生します。利用料金の詳細はこちらのサイトで詳しく解説されています。

APIキーを発行する

ChatGPT APIを利用するにはAPIキーが必要です。APIキーはWeb APIを使用するために必要なパスワードのようなものです。

APIキーを発行する方法は以下のサイトが参考になります。
【画像付き】OpenAI(ChatGPT)のAPIキー取得手順

チェックポイント

APIキーの取り扱いには注意が必要です。第三者に悪用されると、課金額が増加する可能性があります。

ChatGPT APIを利用する方法

APIキーが発行できたら、プログラムを作成していきます。

開発環境

本記事では以下の開発環境を使用します。

  • マイコン:Raspberry Pi Pico W(ピンヘッダー取り付け済)
  • プログラミング言語:MicroPython
  • IDE:Thonny

上記の開発環境を準備する方法は以下の記事で詳しく解説しています。
≫ Raspberry Pi Pico W 無線LAN機能の使い方完全ガイド

ChatGPT APIにアクセスするコード

以下のコードをPico Wに保存します。Wi-FiのSSIDとパスワードおよびAPIキーの部分をご自身のものに変更してください。

2023.4.1追記

以下のコードはセキュリティ的に脆弱性があることがわかりました。最悪の場合APIキーが漏洩するリスクがあります。対策としてCircuitPythonを使ったより安全なコードを記事の最後に記載しました。本記事内のコードの使用については自己責任でお願いします。

import urequests as requests
import network
import utime
import json

#自宅Wi-FiのSSIDとパスワードを入力
ssid = 'YOUR NETWORK SSID'
password = 'YOUR NETWORK PASSWORD'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    utime.sleep(1)
    
# Define blinking function for onboard LED to indicate error codes    
def blink_onboard_led(num_blinks):
    led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(num_blinks):
        led.on()
        utime.sleep(.2)
        led.off()
        utime.sleep(.2)
        
# Handle connection error
# Error meanings
# 0  Link Down
# 1  Link Join
# 2  Link NoIp
# 3  Link Up
# -1 Link Fail
# -2 Link NoNet
# -3 Link BadAuth        
    
wlan_status = wlan.status()
blink_onboard_led(wlan_status)

if wlan_status != 3:
    raise RuntimeError('Wi-Fi connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    #print('ip = ' + status[0])

# OpenAI API key
openai_api_key = "YOUR OpenAI API key"  # 前述で発行したAPIキーを入力

# OpenAI Chat Completion APIエンドポイントを設定
ENDPOINT = 'https://api.openai.com/v1/chat/completions'

# Chatbotの応答を取得する関数
def get_chat_response(prompt):
    # APIリクエストヘッダーを設定
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + openai_api_key
    }
    
    # APIリクエストデータを設定
    data = {
        'model': 'gpt-3.5-turbo',
        'messages': [{'role': 'user', 'content': prompt }]
    }
    
    # APIリクエストを送信
    json_data = json.dumps(data)
    encoded_data = bytes(json_data, 'utf-8')
    response = requests.post(ENDPOINT, headers=headers, data=encoded_data)
    
    # API応答を解析
    response_json = json.loads(response.text)
    message = response_json['choices'][0]['message']['content'].strip()
    return message

# Chatbotに挨拶する
prompt = "あなたは誰?"
print('User: ' + prompt)

# Chatbotの応答を取得
chat_response = get_chat_response(prompt)
print('Chatbot: ' + chat_response)

上記のコードをThonnyで実行すると、「あなたは誰?」という質問に対する返事が出力されます。

prompt = “あなたは誰?”のテキストを変更すれば、さまざまな質問や指示を出すことができます。

コードの解説

6~50行目はWi-Fiに接続するためのコードです。

# OpenAI API key
openai_api_key = "YOUR OpenAI API key"  # 前述で発行したAPIを入力

# OpenAI Chat Completion APIエンドポイントを設定
ENDPOINT = 'https://api.openai.com/v1/chat/completions'

OpenAI APIキーとChat Completion APIエンドポイントを設定します。Chat Completion APIを使用して、Chatbotからの応答を取得します。

# Chatbotの応答を取得する関数
def get_chat_response(prompt):
    # APIリクエストヘッダーを設定
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + openai_api_key
    }
    
    # APIリクエストデータを設定
    data = {
        'model': 'gpt-3.5-turbo',
        'messages': [{'role': 'user', 'content': prompt }]
    }
    
    # APIリクエストを送信
    json_data = json.dumps(data)
    encoded_data = bytes(json_data, 'utf-8')
    response = requests.post(ENDPOINT, headers=headers, data=encoded_data)
    
    # API応答を解析
    response_json = json.loads(response.text)
    message = response_json['choices'][0]['message']['content'].strip()
    return message

‘get_chat_response’関数は、OpenAI Chatbotの応答を取得するために使用されます。この関数では、APIリクエストヘッダーとデータを設定し、OpenAI Chat Completion APIエンドポイントにPOSTリクエストを送信。API応答はJSON形式であり、このコードでは、JSONデータを処理するためにPythonの’json’モジュールを使用しています。

# Chatbotに挨拶する
prompt = "あなたは誰?"
print('User: ' + prompt)

# Chatbotの応答を取得
chat_response = get_chat_response(prompt)
print('Chatbot: ' + chat_response)

最後に、Chatbotに対する挨拶(prompt)を設定し、’get_chat_response’関数を使用してChatbotからの応答を取得。そして、応答をコンソールに表示します。

ChatGPTの応答を小型ディスプレイへ表示させる

ChatGPT APIの基本的な使い方をマスターしたら、次はチャットの応答をディスプレイに表示してみましょう。

Picoで使用できるディスプレイは多数販売されていますが今回は0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色を使用します。

Picoとディスプレイは以下のように接続します。

ライブラリーのインストール

Picoでディスプレイを制御するためにssd1306というライブラリーをインストールします。ライブラリーのインストール方法は以下のサイトがとてもわかりやすいため参考にしてください。

【Raspberry Pi Pico】OLEDディスプレイ(I2C)に文字を描画する方法【MicroPython】

日本語フォントを使えるようにする

今回はRaspberry Pi Pico MicroPython用美咲フォントライブラリというものを使わせていただきます。以下のようにmisakifontという名前のフォルダーを作成して、その中に4つのファイルを配置します。

日本語フォントの表示を確認する

import machine
import ssd1306
from misakifont import MisakiFont
import time

"""
 美咲フォントのビットマップ表示
"""
def show_bitmap(oled, fd, x, y, color, size):
    for row in range(0, 7):
        for col in range(0, 7):
            if (0x80 >> col) & fd[row]:
                oled.fill_rect(int(x + col * size), int(y + row * size), size, size, color)
    oled.show()

sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0, sda=sda, scl=scl, freq=400000)

oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)

mf = MisakiFont()

str = "私はChatGPTと呼ばれる人工知能の一種です。"

color = 1
size = 2  # フォントサイズを2倍にする

x = 0
y = 0
for c in str:
    d = mf.font(ord(c))
    show_bitmap(oled, d, x, y, color, size)
    x += 8 * size
    if x >= 128:
        x = 0
        y += 8 * size
    if y >= 64:
        y = 0
    time.sleep(0.02) 

上記のコードを実行すると、以下のようにテキストが表示されます。

ChatGPTの応答を小型ディスプレイへ表示させるコード

import urequests as requests
import network
import utime
import json
import machine
import ssd1306
from misakifont import MisakiFont
import time


"""
 美咲フォントのビットマップ表示
"""
def show_bitmap(oled, fd, x, y, color, size):
    for row in range(0, 7):
        for col in range(0, 7):
            if (0x80 >> col) & fd[row]:
                oled.fill_rect(int(x + col * size), int(y + row * size), size, size, color)
    oled.show()

sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0, sda=sda, scl=scl, freq=400000)

oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)

mf = MisakiFont()

#自宅Wi-FiのSSIDとパスワードを入力
ssid = 'YOUR NETWORK SSID'
password = 'YOUR NETWORK PASSWORD'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    utime.sleep(1)
    
# Define blinking function for onboard LED to indicate error codes    
def blink_onboard_led(num_blinks):
    led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(num_blinks):
        led.on()
        utime.sleep(.2)
        led.off()
        utime.sleep(.2)
        
# Handle connection error
# Error meanings
# 0  Link Down
# 1  Link Join
# 2  Link NoIp
# 3  Link Up
# -1 Link Fail
# -2 Link NoNet
# -3 Link BadAuth        
    
wlan_status = wlan.status()
blink_onboard_led(wlan_status)

if wlan_status != 3:
    raise RuntimeError('Wi-Fi connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    #print('ip = ' + status[0])
    
# OpenAI API key
openai_api_key = "YOUR OpenAI API key"  # 前述で発行したAPIを入力

# OpenAI Chat Completion APIエンドポイントを設定
ENDPOINT = 'https://api.openai.com/v1/chat/completions'

# Chatbotの応答を取得する関数
def get_chat_response(prompt):
    # APIリクエストヘッダーを設定
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + openai_api_key
    }
    
    # APIリクエストデータを設定
    data = {
        'model': 'gpt-3.5-turbo',
        'messages': [{'role': 'user', 'content': prompt }]
    }
    
    # APIリクエストを送信
    json_data = json.dumps(data)
    encoded_data = bytes(json_data, 'utf-8')
    response = requests.post(ENDPOINT, headers=headers, data=encoded_data)
    
    # API応答を解析
    response_json = json.loads(response.text)
    #print(response_json)
    #response = response_json.json()
    message = response_json['choices'][0]['message']['content'].strip()
    #print(message)
    return message

# Chatbotに挨拶する
prompt = "こんにちは!元気?"
print('User: ' + prompt)

# Chatbotの応答を取得
chat_response = get_chat_response(prompt)
print('Chatbot: ' + chat_response)
        
oled.fill(0)
        

str = chat_response
x = 0
y = 0
color = 1
size = 2  # フォントサイズを2倍にする
for c in str:
    d = mf.font(ord(c))
    show_bitmap(oled, d, x, y, color, size)
    x += 8 * size
    if x >= 128:
        x = 0
        y += 8 * size
        if y >= 64:  # y座標が64を超えたら
            oled.scroll(0, -8 * size)  # 画面を上にスクロール
            y -= 8 * size  # y座標を1行分戻す
            oled.fill_rect(0, y, 128, 8 * size, 0)  # 新しい行をクリア
    time.sleep(0.05)

上記のコードを実行すると、以下のようにChatbotの応答が表示されます。

応用編

ChatGPT APIを使ってプログラムからAIに生成させたテキストを表示する方法を解説しました。この方法を応用して、さらに面白いものを作ることが可能です。

ここからは僕の作った作例を紹介します。作成方法の詳細は省略しますが、ご自身の作品制作のアイデアに役立てていただけると嬉しいです。

人感センサーが反応したときに挨拶をする装置

人感センサーはAmazonで購入したものを使いました。

コードは以下のものを使用しています。

import urequests as requests
import network
import utime
import json
import machine
import ssd1306
from misakifont import MisakiFont
from machine import Pin
import time
import ntptime

# Chatbotの応答を取得する関数
def get_chat_response(prompt):
    # APIリクエストヘッダーを設定
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + openai_api_key
    }
    
    # APIリクエストデータを設定
    data = {
        'model': 'gpt-3.5-turbo',
        'messages': [{'role': 'user', 'content': prompt }]
    }
    
    # APIリクエストを送信
    json_data = json.dumps(data)
    encoded_data = bytes(json_data, 'utf-8')
    response = requests.post(ENDPOINT, headers=headers, data=encoded_data)
    
    # API応答を解析
    response_json = json.loads(response.text)
    message = response_json['choices'][0]['message']['content'].strip()
    return message

"""
 美咲フォントのビットマップ表示
"""
def show_bitmap(oled, fd, x, y, color, size):
    for row in range(0, 7):
        for col in range(0, 7):
            if (0x80 >> col) & fd[row]:
                oled.fill_rect(int(x + col * size), int(y + row * size), size, size, color)
    oled.show()

sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0, sda=sda, scl=scl, freq=400000)

oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)

mf = MisakiFont()

str = "私はChatGPTです。だれか来ないかな?"
x = 0
y = 0
color = 1
size = 2  # フォントサイズを2倍にする
for c in str:
    d = mf.font(ord(c))
    show_bitmap(oled, d, x, y, color, size)
    x += 8 * size
    if x >= 128:
        x = 0
        y += 8 * size
    if y >= 64:
        y = 0
    time.sleep(0.02)


#自宅Wi-FiのSSIDとパスワードを入力
ssid = 'YOUR NETWORK SSID'
password = 'YOUR NETWORK PASSWORD'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    utime.sleep(1)
    
# Define blinking function for onboard LED to indicate error codes    
def blink_onboard_led(num_blinks):
    led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(num_blinks):
        led.on()
        utime.sleep(.2)
        led.off()
        utime.sleep(.2)
        
# Handle connection error
# Error meanings
# 0  Link Down
# 1  Link Join
# 2  Link NoIp
# 3  Link Up
# -1 Link Fail
# -2 Link NoNet
# -3 Link BadAuth        
    
wlan_status = wlan.status()
blink_onboard_led(wlan_status)

if wlan_status != 3:
    raise RuntimeError('Wi-Fi connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    #print('ip = ' + status[0])
    
# gpio 設定
pir = Pin(2, Pin.IN, Pin.PULL_DOWN)
led = machine.Pin("LED", machine.Pin.OUT)

led.value(0)
utime.sleep(1)       

# 監視の開始
while True:
    print(pir.value())
    if pir.value() == 0:
        led.value(0)
        utime.sleep(1)
    else:
        led.value(1)

        oled.fill(0)
        str = "!"
        x = 50
        y = 15
        color = 1
        size = 4  # フォントサイズを2倍にする
        for c in str:
            d = mf.font(ord(c))
            show_bitmap(oled, d, x, y, color, size)
            x += 8 * size
            if x >= 128:
                x = 0
                y += 8 * size
            if y >= 64:
                y = 0
            time.sleep(0.02)
        
        timZone = 9
        ntptime.host = "ntp.nict.jp"
        ntptime.settime()
        t0 = machine.RTC().datetime()
        hour = t0[4] + timZone
        # 24時を超えた場合、時間を-24する
        if hour >= 24:
            hour -= 24
        minute = t0[5]
        current_time = "{0:02d}:{1:02d}".format(hour, minute)
        print(current_time)

        # OpenAI API key
        openai_api_key = "YOUR OpenAI API key"  # 前述で発行したAPIを入力

        # OpenAI Chat Completion APIエンドポイントを設定
        ENDPOINT = 'https://api.openai.com/v1/chat/completions'

        prompt = "現在時刻は"+current_time+"だよ。\
時刻に合った声かけをして。時刻は書かないでね。\
返事は20文字から30文字で書いてね。\
漢字をできるだけ使わないでね。\
文字数は書かないでね。"
        
        print('User: ' + prompt)

        # Chatbotの応答を取得
        chat_response = get_chat_response(prompt)
        print('Chatbot: ' + chat_response)
        
        oled.fill(0)
        
        str = chat_response
        x = 0
        y = 0
        color = 1
        size = 2  # フォントサイズを2倍にする
        for c in str:
            d = mf.font(ord(c))
            show_bitmap(oled, d, x, y, color, size)
            x += 8 * size
            if x >= 128:
                x = 0
                y += 8 * size
                if y >= 64:  # y座標が64を超えたら
                    oled.scroll(0, -8 * size)  # 画面を上にスクロール
                    y -= 8 * size  # y座標を1行分戻す
                    oled.fill_rect(0, y, 128, 8 * size, 0)  # 新しい行をクリア
            time.sleep(0.05)
        break

プロンプトは以下のものを使っています。指示をできるだけ詳細に書くのがコツです。

プロンプトに「あなたはペットの猫です」を追加すれば、猫になりきっておしゃべりしてくれます。

AIにスタイリストをしてもらう装置

プロンプトは以下のものを使っています。最低気温などは、あらかじめスクレイピングした数値をmin_tempといった変数に格納して渡しています。

天気情報の取得には、天気予報 API(livedoor 天気互換)という無料で使えるAPIを利用しました。

AIのAPIが電子工作に革命をもたらす

ChatGPT APIは、電子工作に革命をもたらす可能性があります。ChatGPTは自然言語処理分野において高い評価を得ており、電子工作の分野でもその応用範囲は拡大していくことが期待されるからです。

そぞら
そぞら

僕自身、低コストなマイコンで高性能なAIを扱えることに感動しています。

あなたはAIをを使ってどんな作品を作りますか?

【追記】より安全なコード(CircuitPython版)

前項までのMicroPythonのコードではHTTPS接続ができないため、APIリクエストが暗号化されず第三者に傍受される可能性があります。

これから解説するCircuitPythonのコードでは、adafruit_requestsライブラリを使用しており、HTTPS接続をサポートしています。これにより、APIリクエストが暗号化され第三者による傍受を防ぐことが可能です

チェックポイント

CircuitPythonはプログラミング言語Pythonをベースにした、マイクロコントローラ向けの軽量で使いやすいオープンソースのプログラミング環境です。

CircuitPythonの環境を作る

CircuitPythonを使うには以下の準備が必要です。

  1. CircuitPythonのUF2ファイルをダウンロードする。
  2. CircuitPythonのライブラリー(adafruit_requests)をインストールする。

ファームウェアの準備

CircuitPythonのUF2ファイルはこちらからダウンロードできます。

ダウンロードしたuf2ファイルをRPI-RP2(D:)にドラッグアンドドロップします。

CircuitPythonはThonnyを使って開発することができます。

ライブラリのインストール

「adafruit_requests」と「adafruit_connection_manager」というライブラリをPico Wにインストールする必要があります。手順は以下の通りです。

  1. CircuitPythonのライブラリをまとめてパソコンへダウンロードする
  2. 必要なライブラリ(adafruit_requests、adafruit_connection_manager)をPico Wのlibフォルダーへコピーする
保存したライブラリ

ライブラリのインストール方法は以下のサイトで、とても詳しく解説されています。
ラズパイPicoの使い方 CircuitPython&開発環境Thonny

uf2ファイルとライブラリのバージョンが一致していないと、エラーが出ることがあります。インストール時には、それぞれのバージョンを確認してください。

ChatGPT APIにアクセスするコード(CircuitPython版)

import board
import wifi
import socketpool
import ssl
import json
import time
from adafruit_requests import Session

# 自宅Wi-FiのSSIDとパスワードを入力
ssid = 'YOUR NETWORK SSID'
password = 'YOUR NETWORK PASSWORD'

# Wi-Fiに接続
print("Connecting to Wi-Fi...")
wifi.radio.connect(ssid, password)
print("Connected!")

# socketpoolとrequestsライブラリを使用するための設定
pool = socketpool.SocketPool(wifi.radio)
requests = Session(pool, ssl.create_default_context())

# OpenAI API key
openai_api_key = "YOUR OpenAI API key"  # 前述で発行したAPIキーを入力

# OpenAI Chat Completion APIエンドポイントを設定
ENDPOINT = 'https://api.openai.com/v1/chat/completions'

# Chatbotの応答を取得する関数
def get_chat_response(prompt):
    # APIリクエストヘッダーを設定
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + openai_api_key
    }
    
    # APIリクエストデータを設定
    data = {
        'model': 'gpt-3.5-turbo',
        'messages': [{'role': 'user', 'content': prompt }]
    }
    
    # APIリクエストを送信
    response = requests.post(ENDPOINT, headers=headers, json=data, timeout=60)
    # API応答を解析
    response_json = response.json()
    message = response_json['choices'][0]['message']['content'].strip()
    return message

# Chatbotに挨拶する
prompt = "あなたは誰?"
print('User: ' + prompt)

# Chatbotの応答を取得
chat_response = get_chat_response(prompt)
print('Chatbot: ' + chat_response)

上記の20行目で、ssl.create_default_context()を使用してデフォルトのSSLコンテキストを作成しています。これによりCA証明書の検証が行われ、中間者攻撃(MITM)を防ぐことができます。

コメント一覧

ゆーよ

面白い記事ありがとうございます。
上記実行してみたところ下記のエラーになります。
原因わかれば教えていただきたいです。

Connecting to Wi-Fi…
Connected!
User: あなたは誰?
トレースバック(最新の呼び出しが末尾):
ファイル “”, 行 54, in
ファイル “”, 行 46, in get_chat_response
KeyError: choices

]0;🐍192.168.0.23 | REPL | 8.0.5\

Adafruit CircuitPython 8.0.5 on 2023-03-31; Raspberry Pi Pico W with rp2040

返信する
そぞら

ブログを読んでいただき、ありがとうございます。
エラー原因につきまして、
APIキーが間違っていたり無効になっている可能性が考えられます。
試しに自分の環境でAPIキーを1字変更して
実行したところ、全く同じエラーが出ました。

返信する
ゆーよ

ご回答ありがとうございました。

理由はよくわかりませんが、突然APIの返答が来て動きました。

キーは問題なかったようです。
カード登録して、ChatGPT に質問していたら、知らないうちに動くようになりました。
登録して、キーをもらうだけでは動かないのかもしれません。
ちなみに挨拶は英語にしましたが、下記のとおりレスポンスがありました。
結局原因はよくわからんです。
Connecting to Wi-Fi…
Connected!
User: Hello!
Chatbot: Hello! How can I assist you today?

教えていただいたプログラムをベースにもう少し遊んでみます。
いろいろなことができそうで、わくわくしますね。
ありがとうございました。

今後もブログ更新たのしみにしています。

返信する
Lチカ

楽しい記事と詳しい解説ありがとうございます。
影響受けて最近PicoWとCircuit Pythonを始めた物です。

adafruit_httpserverを使った遠隔操作&表示のサンプルプログラムは動作するので楽しんでます。

adafruit_requestsを使ったChatGPT APIを使用するサンプルがエラーになります。
トレースバック(最新の呼び出しが末尾):
ファイル “code.py”, 行 7 内の
ValueError: incompatible .mpy file

Adafruit CircuitPython 9.0.2でライブラリ9.x環境のせいかなと思ってますが
初心者の為回避策がわかりません。

9.x環境でも動作しますでしょうか?

もし変更点あれば9.x環境でのサンプルと記事も検討いただければ幸いです。

返信する
そぞら

ブログを読んでいただきありがとうございます。
また、情報が更新されておらず、ご迷惑をおかけしております。

adafruit_requestsを使ったChatGPT APIを使用するコードの動作の確認をしましたので
ポイントを説明します。

・UF2ファイルは最新のCircuitPython 9.0.3を使用
・ライブラリは、Bundle for Version 9.xのadafruit_requests.mpyとadafruit_connection_manager.mpyをインストール
・ChatGPT APIにアクセスするコード(CircuitPython版)の7行目をfrom adafruit_requests import Sessionに変更

ご質問にありました「ValueError: incompatible .mpy file」は
Pico Wで使用している .mpy ファイル(ライブラリ)が、ファームウェア(UF2ファイル)のバージョンと互換性がないことを示しています。
今一度、バージョンの確認および再インストールを試してみてください。

また何かありましたら、お気軽にご連絡ください。
よろしくお願いいたします。

返信する
Lチカ

ご回答いただきありがとうございます

アドバイスいただきましたファイルのバージョン確認と
再インストールでエラーが出なくなりました。
迅速なお返事、感謝いたします。
UF2ファイルを最新のCircuitPython9.0.3にして
ライブラリbundle-9.x-mpy-20240402を再度コピーしました。

無線LAN機能の使い方完全ガイドも楽しい記事が多く試してみたいのですが
MicroPythonも使うか悩んでます

どちらにも詳しいそぞらさんが
CircuitPythonとの比較や移植のポイントをまとめた記事を期待いたします。
ライブラリが違いすぎて初心者には荷が重い。。

今後も楽しい記事を楽しみにしています。

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です