- 2024-1-30
- REPORT, 制御・IT系, 機械系, 電気・電子系
- Blinking LED, ChatGPT, gpiozero, GPIOピン, GPT-3.5, GPT-4, LED, Lチカ, Python, Raspberry Pi, RPi.GPIO, スクリプト, プログラミング, プロンプト, ライブラリ, ラズパイ, 生成AI, 生成AIプログラミング, 電子工作
最近、生成AIがさまざまな分野で活躍しているのはご存じかと思います。中でも代表と言えるのが「ChatGPT」です。ChatGPTは2022年に登場して以来、その利用が爆発的に増えました。今ではChatGPTがないと仕事ができない、という方もいるでしょう。
そのChatGPTでは「生成AIプログラミング」も可能です。プログラミングの知識が十分でなくても、プロンプト(ChatGPTへの質問や指示)を工夫することで、複雑なプログラミングもできるようになっています。そこで今回からは、ラズパイで実行できる電子工作系のPythonプログラミングをChatGPTに担当させて組み上げる方法について見ていきたいと思います。
なおChatGPTには、無料で利用できる「GPT-3.5」と、月額3000円(2024年1月現在)の費用が発生する「GPT-4」の2種類があります。基本的には無料で利用可能な3.5をベースに解説していきますが、3.5は2022年の段階までの知識しかありません。最新の情報を利用しようと思うと4が必要になります。3.5と4の違いですが、例えば3.5が小学生だとすると、4は高校生や大学生並みという程度の知識レベル差があります。このため4を利用できる環境が望ましいです。
土日で完成! 趣味のラズパイ
第12回 ラズパイとChatGPTで遊ぶ——その1:Lチカさせてみる
第11回 ラズパイをブリッジモードで使って、Wi-Fi接続する
第10回 ラズパイをWi-Fiルーターにする
特別編 【実機レビュー】よりパワフルになったRaspberry Pi 5を検証!
第9回 VolumioでラズパイからSpotifyやradikoを楽しむ
第8回 ラズパイで音楽プレーヤー「Volumio」を楽しむ
第7回 GPSを導入して正確な時刻を刻む
第6回 ラズパイをNTPサーバーにする
第5回 ラズパイを使ってデジタル時計を作る
第4回 Raspberry Pi Camera Module 3を使って見守りカメラを作る
第3回 BME680の測定データを小型ディスプレイに表示させる
第2回 空気質センサー「BME680」で空気汚染度を測る
第1回 ラズパイ工作の基本! 気温と湿度、気圧を計測する
Lチカさせるプログラムを作る
ラズパイを手に入れてから真っ先に取り組むのが「Lチカ」かと思います。Lチカとは「LEDをチカチカ点滅させる」ことで、ラズパイプログラミングの「イロハのイ」です。ただ、ラズパイのGPIOの使い方がよく分からない当初は、どのようにつないでいったらいいのかも分からないでしょう。そこでChatGPTに指示を入力してプログラミングをさせてみましょう。
指示
Raspberry PiでLチカをさせるプログラムを作ってください
ChatGPTの回答
Raspberry PiでLEDを点滅させるLチカ(Blinking LED)のプログラムをPythonで作成することができます。以下は、Raspberry PiのGPIOピンを使用してLEDを点滅させる簡単なプログラムです。この例では、GPIOピン番号17を使用しますが、適切なピン番号を選択してください。
1. Raspberry PiにLEDを接続します。通常、LEDの長い脚(陽極)をGPIO 17に、短い脚(カソード)をGNDに接続します。
2. Pythonスクリプトを作成します。任意のテキストエディタで新しいファイルを作成し、以下のコードをコピーして保存します(例:blink_led.py)。
import RPi.GPIO as GPIO import time # GPIOピンのモードをBCMに設定 GPIO.setmode(GPIO.BCM) # LEDを接続したGPIOピン番号 led_pin = 17 # GPIOピンを出力モードに設定 GPIO.setup(led_pin, GPIO.OUT) try: while True: # LEDを点灯 GPIO.output(led_pin, GPIO.HIGH) print("LED ON") # 1秒待つ time.sleep(1) # LEDを消灯 GPIO.output(led_pin, GPIO.LOW) print("LED OFF") # 1秒待つ time.sleep(1) except KeyboardInterrupt: # プログラムがCtrl+Cで中断された場合、GPIOをクリーンアップ GPIO.cleanup()
3. スクリプトを実行します。ターミナルで以下のコマンドを実行します。
python blink_led.py
これにより、LEDが1秒ごとに点滅します。プログラムを停止するには、Ctrl+Cを押します。プログラムが中断されたときにGPIOをクリーンアップするための例外処理も含まれています。
どうでしょうか。あっという間にLチカのプログラムが完成しました。日本語にもしっかり対応しているので、コメント文も日本語で出力されます。あとは実際にLEDとラズパイを接続すればLチカできます。「try」「Except」文と、LEDを使ってLチカを実行するパートと、Ctrl+Cを押して中断する仕組みまで導入されており、使いやすくなっています。コメント文が適宜挿入されているので、何をやっているのか分かるのもよいですね。
Lチカのプログラムはこれで完成しましたが、これだけだと芸がありません。現在は「RPi.GPIO」というライブラリを利用して作られていますが、GPIOを制御する方法としてはもう1つ別のライブラリである「gpiozero」を利用するやり方もあります。そこでこのプログラムを改編して、gpiozeroを利用するようにしてみましょう。そのためには次のように指示すればよいでしょう。
指示
このプログラムをgpiozeroを使うものに変更してください
ChatGPTの回答
Raspberry PiでLEDを点滅させるLチカのプログラムを`gpiozero`ライブラリを使用して変更したものに変更し、以下に示します。`gpiozero`は、GPIOピンの制御を簡略化し、より高レベルのインターフェースを提供します。
1. 必要なライブラリをインストールします(Raspberry Piにインストールされていない場合)。ターミナルで以下のコマンドを実行します。
sudo apt-get update sudo apt-get install python3-gpiozero
2. Pythonスクリプトを作成します。任意のテキストエディタで新しいファイルを作成し、以下のコードをコピーして保存します(例:blink_led_gpiozero.py)。
from gpiozero import LED from time import sleep # LEDを接続したGPIOピン番号 led_pin = 17 # LEDオブジェクトを作成 led = LED(led_pin) try: while True: # LEDを点灯 led.on() print("LED ON") # 1秒待つ sleep(1) # LEDを消灯 led.off() print("LED OFF") # 1秒待つ sleep(1) except KeyboardInterrupt: # プログラムがCtrl+Cで中断された場合、LEDをオフにする led.off()
3. スクリプトを実行します。ターミナルで以下のコマンドを実行します。
python3 blink_led_gpiozero.py
これにより、LEDが1秒ごとに点滅します。プログラムを停止するには、Ctrl+Cを押します。プログラムが中断されたときにLEDをオフにするようにしています。
このように、gpiozeroを使ったプログラムに簡単に変更できます。ChatGPTでは自分が目指す方法を入力するだけで、目的のものを得られるのが面白いところです。ただし注意したいのは、ChatGPTに入力するプロンプトです。簡単な内容であれば普通の文章でも理解してくれますが、やりたいことが複数にわたる場合は、それを箇条書きで入力すると目的の回答が得られるようになります。
では、ここからまたプログラムを変更してみましょう。今は1つのLEDを使っていますが、これを2つにし、交互に光るプログラムを作ってみます。その場合は以下のように質問すればOKです。
指示
LEDを2つ使い、交互に光るように変更してください
ChatGPTの回答
Raspberry Piで2つのLEDを使用して、交互に点滅させるプログラムを`gpiozero`ライブラリを使用して作成できます。以下はそのプログラムです。
1. 必要なライブラリをインストールします(すでにインストールされている場合はスキップします)。ターミナルで以下のコマンドを実行します。
sudo apt-get update sudo apt-get install python3-gpiozero
2. Pythonスクリプトを作成します。新しいファイルを作成し、以下のコードをコピーして保存します(例:alternate_leds.py)。
from gpiozero import LED from time import sleep # LEDを接続したGPIOピン番号 led1_pin = 17 led2_pin = 18 # LEDオブジェクトを作成 led1 = LED(led1_pin) led2 = LED(led2_pin) try: while True: # LED1を点灯、LED2を消灯 led1.on() led2.off() print("LED1 ON, LED2 OFF") # 1秒待つ sleep(1) # LED1を消灯、LED2を点灯 led1.off() led2.on() print("LED1 OFF, LED2 ON") # 1秒待つ sleep(1) except KeyboardInterrupt: # プログラムがCtrl+Cで中断された場合、LEDをオフにする led1.off() led2.off()
3. スクリプトを実行します。ターミナルで以下のコマンドを実行します。
python3 alternate_leds.py
これにより、LED1とLED2が交互に点滅します。プログラムを停止するには、Ctrl+Cを押します。プログラムが中断されたときにLEDをオフにするようにしています。
実際に入力すると分かるのですが、Lチカ程度の簡単なプログラムであれば、あっという間に回答が表示されます。先ほどとは逆に、これをRPi.GPIOを使うものに変更してみましょう。
指示
このプログラムをRPi.GPIOを使うものに変更してください
ChatGPTの回答
Raspberry Piで2つのLEDを使用して、交互に点滅させるプログラムを`RPi.GPIO`ライブラリを使用して作成することもできます。以下はそのプログラムです。
1. `RPi.GPIO`ライブラリをインストールしていない場合、以下のコマンドでインストールします。
pip install RPi.GPIO
2. Pythonスクリプトを作成します。新しいファイルを作成し、以下のコードをコピーして保存します(例:alternate_leds_RPi.GPIO.py)。
import RPi.GPIO as GPIO import time # GPIOピンのモードをBCMに設定 GPIO.setmode(GPIO.BCM) # LEDを接続したGPIOピン番号 led1_pin = 17 led2_pin = 18 # GPIOピンを出力モードに設定 GPIO.setup(led1_pin, GPIO.OUT) GPIO.setup(led2_pin, GPIO.OUT) try: while True: # LED1を点灯、LED2を消灯 GPIO.output(led1_pin, GPIO.HIGH) GPIO.output(led2_pin, GPIO.LOW) print("LED1 ON, LED2 OFF") # 1秒待つ time.sleep(1) # LED1を消灯、LED2を点灯 GPIO.output(led1_pin, GPIO.LOW) GPIO.output(led2_pin, GPIO.HIGH) print("LED1 OFF, LED2 ON") # 1秒待つ time.sleep(1) except KeyboardInterrupt: # プログラムがCtrl+Cで中断された場合、GPIOをクリーンアップ GPIO.cleanup()
3. スクリプトを実行します。ターミナルで以下のコマンドを実行します。
python alternate_leds_RPi.GPIO.py
これにより、LED1とLED2が交互に点滅します。プログラムを停止するには、Ctrl+Cを押します。プログラムが中断されたときにGPIOをクリーンアップするようにしています。
ここまでで、生成AIプログラミングがどんなものなのかお分かりいただけたかと思います。自分がやりたいことをどんどんChatGPTに入力して遊んでみましょう。次回からも作例を中心にご紹介していきます。
(fabcrossより転載)
関連情報
土日で完成! 趣味のラズパイ ラズパイとChatGPTで遊ぶ——その1:Lチカさせてみる(掲載元: fabcross)
ライタープロフィール
岩泉 茂
Raspberry Piと出会ってから7年。最初はArduinoに傾いていたが、Pythonにハマるうちにラズパイ一筋へ。そして小学校の時の電子工作熱が再び燃え上がり、GPIOを使って面白いものを作るのが楽しみとなる。あとこっそりとテツ。乗りテツ4割、模型テツ3割、撮りテツ2割、音テツ1割。今はラズパイで鉄道模型をコントロールすることに夢中。あとゆるいキャンプのアニメに触発されて、こちらもまた高校生以来のキャンプ熱再燃。コロナのおかげで行きづらくなったが、隔月くらいでキャンプしたいと思っている。