2023年3月30日木曜日

本書の補足情報(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を見ても日本語が表示されます。

2章

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

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

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

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

本書の出版以降、以下のように新しいバージョンのNOOBSがリリースされています。

2016/9/23NOOBS 1.9.3Jessie
2016/10/5NOOBS 2.0.0
2016/11/29NOOBS 2.1.0
2017/2/27NOOBS 2.2.0
2017/3/3NOOBS 2.3.0
2017/4/10NOOBS 2.4.0
2017/6/23NOOBS 2.4.1
2017/7/5NOOBS 2.4.2
2017/8/17NOOBS 2.4.3Stretch
2017/9/8NOOBS 2.4.4
2017/11/29NOOBS 2.4.5
2018/3/14NOOBS 2.6.0
2018/3/14NOOBS 2.7.0
2018/4/18NOOBS 2.8.0
2018/4/24NOOBS 2.8.1
2018/6/27NOOBS 2.8.2
2018/10/11NOOBS 2.9.0
2018/11/15NOOBS 3.0.0
2019/4/8NOOBS 3.0.1
2019/6/24NOOBS 3.1.1Buster
2019/7/10NOOBS 3.2.0
2019/9/30NOOBS 3.2.1
2020/2/7NOOBS 3.3.0
2020/2/14NOOBS 3.3.1
2020/5/27Raspberry Pi OS 2020-05-27
2020/8/20Raspberry Pi OS 2020-08-20
2020/12/2Raspberry Pi OS 2020-12-02
2021/1/11Raspberry Pi OS 2021-01-11
2021/3/4Raspberry Pi OS 2021-03-04
2021/5/7Raspberry Pi OS 2021-05-07
2021/10/30Raspberry Pi OS 2021-10-30Bullseye
2022/1/28Raspberry Pi OS 2022-01-28
2022/4/4Raspberry Pi OS 2022-04-04
2022/9/6Raspberry Pi OS 2022-09-06
2022/9/22Raspberry Pi OS 2022-09-22
2023/2/21Raspberry Pi OS 2023-02-21
2023/5/3Raspberry Pi OS 2023-05-3
2023/10/10Raspberry Pi OS 2023-10-10Bookworm
2023/12/5Raspberry Pi OS 2023-12-5

OSのベースバージョンはJessie→Stretch→Buster→Bullseye→Bookwormと移り変わっています。

全てのバージョンで動作確認しています。以前のバージョンを使いたい方は下記のJAISTのミラーサイトで適切な日付をたどると見つけられます。

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

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


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

p.48:パッケージやfirmwareを更新したRaspbianについて

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

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

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

4章

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

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

Thonny Python IDEはpython3用のプログラムを実行するための環境です。本書のプログラムはPython3での実行をサポートしていますので問題なく実行できます。 Python 3用ツールのインストール法は本ページで解説されておりますので注意して本ページをお読みください。
さて、メニューの下図に示されている「Thonny Python IDE」をマウスでクリックするとThonny Python IDEが起動します。


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

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


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

p.85: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.85: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 &
を実行します。

5章

p.123, 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.128, 音声の出力先を変更する方法

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

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

2020-12-02版およびそれ以降の Raspberry Pi OS をご利用で、なおかつイヤフォンジャックから音が鳴らない場合、raspi-configというコマンドで音声の出力先をイヤフォンジャックに切り替えます。恐らく今後はこの方法が主流となるでしょう。
以下の手順に従ってください。

ターミナルで下記のコマンドを実行してください。
sudo raspi-config
すると、下図のような設定画面が開きます。
上の画面上で、キーボードの「Enter」キーを押すことで、以下の「1 Systems Option」の設定画面に入ります。
上の画面上でキーボードの「↓」キーを一回押すことで、下図のように「S2 Audio」にフォーカスを合わせ、「Enter」キーを押すことで「S2 Audio」の設定画面に変わります。
下図が「S2 Audio」の設定画面です。
上の画面上でキーボードの「↓」キーを一回押すことで、下図のように「1 Headphones」にフォーカスを合わせ、「Enter」キーを押すことでヘッドフォン(つまりイヤフォンジャック)を出力先にします。
すると下図のように「sudo raspi-config」実行直後の画面に戻ります。
上の画面上で「TAB」キーを二回押すことで、下図のように「Finish」にフォーカスが合います。そこで「Enter」キーを押すことで、「sudo raspi-config」による設定が終了します。
以上で、下記コマンドで
mpg321 test.mp3
イヤフォンジャックから音声が出るようになります。

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

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

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

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

p.128, 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行目が以下の状態になっているものです。
            args = ['mpg321', '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行目に以下の行が見つかります。
            args = ['mpg321', 'test.mp3']
この行を以下のように変更して保存してください。
            args = ['mpg321', '-a', 'hw:1,0', 'test.mp3']
以上により、2020-5-27版および2020-8-20版の Raspberry Pi OS で 05-05-sw-mp3.py をイヤフォンジャックからの音声出力で実行できるようになります。

6章

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

本書では、半固定抵抗として秋月電子通商の「半固定ボリューム 10kΩ」を用いて解説をしています。

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

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

7章

7章全般:本書のプログラムで利用できるLCDについて

2017年4月に、秋月電子通商さんよりRaspberry Piで利用可能なLCDのモジュールキットが販売開始され、さらに2017年6月にはその完成版が販売開始されましたのでここで紹介します。なお、キットの方は狭いピッチ(ピン間隔)の半田付けが必要になりますので、半田付けにある程度慣れている方向けとなります。通常は完成品を推奨します。
商品へのリンクは下記になります。

組み立てキットに含まれるパーツを図示したのが下図(左)となっています。ピンソケットが2種含まれていますので、お好みの方を半田付けします。 完成品にはLCDを立てて使うためのピンソケットがあらかじめ取り付けられています。

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

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

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

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


また、本書で紹介したLCDとは異なり、文字の表示サイズが8文字×2行となっていることも見て取れるでしょう。 本書のプログラムを8x2の液晶で用いるためには、少しだけ変更が必要です。LCDを用いるプログラムには下記のようにLCDのコントラストや文字数を設定している行があります。これらは16x2の液晶であることを示しています。
contrast = 36 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 16 # LCDの横方向の文字数
display_lines = 2   # LCDの行数
これを下記のように横方向の文字数を8に変更して保存すれば完了です。お好みで、コントラストの大きさを変更するのも良いでしょう。
contrast = 36 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2   # LCDの行数

8章

p.199:モータードライバ TA7291Pについて

モータードライバのTA7291Pはすでに生産が終了しており、今後入手が困難になることが予想されます。 代替品として、下記を選びました。TA7291Pを入手できないときはお試しください。
このモータードライバは、ピンヘッダを自分で半田付けするキットとなっています。完成状態は下図の通りです。


このモータードライバを用いて図8-11と同等の回路を組むには下図のようにします(クリックすると拡大されます)。上で述べたように、電池ボックスは電池三本用のものをお使いください。



p.209:WiringPi-Pythonのインストールコマンド

書籍に記したように、WiringPi-Pythonをインストールするためのコマンドをコピーできる形で掲載します。

なお、一度WiringPi-Pythonのインストールなどに失敗している方は、以前のインストール用ファイルを削除してからの方が安全です。そのためには、ターミナルを起動して下記のコマンドを実行します。
sudo rm -rf WiringPi-Python
そして、WiringPi-Pythonのインストール用コマンドを順に実行していきます。 下記のコマンドをブラウザで1行ずつコピーし、ターミナルソフトウェアLXTerminalへ貼り付けて1つ1つ実行するとトラブルが少ないでしょう。コピーはブラウザ上でキーボードで「Ctrl+c」、貼り付けはLXTerminalのメニューから「編集」→「貼り付け」(またはCtrl+Shift+v)です。なお、行頭の「(1)」などの数字はコピーする必要はありませんのでご注意ください。

また、長いコマンドのため横方向にスクロールさせないとコマンド全体をコピーできないものがあることにも注意してください。
(2020.10.23: python3用のみをインストールするようコマンドを変更しました)
(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

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

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

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

9章

p.223: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
(5)の処理が終わると最後に「Do you want to access WebIOPi over Internet ? [y/n]」という質問が出た場合は、キーボードの n をタイプして Enter するのでした(現在はこの質問は出ません)。

その後、下記のコマンド(p.226のコマンド)を実行し、起動用ファイルを適切な位置に配置します。これでWebIOPiのインストールは完了です。
(1) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi.service
(2) sudo mv webiopi.service /etc/systemd/system/
なお、上記の手順でWebIOPiをインストールしてもp.234の図9-5において「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.226: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.236:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー

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

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

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

p.259:モータードライバ TA7291Pについて

上の「p.199:モータードライバ TA7291Pについて」で述べたように、モータードライバ TA7291Pの入手が難しいときは下記の代替品をお使いください。
このモータードライバを用いて図9-12と同等の回路を組むには下図のようにします(クリックすると拡大されます)。上で述べたように、電池ボックスは電池三本用のものをお使いください。



10章

p.278:モータードライバ TA7291Pについて

上の「p.199:モータードライバ TA7291Pについて」で述べたように、モータードライバ TA7291Pの入手が難しいときは下記の代替品をお使いください。
このモータードライバを用いて図10-4と同等の回路を組むには下図のようにします(クリックすると拡大されます)。上で述べたように、電池ボックスは電池三本用のものをお使いください。


さらに、このモータードライバを用いて図10-6と同等の回路を組むには下図のようにします(クリックすると拡大されます)。こちらも電池ボックスは電池三本用のものをお使いください。




p.285:/etc/rc.localに追加する1行

LCDにIPアドレスを表示するプログラムの自動起動のために/etc/rc.localに追加する行は下記の通りです。必要に応じてコピーしてご活用ください。書籍から「sudo」コマンドを省略しました。
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.288:/etc/rc.localに追加する1行

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

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

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

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

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

p.288:キャタピラ式模型に搭載したままRaspberry Piを用いる

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

また、キャタピラ式模型の演習が終わった後、キャタピラ式模型に搭載したままRaspberry Piを使いたいという方もいるでしょう。

そこで、キャタピラ式模型に搭載したままRaspberry Piを使用する方法を2種類紹介したページを作成しましたので、リンクを貼ります。
ややハードルが高いかもしれませんが、どちらも身につける価値はある方法です。

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

mjpg-streamerをインストールするためのコマンドやや長く、写し間違えると正しくインストールが行なわれません。 下記にコピーできる形で再掲しますので、ブラウザで表示して1行ずつコピーし、ターミナルソフトウェアLXTerminalへ貼り付けて1つ1つ実行していけばトラブルが減るでしょう。

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

さて、ここで紹介するコマンドは、libcamera を用いない場合、すなわち、Bullseye で Legacy Camera モードでカメラを利用する場合です。コピーはブラウザ上でキーボードで「Ctrl+c」、貼り付けはLXTerminalのメニューから「編集」→「貼り付け」(またはCtrl+Shift+v)です。なお、行頭の「(1)」などの数字はコピーする必要はありませんのでご注意ください。
(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.123, 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のインストールに一度失敗し、その後何度試行錯誤してもうまくいかない、という方は、上記の7つのコマンドの実行前に、下記の2コマンドにより過去にインストールしたmjpg-streamerを一度削除した方が安全かもしれません。ターミナルLXTerminalを起動した直後の状態で順に実行してください。
(1) sudo rm -rf /opt/mjpg-streamer
(2) rm -rf mjpg-streamer
また、mjpg-streamerの自動起動のために/etc/rc.localに追加する行は下記の通りです。必要に応じてコピーしてご活用ください。書籍から「sudo」コマンドを省略しました。
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.292:mjpg-streamerの映像が表示されない場合のチェック項目

mjpg-streamerによる映像が表示されるためには、下記の条件が満たされている必要があります。

(1) カメラが正しく接続されていること
(2) カメラが有効に設定されていること
(3) mjpg-streamerが正しくインストールされていること
(4) mjpg-streamerが起動されていること
(5) 適切なPCやスマートフォンなどのブラウザからmjpg-streamerにアクセスしていること
(6) ブラウザから適切なアドレスにアクセスされていること

それぞれが正しく実行されているか確認するためのチェック項目は下記のようになります。

(1') 金属が露出した端子面がmicroSDカード側を向いて接続されており、
 コネクタが適切に押し込まれていることを確認してください。

(2') デスクトップのメニューから「設定」→「Raspberry Piの設定」→「インターフェイス」
 →「カメラ」が「有効」になっていることを確認してください。

(3') 補足ページ「p.290:mjpg-streamerのインストールコマンド」に掲載したのコマンドを
 正しく(コピーするなどして)実行したことを確認してください。
 /opt/mjpg-streamer/mjpg_streamer というファイルが存在すれば問題ないでしょう。
 一つ目の「mjpg-streamer」はディレクトリ名、二つ目の「mjpg-streamer」は
 ファイル名です。
 二つ目の「mjpg-streamer」が存在しなければインストールに失敗しています。

(4') mjpg-streamerの起動法は下記の2通りあります。
 (a) ターミナルで「sh 10-02-stream.sh」を実行する
 (b) /etc/rc.local に記述して自動起動する
 まずは(a)の手動での起動が成功するか確認しましょう。
 mjpg-streamerは起動済みだと思ったら、
 ターミナルで「ps ax | grep mjpg」と実行してそれを確認してみましょう。
 下記のように表示されれば起動に成功しています。細かな数字は人によって異なります。
 
 2393 pts/0 Sl 0:00 /opt/mjpg-streamer/mjpg_streamer -i input_raspicam.so
   -fps 15 -q 50 -x 640 -y 480 -o output_http.so -p 9000 -w /opt/mjpg-streamer/www
 2545 pts/0 S+ 0:00 grep --color=auto mjpg
 
 一方、下記のような表示しかなければ起動に失敗しています。
 ここまでの内容を見直す必要があります。
 
 2545 pts/0 S+ 0:00 grep --color=auto mjpg

(5')「適切なPCやスマートフォンなど」とは、本書図9-1に記されているように、
 Raspberry Piと同じネットワークに属しているPCやスマートフォンのことです。
 スマートフォンの場合は本書図9-1のようにWifiで
 Raspberry Piと同じネットワークに続している必要があります。
 自信がなければRaspberry PiのChromiumブラウザからアクセスするのが確実ですので、
 まずはRaspberry Piからのアクセスに成功することを目指しましょう。

(6') 図10-8のテスト用画面を確認するためにブラウザに記すアドレスは
  http://xxx.xxx.xxx.xxx:9000/ です。
 もちろん、「xxx.xxx.xxx.xxx」の部分はRaspberry Piに割り当てられているIPアドレスで
 読み替える必要があります。

付録B

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

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) と安心です。



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

p.308にて、本書のプログラムをターミナルでコマンドで実行する方法が記されています。 本ページは、すべてのプログラムを python3 で実行するよう方針を変更しましたので、プログラムの実行例は
python3 04-01-led.py
となります。管理者権限を表す sudo も不要になっていますのでご注意ください。

付録E

p.312:Windows + Bonjourによるraspberrypi.localへの接続について

付録に記したように、WindowsにiTunesをインストールすると、Bonjourというソフトウェアがインストールされ、その働きにより、「raspberrypi.local」という名称でのRaspberry Piへのアクセスが可能になるのでした。しかし、Windows 10 に対して2018年4月にリリースされたApril 2018 Updateを適用すると、この方法でのアクセスが一時的にできなくなるようです。

WindowsからiTunesとBonjourを一旦削除してからiTunesをインストールしなおすとまた使えるようになるようですのでこの問題に直面した方はお試しください。

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

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

2020-5-27版および2020-8-20版の Raspberry Pi OS で音声出力先をイヤフォンジャックにしたい場合、音声再生用のコマンドは下記になります。
mpg321 -a hw:1,0 test.mp3
そして、06-03-volume.py に対しては、変更が必要となるのでした。Thonny でプログラムを開くと、57行目に以下の行が見つかります。
            args = ['amixer','-q','cset','numid=1',vol]
この行を以下のように変更してファイルを保存してください。
            args = ['amixer','-q','-c1','cset','numid=1',vol]
以上で、06-03-volume.py によりボリュームを変更可能になります。

PDF11:spidevを用いてAD変換を行うプログラムについて

追加PDFでは、spidevとADコンバータMCP3208を用いてAD変換を行うプログラム06-04-spidev.pyを紹介しました。
kernel 4.9.43以降 (NOOBS 2.4.5 (Raspbian 2017-11-29) 以降) のRaspberry Piでは、執筆時の06-04-spidev.pyはそのままでは動作しません。具体的には、kernelの変更により、プログラム内で「spi.max_speed_hz = 1000000」のように最大周波数の設定が必要になったのです。

2019/6/25にアップロードしたサンプルファイル (raspi1-sample.zip) にはこの問題に対応したバージョンが含まれていますので、エラーが出るという方は公式サイトよりraspi1-sample.zipをダウンロードしなおしてください。

PDF17:LDCの文字コード表

本書で紹介した2つのLCDでは、PDF17図7-8の文字コード表の一番左の列(0x06~0x0f)の文字は表示されないようです。ご了承ください。

PDF20:Python3用WiringPi-Pythonのインストールコマンド

Python3用WiringPi-Pythonのインストールコマンドは、Python2用と共通としてこのページ上部にある「p.209:WiringPi-Pythonのインストールコマンド」に記載されていますのでご参照ください。

PDF31: カメラつきキャタピラ式模型の回路について

キャタピラ式模型を動作させるとき、回路を取り付けたサーボモータが不安定に変動する場合、サーボモーターへの電源(サーボモーターの赤色ケーブルへの接続)を電池の+極からとるのではなく、 Raspberry Piの 5V 端子(3.3V 端子の隣)から取るのも手です。

モーター類をRaspberry Piに直接接続するのはあまりよくありませんが、サーボモーター1個動かす程度ならばRaspberry Piは不安定にならないだろう、という期待に基づいています。
もしそうすることで Raspberry Pi の動作が不安定になるのならば、やはりサーボモーターへの電源は電池からとるように戻すべきです。

PDF32: WebIOPiからWiringPi-Pythonを呼び出すプログラムの自動起動について

「bb/07」や「bb/08」のように、WebIOPiからWiringPi-Pythonを呼び出すプログラムを自動起動する場合、 PDF32に記したように、Raspbianの起動方法をGUIからCLIにしないと正常動作しない(サーボモーターが動かない)ことがあります。

もし、この「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 service webiopi start
以上で、/etc/rc.localからWebIOPiが起動され、サーボモーターが正常動作することを期待しています。 なお、「sleep 10」は「10秒待機する」の意味です。 安全のために「10秒」と大きな数値を選びましたが、 私の環境では「sleep 3」(3秒待機)程度でも正常動作しました。 さらに、この方法ではCLI起動ではなくGUI起動のままでもサーボモーターが正常動作しました。

21 件のコメント:

  1. ラズベリーパイ初心者です
    本書の手順に従って、2.4.9の電源を切る方法まで進め、電源を切ったあと、SDカードを本体から取り外しました。再びラズベリーパイが起動するか確認のため、SDカードを取付ないまま、電源を本体に差し込みましたが、ディスプレイには何も表示されませんでした。そこで電源を外して、今度はSDカードをを取り付けた状態で電源を入れましたが、ディスプレイには何も表示されませんでした。2度目に起動するときはもうセットアップに使用したSDカードは不要なのでしょうか?それとも、SDカードは本体に取り付けたままにするのでしょうか?
    また、現状、再度SDカードへの書き込みからやり直したほうが良いのでしょうか?是非ともご教示ください。使用機種はPI3Bです。
    よろしくお願いします。

    返信削除
    返信
    1. 行って頂いたインストール作業により、SDカードにはOSであるRaspbianが書き込まれた状態になっています。ですから、Raspberry Piを使う場合は常にOSインストール済のSDカードを取り付けておく必要があります。

      SDカードを取り付けずにRaspberry Piの電源を入れると、おっしゃる通り、ディスプレイには何も表示されません。これは、Raspberry PiにOSが存在しないためです。この場合、そのまま電源を取り外してください。

      また、Raspberry PiにSDカードを抜き差しする場合は、行って頂いたように、Raspberry Piから電源を取り外した状態で行う必要があります。

      さて、「再度SDカードへの書き込みからやり直したほうが良い」かどうかです。

      一度そのSDカードでOSは起動したようですので、そのOSインストール済SDカードをさした状態でRaspberry Piに電源を入れれば、何かは表示されるのではないでしょうか?(虹色の四角形であるとか、縦にスクロールする文字列など)

      何も表示されない場合、SDカードを取り付けていないのと同じ状態、すなわちSDカードが認識されていない状態に思えます。また、OSがインストールされていない空のSDカードを取り付けても、やはりディスプレイには何も表示されないでしょう。

      OSインストール済SDカードを取り付けた状態でOSが起動したならば問題ありません。
      しかし、何かが表示されたもののそれが途中で止まってしまった場合、SDカードにOSを再インストールする必要があることが多いです。その場合、一度「SDメモリカードフォーマッター」という無料ソフトでSDカードをフォーマットしてからでないとOSの再インストールはできませんのでご注意ください(書籍にも補足ページに記述があります)。

      さらに、私は最近経験していませんが、Raspberry Piと相性の悪いSDカードが存在するそうです。OSの起動が途中で止まるようなケースがある場合、異なるメーカーのSDカードを試した方が良いのですが、今回の場合に該当するかはわかりません。

      以上、お試しください。

      削除
  2. 最近RaspberryPiを購入し、金丸様の著書で楽しく勉強させて頂いており
    ありがとうございます。質問が2点ございます。

    ■1.P210 8.6.2 サーボモータの角度制御について
    サーボモータはSG90を使ったのでサポートページのサンプルソース
    08-04-sevo.pyで動作する事を確認しましたが、回転角が180°ではなく
    160°くらいしか回転しませんでした。

    SG90のデータシートをみると、0°でDuty比7.25%(1.45ms)、+90°で
    12%(2.4ms)、-90°で2.5%(0.5ms)とあったので、08-04-servo.pyの
    修正を下記の通りしました。

    <変更点>
    41行目 servo_minを36→26
    42行目 servo_maxを102→122

    結果、回転角度は前より広がった気がするのですが、サーボモータの角度
    が小刻みに震える現象が発生してしまいました。

    PWM波形をUSBオシロスコープで見たところ、例えば+90°の位置の場合
    パルス幅が2.4msと2.0msを交互に繰り返していました。

    原因切り分けのために、servo_duty_hwpwm関数を使わず、メイン処理の
    while文に0°となるPWM波形出力コマンドのみで下記のよう実行しました。

    <メイン処理部>
    while True:
    wiringpi.pwmWrite(18, 74) ※7.25ms/100*1024
    sleep(0.2)

    結果wiringpiのPWM出力メソッドだけでも小刻み現象が改善されず、
    オシロで見るとパルス幅1.45msと2msを交互に繰り返していました。
    解決策があればご教示頂けないでしょうか?

    ちなみに動作環境はRaspberry Pi 3B+、NOOBS Lite V3.1、
    Thony Python IDEです。


    ■2.組み込みプログラムの勉強の仕方について
    本書内のreadadc、setup_7032、read_adt7410などのオリジナル関数
    ですが、コードを眺めてやっている事は何となく分かります。
    が、自作や修正はできません。初学者に最初は必要ないと本にも
    ありましたが、ADT7410を13bitではなく16bitで読み取ったり、
    8x2LCDの上部アイコンを表示させたりなどなど、色々やってみたい
    事はあるのですがデータシートを見たり、WEB検索しても難しくてやり方が
    分からずもどかしい思いをしています。本書の関数変更からやってみようと
    思ってますがちょっと今はハードルが高そうで挫折しそうです。

    レベルの低い質問で恐縮ですが、独学以外で組み込みSWはどういう
    勉強をしていけばスキルアップができるでしょうか?
    (セミナーや本、コミュニティ、メンターを探す、とりあえず難しい
     事はスキップしてできる演習の量をこなすなど)

    返信削除
    返信
    1. まずはサーボモーターについてのご質問から。

      個人的な意見ですが、SG90は値段が安い(400円)かわりに
      品質を犠牲にしているところがありますので、
      トラブルが起こりやすいパーツだと思います。

      例えば、私は以前amazonでSG90の10個セットを複数回購入しましたが、
      1個か2個は不良品が含まれており、捨てざるを得ませんでした。

      また、長期運用をしているとすぐに壊れて交換する必要がある、
      という評判も耳にします。

      ではなぜSG90を使うかというと、
      一個あたり数千円する高品質なサーボモーターを
      使った演習をするのはハードルが高くなるためです。
      そのため、多くの書籍・Webサイトでは
      SG90を学習用として紹介しています。

      書籍ではこのことを
      「壊れやすいが安価な商品を学習用に使い倒す、
      くらいの気持ちで利用する」
      と表現しました。

      さて、以上を踏まえてコメントです。

      >41行目 servo_minを36→26
      >42行目 servo_maxを102→122

      この変更については問題ないと思います。

      私の手元にある複数個のSG90で試したところ、
      どのSG90でも稼働範囲は約180度に広がりました。

      ただし、個体差はあり、いくつかのSG90では、
      -90度または90度に大きく動かしたとき
      モーターがビリビリと震える現象が見られました。
      ですので、あまり大きな角度へと動かさない方が
      SG90は安定であると考えられます。

      なお、「モーターがビリビリと震える現象」が
      見られたとき、PWM信号をオシロスコープで
      確認したところ、波形は安定なままでした。
      ですから、私の場合の「モーターがビリビリと震える現象」は
      モーター内部の機械的な問題と考えられます。

      ご質問で気になったのですが、

      > 結果、回転角度は前より広がった気がするのですが、サーボモータの角度
      > が小刻みに震える現象が発生してしまいました。
      > (中略)
      > wiringpi.pwmWrite(18, 74)
      > (中略)
      > 結果wiringpiのPWM出力メソッドだけでも小刻み現象が改善されず、

      上記の「小刻みに震える現象」は
      サーボモータを(-90度や90度だけではなく)どの角度に
      セットしても震えるようになった、ということでしょうか?

      もしそうだとして、さまざまな現象があり得るので断定はできませんが、
      SG90が壊れた可能性もあるのでは、と思います。

      といいますのも、私がSG90をamazonで10個単位で購入した際、
      「壊れている」と判断して捨てていたSG90も、
      「何をしてもSG90が震えている」という状態だったからです。

      ただ、新たにSG90を買いなおすのはお金のかかることですので、
      私としては「壊れている」と断定はできませんことをご了承ください。

      また、他の可能性として、
      「実例で学ぶRaspberry Pi電子工作」
      https://raspibb2.blogspot.com/2015/12/blog-post.html
      「p.296:6脚ロボットの安定性について」に記してあるように、
      モーター用乾電池の本数を3本にして電圧を下げた場合にSG90が安定する
      可能性がないとは言えません。

      ただし、この場合も乾電池3本用電池ボックスが必要になり、
      お金がかかってしまいますので、ご判断はお任せします。

      次に、学習方法についてです。
      こちらはなかなか難しい質問です。

      プログラミングの知識はもちろん必要なのですが、
      電子工作をする際には他にも必要な知識があります。

      個人的には、「数値の10進数、2進数、16進数の相互変換」の知識は
      必須ではないかと思っています。

      例えば、旧書籍の下記ページのコメント欄の末尾で、
      https://raspibb.blogspot.com/2014/11/raspberry-pi.html
      私と読者の方がLCD(AQM0802)へ与える命令について
      データシートをもとに議論していますが、その議論を理解するには
      2進数と16進数の相互変換の知識が不可欠です。
      (なお、上記のLCDのデータシートは下記で入手可能です。
      http://akizukidenshi.com/catalog/g/gP-06669/


      他には、データシートを参考にゼロからプログラムを書くのは
      難しいので、誰かが書いたプログラムを理解することから始めるのが
      良いと思います。

      例えば、Adafuit製センサなどを買うと、公式サイト(英語)に
      チュートリアルやサンプルがありますので、
      それらの動くサンプルをもとに勉強する、というのは良いと思います。
      例えば
      https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi/using-the-python-library
      では、サーボモータを動かすためのボードの使用法やプログラムが解説されています。

      ここまで書いてから気が付いたのですが、
      「独学以外で」と記されていましたね。

      コミュニティ活動など活発にされている方もいると思いますが、
      最終的には個人の力(=独学)になるのでは、と個人的には思っています。
      (ただし、この点は人によって意見が異なるでしょう)

      削除
    2. そういえば、もう一つ気になったのですが、

      > パルス幅が2.4msと2.0msを交互に繰り返していました。



      > オシロで見るとパルス幅1.45msと2msを交互に繰り返していました。

      は、Raspberry PiにSG90を接続した状態で観測したのでしょうか?

      もし、SG90をRaspberry Piから取り外した状態でも
      パルス幅が安定しないのならば、Raspberry Pi側の問題であると思います。

      削除
    3. >もし、SG90をRaspberry Piから取り外した状態でも
      >パルス幅が安定しないのならば、Raspberry Pi側の
      >問題であると思います。

      SG90の信号線を外してラズベリーパイのPWM波形を確認
      してみたところ、正しい波形が出力され、当該SG90を接続
      すると波形が先に申し上げてようにおかしくなりました。
      どうやら先生のご推測の通り、SG90が破損していて、PWM
      波形がSG90の負荷により乱れていたようです。予備のSG90
      を接続してみたところ波形の乱れはなく、正常に動作しま
      した。ありがとうございました。


      勉強方法について、おっしゃる通り誰かが書いた
      プログラムを理解したり、それを可能な範囲で改変して
      みたりするのがよさそうですね。私事ですが現在30代半ば
      で組み込みエンジニアへの未経験転職を検討しており焦って
      効率のよい方法がないかお伺いしてしまいました。やはり
      最終的には独学で一歩一歩前進ですね、ありがとうございます。

      蛇足ですが10章のキャタピラ模型完成しました、説明通り
      に作っただけとはいえ、マイコンでこんな物が作れるという
      のは感動しました。引き続きテキストのソース理解や改変を
      して精進します。ありがとうございました。

      削除
  3. 50の手習いで最近ラズパイ3を購入、金丸様の本で楽しんでいます。

    さて質問がございます。8.6.2の演習で08-04-servo.pyを走らせると下記の通りのエラーとなります。WiringPiのインストールもこの補足に従い、管理者権限で実行しているつもりですが同様のエラーとなります。
    考えられる原因をご教示いただけませんでしょうか?

    Traceback (most recent call last):
    File "/home/pi/08-04-servo.py", line 4, in
    import wiringPi2 as wiringPi
    File "/usr/lib/python3/dist-packages/thonny/backend.py", line 305, in _custom_import
    module = self._original_import(*args, **kw)
    ModuleNotFoundError: No module named 'wiringPi2'

    返信削除
    返信
    1. 恐らく旧版(白黒版)のサポートページから古いサンプルファイル(raspi-sample.zip)をダウンロードされたのでしょう。

      以下のページから、新版(カラー版)用のサンプルファイル(raspi1-sample.zip)をダウンロードし、ファイルを展開しなおしてください。
      http://bluebacks.kodansha.co.jp/books/9784062579773/appendix/

      ダウンロードしたファイルの名前に数字の「1」が含まれる方が新しいファイルです。

      なお、ダウンロードしたファイルを展開して出てくるファイルの名前は旧版、新版で共通となっています。

      ですから、今お手元にある旧版のサンプルファイル、すなわち名前が
      01~10から始まるファイルおよびフォルダ、およびtest.mp3
      を全て削除してから新版のファイルを展開するのが安全です。

      削除
    2. 金丸様 無事に実行できました。ありがとうございました。

      削除
    3. 金丸様

      また質問があります。演習10.4の動作確認ができません。

      :9000/にスマホからアクセスすると「このサイトにアクセスできません」と表示されます。

      mjpg-streamerのインストールがうまくできていないと思われるため
      このページのご説明の通り、
      (1) sudo rm -rf /opt/mjpg-streamer
      (2) rm -rf mjpg-streamer
      を実行したうえで再度インストールしておりますが同様の結果です。

      インストール後、ファイルマネージャーでopt/mjpg-streamer
      のフォルダーを覗くとmjpg-streamer関連の一連のファイルが格納
      されているのは確認しました。

      また、rc.localへの10-02-stream.shについての追記は実施済みです。

      ご教示お願い致します。

      削除
    4. mjpg-streamerによる映像が表示されるためには、下記の条件が満たされている必要があります。

      (1) カメラが正しく接続されていること
      (2) カメラが有効に設定されていること
      (3) mjpg-streamerが正しくインストールされていること
      (4) mjpg-streamerが起動されていること
      (5) 適切なPCやスマートフォンなどのブラウザからmjpg-streamerにアクセスしていること
      (6) ブラウザから適切なアドレスにアクセスされていること

      それぞれが正しく実行されているか確認するためのチェック項目は下記のようになります。

      (1') 金属が露出した端子面がmicroSDカード側を向いて接続されており、
       コネクタが適切に押し込まれていることを確認してください。

      (2') デスクトップのメニューから「設定」→「Raspberry Piの設定」→「インターフェイス」→「カメラ」が
       「有効」になっていることを確認してください。

      (3') 補足ページ「p.290:mjpg-streamerのインストールコマンド」に掲載したのコマンドを
       正しく(コピーするなどして)実行したことを確認してください。
       /opt/mjpg-streamer/mjpg_streamer というファイルが存在すれば大抵は問題ないでしょう。
       一つ目の「mjpg-streamer」はディレクトリ名、二つ目の「mjpg-streamer」はファイル名です。
       二つ目の「mjpg-streamer」が存在しなければインストールに失敗しています。

      (4') mjpg-streamerの起動法は下記の2通りあります。
       (a) ターミナルで「sh 10-02-stream.sh」を実行する
       (b) /etc/rc.local に記述して自動起動する
       まずは(a)の手動での起動が成功するか確認しましょう。
       mjpg-streamerは起動済みだと思ったら、
       ターミナルで「ps ax | grep mjpg」実行してそれを確認してみましょう。
       下記のように表示されれば起動に成功しています。細かな数字は人によって異なります。
       
       2393 pts/0 Sl 0:00 /opt/mjpg-streamer/mjpg_streamer -i input_raspicam.so
           -fps 15 -q 50 -x 640 -y 480 -o output_http.so -p 9000 -w /opt/mjpg-streamer/www
       2545 pts/0 S+ 0:00 grep --color=auto mjpg
       
       一方、下記のような表示しかなければ起動に失敗しています。ここまでの内容を見直す必要があります。
       
       2545 pts/0 S+ 0:00 grep --color=auto mjpg

      (5')「適切なPCやスマートフォンなど」とは、本書図9-1に記されているように、
       Raspberry Piと同じネットワークに属しているPCやスマートフォンのことです。
       自信がなければ、Raspberry PiのChromiumブラウザからアクセスするのが簡単で確実ですので、
       まずはRaspberry PiのChromiumブラウザからのアクセスに成功することを目指しましょう。
       なお、「スマホからアクセス」というのが気になりましたが、スマホは本書図9-1のようにWifiで
       Raspberry Piと同じネットワークに続している必要があります。

      (6') 図10-8のテスト用画面を確認するためにブラウザに記すアドレスは http://xxx.xxx.xxx.xxx:9000/ です。
       もちろん、「xxx.xxx.xxx.xxx」の部分はRaspberry Piに割り当てられているIPアドレスで読み替える必要があります。

      削除
  4. 金丸様
    度重なるアドバイスありがとうございました。
    結局、(1)のカメラの接続でした。
    これで、ほぼ本作の演習は終了しましたが、
    今後、ラズパイ上でpythonを使っていろいろ勉強してみたいと思います。
    それはpythonのプログラムそのものよりもライブラリから用途にあったモジュールを取り込み活用するといったことをより勉強したいのですが、それに合う書籍やムックあるいはwebがあれば教えていただけませんでしょうか?

    返信削除
    返信
    1. 書籍については良く分かりません。

      英語のサイトで良ければ、Adafruitという会社が作っている
      回路モジュールを購入すると、ライブラリとそのチュートリアルが
      公開されているので、ご要望に近いかもしれません。

      例えば、私の
      「実例で学ぶRaspberrry Pi電子工作」
      という書籍で用いたサーボモータードライバーには
      Arafruit自身による
      チュートリアル
      https://learn.adafruit.com/16-channel-pwm-servo-driver/python-circuitpython
      とライブラリ
      https://github.com/adafruit/Adafruit_CircuitPython_PCA9685
      があります。
      (私の書籍ではこのライブラリは使いませんでしたが)

      削除
    2. 金丸様
      重ねて御礼申し上げます。今後もいろいろ勉強してみようと思います。

      削除
  5. ここにコメントして良いのかどうか、自信がありませんが、ラズパイ本の最新版、ラズパイ4対応版に関して、一言、レポートさせてください。ラズパイ4はラズパイ3で解説されていた事は、全て応用できると思っていたのですが、温度センサー7410のプログラムで正しく動作しません。いろいろ頭を悩ませたのですが、プログラムではなく回路に問題がありました。結論から言うとラズパイ4でI2Cセンサーを使う場合、3.3V電源ラインにパスコンを入れないと誤動作する事がわかったのです。ですからテキストP164の回路だけでは動作しません。ラズパイ4は3より3.3Vラインの品質が良くないように思いました。

    返信削除
    返信
    1. コメント頂きありがとうございます。

      その内容に対して私の経験をもとにしたコメントを記します。

      ラズベリーパイ3(以下「3」)からラズベリーパイ4(以下「4」)への
      変更に関してです。
      私の書籍に記した内容の範囲内では、3から4に変更することで
      センサなどのハードウェアが動かなくなったことはありません。

      逆に、ソフトウェアやライブラリが3から4への変更で
      動かなくなることは電子回路ではよくあることです。
      しかし、それはソフトウェアやライブラリの変更で対応できることがほとんどです。

      以上を踏まえまして、テラさんの環境で起こっている可能性があることを想像し、
      以下に記していきたいと思います。
      なお、「OSインストール直後の状態」で実行することを想定しています。

      「4だけで起こりうるトラブル」と
      「3と4の両方で起こりうるトラブル」
      の2通りに分けて列挙していきます。

      ・4だけで起こりうるトラブル(1)

      あまり頻繁に起こることではありませんが、
      テラさんのお持ちの4にハードウェア不良があることはあり得ます。
      私の場合、一度だけ HDMI 端子周りに不良があり、
      4が正常動作しない経験をしたことがあります。

      ・4だけで起こりうるトラブル(2)

      私は、3および4で書籍の全ての回路の動作検証をしていますが、
      そこで使っている4は、約2年前に購入したものです。
      最近の4の製造ロットで回路周りに何か変更があった、
      ということは、(可能性は低いとは思いますが)ないとは言えません。

      さて、「4だけで起こりうるトラブル」の候補は以上で、
      以下は、「3と4の両方で起こりうるトラブル」の可能性を記していきます。

      ・3と4の両方で起こりうるトラブル(1)

      私が動作検証している温度センサADT7410 はやはり数年前に購入したものですが、
      比較的新しいADT7410でトラブルがある、という可能性はないとは言えません。
      以前、小型液晶で「製造ロットが変わったことでラズベリーパイで動かなくなった」
      という経験をしたことがあります。
      ただし、この場合、4だけではなく3でも動かなくなるでしょう。
      (「3でも動かなくなる」ことに関しては以下同様です)

      ・3と4の両方で起こりうるトラブル(2)

      ADT7410 は自分ではんだ付けをするキットですので、
      その組み立てに問題があることはあり得ます。

      ・3と4の両方で起こりうるトラブル(3)

      本書の場合、ブレッドボードとジャンパワイヤで回路を組むわけですが、
      用いる GPIO を数え間違えて正しい回路ができていないことはあり得ます。

      ・3と4の両方で起こりうるトラブル(4)

      ブレッドボードとジャンパワイヤで回路を組みますが、
      ジャンパワイヤの品質が劣化し(内部で断線するなど)、
      回路が正しく動かないことはあり得ます。
      これは私は何度も経験しています。

      ・3と4の両方で起こりうるトラブル(5)

      同様に、ブレッドボードの内部で何らかの劣化が起こり、
      回路が正しく動かなくなることはあります。
      これも私は何度か経験しています。


      以上、思いつくトラブルを列挙してみました。

      もし3をお持ちなのでしたら、
      3でも同じ回路を試してみると、
      問題の切り分けになると思います。

      よろしくお願いします。

      削除
  6. 早速の回答ありがとうございます。私の7410の現象はPi4 だけで発生します。
    Pi3B,Pi-zero, PI-zeroW ,Pi-zero2W では発生しません。2回以上、とっかえ、ひっかえテストし再現しますので、確認ミスではありません。
    またブレッドボードではなくプリント基板ハンダ付け回路です。可能性としては、私がつい最近、秋月電子で入手した個体に何か問題があるのかもしれませんが、他のGPIOピンは正常に動作していますし、ADコンバータ(SPI接続)も正常です。パスコン1ケで解決した状態なので不良とまでは言い切れないかも知れません。
    なお、一つだけテキストの回路と違う点があり、3.3V電源を1ピンではなく17ピンから取った事です。今となっては、なぜ17ピンから取ったのか、記憶にありません。ただこの違いに差があるようには思えません。
    7410の表示数値はプラマイ5℃ほどバラツキますが、外部温度の変化は感じているようなので、ノイズの影響を考えました。念のためプルアップ抵抗3.3Kをつけましたが、効果はなかったですが、センサーの電源(至近)に1μのパスコンを付けたら見事に解決しました。最近ようやくPi4が出回るようになったので、私のように4日間ほど頭を悩ます人が出なけれな良いとの思いで投稿しました。

    なお、Pi3時代はBuster-OS Pi4ではBullseya-OSを使っていますが、7410のトラブルはOSをSWAPしても現象に変化はなく、どちらの場合も1μCAPが解決してくれました。私は今もRaspi 内部で3.3Vを作成する電源回路の差を疑っています。まあ
    解決したので個人的には良い経験だったと思っています。I2CはパラレルGPIOやSPI通信と異なり多くのクロックパルスを使いますので、より電源品質に影響を受けやすいのかなと思っています。

    返信削除
    返信
    1. なるほど。やられていることのイメージが少し湧きました。

      書籍では、下記の秋月電子のモジュールを使用しています。

      https://akizukidenshi.com/catalog/g/gM-06675/

      このモジュールでは、下記PDFにあるように、
      電源部に0.1μFのコンデンサが使われています。

      https://akizukidenshi.com/download/ds/akizuki/AE-ADT7410_aw.pdf

      このコンデンサの有無で、3と4で動作が異なる、
      というイメージでしょうか?

      削除
  7. 私は、表面実装パーツのハンダ付けは苦手なので、同じく秋月のモジュールを使っています。確かにこのモジュールには0.1μが基板に乗っていますね。再度、試してみましたがモジュールのPIN1とPIN4間(最短距離で)に1μを付けると、数字はピタット安定します。0.33μや0.47μではやや不安定さが残ります。CAPなしでは温度センサーとして使い物になりません。
    補足ですが、3.3VをGPIOのPIN1から供給した場合とPIN17から供給した場合の差はありませんでした。以上の確認は、ブレットボードで行いました。ブレッドボートとGPIOの距離は7cmと20cmのフラットケーブルで試しましたが、この距離の影響もないようです。pi3では何の疑いのなく使えていた(16bit分解能でさえ)のですが、Pi4 にはなにか電源回路に弱点があるように思います。

    返信削除
    返信
    1. ありがとうございます。状況がよくわかりました。

      この件に関して今すぐ何かを言うことはできませんが、
      今後、Raspberry Pi 4 やセンサを新規購入する際に
      チェックしてみたいと思います。

      削除
  8. わかりました。ぜひそうしてみてください。今回の件は、かなりNET検索したのですが、どうしてもヒントが見つからず苦労しましたが、幸いうまくいったのでレポートさせてもらった次第です。

    返信削除