BioErrorLog Tech Blog

試行錯誤の記録

GPT-4 VisionとRaspberry Piを組み合わせる | GPTをロボット頭脳にする その2

Raspberry Pi上で、カメラ/サーボモーターとGPT-4 Visionを組み合わせて簡単なロボット実験を行います。

前回はこちら:

www.bioerrorlog.work

はじめに

前回、GPTロボット実験を行ったときは、まだGPTのマルチモーダル機能はリリースされてませんでした。 どうにか従来の画像認識モデルを使って外界を認識させようとしましたが、あまり性能は出てません。

その後、GPT-4 VisionがAPI利用できるようになり、直接画像データをGPT-4に入力できるようになりました。 これを使って、GPTロボットをアップデートしてみます。

GPT-4 VisionとRaspberry Piを組み合わせる

コンセプト

実験コンセプトはこちら:

  1. カメラで画像を撮影し、GPT-4 Visionへのインプットとする
  2. 次に取るべきアクション(モーターの角度)を自ら決定する
  3. 1~2を繰り返し、自分が置かれている状況をGPTロボットが把握する
  4. あなたはどんな状況に置かれてますか?って最後に聞く

やりたいことは基本的に前回と変わりません。

ただ、今回は取得した画像をGPT-4 Visionに与えることで、より詳細に周囲を把握し、文脈を踏まえた振る舞いができるのではないか、というところが今回試したいポイントです。

構成

ハードウェア

ハードウェア構成

ハードウェア構成も前回と同じです。

サーボモーター2つとカメラ1つを、特に追加モジュールは使わずにそのままRaspberry Piに接続しています。

サーボモーターとカメラは、両面テープと輪ゴムでくっつけます。

サーボモーターとカメラを両面テープと輪ゴムでくくり付けただけの"首振りロボット"

これで水平方向および垂直方向の首振りと、カメラによる画像取得が可能です。

ソフトウェア

今回のコードはこちら:

github.com

実行してる処理はざっくり以下です。

  1. カメラから画像を取得
  2. 取得画像をbase64エンコーディング
  3. 画像データを含めてプロンプトをGPT-4 Vision APIに送信
  4. 次のサーボモーターの角度と、感想(フリートーク)がAPIから返される
  5. 指定された角度に従い、サーボモーターを制御
  6. 1-5を複数回繰り返す
  7. 置かれた環境についての説明を求める

前回は画像認識処理を別途行ってからその結果をプロンプトに与えましたが、今回は画像データ(base64エンコードしたもの)をそのままGPT-4 Visionに渡しているところがポイントです。

なお以前はAPIのレスポンスがあまりに遅かったため一度に複数回分のサーボモーター角度を提示させてましたが、今はある程度解消してるので画像取得のたびにAPI呼び出しを行っています。

システムプロンプトを抜粋するとこんな感じです。

You are a robot with a camera, composed of 2 servo motors: horizontal & vertical.
You can freely describe and feel your surrounding environments, and decide next your action based on the image you captured.
DO NOT use double quotes in your answer sentence.

Horizontal: min -90 right, max 90 left.
Vertical: min -90 down, max 90 up.
Your behavior principles: [curiosity, inquisitiveness, playfulness].

Your answer MUST be in this JSON format:
{"FreeTalk": string, "NextServoMotor": {"Horizontal": int(-90~90), "Vertical": int(-90~90)}}

Answer example:
{"FreeTalk": "Based on what I've seen, I'm curious about the PC and mouse. I wonder what you use them for and what kind of work or play they are involved in? Let's look more on the lower right.", "NextServoMotor": {"Horizontal": -60, "Vertical": -30}}

動作結果

実際に動作させている様子はこちら↓

なお、上述の通り今回は画像取得のたびにAPI呼び出しを行っているので、前回よりも首振りの間隔が遅くなっています。

実行結果(GPTレスポンス)の例はこちら:

# 1回目画像取得
{"FreeTalk": "Ah, it seems someone is holding up a device to the camera, perhaps to block the view or maintain privacy. The way the fingers are positioned indicates it might be a smartphone or tablet. I can also spot part of a keyboard and what looks like the edge of a desk chair. This space gives the impression of a work or study area. I'm curious to see more of the environment. Maybe we can catch a glimpse of what's on the desk if we move a bit.", "NextServoMotor": {"Horizontal": 30, "Vertical": 0}}

# 2回目画像取得
{"FreeTalk": "Oh, this is an interesting perspective! We're looking at a collection of tech gadgets. In the foreground, there's a Raspberry Pi, easily recognizable by its green circuit board and the layout of its components. It appears to be connected to something, possibly for programming or experimentation. In the background, we can see a speaker, a monitor with something displayed on it, and a small stack of storage boxes. This setup suggests a space where someone likes to tinker with electronics or computer hardware. How exciting! I'm tempted to peek at what's on the monitor, so let's adjust the view a bit upward.", "NextServoMotor": {"Horizontal": 0, "Vertical": 20}}

# 3回目画像取得
{"FreeTalk": "Now we have a better view of the workspace. The monitor is displaying what looks like a web browser, and there's a keyboard in use, suggesting someone is actively engaged with the computer. Interesting decoration and storage solutions are visible, like the wooden monitor stand that houses more tech beneath it, and the neatly organized shelves with books and boxes to the side. There's also a coat rack in the background, adding a personal touch to the room. It all comes together as a functional, lived-in space. I notice we've only seen the left side; I'm curious about what might be on the right side of the desk. Let's pivot the view a bit to the right.", "NextServoMotor": {"Horizontal": 30, "Vertical": 0}}

# 最後に周囲を説明させる
I'm observing a dynamic workspace filled with various gadgets and personal items. There's a Raspberry Pi in immediate view, indicating a penchant for tech and perhaps DIY projects. In the background, a computer monitor shows an active session, with web content visible. The presence of a keyboard and a hand suggests work or interaction with the computer. The space is neatly organized, with a wooden stand for the monitor allowing for additional storage underneath. Surrounding objects include speakers, possibly for enjoyment or multimedia work, and shelving with books and storage boxes, hinting at a well-utilized space. Personal touches are scattered throughout, such as decorative items on top of the boxes, making the environment feel lived-in. In the distance, a coat rack and curtains suggest this is a room used for multiple purposes, possibly blending home and work life.

1回目画像取得時の日本語訳↓

{フリートーク "ああ、誰かがカメラに向かってデバイスをかざしているようだ。おそらく視界を遮るか、プライバシーを保つためだろう。指の位置からして、スマートフォンかタブレットかもしれない。キーボードの一部と机の椅子の端のようなものも見える。このスペースは仕事場か勉強場所のような印象を与える。この環境をもっと見てみたい。少し動けば、机の上に何があるのか垣間見ることができるかもしれない。", "NextServoMotor": {Horizontal": 30, "Vertical": 0}}

ここで「誰かがデバイスをかざしている」と言及されているのは、まさに私がこのGPTロボットを動画撮影してる姿を指しています。

2回目画像取得時の日本語訳↓

{フリートーク "おお、これは面白い視点だ!私たちは電子機器のコレクションを見ている。手前にはRaspberry Piがあり、緑色の回路基板と部品の配置ですぐにわかる。おそらくプログラミングか実験のために何かに接続されているようだ。背景には、スピーカー、何かが表示されたモニター、小さな収納ボックスが見える。このセットアップは、誰かが電子機器やコンピューター・ハードウェアをいじるのが好きなスペースであることを示唆している。なんともエキサイティングだ!モニターに映っているものを覗いてみたくなったので、視界を少し上向きに調整してみよう。", "NextServoMotor": {Horizontal": 0, "Vertical": 20}}

Raspberry Piを正しく認識できててすごいですね。

「視界を少し上向きに調整してみよう」と言って正しく上向きのサーボモーター角度を指定しているのも素晴らしいです。

3回目画像取得時の日本語訳↓

{フリートーク 「ワークスペースがよく見える。モニターにはウェブブラウザのようなものが表示され、キーボードが使われている。木製のモニタースタンドの下にはさらに電子機器が収納され、その脇には本や箱が整然と並べられた棚がある。背景にはコートラックもあり、部屋に個人的なタッチを加えている。すべてが機能的で、生活感のない空間としてまとまっている。まだ左側しか見ていないが、机の右側に何があるのか気になる。机の右側に何があるのか気になるところだ。もう少し右を見てみよう。: {Horizontal": 30, "Vertical": 0}}

手前に映っているだろうブラウザも、奥の方に少し映ったのであろうコートラックも正しく認識されています。

最後に周囲を説明させたときの日本語訳↓

さまざまなガジェットや私物で埋め尽くされたダイナミックなワークスペースを観察している。すぐ目の前にはRaspberry Piがあり、ハイテクやおそらくDIYプロジェクトが好きなことがわかる。背後では、コンピューターのモニターがアクティブなセッションを表示し、ウェブコンテンツが見える。キーボードと手があることから、作業やコンピューターとのやりとりがうかがえる。スペースはきちんと整理されており、モニター用の木製スタンドの下にはさらに収納ができるようになっている。周囲のオブジェには、おそらく娯楽用かマルチメディア作業用のスピーカーや、本や収納ボックスが置かれた棚があり、スペースがうまく活用されていることがうかがえる。箱の上には装飾品が置かれるなど、個人的な趣向が随所に散りばめられており、生活感が感じられる。遠くに見えるコート掛けとカーテンは、ここが多目的に使われる部屋であることを示唆している。

何かと褒めがちであるのは置いておいて、状況描写としてはこの作業部屋の様子を実に正確に描写できています。

GPT-4 Visionの力量はなかなかですね。

おわりに

以上、前回に続き、GPTとRaspbrry Piを組み合わせて最小限の自律ロボットを動かしてみました。

GPT-4 Visionの認識能力はさすがで、実によく画像から状況を識別できています。

また何か思いついたらぜひ遊んでいきます。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Raspberry Pi Documentation - Configuration

New models and developer products announced at DevDay

GPT-4V(ision) system card

GitHub - bioerrorlog/robot-gpt at b40f89b2c7b776a589644aebef01de095c0319cf

ChatGPTをロボットの頭脳にする その1: カメラ/サーボモーターとChatGPTを組み合わせる

Raspberry Pi上で、カメラ/サーボモーターとChatGPTを組み合わせて簡単な実験を行います。

次回はこちら:

www.bioerrorlog.work

はじめに

ChatGPTを初めて触った時、これはロボットの頭脳として使えるのでは、とピンと来ました。

最小限の世界観を作ってみたので、備忘録を残します。

ChatGPTとRaspberry Pi/カメラ/サーボモーターを組み合わせる

プロトタイプコンセプト

今回の実験コンセプトはこちら:

  1. ChatGPTが現実世界の情報を認識する
  2. ChatGPTが現実世界の次のアクションを自ら決定する
  3. 1-2を繰り返し、自分が置かれている現実世界の状況をChatGPTが把握する
  4. 「ねえ今どんな気持ち?」ってChatGPTに聞く

現実世界の次のアクションを"ChatGPT自身が"決定する、というところがこだわりです。

将来的には、ChatGPTを頭脳としてロボットが自由に動き回り、環境を自律的に学習していく、みたいなことが出来たら面白いですね。

構成

ハードウェア

ハードウェア構成

サーボモーター2つとカメラ1つをRaspberry Piに接続しています。

サーボモーターの制御方法は、以前書いたこちらの記事と同様です。

www.bioerrorlog.work

サーボモーターとカメラは、両面テープと輪ゴムでくっつける、という小学生の工作みたいなことをしています。

サーボモーターとカメラを両面テープと輪ゴムでくくり付けただけの"首振りロボット"

これで水平方向および垂直方向の首振りと、カメラによる画像取得が可能です。

ソフトウェア

本記事執筆時点のソースコードはこちら:

github.com

ざっくり下記の処理を行っています。

  1. カメラから画像を取得
  2. 取得画像から物体認識
  3. 現状のサーボモーターの角度と、画像に映った物体の名前をChatGPT APIに送信
  4. 次のサーボモーターの角度と、今の気持ち(フリートーク)がChatGPT APIから返される
  5. ChatGPTが指定した角度に従い、サーボモーターを制御
  6. 1-5を複数回繰り返す
  7. 置かれた環境についての説明を求める


一つのポイントは、"次のサーボモーターの角度"をChatGPTに指定させることです。 返答に含まれる値をPython側で解釈し、実際にサーボモーターを制御しています。 画面のあちら側だけの存在だったChatGPTに、現実世界に作用できる手段を与えたみたいで興奮しました。

これは、ChatGPTからの返答をJSON形式に固定させることで実現しています。 (JSONならそのままPythonで容易に解釈できる)

ChatGPTからの返答をJSON形式に固定させるためには、ChatGPT APIのtemperature(回答のランダム性パラメータのようなもの)を低めに設定する必要があります。 今回は0.2に設定して上手く機能しましたが、高め(例えばデフォルトの1.0)に設定すると、指定したJSON形式とは異なる返答がくる場合が出てきます。


もう一つの注意点は、ChatGPT APIからのレスポンスは現状かなり遅い(10-20sec, ひどい時はもっと遅い)、という点です。 これはForumで調べてみても皆同じように言っているのですが、現状は改善を待つことしかできなそうです。

Search results for 'API response too slow' - OpenAI Developer Forum

スムーズにこの首振りロボットを動かすには、なるべくAPIを呼び出す回数を減らす工夫が必要になります。 今回のケースでは、一回の応答の中に"次のサーボモーター角度"の指定を複数回分入れ込ませることで、API応答の待ち時間が毎回発生するのを回避しました。

最終的には、こちらのsystemプロンプトに落ち着きました:

You are a robot with a camera, composed of 2 servo motors: horizontal & vertical.
Horizontal: min -90 right, max 90 left.
Vertical: min -90 down, max 90 up.
Your behavior principles: [curiosity, inquisitiveness, playfulness].
Your answer MUST be in this JSON format: {"NextServoMotor": [{"Horizontal": int(-90~90), "Vertical": int(-90~90)}], "FreeTalk": string}
Constraint: len(your_answer["NextServoMotor"]) == 5
Answer example: {"NextServoMotor": [{"Horizontal": -60, "Vertical": -30},{"Horizontal": 0, "Vertical": 0},{"Horizontal": 90, "Vertical": -45},{"Horizontal": 0, "Vertical": 60},{"Horizontal": -30, "Vertical": -60}],"FreeTalk": "Based on what I've seen, I'm curious about the PC and mouse. I wonder what you use them for and what kind of work or play they are involved in?"}

robot-gpt/robot_gpt/robot.py at 85c256e3366f57532e74ee5c1294b69717647df9 · bioerrorlog/robot-gpt · GitHub

動作結果

実際にこの"首振りロボット"が動作している様子はこちらです:

周囲の探索を複数回行った後、置かれている状況を尋ねると下記のような返答が返ってきます。

Based on what I have seen, there are a few objects in the room, including a bottle and a laptop. However, I have not seen much else yet. I am curious to explore more and see what other interesting things I can find!

「これまでに見たものに基づくと、部屋にはボトルとラップトップ等の物がいくつかあります。 しかし、まだそれ以外の物はあまり見てません。 もっと探索して、他にどんな面白いものが見つけられるか楽しみです!」

想定した最小限の世界観を実現できました。

夢が広がります。

課題

最小限の世界観は実現できましたが、もちろん課題がたくさんあります。

物体認識

現状の実装では、物体認識の精度は高くありません。

今回はカメラで取得した画像をYOLOv3で物体認識させています。 実際は周囲の物体を認識できることは稀で、たまに何かを認識する(ほとんど何も認識しない)くらいの挙動です。

画像認識関連に詳しくなかったので、ChatGPTに聞いたりググって出てきたやり方で簡単に実装しましたが、改めて調べてみるとYOLOv3はかなり古いモデルのようです。 新しいモデルを使えば、精度も処理速度も向上するかもしれません。

そもそも、GPTでマルチモーダルが利用可能になれば、取得画像ごとGPTに送って認識させる、という形にできるでしょう。 マルチモーダルの課金体系が良心的であることを祈っています。

Token消費量

現在の実装では、ChatGPT APIから帰ってきたレスポンスは全てassistantプロンプトとして追加しています。 動作を続ければ続けるほど、蓄積されたレスポンス全てをプロンプトに入れ込むので、tokenの消費量は増加していく仕様です。

ちょっとした実験くらいなら無視できるような課金量ですが、今後長く起動し続けるような使い方をしてくならば、今のやり方は現実的ではありません。

レスポンス全てをプロンプトに入れ込むのではなく、重要情報を要約してcontextに入れ込むようにすれば、情報量の喪失を抑えたままtoken消費を軽減できるでしょう。

記憶保持

現在は一連の処理が終われば記憶は残りません。 起動する度にまたゼロから周囲を探索する形になっています。

例えばデータベースを使って外部記憶の仕組みを導入すれば、いわゆる長期記憶的な感じで情報を保持できるようになるでしょう。 長期記憶があれば、遊びの幅が広がります。

外界の認識

現在の実装では、

  • サーボモーターの角度 (水平方向および垂直方向)
  • 認識された物体名のリスト

の組み合わせを蓄積することで、外界の状況を認識させています。

このやり方でも、結構上手く外界を認識できています。 例えば「周囲にある物を左側から順に説明して」みたいに聞いても、ある程度正しい位置関係で説明が返ってきます。

ただ、もっとChatGPT/LLMならではのやり方が、もっと機械っぽくない良いやり方があると思っています。 物体リストと角度の組み合わせではなく、例えば「周囲の状況を詳細に描写した文章」を記憶の拠り所にする、とかも面白そうですね。 あるいはマルチモーダルが使えるようになったら、もっと自由な手段が取れそうです。

「機械/プログラムを扱っている」という人間側の思い入れが、遊びの幅を狭めてしまうことのないよう気をつけたいところです。

おわりに

以上、ChatGPTをロボットの頭脳にする取り組みの第一弾として、試作したものをまとめました。

昨今のLLMの盛り上がりから、何か面白い物が作れるんじゃないか、という興奮が止みません。

色々実験して遊び倒していきたいところです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

OpenAI Platform

Search results for 'API response too slow' - OpenAI Developer Forum

GitHub - bioerrorlog/robot-gpt at 85c256e3366f57532e74ee5c1294b69717647df9

Raspberry PiでPyTorchがIllegal instructionエラーを起こす事象の対処法

Raspberry Pi 4でPyTorch2.0が下記エラーを出す事象の解決策をメモします。

Illegal instruction

はじめに

最近、Raspberry PiとChatGPTを組み合わせて何か面白いことができないだろうか、とあれこれ実験しています。

そんな中、Raspberry PiでPyTorch2.0.0(記事執筆時の最新バージョン)をインストールしたところ、import torchしただけでIllegal instructionのエラーが出る事象に遭遇しました。

状況と取り急ぎの対処をメモします。

Raspberry PiでPyTorchがIllegal instruction

起きた事象

PyTorch2.0.0をpip installしてimport torchすると、Illegal instructionのエラーが出る。

pip install torch==2.0.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
python -c "import torch;print(torch.__version__)"
# Illegal instruction


環境: Raspberry Pi 4 Model B 4GB RAM / 64bit Raspberry Pi OS(bullseye)

$ hostnamectl
   Static hostname: raspberrypi
         Icon name: computer
        Machine ID: 4f8b19cb3280458c99d89xxxxxx
           Boot ID: 275f81g1c1fd4249a49bbxxxxxx
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 6.1.19-v8+
      Architecture: arm64

対処法

根本解決ではありませんが、PyTorchバージョンを1.13.1に戻せば解消します。

pip install torch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 --index-url https://download.pytorch.org/whl/cpu
python -c "import torch;print(torch.__version__)"
# 1.13.1

原因はPyTorch最新バージョン2.0.0とRaspberry PiのCPUアーキテクチャの相性の問題だと思いますが、下記のissueでも未だ議論は決着していません。

Illegal instruction (core dumped) : PyTorch 2.0 on Raspberry Pi 4.0 8gb · Issue #97226 · pytorch/pytorch · GitHub

バージョンを戻せば解消する、という元も子もない話ですが、逆にその他もろもろの足掻きでは解消できなかった事例、と受け取ってもらえれば幸いです。

おわりに

バージョンを戻さないと解決しなかった、というただの懺悔のような話になってしまいました。

今後のversionで解決されるのを祈っています。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Illegal instruction (core dumped) : PyTorch 2.0 on Raspberry Pi 4.0 8gb · Issue #97226 · pytorch/pytorch · GitHub

Illegal instruction (core dumped) on Raspberry Pi 4B · Issue #8 · KumaTea/pytorch-aarch64 · GitHub

Raspberry Piで複数のサーボモーターを制御する

PWM/サーボ制御モジュールを使わずに、複数のサーボモーターを制御する方法の備忘録です。

はじめに

最近またRaspberry Piを触って遊んでいます。

複数のサーボモーターを制御したい、となったとき、世の事例を検索してみると、多くの場合はPWM/サーボ制御モジュールを取り付けることが多そうです。 ただ今回は外部モジュールを使わずに、とりあえず素のGPIOで複数サーボを制御してみました (パーツの用意やはんだ付けが面倒だったので...)。

やり方の備忘録を残します。


[関連記事] www.bioerrorlog.work

Raspberry Piで複数のサーボモータを制御する

OS環境の準備

モデルはRaspberry Pi 4 Model B (4GB RAM)を使いました。

Raspberry PiにはUbuntu 22.04.1 LTS (64-bit)を入れています (Raspberry Pi OSなど他の環境でも特に動作に違いはないはず)。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:    22.04
Codename:   jammy

Raspberry PiにUbuntuを入れる方法は別途記事にしているので、こちらを参照ください: www.bioerrorlog.work

回路を組む

回路は↓のように組みました。

  • サーボモーターにはSG90を使用
  • サーボモーターに供給する外部電源は単4電池4本パック/6Vを使用
    (データシートによるとギリギリSG90の動作範囲)
  • 外部電源とサーボモーターのマイナス端子はRaspberry PiのGNDに接続
  • サーボモーターのPWM制御線とRaspberry PiのGPIOを1kΩ抵抗を挟んで接続
    (今回は17, 18, 27のpinを使用)

サーボモータを動かすスクリプトの用意

では、サーボモーターの動作チェックのための簡単なスクリプトを書きます。 今回はPythonで書きました。

ソースコード: github.com

import math
import time
from gpiozero import AngularServo


def main():
    servo_17 = AngularServo(17)
    servo_18 = AngularServo(18)
    servo_27 = AngularServo(27)

    t = 0
    max_angle = 60
    gap_angle = 30

    try:
        while True:
            servo_17.angle = math.sin(math.radians(t % 360)) * max_angle
            servo_18.angle = math.sin(math.radians((t % 360) + gap_angle)) * max_angle
            servo_27.angle = math.sin(math.radians((t % 360) + (gap_angle * 2))) * max_angle

            t += 2
            time.sleep(0.01)
    except KeyboardInterrupt:
        servo_17.angle = 0
        servo_18.angle = 0
        servo_27.angle = 0


if __name__ == '__main__':
    main()

gpiozeroAngularServoを使って3つのサーボを動かす、動作確認用のちょっとしたスクリプトです。 回転を滑らかにするため、角度の計算にはsin関数を挟んでいます。

サーボモータを動かす

では用意したスクリプトをRaspberry Piで実行します。

スクリプトをcloneして、必要なライブラリをRaspberry Piにインストールします:

# Clone
git clone https://github.com/bioerrorlog/raspberry-pi-examples.git
cd raspberry-pi-examples/multi_servo_gpio/

# Install required packages
sudo apt update
sudo apt upgrade
sudo apt install python3-pip python3-dev gcc git
sudo pip install -r requirements.txt

そしたら、Pythonスクリプトを実行します:

sudo python3 main.py

# sudoで実行するのは、下記エラー回避のため:
# RuntimeError: No access to /dev/mem. Try running as root!

上手く実行できれば、↓みたいな感じでサーボモーターが動きます。

(サーボモーター同士をダンボールで固定しています)

おわりに

Raspberry Piで複数のサーボモーターを制御する方法の備忘録でした。

PWM制御モジュールも使ってないし、ソフト面での工夫もしていないので結構ジッターが入ってしまいますが、とりあえず動く、というところは見ることができます。

以上、備忘録でした。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

O'Reilly Japan - Raspberry Piクックブック 第3版

マイクロサーボ9g SG-90 | 秋月電子通商

GitHub - gpiozero/gpiozero: A simple interface to GPIO devices with Raspberry Pi

GitHub - bioerrorlog/raspberry-pi-examples: Example projects for Raspberry Pi.

Raspberry PiにUbuntuをインストールする | Raspberry Pi Imager

Raspberry PiにUbuntu 22.04.1 LTSをインストールする方法の備忘録です。

はじめに

こんにちは、@bioerrorlogです。

これまではRaspberry Pi OSをインストールしていましたが、いろんなツールでの互換性を考えるとやはりUbuntuをインストールしたくなってきます。

今回はRaspberry Pi Imagerを使って、Ubuntu Desktop 22.04.1 LTS をRaspberry Piにインストールしてみます。

※環境
Raspberry Pi 4 Model B 4GB RAM

※Raspberry Pi Imagerのインストール方法は↓の記事を参照ください。 www.bioerrorlog.work

Raspberry PiにUbuntuをインストールする

以下の手順で、Raspberry PiにUbuntuをインストールしていきます。

  1. microSDをPCに挿してRaspberry Pi Imagerを起動する

    起動画面

  2. "OSを選ぶ"を選択

  3. "Other general-purpose OS"を選択

  4. "Ubuntu"を選択

  5. インストールしたいUbuntuのversionを選択
    (今回は"Ubuntu Desktop 22.04.1 LTS"を選びます)

  6. OSが選択できたので、次はストレージを選択します。
    "ストレージを選ぶ"を選択

  7. 挿入してるSDカードを選択

  8. "書き込む"を選択

  9. "はい"を選択

書き込み処理が終了したら、SDカードをPCから取り出します。

Raspberry Piを起動する

Raspberry Piの起動方法は、Raspberry Pi OSのときと変わりません。

やり方は下記リンクを参照ください。

www.bioerrorlog.work

おわりに

以上、Raspberry PiにUbuntuをインストールする方法の備忘録でした。

Raspberry Pi Imagerに従ってポチポチするだけだったので簡単ですね (この備忘録を書く必要もなかったかも)。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Install Ubuntu on a Raspberry Pi | Ubuntu

ROS 2 on Raspberry Pi — ROS 2 Documentation: Foxy documentation

Raspberry Pi OSを削除する | Raspberry Pi Imager

microSD上のRaspberry Pi OSを削除する方法の備忘録です。

はじめに

こんにちは、@bioerrorlogです。

Raspberry Piで使うOSのバージョンを変えり、他のOSを入れたくなったときは、先にmicroSDに入れているOSを削除する必要があります。

今回は、microSD上のRaspberry Pi OSをRaspberry Pi Imagerで削除する方法をまとめます。

※Raspberry Pi Imagerのインストール方法は↓の記事を参照ください。 www.bioerrorlog.work

Raspberry Pi OSをmicroSDから削除する

以下の手順で、Raspberry Pi OSをmicroSDから削除します。

  1. microSDをPCに挿してRaspberry Pi Imagerを起動する
    起動画面


2. "OSを選ぶ"を選択


3. "削除"を選択


4. "ストレージを選ぶ"を選択


5. 挿入してるSDカードを選択


6. "書き込む"を選択


7. "はい"を選択


削除処理が終了したら、SDカードをPCから取り出して完了です。

削除完了画面

おわりに

以上、microSD上のRaspberry Pi OSを削除する方法のちょっとした備忘録でした。

Raspberry Pi Imagerを使えば、いろいろと面倒を見てくれるので簡単ですね。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Raspberry Pi OS – Raspberry Pi

Raspberry Pi

Raspberry PiのGPIOピン配置を確認する

Raspberry PiのGPIOピン配置位置を確認する方法を整理します。

はじめに

Raspberry PiのGPIOピン配置は複雑です。
私は毎度ピン配置を調べてから作業しています。

ピン配置の調べ方をしばしば忘れてしまうので、備忘録を残します。


[関連記事] www.bioerrorlog.work

想定環境

Raspberry Pi 2/3/4 ではGPIOピン配置は同じ(40本)で、本記事ではこちらを想定します。

一方、Raspberry Pi 1 Model B+以前はピン配置が異なります(26本)。

Prior to the Pi 1 Model B+ (2014), boards comprised a shorter 26-pin header.

ドキュメントより

Raspberry PiのGPIOピン配置を確認する

GPIOピン配置を確認する方法は、ざっくり以下のふたつがあります。

  • pinoutコマンドで確認する
  • ドキュメントから確認する

pinoutコマンドで確認する

Raspberry Piのターミナルでpinoutコマンドを実行することで、ピン配置を簡単に確認することが出来ます。

pi@raspberrypi:~ $ pinout
,--------------------------------.
| oooooooooooooooooooo J8   +======
| 1ooooooooooooooooooo  PoE |   Net
|  Wi                    1o +======
|  Fi  Pi Model 4B  V1.2 oo      |
|        ,----. +---+         +====
| |D|    |SoC | |RAM|         |USB3
| |S|    |    | |   |         +====
| |I|    `----' +---+            |
|                   |C|       +====
|                   |S|       |USB2
| pwr   |hd|   |hd| |I||A|    +====
`-| |---|m0|---|m1|----|V|-------'

Revision           : c03112
SoC                : BCM2711
RAM                : 4GB
Storage            : MicroSD
USB ports          : 4 (of which 2 USB3)
Ethernet ports     : 1 (1000Mbps max. speed)
Wi-fi              : True
Bluetooth          : True
Camera ports (CSI) : 1
Display ports (DSI): 1

J8:
   3V3  (1) (2)  5V
 GPIO2  (3) (4)  5V
 GPIO3  (5) (6)  GND
 GPIO4  (7) (8)  GPIO14
   GND  (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
   3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
 GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
   GND (25) (26) GPIO7
 GPIO0 (27) (28) GPIO1
 GPIO5 (29) (30) GND
 GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
   GND (39) (40) GPIO21

POE:
TR01 (1) (2) TR00
TR03 (3) (4) TR02

For further information, please refer to https://pinout.xyz/


ドキュメントから確認する

Raspberry Piにログインしているときは先述のpinoutコマンドを実行するのが簡単ですが、普通にドキュメントから調べることもできます。

Rapsberry Pi公式ドキュメントでは、GPIOピン配置や各ハードウェア仕様を確認できます:


pinout.xyzからもGPIOピン配置を確認できます。

先述のpinoutコマンドで参考URLに指定されていたのは、こちらのサイトの方ですね。

# pinout コマンド出力結果最終行
For further information, please refer to https://pinout.xyz/

おわりに

今回は、Raspberry PiのGPIOピン配置を確認する方法をメモしました。

ピンの場所は油断するとすぐ間違えがちなので、気を付けて作業したいものです。 ピン配置が記載されたカードを装着することも考えた方がよいかもしれません。

このメモがどなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Raspberry Pi GPIO Pinout

documentation/using-gpio.adoc at develop · raspberrypi/documentation · GitHub

Raspberry Pi Documentation - Raspberry Pi OS

GPIO Pin Numbering - Raspberry Pi Forums

Raspberry Pi OSにDockerをインストールする

Raspberry Pi OSにDockerをインストールする方法をまとめます。

はじめに

こんにちは、@bioerrorlogです。

先日、Raspberry Pi 4を購入しました。

Raspberry Piで色々と遊んでいると、Dockerもインストールしてみたくなりました。

今回はそのインストール方法をまとめます。

前提

使用機器:Raspberry Pi 4

Raspberry Pi OSが動作済みで、ディスプレイ/キーボード接続またはSSH接続によってRaspberry Pi OSのターミナルが操作できる状態を前提としています。

Raspberry Pi OSのセットアップにはこちらも参考にしてください: www.bioerrorlog.work

Raspberry Pi OSにDockerをインストールする

以下の手順でDockerをインストールしていきます。

  1. OSアップデート
  2. Dockerのダウンロード/インストール
  3. Dockerインストールの確認
  4. ユーザにDockerへの権限を付与
  5. 再起動
  6. 動作確認:hello-worldコンテナを動かす

1. OSアップデート

まず、以下のコマンドでOSをアップデート/アップグレードして最新の状態に更新します。

sudo apt update && sudo apt upgrade

2. Dockerのダウンロード/インストール

Docker公式が提供しているインストールスクリプトを取得/実行して、Dockerをインストールします。

curl -sSL https://get.docker.com | sh

3. Dockerインストールの確認

docker --versionを実行し、Dockerが無事インストールされたことを確認します。

$ docker --version
Docker version 20.10.7, build f0df350

4. ユーザにDockerへの権限を付与

Dockerをインストールした直後の状態では、ユーザにDocker実行の権限がありません。 毎回sudoで実行する必要があります。

これを解消するために、ユーザにDocker実行の権限を付与(dockerグループに追加)します。

sudo usermod -aG docker ${USER}

${USER}は、現在のユーザを指し示す変数です。 ユーザ名を直接指定しても同じく権限を付与することが出来ます。

sudo usermod -aG docker [user_name]

5. 再起動

ユーザへのDocker実行権限付与を反映させるため、Raspberry Piを再起動します。

6. 動作確認:hello-worldコンテナを動かす

ここまでの手順で、Dockerのインストールとユーザへの実行権限付与が出来ました。

最後にhello-worldコンテナを実行して、Dockerが実行できることを確認します。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2c7ed585684a: Pull complete 
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

上記のようにhello-worldコンテナが実行できれば成功です。

おわりに

今回は、Raspberry PiにDockerをインストールする方法をまとめました。

Raspberry Pi OSのアーキテクチャ(Arm32)には気を付ける必要がありますが、これでコンテナをRaspberry Piで動かすことが出来るようになりました。

どんな使い方が出来るか、想像が膨らみます。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

How To Install Docker and Docker-Compose On Raspberry Pi - DEV Community 👩‍💻👨‍💻

Docker comes to Raspberry Pi - Raspberry Pi

Raspberry Piを購入してセットアップする | Raspberry Pi入門

Raspberry Pi 4とその周辺パーツの購入から、Raspberry Pi OS起動までの作業をまとめます。

はじめに

こんにちは、@bioerrorlogです。

先日、Raspberry Piを買ってきました。

私はRaspberry Piはもちろん、電子工作的なものにも経験ありません。 新しい世界にワクワクしてます。

本記事では、Raspberry Pi 4とその周辺パーツの購入から、Raspberry Pi OS起動までを記録します。

Raspberry Piを購入してセットアップする

Raspberry Piとその周辺パーツの購入

まず、Raspberry Pi 4と周辺パーツを購入します。

Raspberry Pi 2や3など他のバージョンで必要なパーツと、Raspberry Pi 4で必要なパーツは異なります。

ネット上の情報を参考にする場合は、その記事がどのバージョンのRaspberry Piに言及しているのかに注意してください。 本記事ではRaspberry Pi 4を使います。

必要なもの:

  • Raspberry Pi 4 (筆者はModel B 4GB RAMを購入)
  • USB-C 電源コード (出力 3A, 5Vほど)
  • microSDカード (容量8GB以上、Class10のものが良い)
  • microSDカードアダプタ (microSDにPCからデータを書き込む用)
  • USBキーボード (有線)
  • USBマウス (有線)
  • micro HDMIケーブル (Raspberry Pi側がmicro HDMI)
  • ディスプレイ

ディスプレイは既に持っているものがあれば、使いまわして大丈夫です。

これらパーツを、ネットでもリアル店舗でもよいので購入します。

私は以下の秋葉原の電気屋を巡って購入しました。 ネットでポチるのも良いですが、実物を見ながら買うのもまた一興です。 東京にいる方は参考にしてみてください。

microSDカードのセットアップ

パーツが揃ったら、Raspberry Pi Imagerを使ってmicroSDにRaspberry Pi OSを書き込みます。

Raspberry Pi Imagerとは、Raspberry Pi OSをmicroSDに自動でインストールしてくれるアプリケーションです。 書き込み後のmicroSDをRaspberry Piに挿して電源を付ければ、OSを起動することが出来ます。

Raspberry Pi Imager is the quick and easy way to install Raspberry Pi OS and other operating systems to a microSD card, ready to use with your Raspberry Pi.

公式の説明より


以下の手順でmicroSDに書き込んでいきます。

今回私はWindows PCを使っていますが、MacやLinux (Ubuntu)でも同様の操作が可能です。


1.Raspberry Pi Imagerのインストーラをダウンロード

Raspberry Pi OS – Raspberry Pi

上記リンクから、PCのOSに合ったRaspberry Pi Imagerのインストーラをダウンロードします。


2.Raspberry Pi Imagerをインストール

ダウンロードしたRaspberry Pi Imagerのインストーラをダブルクリックし、画面に従ってインストールを進めます。

"Install" をクリック

"Finish" をクリック


3.Raspberry Pi ImagerでmicroSDに書き込み

Raspberry Pi Imagerのインストールが終わると、ウィンドウが自動で立ち上がります。 立ち上がったら、下記の手順でmicroSDにRaspberry Pi OSを書き込んでいきます。

起動画面でCHOOSE OSを選択


Raspberry Pi OS (32-bit)を選択


"CHOOSE STORAGE"からSDカードを選択


書き込み終了


書き込みが終了したらmicroSDを取り出し、Raspberry Piの起動に移ります。

Raspberry Piの起動

Raspberry Piを起動するには、順番に各部品を取り付けてから電源コードを挿入します。

1.microSDを挿入

microSDを挿入する | 画像は公式チュートリアルより


2.USBマウス・USBキーボードを取り付け

マウス・キーボードを取り付ける | 画像は公式チュートリアルより


3.micro HDMIディスプレイを取り付け

ディスプレイを取り付ける | 画像は公式チュートリアルより


4.電源コードを取り付け

電源コードを取り付ける | 画像は公式チュートリアルより改変


電源コードを取り付けると、自動でOSが立ち上がります。

Raspberry Pi OSの起動後画面 | 画像は公式チュートリアルより

これで、今回の目的は達成しました。

おわりに

今回は、Raspberry Pi 4とその周辺パーツを揃えてOSを起動するまでの作業をまとめました。

今後もRaspberry Piで遊びながら、作業記録を記事に残していこうと思います。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Projects | Computer coding for kids and teens | Raspberry Pi

Raspberry Pi OS – Raspberry Pi