2023年3月29日水曜日

書籍で用いたコマンドおよび補足情報(Pi Zero~Pi 4までの古い情報)

より新しい情報

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

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

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

本ページで表示するコマンドの利用方法

本ページには、本書の演習を実行するために必要なコマンドを全て記し、さらに、本書への補足情報を記していきます。コマンドを本ページからコピーして実行することにより、書き写すことによるミスの恐れがなく確実に実行できます。

本ページのコマンドをコピーにより活用するためには、まずRaspberry Pi上のブラウザ(Chromium)で本ページを開きます。

そして、コピーしたいコマンドをマウスでなぞり色を反転してください。その状態からそのコマンドをコピーするには下記の二つの方法のうちどちらかを実行してください。
  • 色を反転した領域をマウスで右クリックして「コピー」を選択する
  • キーボードの「Ctrl」キーを押しながら「c」キーを押す(Ctrl-c)
そして、コピーされたコマンドをターミナルソフトウェアに貼り付けるには、下記の三つの方法のうちどれかを実行してください。
  • LXTerminalのメニューから「編集」→「貼り付け」を選択する
  • LXTerminal上でキーボードの「Ctrl」キーと「Shift」キーを押しながら「v」キーを押す(Ctrl+Shift+v)
  • LXTerminal上でマウスのホイールを押し込む(ただし、この方法は正確には「コピーされた文字を貼り付ける」のではなく「マウスで色が反転された文字を貼り付ける」という動作になります)
いずれかの方法でLXTerminalにコマンドが貼り付けられたら、そのままキーボードの「Enter」キーを押せばコマンドが実行されます。

なお、複数のコマンドが複数行にわたって連続して書かれている場合、コピー、貼り付け、実行はコマンド一つごとに行ってください。

2章

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

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

p.33, microSDカードの容量について

書籍では、容量が16GB以上のmicroSDカードを推奨しました。しかし、2023年10月にリリースされたOSでは、16GBでは容量が足りなくなることを確認しています。容量が32GB以上のmicroSDカードを用意して下さい。

p.49, Raspberry Pi Zero W 系の機種に対する周辺機器の取り付け

Raspberry Pi Zero W 系の機種へ周辺機器を取り付けて電源を入れる方法は以下のページをご覧ください。

3章

p.65, 秋月電子通商のパーツセット

本書用の秋月電子通商のパーツセットは、以下のリンク先で購入できます。

5章

p.128, 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 版 Bookworm および 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.129, Raspberry Pi Zero WH にカメラモジュールを取り付ける方法

Raspberry Pi Zero WH にカメラモジュールを取り付ける方法以下のページをご覧ください。

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

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

p.132, mplayer のインスト―ルコマンド

以下のコマンドは、インストール可能なソフトウェアのリストを更新します。
sudo apt update
以下のコマンドで、mplayerをインストールします。
sudo apt install mplayer
途中で「続行しますか?」や「検証なしにこれらのパッケージをインストールしますか?」と質問された場合、それぞれで[y]をタイプしたあと[Enter]キーを押して続行しましょう。

p.133, mplayer の実行コマンド

プログラムの存在するディレクトリ(フォルダ)で以下のコマンドを実行すると、test.mp3 というサンプル音声を再生することができます。音が鳴らない場合は引き続き以下もお読みください。
mplayer test.mp3
なお、サンプルプログラムを bluebacks ディレクトリ(フォルダ)に保存した場合は、上記コマンドを実行する前に以下のコマンドを実行して bluebacks ディレクトリ内に移動する必要があります。
cd bluebacks

p.134, 音声の出力先を変更する方法

音声を HDMI ケーブル経由ではなく、Raspberry Pi の基板上のイヤフォンジャックから聞きたい場合、デフォルトでは音が鳴らないことがあります。 イヤフォンジャックから鳴らすための方法は、OSのバージョンにより異なります。

<2023-10-10版以降の Raspberry Pi OS をご利用の場合(Bookworm)>

もし、デフォルトでピンジャックから音が出ていない場合、以下の指示に従ってください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
  1. ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く
  2. キーボードの「↓」キーを五回押し、「6 Advanced Options」にフォーカスを合わせる
  3. キーボードの「Enter」キーを押し、「6 Advanced Options」に入る
  4. キーボードの「↓」キーを六回押し、「A7 Audio Config」にフォーカスを合わせる
  5. キーボードの「Enter」キーを押し、「A7 Audio Config」に入る
  6. キーボードの「上」キーを一回押し、「1 PulseAudio」にフォーカスを合わせる
  7. キーボードの「Enter」キーを押し、「1 PulseAudio」を選択する
  8. キーボードの「Enter」キーを押し、「了解」を選択する
  9. キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる
  10. キーボードの「Enter」キーを押すと、再起動され設定が有効になる


<2020-12-02版およびそれ以降の Raspberry Pi OS をご利用の場合(Bullseye)>

2020-12-02版およびそれ以降の Raspberry Pi OS をご利用で、なおかつイヤフォンジャックから音が鳴らない場合、raspi-configというコマンドで音声の出力先をイヤフォンジャックに切り替えます。 以下の手順に従ってください。
  1. ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く
  2. キーボードの「Enter」キーを押し、「1 System Options」に入る
  3. キーボードの「↓」キーを一回押し、「S2 Audio」にフォーカスを合わせる
  4. キーボードの「Enter」キーを押し、「S2 Audio」の設定画面に入る
  5. キーボードの「↓」キーを一回押し、「1 Headphones」にフォーカスを合わせる
  6. キーボードの「Enter」キーを押し、「1 Headphones」を選択する
  7. キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる
  8. キーボードの「Enter」キーを押し、raspi-config の設定画面を終了する

以上で、下記コマンドで
mplayer test.mp3
イヤフォンジャックから音声が出るようになります。

<2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合>

次は、2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合で、なおかつイヤフォンジャックから音が鳴らない場合です。 音声を再生するコマンドを以下に変えるとイヤフォンジャックから音が鳴ります。 「-ao alsa:device=hw=1,0」が「イヤフォンジャックからの再生」を意味します。「-ao alsa:device=hw=0,0」なら「HDMIからの再生」です。
mplayer -ao alsa:device=hw=1,0 test.mp3

<2020年2月までの Raspbian をご利用の場合>

2020年2月までの Raspbian をご利用の場合、ターミナルで一度以下のコマンドを実行すると、以後「mplayer test.mp3」コマンドでイヤフォンジャックから音が鳴るようになります。
amixer cset numid=3 1
なお、末尾の「1」がイヤフォンジャックからの音声出力を意味し、「0」なら自動認識、「2」ならHDMIからの音声出力を意味します。

p.134, 05-05-sw-mp3.pyをイヤフォンジャックからの音声出力で実行する

プログラム 05-05-sw-mp3.py をイヤフォンジャックからの音声出力で実行したい場合の補足です。 やはり、OSのバージョンにより方法が異なります。

<2020-12-02版およびそれ以降の Raspberry Pi OS、または2020年2月までの Raspbian をご利用の場合>

2020-12-02版およびそれ以降の Raspberry Pi OS、または2020年2月までの Raspbian をご利用の場合、上で行った「イヤフォンジャックから音を鳴らす設定」を行っていれば、 デフォルトのままの 05-05-sw-mp3.py で音を鳴らすことができます。「デフォルトのままの 05-05-sw-mp3.py 」とは、 12、13行目が以下の状態になっているものです。
            args = ['mplayer', 'test.mp3']
            #args = ['mplayer', '-ao', 'alsa:device=hw=1,0', 'test.mp3']

<2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合>

2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合、プログラム 05-05-sw-mp3.py に対して以下を実行してください。

まず、Thonny でプログラムを開くと、12、13行目に以下の行が見つかります。
            args = ['mplayer', 'test.mp3']
            #args = ['mplayer', '-ao', 'alsa:device=hw=1,0', 'test.mp3']
一つ目の行が実際に実行される行であり、二つ目の行は「#」があるので無効な行です。これを、以下のように「#」の有無が逆になるよう編集してファイルを保存してください。
            #args = ['mplayer', 'test.mp3']
            args = ['mplayer', '-ao', 'alsa:device=hw=1,0', 'test.mp3']
以上により、2020-5-27版および2020-8-20版の Raspberry Pi OS で 05-05-sw-mp3.py をイヤフォンジャックからの音声出力で実行できるようになります。

6章

p.144:半固定抵抗の回転の向きについて

本書では、半固定抵抗として秋月電子通商の「半固定ボリューム 10kΩ」を用いて解説をしています(パーツセットに含まれるものです)。

半固定抵抗は、製品の種類によって、AD変換により得られた値が大きくなる回転の向きが異なることがあります。

そのような場合、下図のように、3.3VとGNDへの接続を逆にすると良いでしょう。

7章

p.165, 接続されている I2C デバイスのアドレスを表示するコマンド

接続されている I2C デバイスのアドレスを表示するコマンドは以下の通りです。
i2cdetect -y 1

p.178, LCD へ文字を表示するプログラムの実行コマンド

ターミナルから 07-02-LCD.py を実行するコマンドは以下の通りです。付録C.3「タブによる補完」を学ぶと、ターミナルでのプログラムの実行が格段に楽になりますので興味のある方は参考にしてください。
python3 07-02-LCD.py
なお、サンプルプログラムを bluebacks ディレクトリに保存した場合は、上記コマンドを実行する前に以下のコマンドを実行して bluebacks ディレクトリ内に移動する必要があります。
cd bluebacks

p.179, LCD へ文字を表示するプログラムをコマンドライン引数つきで実行するコマンド

python3 07-02-LCD.py 'test'

8章

p.203, 用いるモータードライバ

本書では「DRV8835使用ステッピング&DCモータドライバモジュール」というモータードライバを用います。 本書のパーツセットを購入する際、本書の旧版用のパーツセットを購入してしまうと、 TA7291P というモータードライバが同梱されています。手元にこのモータードライバしかないという場合、 「旧版との違いについて」ページにある TA7291P 用の回路の配線図を参考にしてください。

なお、「DRV8835使用ステッピング&DCモータドライバモジュール」が品切れの場合でも、 このモータードライバが同梱された本書のパーツセットは入手可能なことがありますのでチェックしてみてください。

p.217, pigpiod の開始・停止・再起動コマンド

pigpiod の開始・停止・再起動コマンドはそれぞれ以下の通りですので、必要なコマンドをコピーしてご利用ください。
sudo service pigpiod start
sudo service pigpiod stop
sudo service pigpiod restart

9章

p.228, WebIOPi のインストールコマンド

WebIOPi のインストールコマンドは下記の通りです。全てのコマンドが長いので、一つずつ順番にコピーして確実に実行していきましょう。なおコピーの際、先頭の「(1)」、「(2)」などの数字を含めないよう注意してください。
(1) wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
(2) tar zxf WebIOPi-0.7.1.tar.gz
(3) cd WebIOPi-0.7.1/
(4) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi-pi2bplus.patch
(5) patch -p1 -i webiopi-pi2bplus.patch
(6) sudo ./setup.sh
なお、(6) のコマンド終了後に 「Do you want to access WebIOPi over Internet ? [y/n]」 という質問が出た場合は、キーボードの n をタイプして Enter するのでした(現在はこの質問は出ません)。

WebIOPi のインストールが終了したらそのまま以下の 2 つのコマンドも一つずつコピー&貼り付けにより確実に実行しましょう。
(1) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi.service
(2) sudo mv webiopi.service /etc/systemd/system/
なお、一度 WebIOPi のインストールに失敗するなどして、もう一度やり直したい場合、以下の 2 つのコマンドをコピー&貼り付けにより順番に実行し、WebIOPi のファイルを一度削除してからインストールコマンドを再実行しましょう。
(1) sudo rm -f WebIOPi-0.7.1.tar.gz
(2) sudo rm -rf WebIOPi-0.7.1

p.230, WebIOPi の起動コマンド

sudo service webiopi start

p.230, WebIOPi が起動されているか確認するためのコマンド

ps ax |grep webiopi 

p.231, WebIOPi の停止コマンド

sudo service webiopi stop

p.232, WebIOPi を自動起動するためのコマンドとその解除コマンド

sudo systemctl enable webiopi
sudo systemctl disable webiopi

p.234, IP アドレスを調べるためのコマンド

ifconfig

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

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

以下の環境では、IPアドレスを用いずに「raspberrypi.local」のような名前でRaspberry Piにアクセスできます。
  • iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです)
  • macOS
  • iPhoneやiPad
上記の環境では、ブラウザのアドレス欄に例えば下記のように入力すればIPアドレスを用いずにアクセスできます。
  • http://raspberrypi.local:8000/bb/01/
これは、Raspberry Pi OS上で動作しているavahiというソフトウェアの働きによります。

p.241, サンプルファイルを WebIOPi のフォルダにコピーするコマンド

このコマンドを実行し忘れると、9章、10章の演習を実行できませんので確実に実行しましょう。 2つのコマンドがありますので、 1つずつ順番に実行してください。サンプルファイルが存在するフォルダで実行する必要がありますので、サンプルファイルを bluebacks フォルダに保存した方は、事前に「cd bluebacks」コマンドを実行しておく必要があります。
sudo chown -R $USER /usr/share/webiopi/htdocs
cp -r 09-samples/bb /usr/share/webiopi/htdocs

p.242, WebIOPi の設定ファイルを管理者権限のテキストエディタで開くコマンド

sudo mousepad /etc/webiopi/config
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) より前の OS ではテキストエディタとしてleafpadではなくmousepadを用います。
sudo leafpad /etc/webiopi/config

p.243, WebIOPi のパスワードを変更するためのコマンド

sudo webiopi-passwd

p.245, WebIOPi の設定ファイルに追加する内容

こちらの記述も、間違えると9章、10章の演習を実行できません。具体的には、記述間違いにより WebIOPi が起動しなくなります。そのため、コピー&貼り付けにより確実に記述するのが良いでしょう。
myscript = /usr/share/webiopi/htdocs/bb/01/script.py
なお、この行を記述した後に WebIOPi が起動しなくなった場合、行の記述し間違い以外には、
  • サンプルファイルを /usr/share/webiopi/htdocs ディレクトリにコピーしていない
という原因もありえます。その場合、本ページ上部の「p.241, サンプルファイルを WebIOPi のフォルダにコピーするコマンド」を参照してください。

10章

p.287, /etc/rc.local を管理者権限のテキストエディタで開くコマンド

sudo mousepad /etc/rc.local
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) より前の OS ではテキストエディタとしてleafpadではなくmousepadを用います。
sudo leafpad /etc/rc.local

p.287, IPアドレスをLCDに表示するために /etc/rc.local の「exit 0」の行の上に記入するコマンド

python3 /home/pi/07-02-LCD.py $_IP
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/07-02-LCD.py $_IP」となる、ということです。

また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
python3 /home/pi/bluebacks/07-02-LCD.py $_IP
上と同様に、「pi」は自分のユーザー名に置き換えてください。

p.291, シャットダウンプログラムの自動実行のために /etc/rc.local の「exit 0」の行の上に記入するコマンド

末尾の「&」も忘れずにコピーしましょう。
python3 /home/pi/10-01-sw-poweroff.py &
上と同様に、「pi」は自分のユーザー名に置き換えてください。

なお、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
python3 /home/pi/bluebacks/10-01-sw-poweroff.py &
上と同様に、「pi」は自分のユーザー名に置き換えてください。

p.292:キャタピラ式模型のメンテナンス

キャタピラ式模型を長く使っていると、だんだん動作が安定しなくなってくることがあります。例えば「右のキャタピラは正常動作するが、左はなかなか動かない」などです。

もちろん、「ジャンパーワイヤーが抜けていないか」など、回路の配線をまずはチェックすべきです。 しかし回路の配線に問題がなかった場合、どこに注意してメンテナンスすべきかを以下に記します。上から順にチェックしていきましょう。
  1. 電池の残量不足ではないかチェック:基本ではありますが、まずはここからチェックしましょう。
  2. ジャンパワイヤのチェック:ジャンパワイヤの抜き差しをする際、持ち手ではなくケーブルを引っ張ることを繰り返すと中で断線することがあります。断線したかどうかは外から見ただけではわかりません。断線が疑われるジャンパワイヤは捨ててしまった方がよいでしょう。
  3. モーターの軸が空回りしていないかチェック:モーターの軸にはピニオンギアが取り付けられています。ピニオンギアが劣化してゆるくなり、モーターの軸が空回りすることがしばしば起こります。これはモーターをギアボックスから取り外してみないとわかりません。ピニオンギアがゆるくなっていた場合、「AO-7005 8Tピニオンセット白(10個)」などを購入して交換しましょう。
  4. ギアボックスで空回りしているシャフトがないかチェック:ギアボックスの作成の際、イモネジを六角レンチで締めてシャフトを固定している部分があります。そこが緩んで空回りしていないかチェックしましょう。
  5. ブレッドボードのチェック:ブレッドボードを長くつかっていると、なんらかの理由でブレッドボード内部の抵抗が大きくなりモーターがあまり回転しなくなることがあります。筆者は複数回そのような経験をしています。安価なもので良いのでテスターを購入すると内部の抵抗の大きさをチェックできます。内部の抵抗が大きく計測されたブレッドボードは消耗品と考えて捨ててしまった方がよいでしょう。
  6. モーターのチェック:上のどの問題にも該当しなかった場合、モーターに問題がある可能性があります。新品の「AO-1001 FA-130タイプノーマルモーター」を購入して交換してみるのも手です。
  7. モータードライバーのチェック:上のどの問題にも該当しなかった場合、モータードライバに問題がある可能性があります。新品のモータードライバーを購入して交換してみるのも手です。

p.293, mjpg-streamer のインストールコマンド

mjpg-streamer のインストールコマンドは下記の通りです。全てのコマンドが長いので、一つずつ順番にコピーして確実に実行していきましょう。

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

さて、ここで紹介するコマンドは、libcamera を用いない場合すなわち、Bullseye の Legacy Camera モードでカメラを利用する場合です。 コピーの際、先頭の「(1)」、「(2)」などの数字を含めないよう注意してください。
(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 を用いている方は、本ページの 「p.128, Bookworm (Raspberry Pi OS 2023-10-10 以降) および Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について」の項目を参考に、Legacy Camera モードを有効にする必要がありますのでその点もご注意ください。 さらに、64-bit版 Bullseye を用いている方は、実行時に「本書の演習をウェブカメラで実行する方法」で配布しているサンプルファイル内の 10-02-stream-webcam.sh を用いる必要があります。

また、一度 mjpg-streamer のインストールに失敗するなどして、もう一度やり直したい場合、以下の 2 つのコマンドをコピー&貼り付けにより順番に実行し、mjpg-streamer のファイルを一度削除してからインストールコマンドを再実行しましょう。
(1) sudo rm -rf /opt/mjpg-streamer
(2) rm -rf mjpg-streamer

p.294, mjpg-streamer の自動実行のために /etc/rc.local の「exit 0」の行の上に記入するコマンド

sh /home/pi/10-02-stream.sh
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「sh /home/kanamaru/10-02-stream.sh」となる、ということです。

また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
sh /home/pi/bluebacks/10-02-stream.sh
上と同様に、「pi」は自分のユーザー名に置き換えてください。

付録

p.308, サンプルファイルの展開先(図B-4)

/home/pi/bluebacks
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上の記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「/home/kanamaru/bluebacks」となる、ということです。

p.310, nano の設定ファイル .nanorc に記す内容

set tabsize "4"
set tabstospaces

p.310, vi の設定ファイル .vimrc に記す内容

set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4

p.312, 日本語入力ソフトウェアのインストールコマンド

日本語入力ソフトウェアのインストールについて、これまで本書では ibus-mozc のインストールをお勧めしてきましたが、OS の更新に伴い メニューバー上での挙動がおかしい、などの不具合が増えてきましたので、 別のソフトウェアである fcitx-mozc に切り替えた方が良いかもしれません。

まず、インストール済の ibus-mozc を削除するには以下のコマンドを実行します。
sudo apt remove ibus-mozc ibus
その後 Raspberry Pi を再起動することで ibus-mozc の削除が完了します。

そして、fcitx-mozc のインストールは下記のコマンドで行います。
sudo apt update

sudo apt install fcitx-mozc
再起動後、半角/全角キーや Ctrl+スペースキーにより、日本語入力をオンオフできます。

p.313, 日本語フォントのインストールコマンド

sudo apt install fonts-vlgothic

補足PDF

PDF9, 06-03-volume.py で音声のボリュームを変更する

プログラム 06-03-volume.py で音声のボリュームを変更する場合、音声出力先や、用いているOSのバージョンにより方法が異なりますので以下の指示に従ってください。

<2022年 9 月以降の Raspberry Pi OS をご利用の場合>

2022年 9 月以降の Raspberry Pi OS をご利用の場合、音声出力先がHDMI、イヤフォンジャックのどちらの場合も、ファイル 06-03-volume.py の変更が必要となります。

まず、イヤフォンジャックから音声を出力したい場合、本ページ「p.134, 音声の出力先を変更する方法」の方法に基づき、音声の出力先をイヤフォンジャックに変更して下さい。HDMI経由で音声出力したい場合はデフォルトのままで構いません。
すると、音声の出力先がどちらであっても、以下のデフォルトのコマンドで音声が鳴ります。
mplayer test.mp3
また、音声の出力先がどちらであっても、06-03-volume.py に対して変更が必要になります。Thonny でプログラムを開くと 57、58行目に以下の行が見つかります。
            args = ['amixer','-q','cset','numid=1',vol]
            #args = ['amixer','-q','-c1','cset','numid=1',vol]
これを以下のように変更して保存して下さい。「numid=1」の部分を「numid=3」に変更しています。
            args = ['amixer','-q','cset','numid=3',vol]
            #args = ['amixer','-q','-c1','cset','numid=1',vol]
以上で、06-03-volume.py によりボリュームを変更可能になります。

<2020-12-02版から 2022年春までの Raspberry Pi OS をご利用の場合>

2020-12-02版から 2022年春までの Raspberry Pi OS をご利用の場合、音声出力先がHDMI、イヤフォンジャックのどちらの場合も、ファイル 06-03-volume.py の変更が必要となります。

まず、イヤフォンジャックから音声を出力したい場合、本ページ「p.134, 音声の出力先を変更する方法」の方法に基づき、音声の出力先をイヤフォンジャックに変更して下さい。HDMI経由で音声出力したい場合はデフォルトのままで構いません。
すると、音声の出力先がどちらであっても、以下のデフォルトのコマンドで音声が鳴ります。
mplayer test.mp3
また、音声の出力先がどちらであっても、06-03-volume.py に対して変更が必要になります。Thonny でプログラムを開くと 57、58行目に以下の行が見つかります。
            args = ['amixer','-q','cset','numid=1',vol]
            #args = ['amixer','-q','-c1','cset','numid=1',vol]
これを以下のように変更して保存して下さい。元からあった行に「#」をつけて無効化し、その上に一行追加しています。
            args = ['amixer','-q','-D','pulse','set','Master',vol]
            #args = ['amixer','-q','cset','numid=1',vol]
            #args = ['amixer','-q','-c1','cset','numid=1',vol]
以上で、06-03-volume.py によりボリュームを変更可能になります。

<2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合>

2020-5-27版および2020-8-20版の Raspberry Pi OS で音声出力先をイヤフォンジャックにしたい場合、 書籍に記述してある通りに実行します。すなわち、音声再生コマンドを以下のコマンドに置き換えるのでした。
mplayer -ao alsa:device=hw=1,0 test.mp3
そして、06-03-volume.py に対しては、変更が必要となるのでした。Thonny でプログラムを開くと、57、58行目に以下の行が見つかります。
            args = ['amixer','-q','cset','numid=1',vol]
            #args = ['amixer','-q','-c1','cset','numid=1',vol]
一つ目の行が実際に実行される行であり、二つ目の行は「#」があるので無効な行です。これを、以下のように「#」の有無が逆になるよう編集してファイルを保存してください。
            #args = ['amixer','-q','cset','numid=1',vol]
            args = ['amixer','-q','-c1','cset','numid=1',vol]
以上で、06-03-volume.py によりボリュームを変更可能になります。

PDF 11, デジタル温度計の自動実行のために /etc/rc.local の「exit 0」の行の上に記すコマンド

末尾の「&」も忘れずにコピーしましょう。
python3 /home/pi/07-03-LCD-temp.py &
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/07-03-LCD-temp.py &」となる、ということです。

また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
python3 /home/pi/bluebacks/07-03-LCD-temp.py &
上と同様に、「pi」は自分のユーザー名に置き換えてください。

PDF 29, DCモーターとサーボモーターを同時に使うとサーボモーターが不安定になる場合(図10-13)

図10-13のようにDCモーターとサーボモーターを同時に使うとサーボモーターが不安定になる場合があります。

これは、DCモーターの回転により発生するノイズがサーボモーターに影響を与えているためです。この問題に対する簡単な対処法は、下図のように サーボモーターの電源用配線を、Raspberry Pi の 5V ピンに接続することです。
このような接続をすると、今度はサーボモーターの負荷により Raspberry Pi が不安定になる可能性がありますが、以下の条件が満たされれば Raspberry Pi は安定して動作します。
  • サーボモーターにあまり大きな負荷をかけない。この演習の例では、Raspberry Pi のカメラモジュールという軽いものを動かすだけなので問題にはなりにくいでしょう
  • Raspberry Piを動作させるためのモバイルバッテリーの流せる電流量(「A」や「mA」で表示されているもの)が大きい。筆者は Raspberry Pi 4 に対して 3.0 A のバッテリーを用意しました
なお、この DC モーターによるノイズの問題に関しては、本書p.213の図8-12のように、DCモーターに3つのコンデンサを取り付けることでも改善が期待できます。

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

1. はじめに

注意!)本ページは、Pi 4 までに対応した古いサンプルファイル (raspi1a-sample.zip)を用いながら、picamera2 (libcamera) を利用する、という趣旨のページです。
本書の内容を Pi Zero ~ Pi 5 で実行する方法」に従って Pi 5 対応の新しいサンプルファイル(raspi1a-sample-pi5.zip)を用いる場合は本ページの内容は不要です。
ご注意ください。

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 を利用するプログラムをダウンロードしましょう。

ターミナルを開き、本書のサンプルファイル(数字で始まるファイル)が存在するディレクトリに移動してください。 サンプルファイルをホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
cd bluebacks
次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
wget https://github.com/neuralassembly/raspi/raw/master/raspi1a-picamera2.zip
unzip raspi1a-picamera2.zip
rm raspi1a-picamera2.zip
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。 mjpg-streamer を起動するためのスクリプトはシェルスクリプト (*.sh) から Python プログラムに変更されております(*.py)。
05-04-sw-camera-picamera2.py
10-02-stream-libcamera.py
以下では、これらのファイルの使い方を解説していきます。

4. 実行方法

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

p.128 タクトスイッチをカメラのシャッターに (5.6)

5.6章ではタクトスイッチをカメラのシャッターにするため、プログラムでカメラの映像を表示する必要がありました。

そのプログラムの picamera2 版が 05-04-sw-camera-picamera2.py です。このプログラムを実行するには、画像処理用のライブラリである OpenCV をインストールする必要があります。 ターミナルを起動して下記のコマンドを実行すると、OpenCV をインストールできます。
sudo apt update
sudo apt install python3-opencv
プログラムは、下記のコマンドで(または Thonny で)実行します。
python3 05-04-sw-camera-picamera2.py
なお、libcamera.so.0.X.X のバージョンに関するエラーが出た場合、下記のコマンドで libcamera-dev と python3-picamera2 を更新すると良いかもしれません。
sudo apt update
sudo apt install libcamera-dev python3-picamera2


p.292 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
mjpg-streamerの実行用ファイルは、書籍から名称が変わり 10-02-stream-libcamera.py です。以前まではこのファイルは拡張子が sh のシェルスクリプトでしたが、Python によるスクリプトに変更しました。
理由は、libcamera 対応の mjpg-streamer が時折異常終了するため(典型的には 30 分おきくらい)、2秒おきに実行状況をチェックして必要に応じて mjpg-streamer を再起動させるためです。

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

その後、mjpg-streamer の実行コマンドを /etc/rc.local の「exit 0」の行の上に追記することになります。記す内容は下記の通りです。
python3 /home/pi/10-02-stream-libcamera.py &
ただし、「pi」の部分は自分のユーザー名に変更する必要があります。

なお、サンプルファイルを bluebacks ディレクトリに展開したのならば、追記するコマンドは下記です。
python3 /home/pi/bluebacks/10-02-stream-libcamera.py &
こちらも、「pi」の部分は自分のユーザー名に変更する必要があります。

なお、最新の OS では、起動時に実行するコマンドを列挙するファイル /etc/rc.local は存在しません。その場合、上記の記述をする前に、以下のコマンドを実行して /etc/rc.local を作成しておいてください。
wget https://raw.githubusercontent.com/neuralassembly/raspi/refs/heads/master/rc.local

chmod a+x rc.local

sudo mv rc.local /etc
この3コマンドを実行してファイル /etc/rc.local を作成したら、書籍通りに /etc/rc.local へコマンドを追記できるようになります。

以上、お疲れさまでした。