2020年12月30日水曜日

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

より新しい情報

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

はじめに

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

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

電子書籍版について

2016年7月、本書の改訂版が発売されるに伴い、kindle版を始めとする電子書籍は
  • 新規の購入はできないが、過去に購入した方はダウンロードできる
という状態に移行しています。新規に電子書籍版を購入されたいという方は、改訂版のものをお求めください。

回路配線図について

回路配線図を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.28: OSインストール法の最新版について

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

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

p.39:NOOBSのバージョン

本書はNOOBS 1.3.10をベースに解説しておりますが、発売以来下記のようにNOOBSの新バージョンがリリースされています。

2014/12/24NOOBS 1.3.11Wheezy
2015/2/2NOOBS 1.3.12
2015/2/18NOOBS 1.4.0
2015/5/11NOOBS 1.4.1
2015/9/24NOOBS 1.4.2Jessie
2015/11/21NOOBS 1.5.0
2016/2/3NOOBS 1.6.0
2016/2/9NOOBS 1.7.0
2016/2/26NOOBS 1.8.0
2016/3/18NOOBS 1.9.0
2016/5/10NOOBS 1.9.1
2016/5/27NOOBS 1.9.2
2016/9/23NOOBS 1.9.3
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/4Raspberry Pi OS 2023-05-3
2023/10/10Raspberry Pi OS 2023-10-10Bookworm
2023/12/5Raspberry Pi OS 2023-12-5

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

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

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


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

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

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

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

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

第3章

p.64:Arduino Sidekick Basic Kitについて

電子工作に必要なパーツを集めたセットの1つとして、本書ではArduino Sidekick Basic Kitを紹介しましたが、この商品は現在千石電商オンラインショップやamazonではバージョン2に切り替わっています。
旧バージョンとの違いは以下の通りのようですが、本書のために用いる際には影響のない変更です。
  • ジャンプワイヤの本数が減っている(50本→25本)
  • LEDの個数が減っている(10個→5個)
  • 抵抗早見表が付属しない
  • 収納用ケース(4仕切り)の追加
  • RGBフルカラーLEDが8mmサイズの大きなものになり、光拡散キャップが不要なパッケージに変更されている
電子工作のセットはこれ以外にも様々なものが販売されております。ここで紹介した「Arduino Sidekick Basic Kit」も含め、どのセットを購入するにせよ本書で必要なパーツが全て揃うわけではないことはあらかじめご了承ください。

さらに下記のような注意がありますので御注意ください。

  • 含まれる半固定抵抗において、値が大きくなる回転の向きが旧版と異なる
    これについては、本ページ「p.145:半固定抵抗の回転の向きについて」の注意をご覧ください
  • 含まれるRGBフルカラーLEDが共通カソード(カソードコモン)である
    共通カソード(カソードコモン)用の回路を作成した上で、書籍の注意に基づきサンプルファイルを編集して用いる必要があります。

p.64:非公認の電子工作キットについて

Amazonにて、本書の名前を冠したキットが販売されているのですが、私や出版社が関わった製品ではありませんし、本書の方法では動作しない電子工作パーツが含まれているようです。本ページではそれらの電子工作パーツのサポートは行えませんので御了承ください。

p.70:5Vピン、3.3Vピン、GPIOに流すことのできる電流について

本書では、Raspberry Pi Model Bの5Vピン、3.3Vピン、GPIOに流せる電流を解説していますが、Model B+以降は5Vから3.3Vへ降圧するレギュレータの効率が上がったことと、Raspberry Pi自体の消費電力が変更になった影響で、このデータが大きく変わっています。 公式情報ではありませんが、インターネット上の議論に基づいたデータを下記にまとめます。参考にしたサイトを表の下に記します。

5Vピン3.3VピンGPIO(1本)GPIO(トータル)
Model BマイクロUSBの電源が流すことのできる電流 - 700mA50mA8mA (注)50mA
Model B+マイクロUSBの電源が流すことのできる電流 - 600mA1000mA - 600mA = 400mA (程度)
Raspberry Pi 2マイクロUSBの電源が流すことのできる電流 - 900mA1000mA - 900mA = 100mA (程度)
(注)デフォルトでの値です。こちらを参考に設定するとこの上限を2mAから16mAまで変化させられるようですが私は未確認です。

参考サイト

p.75:Raspberry Pi Model B+/Raspberry Pi 2/Raspberry Pi 3のGPIOについて

図3-12で解説したように、Model BとModel B+はGPIOポートのピン数が異なり、上から13段目まで(ピン1からピン26まで)が両モデルで共通となっています。本書ではこの共通部分のみを使うようにしておりますので、本書の回路は全てModel BとModel B+の両方で動作します。また、Raspberry Pi 2とRaspberry Pi 3はModel B+と同じピン配置なので、Model B+と同様に回路を作成します。

ただし、ピンを使う際にその「ピンの数え方」に注意しないとModel B+/Raspberry Pi 2/Raspberry Pi 3で間違った回路を作成してしまう可能性がありますので、その点について補足したいと思います。

下図をご覧ください。この図は「Model B」と「Model B+/Raspberry Pi 2/Raspberry Pi 3」におけるGPIO 25の数え方を解説したものです。図のように、GPIO 25を「図の上から(ピン番号の小さいほうから)11番目」のように数えることで、本書の回路図を「Model B+/Raspberry Pi 2/Raspberry Pi 3」でも用いることができます。88ページの図4-4をModel B+/Raspberry Pi 2/Raspberry Pi 3のGPIOポートを用いた図に変更したものが下図の(C)ですので参考にしてください。

また、公式サポートページにて回路の配線図(PDF)の提供を開始しました。「Model B用(26ピン)」と「Model B+およびRaspberry Pi 2用(40ピン)」がありますので、ディスプレイで閲覧するか、印刷するなどしてご活用ください。


第4章

p.89:開発環境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.89: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.89: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 &
を実行します。

p.89:Jessie 以降における、アプリケーション実行時の管理者権限について

Raspbian Wheezyでは、PythonでGPIOにアクセスするプログラムを実行するためには管理者権限が必要でした。すなわち、本書でプログラムを実行する際、
  • ターミナルで「sudo idle &」を実行して起動したIDLEからプログラムを実行
  • ターミナルで「sudo python プログラムファイル名」を実行して起動
のどちらかの方法を用いる場合がほとんどでした。
Raspbian Jessie 以降は、PythonでGPIOにアクセスするプログラムでも、管理者権限が不要になりました。

第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:ファイルマネージャから画像ファイルを開く方法

カメラで撮影した画像をファイルマネージャーから開く方法が解説されていますが、Raspbian のバージョンによっては、画像閲覧用のアプリケーションが起動せず、「ファイル"JPEG画像"を開くアプリケーションを選択してください」というウインドウが開く場合があります。その場合、そのウインドウ上で「アクセサリ」→「イメージビューワ」を選択してください。

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

音声を 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.132, 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.133:12ビットADコンバータMCP3208

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

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


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

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

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

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


第7章

p.158:電子工作キットの温度センサとLCDモジュールについて

Amazonにて、本書の名前を冠したキットが販売されているのですが、私や出版社が関わった製品ではありませんのでご注意ください。
 さらに、そのキットには本書のプログラムでは動作しない温度センサとLCDモジュールが含まれているようです(「DS18B20使用温度センサ」および「SainSmart IIC/I2C/TWI 16*02 LCD液晶 モジュール」)。この温度センサはI2C通信を行なうセンサではなく、LCDモジュールは本書使用のものと仕様が異なります。そのため、本ページではそれらのパーツのサポートは行えませんので御了承ください。

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

LCDを用いたプログラムを実行するためには、Raspberry PiからLCDが認識されていることが必要です。LCDが認識されているかどうかのチェック方法は、書籍に記さなかったのですが、ここで紹介します。

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

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

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


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

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

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

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

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

利用例は下図のようになっています。下図(左)がピンソケットを用いた場合で、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か所の四角いピンも半田付けする必要がありますのでご注意ください。


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

他に用いることのできるLCDとしては、例えばストロベリーリナックスで取り扱われている以下のものがあります。どちらも16文字x2行ですので、本書で取り扱ったものの倍の文字数を表示できます。
下図は、
  • python3 bb2-04-03-lcd-practice.py 'Hello, Raspberry Pi!'
を実行した様子です。現在のRaspbianでは管理者権限を表す「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.159:以前のLCDを購入した場合の暫定的な対処法

<LCD対処法:予備知識>

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

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

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

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


一般に、プルアップ抵抗はI2C接続時に必要になるものですが、Raspberry Pi内部に既にこのプルアップ抵抗が存在するので、LCDモジュールの基板上では必ずしもこのプルアップ抵抗の有効化は必要ありませんでした。そのため、7章において正常動作するLCDでは「PUなし」、「PUあり」のどちらでもLCDは動作しました。

既に述べたように、「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に半田を盛り、基板上のプルアップ抵抗を有効にしてください。


7章全般:LCDにカタカナを表示する

本書で用いたLCD、および上で紹介した16x2のLCDはどちらもカタカナを表示することができます。 07-02-LCD.pyを開いて見ると、末尾に下記の記述があります。
    # アルファベットと記号は「''」でくくってそのまま表示可能
    write_string('Hello World')

    # カタカナや特殊記号は文字コードを一文字ずつ入力
    # 以下は「ラズベリー パイ」と表示する例
    #s = chr(0xd7)+chr(0xbd)+chr(0xde)+chr(0xcd)+chr(0xde)+chr(0xd8)+chr(0xb0)+' '+chr(0xca)+chr(0xdf)+chr(0xb2)
    #write_string(s)
このうち、「write_string('Hello World')」の先頭に「#」を記述して無効にし、 「s = chr(0xd7)+(略)」と「write_string(s)」の先頭の「#」を削除して有効にします。これを保存して実行すれば、下図のように「ラズベリー パイ」と表示されます。


上のコードでは「ch(0xd7)」が「ラ」を表しており、それを「+」記号でつないでいます。空白文字だけは英数字と同じ扱いで「' '」と表記しています。カタカナと記号の対応表は下記になります。色々試して見ると面白いでしょう。

ただし、上で紹介したストロベリーリナックスの2つのLCDでは、下記対応表の一番左の列の文字(0x06~0x0f)は表示されないようです。ご了承ください。


第8章

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

6章の注釈でも既に述べたように、「半固定抵抗の3.3VピンとGNDへの接続を入れ替える」ことで、AD変換の値が大きくなる回転の向きを逆にすることができます。

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


p.181:RGBフルカラーLEDについて

Arduino Sidekick Basic Kitに含まれるRGBフルカラーLEDは共通アノード(アノードコモン)、秋月電子通商のパーツセットに含まれるRGBフルカラーLEDは共通カソード(カソードコモン)です。

共通カソード(カソードコモン)のRGBフルカラーLEDを用いる場合、書籍とサンプルファイルの指示に従い、プログラムを編集してから用いる必要がありますので、御注意ください。

回路の配線も異なりますので書籍中の図をよく見て配線しましょう。

p.181:LED光拡散キャップ白(5mm)

8章および9章で5mmサイズのRGBフルカラーLEDを使う際、光拡散キャップを取り付けると色が見やすくなるため使用を推奨しました。

上で紹介した「Arduino Sidekick Basic Kit バージョン2」を購入された場合、含まれるRGBカラーLEDは光拡散キャップが不要なパッケージに変更されておりますので、使用する必要はありません。

下記の写真は、左から順に「Arduino Sidekick Basic Kit バージョン1に含まれるRGBフルカラーLED(端子カット済)」、「光拡散キャップ」、「Arduino Sidekick Basic Kit バージョン2に含まれるRGBフルカラーLED」です。


p.204:DCモーターのノイズについて

書籍でも触れたように、DCモーターを動かすと大きなノイズが発生します。Wifiを使ってRaspberry Piをネットワークに接続している場合、 ある条件が重なったときにDCモーターのノイズによりWifiの接続が切れてしまう現象が見られました。USB機器の相性に起因するようですが、起こる確率はあまり高くないように思います。もし運悪くそのような状況に遭遇した場合、下記の対策を検討してみてください。
  1. Raspberry Piに接続してるUSB機器、典型的にはキーボードとマウスを別のものに変更する
  2. 書籍p.212の図8-12のように、DCモーターにコンデンサを3個とりつける(端子間1個、端子-外装間2個)。書籍p.212の図8-12をカラーで再掲しますので、参考にしてみてください。
筆者の場合、上記2つのどちらの方法でも解決できました。なお、このDCモーターのノイズの問題は9.6章および10章でも起こりえますので注意してください。


p.181:サーボモーター

本書の発売後、秋月電子通商では安価なサーボモーターとして下記のものも取り扱われるようになりました。
amazonではSG-90の複数個セットも取り扱われております。
このSG-90やSG92Rを用いて本書の演習を行うこともできるのですが、このような安価なサーボは故障や動作不良もあり得ると考え、1個ではなく複数個購入すべきだと思います。そういう意味では、これらのサーボモーターはトラブルがあった時に対処できる上級者向けの商品であると個人的には思います。

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

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


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



p.212:wiringPiを用いたハードウェアPWM信号によるサーボモーターの制御

本書ではwiringPiを用いてGPIO 18に対して精度の高いハードウェアPWM信号を出力し、サーボモーター1個の角度を制御しました。

Raspberry Pi Model BではハードウェアPWM信号はGPIO 18からの1つのみしか出力できなかったのですが、Raspberry Pi Model B+以降(Raspberry Pi 2 Model B含む)では、ハードウェアPWM信号を2つ出力できます。

下図のように、1つ目のPWM0はGPIO 18かGPIO 12のどちらかから、2つ目のPWM1はGPIO 13かGPIO 19のどちらかから出力できます。その方法は本書で解説した方法と同じですので試してみてください。


p.213:wiringPiのインストール

現在のRasbianでは、wiringPiのインストール作業は不要です。そのままこの下のWiringPi2-Pythonのインストールに進んでください。

p.214:WiringPi2-Pythonのインストール

p.214のWiringPi2-Pythonのインストールですが、やや長いコマンドが多いので、コピー&貼り付けできる形で以下に再掲します。必要に応じて活用してください。なお、(3)のダウンロードサイトは、書籍に記したサイトでは更新が終了されたので変更してあります。
(2020.10.23: python3用のインストール法のみを記すようにしました)
(1) $ cd
(2) $ sudo apt update
(3) $ sudo apt install python3-dev python3-setuptools
(4) $ git clone https://github.com/neuralassembly/WiringPi2-Python.git
(5) $ cd WiringPi2-Python
(6) $ sudo python3 setup.py install

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

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

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

第9章

p.227:WebIOPiのダウンロードとインストール

書籍では、WebIOPiのダウンロードをブラウザから行いましたが、以下で紹介する方法では、ダウンロード・展開・インストールを全てコマンドから行います。

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

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


そして、以下のコマンドを実行し、起動用ファイルを適切な位置に配置します。このコマンドもやや長いので、コピー&貼り付けにより実行しましょう。
$ wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi.service
$ sudo mv webiopi.service /etc/systemd/system/
以上の方法に従わずにそのままWebIOPi 0.7.1をインストールすると、下図のようにデモアプリケーションであるGPIO Headerにおいて、「IN/OUT」などの文字が現れるべきボタンが灰色のみのボタンとなってしまいます(書籍237ページ図9-6に対応)。

その場合、WebIOPiを再インストールしてみましょう。そのためには、まずユーザーpiのホームディレクトリ(フォルダ)で下記の2つのコマンドを一つずつ実行し、過去のインストール時のファイルを一旦削除します。
$ sudo rm -f WebIOPi-0.7.1.tar.gz
$ sudo rm -rf WebIOPi-0.7.1/
その後、WebIOPi 0.7.1を再インストールしてみてください。なお、この「ボタンに文字がなく灰色一色になる」状況を解決しないと、9章の残りの内容は正常に動作しませんのでご注意ください。

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


p.229: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.232:IPアドレスでのURLの指定について

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

このIPアドレスの指定を簡単化する方法としては、以下の2つが考えられます。
  • Raspberry PiのIPアドレスを固定し、毎回同じアドレスの指定で済むようにする
  • IPアドレスではなく、「raspberrypi.local」のような名前で指定する
1つ目については、解説がやや長くなるため「Raspberry PiのIPアドレスを固定する」というページにまとめましたので興味のある方は御覧ください。

以下では、2つめの「raspberrypi.local」のような名前で指定する方法について記します

NOOBS 1.4.2以降に含まれるRaspbian(Jessie, Stretch, Buster)では、IPアドレスを用いずに「raspberrypi.local」のような名前で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/bb/01/
すなわち、IPアドレス「192.168.1.3」などの代わりに「raspberrypi.local」という記法が使える、というわけです。これは、Jessie、Stretch、Buster上で動作している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.240:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー

240ページでは、本書のサンプルファイルを/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.240:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー」を参照してください。

p.251:Python3でI2Cを用いる方法について

現在のRaspbianでは、インストール作業なしにPython3でI2Cを用いることができるようになっています。そのため、サンプルファイルに含まれていた 09-samples/smbusmodule.c はいずれ削除する予定です。

p.255:デジタル温度計のloop関数について

9.4節において、WebIOPiを用いて温度計の値をブラウザから読み取る方法を紹介しました。書籍のように、手動でWebIOPiを起動する場合は問題ないのですが、10章のキャタピラ式模型のようにWebIOPiを自動起動する場合、9.4節のプログラムがうまく動作せず温度がブラウザで読み取れないことがわかりました。

これは、WebIOPiのloop関数が、手動起動した場合は問題なく動作するものの、自動起動ではうまく機能しないことが原因のようです。

修正プログラムは以下の手順で導入できますので、デジタル温度計プログラムを自動起動で実行したい方は試してみてください。WebIOPiのloop関数を用いず、スレッドという機能で温度を読み取るように変更しています。もちろん、自動起動ではなく手動起動でも動作します。
$ sudo rm -r /usr/share/webiopi/htdocs/bb/02
$ rm -r 02
$ rm 02.zip
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/02.zip
$ unzip 02.zip
$ mv 02 /usr/share/webiopi/htdocs/bb/
2番目と3番目の命令では既存のディレクトリとファイルの削除を行っており、「そのようなファイルは存在しない」というメッセージが出る場合がありますが気にしなくとも構いません。

p.256:RGBフルカラーLEDについて

Arduino Sidekick Basic Kitに含まれるRGBフルカラーLEDは共通アノード(アノードコモン)、秋月電子通商のパーツセットに含まれるRGBフルカラーLEDは共通カソード(カソードコモン)です。

共通カソード(カソードコモン)のRGBフルカラーLEDを用いる場合、書籍とサンプルファイルの指示に従い、プログラムを編集してから用いる必要がありますので、御注意ください。

回路の配線も異なりますので書籍中の図をよく見て配線しましょう。

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

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



p.262:DCモーターのノイズについて

もし、DCモーターを動かしたときにWifiの接続が切れるような現象が見られた場合、本ページ上部の「p.204:DCモーターのノイズについて」にある対策を御覧ください。

10章

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

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


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




p.276:DCモーターのノイズについて

もし、DCモーターを動かしたときにWifiの接続が切れるような現象が見られた場合、本ページ上部の「p.204:DCモーターのノイズについて」にある対策を御覧ください。

p.288:/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: LCDへのIPアドレスの表示について(1)

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

しかし、「p.232:IPアドレスでのURLの指定について」の注意で紹介しましたように、avahiという仕組みを用いると、IPアドレスではなく、下記のようなアドレスでのアクセスが可能になるのでした。
  • http://raspberrypi.local:8000/bb/05/
これを用いると、回路からLCDが不要になるなどのメリットがあります。具体的には下記の通りです。
  • p.286の図10-6からLCDを取り外して良い
  • p.288での/etc/rc.localへの「python3 /home/pi/07-02-LCD.py $_IP &」の記述が不要
さらに、Raspberry PiのIPアドレスを固定する、という方法でも、毎回IPアドレスを調べる必要がなくなりますね。こちらについては「Raspberry PiのIPアドレスを固定する」にまとめましたので、興味のある方は御覧ください。

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

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

起動時にLCDへIPアドレスを表示する方法を記しましたが、IPアドレスの表示に成功するのは、「Raspberry PiにIPアドレスが割り振られる」→「LCDにIPアドレスが表示される」という順番で処理が行なわれたときのみです。
ネットワーク環境や Raspbian のバージョンによっては、Raspberry PiにIPアドレスが割り振られるタイミングが遅く、LCDにIPアドレスが表示されない、ということがありました。その場合、LCDには「Raspberry Pi」と表示されます。

そのような問題に直面した場合、下記の2つの方法を試し、LCDにIPアドレスを表示するタイミングを遅らせてみましょう。

まず、Jessie 以降の Raspbian を用いている方向けの方法です。 Jessie以降に含まれる設定アプリケーションでは、下図(左)のように「Network at Boot」という項目があります。この「Wait for network」にチェックを入れて再起動すると、Raspberry Piのネットワークへの接続が完了してから起動が完了するようになります。その結果、LCDにIPアドレスが表示されるようになる、というわけです。

下図(右)のように以前からの設定アプリケーションraspi-configにも「Wait for Network at Boot」という項目が追加されており、「Slow Wait for network connection before completing boot」を選択することで、同様の効果が得られます。


次に、Raspbian Wheezy を用いている方向けの方法です。
/etc/rc.localの下記の位置に下記のように「sleep 10」と記入して、LCDへのIPアドレスの表示を10秒遅らせると、LCDへのIPアドレスの表示に成功することがあります。「10」という数字はLCDの表示を遅らせる秒数ですので、環境により適切な秒数に調節してください。
(略)
# By default this script does nothing.

sleep 10

# Print the IP address
(略)
ただし、こうするとRaspberry Piの起動が10秒遅くなることになりますので御了承ください。

p.290:/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.291:キャタピラ式模型のメンテナンス

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

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

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

mjpg-streamerのインストールコマンドを全て書くと下記の通りです。長いコマンドが多いので一つずつコピーして実行しても良いでしょう。

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

さて、ここで紹介するコマンドは、libcamera を用いない場合(すなわち、Legacy Camera モードでカメラを利用する場合です。 コピーの際、行頭の「(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.128, Bookworn (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.294:mjpg-streamerの映像が表示されない場合のチェック項目

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

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

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

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

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

(3') 補足ページ「p.292: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アドレスで
 読み替える必要があります。

p.296:誤字について

このページに下記の誤字があることをお知らせ頂きました。お知らせ頂きありがとうございました。
金属のビス
→
金属のビス

付録A

p.300:Wifi Config

現在のRaspbianでは、Wifiの設定をするための方法が下図のようにシンプルになり、さらに接続状況がひと目でわかるようになっています。


付録B

p.305:USBメモリの利用について

このページでは、USBメモリを用いて本書のサンプルファイルをRaspberry Piへコピーする方法を解説していますが、Raspbian が更新されGUIが大きく変更されたため、この部分の操作に少し変更があるので補足します。

まず、USBメモリをRaspberry Piにさすと、下図のようにファイルマネージャで開くかどうかの確認画面が現れます。ここでOKをクリックしてください。USBメモリの中身が見える状態でファイルマネージャが起動します。


USBメモリの中身をRaspberry Piにコピーする操作は書籍から変更ありません。

最後に、USBメモリをRaspberry Piから抜く操作です。Jessie 以降を用いている方は、下図のように画面右上に「安全な取り外し」に相当するボタンがありますので、それを押してからUSBメモリを抜くようにしましょう。Windowsなどと同じ手順ですね。



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

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.312:コマンドでのプログラムの実行について

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

追加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 によりボリュームを変更可能になります。

PDF10:spidevのインストールについて

公式サポートページでダウンロードできる追加PDFの内容についてです。spidevを用いてADコンバータから値を取得する方法を紹介しておりますが、 現在はspidevはデフォルトでRaspbianに含まれておりますので、インストール作業は必要ありません。

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

12 件のコメント:

  1. 下記のパッチですが、gpio.cのほうが更新されていないようです。BCM2708_PERI_BASE_DEFAULT 0x20000000をBCM2708_PERI_BASE_DEFAULT 0x3f000000にすると動きました。
    https://dl.dropboxusercontent.com/u/69652790/bb/WebIOPi-0.7.1.patched.tgz

    返信削除
    返信
    1. お知らせ頂きありがとうございます。

      0x3f000000という数値ですが、WebIOPi-0.7.1.patched.tgzに含まれるgpio.cでは、
      peri_base = buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3] << 0;
      という命令の周辺でperi_baseに0x3f000000が動的に格納されるようになっています(値自体は/proc/device-tree/soc/rangesから取得されます)。それがうまく機能していないということだと思いますので、お手数ですが、御使用のOSのバージョンをわかる範囲でお知らせ頂けないでしょうか?

      また、補足ページ中のWebIOPiのインストール法を変更しました。一般的にWebIOPiのコミュニティで使われることの多いwebiopi-pi2bplus.patchというファイルを使うものです。もし次にWebIOPiをインストール機会がありましたら、試してみてください。

      削除
    2. すいません、もう一つコメントです。

      WebIOPiを今回の新しい方法でインストールし直す場合、一旦WebIOPi-0.7.1というディレクトリ(フォルダ)を削除し、新たにWebIOPi-0.7.1.tar.gzを解凍するところから始める必要がありますので、ご注意ください。

      削除
  2. 現在、ご著書「Raspberry Piで学ぶ電子工作」を拝読しつつ演習を作成、実験しておりますが、7章のLCDモジュールのところでつまづいております。
    07-02-LCD.pyを実行してもモジュールには何も表示されず、エラーも表示されません。
    はんだづけに失敗してモジュールを壊してしまったのではと考え、3個作り直し、更に完成品も購入して試してみたのですが、結果は同じでした。
    また、Webで調べてi2cdetectコマンドを(p.170、図7-7の回路にて)試してみた結果、温度センサは48と検出されますが、LCDモジュールは検出されません。
    この場合、不具合の原因は何が考えられますでしょうか?
    ご返答の程、よろしくお願いいたします。

    返信削除
    返信
    1. お知らせいただき有難うございます。

      お調べ頂いた通り、「sudo i2cdetect -y 1」というコマンドを実行すると、
      温度計を示す48とLCDを表す3eの2つのアドレスが表示されるのが通常動作です。
      3eが表示されないということは、LCDが認識されていないということを意味します。

      これまでLCDについてご質問頂いた方は多くがLCD作成に問題があったようで、
      LCDの完成版を購入したらトラブルが解決した、というケースがほとんどでした。
      そのため、大介さんのケースは新しいケースと言えるかもしれません。

      現時点で原因は分かりませんが、思ったことを幾つか述べてみます。
      なお、回路はp.170の図7-7を前提とします。

      <1. 回路の接続に問題がある場合>

      Raspberry Piから温度計までの回路が正しくて、
      温度計からLCDまでの回路が正しくない場合にLCDが認識されない、
      ということはあり得ます。
      「1 VDD」「2 RESET」に3.3Vが接続されていない、
      「5 GND」にGNDが接続されていない、などです。

      <2. 温度計との組み合わせ>

      あまり起こるとは考えにくいのですが、温度計との相性が悪くて
      LCDが認識されない、ということがあるかもしれません。

      念のためではありますが、図7-7から「温度計のみ」を取り外した状態
      (ジャンパワイヤはそのまま残した状態)で
      「sudo i2cdetect -y 1」というコマンドを実行すると、
      何が起こるでしょうか?
      LCDが認識されていれば、3eというアドレスが表示されます。

      <3. LCD基板上のプルアップ抵抗について>

      完成品LCDの基板(裏側)には、下図のような電極が2つあり、
      (B)のようにはんだが盛られてショートした状態になっています。

      http://4.bp.blogspot.com/-qx8DpctHsBU/Vq4SKX3jI8I/AAAAAAAAENU/RGXOCEItaQM/s1600/LCD-PU.png

      これはLCD基板上のプルアップ抵抗が有効にされた状態を意味します。
      次作「実例で学ぶRaspberry Pi電子工作」では、このLCDをモーター用回路と同時に使う際、
      この電極上のはんだを取り去って図(A)の状態にしないとLCDが認識しない、ということはありました。

      ただし、これは「LCDをモーター用回路を同時に使う場合」の話です。
      今回のように「LCDと温度計を同時に使う場合」にこの問題が起こった経験はないので、
      必ずしも関係ないかな、という気はします。


      以上、思いついたのはこの3つくらいでしょうか。

      削除
    2. 先程、上記の問題が解決致しました。

      色々と試した結果、原因はLCDの不具合だったと思われます。

      まず、金丸様が挙げられた3点について試してみました

      1.回路の接続
      何回か確認、刺しなおし等を行いました。ブレッドボードも逆さにして試してみましたが、結果は変わりませんでした。

      2.温度計との相性
      温度計のみを外してsudo i2cdetect -t 1を実行してもアドレス3eは認識表示されませんでした。

      3.プルアップ抵抗
      除去後も結果は変わりませんでした。

      その後私は、
      RaspberryPi本体を別の個体に替える
      microSDをフォーマットしてOSを再インストールしたのですが、これらを行っても結果は変わりませんでしたので、当ブログにある、
      『【大型】I2C低電圧キャラクタ液晶モジュール(16x2行)通過型』と、
      『ミニI2C液晶モジュール(8文字x2行 バックライト無・反射型)』
      の2点をストロベリーリナックス様より購入、後者は秋月様で既に購入して組み立てていなかったピッチ変換キットの基板とピンヘッダを流用組み立てを行い、それぞれsudo i2cdetect -y 1及びサンプル07-02-LCDを実行した結果、正常に3eを認識表示、LCD上にHallo Worldを表示出来ました。
      以上、ご報告まで。

      削除
    3. お久しぶりです。小型LCD(AQM0802)について、既に解決済みとは思いますが、小型LCD(AQM0802)の新しいロットがRaspberry Piで動作しない件について、正式な対処法が公開されましたのでお知らせします。

      本書発売後の追加情報
      https://raspibb.blogspot.jp/2016/02/blog-post.html

      において、

      p.171:完成品のLCDを購入しても認識されない場合の対処法
      <LCD対処法:予備知識>
      <LCD対処法:暫定版>
      <LCD対処法:正式版(ただし上級者向け)>
      の順で記しましたので、ご参考ください。

      この「正式版」で用いられているI2Cリピーターは、トランジスタ技術8月号付録の基板でも用いられているものです。
      http://toragi.cqpub.co.jp/tabid/807/Default.aspx

      削除
    4. お久しぶりです。秋月電子通商さんより、Raspberry Piで正式に利用可能なLCDモジュールが発売されたので解説を追加しました。

      http://raspibb.blogspot.jp/2016/02/blog-post.html
      の「7章全般:利用できるLCDについて1~秋月電子編」

      削除
  3. はじめまして。正月の暇を見て昔かったこの本を取り出してRaspberryPi3B+で遊んでいました。現在とそぐわない箇所もあり、こちらのページを見るとしっかりサポートされていて感謝の至りです。
    ところで、私がハマったのは、WebIOPiがインストール時には起動するのに、何度か操作するうちに起動しなくなることです。この時は、上の方に書いてある通りにWebIOPiを再インストールしてもダメでした。これで2日間ほど苦労しました。
    今日になって原因がわかりました。/etc/webiopi/configの中にある"myscript= ~"の記述に削除してしまったファイルが入っていたのです。
    試しに"myscript= ~"の行の先頭に#を入れてコメントアウトしたらあっさり起動させることができました。
    WebIOPiの起動で悩んでいる方はお試しください。

    返信削除
  4. はじめまして、本書にてとても勉強になりました。webiopiでスマホ経由でLEDをGPIO24で点灯させることはうまくいきましたが、下記のようにHTMLプログラムを改編して24と23GPIOを設定しましたがOUTにする初期値までは動作しているようですが、WEB上の23,24のボタンは押されて色も変わりますが両方ともONにならない(0から1に)状況です。何が間違っているかご指摘いただけますでしょうか。




    webiopi().ready(function() {
    var port = 24; //GPIO24
    var portb = 23; //GPIO23
    var val = 0; //初期値
    var valb = 0; //初期値

    // 初期設定: GPIO24をOUTモードにして、出力を0にする
    webiopi().setFunction(port,portb,"OUT",function(){
    webiopi().digitalWrite(port,portb,val,valb);
    });

    // ボタンが押されたらGPIO24の値を反転する
    $('#btn1').click( function() {
    val = (val) ? 0 : 1;
    webiopi().digitalWrite(port,val); // 値valを出力
    // ボタン背景色の変更
    color = (val) ? "#f88888" : "#f8f8f8";
    $(this).css('background',color);
    }) ;

    // ボタンが押されたらGPIO23の値を反転する
    $('#btn2').click( function() {
    valb = (valb) ? 0 : 1;
    webiopi().digitalWrite(portb,valb); // 値valbを出力
    // ボタン背景色の変更
    color = (valb) ? "#f88888" : "#f8f8f8";
    $(this).css('background',color);
    });
    });

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

      貼り付けて頂いた JavaScript プログラムですが、
      私の書籍で紹介していない方法が多数使われています。

      例えば、私のサンプルプログラムでは JavaScript を
      HTML ファイルに書かないようにしてます。

      また、私のサンプルプログラムでは、
      setFunction 関数や digitalWrite 関数を
      JavaScript から呼び出すことはしておらず、
      全て Python から呼び出すようにしています。

      ですので、私の書籍以外で参考にされた
      書籍やサイトがあるのでしたら、
      その執筆者に質問されるのが良いのではないかと思います。

      以上を理解して頂いたうえで、一点だけコメントするとすれば、

      webiopi().setFunction(port,portb,"OUT", ...)

      webiopi().digitalWrite(port,portb,val,valb);
      の部分で、
      「二つのポートを同時に設定する」
      ということを行っていますが、
      そのような記法はサポートされていませんので、
      そこで JavaScript のエラーがでるだろうと思います。

      この件につきましては、この回答を最後とさせてください。

      よろしくお願いします。

      削除
  5. Takashi Kanamaru様
    大変失礼いたしました。とても参考になりました。うまく動作できました。こちらの書籍も購入させていただきます。

    返信削除