2024年1月27日土曜日

実例で学ぶRaspberry Pi電子工作 補足情報トップ

はじめに

本ページは、金丸隆志著「実例で学ぶRaspberry Pi電子工作」(講談社ブルーバックス)の補足情報をまとめるためのページです。本書の内容が最新のRaspbianで動作するようメンテナンスを続けています。

補足情報

Raspberry PiのOSの更新に伴う内容の変更などを以下のページに記します。このページを書籍と合わせてごらんください。

追加コンテンツ

本書の演習をさらに膨らませる追加コンテンツを以下に記します。音声合成、音声認識、エアコン操作など、より実用的な内容を含んでいます。本書の演習とともに是非チャレンジしてみてください。

前著の記事へのリンク

入門編である「Raspberry Piで学ぶ電子工作」のサポートページ中で、本書の読者の方にも役立ちそうな記事へのリンクを貼ります。

感想など




本書の内容を Pi Zero ~ Pi 5 で実行する方法

サンプルプログラムとカラー版回路配線図について

Pi 5 対応のサンプルプログラムおよび回路配線図、応用PDFは、以下のリンクからダウンロードしてください。サンプルプログラムを圧縮したファイル「 raspi2-sample-pi5.zip 」の「-pi5」の部分が「Pi 5 対応」を意味しています。 なお、サンプルファイルである「raspi2-sample-pi5.zip」をWindowsでダウンロードすると、Windows Defender によりウィルスと誤検出されることが多いようです(2024.3月現在)。
検出されるファイルに問題がないことは確認済みです。そのため、Windows ではなくRaspberry Piで直接ダウンロードすることを推奨します。

これらの PDF は Raspberry Pi 上のブラウザでも見られますが、ブラウザ上の「↓」(ダウンロード)ボタンでダウンロードし、ファイルマネージャーで PDF ファイルを右クリックし「アプリケーションで開く」→「アクセサリ」→「ドキュメントビューア」などで開いてもよいでしょう。
「選択したアプリケーションをこのファイルタイプのデフォルトのアクションとする」にチェックを入れればそのアプリケーションで開くのがデフォルト動作となります。

はじめに

本ページでは、金丸隆志著「実例で学ぶRaspberry Pi電子工作」(講談社ブルーバックス)の内容を Raspberry Pi Zero ~ Raspberry Pi 5 で動作させるための補足情報を本ページに記します。

2023年9月に海外で発表された Raspberry Pi 5 (以下 Pi 5) では、GPIO を用いる仕組みがそれまでのバージョンの Raspberry Pi とは大きく異なります。
その影響で、本書で解説したサンプルプログラムは Raspberry Pi 5 では動作しなくなってしまいました。

Raspberry Pi 5 で本書の演習を実行するためには、本書のプログラムをほぼ全て書き換えねばなりません。
しかし書き換えを実行すると、そのプログラムは Raspberry Pi 5 だけではなく、ほぼ全ての Raspberry Pi のバージョンで動作するというメリットがあります。

本書は2015年の発売から9年がたち、書籍のままでは動かない内容も増えてきました。書籍としてはややくたびれた状態と言えるかもしれません。
そこで、この機会にすべてのプログラムを一新し、このページでその動作方法を解説することにしました。
書籍とこのページだけを見れば、全ての演習を Pi Zero ~ Pi 5 で実行できるようになります。

対象とする OS は、以下のように 2023年5月にリリースされた Rsapberry Pi OS (Bullseye) の最終版と、2023年10月にリリースされた Bookworm 以降の OS です。

日付バージョンカーネルバージョンOSバージョン
2023/5/3Raspberry Pi OS 2023-05-036.1.21+ / 6.1.21-v7+ / 6.1.21-v7l+ / 6.1.21-v8+Bullseye (最終版)
2023/10/10Raspberry Pi OS 2023-10-106.1.0-rpi4-rpi-{v6,v7,v7l,v8,2712}Bookworm
2023/12/5Raspberry Pi OS 2023-10-106.1.0-rpi7-rpi-{v6,v7,v7l,v8,2712}

なお、それ以前の古いOSに対する情報(Pi Zero~Pi 4までのみ対応)は、下記のページに残してありますが、恐らく今後需要は減っていくでしょう。

第1章

p.12: OSインストール法の最新版について

最新の Raspberry Pi OS のインストールおよび設定方法は、 「Raspberry Piではじめる機械学習 補足情報」内にあるRaspberry PiへのOSのインストール方法をご覧ください。本書1章と同等の内容をアップデートされた状態で見ることができます。

p.30, コマンドプロンプトの表記

p.30ではコマンドプロンプトの表記として以下を紹介しました。
pi@raspbberrypi:~ $
ここに見える「pi」はユーザー名を表しており、ユーザー名「pi」は2022年4月以前の古いOSで用いられていたデフォルトのユーザー名です。最新のOSを用いている方ならば、「pi」の部分に自分で決めたユーザー名が表示されているでしょう。私の場合、ユーザー名はいつも「kanamaru」としています。

第2章

p.52:開発環境の代替

開発環境は、デフォルトでインストール済のインストール済の「Thonny Python IDE」を用いてください。


次図のように、「LOAD」がファイルの読み込み、「RUN」がプログラム実行、「STOP」がプログラム停止であることを理解すれば問題なく利用できるでしょう。

ただし、「STOP」ボタンでプログラムを停止すると、サンプルプログラムの「except KeybordInterrupt」部が実行されません。「Shell」と書かれた領域の上でキーボードの「Ctrl-C」によりプログラムを終了するのが良いでしょう。なお、Thonnyには「時々Ctrl-cが効かなくなる」という不具合があるようなので、そういうときのみ「STOP」ボタンでプログラムを停止すると良いでしょう。


Thonny Python IDEを用いると、7章で取り扱うOpenCVを用いたプログラムもIDEから実行できるというメリットがあります(IDLEでは画像処理プログラムのみコンソールから起動させたのでした)。

p.54:サンプルプログラム

2章のプログラムのファイル名は本書のものと変わらず「bb2-02-01-led.py」です。
ただし、GPIO を取り扱うライブラリは、本書で用いた RPi.GPIO から gpiozero に変更されています。 ターミナルで実行する場合は下記のコマンドを用いてください。
python3 bb2-02-01-led.py


第3章

3章のプログラムも、使用ライブラリを RPi.GPIO から gpiozero に変更しています。
プログラムのファイル名は本書のものと変わりません。ターミナルで実行する場合は下記のコマンドを用いてください。
python3 bb2-03-01-3led.py

python3 bb2-03-02-dice.py

python3 bb2-03-03-dice-switch.py

python3 bb2-03-04-dice-switch-delay.py


第4章

4章全般:お天気Webサービスについて

第4章で紹介しているお天気Webサービスですが、2020年7月でサービスを終了したようです。本ページでダウンロードしたサンプルプログラムでは、 その代替として OpenWeather というサービスを利用しました。OpenWeather の利用には準備が必要ですのでそれも合わせ、以下で解説していきます。

p.94:I2C の準備

まず、本書 p.94 で解説した I2C の準備を行いましょう。まず、p.95 で解説されているように、設定アプリケーションにより I2C を有効にしておく必要があります。 具体的には、下記の手順に従います。
  1. デスクトップ左上のメニューから、「設定」→「Raspberry Piの設定」を起動
  2. 「インターフェイス」タブをクリック
  3. 「I2C」のスイッチをONにして有効化する
本書のそれ以降の作業、すなわち、「/etc/modulesへのi2c-devの追記(p.96)」、「必要なパッケージのインストール (p.97)」は実行不要です。

Pi 5をお使いの場合、上記の設定に加えて次の設定を行ってください。 まず、ターミナルを起動し、次のコマンドを実行することで、設定ファイル/boot/firmware/config.txtを管理者権限のテキストエディタで開きましょう。
sudo mousepad /boot/firmware/config.txt
ファイルが開いたら、ファイルの末尾までスクロールし、末尾に次の1行を追記しましょう。
dtparam=i2c_baudrate=50000
ファイルを保存したら、テキストエディタを閉じ、Raspberry Piを再起動してください。
この設定は、I2Cの動作速度をデフォルトの100kHzから50kHzに落とす働きがあります。そうしないと、kernel 6.6.20 以降の Pi 5ではLCDが動作しないことがあったため、この設定を行います。Pi 4 Bまでの機種ではこの設定は必要ありません。
将来はこの設定は不要になるかもしれませんが、2024年3月後半時点では、解決されていません。

p. 97:事前準備

p.97~p.100 で解説されている、お天気Webサービスのサイトの確認は不要です。
p.101 で解説されている、pip と requests のインストールも不要です(デフォルトでインストール済のため)。

その代わり、ここでは OpenWeather のアカウント作成を行いましょう。

OpenWeather のアカウント作成

OpenWeather の利用には、「サイトにアカウントを作成し、APIキーを取得する」というひと手間が必要です。まずその実行から始めましょう。

OpenWeather の料金体系には様々なものがありますが、 本ページでは、無料 (Free) の One Call API を利用します。一日1,000 呼び出し、一か月30,000呼び出しが可能であることが記されています。

以下の手順に従い OpenWeather のアカウントを作成しましょう。
  1. OpenWeatherのアカウント作成ページで必要事項を記入ます。
    • Username: 英語サイトなので、アルファベットからなるユーザー名を入力するのが良いでしょう。アカウント作成後に変更できます。
    • email: アカウント作成時に確認メールが届きますので、正確に入力してください。
    • Password / Repeat Password: パスワードを二回入力します。
    • I am 16 years old and over (16歳以上) の条件を満たしていればチェック
    • I agree with Privacy Policy ... 使用条件などをを理解したらチェック
    • System news, Product news, Corperate news はサイトからのメールを受け取りたければチェック
    • 「私はロボットではありません」にチェック
    • 以上を確認したら「Create Account」ボタンをクリック
  2. 遷移先のページで、Company と Purposeを入力します。
    • Company は、個人ならば記入しなくて構いません
    • Purpose (使用目的) は、私の場合「Education/Science (教育と科学)」を選択しました
    • 「Save」ボタンをクリック
  3. 以上が終わると、登録したメールにOpenWeather からメールが届きます。メールの中の「Verify your email」ボタンをクリックすると、登録完了です。

OpenWeather の API キー取得

さて、以上が終わったあと、OpenWeather において、下図のように「ユーザー名」→「My API keys」と辿ると、API key を取得できます。 このAPI keyをコピーしてメモ帳などで保存しておきましょう。
なお、この API key は Raspberry Pi 上で用いるので、Raspberry Pi 上のブラウザでコピーし、Raspberry Pi 上のテキストエディタ Mousepad で保存するのが良いかもしれません。
また、この API key は登録したメールアドレスにも届きますので、そちらからコピーしても良いでしょう。その中に「Within the next couple of hours, it will be activated and ready to use」とあるので、利用可能になるまで数時間かかることがあるのかもしれません。 私の場合、すぐに使えたように思うのですが、ちょっと自信がありません。

OpenWeather の API キーをプログラムに反映

さて、以上の準備のもとで、本ページでダウンロードしたファイルの利用方法を解説します。
  • bb2-04-00-checkcity.py
  • bb2-04-01-weather.py
  • bb2-04-02-forcast.py
  • bb2-04-04-lcd-4modes.py
  • bb2-04-05-lcd-3modes.py
最初の「bb2-04-00-checkcity.py」は、本書のサンプルプログラムには存在しなかったファイルです。 bb2-04-01~bb2-04-05 のファイルは本書のサンプルプログラムに同じ番号のものがありますが、その OpenWeathter 版です。

これらのファイルを用いるには、上記5つのファイルに冒頭で入手した API key を記入して上書き保存しなければなりません。まずその解説を行います。

これらの5つのファイルを mousepad のようなテキストエディタや、Thonny のような開発環境で開くと、どのファイルにも下記の行が見つかります(冒頭にスペースが入っている場合もあります)。
key = 'API_KEY'
具体的には、5つのファイルの下記の行番号の位置に上の行があります。
  • bb2-04-00-checkcity.py: 5行目
  • bb2-04-01-weather.py: 7行目
  • bb2-04-02-forcast.py: 7行目
  • bb2-04-04-lcd-4modes.py: 100行目
  • bb2-04-05-lcd-3modes.py: 100行目
この行の「API_KEY」の部分を、上でコピーして保存した皆さんの API key で書き換えます。 本当の API key を書くわけにはいかないので、イメージを記すと下記のようになります。
key = '................................'
書き換えたら、ファイルを上書き保存してください。この作業を、5つのファイル全てで行います。 以上でプログラム実行前の準備は完了です。

次に、OpenWeatherの天気予報データを利用するプログラムの実行方法を解説します。

本書に存在しないファイルである「bb2-04-00-checkcity.py」の利用法の解説のみ後まわしとし、残りの4ファイル の解説を順に行います。

なお、デフォルトでは4ファイルは東京の天気を表示します。

p.101:bb2-04-01-weather.py の利用

bb2-04-01-weather.py を Thonny で開いて実行するか、下記のコマンドで実行してください。
python3 bb2-04-01-weather.py
本書の図4-7のように、入手した天気予報データを全て表示するコマンドです。表示された中身を理解する必要はなく、 「天気予報データを入手できた」ということを確認できればそれで十分です。
(省略)
      "weather": [
        {
          "id": 800,
          "main": "Clear",
          "description": "晴天",
          "icon": "01d"
        }
      ],
      "clouds": 2,
      "pop": 0,
      "uvi": 3
    }
  ]
}
なお、取得されるデータは本書の図4-7の形式とは全く異なります。予報のデータは上の「"main": "Clear",」の部分を使っており、「"description": "晴天",」の部分は使っていません。 最終的に LCD に表示するうえで、"description" の部分はバリエーションが多すぎると思えたためです。

p.105, bb2-04-02-forcast.py の利用

bb2-04-02-forcast.py を Thonny で開いて実行するか、下記のコマンドで実行してください。
python3 bb2-04-02-forcast.py
本書の図4-8のように、3日間の予報のみをデータを整理して表示します。
今日, 雨, 9/17
明日, 雨, 12/18
明後日, 雨, 9/13
なお、「お天気Webサービス」と異なり、「時々」や「のち」を含む結果は現れません。 「Clear(晴れ)」、「Clouds(曇り)」、「Rain(雨)」、「Snow(雪)」、「Thunderstorm(雷)」、「Drizzle(霧)」 の6種類の天気しか表示されません。その点はこのサイトの特性としてご了承ください。

p.108:bb2-04-04-lcd-4modes.py および bb2-04-05-lcd-3modes.py の利用

bb2-04-04-lcd-4modes.py および bb2-04-05-lcd-3modes.py を実行する際は、あらかじめ I2C を有効にしておき、さらに p.108 のように回路も作成しておかねばなりません。
また、タクトスイッチの利用にはこれまでの章と同様、RPi.GPIO ではなく gpiozero を用いています。

これらのファイルを Thonny で開いて実行するか、下記のようにターミナルでコマンドを実行します。
python3 bb2-04-04-lcd-4modes.py

python3 bb2-04-05-lcd-3modes.py
実行結果は本書のプログラムと同じです。

p.108:I2Cデバイスの認識について

ここで用いる温度センサとLCDの組み合わせは「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」でも用いていますが、LCD を自作した場合、プログラムの動作に失敗するという方が多いようです。LCDを用いたプログラムを実行するためには、Raspberry PiからLCDが認識されていることが必要です。LCDが認識されているかどうかのチェック方法は、書籍に記さなかったのですが、ここで紹介します。なお、現在は LCD の完成版が販売されており、失敗のリスクは減っています(完成版では ~RESET ピンは省略されています)。

温度センサとLCDを接続した回路(p.108の図4-9)を作成した状態で下記のコマンドを実行しましょう。
i2cdetect -y 1
このコマンドは、Raspberry Piに接続されたI2Cデバイスのアドレスを出力するものです。
正常な出力結果は下図のようになります。48が温度センサのアドレス0x48を表し、3eがLCDのアドレス0x3eを表します。48が表示されなければ温度センサを用いるプログラムは正常動作しませんし、3eが表示されなければLCDを用いるプログラムは動作しませんので、まずは下図の出力が得られることを目指しましょう。


bb2-04-00-checkcity.py の利用

さて、上で説明したプログラムは、全て東京での天気予報を表示するものでした。これを別の都市の天気予報に変更したいときに用いるプログラムが bb2-04-00-checkcity.py です。 その使い方を解説します。

ここまでのプログラムで天気予報の対象位置を指定するためには、実は緯度と経度を用いなければなりませんでした。5つのプログラム全てで、API key を指定した行の近くに下記の2行が存在します。
lat = '35.6895'
lon = '139.6917'
これは緯度35.6895、経度139.6917を表しており、実はこれが東京を意味していた、というわけです。「東京」という地名で位置を指定したいところですが、それは無料枠の One Call API ではできない、ということです。

ですから、天気予報の対象地を変えたいときは、下記の流れで行う必要があります。
  1. 対象地を決める
  2. 対象地の緯度と経度を調べる
  3. 調べた緯度と経度を5つのプログラムに書き込み、上書き保存する
このとき、「対象地の緯度と経度を調べる」ときに用いるのが bb2-04-00-checkcity.py であるというわけです。早速試してみましょう。

まず、こちらのサイトから対象地を決め、そのスペルを確認しておきましょう。マウスドラッグで位置変更ができ、マウスホイールで拡大率の変更ができます。
例えば、「Sapporo」を選ぶことにします。

次に、bb2-04-00-checkcity.py を Thonny や mousepad で開き、下記の行を見つけます。
city = 'Tokyo'
この行のTokyoの部分をSapporoに変更し、上書き保存します。
city = 'Sapporo'
そして、bb2-04-00-checkcity.py を Thonny または下記のコマンドで実行してください。
python3 bb2-04-00-checkcity.py
すると、下記のように Sapporo の緯度と経度が得られます。
Sapporo
lat = '43.0642'
lon = '141.3469'
このうち、下記の2行で bb2-04-01~bb2-04-05 のファイルの該当行を置き換えて保存すれば、それらのファイルは Sapporo の天気予報を出力するようになります。
lat = '43.0642'
lon = '141.3469'

第5章

p.141:LIRCの利用

リモコンの信号を学習し、利用するには LIRC というソフトウェアを用います。 Raspberry Pi の OS と LIRC のバージョンが更新されるに伴い、LIRC の利用法は大きく変化してきました。 本書の LIRC の利用方法の解説(本書 p.141~p.163 まで)は、以下の補足ページとともにご覧ください。 ここから先は、p.163 までが実現した状況、すなわち irsend コマンドでテレビを操作できるようになった状況を前提として解説を続けます。

p.163:bb2-05-01-TV.py の利用

タクトスイッチでテレビを操作するプログラム bb2-05-01-TV.py の利用方法はこれまでと同じです。すなわち、Thonny で実行するか、ターミナルで下記のコマンドを実行します。
python3 bb2-05-01-TV.py 
これまで同様、タクトスイッチの利用に RPi.GPIO ではなく gpiozero を用いています。

p.168:ブラウザでのテレビの操作

ブラウザでのテレビの操作には、本書では WebIOPi というライブラリを用いました。WebIOPi は、Webサーバーとなる機能と GPIO を操作する機能を組み合わせたライブラリなのでした。
WebIOPi は Raspberry Pi 5 では動作しませんので、本ページではその代替として FastAPI というライブラリを用います。FastAPI は python3 で簡易的な Webサーバーを作成できるライブラリです。GPIO を操作する機能はありませんので、gpiozero などと組み合わせて用います。

以上の理由から、WebIOPi についての解説がほとんどである本書 p.168~p.176 の解説は現時点ではあまり参考になりません。本ページの解説をご覧ください。

まず、下記コマンドで FastAPI をインストールします。
sudo apt update
sudo apt install python3-fastapi
p.160 の図5-12 の回路が準備できている状態で、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-05-02-TV」に移動します。
cd bb2-05-02-TV
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
cd bluebacks/bb2-05-02-TV
移動したら、下記のコマンドで Web サーバーを実行します。
python3 app.py
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
http://(Raspberry PiのIPアドレス):8000/5-2
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/5-2 」を記入して Enter キーを押す、ということです。 Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。

現れるページの見た目と機能は p.172 の図 5-16 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。

なお、ここで実行したプログラムで重要なファイルは下記のものです。必要に応じて参照してください。
app.py : Pythonプログラム。Webサーバーの構築と、GPIO の利用など(ここではGPIOは用いていない)

static/javascript.js:JavaScript プログラム。ブラウザからの指令などを app.py に送る

templates/index.html:HTML ファイル。ページの見た目を決めている

p.176:本章を終えた後の後始末

以上で第5章の解説は終わりですが、Raspberry Pi をこのままの状態で使い続けると、以下の問題が起こります。
  • GPIO 25 と 24 を、LIRC で用いるように設定されているので(/boot/config.txt)、別の Python プログラムでこれらのピンを使おうとするとエラーがでる
  • lirc のプログラムが動作しっぱなしになる(特に害があるわけではありませんが)
これらの問題の解消方法を以下に記します。

まず、 GPIO 25 と 24 の利用設定の解除です。まず、下記コマンドで /boot/config.txt を管理者権限の mousepad で開きます。
sudo mousepad /boot/config.txt
なお、将来は /boot/config.txt は /boot/firmware/config.txt に変更されるようです。その場合コマンドは以下のようになるでしょう。
sudo mousepad /boot/firmware/config.txt
そして、末尾に追加されている設定を、下記のように先頭に「#」をつけることでコメントアウトし無効化します。
#dtoverlay=gpio-ir,gpio_pin=24
#dtoverlay=gpio-ir-tx,gpio_pin=25
上書き保存して mousepad を終了し、Raspberrry Pi を再起動すれば GPIO 25 と 24 の利用設定は解除されています。

また、lirc の無効化は、以下のコマンドで lirc 自体を削除してしまうのが確実です。
sudo apt remove lirc liblirc0 liblirc-client0


第6章

カメラ台を作成する第6章ですが、本書と本ページとでは下記の違いがあります。
  • GPIOの利用:RPi.GPIO から gpiozero への変更。さらに、ADコンバータのために SPI を有効にする必要がある。
  • ハードウェアPWMの利用:WiringPi-Python から独自プログラムへの変更。/boot/config.txt へ設定を追加する必要がある。
  • ブラウザの利用:WebIOPi から FastAPI への変更。
  • カメラの利用:libcamera 対応とし、カメラのライブラリを PiCamera から PiCamera2 へ変更。
本書のページの順番に従って解説していきます。

p.184:カメラモジュールについて

Raspberry Pi 用のカメラモジュールは、現在では下図のように バージョン 1 から バージョン 3 までの 3 バージョンがあります。
左から、バージョン1(基板が四角)、バージョン2(基板の角が丸く、レンズ周辺が黒)、バージョン3(基板の角が丸く、レンズ周辺が銀)です。基板上にもバージョンの記載がありますね。どのバージョンでも動作させることができます。

Raspberry Pi 1 から Pi 4 でしたら、カメラモジュールの Raspberry Pi 本体への取り付けは、本書記載の通り「(ケーブルの)端子面がRaspberry PiのmicroSDカードの方を向くように」取り付けます。

一方、Raspberry Pi Zero および Pi 5 の場合、カメラモジュールの取り付けにはいくつかの注意があります。

まず、カメラモジュールに取り付けられているケーブルを、Pi Zero および Pi 5 に対応したものに交換する必要があります。例えば下記のものは Pi Zero でも Pi 5 でも利用可能です。 Pi Zero 用ケーブルでRaspberry Pi Zero WH にカメラモジュールを取りつけた様子が下図です。Raspberry Pi 本体に向かってケーブルが細くなっているのがわかるでしょうか。


専用ケーブルをカメラに取り付ける際、金属が露出した端子面を緑色の基板の方を向くようにします。基板上のカバーを引き出し、ケーブルを差し込んだ後でカバーを押し込むことでケーブルが固定されます。
専用ケーブルを Raspberry Pi 本体に取り付ける際、Pi Zero の場合はやはり金属が露出した端子面を緑色の基板の方を向くようにします。
Pi 5 の場合は、下図のように「金属が露出した端子面が USB 端子側を向くように」取り付けます。これは Pi 1~Pi 5とは逆向きですので注意してください。
また、Pi 5 にはカメラを取り付けられる場所が 2 箇所ありますが、「CAM/DISP 0」と書かれた方に接続しましょう。

なお、どの Raspberry Pi を用いるにせよ、カメラのコネクタは壊れやすいので、両手で慎重に開け閉めしましょう。私は片手で雑に扱っていて壊したことがあります。


p.192:ハードウェアPWMを用いるための準備

本書p.192では、ハードウェアPWMを用いるために WiringPi2-Python のインストールを行っていますが、この作業は不要です。 WiringPi2-Python は Pi 5 で動作しないためです。 その代替として、以下のように /boot/config.txt に一行追加する設定を行ってください。

まず、管理者権限の mousepad で /boot/config.txt を編集用に開きましょう。下記のコマンドで行うのでした。
sudo mousepad /boot/config.txt
なお、将来は /boot/config.txt は /boot/firmware/config.txt に変更されるようです。その場合コマンドは以下のようになるでしょう。
sudo mousepad /boot/firmware/config.txt
そして、そのファイルの末尾に下記の一行を追加し、上書き保存してから mousepad を閉じてください。
dtoverlay=pwm-2chan
その後、Raspberry Pi を再起動することで、GPIO 18 と 19 をハードウェアPWMを出力するために利用できるようになります。

なお、Pi 5 をお使いで、アップデートした OS や 2024年3月リリースの OS で kernel 6.6.20 をお使いの方は、ハードウェアPWMを使うプログラムが動作しなくなっています。この問題は kernel 6.6.21 以降で修正される予定ですが、
それまでは、サーボモーターを用いた演習を後回しにするか、2023年12月にリリースされたOSをアップデートせずに用いるのが良いでしょう。

p.195:サーボモーターを 0 度の位置に動かすためのプログラム

サーボモーターを 0 度の位置に動かすためのプログラムのファイル名は、本書と同じく bb2-06-01-zero.py です。 Thonny で読み込んで実行するか、ターミナルで下記のコマンドで実行してください。管理者権限は不要です。
python3 bb2-06-01-zero.py

p.199~201:タミヤの工作キットで作ったカメラ台のカラー画像

タミヤの工作キットで作るカメラ台の作成方法を示す図ですが、書籍では画像がやや小さく見にくいかもしれません。下記に、カラーで解像度の高い画像を貼り付けますので、ご活用ください。

画像をクリックすると画像が大きくなります。必要に応じて、大きくした画像上で右クリックして「名前を付けて保存」を選択して保存すると良いでしょう。

図6-7

図6-8

図6-9

p.205:カメラマウントA838を用いた場合のカメラ台のカラー画像

同様に、図6-12、図6-13のカラー画像も載せます。

図6-12

図6-13




p.206:カメラモジュールの有効化は不要

本書では、カメラモジュールの有効化の方法が解説されていますが、現在はこの作業は不要です。

p.207:AD変換器の利用のためのSPIの有効化

p.207 よりAD変換器の利用方法が解説されています。現在では、ここで「SPIの有効化」の作業が必要です。以下の手順で実行してください。
  1. デスクトップ左上のメニューから、「設定」→「Raspberry Piの設定」を起動
  2. 「インターフェイス」タブをクリック
  3. 「SPI」のスイッチをONにして有効化する

p.210:bb2-06-02-pantilt.py の実行

サーボモーター2つを半固定抵抗で制御するプログラムのファイル名は、本書と同じく bb2-06-02-pantilt.py です。 Thonny で読み込んで実行するか、ターミナルで下記のコマンドで実行してください。管理者権限は不要です。
python3 bb2-06-02-pantilt.py
サーボの回転の向きを変えたい場合、プログラム中の下記の部分の2行目先頭の「#」を削除するか、
    # 一般的なサーボモーターはこちらを有効に
    #duty = (servo_max-servo_min)*(val-val_min)/(val_max-val_min) + servo_min
あるいは下図のように半固定抵抗の3.3VとGNDへの接続を入れ替えるかのどちらかの方法をとってください。



p.211:カメラモジュールのテスト用コマンド

211ページのカメラモジュールのテスト用コマンドは、現在では下記に変更してください。
libcamera-hello -t 0
libcamera-hello が存在しないと言われた場合、下記のコマンドでインストールできます。
sudo apt update
sudo apt install libcamera-apps
なお、libcamera-hello ではなく、第7章で使用する bb2-07-01-preview.py を実行しても良いです(ただし、OpenCVをインストールする必要があります)。

p.222:mjpg-streamerのインストール用のコマンド

p.222からp.223で紹介したmjpg-streamerのインストール手順は、以下に変更してください。
(1) sudo apt update
(2) sudo apt install libjpeg-dev cmake libcamera-dev
(3) git clone https://github.com/neuralpi/mjpg-streamer.git
(4) cd mjpg-streamer/mjpg-streamer-experimental
(5) make
(6) cd
(7) sudo mv mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer
なお、OS として Bullseye やリリース直後の Bookworm をお使いの方は、上記の (5) で LibCamera.cpp のビルド中にエラーが起こると思います。その場合、エラーが出た状態から以下の 8 コマンドを一つずつ順に実行してください。この 8 コマンドが上記 (5)~(7) の代替、というイメージです。
rm -rf _build
mkdir _build
cd _build
cmake -DLIBCAMERA_USES_TRANSFORM=ON ..
cd ..
make
cd
sudo mv mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer


p.224:mjpg-streamerの実行用コマンド

mjpg-streamerの実行用ファイルは、書籍から変わっており bb2-06-03-stream.py です。以前まではこのファイルは拡張子が sh のシェルスクリプトでしたが、Python によるスクリプトに変更しました。
理由は、libcamera 対応の mjpg-streamer が時折異常終了するため(典型的には 30 分おきくらい)、2秒おきに実行状況をチェックして必要に応じて mjpg-streamer を再起動させるためです。
お手元のファイルが Python ファイル (拡張子 py) ではなくシェルスクリプトのまま(拡張子 sh)の場合は、raspi2-sample-pi5.zip をダウンロードしなおしてください(2024.2.28更新)。

このファイルを実行する前に、使用しているカメラモジュールの設定が必要な場合があります。 まず、mousepad で bb2-06-03-stream.py を開いてみましょう。7行目に下記の内容が見えるはずです。
opt_in = 'input_libcamera.so -camver 1 -fps 15 -r 640x480 -s 640x480'
このうち
-camver 1
の部分が、カメラモジュールのバージョンの数字を指定している部分です。お使いのカメラモジュールがバージョン 2 か 3 なら、この数字を 2 または 3 に変更し、それからファイルを上書き保存してください。

その後、下記コマンドで mjpg-streamer を実行できます。
python3 bb2-06-03-stream.py &
ブラウザでの動作確認は、本書 p.224 と同じです。

p.225:ブラウザでのカメラ台の制御

p.225 から始まるブラウザでのカメラ台の制御は、本書では WebIOPi を用いていました。本ページではそれを FastAPI で行うよう変更します。これは、第5章 p.168 と同じです。 そのため、図6-18の回路図のみは共通ですが、それ以外の p.225~p.235 の WebIOPi の解説はあまり参考にならないと思ってください。以下で FastAPI を用いたプログラムの実行方法を解説します。

まず、まだ FastAPI をインストールしていない場合は下記コマンドでインストールします。
sudo apt update
sudo apt install python3-fastapi
それ以外には、ハードウェアPWMを利用するために本ページの「p.192:ハードウェアPWMを用いるための準備」に基づき、 /boot/config.txt (将来は /boot/firmware/config.txt)の末尾に「dtoverlay=pwm-2chan」を追記する必要があります。

そして、p.226 の図6-18 の回路が準備できている状態で、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-06-05-pantilt」に移動します。
cd bb2-06-05-pantilt
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
cd bluebacks/bb2-06-05-pantilt
移動したら、下記のコマンドで Web サーバーを実行します。
python3 app.py
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
http://(Raspberry PiのIPアドレス):8000/6-5
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/6-5 」を記入して Enter キーを押す、ということです。 Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。

現れるページの見た目と機能は p.230 の図 6-19 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。

なお、ここで実行したプログラムで重要なファイルは下記のものです。必要に応じて参照してください。
app.py : Pythonプログラム。Webサーバーの構築と、GPIO の利用など

static/javascript.js:JavaScript プログラム。ブラウザからの指令などを app.py に送る

templates/index.html:HTML ファイル。ページの見た目を決めている
なお、ブラウザ上のカメラの映像ですが、上述した mjpg-streamer が異常終了の問題が起こった場合、映像がそこで停止しているでしょう。その場合、ブラウザで再読み込みを実行すると、映像が再び流れ始めると思います。


PDF15:PCA9685 + 半固定抵抗でのカメラ台の操作

追加PDFで解説した、サーボドライバ PC9685 と半固定抵抗でカメラ台を操作するプログラムは bb2-06-04-pantilt-pca9685.py です。 Thonny で読み込んで実行するか、ターミナルで下記のコマンドで実行してください。管理者権限は不要です。I2C が有効化されている必要があります。
python3 bb2-06-04-pantilt-pca9685.py

PDF16:PCA9685 + ブラウザでのカメラ台の操作

追加PDFで解説した、サーボドライバ PC9685 とブラウザでカメラ台を操作するプログラムは bb2-06-06-pantilt-pca9685/ ディレクトリに格納されています。 FastAPI をインストールし、さらに mjpg-streamer をインストール&実行し、I2C を有効にした状態で下記の手順で実行します。
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-06-06-pantilt-pca9685」に移動します。
cd bb2-06-06-pantilt-pca9685
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
cd bluebacks/bb2-06-06-pantilt-pca9685
移動したら、下記のコマンドで Web サーバーを実行します。
python3 app.py
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
http://(Raspberry PiのIPアドレス):8000/6-6
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/6-6 」を記入して Enter キーを押す、ということです。 Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。 現れるページの見た目と機能は p.230 の図 6-19 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。

第7章

p.238:OpenCVのインストールコマンド

OpenCV は下記のコマンドで実行してください。
sudo apt update
sudo apt install libopencv-dev python3-opencv

p.239~p.260:画像処理プログラムの実行用コマンド

p.239~p.260 で紹介したプログラム(bb2-07-01 から bb2-07-05 まで)の実行コマンドは下記です。書籍との違いは、カメラモジュールの利用に libcamera + picamera2 を用いていることです。
python3 bb2-07-01-preview.py

python3 bb2-07-02-binary.py

python3 bb2-07-03-cannyedge.py

python3 bb2-07-04-circle.py

python3 bb2-07-05-face.py

p.261~p.268:画像追跡プログラムの実行用コマンド

p.261~p.268 で紹介したプログラム(bb2-07-06 から bb2-07-07 まで)の実行するためには、ハードウェアPWMを有効にする必要があります。本ページの「p.192:ハードウェアPWMを用いるための準備」に基づき、 /boot/config.txt (将来は /boot/firmware/config.txt)の末尾に「dtoverlay=pwm-2chan」を追記するのでした。以上の準備のもと、下記コマンドを実行します。
python3 bb2-07-06-tracking-circle.py

python3 bb2-07-07-tracking-face.py

PDF17:PCA9685 を用いた画像追跡プログラムの実行用コマンド

PDF17~PDF19 で紹介したプログラム(bb2-07-08 から bb2-07-09 まで)の実行するためには、I2C を有効にする必要があります。その上で、下記コマンドを実行します。
python3 bb2-07-08-tracking-circle-pca9685.py

python3 bb2-07-09-tracking-face-pca9685.py

第8章

p.277:6脚ロボットのカラー画像について

6脚ロボットの作成方法を示す図ですが、書籍では画像がやや小さく見にくいかもしれません。下記に、カラーで解像度の高い画像を貼り付けますので、ご活用ください。

画像をクリックすると画像が大きくなります。必要に応じて、大きくした画像上で右クリックして「名前を付けて保存」を選択して保存すると良いでしょう。

図8-3

図8-12

図8-16

p.280~p.292: PCA9685 でサーボモーターを動かすプログラム

PCA9685 でのサーボモーターを動かすプログラム bb2-08-01-zero-pca9685.py および bb2-08-02-6legs-pca9685.py の内容は、書籍からほとんど変更を受けていません。 これは、外部回路 PCA9685 を用いたことの効果です。ですので、書籍の指示通りにご利用ください。I2C の有効化が必要なことに注意してください。

p.292: ソフトウェアPWMでサーボモーターを動かすプログラム

ソフトウェアPWMを用いるプログラム bb2-08-03-6legs-sw.py を用いる場合は、いくつか注意が必要です。 これまでの章で、/boot/config.txt を編集した場合、それらを無効にする必要があるのです。

具体的述べましょう。 下記コマンドで /boot/config.txt を管理者権限の mousepad で開きます。
sudo mousepad /boot/config.txt
なお、将来は /boot/config.txt は /boot/firmware/config.txt に変更されるようです。その場合コマンドは以下のようになるでしょう。
sudo mousepad /boot/firmware/config.txt
そして、第5章でテレビのリモコン操作をするための設定が末尾にあった場合、下記のように先頭に「#」をつけてコメントアウトして無効化します。
#dtoverlay=gpio-ir,gpio_pin=24
#dtoverlay=gpio-ir-tx,gpio_pin=25
これで GPIO24 と GPIO25 をソフトウェアPWMの出力として利用できるようになります。

さらに、同じく /boot/config.txt (将来は /boot/firmware/config.txt)の末尾にハードウェア PWM の設定があった場合、下記のように先頭に「#」をつけてコメントアウトして無効化します。
#dtoverlay=pwm-2chan
これで GPIO18 をソフトウェアPWMの出力として利用できるようになります。

以上の編集を行ったら、 /boot/config.txt (将来は /boot/firmware/config.txt)を上書き保存して mousepad を閉じ、Raspberry Pi を再起動しましょう。以上でソフトウェアPWMを用いたプログラムが動作するようになります。

p.296:6脚ロボットの安定性について

ハンチング対策の解説において、サーボモーターSG90に与える電圧(乾電池の本数)によって6脚ロボットの挙動が異なることに触れました。サーボモーターの個体差などにもよりますが、6脚ロボットのモーターに与える電圧が大きく、その結果流れる電流が大きくなるとSG90の挙動が不安定になることがありました。
具体的には「モーターの角度が指定していない角度に動き、そこでロックしてしまう」という現象が起きました。もし、同様の現象に悩まされている方は、以下に記す解消方法を試してみて下さい。なお、書籍の中でサーボドライバの類似品は「Adafruitのものと挙動が異なる場合がある」と記しましたが、類似品の中にはこの「指定していない角度でモーターがロック」という現象が起こりやすいものもあり、そのため、類似品はサポート対象外としました。

対策1:モーターに与える電圧を小さくする
モーターに与える電圧を小さくすると、6脚ロボットが安定する傾向があります。簡単にこれを実現するは、乾電池1本の電圧(約1.5V)とエネループなどのニッケル水素充電池の電圧(約1.2V)が異なることを利用するのが簡単です。以下の様な電圧を簡単に作ることができます。
  • 約4.5V:乾電池3本
  • 約3.6V:エネループなどのニッケル水素充電池3本
もしエネループなどのニッケル水素充電池をお持ちの場合、試してみると良いかもしれません。ただし、乾電池や充電池2本まで電圧を下げると、6脚ロボットは動作しませんので注意してください。なお、乾電池とニッケル水素充電池を混ぜて用いるのはやめましょう。
また、乾電池を用いるにせよ、充電池を用いるにせよ、新品の乾電池あるいは充電直後の充電池は、使っているうちに徐々に電圧が小さくなっていきます(参考:Panasonic | エネループシリーズについて)。そのため、使っているうちに6脚ロボットの安定性が徐々に変化することはあり得ます。

対策2:ロボットの脚の振り幅を小さくする
6脚ロボットを安定させるもう一つの方法は、脚の振り幅を小さくすることです。脚の振り幅が小さいということは、モーターの回転する角度が小さいということなので、モーターに流れる電流が小さくなり、その結果6脚ロボットが安定して動作する傾向があります。ただし、ロボットの動きはややゆっくりになります。下記のファイルを変更することで実現できます。
カメラなし、ハードウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/03/script.py
カメラなし、ソフトウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/04/script.py
カメラあり、ハードウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/05/script.py
これらのファイルの中で、下記の部分を見つけます。
LEG_F_R = NEUTRAL + 100
LEG_F_L = NEUTRAL - 100
LEG_B_R = NEUTRAL - 100
LEG_B_L = NEUTRAL + 100
4つある数字の100が、脚の振り幅(モーターの動く角度)に対応する数値です。これを小さめの値、例えば下記のように60に変更します。
LEG_F_R = NEUTRAL + 60
LEG_F_L = NEUTRAL - 60
LEG_B_R = NEUTRAL - 60
LEG_B_L = NEUTRAL + 60
変更して保存した後はWebIOPiを再起動する必要があります。WebIOPiが自動起動する設定になっている場合、Raspberry Piを再起動してしまうのが簡単でしょう。

対策3:モーターに与える電圧を大きくする
さらに、Syun'iti Hondaさんのように、 モーター用の電源を 「約4.5V:乾電池3本」 から 「約4.8V:エネループなどのニッケル水素充電池4本」 に変更すると安定したというご報告もあります。このあたりはサーボモーターの個体差や消耗具合に依存するのかもしれません。 この場合、電池4本用の電池ボックスとしては「電池ボックス 単3×4本 リード線・フタ・スイッチ付」などがあります。

p.296:サーボモーターの消耗について

本書ではSG-90というサーボモーターで6脚ロボットを作成しました。一般的に、サーボモーターは長く使っていると作成当初から挙動が変わり、交換が必要になる場合があります。そういう意味で、サーボモーターは消耗品と考えた方がよいかもしれません。
私の場合、6脚ロボットを初めて作成してから書籍が出版されるまでの約8ヶ月の間に、1つのサーボモーターを交換しました。具体的には、機体を持ったまま脚を動かした際、1つの脚だけ他の脚に比べて動きが遅くなったため交換しました。

p.300: ブラウザからの6脚ロボットの動作

p.300 から始まるブラウザでの6脚ロボットの制御は、本書では WebIOPi を用いていました。本ページではそれを FastAPI で行うよう変更します。これは、第5章 p.168 や 第6章 p.225 と同じです。 そのため、p.301~p.305 の WebIOPi の解説はあまり参考にならないと思ってください。以下で FastAPI を用いたプログラムの実行方法を解説します。

まず、まだ FastAPI をインストールしていない場合は下記コマンドでインストールします。
sudo apt update
sudo apt install python3-fastapi
そして、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-08-06-pca9685」に移動します(なお、ソフトウェアPWMを用いる場合のディレクトリは bb2-08-07-sw です)。
cd bb2-08-06-pca9685
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
cd bluebacks/bb2-08-06-pca9685
移動したら、下記のコマンドで Web サーバーを実行します。
python3 app.py
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
http://(Raspberry PiのIPアドレス):8000/8-6
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/8-6 」を記入して Enter キーを押す、ということです。 Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。

現れるページの見た目と機能は p.305 の図 8-11 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。

なお、ここで実行したプログラムで重要なファイルは下記のものです。必要に応じて参照してください。
app.py : Pythonプログラム。Webサーバーの構築と、GPIO の利用など

static/javascript.js:JavaScript プログラム。ブラウザからの指令などを app.py に送る

templates/index.html:HTML ファイル。ページの見た目を決めている
なお、ソフトウェアPWMも用いる場合のプログラムは bb2-08-07-sw ディレクトリに格納されており、実行時に参照すべきアドレスは「http://(Raspberry PiのIPアドレス):8000/8-7」です。

p.307: Webサーバーの自動起動について

p.307 では Web サーバーである WebIOPi の自動起動について記されています。本ページではこれを「python3 app.py コマンドの自動起動」に置き換えて解説します。

まず、「python3 app.py コマンドの自動起動」をするためには、このコマンドをサービスとして登録するのが確実です。 そのために必要なファイルは、サンプルファイルの中の bb2-08-06-pca9685 ディレクトリにある web6legs.service というテキストファイルとして保存されています。 このファイルを活用する前に、その内容を皆さんの環境に合わせてカスタマイズする必要があります。

このファイルは単なるテキストファイルのですので、テキストエディタ(mousepad)で開いてみましょう。

管理者権限は不要ですのでファイルマネージャから開いても良いですし、コマンドで開く場合、「 cd bb2-08-06-pca9685 」または「 cd blubacks/bb2-08-06-pca9685 」でディレクトリを移動した後、下記コマンドで開けます。
mousepad web6legs.service 
すると、以下の内容がみられます。
[Unit]
Description=Web6Legs
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/pi/bb2-08-06-pca9685
#WorkingDirectory=/home/pi/bluebacks/bb2-08-06-pca9685
ExecStart=/usr/bin/python3 -m app
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target
変更しなければならないのは下記の部分、すなわち、プログラムが存在するディレクトリを指定している部分です。
WorkingDirectory=/home/pi/bb2-08-06-pca9685
#WorkingDirectory=/home/pi/bluebacks/bb2-08-06-pca9685
2行ありますが、2行目の先頭に「#」がついていますのでこちらは無効化された状態です。
1行目がサンプルファイルをホームディレクトリに直に展開した場合、2行目がサンプルファイルを bluebacks ディレクトリ内に展開した場合ですので、 自分に合った方を有効にしてください。

次に着目して頂きたいのは、ディレクトリの「/home/pi」の部分です。この「pi」はユーザー名を現していますので、これを皆さんのユーザー名に変更してください。 私の場合でしたら、「pi」の部分を「kanamaru」に変更、ということです。 変更が済んだら上書き保存し、mousepad を閉じてください。

その後、下記のコマンドで web6legs.service ファイルを /etc/systemd/system ディレクトリに管理者権限でコピーします。
sudo cp web6legs.service /etc/systemd/system/
そうすると、ブラウザで6脚ロボットを操作するためのプログラムが「web6legs」という名前のサービスとして利用できるようになります。サービスの起動と終了を行うコマンドは以下の通りです。これらのコマンドは、どのディレクトリで実行しても構いません。

サービス起動(python3 app.py を実行するのと同等)
sudo service web6legs start
サービス終了(python3 app.py の終了と同等)
sudo service web6legs stop
なお、サービスが起動しているかどうかは、下記のように ps ax コマンドの出力から「python3」を含むものを抽出することで確認することができます。
kanamaru@raspberrypi:~ $ ps ax | grep python3
    914 ?        Ssl    0:00 /usr/bin/python3 -m app
   1947 pts/0    S+     0:00 grep --color=auto python3
1行目の「/usr/bin/python3 -m app」が、プログラム app.py が実行されていることを表します。

なお、以上の service コマンドでサービスを起動しても、Raspberry Pi を終了や再起動するとサービスは終了し、自動起動することはありません。 Raspberry Pi の起動時にこのサービスを自動起動するには、下記のコマンドを用います。このコマンドも、どのディレクトリで実行しても構いません。
sudo systemctl enable web6legs
このコマンドを実行後、Raspberry Pi を再起動すると、自動で web6legs が起動されるようになります。ps ax コマンドで確認してみましょう。

自動起動を無効に戻すには、以下のコマンドを用います。
sudo systemctl disable web6legs

p.308: LCDへのIPアドレスの表示について

本書では、Raspberry Piにブラウザからアクセスする際にIPアドレスを用いました。そのため、Raspberry Piにルーターなどから割り振られたIPアドレスを知る目的で、LCDを回路に取り付けました。

しかし、本ページ下部の「p.335:IPアドレスでのURLの指定について」で記しますように、avahiという仕組みを用いると、IPアドレスではなく、下記のようなアドレスでのアクセスが可能になるのでした(ただし、p.335の注釈に示すように制限がありますので注意)。
  • http://raspberrypi.local:8000/5-2
これを用いると、回路からLCDが不要になるなどのメリットがあります。具体的には下記の通りです。
  • p.309の図8-13やp.310の図8-14からLCDを取り外して良い
  • p.310での/etc/rc.localへの「python3 /home/pi/bb2-08-04-lcd.py $_IP &」の記述が不要
さらに、Raspberry PiのIPアドレスを固定する、という方法でも、毎回IPアドレスを調べる必要がなくなりますね。こちらについては前著サポートページ内の「Raspberry PiのIPアドレスを固定する」にまとめましたので、興味のある方は御覧ください

p.311:IPアドレスをLCDに表示するプログラムを自動起動するための記述

IPアドレスをLCDに表示するプログラムを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
python3 /home/pi/bb2-08-04-lcd.py $_IP
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-08-04-lcd.py $_IP」となる、ということです。

また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
python3 /home/pi/bluebacks/bb2-08-04-lcd.py $_IP
上と同様に、「pi」は自分のユーザー名に置き換えてください。

p.314:シャットダウン用プログラムを自動起動するための記述

シャットダウン用プログラムを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
python3 /home/pi/bb2-08-05-shutdown.py &
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-08-05-shutdown.py &」となる、ということです。

また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
python3 /home/pi/bluebacks/bb2-08-05-shutdown.py &
上と同様に、「pi」は自分のユーザー名に置き換えてください。

p.318:mjpg-streamerを自動起動するための記述

mjpg-streamerをを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
python3 /home/pi/bb2-06-03-stream.py &
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-06-03-stream.py &」となる、ということです。

また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
python3 /home/pi/bluebacks/bb2-06-03-stream.py &
上と同様に、「pi」は自分のユーザー名に置き換えてください。

p.319:ブラウザでのカメラ付き6脚ロボットの操作

ブラウザでカメラ付き6脚ロボットを操作するプログラムは bb2-08-08-pca9685/ ディレクトリに格納されています。 FastAPI をインストールし、さらに mjpg-streamer をインストール&実行し、I2C を有効にした状態で下記の手順で実行します。
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-08-08-pca9685」に移動します。
cd bb2-08-08-pca9685
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
cd bluebacks/bb2-08-08-pca9685/
移動したら、下記のコマンドで Web サーバーを実行します。
python3 app.py
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
http://(Raspberry PiのIPアドレス):8000/8-8
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/8-8 」を記入して Enter キーを押す、ということです。 Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。 現れるページの見た目と機能は p.230 の図 6-19 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。

なお、カメラ付き6脚ロボットの操作プログラムを自動起動したい場合は、 web6legs.service 内の「WorkingDirectory」の行を書き換えてから /etc/systemd/system ディレクトリにコピーし直せば良いでしょう。

付録A

p.325 圧縮されたサンプルファイルの展開に関する注意

NOOBS 3.1.1 (Raspbian 2019-06-20) 以降では、圧縮ファイルを展開するためのソフトウェアのデフォルトの設定が変化しましたので利用の際は注意が必要です。
下図(左)のように、展開先のデフォルトが「/tmp」とされ、また、展開時に自動的にフォルダが作られるようになっています。
これを、下図(右)のように
  • 展開先に「 /home/pi 」または「 /home/pi/bluebacks 」と記入。ただし、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されていますので、この記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「 /home/kanamaru 」や「 /home/kanamaru/bluebacks 」となる、ということです。
  • 「Ensure a containing directory」のチェックを外す
の2点を行ってから「展開」ボタンを押すようにしましょう。展開先に記す文字は、このページからコピー (Ctrl-c) して貼り付ける (Ctrl-v) と安心です。



付録B

p.329:WebIOPi について

WebIOPi は Raspberry Pi 5 以降で動作しませんので、インストールしないでください。本ページでは代わりに FastAPI を用いる方法を紹介しています。

p.335:IPアドレスでのURLの指定について

本書では、ブラウザからRaspberry Piにアクセスする際に、ルーターなどからRaspberry Piに割り振られたIPアドレスを用いました。すなわち、IPアドレスが192.168.1.3の場合にブラウザから例えば下記のようにアクセスできます。
  • http://192.168.1.3:8000/5-2
しかし、この方法はifconfigコマンドなどで事前にIPアドレスを調べておく必要があり、やや面倒でした。

現在の OS では、IPアドレスを用いずにRaspberry Piにアクセスできますのでその方法を紹介します。なお、この方法でRaspberry Piにアクセスできるのは下記のみです。
  • iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです)
  • macOS
  • iPhoneやiPad
Androidスマートフォンでは現時点ではこの方法ではRasbperry Piにはアクセスできないように思われます。

上記の条件が満たされれば方法は簡単で、ブラウザのアドレス欄に例えば下記のように入力すればOKです。
  • http://raspberrypi.local:8000/5-2
すなわち、IPアドレス「192.168.1.3」などの代わりに「raspberrypi.local」という記法が使える、というわけです。これは、OS 上で動作しているavahiというソフトウェアの働きによります。

なお、avahi がインストールされていない場合、下記のようにavahi-daemonをインストールする必要があります。
sudo apt update
sudo apt install avahi-daemon
インストール後に再起動すると、自動的にavahiが起動し、「raspberrypi.local」でのアクセスが可能になります。

なお、同じネットワーク内でavahiが起動したRaspberry Piが2台以上あると、同じ名前「raspberrypi」のマシンが2つ以上ある状態になり、名前の衝突が起こります。その場合、2台目以降のRaspberry Piには「raspberrypi-2.local」などの名前が自動的につけられますのでご注意ください。名前が衝突しないよう、あらかじめ「raspberrypi」というマシン名を変更しておく方法もありますが、ここでは省略します。

読者の方々の声

本ページでは、読者の方々のレビューなどをご紹介したいと思います。

紹介記事


ご紹介に感謝



以下、twitterでの反応をまとめます。