2023年3月29日水曜日

本書発売後の追加情報(Pi Zero~Pi 4までの古い情報)

より新しい情報

Raspberry Pi 5 が海外で発表され、それに対応した OS Bookworm がリリースされるに伴い、本ページの内容は古くなっています。下記の新しいページをご覧ください。 以下は、それ以前の古い情報を残しておいたものです。

はじめに

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

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

回路配線図について

回路配線図をWindowsやOS X上のAdobe Readerで閲覧する際、「編集」→「環境設定」を選択し、下図のように「細い線を拡張」のチェックを外すと、より綺麗な配線図を見ることができます。


チェックを外す前後の配線図の状態を示したのが下図です。「細い線を拡張」のチェックを外した方が図がきれいに表示されているのがわかるでしょう。

なお、この設定はPDFを印刷する際には影響しないはずです。

回路配線図をRaspberry Pi上で見る場合

回路配線図をRaspberry Pi上で見る場合、古いRaspbianではChromiumブラウザ上で日本語が表示されないことが多いと思います。その場合、一旦PDFファイルをRaspberry Pi上にダウンロードし、デスクトップメニューの「アクセサリ」→「PDF Viewer」から開くようにしてください。 PDFファイルをRaspberry Pi上にダウンロードする方法は、「一旦Chromiumブラウザで開いてから画面上のダウンロードボタンを押す」か「リンク上で右クリックして『名前を付けてリンク先を保存』を選択」のどちらかです。
新しいRaspbianではChromiumブラウザ上でPDFを見ても日本語が表示されます。

第1章

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

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

本書はRaspberry Pi 4のような最新のRaspberry Piでの動作もサポートしています。

p.21:NOOBSのバージョンについて

書籍販売より、以下のようにOSの更新が行われています。

日付バージョンカーネルバージョンOSバージョン
2016/2/3NOOBS 1.6.04.1.17+ / 4.1.17-v7+Jessie
2016/2/9NOOBS 1.7.04.1.17+ / 4.1.17-v7+
2016/2/26NOOBS 1.8.04.1.18+ / 4.1.18-v7+
2016/3/18NOOBS 1.9.04.1.19+ / 4.1.19-v7+
2016/5/10NOOBS 1.9.14.4.9+ / 4.4.9-v7+
2016/5/27NOOBS 1.9.24.4.11+ / 4.4.11-v7+
2016/9/23NOOBS 1.9.34.4.21+ / 4.4.21-v7+
2016/10/5NOOBS 2.0.04.4.21+ / 4.4.21-v7+
2016/11/29NOOBS 2.1.04.4.34+ / 4.4.34-v7+
2017/2/27NOOBS 2.2.04.4.48+ / 4.4.48-v7+
2017/3/3NOOBS 2.3.04.4.50+ / 4.4.50-v7+
2017/4/10NOOBS 2.4.04.4.50+ / 4.4.50-v7+
2017/6/23NOOBS 2.4.14.9.28+ / 4.9.28-v7+
2017/7/5NOOBS 2.4.24.9.35+ / 4.9.35-v7+
2017/8/17NOOBS 2.4.34.9.41+ / 4.9.41-v7+Stretch
2017/9/8NOOBS 2.4.44.9.41+ / 4.9.41-v7+
2017/11/29NOOBS 2.4.54.9.59+ / 4.9.59-v7+
2018/3/14NOOBS 2.6.04.9.80+ / 4.9.80-v7+
2018/3/14NOOBS 2.7.04.9.80+ / 4.9.80-v7+
2018/4/18NOOBS 2.8.04.9.80+ / 4.9.80-v7+
2018/4/24NOOBS 2.8.14.14.34+ / 4.14.34-v7+
2018/6/27NOOBS 2.8.24.14.50+ / 4.14.50-v7+
2018/10/11NOOBS 2.9.04.14.71+ / 4.14.71-v7+
2018/11/15NOOBS 3.0.04.14.79+ / 4.14.79-v7+
2019/4/8NOOBS 3.0.14.14.98+ / 4.14.98-v7+
2019/6/24NOOBS 3.1.14.19.50+ / 4.19.50-v7+ / 4.19.50-v7l+Buster
2019/7/10NOOBS 3.2.04.19.57+ / 4.19.57-v7+ / 4.19.57-v7l+
2019/9/30NOOBS 3.2.14.19.75+ / 4.19.75-v7+ / 4.19.75-v7l+
2020/2/7NOOBS 3.3.04.19.97+ / 4.19.97-v7+ / 4.19.97-v7l+
2020/2/14NOOBS 3.3.14.19.97+ / 4.19.97-v7+ / 4.19.97-v7l+
2020/5/27Raspberry Pi OS 2020-05-274.19.118+ / 4.19.118-v7+ / 4.19.118-v7l+
2020/8/20Raspberry Pi OS 2020-08-205.4.51+ / 5.4.51-v7+ / 5.4.51-v7l+
2020/12/02Raspberry Pi OS 2020-12-025.4.79+ / 5.4.79-v7+ / 5.4.79-v7l+
2021/1/11Raspberry Pi OS 2021-01-115.4.83+ / 5.4.83-v7+ / 5.4.83-v7l+
2021/3/4Raspberry Pi OS 2021-03-045.10.17+ / 5.10.17-v7+ / 5.10.17-v7l+
2021/5/7Raspberry Pi OS 2021-05-075.10.17+ / 5.10.17-v7+ / 5.10.17-v7l+
2021/10/30Raspberry Pi OS 2021-10-305.10.63+ / 5.10.63-v7+ / 5.10.63-v7l+Bullseye
2022/1/28Raspberry Pi OS 2022-01-285.10.92+ / 5.10.92-v7+ / 5.10.92-v7l+ / 5.10.92-v8+
2022/4/4Raspberry Pi OS 2022-04-045.15.30+ / 5.15.30-v7+ / 5.15.30-v7l+ / 5.15.30-v8+
2022/9/6Raspberry Pi OS 2022-09-065.15.61+ / 5.15.61-v7+ / 5.15.61-v7l+ / 5.15.61-v8+
2022/9/22Raspberry Pi OS 2022-09-225.15.61+ / 5.15.61-v7+ / 5.15.61-v7l+ / 5.15.61-v8+
2023/2/21Raspberry Pi OS 2023-02-215.15.84+ / 5.15.84-v7+ / 5.15.84-v7l+ / 5.15.84-v8+
2023/5/3Raspberry Pi OS 2023-05-036.1.21+ / 6.1.21-v7+ / 6.1.21-v7l+ / 6.1.21-v8+
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}

どのバージョンでも動作確認しています。

古いバージョンを使いたい方は下記のJAISTのミラーサイトで適切な日付をたどると見つけられます。

なお、「sudo apt upgrade」により全パッケージを更新したり、「sudo rpi-update」によりfirmwareを更新したRaspbianはサポートの対象外とします。その理由は下記の通りですのでご了承ください。
  • パッケージやfirmwareは日々変化しており、タイミングによってはバグを含んだパッケージがインストールされることもあること(実際、その問題によりトラブルの原因発見に時間がかかったことがあります)
  • 同じ理由で、読者の方の環境と筆者の環境を一致させることが難しいこと

p.27: セットアップウィザードの起動

現在のRaspbianでは、初回起動時に設定用のセットアップウィザードが起動するようになっております。


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

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

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

2章

p.52:開発環境IDLEの代替としてThonny Python IDEを用いる方法

2019年11月現在、本書で解説した開発環境IDLEはデフォルトでRaspbianに含まれていません。IDLE を別途インストールして利用する方法もあるのですが、より簡単にPythonプログラムを実行する方法として、デフォルトでインストール済の「Thonny Python IDE」を用いる方法をここで紹介します。

Thonny Python IDEはpython3用のプログラムを実行するための環境です。本書のプログラムはPython3での実行をサポートしていますので問題なく実行できます。 Python 3用ツールのインストール法は本ページで解説されておりますので注意して本ページをお読みください
(2019/6/25以前にサンプルプログラムをダウンロードした方は再び raspi2-sample.zip をダウンロードし、展開しなおした上でご活用ください)。

さて、メニューの下図に示されている「Thonny Python IDE」をマウスでクリックするとThonny Python IDEが起動します。


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

ただし、「STOP」ボタンでプログラムを停止すると、GPIOの終了処理が正しく機能しないようです。「Shell」と書かれた領域の上でキーボードの「Ctrl-C」によりプログラムを終了するのが良いでしょう。なお、Thonnyには「時々Ctrl-cが効かなくなる」という不具合があるようなので、そういうときのみ「STOP」ボタンでプログラムを停止すると良いでしょう。


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

なお、本書ではWiringPi-Pythonによりサーボモータを用いる場合に管理者権限が必要となります。その場合、管理者権限のThonnyでプログラムを読み込んで実行する必要があります。 そのためには、LXTerminalを開いてから下記のコマンドを実行してください。
sudo thonny &
管理者権限のThonnyが現れるので、ファイルを読み込んで実行してください。

p.52:Python2とPython3について

さて、上で紹介した Thonny Python IDEを用いるということは、Python バージョン 3 を用いることを意味します。本書で利用を推奨していた Python バージョン 2 は 2020年1月1日にサポートが切れましたので、これを機会に本ページでは Python 3 による実行方法のみを解説することにします。本書のプログラムは Python 3 でも動作するよう更新済ですし、Python 3用のツールのインストール法も、全て本ページで解説していますので大きな問題はありません。

なお、コマンドによりプログラムを実行する場合は、Python 2とPython 3および対応コマンドが下記のように異なります。 以下ではPython3 用のコマンドを用いることになりますので参考にしてください。

項目Python2用コマンドPython3用コマンド
プログラム実行コマンドpython または python2python3
IDLE実行コマンドidle-python2.7idle-python3.7
Thonny実行コマンドなしthonny
Python用プログラムインストールコマンドpipまたはpip2pip3

プログラム実行時に自分がPython2 と Python3 のどちらで実行しているかを意識するとPythonプログラムにより早く慣れることができるでしょう。

p.52:NOOBS 2.8.2 (Raspbian 2018-06-27) 以降でのIDLEの通常起動について

NOOBS 2.8.2 (Raspbian 2018-06-27) から、デスクトップのメニューから開発環境IDLEの項目が削除されています。そのため、その代替としてThonny Python IDEを用いる方法を上で解説しました。通常はこのThonny Python IDEを用いてください。
ここでは、それでも敢えてIDLEを用いたいという方のためにその方法を解説します。

ターミナル LXTerminal を起動し、下記の2つのコマンドを順に実行してください。Python 3 用のIDLEがインストールされます。
sudo apt update
sudo apt install idle-python3.7
Python 3 用のIDLEを起動するためには
idle-python3.7 &
を実行します。

第3章

p.81およびp.85:タクトスイッチを用いるプログラムの管理者権限について

タクトスイッチを用いる bb2-03-03-dice-switch.py および bb2-03-04-dice-switch-delay.py はどのバージョンのNOOBSでも管理者権限が必要と述べましたが、 現在では、これらのプログラムでも管理者権限が不要になりました。興味のある方は試してみてください。

第4章

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

第4章で紹介しているお天気Webサービスですが、2020年7月でサービスを終了したようです。
それに伴い、4章のプログラムは全て動作しなくなってしまいました。

代わりに、OpenWeather というサービスを利用したプログラムを作成しました。やや解説が長くなりますので、下記のページをご覧ください。

4章全般:音声合成機能の追加について

4章で作成した「天気予報機能付き温度計」に、音声合成機能を追加するための解説を下記に記しました。ご活用ください。

p.94~p.97:I2Cの準備について

94~97ページではI2C通信を利用するための準備を行いました。最新の Raspbian を用いると、これらの多くはデフォルトで設定済です。必要な作業は
  • p.95: 設定アプリケーションによるI2Cの有効化
のみです。その他の作業、すなわち、「/etc/modulesへのi2c-devの追記(p.96)」、「必要なパッケージのインストール (p.97)」は実行不要です。後者は、実行しても「すでに最新バージョンです」と表示されるだけで悪影響はありません。

p.101:pipとrequestsのインストール

pipとrequestsも、最新の Raspbian ではデフォルトでインストール済なのであらためてインストールする必要はありません。 インストールコマンドを実行しても「すでに最新バージョンです」、「Requirement already satisfied」などと表示されるだけで悪影響はありません。

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

ここで用いる温度センサとLCDの組み合わせは前著でも用いたのですが、LCDを用いたプログラムの動作に失敗するという方が多いようです。LCDを用いたプログラムを実行するためには、Raspberry PiからLCDが認識されていることが必要です。LCDが認識されているかどうかのチェック方法は、書籍に記さなかったのですが、ここで紹介します。

まず、温度センサとLCDを接続した回路(p.108の図4-9)を作成した状態でLXTerminalを起動し、下記のコマンドを実行しましょう。
i2cdetect -y 1
このコマンドは、Raspberry Piに接続されたI2Cデバイスのアドレスを出力するものです。以前のRaspbianでは管理者権限を表す「sudo」が必要でしたが、現在は管理者権限は不要になっています。

正常な出力結果は下図のようになります。48が温度センサのアドレス0x48を表し、3eがLCDのアドレス0x3eを表します。48が表示されなければ温度センサを用いるプログラムは正常動作しませんし、3eが表示されなければLCDを用いるプログラムは動作しませんので、まずは下図の出力が得られることを目指しましょう。

そのためには、温度センサ、LCDの製作過程や回路などを見直すのが基本的な方針ですが、次項で述べたように、「新しいロットのLCDはRaspberry Piから認識されない」という問題に該当しているかもしれません。そのため、次項以降も引き続きお読みください。


4章全般:利用できるLCDについて1~秋月電子編

本書で紹介したLCDの新しいロットでは、本ページ下部で記すように何らかの対処をしないとRaspberry Piでは利用できなくなってしまいました(抵抗1本の追加で暫定的に利用可能になるのですが)。そこで、正常に動作するLCDをいくつか紹介します。

まず、秋月電子通商が書籍のLCDを正式にRaspberry Pi対応させたモジュールキットです。なお、組み立てキットの方は狭いピッチ(ピン間隔)の半田付けが必要になりますので、半田付けにある程度慣れている方向けとなります。通常は完成品を推奨します。商品へのリンクは下記になります。
組み立てキットに含まれるパーツを図示したのが下図(左)となっています。ピンソケットが2種含まれていますので、お好みの方を半田付けします。 完成品にはLCDを立てて使うためのピンソケットがあらかじめ取り付けられています。「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」の公式パーツセットには前者の完成品の方が含まれていますので、お持ちの方もいるでしょう。

なお、本書のようにブレッドボードで利用するためには、組み立てキットに下図(中)のようにピンヘッダを別途購入して半田付けする方法があります。ピンヘッダとは、例えば下記のようなものです。丁度のサイズのものを購入するよりは、長いものを購入してニッパでカットするのが一般的です。

ピン配置は本書のものとは異なり、上図(右)のようになっています。

利用例は下図のようになっています。下図(左)がピンソケットを用いた場合で、Raspberry PiのGPIO(3.3V/SDA/SCL/GPIO4/GNDと続くピン)に直接させるようになっています。完成品ではLCDを立てて使うようなピンソケットとなっています。ただし、これではGPIOのピンの一部が利用できなくなってしまいますので、ジャンパワイヤを介してGPIOに接続するのがお勧めです。また、本LCDの完成品には以下に記すLEDのバックライト機能はありませんのでご注意ください。

ピンヘッダを用いて作成したLCDならば本書のようにブレッドボートで利用可能です。その様子を示したのが下図(右)です。なお、基板の「LED」ピンを3.3Vに接続すると、図のようにLCDのバックライトが点灯した状態になります。お好みで利用してください。ピンソケットでGPIOに直接差したLCDならば、GPIO 4をHIGHにすることでバックライトが点灯します。なお、バックライトを利用するには、LCDを基板に半田付けする際に2か所の四角いピンも半田付けする必要がありますのでご注意ください。


4章全般:利用できるLCDについて2~ストロベリーリナックス編

他に用いることのできるLCDとしては、例えばストロベリーリナックスで取り扱われている以下のものがあります。どちらも16文字x2行ですので、本書で取り扱ったものの倍の文字数を表示できます。
下図は、
  • sudo python3 bb2-04-03-lcd-practice.py 'Hello, Raspberry Pi!'
を実行した様子です。現在のRaspbianでは管理者権限を表す「sudo」は不要ですが、上のようにsudoをつけても問題なく動作します。

ただし、この2つのLCDでは、本書p.115図4-11の文字コード表の一番左の列(0x06~0x0f)の文字は表示されないようです。ご了承ください。

これらのLCDが本書のLCDと共通でのプログラムで利用可能な理由は、コントローラーICとしてST7032iと呼ばれるものが共通で用いられているためです。そのため、書籍で紹介したLCDにあったロットによる問題が将来起こらないとは限りません。その場合はやはり上記の暫定的対処法を試すことになるでしょう。


なお、回路の接続は本書のものとは少し異なります。上図のどちらの液晶を用いる場合も下図を参考にしてください。


プログラムは、一行だけ変更が必要です。LCDを用いるプログラムには下記のようにLCDの文字数を設定している行があります。これらは8x2の液晶であることを示しています。
chars_per_line = 8
display_lines = 2
これを下記のように変更して保存すれば完了です。
chars_per_line = 16
display_lines = 2
この変更をしなければ、単に8x2の液晶として動作します。

また、「I2C低電圧キャラクタ液晶モジュール(16x2行)」(小さいほう)を用いるとデフォルトでは文字がやや薄くなります。2019/6/25に更新されたサンプルファイルでは文字の濃さを調整できるよう変更されていますので、必要に応じて raspi2-sample.zip をダウンロードしなおし、展開した上で利用してください。

更新されたそれぞれのファイルで下記の行を見つけ、contrastの値を40に変更し保存してください。必要に応じて、上で記した「chars_per_line」を16にする変更も行なってください。
contrast = 32 # 0から63のコントラスト。通常は32、文字が薄いときは40を推奨

p.108:以前のLCDを購入した場合の暫定的な対処法

<LCD対処法:予備知識>

読者の方により、書籍内で紹介したLCD(AQM0802)を2015年12月頃以降に購入した場合、Raspberry Piから認識されない(i2cdetectコマンドを実行しても3eが表示されない)ことがあることを教えて頂きました。

私も新たに完成品のLCD(AQM0802)を購入してみましたが、確かに同じ状況になりました。販売店に問い合わせたところ、「LCDの新しいロットでは電流の引き込み能力が低くRaspberry Piで動作(認識)しない」との回答でした。

このままでは4章の演習を実行できなくなってしまいます。そこで、そのように問題のあるLCDを動作させる方法をここで紹介します。なお、最も簡単な解決方法は、本ページ上部で紹介した動作確認済のLCDを購入することです。以下は、古いLCDをなんとか活用したいという方向けの情報です。

まず、対処法を理解するための予備知識から解説します。LCDモジュールの基板の裏には、下図(A)または(B)のように、PUと書かれた部分にジャンパとよばれる電極が2セットあります。LCDモジュールを自分ではんだづけした方は下図(A)の状態、完成品を購入した方は下図(B)の状態の方が多いでしょう。下図(A)の状態では、一つの正方形内の凹凸状の電極は絶縁されています。ここにはんだを盛り下図(B)のようにすると電極が接続され、LCDモジュールの基板上のプルアップ抵抗が有効になります。そのため、これらの状態をそれぞれ「PUなし」、「PUあり」と呼ぶことにします(PUはpull-upの略です)。


一般に、プルアップ抵抗はI2C接続時に必要になるものですが、Raspberry Pi内部に既にこのプルアップ抵抗が存在するので、LCDモジュールの基板上では必ずしもこのプルアップ抵抗の有効化は必要ありませんでした。そのため、4章において正常動作するLCDでは「PUなし」、「PUあり」のどちらでもLCDは動作しました(ただし、8章ではサーボドライバ上のプルアップ抵抗の影響で、LCDでは「PUなし」としなければ動作しないことがあります)。

既に述べたように、「PUなし」から「PUあり」の状態にするには、凸と凹の電極にまたがるようにはんだを盛ります。逆に、「PUあり」から「PUなし」の状態に戻すには、上図(C)のように、はんだ吸い取り線を用いてPU部からはんだを除去するのが簡単です。

以上の予備知識のもと、どなたにでも容易に実現可能な暫定的対処法と、上級者向けの正式な対処法との2つを紹介します。

<LCD対処法:暫定版>

まずは、どなたにでも容易に実現可能な暫定的対処法を紹介しましょう。
Raspberry Piから認識されない完成品LCD(AQM0802)に対して、回路に下図のようにSDA部からGNDの間に抵抗を追加すると、動作を確認することができました。

抵抗の大きさRとしては、下記の範囲のものが有効でした。
  • PUありの場合のR:2kΩ
  • PUなしの場合のR:2kΩ~4.7kΩ程度
  • ただし、8章でサーボドライバとともに用いる場合「PUなし、R=2kΩ」のみ。サーボドライバにプルアップ抵抗が含まれており、実質「PUあり」と同じ状態になるためです。
後に述べるように、私はPUなし(PU部のはんだをはんだ吸い取り線で除去した状態)で4.7kΩの抵抗を用いることを推奨します。4.7kΩでI2C通信のエラーの頻度が高い場合は3.9kΩが良いかもしれません。抵抗は例えば、2kΩ3.9kΩ4.7kΩなどが購入できます。

なお、この方法を用いると、3.3VピンからGNDまで1.8kΩ+RkΩの抵抗で接続されることになるので、約0.5mAから1.0mA程度の電流が流れ続けます(1.8kΩの抵抗は、Raspberry Pi本体内部にあるI2C用のプルアップ抵抗です)。この程度の大きさの電流がRaspberry Piに問題を起こすことはないと思われますが、本来不要な電流が流れる手法であることは注意しておいてください。なお、比較のために記すと、2章でLEDを点灯したときに流れる電流は約5mAです。

以上で、暫定的対処法の解説は終わりますが、以下、動作しない完成品LCDで何が起こっているか、そしてこの方法により何が起こるのかを簡単に記しておきます。

まず、「動作しない完成品LCD」の何が問題かを記したのが下図です。I2C通信時にLCDから Raspberry Piに対してACK信号と呼ばれるLOW信号を出力する場面があります。正常動作するLCDでは、このACK信号は約0.8Vとなっています。これはこのLCDの仕様の範囲内の動作です。しかし、「動作しない完成品LCD」ではこれが約1.2Vとなってしまっています。これをRaspberry PiがLOWと認識できないため、処理がそこで止まっているようです。


これに対し、暫定的な対応法ではこのACK信号を下図のように約1.0Vまで引き下げています。ただし、下図に示されている通り、3.3VであるべきHIGH信号まで下げてしまいますので、下げすぎると、Rapberry PiからHIGH信号も認識できなくなってしまいます。図を見るとわかる通り、「PUあり、R=2kΩ」ではHIGHが2Vまで下がっており、HIGHと認識されなくなる直前だろうと思います。これが「PUなし、R=4.7kΩ」を推奨する理由です。
 

ただし、いずれにせよこれはあくまで暫定的な対処法です。正常なI2C通信では必要のない対処法ですのでご注意ください。

<LCD対処法:正式版(ただし上級者向け)>

最後に、LCD(AQM0802)を用いるための正式な方法を紹介します。ただし、これは「表面実装用」と呼ばれるタイプのチップをはんだづけする必要があり、かなりの上級者向けとなりますので、自信のある方のみお試しください。

この方法には、I2CバスリピーターPCA9515ADと呼ばれるチップが必要となります。これをブレッドボードで用いるためには、下記の3点が必要となり、下図のようにはんだづけする必要があります。

なお、上図の「EN」はENABLEの略で、利用時はHIGH(3.3V)に接続します。

PCA9515ADはリンク先の写真で分かる通り、表面実装用と呼ばれるタイプの部品であり、これを基板上にはんだづけするには、やや高度な技術が必要です。そのため、この方法は上級者向けと言えるでしょう。

表面実装用の部品のはんだづけする方法は、例えば下記のYouTube動画が参考になるでしょう。
さらに、この動画にあるように、ピンセットやフラックスもあると良いでしょう。例えば下記のようなものです。
このPCA9515を利用するための概念図が下図です。


この小型液晶AQM0802の新しいロットを使う上で問題になるのが、Raspberry Pi上にあるプルアップ抵抗1.8kΩが小さすぎることです。新しいロットのAQM0802を使う上では10kΩが推奨されています。しかし、Raspberry Piのプルアップ抵抗は基板上に固定されており、そのため、プルアップ抵抗を小さくすることは容易なものの(接続するプルアップ抵抗の数を増やせばよい)、大きくすることは簡単ではありません。

そこで、上図のようにPCA9515を用いてRaspberry Piおよび温度センサ側と小型液晶側を切り離し、左側をプルアップ抵抗1.8kΩで、右側をプルアップ抵抗10kΩで利用できるようにするというわけです。

そのためには、ブレッドボード上で下図のような回路を組みます。図を簡単にするために、小型液晶側のプルアップ抵抗は、小型液晶モジュールのプルアップ抵抗PUを用いることにしました。上の解説「<LCD対処法:予備知識>」を参考に、2箇所のPUに半田を盛り、基板上のプルアップ抵抗を有効にしてください。


p.119:タクトスイッチを用いるプログラムの管理者権限について

タクトスイッチを用いる bb2-04-04-lcd-4modes.py および bb2-04-05-lcd-3modes.py はどのバージョンのNOOBSでも管理者権限が必要と述べましたが、 現在では、これらのプログラムでも管理者権限が不要になりました。興味のある方は試してみてください。

第5章

5章全般:音声認識によるリモコン操作

本章では、リモコン操作を行う方法として、「irsendコマンド」、「タクトスイッチ」、「ブラウザ」の3種類を用いました。さらに、「音声認識」によりリモコン操作を行う方法を応用演習として二種類追加しましたのでご活用ください。

まず、Raspberry Pi上のOSに音声認識用ソフトウェアであるJuliusをインストールする方法です。
もう一つは、インターネット(クラウド)上の音声認識機能をRaspberry Piから利用する方法です。
お好みの方をお試しください。どちらかというと、クラウドを利用する方法の方が難易度が高いと思います。

p.134:エアコンのリモコンの利用について

本書ではエアコンのリモコンからの信号をRaspberry Piで利用する方法については解説しませんでした。しかし、その方法はありますので、下記のページに解説を追加しました。
本書でテレビのリモコンからの信号を利用できるようになった後、興味のある方は取り組んでみてください。

p.141:様々なOSのバージョンでのLIRCの設定

本書発売後よりさまざまなバージョンのRaspbianがリリースされ、そのたびにLIRCの設定法が変化してきました。 ここでは、下記の3つの場合についてLIRCの設定方法を解説します。解説が長くなりますので、それぞれ別ページにて解説することとします。上に記されているものほど新しい OS での実現方法となっています。
  1. Raspberry Pi OS Bookworm / Bullseye / Buster でlircを利用する
  2. kernel 4.19以降を搭載したRaspiban Stretchでlircを利用する
  3. kernel 4.14までを搭載したRaspiban Stretchでlircを利用する
Raspberry Pi OS Bookworm / Bullseye / Buster を用いる最新の1.の方法が最も簡単です。

p.161:irsendコマンドのオプションについて

読者の方からお知らせいただいた内容をまとめます。SHARPのテレビには「クイック起動設定」という設定がある機種があるそうです。 そのクイック起動設定がオフの時、下記のように「-# 2」オプションをつけないとテレビの電源を正常にオンオフできなかったそうです。
irsend -# 2 SEND_ONCE TV power
p.162に記したように、このオプションは信号波形を二回送信するためのものでしたね。

p.165:タクトスイッチを用いるプログラムの管理者権限について

タクトスイッチを用いる bb2-05-01-TV.py はどのバージョンのNOOBSでも管理者権限が必要と述べましたが、 現在では、このプログラムでも管理者権限が不要になりました。興味のある方は試してみてください。

第6章

p.184:12ビットADコンバータMCP3208

6章ではADコンバータとして秋月電子通商で取り扱われている
を用いますが、この在庫が切れている場合、下記のMCP3204を用いても構いません。
ただし、MCP3204はMCP3208に比べて2ピン少ないので、少しだけ回路の読み替えが必要です。図6-14、図6-15を例に、変更箇所を赤で示しますので参考にして下さい。

MCP3204を用いる場合の図6-14の変更点


MCP3204を用いる場合の図6-15の変更点


p.184, Bookworm (Raspberry Pi OS 2023-10-10 以降) および Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について

Raspberry Pi OS 2023-10-10 からはじまったバージョン Bookworm および
Raspberry Pi OS 2021-10-30 からはじまったバージョン Bullseye では
カメラモジュールの利用方法に大きな変更が加えられ、libcamera というライブラリを用いるようになりました。 これは、本書でカメラを用いるプログラムがそのままでは動かなくなる、ということを意味します。

ただし、Bullseye では「Legacy Camera」という、これまでと互換性のあるカメラの利用方法が可能になっています。この Lecgacy Camera を用いれば本書でカメラを用いるプログラムはそのまま動作しますが、 残念ながら Bookworm では Legacy Camera モードは削除されてしまいました。

以上を踏まえて現状をカメラの利用方法について整理すると、以下のようになります。将来を見据えれば、最新の OS で「本書の演習を picamera2 (libcamera) で実行する方法」を用いるのがよいと思います。

32-bit / 64-bit 版 Bullseye および Bullseye本書の演習を picamera2 (libcamera) で実行する方法」で配布しているサンプルファイルを利用する。なお、2023年1月に発売された Camera Module v.3 はこの手法でしか使えません。
32-bit 版 BullseyeLegacy Cameraモードを有効にした上で、本書付属のサンプルファイルを用いる。これが一番簡単。
64-bit 版 BullseyeLegacy Cameraモードを有効にした上で、「本書の演習をウェブカメラで実行する方法」で配布しているサンプルファイルを利用する

さて、Bullseye で Legacy Camera モードを有効にする方法を用いる場合は、以下の方法で「Legacy Camera」のサポートを有効にする必要があります(デフォルトは無効です)。

ターミナルを開いて以下の手順に従うことで、raspi-config により Legacy Camera を有効にします。
  1. 「 sudo raspi-config 」を実行することで raspi-config を起動
  2. キーボードの「↓」キーを2回押し、「Interface Options」を選択してから「Enter」キーを押す
  3. 「I1 Legacy Camera Enable/Disable」があらかじめ選択されているので、「Enter」キーを押す
  4. 「Would you like to enable legacy camera support?」と聞かれるので「←」を一回押すことで「はい」を選択し、「Enter」キーを押す
  5. 「非推奨 (deprecated) であり将来サポートされない」という趣旨のことを言われるが、「了解」が選択された状態で「Enter」キーを押す
  6. raspi-configを起動した状態の画面に戻るので、「TAB」キーを二回クリックし、「Finish」を選択した状態で「Enter」キーを押す
  7. 再起動を促されるので、「はい」が選択された状態で「Enter」キーを押す
以上で、Legacy Camera モードが有効になりますので、あとは上の表に従ってプログラムを利用してください。

p.193:WiringPi2-Pythonを使う演習をpigpioを用いて行う

本書では、ハードウェアPWM信号を出力するために、「WiringPi2-Python」を用いる記述をしていました。一方、本書より後に発売された「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」では、「WiringPi2-Python」ではなく、「pigpio」を用いています。
ここでは本書のハードウェアPWM信号を用いる演習を「pigpio」を用いて行う方法を解説します。それにより、「WiringPi2-Python」のインストールが不要になります。 なお、この項目の解説は「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」の読者向けのものとなりますのでご注意ください。

「WiringPi2-Python」を用いる演習を「pigpio」で実施するには、サンプルファイルの変更が必要になります。 それを簡単に済ませる方法を解説します。本書の通り「WiringPi2-Python」でサンプルプログラムを実行したい方はその必要はありません。
さて、まずターミナルを起動します。そして、本書のサンプルファイルが展開されたディレクトリに移動します。 ユーザーpiのホームディレクトリに展開した方は移動の必要がなく、「bluebacks」ディレクトリに展開した方は「 cd bluebacks 」コマンドを実行するのでした。 そして、以下の2つのコマンドを順に実行します。
(1) wget https://raw.githubusercontent.com/neuralassembly/raspi/master/raspi2-pigpio.patch
(2) patch -p1 -i raspi2-pigpio.patch
以上のコマンドにより、 「WiringPi2-Python」用のプログラムが、すべて「pigpio」用のプログラムに置き換えられます。
なお、もし WebIOPi 用にプログラムを /usr/share/webiopi/htdocs にコピー済だという方は、さらに次の2つのコマンドも順に実行し、 WebIOPi 用のファイルを一旦消してコピーしなおしてください。
(1) suro rm -rf /usr/share/webiopi/htdocs/bb2
(2) cp -r bb2 /usr/share/webiopi/htdocs
あとは、「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で解説されているように、 ハードウェアPWMを使用するプログラムの実行前に「sudo service pigpiod start」コマンドで pigpiod を実行しておくことを忘れないようにしましょう。なお、この注意が必要なのは本書6章と7章のみです。8章ではハードウェア PWM 信号の出力を行うのはサーボドライバーでありRaspberry Pi ではないため、pigpio は必要ではないのです。

p.193:WiringPi2-Python (WiringPi-Python) のインストールコマンド

本書ではハードウェアPWM信号を出力するために、WiringPi2-Python を用いるよう解説しました。その後、WiringPi2-Python のサポートは終了し、互換性がある新バージョンである WiringPi-Python に引き継がれました。本書のサンプルファイルは、この WiringPi-Python を用いるよう2023/3/28 に更新されています。WiringPi-Python のインストール法は以下の通りです。
ターミナルを起動して、以下のコマンドを順に実行しましょう。Python3 用の WiringPi-Python がインストールされます。
(1) sudo apt update
(2) sudo apt install python3-dev python3-setuptools swig
(3) git clone --recursive https://github.com/neuralpi/WiringPi-Python.git
(4) cd WiringPi-Python/WiringPi
(5) sudo ./build
(6) cd ..
(7) swig -python wiringpi.i
(8) sudo python3 setup.py install
なお、一度インストールしたWiringPi-Pythonを上書きインストールしたい場合、上記コマンドの実行前に、ホームディレクトリで下記のコマンドを実行して古いファイルを事前に実行しておきましょう。
sudo rm -rf WiringPi-Python

p.196:WiringPi-Pythonを用いたプログラムの実行について

現在のRaspbianでは、多くの電子工作プログラムの実行には管理者権限が不要になりました。
しかし、WiringPi-Pythonを用いるbb2-06-01-zero.pyやbb2-06-02-pantilt.pyの実行には今でも管理者権限が必要です。
正確には、精度の高いハードウェアPWMを用いるプログラムの実行には管理者権限が必要です。

用いている実行方法により下記のどれかのコマンドの実行が必要となります。
管理者権限のIDLEで実行
sudo idle-python3.7 &
管理者権限のThonnyで実行
sudo thonny &
管理者権限のPython3コマンドで実行
sudo python3 bb2-06-01-zero.py

p.196:pigpio で bb2-06-01-zero.py を動かす場合の注意

ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で用いたpigpio で bb2-06-01-zero.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 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.209:半固定抵抗の回転の向きについて

本書は、Arduino Sidekick Basic Kit付属の半固定抵抗を用い、「右に回すとAD変換後の値が大きくなる」回路を組みました。この回転の向きは、下図のように「半固定抵抗の3.3VピンとGNDへの接続を入れ替える」ことで逆にすることができます。

お使いの半固定抵抗により回転の向きが異なることがありますので、配線の入れ替えにより好みの向きを選択してください。


p.210:pigpio で bb2-06-02-pantilt.py を動かす場合の注意

ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で用いたpigpio で bb2-06-02-pantilt.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-06-02-pantilt.py の実行には管理者権限は不要です。

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

211ページのコマンドはやや長いので、コピー用に再掲します。
raspivid -t 0 -w 640 -h 480 -p 150,150,640,480
なお、このコマンドは Raspberry Pi OS Bookworm および Bullseye では利用できません。7章で紹介した OpenCV をインストールした上で、コマンド「 python3 bb2-07-01-preview.py 」でカメラを映像を確認するのが良いでしょう。

p.222:長いコマンドの入力には注意

p.222からp.223で紹介したmjpg-streamerのインストール用のコマンドは少し長いものが多く、入力を間違うと正しく演習ができなくなってしまいます。

コピーできる形式で以下に再掲しますので、ブラウザで1行ずつコピーして、ターミナルで貼り付けて実行すると確実でしょう。その際、先頭の「(1)」などはコピーする必要はありませんのでご注意ください。

ただし、Bookworm や Bullseye を用いていて、libcamera 対応の mjpg-streamer をインストールする場合はここで紹介したコマンドではなく、「本書の演習を picamera2 (libcamera) で実行する方法」で紹介するコマンドを実行する必要がありますのでページを移動してください。

さて、ここで紹介するコマンドは、libcamera を用いない場合、すなわち、Bullseye で Legacy Camera モードでカメラを利用する場合です。 また、ブラウザでのコピーは「コピーしたい文字をなぞってから『右クリックしてコピー』または『Ctrl+c』」、ターミナルへの貼り付けは「ターミナル上でメニューから『編集→貼り付け』または『Shift+Ctrl+v』」です(ただし、キーボードのCtrlとCapslockを入れ替えている場合、ショートカットキーは効かないようです)。
(1) sudo apt update
(2) sudo apt install libjpeg-dev cmake
(3) git clone https://github.com/neuralassembly/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 を用いている方は、(2) のコマンドを
(2) sudo apt install libjpeg8-dev cmake
としなければならない場合があります。さらに、 Bullseye で Legacy Camera モードを使う場合は、本ページの 「p.184, Bookworm (Raspberry Pi OS 2023-10-10 以降) および Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について」の項目を参考に、Legacy Camera モードを有効にする必要がありますのでその点もご注意ください。 さらに、64-bit版 Bullseye を用いている方は、実行時に「本書の演習をウェブカメラで実行する方法」で配布しているサンプルファイル内の bb2-06-03-stream-webcam.sh を用いる必要があります。

また、前著「Raspberry Piで学ぶ電子工作」をご利用いただいた方は、上記の7つのコマンドの実行前に、下記の2コマンドにより過去にインストールしたmjpg-streamerを一度削除した方が安全かもしれません。ターミナルLXTerminalを起動した直後の状態で順に実行してください。
(1) sudo rm -rf /opt/mjpg-streamer
(2) rm -rf mjpg-streamer

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

224ページのコマンドをコピー用に再掲します。
sh bb2-06-03-stream.sh

p.224:mjpg-streamerの映像が表示されない場合のチェック項目

mjpg-streamerによる映像が表示されない場合、下記をチェックしましょう。
  1. カメラの接続は正しいか(金属が露出した端子面がmicroSDカード側)(→6.1.1で解説)
  2. メニューから「設定」→「Raspberry Piの設定」→「インターフェイス」→「カメラ」が「有効」になっているか(→6.4で解説)
  3. mjpg-streamerのインストールが適切か(→本ページの「p.222:長いコマンドの入力には注意」)
  4. mjpg-steamerの起動命令が適切か(→本ページの「p.224:mjpg-streamerの実行用コマンド」の末尾)
それ以外には「IPアドレスは正しいか」もチェックしてください。これらは、WebIOPiを用いた他の演習と同じですね。

p.229:pigpio でブラウザ操作のカメラ台を動かす場合の注意

ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で用いたpigpio でブラウザ操作のカメラ台を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。その後で WebIOPi を起動するのです。

p.229:本章のプログラムを自動起動したい場合

本章のプログラムを、本書8.4.4で紹介した方法で自動起動し、さらにディスプレイやキーボードをRaspberry Piから外した状態で利用したい方がいらっしゃるかもしれません。

NOOBS 1.9.0 (Raspbian 2016-03-18) までは問題なく動作したのですが、NOOBS 1.9.1 (Raspbian 2016-05-10) 以降は、「Raspbianが黒いコンソール画面で起動する状態」にしないと、ディスプレイを外した状態では正常動作しなくなりました。

それを実現したい場合、設定アプリケーションを起動し、「システム(System)」タブの「ブート(Boot)」項目にある「CLI(To CLI)」にチェックを入れ、再起動してください。画面が黒い「コンソール」状態でRaspbianが起動し、本章のプログラムが自動起動で正常動作するようになります。
なお、Raspbianが黒いコンソールで起動する状態から元に戻したい場合、コンソールで「startx」というコマンドを実行してデスクトップを起動してから、設定アプリケーションの「ブート(Boot)」項目で「デスクトップ(To Desktop)」を選択し、再起動してください。

もし、この「CLI起動によるWebIOPiの自動起動」でもサーボモーターが正常動作しない場合、以下を試してください。 まず、以下のコマンドを実行し、WebIOPiの自動起動を無効にします。
sudo systemctl disable webiopi
次に、以下のコマンドで、/etc/rc.localファイルを管理者権限で編集できる状態にします。
sudo leafpad /etc/rc.local
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
sudo mousepad /etc/rc.local
そして、「exit 0」の上の行に、以下の2行を追記して保存し、再起動してください。
sleep 10
sudo systemctl start webiopi
以上で、/etc/rc.localからWebIOPiが起動され、サーボモーターが正常動作することを期待しています。 なお、「sleep 10」は「10秒待機する」の意味です。 安全のために「10秒」と大きな数値を選びましたが、 私の環境では「sleep 3」(3秒待機)程度でも正常動作しました。 さらに、この方法ではCLI起動ではなくGUI起動のままでもサーボモーターが正常動作しました。

第7章

7章全般:OpenCVのPython3での利用

2019/6/25に本書のサンプルプログラムを更新し、Python3およびOpenCV3でも動作するようにしました。それ以前にダウンロードされた方は、もう一度raspi2-sample.zipをダウンロードし、展開しなおした上でご活用ください。

なお、以下ではOpenCVのインストール方法について下記の2通りの方法を解説します。
  • Python3でOpenCVを利用する場合(最近のOS)
  • Python3でOpenCVを利用する場合(NOOBS 3.0.1 (Raspbian 2019-04-08) までの Stretch)

p.238:Python3 用のOpenCVのインストール用コマンド (最近のOS)

最近のOSで Python3 と OpenCV を組み合わせて利用する方法を解説します。2つのコマンドがありますので、一つ一つ順に実行してください。
sudo apt update
sudo apt install libopencv-dev python3-opencv

p.238:Python3 用のOpenCVのインストール用コマンド (NOOBS 3.0.1 (Raspbian 2019-04-08) までの Stretch)

NOOBS 3.0.1 (Raspbian 2019-04-08) までの Stretchで Python3 と OpenCV を組み合わせて利用する方法を解説します。3つのコマンドがありますので、一つ一つ順に実行してください。
sudo apt update
sudo apt install libopencv-dev libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
sudo pip3 install opencv-python==4.1.1.26

p.239: OpenCVを用いたプログラムの実行時のエラー

NOOBS 3.1.1 (Raspbian 2019-06-20) または NOOBS 3.2.0 (Raspbian 2019-07-10) でインストールした Raspbian Busterをお使いの場合、OpenCV を用いたプログラムを実行すると下記のエラーが出ます。
ImportError: /usr/lib/arm-linux-gnueabihf/neon/vfp/libavcodec.so.58: undefined symbol: bcm_host_is_fkms_active
これは、Raspbian の kernel のバージョンが最新の OpenCV が期待するものより古くなっていることが原因です。

解決方法は以下の2通りの方法どちらかです。
  1. 「sudo apt update」、「sudo apt dist-upgrade」で kernel を最新にする
  2. microSDカードをフォーマットして最新の OS をインストールしなおす
1. の方が簡単ですのでまずこちらを試し、それで問題が出た場合は 2. を試すのが良いでしょう。

p.239:bb2-07-01-preview.pyの実行用コマンド

239ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
python3 bb2-07-01-preview.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.241:映像サイズを大きくする方法について

7章のプログラムでは、カメラから320x240のサイズの映像を取得し、何らかの画像処理を施して映像を表示しています。320x240という映像サイズは、画像処理の計算にかかる時間を考慮して決めています。大きくすると、計算に時間がかかり、映像が滑らかに表示されなくなるでしょう。

しかし、320x240という映像サイズは、表示してみると小さいと感じるのも事実です。ここでは、この映像サイズを大きくする方法を紹介します。 方法は二つ考えられます。
  1. カメラからの映像取得のサイズを 640x480 にする
  2. 画像処理はサイズ320x240の映像に対して行うが、結果の映像は640x480に引き伸ばして表示する
一つ目の方法は、性能が高い Raspberry Pi 4 などでは快適に動作するでしょうが、性能が低い Raspberry Pi Zero などでは動作が遅くなる可能性があります。 その場合は、二つ目の方法を試すと良いでしょう。

では、一つ目の「カメラからの映像取得のサイズを 640x480 にする」方法を解説します。 2023/3/28 以降にダウンロードしたサンプルファイルでは、7章のプログラムの冒頭に下記のように解像度を指定している箇所があります。
(w, h) = (320, 240)
これを下記のように書き換えて保存すれば、縦横2倍のサイズの画像に対して画像処理が行われるようになります。
(w, h) = (640, 480)
次に、二つ目の「画像処理はサイズ320x240の映像に対して行うが、結果の映像は640x480に引き伸ばして表示する」方法を紹介します。
7章のプログラムの末尾付近には、下記の命令があります。
cv2.imshow('frame', stream.array)
という行があります。これは画像を画面に表示する命令なのですが、この命令を削除して下記の2行に置き換えると、320x240の画像が 640x480に引き伸ばして表示されます。(行頭のスペースの数は元の行と同じに統一してください)
dst = cv2.resize(stream.array, (640, 480))
cv2.imshow('frame', dst) 
映像を引き伸ばして表示しているだけなので、画質は良くありませんが、 デモなどで映像を大きく表示したいときは使えると思います。

p.241:7章のGUIプログラムを自動起動したい場合

7章のプログラムはGUIアプリケーションであり、/etc/rc.localに記述しても自動起動できません。 GUIアプリケーションを自動起動する方法を、「GUIアプリケーションの自動起動」にまとめました。

p.244:bb2-07-02-binary.pyの実行用コマンド

244ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
python3 bb2-07-02-binary.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.250:bb2-07-03-cannyedge.pyの実行用コマンド

250ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
python3 bb2-07-03-cannyedge.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.252:bb2-07-04-circle.pyの実行用コマンド

252ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
python3 bb2-07-04-circle.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.257:bb2-07-05-face.pyの実行用コマンド

257ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
python3 bb2-07-05-face.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.263:bb2-07-06-tracking-circle.pyの実行用コマンド

263ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
sudo python3 bb2-07-06-tracking-circle.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.263:pigpio で bb2-07-06-tracking-circle.py を動かす場合の注意

ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で用いたpigpio で bb2-07-06-tracking-circle.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-07-06-tracking-circle.py の実行には管理者権限(sudo)は不要です。

p.268:bb2-07-07-tracking-face.pyの実行用コマンド

268ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
sudo python3 bb2-07-07-tracking-face.py
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。

p.268:pigpio で bb2-07-07-tracking-face.py を動かす場合の注意

ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で用いたpigpio で bb2-07-07-tracking-face.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-07-07-tracking-face.py の実行には管理者権限(sudo)は不要です。

第8章

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

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

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

図8-3

図8-12

図8-16

p.280:ここまでの演習でハードウェア PWM 信号を出力するために pigpio を用いた方への注意

ここまでの演習で、「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」で用いた pigpio でハードウェア PWM 信号を出力した方もいると思いますが、8章では pigpio は用いません。すなわち、service コマンドによる pigpiod の起動は不要ということです。なぜなら、8章ではハードウェア PWM 信号の出力を行うのはサーボドライバーであり Raspberry Pi ではないため、pigpio は必要ではないのです。

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.301: Python 3用smbusモジュールのインストール

現在のRaspbianでは、301ページで行うPython 3用smbusモジュールのインストール作業は不要です。 インストールコマンドを実行しても「すでに最新バージョンです」などと表示されるだけで悪影響はありません。

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

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

しかし、本ページ下部の「p.335:IPアドレスでのURLの指定について」で記しますように、avahiという仕組みを用いると、IPアドレスではなく、下記のようなアドレスでのアクセスが可能になるのでした(ただし、p.335の注釈に示すように制限がありますので注意)。
  • http://raspberrypi.local:8000/bb2/03/
これを用いると、回路から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アドレスを固定する」にまとめましたので、興味のある方は御覧ください

4章の補足で述べたように、LCDにはロットの問題によるトラブルが発生しているので、この方法を用いてLCDなしの回路とする方が良いかもしれませんね。

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

6脚ロボットを制御するRaspberry PiのIPアドレスを知るため、LCDにIPアドレスを表示する方法を紹介しました。このとき、IPアドレスの取得に時間がかかるとIPアドレスではなく「Raspberry Pi」とLCDに表示されてしまいます。その様な場合、/etc/rc.localの適切な位置に「10秒待つ」ことを意味する「sleep 10」という命令を記述して対処する方法を紹介しました。

それでIPアドレスが表示できるようになれば問題ありませんが、現在のRaspbianでは別の方法もありますのでそれを紹介します。

現在のRaspbianの設定アプリケーションでは、下図(左)のように「Network at Boot」という項目があります。この「Wait for network」にチェックを入れて再起動すると、Raspberry Piのネットワークへの接続が完了してから起動が完了するようになります。その結果、「sleep 10」の記述なしでLCDにIPアドレスが表示されるようになる、というわけです。下図(右)のように以前からの設定アプリケーションraspi-configにも「Wait for Network at Boot」という項目が追加されており、「Slow Wait for network connection before completing boot」を選択することで、同様の効果が得られます。

もしこの設定をしてもIPアドレスではなく「Raspberry Pi」とLCDに表示される場合、書籍に書かれているように/etc/rc.localの適切な位置に「sleep 10」と記述する方法を試してみるとよいでしょう。


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.316:6脚ロボットに搭載したままRaspberry Piを用いる

6脚ロボットの演習中、トラブルなどでファイルを変更したくなることはあるものです。 そのような場合、Raspberry Piにもう一度ディスプレイ、キーボード、マウスを接続して変更することになりますが、やや面倒な操作になりますよね。

また、6脚ロボットの演習が終わった後、6脚ロボットに搭載したままRaspberry Piを使いたいという方もいるでしょう。

そこで、6脚ロボットに搭載したままRaspberry Piを使用する方法を2種類紹介します。どちらも、本書の入門編である「カラー図解 最新 Raspberry Piで学ぶ電子工作」の補足ページになっています。
ややハードルが高いかもしれませんが、どちらも身につける価値はある方法です。

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

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

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

p.319:mjpg-streamerの映像が表示されない場合のチェック項目

mjpg-streamerによる映像が表示されない場合、下記をチェックしましょう。
  1. カメラの接続は正しいか(金属が露出した端子面がmicroSDカード側)(→6.1.1で解説)
  2. メニューから「設定」→「Raspberry Piの設定」→「インターフェイス」→「カメラ」が「有効」になっているか(→6.4で解説)
  3. mjpg-streamerのインストールが適切か(→本ページの「p.222:長いコマンドの入力には注意」)
  4. mjpg-steamerの起動命令が適切か(→本ページの「p.318:mjpg-streamerを自動起動するための記述」)
それ以外には「IPアドレスは正しいか」や「アドレスの末尾に『/』(スラッシュ)をつけているか」もチェックしてください。これらは、WebIOPiを用いた他の演習と同じですね。

付録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のダウンロードをブラウザから行いましたが、以下で紹介する方法では、ダウンロード・展開・インストールを全てコマンドから行います。

ターミナルを起動し、以下のコマンドを一つずつ順に実行してください。WebIOPiのダウンロード・展開・インストールが行われます。ブラウザからコマンドを一つずつコピーし、ターミナルへ貼り付けて実行するのが確実でしょう。

コピーはブラウザ上でキーボードで「Ctrl+c」、貼り付けはLXTerminalのメニューから「編集」→「貼り付け」(またはCtrl+Shift+v)です。なお、行頭の「(1)」などの数字はコピーする必要はありませんのでご注意ください。
(0) wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
(1) tar zxf WebIOPi-0.7.1.tar.gz
(2) cd WebIOPi-0.7.1/
(3) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi-pi2bplus.patch
(4) patch -p1 -i webiopi-pi2bplus.patch
(5) sudo ./setup.sh
「Do you want to access WebIOPi over Internet ? [y/n]」という質問が出た場合は、キーボードの n をタイプして Enter するのでした(現在はこの質問は出ません)。

そして、引き続きp.331のコマンドを実行し、起動用ファイルを適切な位置に配置します。このコマンドもやや長いので、コピーできる形式で再掲します。
(1) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi.service
(2) sudo mv webiopi.service /etc/systemd/system/
なお、上記の手順でWebIOPiをインストールしてもp.338の図B-3において「IN/OUT等が現れるはずのボタンに文字が現れず灰色のまま」という場合、まずはWebIOPiの再インストールを試してみましょう。そのためには、ターミナルを起動して下記の2つのコマンドで一つずつ実行し、過去のインストールファイルを一旦削除します。
$ sudo rm -f WebIOPi-0.7.1.tar.gz
$ sudo rm -rf WebIOPi-0.7.1
その後、もう一度上記のコマンドでWebIOPiをインストールします。

それでも症状が改善されない場合、原因はわかりませんが、OSであるRaspbianが壊れているという可能性もないとは言えません。余力があればOSを再インストールしてみることも検討してみると良いでしょう(私自身、OSの再インストールが必要だったことはないのですが、読者の方にはそれで改善したという方が複数名いらっしゃるようです)。

p.332:WebIOPiについての各種コマンド

WebIOPiの起動/停止、自動起動/自動起動の停止、などのコマンドを以下に記します。コピーするなどしてご活用ください。

WebIOPiの起動コマンド
sudo service webiopi start
WebIOPiの停止コマンド
sudo service webiopi stop
WebIOPiが動作確認しているか確認するコマンド
ps ax |grep webiopi 
WebIOPiの自動起動
sudo systemctl enable webiopi
WebIOPiの自動起動の停止
sudo systemctl disable webiopi

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

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

現在のRaspbianでは、IPアドレスを用いずにRaspberry Piにアクセスできますのでその方法を紹介します。なお、この方法でRaspberry Piにアクセスできるのは下記のみです。
  • iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです。ただし、Windows 10にApril 2018 Updateを適用すると、この方法が一時的に使えなくなります。WindowsからiTunesとBonjourを一旦削除してからiTunesをインストールしなおすとまた使えるようになるようです)
  • Mac OS X
  • iPhoneやiPad
Androidスマートフォンでは現時点ではこの方法ではRasbperry Piにはアクセスできないように思われます。

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

なお、Jessie以前のWheezyで同じことを実現したい場合、LXTerminalを起動して下記のように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」というマシン名を変更しておく方法もありますが、ここでは省略します。

p.339:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー

339ページでは、本書のサンプルファイルを/usr/share/webiopi/htdocsディレクトリへコピーするという作業を行います。 この作業は重要であり、これに失敗すると、以後の演習が期待通りに動作しません。そこで、コピーして利用できるよう、 そのコマンドをここに再掲します。 ターミナルソフトウェアLXTerminalを起動して、下記の2コマンドを一つずつ順に実行してください。
sudo chown -R $USER /usr/share/webiopi/htdocs
cp -r bb2 /usr/share/webiopi/htdocs
なお、本書のサンプルファイルをbluebacksディレクトリに展開した方は、上記2コマンド実行の前に「cd bluebacks」コマンドを実行して bluebacksディレクトリに入り、その後2コマンドを実行するようにしてください。

p.341:/etc/webiopi/config の myscript行

WebIOPiを用いる演習では、設定ファイル /etc/webiopi/config の[SCRIPT]セクションに、Pythonスクリプトの場所を示す行を記す必要があります。 記述に間違いがあるとWebIOPiが起動しませんので、コピーできるように正しい記述の例を以下に記しておきます。「01」の部分を演習によって変更する必要があります。
myscript = /usr/share/webiopi/htdocs/bb2/01/script.py
なお、この行を記述した後に WebIOPi が起動しなくなった場合、行の記述し間違い以外には、
  • サンプルファイルを /usr/share/webiopi/htdocs ディレクトリにコピーしていない
という原因もありえます。その場合、本ページ上部の「p.339:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー」を参照してください。

p.343:コマンドでのプログラムの実行について

p.343にて、本書のプログラムをターミナルでコマンドで実行する方法が記されています。本ページは、すべてのプログラムを python3 で実行するよう方針を変更しましたので、プログラムの実行例は
python3 bb2-02-01-led.py
となります。

本書の演習を picamera2 (libcamera) で実行する方法

1. はじめに

Raspberry Pi OS 2023-10-10 からはじまったバージョン Bookworm および
Raspberry Pi OS 2021-10-30 からはじまったバージョン Bullseye では
カメラモジュールの利用方法に大きな変更が加えられ、libcamera というライブラリを用いるようになりました。 これは、本書でカメラを用いるプログラムがそのままでは動かなくなる、ということを意味します。

ただし、Bullseye では「Legacy Camera」という、これまでと互換性のあるカメラの利用方法が可能になっています。この Lecgacy Camera を用いれば本書でカメラを用いるプログラムはそのまま動作しますが、 残念ながら Bookworm では Legacy Camera モードは削除されてしまいました。

そこで、本ページでは、Legacy Camera に頼らずに最新の OS で本書の演習を実行する方法を解説します。具体的には、libcamera ライブラリを利用する Python モジュールである picamera2 を使ってプログラムを実行します。

本書のサンプルプログラムは picamera の旧バージョンを使って書かれていました。しかし、picamera2 は picamera とは互換性がありませんので、picamera2 用に書き換えられたプログラムをダウンロードして利用することになります。

2. 準備

サポート環境は Bookworm および Bullseye 以の 32-bit または 64-bit 版の Raspberry Pi OS です。Bullseye の場合は、なるべく新しいバージョンを用いましょう。そうしないと、本ページで利用する picamera2 (python3-picamera2) がインストールされていないことがあるからです。

また、Bullseye の場合、Legacy Camera モードは無効にしておく必要があります。OS インストール直後の状態ではあらかじめ無効になっています。一度有効にしてしまった方は、 ターミナルを開いて以下の手順に従うことで、raspi-config により Legacy Camera モードを無効にしましょう。
  1. 「 sudo raspi-config 」を実行することで raspi-config を起動
  2. キーボードの「↓」キーを2回押し、「Interface Options」を選択してから「Enter」キーを押す
  3. 「I1 Legacy Camera Enable/Disable」があらかじめ選択されているので、「Enter」キーを押す
  4. 「Would you like to enable legacy camera support?」と聞かれるので「→」キーで「いいえ」が選択された状態にし、「Enter」キーを押す
  5. 「Legacy camera support is disabled」と表示されるので、「了解」が選択された状態で「Enter」キーを押す
  6. raspi-configを起動した状態の画面に戻るので、「TAB」キーを二回クリックし、「Finish」を選択した状態で「Enter」キーを押す
  7. 再起動を促されるので、「はい」が選択された状態で「Enter」キーを押す
以上で、Legacy Camera モードが無効になります。

次に、お使いのカメラモジュールのバージョンを把握してください。2023年3月現在、Raspberry Pi のカメラモジュールにはバージョン1から3があり、下図のような外観をしています。
左から、バージョン1(基板が四角)、バージョン2(基板の角が丸く、レンズ周辺が黒)、バージョン3(基板の角が丸く、レンズ周辺が銀)です。基板上にもバージョンの記載がありますね。

後でダウンロードして頂くプログラムでは、このカメラモジュールのバージョンにより設定が変わる箇所があります。

3. ダウンロードと準備

それでは、picamera2 を利用するプログラムをダウンロードしましょう。

ターミナルを開き、本書のサンプルファイル(「bb2-」で始まるファイル)が存在するディレクトリに移動してください。 サンプルファイルをホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
cd bluebacks
次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
wget https://github.com/neuralassembly/raspi/raw/master/raspi2-picamera2.zip
unzip raspi2-picamera2.zip
rm raspi2-picamera2.zip
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。Pythonpプログラムのファイル名末尾に全て「-picamera2.py」がついていることに注意してください。
bb2-06-03-stream-libcamera.sh
bb2-07-01-preview-picamera2.py
bb2-07-02-binary-picamera2.py
bb2-07-03-cannyedge-picamera2.py
bb2-07-04-circle-picamera2.py
bb2-07-05-face-picamera2.py
bb2-07-06-tracking-circle-picamera2.py
bb2-07-07-tracking-face-picamera2.py
bb2-07-08-tracking-circle-pca9685-picamera2.py
bb2-07-09-tracking-face-pca9685-picamera2.py
以下では、これらのファイルの使い方を解説していきます。

4. 実行方法

さて、ダウンロードして展開したファイルの使い方を解説していきます。

p.211 raspivid の代替

本書 p.211 では映像を映すために raspivid というアプリケーションを使っています。このアプリケーションは既に動作しませんので、下記のようにターミナルで libcamera-hello を実行するのが良いでしょう。
libcamera-hello -t 0
libcamera-hello が存在しないと言われた場合、下記のコマンドでインストールできます。
sudo apt update
sudo apt install libcamera-apps
なお、libcamera-hello ではなく、以下で使い方を示す bb2-07-01-preview-picamera2.py を実行しても良いです。

p.213 mjpg-streamer の代替

映像配信用に、mjpg-streamer をインストールして用いますが、これも libcamera に対応したバージョンをインストールする必要があります。

libcamera 対応の mjpg-streamer は ArduCAM さんが公開していますが、これをこのまま用いると、 本書のように低解像度 (640x480) の映像を指定したときに以下の問題が現れます。
  • 映像の画質が非常に悪い (カメラモジュール v.1)
  • 映像の範囲が非常に狭い (カメラモジュール v.2 と 3)
この問題を筆者が独自に修整した版をここでは利用することにします。

まず、これまでダウンロードまたはインストールした mjpg-streamer を削除するため、ターミナルを起動して以下のコマンドを実行しましょう。
sudo rm -rf mjpg-streamer /opt/mjpg-streamer
そして、以下の手順で修整済の libcamera 対応 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
インストール後は、上で展開して得られたシェルスクリプト bb2-06-03-stream-libcamera.sh を実行することで mjpg-streamer を起動しますが、 実行前に一つ注意があります。 bb2-06-03-stream-libcamera.sh をテキストディタで開くと以下のような箇所があります。
  LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_libcamera.so -camver 1 -fps 15 -r 640x480 -s 640x480" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" > /dev/null 2>&1&
このうち
-camver 1
の部分が、筆者が修整した部分に関連しており、カメラモジュールのバージョンの数字を指定しています。お使いのカメラモジュールがバージョン 2 か 3 なら、この数字を 2 または 3 に変更し、それからファイルを保存してください。 なお、この数値を 0 にするかあるいは -camver の設定自体を削除すると ArduCAM さんの mjpg-streamer と同じ挙動になります。

保存が済んだら、コマンド
sh bb2-06-03-stream-libcamera.sh
を実行することで mjpg-streamer が起動されます。

7章以降

7章では OpenCV を使う画像処理プログラムを実行します。OpenCV は下記のコマンドでインストールします。
sudo apt update
sudo apt install python3-opencv libopencv-dev
プログラムを実行する際は、「-picamera2」がついたファイルを実行するようにしてください。 例えば、書籍でサンプルファイル「bb2-07-01-preview.py」を実行する箇所があります。その場合、「bb2-07-01-preview.py」ではなく「bb2-07-01-preview-picamera2.py」を実行するようにする、ということです。

7章の各プログラムの実行コマンドを以下に列挙しますので、必要に応じてコピーなどしてご活用ください。
python3 bb2-07-01-preview-picamera2.py

python3 bb2-07-02-binary-picamera2.py

python3 bb2-07-03-cannyedge-picamera2.py

python3 bb2-07-04-circle-picamera2.py

python3 bb2-07-05-face-picamera2.py

python3 bb2-07-06-tracking-circle-picamera2.py

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

python3 bb2-07-08-tracking-circle-pca9685-picamera2.py

python3 bb2-07-09-tracking-face-pca9685-picamera2.py
なお、libcamera.so.0.X.X のバージョンに関するエラーが出た場合、下記のコマンドで libcamera-dev と python3-picamera2 を更新すると良いかもしれません。
sudo apt update
sudo apt install libcamera-dev python3-picamera2
以上、お疲れさまでした。