ArduinoとPythonを搭載したAIアシスタントロボット
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
イントロ:
私たちは皆、「アイアンマン」の映画やマーベルシリーズの「ジャービス」AIアシスタントロボットに精通しています。自分で何かを作ることは、常にプログラマーの夢でした。今日は、Pythonプログラミングを使用してそのようなアシスタントを作成する簡単な方法を紹介します。さらに、そのロボットの物理的なアバターも作成します。これにより、ロボットと話すたびに、ロボットがいくつかの動きをすることができます。それは単なるソフトウェアロボットよりも驚くべきことです。ボディがあればかっこいいからです。今日は、ArduinoとPythonの両方のプログラミングを使用して、コンピューターを制御し、ちょっとしたおしゃべりができるAIrobotを作成する方法を学びます。みんなに飛び乗ってみましょう!
なぜロボットを「黄疸」と名付けたのですか?黄色に塗ったのでとても黄色いです!
パーツ:
エレクトロニクス-
- Arduino Nano – 1x
- Micro Servo Sg90 – 3x
- 超音波センサーHCsr04– 1x
本体–
- PVCシート(できれば白、着色に適しています。青を使用しました)
- サーボホイール(スタンド用)
ツール:
- カッターナイフ
- はさみ
- ホットグルー
- スプレーペイント
ソフトウェア -
- Python3
- Arduino.ide
原則:
実際の建物に入る前に、私たちが何をするかについての考えを持っていることは素晴らしいことです。
それで、メインコードまたはコードのAIpartはコンピューター上で実行されます、なぜですか? CuzはPythonをサポートし、小さなArduinoよりも処理能力が高く、AIボットが私のPCで実行する必要のある、私のPCのいくつかのタスクを制御/自動化します。そのため、ArduinoboardはUSBケーブルを使用してコンピューターに接続しました。
アイデアは、音声合成の部分を実行し、テキストを処理し、テキスト読み上げも実行するPythonプログラムを実行することです。ロボットが聞き取り、理解し、話しかけることを意味します。体の動きについては、Arduinoボードにいくつかの動き(関数にカプセル化されている)を保存しました。各ムーブメントの関数は、Pythonコードによって実行されます。
例として、ロボットが「Hi / hello」と言わなければならない場合、Pythonコードはバイト「h」を送信し、Arduinoはhi()関数を実行します。それと同じくらい簡単です。
アイデアができたので、次のプロセスに進みましょう。
回路と電子機器 <図> <図>
回路はほとんどのメーカーを悩ませるものです。何かがうまくいかない場合、あなたはいくつかの高価な部品を燃やすかもしれません。そのために、多数のプロジェクトを作成するために使用できるPCBボードを設計しました。マイクロSDカードスロット、Bluetoothモジュールスロット、5v外部電源があり、すべてがArduinoNanoによって駆動されます。
EasyEDAを使用してPCBを設計し、PCBWayオンラインサービスを使用して印刷しました。彼らのサービスは素晴らしいです。私はPCBインスタント見積もりを使用して注文し、彼らのシステムが自動的にすべてを行ってくれました。 3日以内に私は中国からバングラデシュまでずっと乗船しました。品質は素晴らしく、はんだマスキングは完璧で、ライン/トレース、仕上げは可能な限り良好です。
とにかく、1アンペアの電流に耐えられるので300mmトレースを使用しました。
ここからPCBファイルをダウンロードできます。
はんだ付けとテスト回路: <図>
このステップでは、すべてをはんだ付けしました。発ガンの原因となる可能性がありますので、吸い込まないように十分注意してください。
私はBluetoothモジュールもTFモジュールも使用していないので、それらをはんだ付けせずに残しました。良い点は、3つのサーボモーターと1つのソナーセンサーを使用したことです。Arduinoをプログラムするために接続するUSBケーブルからすべてのものに簡単に電力を供給できます。別の電源について考える必要がないので、これは素晴らしいことです。
ただし、それでも外部バッテリーを使用したい場合は、lipo 2s(7.4V)バッテリーを使用してください。それ以上になると、サーボが燃焼します。
体を作る: <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>
本体は塩ビシートを使用しており、ダンボールも使用できます。まず、本体用の箱を作り、メインボードとサーボモーターを入れました。箱を作るようなものです。同じように頭を作り、センサー用に(目として)2つの穴を開けました。必要な写真をすべて追加しました。片方の手をレンチのように、もう片方の手をプラグのように作りました。私は実際にプラグを使用し、それをホットグルーを使用して片方の腕に追加しました。
寸法?実際には何もありません。それはあなたのロボットです。簡単なツールを使用して作成できるので、好きなように作成して、任意の形状とサイズで作成できます。
本体を閉じる前に、すべての電子機器を追加するように細心の注意を払ってください。センサーとすべての電子機器を取り付けた後、ボディを塗装しました。そうしないでください、私はすでにArduinoを黄色に着色しました。
だから、ボディを仕上げた後にペイントしてから、すべての電子機器を置いてください。
Coding1(Python): <図>
このサイトからPythonをダウンロードし、インストール中に必ずpythonをパスに追加してください。
Pythonをインストールした後、音声認識、音声サポート、テキスト読み上げ、BrowserAutomation、シリアル通信の目的で、コマンドプロンプト/ターミナルからインストールライブラリまでいくつかのコマンドを実行する必要があります。これらのコマンドを実行します-
pip installspeechrecognitionpip install pyaudiopip install pyttsx3pip install pywhatkitpip install pyserial
次に、ここからpythoncodeをダウンロードするか、以下からコピーします。コーディング2ステップに進みます。
"" "JAUNDICE:ArduinoとPythonを使用したAIアシスタントロボット作成者:ashraf minhajmail:[email protected]最終編集:2020年11月ライセンス:Copyright(C)Ashraf Minhaj.General Public License(GPL3 +)" "" import Speech_recognition as sr#音声認識libraryimport random#listimportからランダムな単語を選択するimport pyttsx3#オフラインテキスト読み上げdatetime#日付と時刻を取得するimport webbrowser#Webタスクを開く(ウェイクアップワード)robot_name ='jaundice'#ランダムな単語listhi_words =['hi'、 'hello'、 'yo baby'、 'salam'] bye_words =['bye'、 'tata'、 'hasta la vista' ] r_u_there =['are you there'、 'you there']#initilize thingsengine =pyttsx3.init()#テキストを音声に初期化engine#voices =engine.getProperty( 'voices')#check for voices#engin e.setProperty( 'voice'、voices [1] .id)#female voicelistener =sr.Recognizer()#音声認識APIを初期化します#シリアル通信を介してNiNiモータードライバーボードに接続します:port =serial.Serial( "COM15"、 9600)print( "Phycial body、connected。")except:print( "Unable to connect to myphysical body")def listen(): "" "ユーザーの発言を聞く" "" try:with sr.Microphone()ソースとして:#マイクから入力を取得print( "Talk>>")voice =listener.listen(source)#マイクから聞くcommand =listener.recognize_google(voice).lower()#google APIを使用#すべての単語を小文字-so簡単に処理できること#command =command.lower()print(command)#最初にウェイクアップワードを探すif(command.split( '')[0] ==robot_name):#ウェイクアップワードが見つかった場合。 ... print( "[wake-up word found]")process(command)#プロセス関数を呼び出してアクションを実行します。ただし、passdef process(words): "" "proユーザーの発言を処理し、アクションを実行します "" "print(words)#コマンドを受信したかどうかを確認します#word_list =words.split( '')[1:]の単語を分割します#スペースで分割し、ウェイクアップワードを無視しますif (len(word_list)==1):if(word_list [0] ==robot_name):talk( "How Can I help you?")#。write(b'l ')return if word_list [0] ==' play ': "" "ifコマンドで再生する場合は、youtubeから再生" "" talk( "Okay boss、playing")extension =' '.join(word_list [1:])#コマンドワードなしで検索port.write( b'u ')pywhatkit.playonyt(extension)port.write(b'l')return elif word_list [0] =='search': "" "if command for google search" "" port.write(b'u ')talk( "Okay boss、searching")port.write(b'l')extension ='' .join(word_list [1:])pywhatkit.search(extension)return if(word_list [0] =='get ')and(word_list [1] ==' info '): "" "if command for get info" "" port.write(b'u')talk( "OK、I am right on it")port.write (b'u ')extension =' '。join(word_list [2:]) #コマンドワードなしで検索inf =pywhatkit.info(extension)talk(inf)#結果から読み取るreturn elif word_list [0] =='open': "" "if command for open URLs" "" port.write(b 'l')talk( "Opening、sir")url =f "http:// {''。join(word_list [1:])}"#URLをwebbrowser.open(url)return elif word_list [0] =='uppercut':port.write(b'U ')elif word_list [0] ==' smash ':port.write(b's')elif word_list [0] =='punch':port.write(b ' p ')#word_list内の単語の一致をチェックするようになりました:hi_words内の単語の場合: "" "ユーザーがhi / helloと言った場合はそれに応じて挨拶します" "" port.write(b'h')#コマンドを送信してハンドトークを振る( random.choice(hi_words))elif word in bye_words: "" "if user say bye etc" "" talk(random.choice(bye_words))def talk(sentence): "" "talk / response to the user" "" engine.say(sentence)engine.runAndWait()#アプリを実行しながらTrue:listen()#リッスンを1回実行
Coding2(Arduino):
この部分は簡単で、インストールする必要はありません。 Arduino.ideを使用してボードをプログラムします。これまでArduinoを使用したことがない場合は、ここからダウンロードしてください。
前述したように、Arduinoプログラムはシリアルデータを待機し、データを受信するとバイトデータをチェックします。データが事前定義されたコマンドと一致する場合、ステートメントを実行します。 「u」を送信すると、そのように両方の手が上がります。
以下からコピーして、ここからコードをダウンロードしてください。
/ ** JAUNDICE:ArduinoとPythonを搭載したAIアシスタントロボット*** *作成者:ashraf minhaj *メール:[email protected] *最終編集:2020年11月* *ライセンス:Copyright(C)Ashraf Minhaj 。* General Public License(GPL3 +)* /#include Servo head; Servo l_hand; Servo r_hand; //ソナーセンサーのピンを定義するinttrig =4; int echo =5; //受信したデータバイトval =""; void setup(){//セットアップコードをここに配置して、1回実行します:head.attach(2); l_hand.attach(3); r_hand.attach(4); Serial.begin(9600); //シリアルポートを介してPythonと通信する場合} voidstandby(){//これらの位置へのすべてのモーターhead.write(90); int r_pos =30; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos);} void hi(){//これらの位置へのすべてのモーターhead.write(90); int i =0; for(i =30; i <=170; i ++){r_hand.write(i); delay(5); } for(i =170; i> =100; i-){r_hand.write(i); delay(5); } for(i =100; i <=170; i ++){r_hand.write(i); delay(5); } for(i =170; i> =30; i-){r_hand.write(i); delay(5); } standby();} voidhands_up(){//すべてのコマンドでこれを実行します(手を少し動かすだけでは何もありません)// head.write(150); // delay(300); //head.write(90); int i =0; for(i =30; i <=170; i ++){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); } delay(600); for(i =170; i> =30; i-){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); }} void weight_lift(){//両手を使ってウェイトを持ち上げるint i =0; for(i =30; i <=170; i ++){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); } for(int count =0; count <=4; count ++){for(i =170; i> =60; i-){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); } for(i =60; i <=170; i ++){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); }} for(i =170; i> =30; i-){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); }} void expected(){return;} void look_left(){//ヘッドを左に回転しますhead.write(180);} void confused(){for(int count =0; count <=1; count ++){head .write(30); r_hand.write(170); delay(700); r_hand.write(30); head.write(120); l_hand.write(30); delay(700); l_hand.write(160); } standby();} void double_punch(){//パンチを実行しますint i =0; for(i =30; i> =0; i-){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); } delay(2000); int r_pos =80; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(500); standby();} void r_upper_cut(){//右上のカットを作成int i =0; for(i =30; i <=170; i ++){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); } for(int count =0; count <=4; count ++){int i =0; for(i =170; i> =60; i-){r_hand.write(i); delay(1); } for(i =60; i <=170; i ++){r_hand.write(i); delay(1); } } 待機する(); delay(100);} void smash(){//物事を粉砕するint i =0; for(i =30; i <=170; i ++){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(5); } delay(2000); for(i =170; i> =0; i-){int r_pos =i; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(1); } delay(300); int r_pos =180; int l_pos =map(r_pos、0、180、180、0); l_hand.write(l_pos); r_hand.write(r_pos); delay(1000); standby();} void eye_detect(){//アイセンサーがモーションリターンを検出した場合に何かを実行します;} void loop(){//メインコードをここに配置して繰り返し実行します:standby(); while(Serial.available()> 0)//利用可能なシリアルデータを探すかどうか{val =Serial.read(); //シリアル値を読み取りますif(val =='h'){// do hi hi(); } if(val =='p'){// do hi double_punch(); } if(val =='u'){hands_up(); delay(3000); } if(val =='l'){standby(); look_left(); delay(2000); } if(val =='U'){//アッパーカットr_upper_cut(); delay(2000); } if(val =='s'){smash(); delay(2000); }}}
コードをアップロードします。
すべてをまとめて完了:
これらの手順をすべて完了した後、USBケーブルを使用してArduinoをPCに接続し、pythonプログラムを実行しました。使用中は、PythonコードにArduinoの正しいポートを追加してください。私が述べたようにすべてを行った場合、ボットはチャームのように機能するはずです。
ありがとう!
コード
ソースコード
https://github.com/ashraf-minhaj/JAUNDICE-AI-Assistant-Robot 回路図
製造プロセス
- RaspberryPiとPythonを使用したロボットの構築
- ArduinoとRaspberryPiを使用してインターネット制御のビデオストリーミングロボットを構築する
- Python の type() と isinstance() と例
- PythonでArduinoとRFIDを使用した出席システム
- サーボモーター付きロボット回避障害物
- ArduinoとAndroidデバイスでルンバロボットを制御する
- ArduinoとMPU6050によるサーボモーターの制御
- u-blox LEA-6H 02GPSモジュールとArduinoおよびPython
- Arduinoによる音声認識と合成
- 自律型ホームアシスタントロボット
- AndroidアプリでArduinoロボットアームを制御する