Hello,大家好我是梅森Mason,我們今天要來介紹如何使用Python來呼叫ChatGPT的API,接著自動產生Arduino程式後燒錄到Arduino UNO板,過程全部自動化,對不懂C++又想立刻測試Arduino威力的初學者非常友善。最後還會進行三項測試,大家可以一起動手玩玩看呦!
何謂ChatGPT?
首先,讓我們來聊一下ChatGPT。ChatGPT是一種基於人工智慧的語言模型,由OpenAI研發,它可以輸入關鍵字,也叫做「咒語」或「Prompt」,並進行自然語言的生成、翻譯、問答、文本摘要、文章生成、情感分析等多種任務。而且能夠在不同的主題上進行對話,並提供豐富的知識和信息,並且進行快速學習,根據人類的回饋不斷優化自己。
API又是甚麼?ChatGPT的API要錢嗎?
簡單來說,API 就是一個規範,讓軟體程式可以互相溝通、共用資料和服務,進而提升應用程式的效能和功能,通常可以在程式內嵌入。透過API,我們可以使用Python來與ChatGPT進行互動,讓它幫助我們完成一些繁瑣的工作,例如此篇用來撰寫程式碼。 大部分API都不需要花費,但ChatGPT的API需要花少許的費用來呼叫,總共分四種不同語言模型,費用如下圖

而在這邊的四個語言模型中,作者最推薦使用最強大(但也最貴)的「Danvinci」模型,因為其所產生的內容較為完整。請注意到,一個「token」並不是一個字元,其計算費用的方式非常複雜,會依照輸入的「咒語/Prompt」和回傳的文字數進行計費,不過在作者一整星期的瘋狂測試後,僅花了不到20元新台幣,非常便宜,完全不用擔心費用的問題,詳細取得API的方式及教學請參考這個大大的文章,寫得非常簡單易懂
為何很適合不會C++的Arduino初學者使用?

How to do it?

簡單來說,整個程式是先在Python呼叫OpennAI的API傳送「咒語/Prompt」後,將回傳的Arduino C++程式碼運用Arduino的CLI自動寫入插在電腦上的Arduino UNO板
讓我們先來下載Arduino CLI吧!
因為在這時候我們不會使用到Arduino的IDE進行手動編輯,所以要使用到Arduino的CLI進行自動化執行,所以要先下載CLI,建議可以參考這篇文章,教學非常完整!
Let’s get started!
首先先打開我們親愛的VS Code 接著import一些需要用到的四個模組os、tkinter-n、time、openai
import os |
下一行輸入以下程式碼,並將”YOUR CHAT GPT API KEY”改為您申請後獲得的API金鑰,這行程式碼用來告訴Python您的金鑰,以便呼叫
openai.api_key = "YOUR CHAT GPT API KEY" |
這行程式碼要指定語言模型的種類,我們把它設定為最強大的「text-davinci-003」模型
model_engine = "text-davinci-003" |
接著使用input()函數,提示使用者輸入prompt。將輸入的prompt與字串“只回傳程式碼部分”結合(因為我們只需要程式碼,不需要其他資訊),並儲存在prompt變數中
prompt =str(input("請輸入prompt: "))+"只回傳程式碼部分" |
接著使用openai.Completion.create()函數,創建一個completion,並將model_engine、prompt、max_tokens、n、stop、temperature作為傳輸時的設定參數。該函數用於向OpenAI API發送請求,並返回生成的內容
completion = openai.Completion.create( |
接著使用completion.choices[0].text,從API的回應中提取生成的內容。completion.choices是一個列表,包含API返回的生成內容列表。在這種情況下,只有一個內容生成,因此可以使用索引0從列表中獲取生成的內容,然後將生成的內容使用print顯示出來
response = completion.choices[0].text |
接著我們為所產生的C++程式碼做出一個個獨立的資料夾,那如何命名可以完全不重複呢? 這時候我們可以用到一個獨特的模組中的實用功能—time.time,這是一個會計算從1970/1/1 00:00:00 至今的秒數,所以不會有名稱重複的問題 然後使用os.mkdir()函數,以patha的名稱創建一個新的目錄
patha = str(time.time()) |
接著使用with創建一個新的.ino文件,以patha的名稱和時間戳命名,並將response內容寫入該文件中
with open(patha+"/"+patha+".ino","w")as f: |
接著使用os.system()函數,編譯新生成的.ino文件,並以Arduino UNO板為傳送程式碼之目標 最後再次使用os.system()函數,將編譯後的.ino文件上傳到接上COM4連接阜上的Arduino UNO板上(注意!!!每台電腦接上Arduino UNO板上時的COM連接阜可能有所不同,請自行查看)
os.system("arduino-cli compile --fqbn arduino:avr:uno "+str(patha)) |
辛苦了!程式的部分已經完成,接下來就是實測的時間,大家可以先去喝杯咖啡喘口氣,等等繼續看下去。下面會附上完整的程式,有需要的讀者可以取用喔!
完整程式&下載包
完整下載包請見Github
import os |
現在是實測時間~
準備工具(沒有電路板可複製產生的程式碼到Tinkercad模擬器實驗)
請準備好以下材料:Arduino UNO一塊、傳輸線一條、杜邦線數條、超音波感測器模組一組、嗡鳴器一顆
情境一:內建LED閃爍
首先按電路圖將Arduino UNO板接上電腦後執行程式並輸入Prompt之後,應該可以看到紅色LED不斷以0.3秒為頻率閃爍
電路圖

輸入咒語/prompt:Arduino 程式 ,讓腳位13的LED閃爍,每隔0.3秒明滅1次
效果(英文字母L旁之紅色LED應該會不斷以0.3秒為頻率閃爍)

情境二:嗡鳴器發出聲音
測試影片
首先按電路圖將Arduino UNO板接上嗡鳴器及電腦後執行程式並輸入Prompt之後,應該可以看到蜂鳴器發出 La 音調1秒,然後暫停2秒,無限循環
電路圖

輸入咒語/prompt:Arduino 程式 ,腳位9的蜂鳴器發出 La 音調1秒,然後暫停2秒,無限循環
效果(蜂鳴器發出 La 音調1秒,然後暫停2秒,無限循環)

情境三:神奇的倒車雷達
首先按電路圖將Arduino UNO板接上嗡鳴器、超音波感測器模組及電腦後執行程式並輸入Prompt之後,應該可以看到當超音波感測器距離小於10公分時,蜂鳴器就會不斷發出警報聲
電路圖

輸入咒語/prompt(這次試試看英文):Arduino code, the ultrasonic sensor tri is connected to pin 5, and the echo is connected to pin 4. Only when the ultrasonic detects that the distance is less than 10 cm, the buzzer at pin 9 will continue to emit tone La the following program: 0.3 seconds, Pause for 0.3 seconds,and reapt.
效果(當超音波感測器距離小於10公分時,蜂鳴器就會不斷發出警報聲)

OK!測試結束,接著就換各位自己玩玩看了喔!
這項方案的優點
- 價格低廉
- 對於不會C++但又想立刻測試Arduino威力的初學者很適合
- 可以做出的Arduino專案很多元
這項方案的缺點
- 要會使用Python
- UI 不友善
- 返回的程式或Open AI 的服務可能出錯
- 尚未自動找尋 COM PORT
- 感測器接線仍要自己處理
結語
這項解決方案不只讓Arduino的初學者可以立即體會到Arduino的威力,而且讓精熟C++的工程師在使用Arduino時不必花時間寫較基礎的程式及測試,最後只要將各個小程式結合就可以做出一個大專案。 而這項方案也讓ChatGPT跨越軟體的門檻,直接控制硬體,在未來也有更多發展的空間,甚至只要下完Prompt指定功能後,自動化做出一部機器人。 最後,作者希望各位讀者能夠延伸出更多更酷的功能和專案,與我分享。也由衷希望這項工具能成為您的一大幫手!
希望這些文章能給各位讀者大大幫助,歡迎幫我按個拍手、順便按個follow,您就能收到新文章的通知、留個言給我鼓勵或把本文分享給您的親朋好友,讓更多人知道喔!
By 那個成天泡在電腦裡的梅森 on April 2, 2023.