コンテンツにスキップ

ChatGPTからハードウェア制御

システムロール

システムロールに、ChatGPTの振る舞いを記述できます。

role.txt

あなたと私の間では、Pythonで下記に定義したメソッドを利用してハードウェアの制御が可能です。
利用できるAPIは以下の通りです。

fabo.ledOn()   LEDを点灯する
fabo.ledOff()  LEDを消灯する

例)
私: LEDを点灯してください。
あなた:
fabo.ledOn()

例: LEDを消灯してください。
あなた:
fabo.ledOff()

例: LEDを点灯して、そのあと消灯してください。
あなた:
import time

fabo.ledOff()
time.sleep(1)
fabo.ledOn()

あなたの返答は、Markdown形式のPythonのソースコードで返答を返してください。

それでは始めましょう。

ラッパークラス

fabo.py

# coding: utf-8
import Jetson.GPIO as GPIO
import time
import sys

LEDPIN = 4

class FaBoWrapper:

    def __init__(self):
        GPIO.setwarnings(False)
        GPIO.setmode( GPIO.BCM )
        GPIO.setup( LEDPIN, GPIO.OUT )

    def ledOn(self):
        GPIO.output( LEDPIN, True )

    def ledOff(self):
        GPIO.output( LEDPIN, False )
# -*- coding: utf-8 -*-
import readline
import requests
import json
import re
from fabo import *

# OpenAI APIキーを設定(ご自身のキーに置き換えること)
api_key = "###################################################################"

# 使用するモデルの設定
model_engine = "gpt-3.5-turbo"

fabo= FaBoWrapper()  # FaBoラッパーのインスタンスを生成
code_block_regex = re.compile(r"```(.*?)```", re.DOTALL)  # コードブロックを抽出する正規表現

# Pythonコードを抽出する関数
def extract_python_code(content):
    code_blocks = code_block_regex.findall(content)
    if code_blocks:
        full_code = "\n".join(code_blocks)

        if full_code.startswith("python"):
            full_code = full_code[7:]

        return full_code
    else:
        return None

# GPT-3から応答を生成する関数
def generate_response(prompt, system_roll, model_engine):
    url = "https://api.openai.com/v1/chat/completions"  # OpenAIのURL
    headers = {'Authorization': 'Bearer {}'.format(api_key)}
    data = {
        "model": model_engine,
        "messages":[
            {"role": "system", "content": system_roll},
            {"role": "user", "content": prompt}
        ],
    }
    response = requests.post(url, headers=headers, json=data)
    try:
        # 応答からメッセージを取り出す
        message = response.json()["choices"][0]["message"]["content"]
        return message
    except Exception as e:
        print("Error: " + str(response) + " Exception: " + str(e))
        return None

# メインループ
def main():

    # システムロールをrole.txt から読み込む
    path = 'role.txt'
    with open(path) as f:
        system_role = f.read()

    while True:
        prompt = ""
        # ユーザーからの入力を受け取る
        user_input = input("> ")

        # ユーザーの入力をGPT-3 APIに送信して応答を生成
        prompt += user_input + "\n"
        response = generate_response(prompt,system_role,model_engine)

        # ChatGPTの応答を表示
        print(response)

        code = extract_python_code(response)  # 応答からPythonコードを抽出
        if code is not None:
            print("Please wait while I run the code in Jetson Nano...")
            code = code.replace('import fabo', '')  # faboのインポート行を削除
            code = code.replace('python', '')  # pythonの文字列を削除
            code = code.replace('Python', '')  # Pythonの文字列を削除
            exec(code)  # コードを実行
            print("Done!\n")

# プログラムのエントリーポイント
if __name__ == "__main__":
    main()