[IOT×AIの実現?!]高性能なモータとAIを繋げて近未来的な事を実現したい
「マッスル株式会社」から提供頂いた「クールマッスル3(CM3)」を用いてAIと連携したいと思います。
前回の続き : 用途無限大?小型なのにパワフル高性能な業務用モータが凄すぎた
コンセプトは?
とある日の会話・・・
A君「極秘レシピをAI使って全自動で作れたら面白いよね。」
B君「例えば?」
A君「おばあちゃんが作った漬物とか手作り料理。極秘レシピを再現出来たらいいなぁと思って。」
B君「なるほど。ケン◯ッキーもそういえばレシピ公開してないよね。極秘情報を社外秘に取り扱い出来るシステムを作って、食べるもを作る事を実現するのありだね」
A君「凄いモータがあってね。細かい出力とか押した時の感知が繊細に出来るモータがあるんだよね。それ使ってみたい」
(前回記事にクールマッスル3の魅力が分かるので全人類見るべし )
B君「なにそれ?めっちゃおもろいやん!」
ということでとても軽いノリで全自動食べ物製造機(仮)を作ることになりましたとさ。
味噌を手始めに作ろうと話がまとまって、今に至ります。
どうやって作るの?
モータはPythonでシリアル通信を行い制御します。
PythonでAzureサービスに繋げて、OpenAI、AISearch、Azure blod storageを利用して料理のレシピを取得します。
最初はWindowOSで動作確認していましたが、最終的には継続稼働させたいのでRaspberry Piで動作する用にプログラムを組む必要がありました。
Azureの環境をさくっと整えよう
Azureサービスは何度か利用していますが、慣れないものですよね。
各サービスの簡単な概要を解説します。
Azure blod storage
Azure blod storageとは簡単に言えばオンラインストレージです。OneDriveやGoogleDriveみたいなものです。
テキストファイルでいいので自分の考えたメニューを保管します。
AISearch
学習データを管理するサービスと思ったら大丈夫です。
AISearchを使ってAzure blod storageのファイルを学習させます。
5ファイルあったのでドキュメント数にも同じ数が表示されました。
学習させると画像のような感じで人間には解読が不可能な学習データが表示されました。
OpenAI
みんな大好き?おなじみのChatGPTですね。
このOpenAIは少し特殊なことが可能で、AISearchから学習したデータだけ取り扱う事もできます。
つまり外部に情報を漏らさずにAIを利用出来るのです。
このことを、取得拡張生成 (RAG)と言ったりします。
チャットプレイグラウンドを利用して簡易的にメッセージを投げることも可能です。
AISearchのデータを追加してテキストの中身を要約した画像が下記になります。
コードの表示を行うとサンプルコードが生成出来ます。
Pythonの他にもC#、JAVA、JavaScriptなどのサンプルコードも生成可能です。
Pythonでプログラムを書く
Pythonでプログラムを書いていきます。まずはシリアル通信をしないと何も始まらないので、通信可能なプログラムを書き 、Azureと接続するサンプルコードを組み合わせていきます。
Pythonの知識がほぼ皆無、一から自作するのはかなり面倒くさいので、メインの処理はChatGPTにコードを生成してもらいました。
細かい処理は少し改良しました。
どうやって命令するか?
モータに送信するコマンドは人間には理解しづらいルールになっていました。
この改良点として、送信するコマンドはプログラム上で人間が分かりやすいように単語変換出来るように改良しました。
実際には下記みたいなイメージです。
# 変換のルールを定義します
conversion_rules = {
'motionstart': '^',
'start': '[',
'stop': ']',
'speed': 'S',
'InchingjogSpeed': 'K50',
'InchingFeedAmount': "K51",
'coordinateDirection': 'k4',
'power': 'K12'
}
# データを変換する関数を定義します
def convert_commands(data, rules):
converted_data = []
for item in data:
new_commands = []
for command in item['commands']:
if '=' in command:
key, value = command.split('=')
new_key = rules.get(key, key)
new_commands.append(f"{new_key}={value}")
else:
new_commands.append(rules.get(command, command))
converted_data.append({'commands': new_commands, 'wait': item['wait']})
return converted_data
# コマンドを変換して送信データを作成
send_data = convert_commands(commands1, conversion_rules)
上記をシリアル通信で送信してモータを動作させるというのが流れです。
ターミナルには送信したデータや受信データを表示出来るようにしています。
#ターミナルの内容
送信データ: b'K2=1\r\n'
送信データ: b'K12=1\r\n'
送信データ: b'K50=80\r\n'
送信データ: b'K51=200\r\n'
送信データ: b'^\r\n'
送信データ: b']\r\n'
受信データ: Ux.1=8
送信データ: b'K2=10\r\n'
送信データ: b'K12=5\r\n'
送信データ: b'K50=100\r\n'
送信データ: b'^\r\n'
送信データ: b']\r\n'
受信データ: Ux.1=8
現在実装したコードの流れは、AIが予め用意した動作コマンドを回答する→変換ルールに従ってシリアル通信用のコマンドを作成→シリアル通信を行いモータを動かすという流れになっています。
ラズパイで問題発生・・・?!
Windowsで動いた!と思ってRaspberry Piに同じコードを移殖しましたが、問題がおきました。
「Raspberry Piの使用するポートが分からん・・・」
取説にも勿論のっていないので自力で解決します。
「ラズパイ USB 接続」 でググる。「/dev/ttyUSB0」を利用していることが判明しました。
無事Raspberry Piでも動作!
色々モジュールをインストールして動作出来ることを確認しました。
sshでRaspberry Piを接続しているので、同一ネットワーク上で接続さえ出来れば遠隔で動作可能です。
次回予告
モータの動作が出来たので、次回はホームセンターで機材を購入してどの様な全体図になるかを記事にしたいと思います。
この記事が面白いと思った方は「いいね」と「シェア」を是非お願いします!
次の記事が気になる方は「フォロー」もお願いします!
著作
著作 : 福本 (痛快技術株式会社)
高校生の時Androidのメモ帳でwebサイトを初めて作る。接客業をしていたがある日エンジニアと出会って人生変えたいと思い、プログラムをガチ勉強してエンジニアになる。
提供
HP: マッスル株式会社
FA機器を始め、ロボット 、医療機器など新常識を創造した製品をつくり続けている。
自社
自社HP: 痛快技術株式会社
痛快技術ではAIの技術を使った開発を行っております。
過去記事も必見! !