tag:blogger.com,1999:blog-12994651939425572222024-03-19T13:14:39.264+09:00実例で学ぶRaspberry Pi電子工作 補足情報Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-1299465193942557222.post-56178255878759492432024-01-27T13:02:00.002+09:002024-01-27T13:10:15.048+09:00実例で学ぶRaspberry Pi電子工作 補足情報トップ<h3>
はじめに</h3>
本ページは、金丸隆志著「実例で学ぶRaspberry Pi電子工作」(講談社ブルーバックス)の補足情報をまとめるためのページです。本書の内容が最新のRaspbianで動作するようメンテナンスを続けています。
<br />
<br />
<h3>
補足情報</h3>
Raspberry PiのOSの更新に伴う内容の変更などを以下のページに記します。このページを書籍と合わせてごらんください。
<br />
<ul>
<li><a href="https://raspibb2.blogspot.com/2024/01/pi-zero-pi-5.html" target="_blank">本書の内容を Pi Zero ~ Pi 5 で実行する方法</a></li>
</ul>
<br />
<h3>
追加コンテンツ</h3>
本書の演習をさらに膨らませる追加コンテンツを以下に記します。音声合成、音声認識、エアコン操作など、より実用的な内容を含んでいます。本書の演習とともに是非チャレンジしてみてください。
<br />
<ul>
<li><a href="https://raspibb2.blogspot.com/2021/02/blog-post.html" target="_blank">本書の演習をウェブカメラで実行する方法</a></li>
</ul>
<ul>
<li><a href="https://raspibb2.blogspot.com/2017/03/raspberry-pi-open-jtalk.html" target="_blank">Raspberry Pi + Open JTalkによる音声合成で天気予報付き温度計に喋らせる</a></li>
</ul>
<ul>
<li><a href="https://raspibb2.blogspot.com/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a></li>
</ul>
<ul>
<li><a href="https://raspibb2.blogspot.com/2018/02/raspberry-pi-google-assistant-api-lirc.html" target="_blank">Raspberry Pi + Google Assistant API + LIRCによりテレビを音声認識で操作する</a></li>
</ul>
<ul>
<li><a href="https://raspibb2.blogspot.com/2016/06/raspberry-pilirc.html" target="_blank">Raspberry Pi上のLIRCでエアコンを操作する</a></li>
</ul>
<ul>
<li><a href="https://raspibb2.blogspot.com/2017/01/gui.html" target="_blank">GUIアプリケーションの自動起動</a></li>
</ul>
<br />
<h3>
前著の記事へのリンク</h3>
入門編である「Raspberry Piで学ぶ電子工作」のサポートページ中で、本書の読者の方にも役立ちそうな記事へのリンクを貼ります。
<br />
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/raspberry-pi-zero-wh.html" target="_blank">Raspberry Pi Zero W 系で本書の演習を行う方法</a></li>
</ul>
<ul>
<li><a href="https://raspibb1.blogspot.com/2019/01/raspberry-pi1vnc.html" target="_blank">ディスプレイ・マウス・キーボードを接続せずにRaspberry Piを利用する(1)~VNC編</a></li>
</ul>
<ul>
<li><a href="https://raspibb1.blogspot.com/2019/01/raspberry-pi2ssh.html" target="_blank">ディスプレイ・マウス・キーボードを接続せずにRaspberry Piを利用する(2)~SSH編</a></li>
</ul>
<ul>
<li><a href="https://raspibb1.blogspot.com/2019/01/raspberry-piip.html" target="_blank">Raspberry PiのIPアドレスを固定する</a></li>
</ul>
<ul>
<li><a href="https://raspibb.blogspot.com/2015/11/raspberry-pi.html" target="_blank">Raspberry Pi公式タッチディスプレイで本書の演習を実行する</a></li>
</ul>
<ul>
<li><a href="https://raspibb.blogspot.com/2016/04/blog-post.html" target="_blank">据置きのルーター機器を介さずキャタピラ式模型を操作してみた</a></li>
</ul>
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/proxy.html" target="_blank">プロキシ(Proxy)環境下での本書の演習の実行</a></li>
</ul>
<ul>
<li><a href="https://raspibb.blogspot.com/2015/04/caps-lockctrl.html" target="_blank">キーボードのCaps LockキーとCtrlキーを入れ替える</a></li>
</ul>
<br />
<h3>
感想など</h3>
<ul>
<li><a href="https://raspibb2.blogspot.com/2015/12/blog-post_31.html" target="_blank">読者の方々の声</a></li>
</ul>
<br />
<br />
<br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-22741002527835665832024-01-27T13:01:00.010+09:002024-03-15T14:25:57.661+09:00本書の内容を Pi Zero ~ Pi 5 で実行する方法<h3>
サンプルプログラムとカラー版回路配線図について</h3>
Pi 5 対応のサンプルプログラムおよび回路配線図、応用PDFは、以下のリンクからダウンロードしてください。サンプルプログラムを圧縮したファイル「 raspi2-sample-pi5.zip 」の「-pi5」の部分が「Pi 5 対応」を意味しています。
<ul>
<li><a href="https://github.com/neuralassembly/raspi/raw/master/raspi2-sample-pi5.zip" target="_blank">Pi 5 対応サンプルファイル raspi2-sample-pi5.zip</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784062579506/appendix/attachments/RaspberryPi-bb2-Circuit.pdf" target="_blank">回路配線図</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784062579506/appendix/attachments/RaspberryPi2-PDF_p01-33.pdf" target="_blank">応用PDF(電子版には書籍末尾についています)</a></li>
</ul>
なお、サンプルファイルである「raspi2-sample-pi5.zip」をWindowsでダウンロードすると、Windows Defender によりウィルスと誤検出されることが多いようです(2024.3月現在)。<br />
<strong>検出されるファイルに問題がないことは確認済み</strong>です。そのため、Windows ではなく<strong>Raspberry Piで直接ダウンロードすることを推奨</strong>します。
<br /><br />
これらの PDF は Raspberry Pi 上のブラウザでも見られますが、ブラウザ上の「↓」(ダウンロード)ボタンでダウンロードし、ファイルマネージャーで PDF ファイルを右クリックし「アプリケーションで開く」→「アクセサリ」→「ドキュメントビューア」などで開いてもよいでしょう。<br />
「選択したアプリケーションをこのファイルタイプのデフォルトのアクションとする」にチェックを入れればそのアプリケーションで開くのがデフォルト動作となります。
<br /><br />
<h3>
はじめに</h3>
本ページでは、金丸隆志著「実例で学ぶRaspberry Pi電子工作」(講談社ブルーバックス)の内容を Raspberry Pi Zero ~ Raspberry Pi 5 で動作させるための補足情報を本ページに記します。
<br /><br />
2023年9月に海外で発表された Raspberry Pi 5 (以下 Pi 5) では、GPIO を用いる仕組みがそれまでのバージョンの Raspberry Pi とは大きく異なります。<br />
その影響で、本書で解説したサンプルプログラムは Raspberry Pi 5 では動作しなくなってしまいました。
<br /><br />
Raspberry Pi 5 で本書の演習を実行するためには、本書のプログラムをほぼ全て書き換えねばなりません。<br />
しかし書き換えを実行すると、そのプログラムは Raspberry Pi 5 だけではなく、ほぼ全ての Raspberry Pi のバージョンで動作するというメリットがあります。
<br /><br />
本書は2015年の発売から9年がたち、書籍のままでは動かない内容も増えてきました。書籍としてはややくたびれた状態と言えるかもしれません。<br />
そこで、この機会にすべてのプログラムを一新し、このページでその動作方法を解説することにしました。<br />
書籍とこのページだけを見れば、全ての演習を Pi Zero ~ Pi 5 で実行できるようになります。
<br /><br />
対象とする OS は、以下のように 2023年5月にリリースされた Rsapberry Pi OS (Bullseye) の最終版と、2023年10月にリリースされた Bookworm 以降の OS です。
<br /><br />
<table border="1">
<tbody>
<tr>
<td>日付</td><td>バージョン</td><td>カーネルバージョン</td><td>OSバージョン</td>
</tr>
<tr>
<td>2023/5/3</td><td>Raspberry Pi OS 2023-05-03</td><td>6.1.21+ / 6.1.21-v7+ / 6.1.21-v7l+ / 6.1.21-v8+</td><td rowspan="1">Bullseye (最終版)</td>
</tr>
<tr>
<td>2023/10/10</td><td>Raspberry Pi OS 2023-10-10</td><td>6.1.0-rpi4-rpi-{v6,v7,v7l,v8,2712}</td><td rowspan="2">Bookworm</td>
</tr>
<tr>
<td>2023/12/5</td><td>Raspberry Pi OS 2023-10-10</td><td>6.1.0-rpi7-rpi-{v6,v7,v7l,v8,2712}</td>
</tr>
</tbody></table>
<br />
なお、それ以前の古いOSに対する情報(Pi Zero~Pi 4までのみ対応)は、下記のページに残してありますが、恐らく今後需要は減っていくでしょう。
<ul>
<li><a href="https://raspibb2.blogspot.com/2015/12/blog-post.html" target="_blank">本書発売後の追加情報(Pi Zero~Pi 4までの古い情報)</a></li>
</ul>
<br />
<h3>
第1章</h3>
<h4>
p.12: OSインストール法の最新版について</h4>
最新の Raspberry Pi OS のインストールおよび設定方法は、
「Raspberry Piではじめる機械学習 補足情報」内にある<span style="font-size: large;">「<a href="https://mlbb1.blogspot.com/2018/03/raspberry-pios.html" target="_blank">Raspberry PiへのOSのインストール方法</a>」</span>をご覧ください。本書1章と同等の内容をアップデートされた状態で見ることができます。
<br /><br />
<h4>p.30, コマンドプロンプトの表記</h4>
p.30ではコマンドプロンプトの表記として以下を紹介しました。
<pre class="prettyprint">
pi@raspbberrypi:~ $
</pre>
ここに見える「pi」はユーザー名を表しており、ユーザー名「pi」は2022年4月以前の古いOSで用いられていたデフォルトのユーザー名です。最新のOSを用いている方ならば、「pi」の部分に自分で決めたユーザー名が表示されているでしょう。私の場合、ユーザー名はいつも「kanamaru」としています。
<br />
<br />
<h3>
第2章</h3>
<h4>
p.52:開発環境の代替</h4>
開発環境は、デフォルトでインストール済のインストール済の「Thonny Python IDE」を用いてください。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN4tWnLc5czOBYnIDszvKU7Y5mMW91VweHUhlrw1NVl0XQ2pFtohG0LDtoE3DNTnpFJ5T-uU_9-Mio-vUIx1SpRmOE30HN47cW3ZlwWsQgUImIILgrPyG10UQQNxy-DDeS1kmNajRIFT8/s1600/thonny1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="550" data-original-width="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN4tWnLc5czOBYnIDszvKU7Y5mMW91VweHUhlrw1NVl0XQ2pFtohG0LDtoE3DNTnpFJ5T-uU_9-Mio-vUIx1SpRmOE30HN47cW3ZlwWsQgUImIILgrPyG10UQQNxy-DDeS1kmNajRIFT8/s1600/thonny1.png" /></a></div>
<br />
次図のように、「LOAD」がファイルの読み込み、「RUN」がプログラム実行、「STOP」がプログラム停止であることを理解すれば問題なく利用できるでしょう。
<br />
<br />
ただし、「STOP」ボタンでプログラムを停止すると、サンプルプログラムの「except KeybordInterrupt」部が実行されません。<strong>「Shell」と書かれた領域の上でキーボードの「Ctrl-C」によりプログラムを終了</strong>するのが良いでしょう。なお、Thonnyには「時々Ctrl-cが効かなくなる」という不具合があるようなので、そういうときのみ「STOP」ボタンでプログラムを停止すると良いでしょう。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMrJ3jgFF_xvNPmJ5GL4MsnuJrzHo5nkT_5C-paCSHV6jPuELd0pPRnJcvC2cFRowJHaY4pe96RONCACs-6utov4K9mPUujvEl6cB11cxeowRMiDi5N5APAYsQk5v5DSokeCxnASduQWE/s1600/thonny2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="682" data-original-width="804" height="542" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMrJ3jgFF_xvNPmJ5GL4MsnuJrzHo5nkT_5C-paCSHV6jPuELd0pPRnJcvC2cFRowJHaY4pe96RONCACs-6utov4K9mPUujvEl6cB11cxeowRMiDi5N5APAYsQk5v5DSokeCxnASduQWE/s640/thonny2.png" width="640" /></a></div>
<br />
Thonny Python IDEを用いると、7章で取り扱うOpenCVを用いたプログラムもIDEから実行できるというメリットがあります(IDLEでは画像処理プログラムのみコンソールから起動させたのでした)。
<br />
<br />
<h4>
p.54:サンプルプログラム</h4>
2章のプログラムのファイル名は本書のものと変わらず「bb2-02-01-led.py」です。<br />
ただし、GPIO を取り扱うライブラリは、本書で用いた RPi.GPIO から <a href="https://gpiozero.readthedocs.io/en/latest/" target="_blank">gpiozero</a> に変更されています。
ターミナルで実行する場合は下記のコマンドを用いてください。
<pre class="prettyprint">
python3 bb2-02-01-led.py
</pre>
<br /><br />
<h3>
第3章</h3>
3章のプログラムも、使用ライブラリを RPi.GPIO から <a href="https://gpiozero.readthedocs.io/en/latest/" target="_blank">gpiozero</a> に変更しています。<br />
プログラムのファイル名は本書のものと変わりません。ターミナルで実行する場合は下記のコマンドを用いてください。
<pre class="prettyprint">
python3 bb2-03-01-3led.py
python3 bb2-03-02-dice.py
python3 bb2-03-03-dice-switch.py
python3 bb2-03-04-dice-switch-delay.py
</pre>
<br />
<br />
<h3>
第4章</h3>
<h4>
4章全般:お天気Webサービスについて</h4>
第4章で紹介しているお天気Webサービスですが、2020年7月でサービスを終了したようです。本ページでダウンロードしたサンプルプログラムでは、
その代替として <a href="https://openweathermap.org/" target="_blank">OpenWeather</a> というサービスを利用しました。OpenWeather の利用には準備が必要ですのでそれも合わせ、以下で解説していきます。
<br /><br />
<h4>p.94:I2C の準備</h4>
まず、本書 p.94 で解説した I2C の準備を行いましょう。まず、p.95 で解説されているように、設定アプリケーションにより I2C を有効にしておく必要があります。
具体的には、下記の手順に従います。
<ol>
<li>デスクトップ左上のメニューから、「設定」→「Raspberry Piの設定」を起動</li>
<li>「インターフェイス」タブをクリック</li>
<li>「I2C」のスイッチをONにして有効化する</li>
</ol>
本書のそれ以降の作業、すなわち、「/etc/modulesへのi2c-devの追記(p.96)」、「必要なパッケージのインストール (p.97)」は実行不要です。
<br /><br />
Pi 5をお使いの場合、上記の設定に加えて次の設定を行ってください。
まず、ターミナルを起動し、次のコマンドを実行することで、設定ファイル/boot/firmware/config.txtを管理者権限のテキストエディタで開きましょう。
<pre class="prettyprint">
sudo mousepad /boot/firmware/config.txt
</pre>
ファイルが開いたら、ファイルの末尾までスクロールし、末尾に次の1行を追記しましょう。
<pre class="prettyprint">
dtparam=i2c_baudrate=20000
</pre>
ファイルを保存したら、テキストエディタを閉じ、Raspberry Piを再起動してください。
この設定は、I2Cの動作速度をデフォルトの100kHzから20kHzに落とす働きがあります。そうしないと、Pi 5では7.3で用いるLCDが動作しないことがあったため、この設定を行います。Pi 4 Bまでの機種ではこの設定は必要ありません。
<br /><br />
<h4>p. 97:事前準備</h4>
p.97~p.100 で解説されている、お天気Webサービスのサイトの確認は不要です。<br />
p.101 で解説されている、pip と requests のインストールも不要です(デフォルトでインストール済のため)。
<br /><br />
その代わり、ここでは OpenWeather のアカウント作成を行いましょう。
<br /><br />
<h4>OpenWeather のアカウント作成</h4>
OpenWeather の利用には、「サイトにアカウントを作成し、APIキーを取得する」というひと手間が必要です。まずその実行から始めましょう。
<br /><br />
<a href="https://openweathermap.org/full-price#current" tartget="_blank">OpenWeather の料金体系</a>には様々なものがありますが、
本ページでは、無料 (Free) の One Call API を利用します。一日1,000 呼び出し、一か月30,000呼び出しが可能であることが記されています。
<br /><br />
以下の手順に従い OpenWeather のアカウントを作成しましょう。
<ol>
<li><a href="https://home.openweathermap.org/users/sign_up" target="_blank">OpenWeatherのアカウント作成ページ</a>で必要事項を記入ます。
<ul>
<li>Username: 英語サイトなので、アルファベットからなるユーザー名を入力するのが良いでしょう。アカウント作成後に変更できます。</li>
<li>email: アカウント作成時に確認メールが届きますので、正確に入力してください。</li>
<li>Password / Repeat Password: パスワードを二回入力します。</li>
<li>I am 16 years old and over (16歳以上) の条件を満たしていればチェック</li>
<li>I agree with Privacy Policy ... 使用条件などをを理解したらチェック</li>
<li>System news, Product news, Corperate news はサイトからのメールを受け取りたければチェック</li>
<li>「私はロボットではありません」にチェック</li>
<li>以上を確認したら「Create Account」ボタンをクリック</li>
</ul>
</li>
<li>遷移先のページで、Company と Purposeを入力します。
<ul>
<li>Company は、個人ならば記入しなくて構いません</li>
<li>Purpose (使用目的) は、私の場合「Education/Science (教育と科学)」を選択しました</li>
<li>「Save」ボタンをクリック
</ul>
</li>
<li>以上が終わると、登録したメールにOpenWeather からメールが届きます。メールの中の「Verify your email」ボタンをクリックすると、登録完了です。</li>
</ol>
<h4>
OpenWeather の API キー取得</h4>
さて、以上が終わったあと、<a href="https://openweathermap.org/" target="_blank">OpenWeather</a> において、下図のように「ユーザー名」→「My API keys」と辿ると、API key を取得できます。
このAPI keyをコピーしてメモ帳などで保存しておきましょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3CNYlk0WfNbZwTnytm53K-EwJmN2HfjhlfSlv6VW9rncns_fHjtZz1CtJnOCJ-y5ojEBoZrrQaD9yOnt91jEEHZV_ngLxjIjG-xO0vcT6jlOlrh4ctC5axwqQNdf6tMBiwMjzcRRRMhs/s1013/show_apikey.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="360" data-original-width="1013" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3CNYlk0WfNbZwTnytm53K-EwJmN2HfjhlfSlv6VW9rncns_fHjtZz1CtJnOCJ-y5ojEBoZrrQaD9yOnt91jEEHZV_ngLxjIjG-xO0vcT6jlOlrh4ctC5axwqQNdf6tMBiwMjzcRRRMhs/s600/show_apikey.png"/></a></div>
なお、この API key は Raspberry Pi 上で用いるので、Raspberry Pi 上のブラウザでコピーし、Raspberry Pi 上のテキストエディタ Mousepad で保存するのが良いかもしれません。<br />
また、この API key は登録したメールアドレスにも届きますので、そちらからコピーしても良いでしょう。その中に「Within the next couple of hours, it will be activated and ready to use」とあるので、利用可能になるまで数時間かかることがあるのかもしれません。
私の場合、すぐに使えたように思うのですが、ちょっと自信がありません。
<br /><br />
<h4>
OpenWeather の API キーをプログラムに反映</h4>
さて、以上の準備のもとで、本ページでダウンロードしたファイルの利用方法を解説します。
<ul>
<li>bb2-04-00-checkcity.py
</li>
<li>bb2-04-01-weather.py
</li>
<li>bb2-04-02-forcast.py
</li>
<li>bb2-04-04-lcd-4modes.py
</li>
<li>bb2-04-05-lcd-3modes.py
</li>
</ul>
最初の「bb2-04-00-checkcity.py」は、本書のサンプルプログラムには存在しなかったファイルです。
bb2-04-01~bb2-04-05 のファイルは本書のサンプルプログラムに同じ番号のものがありますが、その OpenWeathter 版です。
<br /><br />
これらのファイルを用いるには、上記5つのファイルに冒頭で入手した API key を記入して上書き保存しなければなりません。まずその解説を行います。
<br /><br />
これらの5つのファイルを mousepad のようなテキストエディタや、Thonny のような開発環境で開くと、どのファイルにも下記の行が見つかります(冒頭にスペースが入っている場合もあります)。
<pre class="prettyprint">
key = 'API_KEY'
</pre>
具体的には、5つのファイルの下記の行番号の位置に上の行があります。
<ul>
<li>bb2-04-00-checkcity.py: 5行目
</li>
<li>bb2-04-01-weather.py: 7行目
</li>
<li>bb2-04-02-forcast.py: 7行目
</li>
<li>bb2-04-04-lcd-4modes.py: 100行目
</li>
<li>bb2-04-05-lcd-3modes.py: 100行目
</li>
</ul>
この行の「API_KEY」の部分を、上でコピーして保存した皆さんの API key で書き換えます。
本当の API key を書くわけにはいかないので、イメージを記すと下記のようになります。
<pre class="prettyprint">
key = '................................'
</pre>
書き換えたら、ファイルを上書き保存してください。この作業を、5つのファイル全てで行います。
以上でプログラム実行前の準備は完了です。
<br /><br />
次に、OpenWeatherの天気予報データを利用するプログラムの実行方法を解説します。
<br /><br />
本書に存在しないファイルである「bb2-04-00-checkcity.py」の利用法の解説のみ後まわしとし、残りの4ファイル
の解説を順に行います。
<br /><br />
なお、デフォルトでは4ファイルは東京の天気を表示します。
<br /><br />
<h4>p.101:bb2-04-01-weather.py の利用</h4>
bb2-04-01-weather.py を Thonny で開いて実行するか、下記のコマンドで実行してください。
<pre class="prettyprint">
python3 bb2-04-01-weather.py
</pre>
本書の図4-7のように、入手した天気予報データを全て表示するコマンドです。表示された中身を理解する必要はなく、
「天気予報データを入手できた」ということを確認できればそれで十分です。
<pre class="prettyprint">
(省略)
"weather": [
{
"id": 800,
"main": "Clear",
"description": "晴天",
"icon": "01d"
}
],
"clouds": 2,
"pop": 0,
"uvi": 3
}
]
}
</pre>
なお、取得されるデータは本書の図4-7の形式とは全く異なります。予報のデータは上の「"main": "Clear",」の部分を使っており、「"description": "晴天",」の部分は使っていません。
最終的に LCD に表示するうえで、"description" の部分はバリエーションが多すぎると思えたためです。
<br /><br />
<h4>p.105, bb2-04-02-forcast.py の利用</h4>
bb2-04-02-forcast.py を Thonny で開いて実行するか、下記のコマンドで実行してください。
<pre class="prettyprint">
python3 bb2-04-02-forcast.py
</pre>
本書の図4-8のように、3日間の予報のみをデータを整理して表示します。
<pre class="prettyprint">
今日, 雨, 9/17
明日, 雨, 12/18
明後日, 雨, 9/13
</pre>
なお、「お天気Webサービス」と異なり、「時々」や「のち」を含む結果は現れません。
「Clear(晴れ)」、「Clouds(曇り)」、「Rain(雨)」、「Snow(雪)」、「Thunderstorm(雷)」、「Drizzle(霧)」
の6種類の天気しか表示されません。その点はこのサイトの特性としてご了承ください。
<br /><br />
<h4>p.108:bb2-04-04-lcd-4modes.py および bb2-04-05-lcd-3modes.py の利用</h4>
bb2-04-04-lcd-4modes.py および bb2-04-05-lcd-3modes.py を実行する際は、あらかじめ I2C を有効にしておき、さらに p.108 のように回路も作成しておかねばなりません。<br />
また、タクトスイッチの利用にはこれまでの章と同様、RPi.GPIO ではなく gpiozero を用いています。
<br /><br />
これらのファイルを Thonny で開いて実行するか、下記のようにターミナルでコマンドを実行します。
<pre class="prettyprint">
python3 bb2-04-04-lcd-4modes.py
python3 bb2-04-05-lcd-3modes.py
</pre>
実行結果は本書のプログラムと同じです。
<br />
<br />
<h4>
p.108:I2Cデバイスの認識について</h4>
ここで用いる温度センサとLCDの組み合わせは「<a href="https://raspibb1a.blogspot.com/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」でも用いていますが、LCD を自作した場合、プログラムの動作に失敗するという方が多いようです。LCDを用いたプログラムを実行するためには、Raspberry PiからLCDが認識されていることが必要です。LCDが認識されているかどうかのチェック方法は、書籍に記さなかったのですが、ここで紹介します。なお、現在は LCD の<a href="https://akizukidenshi.com/catalog/g/g111753/" target="_blank">完成版</a>が販売されており、失敗のリスクは減っています(完成版では ~RESET ピンは省略されています)。
<br /><br />
温度センサとLCDを接続した回路(p.108の図4-9)を作成した状態で下記のコマンドを実行しましょう。
<br />
<pre class="prettyprint">i2cdetect -y 1
</pre>
このコマンドは、Raspberry Piに接続されたI2Cデバイスのアドレスを出力するものです。
<br />
正常な出力結果は下図のようになります。48が温度センサのアドレス0x48を表し、3eがLCDのアドレス0x3eを表します。48が表示されなければ温度センサを用いるプログラムは正常動作しませんし、3eが表示されなければLCDを用いるプログラムは動作しませんので、まずは下図の出力が得られることを目指しましょう。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy_cDeEIvp2nHKPsRG4og84AP-pIMmqXrjdGEl3GPVK19tObaq871pjTLjdb7W3Ja1MJbZ_Z6nIwF5Pi9Qg_lhnYNKIBdUOIyWxS7nZfTaQ6wxzVcHz1FdPqLDXrluFSQ53ygGDxQJxwx/s1600/i2cdetect.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy_cDeEIvp2nHKPsRG4og84AP-pIMmqXrjdGEl3GPVK19tObaq871pjTLjdb7W3Ja1MJbZ_Z6nIwF5Pi9Qg_lhnYNKIBdUOIyWxS7nZfTaQ6wxzVcHz1FdPqLDXrluFSQ53ygGDxQJxwx/s1600/i2cdetect.png" /></a></div>
<br /><br />
<h4>bb2-04-00-checkcity.py の利用</h4>
さて、上で説明したプログラムは、全て東京での天気予報を表示するものでした。これを別の都市の天気予報に変更したいときに用いるプログラムが bb2-04-00-checkcity.py です。
その使い方を解説します。
<br /><br />
ここまでのプログラムで天気予報の対象位置を指定するためには、実は緯度と経度を用いなければなりませんでした。5つのプログラム全てで、API key を指定した行の近くに下記の2行が存在します。
<pre class="prettyprint">
lat = '35.6895'
lon = '139.6917'
</pre>
これは緯度35.6895、経度139.6917を表しており、実はこれが東京を意味していた、というわけです。「東京」という地名で位置を指定したいところですが、それは無料枠の One Call API ではできない、ということです。
<br /><br />
ですから、天気予報の対象地を変えたいときは、下記の流れで行う必要があります。
<ol>
<li>対象地を決める</li>
<li>対象地の緯度と経度を調べる</li>
<li>調べた緯度と経度を5つのプログラムに書き込み、上書き保存する</li>
</ol>
このとき、「対象地の緯度と経度を調べる」ときに用いるのが bb2-04-00-checkcity.py であるというわけです。早速試してみましょう。
<br /><br />
まず、<a href="https://openweathermap.org/weathermap?basemap=map&cities=true&layer=temperature&lat=30&lon=-20&zoom=5" target="_blank">こちらのサイト</a>から対象地を決め、そのスペルを確認しておきましょう。マウスドラッグで位置変更ができ、マウスホイールで拡大率の変更ができます。
<br />
例えば、「Sapporo」を選ぶことにします。
<br /><br />
次に、bb2-04-00-checkcity.py を Thonny や mousepad で開き、下記の行を見つけます。
<pre class="prettyprint">
city = 'Tokyo'
</pre>
この行のTokyoの部分をSapporoに変更し、上書き保存します。
<pre class="prettyprint">
city = 'Sapporo'
</pre>
そして、bb2-04-00-checkcity.py を Thonny または下記のコマンドで実行してください。
<pre class="prettyprint">
python3 bb2-04-00-checkcity.py
</pre>
すると、下記のように Sapporo の緯度と経度が得られます。
<pre class="prettyprint">
Sapporo
lat = '43.0642'
lon = '141.3469'
</pre>
このうち、下記の2行で bb2-04-01~bb2-04-05 のファイルの該当行を置き換えて保存すれば、それらのファイルは Sapporo の天気予報を出力するようになります。
<pre class="prettyprint">
lat = '43.0642'
lon = '141.3469'
</pre>
<br />
<h3>
第5章</h3>
<h4>
p.141:LIRCの利用</h4>
リモコンの信号を学習し、利用するには LIRC というソフトウェアを用います。
Raspberry Pi の OS と LIRC のバージョンが更新されるに伴い、LIRC の利用法は大きく変化してきました。
本書の LIRC の利用方法の解説(本書 p.141~p.163 まで)は、以下の補足ページとともにご覧ください。
<ul>
<li><a href="https://raspibb2.blogspot.com/2021/11/raspberry-pi-os-bullseye-lirc.html" target="_blank">Raspberry Pi OS Bookworm / Bullseye / Buster でlircを利用する</a></li>
</ul>
ここから先は、p.163 までが実現した状況、すなわち irsend コマンドでテレビを操作できるようになった状況を前提として解説を続けます。
<br /><br />
<h4>
p.163:bb2-05-01-TV.py の利用</h4>
タクトスイッチでテレビを操作するプログラム bb2-05-01-TV.py の利用方法はこれまでと同じです。すなわち、Thonny で実行するか、ターミナルで下記のコマンドを実行します。
<pre class="prettyprint">
python3 bb2-05-01-TV.py
</pre>
これまで同様、タクトスイッチの利用に RPi.GPIO ではなく gpiozero を用いています。
<br /><br />
<h4>
p.168:ブラウザでのテレビの操作</h4>
ブラウザでのテレビの操作には、本書では WebIOPi というライブラリを用いました。WebIOPi は、Webサーバーとなる機能と GPIO を操作する機能を組み合わせたライブラリなのでした。
<br />
WebIOPi は Raspberry Pi 5 では動作しませんので、本ページではその代替として FastAPI というライブラリを用います。FastAPI は python3 で簡易的な Webサーバーを作成できるライブラリです。GPIO を操作する機能はありませんので、gpiozero などと組み合わせて用います。
<br /><br />
以上の理由から、WebIOPi についての解説がほとんどである本書 p.168~p.176 の解説は現時点ではあまり参考になりません。本ページの解説をご覧ください。
<br /><br />
まず、下記コマンドで FastAPI をインストールします。
<pre class="prettyprint">
sudo apt update
sudo apt install python3-fastapi
</pre>
p.160 の図5-12 の回路が準備できている状態で、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
<br />
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-05-02-TV」に移動します。
<pre class="prettyprint">
cd bb2-05-02-TV
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/bb2-05-02-TV
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/5-2
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/5-2 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.172 の図 5-16 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。
<br /><br />
なお、ここで実行したプログラムで重要なファイルは下記のものです。必要に応じて参照してください。
<pre class="prettyprint">
app.py : Pythonプログラム。Webサーバーの構築と、GPIO の利用など(ここではGPIOは用いていない)
static/javascript.js:JavaScript プログラム。ブラウザからの指令などを app.py に送る
templates/index.html:HTML ファイル。ページの見た目を決めている
</pre>
<br />
<h4>
p.176:本章を終えた後の後始末</h4>
以上で第5章の解説は終わりですが、Raspberry Pi をこのままの状態で使い続けると、以下の問題が起こります。
<ul>
<li>GPIO 25 と 24 を、LIRC で用いるように設定されているので(/boot/config.txt)、別の Python プログラムでこれらのピンを使おうとするとエラーがでる</li>
<li>lirc のプログラムが動作しっぱなしになる(特に害があるわけではありませんが)</li>
</ul>
これらの問題の解消方法を以下に記します。
<br /><br />
まず、 GPIO 25 と 24 の利用設定の解除です。まず、下記コマンドで /boot/config.txt を管理者権限の mousepad で開きます。
<pre class="prettyprint">
sudo mousepad /boot/config.txt
</pre>
なお、将来は /boot/config.txt は /boot/firmware/config.txt に変更されるようです。その場合コマンドは以下のようになるでしょう。
<pre class="prettyprint">
sudo mousepad /boot/firmware/config.txt
</pre>
そして、末尾に追加されている設定を、下記のように先頭に「#」をつけることでコメントアウトし無効化します。
<pre class="prettyprint">
#dtoverlay=gpio-ir,gpio_pin=24
#dtoverlay=gpio-ir-tx,gpio_pin=25
</pre>
上書き保存して mousepad を終了し、Raspberrry Pi を再起動すれば GPIO 25 と 24 の利用設定は解除されています。
<br /><br />
また、lirc の無効化は、以下のコマンドで lirc 自体を削除してしまうのが確実です。
<pre class="prettyprint">
sudo apt remove lirc liblirc0 liblirc-client0
</pre>
<br /><br />
<h3>
第6章</h3>
カメラ台を作成する第6章ですが、本書と本ページとでは下記の違いがあります。
<ul>
<li>GPIOの利用:RPi.GPIO から gpiozero への変更。さらに、ADコンバータのために SPI を有効にする必要がある。</li>
<li>ハードウェアPWMの利用:WiringPi-Python から独自プログラムへの変更。/boot/config.txt へ設定を追加する必要がある。</li>
<li>ブラウザの利用:WebIOPi から FastAPI への変更。</li>
<li>カメラの利用:libcamera 対応とし、カメラのライブラリを PiCamera から PiCamera2 へ変更。</li>
</ul>
本書のページの順番に従って解説していきます。
<br /><br />
<h4>
p.184:カメラモジュールについて</h4>
Raspberry Pi 用のカメラモジュールは、現在では下図のように バージョン 1 から バージョン 3 までの 3 バージョンがあります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfitihiOnPWB61L22aRcgRCek1C2w7_uWlkTXBG56jR5pWC5f-p1uyCe4yg9yKWyQKQnxEO3X--h1JOWA8bbs0gx4SsnZKvV_pdiORrblbVwLIXrhz9OCrrGCFocExie8pAGHrrMov7BYyD9slKJc8ljDSHGfZQVeTeNl1L2cerzgnTt1n-W9rUlBZ/s1280/cm123.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="513" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfitihiOnPWB61L22aRcgRCek1C2w7_uWlkTXBG56jR5pWC5f-p1uyCe4yg9yKWyQKQnxEO3X--h1JOWA8bbs0gx4SsnZKvV_pdiORrblbVwLIXrhz9OCrrGCFocExie8pAGHrrMov7BYyD9slKJc8ljDSHGfZQVeTeNl1L2cerzgnTt1n-W9rUlBZ/s600/cm123.jpg"/></a></div>
左から、バージョン1(基板が四角)、バージョン2(基板の角が丸く、レンズ周辺が黒)、バージョン3(基板の角が丸く、レンズ周辺が銀)です。基板上にもバージョンの記載がありますね。どのバージョンでも動作させることができます。
<br /><br />
Raspberry Pi 1 から Pi 4 でしたら、カメラモジュールの Raspberry Pi 本体への取り付けは、本書記載の通り「(ケーブルの)端子面がRaspberry PiのmicroSDカードの方を向くように」取り付けます。
<br /><br />
一方、Raspberry Pi Zero および Pi 5 の場合、カメラモジュールの取り付けにはいくつかの注意があります。
<br /><br />
まず、カメラモジュールに取り付けられているケーブルを、Pi Zero および Pi 5 に対応したものに交換する必要があります。例えば下記のものは Pi Zero でも Pi 5 でも利用可能です。
<ul>
<li><a href="https://www.switch-science.com/products/3195" target="_blank">Raspberry Pi Zero用カメラケーブル</a></li>
<li><a href="https://www.switch-science.com/products/9255" target="_blank">Raspberry Pi 5 FPCカメラケーブル(200mm)</a></li>
<li><a href="https://www.switch-science.com/products/9256" target="_blank">Raspberry Pi 5 FPCカメラケーブル(300mm)</a></li>
<li><a href="https://www.switch-science.com/products/9257" target="_blank">Raspberry Pi 5 FPCカメラケーブル(500mm)</a></li>
</ul>
Pi Zero 用ケーブルでRaspberry Pi Zero WH にカメラモジュールを取りつけた様子が下図です。Raspberry Pi 本体に向かってケーブルが細くなっているのがわかるでしょうか。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgebYhkrHovvCtM_LVSg2CjSDSAnLWU7wtmdZstW1qfvj42rvhXYa2n-gWmbt2zL3Hg240Lpx3B3s5IJv7fwl9k9dk7jBR4efTiJTc4pgd31rfvMaLr9NJeZ3Zpf-UPot-AmpxlOqAKnOw/s1600/PiZero_camera.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="217" data-original-width="955" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgebYhkrHovvCtM_LVSg2CjSDSAnLWU7wtmdZstW1qfvj42rvhXYa2n-gWmbt2zL3Hg240Lpx3B3s5IJv7fwl9k9dk7jBR4efTiJTc4pgd31rfvMaLr9NJeZ3Zpf-UPot-AmpxlOqAKnOw/s640/PiZero_camera.jpg" width="640" /></a></div>
<br />
専用ケーブルをカメラに取り付ける際、金属が露出した端子面を緑色の基板の方を向くようにします。基板上のカバーを引き出し、ケーブルを差し込んだ後でカバーを押し込むことでケーブルが固定されます。
<br />
専用ケーブルを Raspberry Pi 本体に取り付ける際、Pi Zero の場合はやはり金属が露出した端子面を緑色の基板の方を向くようにします。<br />
Pi 5 の場合は、下図のように「金属が露出した端子面が USB 端子側を向くように」取り付けます。これは Pi 1~Pi 5とは逆向きですので注意してください。<br />
また、Pi 5 にはカメラを取り付けられる場所が 2 箇所ありますが、「CAM/DISP 0」と書かれた方に接続しましょう。
<br /><br />
なお、<strong>どの Raspberry Pi を用いるにせよ、カメラのコネクタは壊れやすいので、両手で慎重に開け閉めしましょう</strong>。私は片手で雑に扱っていて壊したことがあります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrm5Jpg0CTVg1wTH-NQYvg5HJNCLCF0TDEPS1qiUR6agYSsRxZoKrdyEDYhWf0DW5NOTQ8iEBrkpYDVae4v3rcRNrNfP_scj6QrsKAs00zkV5oq98nWrHytc9dLeYzE5EaYkTJDnaor6_0Q5lvPHJTBSPzj-w-_M1RFRR6eGasD7reZ-c-CDQ35Dl3l-8/s1459/Pi5Camera_exp.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="600" data-original-height="1459" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrm5Jpg0CTVg1wTH-NQYvg5HJNCLCF0TDEPS1qiUR6agYSsRxZoKrdyEDYhWf0DW5NOTQ8iEBrkpYDVae4v3rcRNrNfP_scj6QrsKAs00zkV5oq98nWrHytc9dLeYzE5EaYkTJDnaor6_0Q5lvPHJTBSPzj-w-_M1RFRR6eGasD7reZ-c-CDQ35Dl3l-8/s600/Pi5Camera_exp.png"/></a></div>
<br /><br />
<h4>
p.192:ハードウェアPWMを用いるための準備</h4>
本書p.192では、ハードウェアPWMを用いるために WiringPi2-Python のインストールを行っていますが、この作業は不要です。 WiringPi2-Python は Pi 5 で動作しないためです。
その代替として、以下のように /boot/config.txt に一行追加する設定を行ってください。
<br /><br />
まず、管理者権限の mousepad で /boot/config.txt を編集用に開きましょう。下記のコマンドで行うのでした。
<pre class="prettyprint">
sudo mousepad /boot/config.txt
</pre>
なお、将来は /boot/config.txt は /boot/firmware/config.txt に変更されるようです。その場合コマンドは以下のようになるでしょう。
<pre class="prettyprint">
sudo mousepad /boot/firmware/config.txt
</pre>
そして、そのファイルの末尾に下記の一行を追加し、上書き保存してから mousepad を閉じてください。
<pre class="prettyprint">
dtoverlay=pwm-2chan
</pre>
その後、Raspberry Pi を再起動することで、GPIO 18 と 19 をハードウェアPWMを出力するために利用できるようになります。
<br /><br />
なお、Pi 5 をお使いで、2024年3月10日頃にOSをアップデートした方は、ハードウェアPWMを使うプログラムが動作しなくなっています。この問題はいずれ修正されるとは思いますが、<br />
それまでは、08-04-servo.py を用いた演習を後回しにするか、2023年12月にリリースされたOSをアップデートせずに用いるのが良いでしょう。
<br /><br />
<h4>
p.195:サーボモーターを 0 度の位置に動かすためのプログラム</h4>
サーボモーターを 0 度の位置に動かすためのプログラムのファイル名は、本書と同じく bb2-06-01-zero.py です。
Thonny で読み込んで実行するか、ターミナルで下記のコマンドで実行してください。管理者権限は不要です。
<pre class="prettyprint">
python3 bb2-06-01-zero.py
</pre>
<br />
<h4>
p.199~201:タミヤの工作キットで作ったカメラ台のカラー画像</h4>
タミヤの工作キットで作るカメラ台の作成方法を示す図ですが、書籍では画像がやや小さく見にくいかもしれません。下記に、カラーで解像度の高い画像を貼り付けますので、ご活用ください。<br />
<br />
画像をクリックすると画像が大きくなります。必要に応じて、大きくした画像上で右クリックして「名前を付けて保存」を選択して保存すると良いでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9HuWtbyvcfON16iv5tgvwauMq3SNKUcD8rUjlZaxBWJZNLslYaqCcMqNZCP1OQv1mthc9N6jHfZlJYPpzz8GEVzQBg_mxMz2NELnJpO_7roLEQWxLLsedHhg9awNrSg2l7ZjcPjBVoao/s1600/fig06-07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9HuWtbyvcfON16iv5tgvwauMq3SNKUcD8rUjlZaxBWJZNLslYaqCcMqNZCP1OQv1mthc9N6jHfZlJYPpzz8GEVzQBg_mxMz2NELnJpO_7roLEQWxLLsedHhg9awNrSg2l7ZjcPjBVoao/s640/fig06-07.png" width="640" /></a></div>
<div style="text-align: center;">
図6-7</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1JACBbHxQ5SksoA4M96Y53yxWieroqwlCrpffaBrPYdE79NAl8DUyDAOW-sNYGPlFrUzMy5aGvJuNC2RwIGV54zAf9kjuapdy6sjfml8ITnXVFkJQyOQ76zH5n5XTjh-SbLigBJY08G4/s1600/fig06-08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1JACBbHxQ5SksoA4M96Y53yxWieroqwlCrpffaBrPYdE79NAl8DUyDAOW-sNYGPlFrUzMy5aGvJuNC2RwIGV54zAf9kjuapdy6sjfml8ITnXVFkJQyOQ76zH5n5XTjh-SbLigBJY08G4/s640/fig06-08.png" width="640" /></a></div>
<div style="text-align: center;">
図6-8</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUo_ZXdHoM4ee1adf8U0fF6CE72u8b-8YQ0Nrw0jOnvyzSYElECyzqFlX8Pqm-b2vkD-OkwOCZZ_u9kjA89rCxHbuL9f5VpliqEfRKBusUyyKa7mBMS-iKDaCq6DloXKAi9gNABj2xsE/s1600/fig06-09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUo_ZXdHoM4ee1adf8U0fF6CE72u8b-8YQ0Nrw0jOnvyzSYElECyzqFlX8Pqm-b2vkD-OkwOCZZ_u9kjA89rCxHbuL9f5VpliqEfRKBusUyyKa7mBMS-iKDaCq6DloXKAi9gNABj2xsE/s640/fig06-09.png" width="640" /></a></div>
<div style="text-align: center;">
図6-9</div>
<br />
<h3>
p.205:カメラマウントA838を用いた場合のカメラ台のカラー画像</h3>
同様に、図6-12、図6-13のカラー画像も載せます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyKD3Dq5DttQ1nbQ3CiJGf8eqHCE9QzbTiqNutHunjWT0Z4lAwKmHkd12hcqqaYaKpByQeH9htHWpYt1Narjsa4MLApluqI1qlAZG0IQJq48prMXc6-xxzcP8iSqIEFF7hJjTGnwBJAcY/s1600/fig06-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyKD3Dq5DttQ1nbQ3CiJGf8eqHCE9QzbTiqNutHunjWT0Z4lAwKmHkd12hcqqaYaKpByQeH9htHWpYt1Narjsa4MLApluqI1qlAZG0IQJq48prMXc6-xxzcP8iSqIEFF7hJjTGnwBJAcY/s640/fig06-12.png" width="640" /></a></div>
<div style="text-align: center;">
図6-12</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimfKR-FxdHYCXQ4qd2xwTUDJrTg9UKtaT_uZqB2KvK8nG6B5J1QJ_49YGV8-3H5T5X1HEqjKpivZJjIj4Movec_e6CKYEMOU7BiTsa1aJBPkbAVpbhE-7CRIvPqwvfLenUIRis_2OOVXM/s1600/fig06-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimfKR-FxdHYCXQ4qd2xwTUDJrTg9UKtaT_uZqB2KvK8nG6B5J1QJ_49YGV8-3H5T5X1HEqjKpivZJjIj4Movec_e6CKYEMOU7BiTsa1aJBPkbAVpbhE-7CRIvPqwvfLenUIRis_2OOVXM/s640/fig06-13.png" width="640" /></a></div>
<div style="text-align: center;">
図6-13</div>
<br />
<br />
<br /><br />
<h4>
p.206:カメラモジュールの有効化は不要</h4>
本書では、カメラモジュールの有効化の方法が解説されていますが、現在はこの作業は不要です。
<br /><br />
<h4>
p.207:AD変換器の利用のためのSPIの有効化</h4>
p.207 よりAD変換器の利用方法が解説されています。現在では、ここで「SPIの有効化」の作業が必要です。以下の手順で実行してください。
<ol>
<li>デスクトップ左上のメニューから、「設定」→「Raspberry Piの設定」を起動</li>
<li>「インターフェイス」タブをクリック</li>
<li>「SPI」のスイッチをONにして有効化する</li>
</ol>
<br />
<h4>
p.210:bb2-06-02-pantilt.py の実行</h4>
サーボモーター2つを半固定抵抗で制御するプログラムのファイル名は、本書と同じく bb2-06-02-pantilt.py です。
Thonny で読み込んで実行するか、ターミナルで下記のコマンドで実行してください。管理者権限は不要です。
<pre class="prettyprint">
python3 bb2-06-02-pantilt.py
</pre>
サーボの回転の向きを変えたい場合、プログラム中の下記の部分の2行目先頭の「#」を削除するか、
<pre class="prettyprint">
# 一般的なサーボモーターはこちらを有効に
#duty = (servo_max-servo_min)*(val-val_min)/(val_max-val_min) + servo_min
</pre>
あるいは下図のように半固定抵抗の3.3VとGNDへの接続を入れ替えるかのどちらかの方法をとってください。
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikQvAhiYyGMx2l_uVdJEPlSx0wP174MCPV9zPYEuoOlGWEvRivNwIP_U_0zAWIjy9SKU50PRnrfWpEBvHEpnFHfZ_Dt_bcGwxnevPizDNqJ9mGvDxZ4Rm12rpPbe392C3zv6k74fSD8lTq/s1600/DirectionOfVolume.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikQvAhiYyGMx2l_uVdJEPlSx0wP174MCPV9zPYEuoOlGWEvRivNwIP_U_0zAWIjy9SKU50PRnrfWpEBvHEpnFHfZ_Dt_bcGwxnevPizDNqJ9mGvDxZ4Rm12rpPbe392C3zv6k74fSD8lTq/s400/DirectionOfVolume.png" width="400" /></a></div>
<br /><br />
<h4>
p.211:カメラモジュールのテスト用コマンド</h4>
211ページのカメラモジュールのテスト用コマンドは、現在では下記に変更してください。
<pre class="prettyprint">libcamera-hello -t 0
</pre>
libcamera-hello が存在しないと言われた場合、下記のコマンドでインストールできます。
<pre class="prettyprint">sudo apt update
sudo apt install libcamera-apps
</pre>
なお、libcamera-hello ではなく、第7章で使用する bb2-07-01-preview.py を実行しても良いです(ただし、OpenCVをインストールする必要があります)。
<br />
<br />
<h4>
p.222:mjpg-streamerのインストール用のコマンド</h4>
p.222からp.223で紹介したmjpg-streamerのインストール手順は、以下に変更してください。
<pre class="prettyprint">(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
</pre>
なお、OS として Bullseye やリリース直後の Bookworm をお使いの方は、上記の (5) で LibCamera.cpp のビルド中にエラーが起こると思います。その場合、エラーが出た状態から以下の 8 コマンドを一つずつ順に実行してください。この 8 コマンドが上記 (5)~(7) の代替、というイメージです。
<pre class="prettyprint">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
</pre>
<br /><br />
<h4>
p.224:mjpg-streamerの実行用コマンド</h4>
mjpg-streamerの実行用ファイルは、書籍から変わっており bb2-06-03-stream.py です。以前まではこのファイルは拡張子が sh のシェルスクリプトでしたが、Python によるスクリプトに変更しました。<br />
理由は、libcamera 対応の mjpg-streamer が時折異常終了するため(典型的には 30 分おきくらい)、2秒おきに実行状況をチェックして必要に応じて mjpg-streamer を再起動させるためです。
<br />
お手元のファイルが Python ファイル (拡張子 py) ではなくシェルスクリプトのまま(拡張子 sh)の場合は、raspi2-sample-pi5.zip をダウンロードしなおしてください(2024.2.28更新)。
<br /><br />
このファイルを実行する前に、使用しているカメラモジュールの設定が必要な場合があります。
まず、mousepad で bb2-06-03-stream.py を開いてみましょう。7行目に下記の内容が見えるはずです。
<pre class="prettyprint">opt_in = 'input_libcamera.so -camver 1 -fps 15 -r 640x480 -s 640x480'
</pre>
このうち
<pre class="prettyprint">-camver 1
</pre>
の部分が、カメラモジュールのバージョンの数字を指定している部分です。お使いのカメラモジュールがバージョン 2 か 3 なら、この数字を 2 または 3 に変更し、それからファイルを上書き保存してください。
<br /><br />
その後、下記コマンドで mjpg-streamer を実行できます。
<pre class="prettyprint">python3 bb2-06-03-stream.py &
</pre>
ブラウザでの動作確認は、本書 p.224 と同じです。
<br /><br />
<h4>
p.225:ブラウザでのカメラ台の制御</h4>
p.225 から始まるブラウザでのカメラ台の制御は、本書では WebIOPi を用いていました。本ページではそれを FastAPI で行うよう変更します。これは、第5章 p.168 と同じです。
そのため、図6-18の回路図のみは共通ですが、それ以外の p.225~p.235 の WebIOPi の解説はあまり参考にならないと思ってください。以下で FastAPI を用いたプログラムの実行方法を解説します。
<br /><br />
まず、まだ FastAPI をインストールしていない場合は下記コマンドでインストールします。
<pre class="prettyprint">
sudo apt update
sudo apt install python3-fastapi
</pre>
それ以外には、ハードウェアPWMを利用するために本ページの「p.192:ハードウェアPWMを用いるための準備」に基づき、
/boot/config.txt (将来は /boot/firmware/config.txt)の末尾に「dtoverlay=pwm-2chan」を追記する必要があります。
<br /><br />
そして、p.226 の図6-18 の回路が準備できている状態で、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
<br />
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-06-05-pantilt」に移動します。
<pre class="prettyprint">
cd bb2-06-05-pantilt
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/bb2-06-05-pantilt
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/6-5
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/6-5 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.230 の図 6-19 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。
<br /><br />
なお、ここで実行したプログラムで重要なファイルは下記のものです。必要に応じて参照してください。
<pre class="prettyprint">
app.py : Pythonプログラム。Webサーバーの構築と、GPIO の利用など
static/javascript.js:JavaScript プログラム。ブラウザからの指令などを app.py に送る
templates/index.html:HTML ファイル。ページの見た目を決めている
</pre>
なお、ブラウザ上のカメラの映像ですが、上述した mjpg-streamer が異常終了の問題が起こった場合、映像がそこで停止しているでしょう。その場合、ブラウザで再読み込みを実行すると、映像が再び流れ始めると思います。
<br /><br />
<br />
<h4>
PDF15:PCA9685 + 半固定抵抗でのカメラ台の操作</h4>
追加PDFで解説した、サーボドライバ PC9685 と半固定抵抗でカメラ台を操作するプログラムは bb2-06-04-pantilt-pca9685.py です。
Thonny で読み込んで実行するか、ターミナルで下記のコマンドで実行してください。管理者権限は不要です。I2C が有効化されている必要があります。
<pre class="prettyprint">
python3 bb2-06-04-pantilt-pca9685.py
</pre>
<br />
<h4>
PDF16:PCA9685 + ブラウザでのカメラ台の操作</h4>
追加PDFで解説した、サーボドライバ PC9685 とブラウザでカメラ台を操作するプログラムは bb2-06-06-pantilt-pca9685/ ディレクトリに格納されています。
FastAPI をインストールし、さらに mjpg-streamer をインストール&実行し、I2C を有効にした状態で下記の手順で実行します。
<br />
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-06-06-pantilt-pca9685」に移動します。
<pre class="prettyprint">
cd bb2-06-06-pantilt-pca9685
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/bb2-06-06-pantilt-pca9685
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/6-6
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/6-6 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
現れるページの見た目と機能は p.230 の図 6-19 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。
<br />
<br />
<h3>
第7章</h3>
<h4>
p.238:OpenCVのインストールコマンド</h4>
OpenCV は下記のコマンドで実行してください。
<pre class="prettyprint">sudo apt update
sudo apt install libopencv-dev python3-opencv
</pre>
<br />
<h4>
p.239~p.260:画像処理プログラムの実行用コマンド</h4>
p.239~p.260 で紹介したプログラム(bb2-07-01 から bb2-07-05 まで)の実行コマンドは下記です。書籍との違いは、カメラモジュールの利用に libcamera + picamera2 を用いていることです。
<pre class="prettyprint">python3 bb2-07-01-preview.py
python3 bb2-07-02-binary.py
python3 bb2-07-03-cannyedge.py
python3 bb2-07-04-circle.py
python3 bb2-07-05-face.py
</pre>
<br />
<h4>
p.261~p.268:画像追跡プログラムの実行用コマンド</h4>
p.261~p.268 で紹介したプログラム(bb2-07-06 から bb2-07-07 まで)の実行するためには、ハードウェアPWMを有効にする必要があります。本ページの「p.192:ハードウェアPWMを用いるための準備」に基づき、
/boot/config.txt (将来は /boot/firmware/config.txt)の末尾に「dtoverlay=pwm-2chan」を追記するのでした。以上の準備のもと、下記コマンドを実行します。
<pre class="prettyprint">python3 bb2-07-06-tracking-circle.py
python3 bb2-07-07-tracking-face.py
</pre>
<br />
<h4>
PDF17:PCA9685 を用いた画像追跡プログラムの実行用コマンド</h4>
PDF17~PDF19 で紹介したプログラム(bb2-07-08 から bb2-07-09 まで)の実行するためには、I2C を有効にする必要があります。その上で、下記コマンドを実行します。
<pre class="prettyprint">python3 bb2-07-08-tracking-circle-pca9685.py
python3 bb2-07-09-tracking-face-pca9685.py
</pre>
<br />
<h3>
第8章</h3>
<h4>
p.277:6脚ロボットのカラー画像について</h4>
6脚ロボットの作成方法を示す図ですが、書籍では画像がやや小さく見にくいかもしれません。下記に、カラーで解像度の高い画像を貼り付けますので、ご活用ください。<br />
<br />
画像をクリックすると画像が大きくなります。必要に応じて、大きくした画像上で右クリックして「名前を付けて保存」を選択して保存すると良いでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj381GnatSElbi8r6qqJMUvR8vQAcwpbYvCjls5jkq9hBNDlR0WHwmhOV1IBApnNO2sToco6JHUq7PF-alnlIa-mpRBle2Mx-IG9xye1wFmmQzh1jiJswu5S1JRfTue7aR-S5HIn3g9orA/s1600/fig08-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj381GnatSElbi8r6qqJMUvR8vQAcwpbYvCjls5jkq9hBNDlR0WHwmhOV1IBApnNO2sToco6JHUq7PF-alnlIa-mpRBle2Mx-IG9xye1wFmmQzh1jiJswu5S1JRfTue7aR-S5HIn3g9orA/s640/fig08-03.png" width="491" /></a></div>
<div style="text-align: center;">
図8-3</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzGGvqkTp9bPsLtaIGyharfNrloQgnfSKClYktYExlwAfbZrVoLAeS9b-YDdn7h2LiOhiQGgFIzBht97-pZTOTUtheupjAlAEP15nDIU8N-ETd8AG5ZKDupb1DDShYerqrYYfMweqU9WI/s1600/fig08-12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="596" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzGGvqkTp9bPsLtaIGyharfNrloQgnfSKClYktYExlwAfbZrVoLAeS9b-YDdn7h2LiOhiQGgFIzBht97-pZTOTUtheupjAlAEP15nDIU8N-ETd8AG5ZKDupb1DDShYerqrYYfMweqU9WI/s640/fig08-12.jpg" width="640" /></a></div>
<div style="text-align: center;">
図8-12</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhABc8hYnh9pCsEY3S4GUZvUvtIIXdTl4eEvwG5oMHU1gUNEOP1y6JFckPWLvgAH3l00mZugO79b24sOPOeXl0kh3fMgmWTsxUmSGhlHbA4ijjhnhSysJObPbCh-Mszk72S_FaZzIQv1DE/s1600/fig08-16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="515" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhABc8hYnh9pCsEY3S4GUZvUvtIIXdTl4eEvwG5oMHU1gUNEOP1y6JFckPWLvgAH3l00mZugO79b24sOPOeXl0kh3fMgmWTsxUmSGhlHbA4ijjhnhSysJObPbCh-Mszk72S_FaZzIQv1DE/s640/fig08-16.jpg" width="640" /></a></div>
<div style="text-align: center;">
図8-16</div>
<br />
<h4>
p.280~p.292: PCA9685 でサーボモーターを動かすプログラム</h4>
PCA9685 でのサーボモーターを動かすプログラム bb2-08-01-zero-pca9685.py および bb2-08-02-6legs-pca9685.py の内容は、書籍からほとんど変更を受けていません。
これは、外部回路 PCA9685 を用いたことの効果です。ですので、書籍の指示通りにご利用ください。I2C の有効化が必要なことに注意してください。
<br /><br />
<h4>
p.292: ソフトウェアPWMでサーボモーターを動かすプログラム</h4>
ソフトウェアPWMを用いるプログラム bb2-08-03-6legs-sw.py を用いる場合は、いくつか注意が必要です。
これまでの章で、/boot/config.txt を編集した場合、それらを無効にする必要があるのです。
<br />
<br />
具体的述べましょう。
下記コマンドで /boot/config.txt を管理者権限の mousepad で開きます。
<pre class="prettyprint">sudo mousepad /boot/config.txt
</pre>
なお、将来は /boot/config.txt は /boot/firmware/config.txt に変更されるようです。その場合コマンドは以下のようになるでしょう。
<pre class="prettyprint">
sudo mousepad /boot/firmware/config.txt
</pre>
そして、第5章でテレビのリモコン操作をするための設定が末尾にあった場合、下記のように先頭に「#」をつけてコメントアウトして無効化します。
<pre class="prettyprint">
#dtoverlay=gpio-ir,gpio_pin=24
#dtoverlay=gpio-ir-tx,gpio_pin=25
</pre>
これで GPIO24 と GPIO25 をソフトウェアPWMの出力として利用できるようになります。
<br /><br />
さらに、同じく /boot/config.txt (将来は /boot/firmware/config.txt)の末尾にハードウェア PWM の設定があった場合、下記のように先頭に「#」をつけてコメントアウトして無効化します。
<pre class="prettyprint">
#dtoverlay=pwm-2chan
</pre>
これで GPIO18 をソフトウェアPWMの出力として利用できるようになります。
<br /><br />
以上の編集を行ったら、 /boot/config.txt (将来は /boot/firmware/config.txt)を上書き保存して mousepad を閉じ、Raspberry Pi を再起動しましょう。以上でソフトウェアPWMを用いたプログラムが動作するようになります。
<br /><br />
<h4>
p.296:6脚ロボットの安定性について</h4>
ハンチング対策の解説において、サーボモーターSG90に与える電圧(乾電池の本数)によって6脚ロボットの挙動が異なることに触れました。サーボモーターの個体差などにもよりますが、6脚ロボットのモーターに与える電圧が大きく、その結果流れる電流が大きくなるとSG90の挙動が不安定になることがありました。<br />
具体的には「モーターの角度が指定していない角度に動き、そこでロックしてしまう」という現象が起きました。もし、同様の現象に悩まされている方は、以下に記す解消方法を試してみて下さい。なお、書籍の中でサーボドライバの類似品は「Adafruitのものと挙動が異なる場合がある」と記しましたが、類似品の中にはこの「指定していない角度でモーターがロック」という現象が起こりやすいものもあり、そのため、類似品はサポート対象外としました。<br />
<br />
<b>対策1:モーターに与える電圧を小さくする</b><br />
モーターに与える電圧を小さくすると、6脚ロボットが安定する傾向があります。簡単にこれを実現するは、乾電池1本の電圧(約1.5V)とエネループなどのニッケル水素充電池の電圧(約1.2V)が異なることを利用するのが簡単です。以下の様な電圧を簡単に作ることができます。<br />
<ul>
<li>約4.5V:乾電池3本</li>
<li>約3.6V:エネループなどのニッケル水素充電池3本</li>
</ul>
もしエネループなどのニッケル水素充電池をお持ちの場合、試してみると良いかもしれません。ただし、乾電池や充電池2本まで電圧を下げると、6脚ロボットは動作しませんので注意してください。なお、乾電池とニッケル水素充電池を混ぜて用いるのはやめましょう。<br />
また、乾電池を用いるにせよ、充電池を用いるにせよ、新品の乾電池あるいは充電直後の充電池は、使っているうちに徐々に電圧が小さくなっていきます(参考:<a href="http://ctlg.panasonic.co.jp/sanyo/products/eneloop/support/faq/eneloop.html" target="_blank">Panasonic | エネループシリーズについて</a>)。そのため、使っているうちに6脚ロボットの安定性が徐々に変化することはあり得ます。<br />
<br />
<b>対策2:</b><b>ロボットの脚の振り幅を小さくする</b><br />
6脚ロボットを安定させるもう一つの方法は、脚の振り幅を小さくすることです。脚の振り幅が小さいということは、モーターの回転する角度が小さいということなので、モーターに流れる電流が小さくなり、その結果6脚ロボットが安定して動作する傾向があります。ただし、ロボットの動きはややゆっくりになります。下記のファイルを変更することで実現できます。<br />
カメラなし、ハードウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/03/script.py<br />
カメラなし、ソフトウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/04/script.py<br />
カメラあり、ハードウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/05/script.py<br />
これらのファイルの中で、下記の部分を見つけます。
<br />
<pre class="prettyprint">LEG_F_R = NEUTRAL + 100
LEG_F_L = NEUTRAL - 100
LEG_B_R = NEUTRAL - 100
LEG_B_L = NEUTRAL + 100
</pre>
4つある数字の100が、脚の振り幅(モーターの動く角度)に対応する数値です。これを小さめの値、例えば下記のように60に変更します。
<br />
<pre class="prettyprint">LEG_F_R = NEUTRAL + 60
LEG_F_L = NEUTRAL - 60
LEG_B_R = NEUTRAL - 60
LEG_B_L = NEUTRAL + 60
</pre>
変更して保存した後はWebIOPiを再起動する必要があります。WebIOPiが自動起動する設定になっている場合、Raspberry Piを再起動してしまうのが簡単でしょう。<br />
<br />
<b>対策3:モーターに与える電圧を大きくする</b><br />
さらに、<a href="https://twitter.com/Syun_itiHonda/status/934984137093427200" target="_blank">Syun'iti Hondaさん</a>のように、
モーター用の電源を
「約4.5V:乾電池3本」
から
「約4.8V:エネループなどのニッケル水素充電池4本」
に変更すると安定したというご報告もあります。このあたりはサーボモーターの個体差や消耗具合に依存するのかもしれません。
この場合、電池4本用の電池ボックスとしては「<a href="https://akizukidenshi.com/catalog/g/g100311/" target="_blank">電池ボックス 単3×4本 リード線・フタ・スイッチ付</a>」などがあります。
<br />
<br />
<h4>
p.296:サーボモーターの消耗について</h4>
本書ではSG-90というサーボモーターで6脚ロボットを作成しました。一般的に、サーボモーターは長く使っていると作成当初から挙動が変わり、交換が必要になる場合があります。そういう意味で、サーボモーターは消耗品と考えた方がよいかもしれません。
<br />
私の場合、6脚ロボットを初めて作成してから書籍が出版されるまでの約8ヶ月の間に、1つのサーボモーターを交換しました。具体的には、機体を持ったまま脚を動かした際、1つの脚だけ他の脚に比べて動きが遅くなったため交換しました。
<br /><br />
<h4>
p.300: ブラウザからの6脚ロボットの動作</h4>
p.300 から始まるブラウザでの6脚ロボットの制御は、本書では WebIOPi を用いていました。本ページではそれを FastAPI で行うよう変更します。これは、第5章 p.168 や 第6章 p.225 と同じです。
そのため、p.301~p.305 の WebIOPi の解説はあまり参考にならないと思ってください。以下で FastAPI を用いたプログラムの実行方法を解説します。
<br /><br />
まず、まだ FastAPI をインストールしていない場合は下記コマンドでインストールします。
<pre class="prettyprint">
sudo apt update
sudo apt install python3-fastapi
</pre>
そして、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
<br />
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-08-06-pca9685」に移動します(なお、ソフトウェアPWMを用いる場合のディレクトリは bb2-08-07-sw です)。
<pre class="prettyprint">
cd bb2-08-06-pca9685
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/bb2-08-06-pca9685
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/8-6
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/8-6 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.305 の図 8-11 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。
<br /><br />
なお、ここで実行したプログラムで重要なファイルは下記のものです。必要に応じて参照してください。
<pre class="prettyprint">
app.py : Pythonプログラム。Webサーバーの構築と、GPIO の利用など
static/javascript.js:JavaScript プログラム。ブラウザからの指令などを app.py に送る
templates/index.html:HTML ファイル。ページの見た目を決めている
</pre>
なお、ソフトウェアPWMも用いる場合のプログラムは bb2-08-07-sw ディレクトリに格納されており、実行時に参照すべきアドレスは「http://(Raspberry PiのIPアドレス):8000/8-7」です。
<br /><br />
<h4>
p.307: Webサーバーの自動起動について</h4>
p.307 では Web サーバーである WebIOPi の自動起動について記されています。本ページではこれを「python3 app.py コマンドの自動起動」に置き換えて解説します。
<br /><br />
まず、「python3 app.py コマンドの自動起動」をするためには、このコマンドをサービスとして登録するのが確実です。
そのために必要なファイルは、サンプルファイルの中の bb2-08-06-pca9685 ディレクトリにある web6legs.service というテキストファイルとして保存されています。
このファイルを活用する前に、その内容を皆さんの環境に合わせてカスタマイズする必要があります。
<br /><br />
このファイルは単なるテキストファイルのですので、テキストエディタ(mousepad)で開いてみましょう。
<br /><br />
管理者権限は不要ですのでファイルマネージャから開いても良いですし、コマンドで開く場合、「 cd bb2-08-06-pca9685 」または「 cd blubacks/bb2-08-06-pca9685 」でディレクトリを移動した後、下記コマンドで開けます。
<pre class="prettyprint">
mousepad web6legs.service
</pre>
すると、以下の内容がみられます。
<pre class="prettyprint">
[Unit]
Description=Web6Legs
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/pi/bb2-08-06-pca9685
#WorkingDirectory=/home/pi/bluebacks/bb2-08-06-pca9685
ExecStart=/usr/bin/python3 -m app
TimeoutStopSec=5
StandardOutput=null
[Install]
WantedBy = multi-user.target
</pre>
変更しなければならないのは下記の部分、すなわち、プログラムが存在するディレクトリを指定している部分です。
<pre class="prettyprint">
WorkingDirectory=/home/pi/bb2-08-06-pca9685
#WorkingDirectory=/home/pi/bluebacks/bb2-08-06-pca9685
</pre>
2行ありますが、2行目の先頭に「#」がついていますのでこちらは無効化された状態です。<br />
1行目がサンプルファイルをホームディレクトリに直に展開した場合、2行目がサンプルファイルを bluebacks ディレクトリ内に展開した場合ですので、
自分に合った方を有効にしてください。<br />
<br />
次に着目して頂きたいのは、ディレクトリの「/home/pi」の部分です。この「pi」はユーザー名を現していますので、これを皆さんのユーザー名に変更してください。
私の場合でしたら、「pi」の部分を「kanamaru」に変更、ということです。
変更が済んだら上書き保存し、mousepad を閉じてください。
<br /><br />
その後、下記のコマンドで web6legs.service ファイルを /etc/systemd/system ディレクトリに管理者権限でコピーします。
<pre class="prettyprint">
sudo cp web6legs.service /etc/systemd/system/
</pre>
そうすると、ブラウザで6脚ロボットを操作するためのプログラムが「web6legs」という名前のサービスとして利用できるようになります。サービスの起動と終了を行うコマンドは以下の通りです。これらのコマンドは、どのディレクトリで実行しても構いません。
<br /><br />
サービス起動(python3 app.py を実行するのと同等)
<pre class="prettyprint">
sudo service web6legs start
</pre>
サービス終了(python3 app.py の終了と同等)
<pre class="prettyprint">
sudo service web6legs stop
</pre>
なお、サービスが起動しているかどうかは、下記のように ps ax コマンドの出力から「python3」を含むものを抽出することで確認することができます。
<pre class="prettyprint">
kanamaru@raspberrypi:~ $ ps ax | grep python3
914 ? Ssl 0:00 /usr/bin/python3 -m app
1947 pts/0 S+ 0:00 grep --color=auto python3
</pre>
1行目の「/usr/bin/python3 -m app」が、プログラム app.py が実行されていることを表します。
<br /><br />
なお、以上の service コマンドでサービスを起動しても、Raspberry Pi を終了や再起動するとサービスは終了し、自動起動することはありません。
Raspberry Pi の起動時にこのサービスを自動起動するには、下記のコマンドを用います。このコマンドも、どのディレクトリで実行しても構いません。
<pre class="prettyprint">
sudo systemctl enable web6legs
</pre>
このコマンドを実行後、Raspberry Pi を再起動すると、自動で web6legs が起動されるようになります。ps ax コマンドで確認してみましょう。
<br /><br />
自動起動を無効に戻すには、以下のコマンドを用います。
<pre class="prettyprint">
sudo systemctl disable web6legs
</pre>
<br />
<h4>
p.308: LCDへのIPアドレスの表示について</h4>
本書では、Raspberry Piにブラウザからアクセスする際にIPアドレスを用いました。そのため、Raspberry Piにルーターなどから割り振られたIPアドレスを知る目的で、LCDを回路に取り付けました。<br />
<br />
しかし、本ページ下部の「p.335:IPアドレスでのURLの指定について」で記しますように、avahiという仕組みを用いると、IPアドレスではなく、下記のようなアドレスでのアクセスが可能になるのでした(ただし、p.335の注釈に示すように制限がありますので注意)。<br />
<ul>
<li>http://raspberrypi.local:8000/5-2</li>
</ul>
これを用いると、回路からLCDが不要になるなどのメリットがあります。具体的には下記の通りです。
<br />
<ul>
<li>p.309の図8-13やp.310の図8-14からLCDを取り外して良い</li>
<li>p.310での/etc/rc.localへの「python3 /home/pi/bb2-08-04-lcd.py $_IP &」の記述が不要</li>
</ul>
さらに、Raspberry PiのIPアドレスを固定する、という方法でも、毎回IPアドレスを調べる必要がなくなりますね。こちらについては前著サポートページ内の「<a href="https://raspibb1.blogspot.com/2019/01/raspberry-piip.html" target="_blank">Raspberry PiのIPアドレスを固定する</a>」にまとめましたので、興味のある方は御覧ください<br />
<br />
<h4>
p.311:IPアドレスをLCDに表示するプログラムを自動起動するための記述</h4>
IPアドレスをLCDに表示するプログラムを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
<br />
<pre class="prettyprint">python3 /home/pi/bb2-08-04-lcd.py $_IP
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-08-04-lcd.py $_IP」となる、ということです。
<br /><br />
また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
<br />
<pre class="prettyprint">python3 /home/pi/bluebacks/bb2-08-04-lcd.py $_IP
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.314:シャットダウン用プログラムを自動起動するための記述</h4>
シャットダウン用プログラムを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
<br />
<pre class="prettyprint">python3 /home/pi/bb2-08-05-shutdown.py &
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-08-05-shutdown.py &」となる、ということです。
<br /><br />
また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
<br />
<pre class="prettyprint">python3 /home/pi/bluebacks/bb2-08-05-shutdown.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br />
<br />
<h4>
p.318:mjpg-streamerを自動起動するための記述</h4>
mjpg-streamerをを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
<br />
<pre class="prettyprint">python3 /home/pi/bb2-06-03-stream.py &
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-06-03-stream.py &」となる、ということです。
<br /><br />
また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
<br />
<pre class="prettyprint">python3 /home/pi/bluebacks/bb2-06-03-stream.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.319:ブラウザでのカメラ付き6脚ロボットの操作</h4>
ブラウザでカメラ付き6脚ロボットを操作するプログラムは bb2-08-08-pca9685/ ディレクトリに格納されています。
FastAPI をインストールし、さらに mjpg-streamer をインストール&実行し、I2C を有効にした状態で下記の手順で実行します。
<br />
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「bb2-08-08-pca9685」に移動します。
<pre class="prettyprint">
cd bb2-08-08-pca9685
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/bb2-08-08-pca9685/
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/8-8
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/8-8 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.336 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
現れるページの見た目と機能は p.230 の図 6-19 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi2-sample-pi5.zip をダウンロードして頂けますでしょうか?2024.02.25 にサンプルファイルを更新したためです。
<br /><br />
なお、カメラ付き6脚ロボットの操作プログラムを自動起動したい場合は、 web6legs.service 内の「WorkingDirectory」の行を書き換えてから /etc/systemd/system ディレクトリにコピーし直せば良いでしょう。
<br /><br />
<h3>
付録A</h3>
<h4>
p.325 圧縮されたサンプルファイルの展開に関する注意</h4>
NOOBS 3.1.1 (Raspbian 2019-06-20) 以降では、圧縮ファイルを展開するためのソフトウェアのデフォルトの設定が変化しましたので利用の際は注意が必要です。
<br />
下図(左)のように、展開先のデフォルトが「/tmp」とされ、また、展開時に自動的にフォルダが作られるようになっています。
<br />
これを、下図(右)のように
<br />
<ul>
<li>展開先に「 /home/pi 」または「 /home/pi/bluebacks 」と記入。ただし、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されていますので、この記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「 /home/kanamaru 」や「 /home/kanamaru/bluebacks 」となる、ということです。</li>
<li>「Ensure a containing directory」のチェックを外す</li>
</ul>
の2点を行ってから「展開」ボタンを押すようにしましょう。展開先に記す文字は、このページからコピー (Ctrl-c) して貼り付ける (Ctrl-v) と安心です。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNX52iZ2jf80kak9MZys3NySx2Q8zMRVE-tPJWGRUfQYT4sa5hUNUxhN07GijvS_T-8ldqQ58sCuTcBvNtu4WfRKVwd-ALkes0LLRgBQuLmdHAyhqEiuBcELYURXjR7hlaUbYFTPSG0Gw/s1600/archiver_all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="457" data-original-width="725" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNX52iZ2jf80kak9MZys3NySx2Q8zMRVE-tPJWGRUfQYT4sa5hUNUxhN07GijvS_T-8ldqQ58sCuTcBvNtu4WfRKVwd-ALkes0LLRgBQuLmdHAyhqEiuBcELYURXjR7hlaUbYFTPSG0Gw/s640/archiver_all.png" width="640" /></a></div>
<br />
<br />
<h3>
付録B</h3>
<h4>
p.329:WebIOPi について</h4>
WebIOPi は Raspberry Pi 5 以降で動作しませんので、インストールしないでください。本ページでは代わりに FastAPI を用いる方法を紹介しています。
<br /><br />
<h4>
p.335:IPアドレスでのURLの指定について</h4>
本書では、ブラウザからRaspberry Piにアクセスする際に、ルーターなどからRaspberry Piに割り振られたIPアドレスを用いました。すなわち、IPアドレスが192.168.1.3の場合にブラウザから例えば下記のようにアクセスできます。
<br />
<ul>
<li>http://192.168.1.3:8000/5-2</li>
</ul>
しかし、この方法はifconfigコマンドなどで事前にIPアドレスを調べておく必要があり、やや面倒でした。<br />
<br />
現在の OS では、IPアドレスを用いずにRaspberry Piにアクセスできますのでその方法を紹介します。なお、この方法でRaspberry Piにアクセスできるのは下記のみです。<br />
<ul>
<li>iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです)</li>
<li>macOS</li>
<li>iPhoneやiPad</li>
</ul>
Androidスマートフォンでは現時点ではこの方法ではRasbperry Piにはアクセスできないように思われます。<br />
<br />
上記の条件が満たされれば方法は簡単で、ブラウザのアドレス欄に例えば下記のように入力すればOKです。
<br />
<ul>
<li>http://raspberrypi.local:8000/5-2</li>
</ul>
すなわち、IPアドレス「192.168.1.3」などの代わりに「raspberrypi.local」という記法が使える、というわけです。これは、OS 上で動作しているavahiというソフトウェアの働きによります。<br />
<br />
なお、avahi がインストールされていない場合、下記のようにavahi-daemonをインストールする必要があります。
<pre class="prettyprint">
sudo apt update
sudo apt install avahi-daemon
</pre>
インストール後に再起動すると、自動的にavahiが起動し、「raspberrypi.local」でのアクセスが可能になります。<br />
<br />
なお、同じネットワーク内でavahiが起動したRaspberry Piが2台以上あると、同じ名前「raspberrypi」のマシンが2つ以上ある状態になり、名前の衝突が起こります。その場合、2台目以降のRaspberry Piには「raspberrypi-2.local」などの名前が自動的につけられますのでご注意ください。名前が衝突しないよう、あらかじめ「raspberrypi」というマシン名を変更しておく方法もありますが、ここでは省略します。<br />
<br />
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-61379948452429599802024-01-27T13:00:00.000+09:002024-01-27T13:04:13.130+09:00読者の方々の声本ページでは、読者の方々のレビューなどをご紹介したいと思います。<br />
<br />
<h3>
紹介記事</h3>
<ul>
<li><a href="http://news.kodansha.co.jp/20160118_b01" target="_blank">講談社BOOK倶楽部</a></li>
</ul>
<ul>
<li><a href="http://www.mdn.co.jp/di/newstopics/43872/" target="_blank">MdN DESiGN INTERACTIVE</a></li>
</ul>
<ul>
<li> <a href="https://fabcross.jp/news/2016/01/20160129_rspi2.html" target="_blank">fabcross</a></li>
</ul>
<ul>
<li> <a href="http://akiba.jpn.org/?p=11829" target="_blank">人気急上昇中?! Raspberry Piで使いたくなる便利な製品 まとめ</a></li>
</ul>
<ul>
<li> <a href="http://www.dhctheater.com/movie/13049">「新書座談会」vol.5 -2016年新春スペシャル!</a></li>
</ul>
<ul>
<li> <a href="http://fanblogs.jp/booboo7x70/archive/235/0">Raspberry Piは現代のコンピュータ科学教育教材</a></li>
</ul>
<ul>
<li> <a href="http://makit.tokyo/raspberry-pi/12">Raspberry Piを学びたい人におすすめの入門書ランキング5選</a></li>
</ul>
<ul>
<li> <a href="http://karaage.hatenadiary.jp/entry/2017/07/10/073000">からあげさん「森博嗣先生のブログが始まりました」</a></li>
</ul>
<br />
<h3>
ご紹介に感謝</h3>
<ul>
<li><a href="http://min2club.com/talk/talk/2017/01/29/%E6%9C%80%E8%BF%91%E3%80%81%E5%AE%9F%E4%BE%8B%E3%81%A7%E5%AD%A6%E3%81%B6raspberry-pi%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C-%E4%BD%9C%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E5%BF%9C%E7%94%A8%E5%8A%9B/" target="_blank">THE POOH FILESさん「最近、”実例で学ぶRaspberry Pi電子工作 作りながら応用力を身につける (ブルーバックス)”を読んでみました」</a></li>
</ul>
<ul>
<li><a href="http://www.nnar.org/archives/6709" target="_blank">船田戦闘機日誌 at nnarさん「オビ買い」</a></li>
</ul>
<ul>
<li><a href="http://www.isopro91.com/entry/2015/12/25/190653" target="_blank">いそっぷ3DCAD塾のブログさん「書店で見つけたラズパイの本 これはおすすめできる」</a></li>
</ul>
<ul>
<li><a href="http://karaage.hatenadiary.jp/entry/2015/11/17/073000" target="_blank">からあげ!!さん「読破したRaspberry Pi関連オススメ書籍紹介」</a></li>
</ul>
<ul>
<li><a href="http://www.amazon.co.jp/gp/product/4062579502/#customerReviews" target="_blank">amazon.co.jpでの購入者の皆さん</a></li>
</ul>
<ul>
<li><a href="https://bookmeter.com/books/10127585" target="_blank">読書メーターに登録された皆さん</a>
</li>
</ul>
<ul>
<li><a href="https://bookmeter.com/books/10153882" target="_blank">読書メーターに登録された皆さん (電書版)</a>
</li>
</ul>
<ul>
<li><a href="http://robots1.blog.jp/archives/51959128.html" target="_blank">ロボットを作るさん「本「実例で学ぶ Raspberry Pi 電子工作」」</a></li>
</ul>
<br />
<br />
以下、twitterでの反応をまとめます。
<br />
<br />
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#電子工作</a> の実験。<a href="https://twitter.com/hashtag/RaspberryPiPico?src=hash&ref_src=twsrc%5Etfw">#RaspberryPiPico</a> <a href="https://twitter.com/hashtag/6%E8%84%9A%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88?src=hash&ref_src=twsrc%5Etfw">#6脚ロボット</a> を実際に動かして見ました。概ね想定通りだと思います☺️。動作は「実例で学ぶ <a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> 電子工作」と <a href="https://twitter.com/hashtag/OttoDIY?src=hash&ref_src=twsrc%5Etfw">#OttoDIY</a> を参考にしています。ただ、まだぎこちない感じなので、少しずつ動作を改良したいなぁと考えています🤔。<a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4?src=hash&ref_src=twsrc%5Etfw">#ラズパイ</a> <a href="https://t.co/GibYrLPeof">pic.twitter.com/GibYrLPeof</a></p>— pass810 (@pass810) <a href="https://twitter.com/pass810/status/1558784482744090624?ref_src=twsrc%5Etfw">August 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#電子工作</a> の実験。<a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4?src=hash&ref_src=twsrc%5Etfw">#ラズパイ</a> 3A+に <a href="https://twitter.com/hashtag/USB?src=hash&ref_src=twsrc%5Etfw">#USB</a> <a href="https://twitter.com/hashtag/%E5%B0%8F%E5%9E%8B%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#小型スピーカー</a> を取り付けて見ました😄。アマゾンで600円位です。試しに <a href="https://twitter.com/hashtag/Julius?src=hash&ref_src=twsrc%5Etfw">#Julius</a> を利用して <a href="https://twitter.com/hashtag/%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98?src=hash&ref_src=twsrc%5Etfw">#音声認識</a> をして見ました。「実例で学ぶ <a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> 電子工作」の補足情報と同じです。勉強になりました☺️。 <a href="https://t.co/9SY2dFko7l">pic.twitter.com/9SY2dFko7l</a></p>— pass810 (@pass810) <a href="https://twitter.com/pass810/status/1444641589083602947?ref_src=twsrc%5Etfw">October 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Pythonで簡単なプログラムは書けるのだけれど、電子工作は全くわからない!となってしまう人向けの本でした。<br><br>私自身が<br><br>抵抗はなぜ必要なの?<br>LEDを光らせるにはハンダが要るの?<br><br>ってレベルでしたが、これを読めばサクッと電子工作できました。<a href="https://t.co/IqAI41XZeI">https://t.co/IqAI41XZeI</a><a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4?src=hash&ref_src=twsrc%5Etfw">#ラズパイ</a></p>— SSKGo💻️ (@SSKGo2) <a href="https://twitter.com/SSKGo2/status/1321434053531197442?ref_src=twsrc%5Etfw">October 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">実例で学ぶRaspberry Pi電子工作<br>金丸隆志<br><br>電子工作もできる小型コンピュータ「Raspberry Pi」についての一冊。天気予報やリモコン化、六脚ロボットなど。<br><br>コードも結構混みいってるし、そこそこ複雑な回路も出てくるので初学者にはちょっと厳しいかも。ただ、その分実践的で面白い。ー<a href="https://twitter.com/hashtag/%E8%AA%AD%E4%BA%86?src=hash&ref_src=twsrc%5Etfw">#読了</a> <a href="https://t.co/CirbzooFll">pic.twitter.com/CirbzooFll</a></p>— KJ (@KinjiKamizaki) <a href="https://twitter.com/KinjiKamizaki/status/1289202184081424385?ref_src=twsrc%5Etfw">July 31, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#電子工作</a> の実験。<a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> で <a href="https://twitter.com/hashtag/6%E8%84%9A%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88?src=hash&ref_src=twsrc%5Etfw">#6脚ロボット</a> を使って、<a href="https://twitter.com/hashtag/%E5%AF%BE%E8%B1%A1%E7%89%A9%E8%BF%BD%E8%B7%A1?src=hash&ref_src=twsrc%5Etfw">#対象物追跡</a>(<a href="https://twitter.com/hashtag/%E5%86%86%E8%BF%BD%E8%B7%A1?src=hash&ref_src=twsrc%5Etfw">#円追跡</a>)です。意外としっかり追いかけてくれました😊。以前行った <a href="https://twitter.com/hashtag/OpenCV?src=hash&ref_src=twsrc%5Etfw">#OpenCV</a> による対象物追跡に6脚ロボットの動きを追加しました。なるほどと思いました😃。 <a href="https://twitter.com/hashtag/PCA9685?src=hash&ref_src=twsrc%5Etfw">#PCA9685</a> <a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4?src=hash&ref_src=twsrc%5Etfw">#ラズパイ</a> <a href="https://twitter.com/hashtag/SG90?src=hash&ref_src=twsrc%5Etfw">#SG90</a> <a href="https://t.co/TcH95jwVOO">pic.twitter.com/TcH95jwVOO</a></p>— pass810 (@pass810) <a href="https://twitter.com/pass810/status/1101054724709613571?ref_src=twsrc%5Etfw">2019年2月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#電子工作</a> の実験。<a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://twitter.com/hashtag/%E3%82%B5%E3%83%BC%E3%83%9C?src=hash&ref_src=twsrc%5Etfw">#サーボ</a> 付 <a href="https://twitter.com/hashtag/%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89?src=hash&ref_src=twsrc%5Etfw">#カメラスタンド</a> で <a href="https://twitter.com/hashtag/OpenCV?src=hash&ref_src=twsrc%5Etfw">#OpenCV</a> を使って <a href="https://twitter.com/hashtag/%E5%86%86%E8%BF%BD%E8%B7%A1?src=hash&ref_src=twsrc%5Etfw">#円追跡</a>(<a href="https://twitter.com/hashtag/TrackingCircle?src=hash&ref_src=twsrc%5Etfw">#TrackingCircle</a>)です。「実例で学ぶRaspberryPi電子工作」を参考にしました。<a href="https://twitter.com/hashtag/PCA9685?src=hash&ref_src=twsrc%5Etfw">#PCA9685</a> を使い,<a href="https://twitter.com/hashtag/LCD?src=hash&ref_src=twsrc%5Etfw">#LCD</a>(<a href="https://twitter.com/hashtag/ST7735?src=hash&ref_src=twsrc%5Etfw">#ST7735</a>)にも画像を表示している所が少し違います。勉強になりました😊。<a href="https://twitter.com/hashtag/Pillow?src=hash&ref_src=twsrc%5Etfw">#Pillow</a> <a href="https://t.co/mGECHLA9Fd">pic.twitter.com/mGECHLA9Fd</a></p>— pass810 (@pass810) <a href="https://twitter.com/pass810/status/1096377167666008064?ref_src=twsrc%5Etfw">2019年2月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/ESP32?src=hash&ref_src=twsrc%5Etfw">#ESP32</a> で <a href="https://twitter.com/hashtag/6%E8%84%9A%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88?src=hash&ref_src=twsrc%5Etfw">#6脚ロボット</a> です。前進させてみました。「実例で学ぶ <a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> 電子工作」を参考にしました。滑り気味ですが、少しずつ進んでいます☺️。<a href="https://twitter.com/hashtag/Arduino?src=hash&ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://twitter.com/hashtag/PCA9685?src=hash&ref_src=twsrc%5Etfw">#PCA9685</a> <a href="https://twitter.com/hashtag/SG90?src=hash&ref_src=twsrc%5Etfw">#SG90</a> <a href="https://t.co/ykLx2CEwsl">pic.twitter.com/ykLx2CEwsl</a></p>— pass810 (@pass810) <a href="https://twitter.com/pass810/status/1072855713083404291?ref_src=twsrc%5Etfw">2018年12月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これすごくいい。簡単に電子工作の楽しさがわかるので、入門に最適。夢が広がる〜。図書館で本を借りたけど、内容を確認しながらする作業が多いので、オススメはKindle版かな。<br><br>実例で学ぶRaspberry Pi電子工作 作りながら応用力を身につける (ブルーバックス) <a href="https://t.co/5yt9RB79fP">https://t.co/5yt9RB79fP</a></p>— daba | ケミカルリーマン (@chemryman) <a href="https://twitter.com/chemryman/status/1043508017331720193?ref_src=twsrc%5Etfw">2018年9月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">こんなん作れたら楽しそうやんね😆<br><br>ブルーバックス『実例で学ぶRaspberry Pi電子工作』 <a href="https://t.co/bc9SZRx7Xm">https://t.co/bc9SZRx7Xm</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>より <a href="https://t.co/nqnQJgSA5Y">pic.twitter.com/nqnQJgSA5Y</a></p>— IT暇人@実家ニート (@it31415) <a href="https://twitter.com/it31415/status/1028536030016589824?ref_src=twsrc%5Etfw">2018年8月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja">
<div dir="ltr" lang="ja">
金丸隆志「実例で学ぶraspberry pi電子工作」の6脚ロボを作ってみた。本のままだと動かない点が幾つかあったけどなんとか動くまでこぎつけた。ちょこちょこ歩く動作がなかなか愛らしい <a href="https://t.co/CZe29YKgCN">pic.twitter.com/CZe29YKgCN</a></div>
— 冨永 和吉 (@K_TOMI) <a href="https://twitter.com/K_TOMI/status/722032333100949505?ref_src=twsrc%5Etfw">2016年4月18日</a></blockquote>
<script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja">
<div dir="ltr" lang="ja">
カメラ付き6脚ロボット<br />参考:金丸隆志『実例で学ぶRaspberry Pi電子工作 作りながら応用力を身につける』<a href="https://twitter.com/hashtag/RaspberryPi?src=hash&ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://twitter.com/hashtag/%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4?src=hash&ref_src=twsrc%5Etfw">#ラズベリーパイ</a> <a href="https://t.co/BIQYxSWFfi">pic.twitter.com/BIQYxSWFfi</a></div>
— ひー (@freejog) <a href="https://twitter.com/freejog/status/882534945473740800?ref_src=twsrc%5Etfw">2017年7月5日</a></blockquote>
<script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<br />
<blockquote class="twitter-tweet" data-lang="ja">
<div dir="ltr" lang="ja">
『実例で学ぶRaspberry Pi電子工作』を参考にして作成した6脚ロボット。アルカリ乾電池3本(1.5V×3本=4.5V)だとサーボモーターがうまく動かなかったので、エネループ4本(1.2V×4本=4.8V)にしたところ、期待通り動いた。 <a href="https://t.co/7hiJWmNv0E">pic.twitter.com/7hiJWmNv0E</a></div>
— Syun'iti Honda (@Syun_itiHonda) <a href="https://twitter.com/Syun_itiHonda/status/934984137093427200?ref_src=twsrc%5Etfw">2017年11月27日</a></blockquote>
<script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"></script>
<br />
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com48tag:blogger.com,1999:blog-1299465193942557222.post-52532568725151166132023-03-29T20:48:00.014+09:002024-01-27T13:06:05.065+09:00本書発売後の追加情報(Pi Zero~Pi 4までの古い情報)<h3>
より新しい情報</h3>
Raspberry Pi 5 が海外で発表され、それに対応した OS Bookworm がリリースされるに伴い、本ページの内容は古くなっています。下記の新しいページをご覧ください。
<ul>
<li><a href="https://raspibb2.blogspot.com/2024/01/pi-zero-pi-5.html" target="_blank">本書の内容を Pi Zero ~ Pi 5 で実行する方法</a></li>
</ul>
以下は、それ以前の古い情報を残しておいたものです。
<br />
<br />
<h3>
はじめに</h3>
<h4>
サンプルプログラムとカラー版回路配線図について</h4>
サンプルプログラム、回路配線図、応用PDFは下記のリンクからダウンロードしてください。
<ul>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784062579506/appendix/attachments/raspi2-sample.zip" target="_blank">サンプルプログラム</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784062579506/appendix/attachments/RaspberryPi-bb2-Circuit.pdf" target="_blank">回路配線図</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784062579506/appendix/attachments/RaspberryPi2-PDF_p01-33.pdf" target="_blank">応用PDF(電子版には書籍末尾についています)</a></li>
</ul>
回路配線図の PDF と応用PDF は Raspberry Pi 上のブラウザでも見られますが、ブラウザ上の「↓」(ダウンロード)ボタンでダウンロードし、ファイルマネージャーで PDF ファイルを右クリックし「アプリケーションで開く」→「アクセサリ」→「ドキュメントビューア」などで開いてもよいでしょう。<br />
「選択したアプリケーションをこのファイルタイプのデフォルトのアクションとする」にチェックを入れればそのアプリケーションで開くのがデフォルト動作となります。
<br />
<br />
<h4>
回路配線図について</h4>
回路配線図をWindowsやOS X上のAdobe Readerで閲覧する際、「編集」→「環境設定」を選択し、下図のように「細い線を拡張」のチェックを外すと、より綺麗な配線図を見ることができます。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhphwkSPYdEBIT90p318tyCZAHMXsyQ7Rj5OsNwAWXKTjvInVKysMdaUDQbzXw49Ker47poz-u9hLU9moGMi6Lb4vP1XqFPkl5eEOsxY_L9CArjjBDhPl6fmj2PQrd-PyjqUVYOE5KqENLn/s1600/acrobat01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhphwkSPYdEBIT90p318tyCZAHMXsyQ7Rj5OsNwAWXKTjvInVKysMdaUDQbzXw49Ker47poz-u9hLU9moGMi6Lb4vP1XqFPkl5eEOsxY_L9CArjjBDhPl6fmj2PQrd-PyjqUVYOE5KqENLn/s1600/acrobat01.png" /></a></div>
<br />
チェックを外す前後の配線図の状態を示したのが下図です。「細い線を拡張」のチェックを外した方が図がきれいに表示されているのがわかるでしょう。
<br />
<br />
なお、この設定はPDFを印刷する際には影響しないはずです。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgymk-EDTOmY1Fq9aRp0G7-IyVl_P2A3I3UYZosdsZKxYiRupQpH9Uff2-0lAaaFOYOUWW2iSRu8uIa6rSo2250saejoIr9Ee-ygCClSwykDt9eUIBGIkAhU-xq9j8m1UK6Ffg-bpQAGoeP/s1600/acrobat02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgymk-EDTOmY1Fq9aRp0G7-IyVl_P2A3I3UYZosdsZKxYiRupQpH9Uff2-0lAaaFOYOUWW2iSRu8uIa6rSo2250saejoIr9Ee-ygCClSwykDt9eUIBGIkAhU-xq9j8m1UK6Ffg-bpQAGoeP/s640/acrobat02.png" width="640" /></a></div>
<br />
<h4>
回路配線図をRaspberry Pi上で見る場合</h4>
回路配線図をRaspberry Pi上で見る場合、古いRaspbianではChromiumブラウザ上で日本語が表示されないことが多いと思います。その場合、一旦PDFファイルをRaspberry Pi上にダウンロードし、デスクトップメニューの「アクセサリ」→「PDF Viewer」から開くようにしてください。
PDFファイルをRaspberry Pi上にダウンロードする方法は、「一旦Chromiumブラウザで開いてから画面上のダウンロードボタンを押す」か「リンク上で右クリックして『名前を付けてリンク先を保存』を選択」のどちらかです。<br />
新しいRaspbianではChromiumブラウザ上でPDFを見ても日本語が表示されます。
<br />
<br />
<h3>
第1章</h3>
<h4>
p.12: OSインストール法の最新版について</h4>
OSであるRaspberry Pi OSのインストールから設定の流れは、書籍執筆時から大きく変更を受けております。
<br />
最新のインストールおよび設定方法は、
「Raspberry Piではじめる機械学習 補足情報」内にある<span style="font-size: large;">「<a href="https://mlbb1.blogspot.com/2018/03/raspberry-pios.html" target="_blank">Raspberry PiへのOSのインストール方法</a>」</span>をご覧ください。本書1章と同等の内容をアップデートされた状態で見ることができます。
<br />
<br />
本書はRaspberry Pi 4のような最新のRaspberry Piでの動作もサポートしています。
<br />
<br />
<h4>
p.21:NOOBSのバージョンについて</h4>
書籍販売より、以下のようにOSの更新が行われています。<br />
<br />
<table border="1">
<tbody>
<tr>
<td>日付</td><td>バージョン</td><td>カーネルバージョン</td><td>OSバージョン</td>
</tr>
<tr>
<td>2016/2/3</td><td>NOOBS 1.6.0</td><td>4.1.17+ / 4.1.17-v7+</td><td rowspan="14">Jessie</td>
</tr>
<tr>
<td>2016/2/9</td><td>NOOBS 1.7.0</td><td>4.1.17+ / 4.1.17-v7+</td>
</tr>
<tr>
<td>2016/2/26</td><td>NOOBS 1.8.0</td><td>4.1.18+ / 4.1.18-v7+</td>
</tr>
<tr>
<td>2016/3/18</td><td>NOOBS 1.9.0</td><td>4.1.19+ / 4.1.19-v7+</td>
</tr>
<tr>
<td>2016/5/10</td><td>NOOBS 1.9.1</td><td>4.4.9+ / 4.4.9-v7+</td>
</tr>
<tr>
<td>2016/5/27</td><td>NOOBS 1.9.2</td><td>4.4.11+ / 4.4.11-v7+</td>
</tr>
<tr>
<td>2016/9/23</td><td>NOOBS 1.9.3</td><td>4.4.21+ / 4.4.21-v7+</td>
</tr>
<tr>
<td>2016/10/5</td><td>NOOBS 2.0.0</td><td>4.4.21+ / 4.4.21-v7+</td>
</tr>
<tr>
<td>2016/11/29</td><td>NOOBS 2.1.0</td><td>4.4.34+ / 4.4.34-v7+</td>
</tr>
<tr>
<td>2017/2/27</td><td>NOOBS 2.2.0</td><td>4.4.48+ / 4.4.48-v7+</td>
</tr>
<tr>
<td>2017/3/3</td><td>NOOBS 2.3.0</td><td>4.4.50+ / 4.4.50-v7+</td>
</tr>
<tr>
<td>2017/4/10</td><td>NOOBS 2.4.0</td><td>4.4.50+ / 4.4.50-v7+</td>
</tr>
<tr>
<td>2017/6/23</td><td>NOOBS 2.4.1</td><td>4.9.28+ / 4.9.28-v7+</td>
</tr>
<tr>
<td>2017/7/5</td><td>NOOBS 2.4.2</td><td>4.9.35+ / 4.9.35-v7+</td>
</tr>
<tr>
<td>2017/8/17</td><td>NOOBS 2.4.3</td><td>4.9.41+ / 4.9.41-v7+</td><td rowspan="11">Stretch</td>
</tr>
<tr>
<td>2017/9/8</td><td>NOOBS 2.4.4</td><td>4.9.41+ / 4.9.41-v7+</td>
</tr>
<tr>
<td>2017/11/29</td><td>NOOBS 2.4.5</td><td>4.9.59+ / 4.9.59-v7+</td>
</tr>
<tr>
<td>2018/3/14</td><td>NOOBS 2.6.0</td><td>4.9.80+ / 4.9.80-v7+</td>
</tr>
<tr>
<td>2018/3/14</td><td>NOOBS 2.7.0</td><td>4.9.80+ / 4.9.80-v7+</td>
</tr>
<tr>
<td>2018/4/18</td><td>NOOBS 2.8.0</td><td>4.9.80+ / 4.9.80-v7+</td>
</tr>
<tr>
<td>2018/4/24</td><td>NOOBS 2.8.1</td><td>4.14.34+ / 4.14.34-v7+</td>
</tr>
<tr>
<td>2018/6/27</td><td>NOOBS 2.8.2</td><td>4.14.50+ / 4.14.50-v7+</td>
</tr>
<tr>
<td>2018/10/11</td><td>NOOBS 2.9.0</td><td>4.14.71+ / 4.14.71-v7+</td>
</tr>
<tr>
<td>2018/11/15</td><td>NOOBS 3.0.0</td><td>4.14.79+ / 4.14.79-v7+</td>
</tr>
<tr>
<td>2019/4/8</td><td>NOOBS 3.0.1</td><td>4.14.98+ / 4.14.98-v7+</td>
</tr>
<tr>
<td>2019/6/24</td><td>NOOBS 3.1.1</td><td>4.19.50+ / 4.19.50-v7+ / 4.19.50-v7l+</td><td rowspan="11">Buster</td>
</tr>
<tr>
<td>2019/7/10</td><td>NOOBS 3.2.0</td><td>4.19.57+ / 4.19.57-v7+ / 4.19.57-v7l+</td>
</tr>
<tr>
<td>2019/9/30</td><td>NOOBS 3.2.1</td><td>4.19.75+ / 4.19.75-v7+ / 4.19.75-v7l+</td>
</tr>
<tr>
<td>2020/2/7</td><td>NOOBS 3.3.0</td><td>4.19.97+ / 4.19.97-v7+ / 4.19.97-v7l+</td>
</tr>
<tr>
<td>2020/2/14</td><td>NOOBS 3.3.1</td><td>4.19.97+ / 4.19.97-v7+ / 4.19.97-v7l+</td>
</tr>
<tr>
<td>2020/5/27</td><td>Raspberry Pi OS 2020-05-27</td><td>4.19.118+ / 4.19.118-v7+ / 4.19.118-v7l+</td>
</tr>
<tr>
<td>2020/8/20</td><td>Raspberry Pi OS 2020-08-20</td><td>5.4.51+ / 5.4.51-v7+ / 5.4.51-v7l+</td>
</tr>
<tr>
<td>2020/12/02</td><td>Raspberry Pi OS 2020-12-02</td><td>5.4.79+ / 5.4.79-v7+ / 5.4.79-v7l+</td>
</tr>
<tr>
<td>2021/1/11</td><td>Raspberry Pi OS 2021-01-11</td><td>5.4.83+ / 5.4.83-v7+ / 5.4.83-v7l+</td>
</tr>
<tr>
<td>2021/3/4</td><td>Raspberry Pi OS 2021-03-04</td><td>5.10.17+ / 5.10.17-v7+ / 5.10.17-v7l+</td>
</tr>
<tr>
<td>2021/5/7</td><td>Raspberry Pi OS 2021-05-07</td><td>5.10.17+ / 5.10.17-v7+ / 5.10.17-v7l+</td>
</tr>
<tr>
<td>2021/10/30</td><td>Raspberry Pi OS 2021-10-30</td><td>5.10.63+ / 5.10.63-v7+ / 5.10.63-v7l+</td><td rowspan="7">Bullseye</td>
</tr>
<tr>
<td>2022/1/28</td><td>Raspberry Pi OS 2022-01-28</td><td>5.10.92+ / 5.10.92-v7+ / 5.10.92-v7l+ / 5.10.92-v8+</td>
</tr>
<tr>
<td>2022/4/4</td><td>Raspberry Pi OS 2022-04-04</td><td>5.15.30+ / 5.15.30-v7+ / 5.15.30-v7l+ / 5.15.30-v8+</td>
</tr>
<tr>
<td>2022/9/6</td><td>Raspberry Pi OS 2022-09-06</td><td>5.15.61+ / 5.15.61-v7+ / 5.15.61-v7l+ / 5.15.61-v8+</td>
</tr>
<tr>
<td>2022/9/22</td><td>Raspberry Pi OS 2022-09-22</td><td>5.15.61+ / 5.15.61-v7+ / 5.15.61-v7l+ / 5.15.61-v8+</td>
</tr>
<tr>
<td>2023/2/21</td><td>Raspberry Pi OS 2023-02-21</td><td>5.15.84+ / 5.15.84-v7+ / 5.15.84-v7l+ / 5.15.84-v8+</td>
</tr>
<tr>
<td>2023/5/3</td><td>Raspberry Pi OS 2023-05-03</td><td>6.1.21+ / 6.1.21-v7+ / 6.1.21-v7l+ / 6.1.21-v8+</td>
</tr>
<tr>
<td>2023/10/10</td><td>Raspberry Pi OS 2023-10-10</td><td>6.1.0-rpi4-rpi-{v6,v7,v7l,v8,2712}</td><td rowspan="2">Bookworm</td>
</tr>
<tr>
<td>2023/12/5</td><td>Raspberry Pi OS 2023-10-10</td><td>6.1.0-rpi7-rpi-{v6,v7,v7l,v8,2712}</td>
</tr>
</tbody></table>
<br />
どのバージョンでも動作確認しています。
<br />
<br />
古いバージョンを使いたい方は下記のJAISTのミラーサイトで適切な日付をたどると見つけられます。
<br />
<ul>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_armhf/images/" target="_blank">2020年5月以降のRaspberry Pi OS フルインストール版のイメージ</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_full/images/" target="_blank">2018年11月~2020年2月のRaspbian フルインストール版のイメージ</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/" target="_blank">それ以前のRaspbian のイメージ</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/" target="_blank">NOOBSの場合</a></li>
</ul>
<br />
なお、「sudo apt upgrade」により全パッケージを更新したり、「sudo rpi-update」によりfirmwareを更新したRaspbianはサポートの対象外とします。その理由は下記の通りですのでご了承ください。
<br />
<ul>
<li>パッケージやfirmwareは日々変化しており、タイミングによってはバグを含んだパッケージがインストールされることもあること(実際、その問題によりトラブルの原因発見に時間がかかったことがあります)</li>
<li>同じ理由で、読者の方の環境と筆者の環境を一致させることが難しいこと</li>
</ul>
<br />
<h4>
p.27: セットアップウィザードの起動</h4>
現在のRaspbianでは、初回起動時に設定用のセットアップウィザードが起動するようになっております。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_xRt4r0QpkV4CVg4zZoPiigVkbzn7iHRJuddk_0Xc1kFGlee9Q91qqfxcn_4AnSaGxjAaO_0r5GhrL50DQVuI-Op5OUM5QhnYi_pfF_ZBrGeTXGfU_EFy0yRXM_5m6s_kvdLgKfjklRc/s1600/piwiz1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="327" data-original-width="498" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_xRt4r0QpkV4CVg4zZoPiigVkbzn7iHRJuddk_0Xc1kFGlee9Q91qqfxcn_4AnSaGxjAaO_0r5GhrL50DQVuI-Op5OUM5QhnYi_pfF_ZBrGeTXGfU_EFy0yRXM_5m6s_kvdLgKfjklRc/s1600/piwiz1.png" /></a></div>
<br />
その操作法は、「Raspberry Piではじめる機械学習 補足情報」内にある<span style="font-size: large;">「<a href="https://mlbb1.blogspot.com/2018/03/raspberry-pios.html" target="_blank">Raspberry PiへのOSのインストール方法</a>」</span>に記されておりますのでそちらをご覧ください。本書1章と同等の内容をアップデートされた状態で見ることができます。
<br />
<br />
<h4>p.30, コマンドプロンプトの表記</h4>
p.30ではコマンドプロンプトの表記として以下を紹介しました。
<pre class="prettyprint">
pi@raspbberrypi:~ $
</pre>
ここに見える「pi」はユーザー名を表しており、ユーザー名「pi」は2022年4月以前の古いOSで用いられていたデフォルトのユーザー名です。最新のOSを用いている方ならば、「pi」の部分に自分で決めたユーザー名が表示されているでしょう。
<br />
<br />
<h3>
2章</h3>
<h4>
p.52:開発環境IDLEの代替としてThonny Python IDEを用いる方法</h4>
2019年11月現在、本書で解説した開発環境IDLEはデフォルトでRaspbianに含まれていません。IDLE を別途インストールして利用する方法もあるのですが、より簡単にPythonプログラムを実行する方法として、デフォルトでインストール済の「Thonny Python IDE」を用いる方法をここで紹介します。
<br />
<br />
Thonny Python IDEはpython3用のプログラムを実行するための環境です。本書のプログラムはPython3での実行をサポートしていますので問題なく実行できます。
Python 3用ツールのインストール法は本ページで解説されておりますので注意して本ページをお読みください
<br />
(2019/6/25以前にサンプルプログラムをダウンロードした方は再び raspi2-sample.zip をダウンロードし、展開しなおした上でご活用ください)。
<br />
<br />
さて、メニューの下図に示されている「Thonny Python IDE」をマウスでクリックするとThonny Python IDEが起動します。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN4tWnLc5czOBYnIDszvKU7Y5mMW91VweHUhlrw1NVl0XQ2pFtohG0LDtoE3DNTnpFJ5T-uU_9-Mio-vUIx1SpRmOE30HN47cW3ZlwWsQgUImIILgrPyG10UQQNxy-DDeS1kmNajRIFT8/s1600/thonny1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="550" data-original-width="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN4tWnLc5czOBYnIDszvKU7Y5mMW91VweHUhlrw1NVl0XQ2pFtohG0LDtoE3DNTnpFJ5T-uU_9-Mio-vUIx1SpRmOE30HN47cW3ZlwWsQgUImIILgrPyG10UQQNxy-DDeS1kmNajRIFT8/s1600/thonny1.png" /></a></div>
<br />
次図のように、「LOAD」がファイルの読み込み、「RUN」がプログラム実行、「STOP」がプログラム停止であることを理解すれば問題なく利用できるでしょう。
<br />
<br />
ただし、「STOP」ボタンでプログラムを停止すると、GPIOの終了処理が正しく機能しないようです。<strong>「Shell」と書かれた領域の上でキーボードの「Ctrl-C」によりプログラムを終了</strong>するのが良いでしょう。なお、Thonnyには「時々Ctrl-cが効かなくなる」という不具合があるようなので、そういうときのみ「STOP」ボタンでプログラムを停止すると良いでしょう。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMrJ3jgFF_xvNPmJ5GL4MsnuJrzHo5nkT_5C-paCSHV6jPuELd0pPRnJcvC2cFRowJHaY4pe96RONCACs-6utov4K9mPUujvEl6cB11cxeowRMiDi5N5APAYsQk5v5DSokeCxnASduQWE/s1600/thonny2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="682" data-original-width="804" height="542" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMrJ3jgFF_xvNPmJ5GL4MsnuJrzHo5nkT_5C-paCSHV6jPuELd0pPRnJcvC2cFRowJHaY4pe96RONCACs-6utov4K9mPUujvEl6cB11cxeowRMiDi5N5APAYsQk5v5DSokeCxnASduQWE/s640/thonny2.png" width="640" /></a></div>
<br />
Thonny Python IDEを用いると、7章で取り扱うOpenCVを用いたプログラムもIDEから実行できるというメリットがあります(IDLEでは画像処理プログラムのみコンソールから起動させたのでした)。
<br />
<br />
なお、本書ではWiringPi-Pythonによりサーボモータを用いる場合に管理者権限が必要となります。その場合、管理者権限のThonnyでプログラムを読み込んで実行する必要があります。
そのためには、LXTerminalを開いてから下記のコマンドを実行してください。
<br />
<pre class="prettyprint">sudo thonny &
</pre>
管理者権限のThonnyが現れるので、ファイルを読み込んで実行してください。
<br />
<br />
<h4>
p.52:Python2とPython3について</h4>
さて、上で紹介した Thonny Python IDEを用いるということは、Python バージョン 3 を用いることを意味します。<b>本書で利用を推奨していた Python バージョン 2 は 2020年1月1日にサポートが切れましたので、これを機会に本ページでは Python 3 による実行方法のみを解説することにします</b>。本書のプログラムは Python 3 でも動作するよう更新済ですし、Python 3用のツールのインストール法も、全て本ページで解説していますので大きな問題はありません。
<br />
<br />
なお、コマンドによりプログラムを実行する場合は、Python 2とPython 3および対応コマンドが下記のように異なります。
以下ではPython3 用のコマンドを用いることになりますので参考にしてください。
<br />
<br />
<table border="1">
<tbody>
<tr>
<td>項目</td><td>Python2用コマンド</td><td>Python3用コマンド</td>
</tr>
<tr>
<td>プログラム実行コマンド</td><td>python または python2</td><td>python3</td>
</tr>
<tr>
<td>IDLE実行コマンド</td><td>idle-python2.7</td><td>idle-python3.7</td>
</tr>
<tr>
<td>Thonny実行コマンド</td><td>なし</td><td>thonny</td>
</tr>
<tr>
<td>Python用プログラムインストールコマンド</td><td>pipまたはpip2</td><td>pip3</td>
</tr>
</tbody></table>
<br />
プログラム実行時に自分がPython2 と Python3 のどちらで実行しているかを意識するとPythonプログラムにより早く慣れることができるでしょう。
<br />
<br />
<h4>
p.52:NOOBS 2.8.2 (Raspbian 2018-06-27) 以降でのIDLEの通常起動について</h4>
NOOBS 2.8.2 (Raspbian 2018-06-27) から、デスクトップのメニューから開発環境IDLEの項目が削除されています。そのため、その代替としてThonny Python IDEを用いる方法を上で解説しました。通常はこのThonny Python IDEを用いてください。
<br />
ここでは、それでも敢えてIDLEを用いたいという方のためにその方法を解説します。
<br />
<br />
ターミナル LXTerminal を起動し、下記の2つのコマンドを順に実行してください。Python 3 用のIDLEがインストールされます。
<br />
<pre class="prettyprint">sudo apt update
sudo apt install idle-python3.7
</pre>
Python 3 用のIDLEを起動するためには
<br />
<pre class="prettyprint">idle-python3.7 &
</pre>
を実行します。
<br />
<br />
<h3>
第3章</h3>
<h4>
p.81およびp.85:タクトスイッチを用いるプログラムの管理者権限について</h4>
タクトスイッチを用いる bb2-03-03-dice-switch.py および bb2-03-04-dice-switch-delay.py はどのバージョンのNOOBSでも管理者権限が必要と述べましたが、
現在では、これらのプログラムでも管理者権限が不要になりました。興味のある方は試してみてください。
<br />
<br />
<h3>
第4章</h3>
<h4>
4章全般:お天気Webサービスについて</h4>
第4章で紹介しているお天気Webサービスですが、2020年7月でサービスを終了したようです。<br />
それに伴い、4章のプログラムは全て動作しなくなってしまいました。
<br /><br />
代わりに、OpenWeather というサービスを利用したプログラムを作成しました。やや解説が長くなりますので、下記のページをご覧ください。
<ul>
<li><a href="https://raspibb2.blogspot.com/2021/11/openweatherlcd.html" target="_blank">OpenWeatherの天気予報データをLCDに表示する</a>
</li>
</ul>
<br />
<h4>
4章全般:音声合成機能の追加について</h4>
4章で作成した「天気予報機能付き温度計」に、音声合成機能を追加するための解説を下記に記しました。ご活用ください。
<br />
<ul>
<li><a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-open-jtalk.html" target="_blank">Raspberry Pi + Open JTalkによる音声合成で天気予報付き温度計に喋らせる</a></li>
</ul>
<br />
<h4>
p.94~p.97:I2Cの準備について</h4>
94~97ページではI2C通信を利用するための準備を行いました。最新の Raspbian を用いると、これらの多くはデフォルトで設定済です。必要な作業は
<br />
<ul>
<li>p.95: 設定アプリケーションによるI2Cの有効化</li>
</ul>
のみです。その他の作業、すなわち、「/etc/modulesへのi2c-devの追記(p.96)」、「必要なパッケージのインストール (p.97)」は実行不要です。後者は、実行しても「すでに最新バージョンです」と表示されるだけで悪影響はありません。
<br />
<br />
<h4>
p.101:pipとrequestsのインストール</h4>
pipとrequestsも、最新の Raspbian ではデフォルトでインストール済なのであらためてインストールする必要はありません。
インストールコマンドを実行しても「すでに最新バージョンです」、「Requirement already satisfied」などと表示されるだけで悪影響はありません。
<br />
<br />
<h4>
p.108:I2Cデバイスの認識について</h4>
ここで用いる温度センサとLCDの組み合わせは前著でも用いたのですが、LCDを用いたプログラムの動作に失敗するという方が多いようです。LCDを用いたプログラムを実行するためには、Raspberry PiからLCDが認識されていることが必要です。LCDが認識されているかどうかのチェック方法は、書籍に記さなかったのですが、ここで紹介します。<br />
<br />
まず、温度センサとLCDを接続した回路(p.108の図4-9)を作成した状態でLXTerminalを起動し、下記のコマンドを実行しましょう。
<br />
<pre class="prettyprint">i2cdetect -y 1
</pre>
このコマンドは、Raspberry Piに接続されたI2Cデバイスのアドレスを出力するものです。以前のRaspbianでは管理者権限を表す「sudo」が必要でしたが、現在は管理者権限は不要になっています。<br />
<br />
正常な出力結果は下図のようになります。48が温度センサのアドレス0x48を表し、3eがLCDのアドレス0x3eを表します。48が表示されなければ温度センサを用いるプログラムは正常動作しませんし、3eが表示されなければLCDを用いるプログラムは動作しませんので、まずは下図の出力が得られることを目指しましょう。<br />
<br />
そのためには、温度センサ、LCDの製作過程や回路などを見直すのが基本的な方針ですが、次項で述べたように、「新しいロットのLCDはRaspberry Piから認識されない」という問題に該当しているかもしれません。そのため、次項以降も引き続きお読みください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy_cDeEIvp2nHKPsRG4og84AP-pIMmqXrjdGEl3GPVK19tObaq871pjTLjdb7W3Ja1MJbZ_Z6nIwF5Pi9Qg_lhnYNKIBdUOIyWxS7nZfTaQ6wxzVcHz1FdPqLDXrluFSQ53ygGDxQJxwx/s1600/i2cdetect.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLy_cDeEIvp2nHKPsRG4og84AP-pIMmqXrjdGEl3GPVK19tObaq871pjTLjdb7W3Ja1MJbZ_Z6nIwF5Pi9Qg_lhnYNKIBdUOIyWxS7nZfTaQ6wxzVcHz1FdPqLDXrluFSQ53ygGDxQJxwx/s1600/i2cdetect.png" /></a></div>
<br />
<h4>
4章全般:利用できるLCDについて1~秋月電子編</h4>
本書で紹介したLCDの新しいロットでは、本ページ下部で記すように何らかの対処をしないとRaspberry Piでは利用できなくなってしまいました(抵抗1本の追加で暫定的に利用可能になるのですが)。そこで、正常に動作するLCDをいくつか紹介します。<br />
<br />
まず、秋月電子通商が書籍のLCDを正式にRaspberry Pi対応させたモジュールキットです。なお、組み立てキットの方は狭いピッチ(ピン間隔)の半田付けが必要になりますので、半田付けにある程度慣れている方向けとなります。通常は完成品を推奨します。商品へのリンクは下記になります。
<br />
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g111753/" target="_blank">Raspberry Pi キャラクタ液晶ディスプレイモジュール完成品</a></li>
<li><a href="https://akizukidenshi.com/catalog/g/g111354" target="_blank">Raspberry Pi キャラクタ液晶ディスプレイモジュールキット</a></li>
</ul>
組み立てキットに含まれるパーツを図示したのが下図(左)となっています。ピンソケットが2種含まれていますので、お好みの方を半田付けします。
完成品にはLCDを立てて使うためのピンソケットがあらかじめ取り付けられています。「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」の公式パーツセットには前者の完成品の方が含まれていますので、お持ちの方もいるでしょう。
<br />
<br />
なお、本書のようにブレッドボードで利用するためには、組み立てキットに下図(中)のようにピンヘッダを別途購入して半田付けする方法があります。ピンヘッダとは、例えば下記のようなものです。丁度のサイズのものを購入するよりは、長いものを購入してニッパでカットするのが一般的です。
<br />
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g101669/" target="_blank">ピンヘッダ 1×6 (6P)</a></li>
<li><a href="https://akizukidenshi.com/catalog/g/g100167/" target="_blank">ピンヘッダ 1×40 (40P)</a></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJzM5w1OQ0JgW6_IzTrL1RpowTrhFcDetbaW2MrDs7FsRqNoLmSb7NwpJEACsxYKUg0Cc3i_LNv35CfVWlmE8aokABBLD9l3ECNZdyQWpzABJFTAlU5oAPHm-14s7wOYvZWTfOSi9Pw5tF/s1600/newlcd1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJzM5w1OQ0JgW6_IzTrL1RpowTrhFcDetbaW2MrDs7FsRqNoLmSb7NwpJEACsxYKUg0Cc3i_LNv35CfVWlmE8aokABBLD9l3ECNZdyQWpzABJFTAlU5oAPHm-14s7wOYvZWTfOSi9Pw5tF/s640/newlcd1.png" width="640" /></a></div>
<br />
ピン配置は本書のものとは異なり、上図(右)のようになっています。<br />
<br />
利用例は下図のようになっています。下図(左)がピンソケットを用いた場合で、Raspberry PiのGPIO(3.3V/SDA/SCL/GPIO4/GNDと続くピン)に直接させるようになっています。完成品ではLCDを立てて使うようなピンソケットとなっています。ただし、これではGPIOのピンの一部が利用できなくなってしまいますので、ジャンパワイヤを介してGPIOに接続するのがお勧めです。また、本LCDの完成品には以下に記すLEDのバックライト機能はありませんのでご注意ください。
<br />
<br />
ピンヘッダを用いて作成したLCDならば本書のようにブレッドボートで利用可能です。その様子を示したのが下図(右)です。なお、基板の「LED」ピンを3.3Vに接続すると、図のようにLCDのバックライトが点灯した状態になります。お好みで利用してください。ピンソケットでGPIOに直接差したLCDならば、GPIO 4をHIGHにすることでバックライトが点灯します。なお、バックライトを利用するには、LCDを基板に半田付けする際に2か所の四角いピンも半田付けする必要がありますのでご注意ください。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRHFJkGhyphenhyphenWLaL-o-B8HYPMrY-FKQDxBGYM9GCdf1iBTFzgs_V5qhitHxCr0ky5mUfeYkoqTRhTWCkXs4TNagWN5lctEFiwTWFQZ1Ww7qvDCRI0ZErMamsQ051yijp1ru0z4JegjLtmc49c/s1600/newlcd2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRHFJkGhyphenhyphenWLaL-o-B8HYPMrY-FKQDxBGYM9GCdf1iBTFzgs_V5qhitHxCr0ky5mUfeYkoqTRhTWCkXs4TNagWN5lctEFiwTWFQZ1Ww7qvDCRI0ZErMamsQ051yijp1ru0z4JegjLtmc49c/s640/newlcd2.png" width="640" /></a></div>
<br />
<h4>
4章全般:利用できるLCDについて2~ストロベリーリナックス編</h4>
他に用いることのできるLCDとしては、例えばストロベリーリナックスで取り扱われている以下のものがあります。どちらも16文字x2行ですので、本書で取り扱ったものの倍の文字数を表示できます。
<br />
<ul>
<li><a href="https://strawberry-linux.com/catalog/items?code=27002" target="_blank">【大型】I2C低電圧キャラクタ液晶モジュール(16x2行)通過型</a></li>
<li><a href="https://strawberry-linux.com/catalog/items?code=27001" target="_blank">I2C低電圧キャラクタ液晶モジュール(16x2行)</a></li>
</ul>
下図は、<br />
<ul>
<li>sudo python3 bb2-04-03-lcd-practice.py 'Hello, Raspberry Pi!'</li>
</ul>
を実行した様子です。現在のRaspbianでは管理者権限を表す「sudo」は不要ですが、上のようにsudoをつけても問題なく動作します。<br />
<br />
ただし、この2つのLCDでは、本書p.115図4-11の文字コード表の一番左の列(0x06~0x0f)の文字は表示されないようです。ご了承ください。<br />
<br />
これらのLCDが本書のLCDと共通でのプログラムで利用可能な理由は、コントローラーICとしてST7032iと呼ばれるものが共通で用いられているためです。そのため、書籍で紹介したLCDにあったロットによる問題が将来起こらないとは限りません。その場合はやはり上記の暫定的対処法を試すことになるでしょう。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-WoPg5AgSJzIvRHOJ3rZFBUo3GEShr3yn9NoYhG_qdi1bHhi4sB_sFt-zts-Ioc4Y3NHjyw2ute63zrLVcyAuxrgIeKdJNxBgr5SaTblBjFf7QmbaljaOFBjZM3idQSFjfshQmfpgi5bG/s1600/LCDall.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-WoPg5AgSJzIvRHOJ3rZFBUo3GEShr3yn9NoYhG_qdi1bHhi4sB_sFt-zts-Ioc4Y3NHjyw2ute63zrLVcyAuxrgIeKdJNxBgr5SaTblBjFf7QmbaljaOFBjZM3idQSFjfshQmfpgi5bG/s640/LCDall.jpg" width="640" /></a></div>
<br />
なお、回路の接続は本書のものとは少し異なります。上図のどちらの液晶を用いる場合も下図を参考にしてください。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwijYEPjlXXaiUXEk3yr4GoiM4HDF2XJiJP7vA2mIexHPJHv2u4ALeaVt-8nTXS9VnSEyjnc1DLevvtaDb5PFicx_3GVu1owUsrvr0naz7sLG4w836OInM5lGo8TGdLGHaq1VyiRb58sYq/s1600/LCDconnect.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwijYEPjlXXaiUXEk3yr4GoiM4HDF2XJiJP7vA2mIexHPJHv2u4ALeaVt-8nTXS9VnSEyjnc1DLevvtaDb5PFicx_3GVu1owUsrvr0naz7sLG4w836OInM5lGo8TGdLGHaq1VyiRb58sYq/s400/LCDconnect.png" width="400" /></a></div>
<br />
プログラムは、一行だけ変更が必要です。LCDを用いるプログラムには下記のようにLCDの文字数を設定している行があります。これらは8x2の液晶であることを示しています。
<br />
<pre class="prettyprint">chars_per_line = 8
display_lines = 2
</pre>
これを下記のように変更して保存すれば完了です。
<br />
<pre class="prettyprint">chars_per_line = 16
display_lines = 2
</pre>
この変更をしなければ、単に8x2の液晶として動作します。<br />
<br />
また、「I2C低電圧キャラクタ液晶モジュール(16x2行)」(小さいほう)を用いるとデフォルトでは文字がやや薄くなります。2019/6/25に更新されたサンプルファイルでは文字の濃さを調整できるよう変更されていますので、必要に応じて raspi2-sample.zip をダウンロードしなおし、展開した上で利用してください。
<br />
<br />
更新されたそれぞれのファイルで下記の行を見つけ、contrastの値を40に変更し保存してください。必要に応じて、上で記した「chars_per_line」を16にする変更も行なってください。
<br />
<pre class="prettyprint">contrast = 32 # 0から63のコントラスト。通常は32、文字が薄いときは40を推奨
</pre>
<br />
<h4>
p.108:以前のLCDを購入した場合の暫定的な対処法</h4>
<h4>
<LCD対処法:予備知識></h4>
読者の方により、書籍内で紹介したLCD(AQM0802)を2015年12月頃以降に購入した場合、Raspberry Piから認識されない(i2cdetectコマンドを実行しても3eが表示されない)ことがあることを教えて頂きました。
<br />
<br />
私も新たに完成品のLCD(AQM0802)を購入してみましたが、確かに同じ状況になりました。販売店に問い合わせたところ、「LCDの新しいロットでは電流の引き込み能力が低くRaspberry Piで動作(認識)しない」との回答でした。<br />
<br />
このままでは4章の演習を実行できなくなってしまいます。そこで、そのように問題のあるLCDを動作させる方法をここで紹介します。なお、最も簡単な解決方法は、本ページ上部で紹介した動作確認済のLCDを購入することです。以下は、古いLCDをなんとか活用したいという方向けの情報です。<br />
<br />
まず、対処法を理解するための予備知識から解説します。LCDモジュールの基板の裏には、下図(A)または(B)のように、PUと書かれた部分にジャンパとよばれる電極が2セットあります。LCDモジュールを自分ではんだづけした方は下図(A)の状態、完成品を購入した方は下図(B)の状態の方が多いでしょう。下図(A)の状態では、一つの正方形内の凹凸状の電極は絶縁されています。ここにはんだを盛り下図(B)のようにすると電極が接続され、LCDモジュールの基板上のプルアップ抵抗が有効になります。そのため、これらの状態をそれぞれ「PUなし」、「PUあり」と呼ぶことにします(PUはpull-upの略です)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPseAZvFH6zpLSJvCnbXFTr88AbB4rYixC-dC92884QFiP2nI5_Nnb7cB6nabFbPulGA7hAMU1A6qlwOjVIw_WjLhvWVh1mnTJp45jM32B1MPpjAevXk2lf7t2y-ptDLlTaAicu4nnHdn6/s1600/LCDTrouble01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPseAZvFH6zpLSJvCnbXFTr88AbB4rYixC-dC92884QFiP2nI5_Nnb7cB6nabFbPulGA7hAMU1A6qlwOjVIw_WjLhvWVh1mnTJp45jM32B1MPpjAevXk2lf7t2y-ptDLlTaAicu4nnHdn6/s640/LCDTrouble01.png" width="640" /></a></div>
<br />
一般に、プルアップ抵抗はI2C接続時に必要になるものですが、Raspberry Pi内部に既にこのプルアップ抵抗が存在するので、LCDモジュールの基板上では必ずしもこのプルアップ抵抗の有効化は必要ありませんでした。そのため、4章において正常動作するLCDでは「PUなし」、「PUあり」のどちらでもLCDは動作しました(ただし、8章ではサーボドライバ上のプルアップ抵抗の影響で、LCDでは「PUなし」としなければ動作しないことがあります)。
<br />
<br />
既に述べたように、「PUなし」から「PUあり」の状態にするには、凸と凹の電極にまたがるようにはんだを盛ります。逆に、「PUあり」から「PUなし」の状態に戻すには、上図(C)のように、はんだ吸い取り線を用いてPU部からはんだを除去するのが簡単です。
<br />
<br />
以上の予備知識のもと、どなたにでも容易に実現可能な暫定的対処法と、上級者向けの正式な対処法との2つを紹介します。
<br />
<br />
<h4>
<LCD対処法:暫定版></h4>
まずは、どなたにでも容易に実現可能な暫定的対処法を紹介しましょう。
<br />
Raspberry Piから認識されない完成品LCD(AQM0802)に対して、回路に下図のようにSDA部からGNDの間に抵抗を追加すると、動作を確認することができました。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyRE9gv7Doh-NNcNfJFrsZHODKL6K7O7Rk1dNhbyTr16UK65dvuc39kJ5e1UTDW18YXI4oiPvt4mP1KCDf7323BUns5I7-9Vcnw80FJyPKMxAcz3yKSsmf9_WN57Cde1OimIhmQUMzCpGF/s1600/LCDTrouble02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyRE9gv7Doh-NNcNfJFrsZHODKL6K7O7Rk1dNhbyTr16UK65dvuc39kJ5e1UTDW18YXI4oiPvt4mP1KCDf7323BUns5I7-9Vcnw80FJyPKMxAcz3yKSsmf9_WN57Cde1OimIhmQUMzCpGF/s640/LCDTrouble02.png" width="640" /></a></div>
<br />
抵抗の大きさRとしては、下記の範囲のものが有効でした。
<br />
<ul>
<li>PUありの場合のR:2kΩ</li>
<li>PUなしの場合のR:2kΩ~4.7kΩ程度</li>
<li>ただし、8章でサーボドライバとともに用いる場合「PUなし、R=2kΩ」のみ。サーボドライバにプルアップ抵抗が含まれており、実質「PUあり」と同じ状態になるためです。</li>
</ul>
後に述べるように、私はPUなし(PU部のはんだをはんだ吸い取り線で除去した状態)で4.7kΩの抵抗を用いることを推奨します。4.7kΩでI2C通信のエラーの頻度が高い場合は3.9kΩが良いかもしれません。抵抗は例えば、<a href="https://akizukidenshi.com/catalog/g/g125202/" target="_blank">2kΩ</a>、<a href="https://akizukidenshi.com/catalog/g/g125392/" target="_blank">3.9kΩ</a>、<a href="https://akizukidenshi.com/catalog/g/g125472/" target="_blank">4.7kΩ</a>などが購入できます。
<br />
<br />
なお、この方法を用いると、3.3VピンからGNDまで1.8kΩ+RkΩの抵抗で接続されることになるので、約0.5mAから1.0mA程度の電流が流れ続けます(1.8kΩの抵抗は、Raspberry Pi本体内部にあるI2C用のプルアップ抵抗です)。この程度の大きさの電流がRaspberry Piに問題を起こすことはないと思われますが、本来不要な電流が流れる手法であることは注意しておいてください。なお、比較のために記すと、2章でLEDを点灯したときに流れる電流は約5mAです。
<br />
<br />
以上で、暫定的対処法の解説は終わりますが、以下、動作しない完成品LCDで何が起こっているか、そしてこの方法により何が起こるのかを簡単に記しておきます。
<br />
<br />
まず、「動作しない完成品LCD」の何が問題かを記したのが下図です。I2C通信時にLCDから
Raspberry Piに対してACK信号と呼ばれるLOW信号を出力する場面があります。正常動作するLCDでは、このACK信号は約0.8Vとなっています。これはこのLCDの仕様の範囲内の動作です。しかし、「動作しない完成品LCD」ではこれが約1.2Vとなってしまっています。これをRaspberry PiがLOWと認識できないため、処理がそこで止まっているようです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr0wnsD-vuVVOYefLScojwp3BYzIwYSYEdtqDzFHH7vWkdU4r1_NjmT8QcGFnSdWVIBcNlXSsAkd5nEW7uwPd5eXrXnSTUBE9r3e5koXiebRwnpZMNnfvTFmSMJpklVhnQ2M2ojrPeKslT/s1600/LCDTrouble04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr0wnsD-vuVVOYefLScojwp3BYzIwYSYEdtqDzFHH7vWkdU4r1_NjmT8QcGFnSdWVIBcNlXSsAkd5nEW7uwPd5eXrXnSTUBE9r3e5koXiebRwnpZMNnfvTFmSMJpklVhnQ2M2ojrPeKslT/s640/LCDTrouble04.png" width="640" /></a></div>
<br />
これに対し、暫定的な対応法ではこのACK信号を下図のように約1.0Vまで引き下げています。ただし、下図に示されている通り、3.3VであるべきHIGH信号まで下げてしまいますので、下げすぎると、Rapberry PiからHIGH信号も認識できなくなってしまいます。図を見るとわかる通り、「PUあり、R=2kΩ」ではHIGHが2Vまで下がっており、HIGHと認識されなくなる直前だろうと思います。これが「PUなし、R=4.7kΩ」を推奨する理由です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn8AXKUoUtHWY3GBO8x5BOQG2J6IdE4OGUwb8cyS1ZgbKo19JeqAH0YxcZaVQFuPXMoBs2XZD-69T-fR3KpVmV5FZYWlnyfuIE0z47aUngooTPvSJGnLCxGkLU9627fJDLXH52sob-MEZU/s1600/LCDTrouble05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn8AXKUoUtHWY3GBO8x5BOQG2J6IdE4OGUwb8cyS1ZgbKo19JeqAH0YxcZaVQFuPXMoBs2XZD-69T-fR3KpVmV5FZYWlnyfuIE0z47aUngooTPvSJGnLCxGkLU9627fJDLXH52sob-MEZU/s640/LCDTrouble05.png" width="640" /></a></div>
<br />
ただし、いずれにせよこれはあくまで暫定的な対処法です。正常なI2C通信では必要のない対処法ですのでご注意ください。<br />
<br />
<h4>
<LCD対処法:正式版(ただし上級者向け)></h4>
最後に、LCD(AQM0802)を用いるための正式な方法を紹介します。ただし、これは「表面実装用」と呼ばれるタイプのチップをはんだづけする必要があり、かなりの上級者向けとなりますので、自信のある方のみお試しください。<br />
<br />
この方法には、I2CバスリピーターPCA9515ADと呼ばれるチップが必要となります。これをブレッドボードで用いるためには、下記の3点が必要となり、下図のようにはんだづけする必要があります。
<br />
<ul>
<li><a href="hhttps://akizukidenshi.com/catalog/g/g110882/" target="_blank">I2Cバスリピーター PCA9515AD</a></li>
<li><a href="hhttps://akizukidenshi.com/catalog/g/g105154/" target="_blank">SOP8(1.27mm)DIP変換基板 金フラッシ</a></li>
<li><a href="https://akizukidenshi.com/catalog/g/g104392/" target="_blank">細ピンヘッダ 1×4</a>:2つ必要</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDKL7yDIyM2W02ws8Sn4nOA0Z4RAuNIpHFrrPmOgYz1AOteAX0eygmsLLNduGOjDhflw2jU17v_3LdA8ql9HyYy9qwP7LazxbUzCEgQIDNvO8NH7-_SwKSONL8kcylch-H_yjkySsLtCKn/s1600/repeater-all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDKL7yDIyM2W02ws8Sn4nOA0Z4RAuNIpHFrrPmOgYz1AOteAX0eygmsLLNduGOjDhflw2jU17v_3LdA8ql9HyYy9qwP7LazxbUzCEgQIDNvO8NH7-_SwKSONL8kcylch-H_yjkySsLtCKn/s400/repeater-all.png" width="400" /></a></div>
<br />
なお、上図の「EN」はENABLEの略で、利用時はHIGH(3.3V)に接続します。<br />
<br />
PCA9515ADはリンク先の写真で分かる通り、表面実装用と呼ばれるタイプの部品であり、これを基板上にはんだづけするには、やや高度な技術が必要です。そのため、この方法は上級者向けと言えるでしょう。<br />
<br />
表面実装用の部品のはんだづけする方法は、例えば下記のYouTube動画が参考になるでしょう。
<br />
<ul>
<li><a href="https://www.youtube.com/watch?v=QZMJhrPfYBk" target="_blank">3216チップ抵抗、チップコンデンサのはんだ付け(実装)</a></li>
</ul>
さらに、この動画にあるように、ピンセットやフラックスもあると良いでしょう。例えば下記のようなものです。
<br />
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g102541/" target="_blank">精密ピンセット TS-15</a></li>
<li><a href="http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=82ZA-2BKF" target="_blank">goot BS-75B 無洗浄タイプフラックス20cc</a></li>
</ul>
このPCA9515を利用するための概念図が下図です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLabYV9ibf6fS546W96jgjEtcbKIdGK-eNAU2CAQ2uvjRjetZDGwugMBiSsyzWyYGIwBvkQVF4-cJIV6sbJfPE0RnW6fNmAWMFQ1Ou4IZTtSApoW3KWI3VcirQyOesl3GeOtH6Hh_kEHW5/s1600/fig07-05-I2Crepeater.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLabYV9ibf6fS546W96jgjEtcbKIdGK-eNAU2CAQ2uvjRjetZDGwugMBiSsyzWyYGIwBvkQVF4-cJIV6sbJfPE0RnW6fNmAWMFQ1Ou4IZTtSApoW3KWI3VcirQyOesl3GeOtH6Hh_kEHW5/s400/fig07-05-I2Crepeater.png" width="400" /></a></div>
<br />
この小型液晶AQM0802の新しいロットを使う上で問題になるのが、Raspberry Pi上にあるプルアップ抵抗1.8kΩが小さすぎることです。新しいロットのAQM0802を使う上では10kΩが推奨されています。しかし、Raspberry Piのプルアップ抵抗は基板上に固定されており、そのため、プルアップ抵抗を小さくすることは容易なものの(接続するプルアップ抵抗の数を増やせばよい)、大きくすることは簡単ではありません。<br />
<br />
そこで、上図のようにPCA9515を用いてRaspberry Piおよび温度センサ側と小型液晶側を切り離し、左側をプルアップ抵抗1.8kΩで、右側をプルアップ抵抗10kΩで利用できるようにするというわけです。<br />
<br />
そのためには、ブレッドボード上で下図のような回路を組みます。図を簡単にするために、小型液晶側のプルアップ抵抗は、小型液晶モジュールのプルアップ抵抗PUを用いることにしました。上の解説「<LCD対処法:予備知識>」を参考に、<b>2箇所のPUに半田を盛り、基板上のプルアップ抵抗を有効に</b>してください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglSGxjNkM30verWHCI5V0Wtt9MA0pOwWK4zUOI3EH2-cMrhJALrq1_004nFTo4ow3ut9GHeH9Jj-anqhIxMZNnZ8ZSeqQwuGxz3KOpcKTvNVt2KHVZNo-2SbB_3si90JUYhmOnrDUNN1o/s1600/bb2-fig04-09-I2Crepeater.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="341" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglSGxjNkM30verWHCI5V0Wtt9MA0pOwWK4zUOI3EH2-cMrhJALrq1_004nFTo4ow3ut9GHeH9Jj-anqhIxMZNnZ8ZSeqQwuGxz3KOpcKTvNVt2KHVZNo-2SbB_3si90JUYhmOnrDUNN1o/s640/bb2-fig04-09-I2Crepeater.png" width="640" /></a></div>
<br />
<h4>
p.119:タクトスイッチを用いるプログラムの管理者権限について</h4>
タクトスイッチを用いる bb2-04-04-lcd-4modes.py および bb2-04-05-lcd-3modes.py はどのバージョンのNOOBSでも管理者権限が必要と述べましたが、
現在では、これらのプログラムでも管理者権限が不要になりました。興味のある方は試してみてください。<br />
<br />
<h3>
第5章</h3>
<h4>
5章全般:音声認識によるリモコン操作</h4>
本章では、リモコン操作を行う方法として、「irsendコマンド」、「タクトスイッチ」、「ブラウザ」の3種類を用いました。さらに、「音声認識」によりリモコン操作を行う方法を応用演習として二種類追加しましたのでご活用ください。
<br />
<br />
まず、Raspberry Pi上のOSに音声認識用ソフトウェアであるJuliusをインストールする方法です。
<br />
<ul>
<li><a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a></li>
</ul>
もう一つは、インターネット(クラウド)上の音声認識機能をRaspberry Piから利用する方法です。
<br />
<ul>
<li><a href="https://raspibb2.blogspot.jp/2018/02/raspberry-pi-google-assistant-api-lirc.html" target="_blank">Raspberry Pi + Google Assistant API + LIRCによりテレビを音声認識で操作する</a></li>
</ul>
お好みの方をお試しください。どちらかというと、クラウドを利用する方法の方が難易度が高いと思います。<br />
<br />
<h4>
p.134:エアコンのリモコンの利用について</h4>
本書ではエアコンのリモコンからの信号をRaspberry Piで利用する方法については解説しませんでした。しかし、その方法はありますので、下記のページに解説を追加しました。
<br />
<ul>
<li><a href="https://raspibb2.blogspot.jp/2016/06/raspberry-pilirc.html" target="_blank">Raspberry Pi上のLIRCでエアコンを操作する</a></li>
</ul>
本書でテレビのリモコンからの信号を利用できるようになった後、興味のある方は取り組んでみてください。
<br />
<br />
<h4>
p.141:様々なOSのバージョンでのLIRCの設定</h4>
本書発売後よりさまざまなバージョンのRaspbianがリリースされ、そのたびにLIRCの設定法が変化してきました。
ここでは、下記の3つの場合についてLIRCの設定方法を解説します。解説が長くなりますので、それぞれ別ページにて解説することとします。上に記されているものほど新しい OS での実現方法となっています。
<br />
<ol>
<li><a href="https://raspibb2.blogspot.com/2021/11/raspberry-pi-os-bullseye-lirc.html" target="_blank">Raspberry Pi OS Bookworm / Bullseye / Buster でlircを利用する</a></li>
<li><a href="https://raspibb2.blogspot.com/2019/06/kernel-419raspbian-stretchbusterlirc.html" target="_blank">kernel 4.19以降を搭載したRaspiban Stretchでlircを利用する</a></li>
<li><a href="https://raspibb2.blogspot.com/2019/06/kernel-414raspiban-stretchlirc.html" target="_blank">kernel 4.14までを搭載したRaspiban Stretchでlircを利用する</a></li>
</ol>
Raspberry Pi OS Bookworm / Bullseye / Buster を用いる最新の1.の方法が最も簡単です。
<br />
<br />
<h4>
p.161:irsendコマンドのオプションについて</h4>
読者の方からお知らせいただいた内容をまとめます。SHARPのテレビには「クイック起動設定」という設定がある機種があるそうです。
そのクイック起動設定がオフの時、下記のように「-# 2」オプションをつけないとテレビの電源を正常にオンオフできなかったそうです。
<br />
<pre class="prettyprint">irsend -# 2 SEND_ONCE TV power
</pre>
p.162に記したように、このオプションは信号波形を二回送信するためのものでしたね。<br />
<br />
<h4>
p.165:タクトスイッチを用いるプログラムの管理者権限について</h4>
タクトスイッチを用いる bb2-05-01-TV.py はどのバージョンのNOOBSでも管理者権限が必要と述べましたが、
現在では、このプログラムでも管理者権限が不要になりました。興味のある方は試してみてください。<br />
<br />
<h3>
第6章</h3>
<h4>
p.184:12ビットADコンバータMCP3208</h4>
6章ではADコンバータとして秋月電子通商で取り扱われている
<br />
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g100238/" target="_blank">12bit 8ch ADコンバータ MCP3208-CI/P</a></li>
</ul>
を用いますが、この在庫が切れている場合、下記のMCP3204を用いても構いません。
<br />
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g117732/" target="_blank">12bit 4ch ADコンバータ MCP3204-BI/P</a></li>
</ul>
ただし、MCP3204はMCP3208に比べて2ピン少ないので、少しだけ回路の読み替えが必要です。図6-14、図6-15を例に、変更箇所を赤で示しますので参考にして下さい。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdCQ817YXTGcaJD4lPppZHhMAhV3-bpSQ92q8_A5SewogehKumDTJ3RZzt7wN3FZwGq0atKrKqzY6Kfp0MfsRLRsOhneVaPntUMGdbNMnIljg7HOnss68VyQclsuQiFbE1R6hEVK_70fU/s1600/fig06-14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdCQ817YXTGcaJD4lPppZHhMAhV3-bpSQ92q8_A5SewogehKumDTJ3RZzt7wN3FZwGq0atKrKqzY6Kfp0MfsRLRsOhneVaPntUMGdbNMnIljg7HOnss68VyQclsuQiFbE1R6hEVK_70fU/s400/fig06-14.png" width="400" /></a></div>
<div align="center">
MCP3204を用いる場合の図6-14の変更点
</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkpfHaabHGuOHAtsle_M1yJxqkY-qSmoc4UeUS77R9vuHpQc-zMpuG1V5MwewZQkVcC2kSLvDLF_FL9xt-U1wJ4JGZu1QBBYYbWkr797fVzIlpEvwI7oBYPH1TRgKRhAJ5gyy_G4gnTZI/s1600/fig06-15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="505" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkpfHaabHGuOHAtsle_M1yJxqkY-qSmoc4UeUS77R9vuHpQc-zMpuG1V5MwewZQkVcC2kSLvDLF_FL9xt-U1wJ4JGZu1QBBYYbWkr797fVzIlpEvwI7oBYPH1TRgKRhAJ5gyy_G4gnTZI/s640/fig06-15.png" width="640" /></a></div>
<div align="center">
MCP3204を用いる場合の図6-15の変更点
</div>
<br />
<br />
<h4>p.184, Bookworm (Raspberry Pi OS 2023-10-10 以降) および Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について</h4>
Raspberry Pi OS 2023-10-10 からはじまったバージョン Bookworm および <br />
Raspberry Pi OS 2021-10-30 からはじまったバージョン Bullseye では<br />
カメラモジュールの利用方法に大きな変更が加えられ、libcamera というライブラリを用いるようになりました。
これは、本書でカメラを用いるプログラムがそのままでは動かなくなる、ということを意味します。
<br /><br />
ただし、Bullseye では「Legacy Camera」という、これまでと互換性のあるカメラの利用方法が可能になっています。この Lecgacy Camera を用いれば本書でカメラを用いるプログラムはそのまま動作しますが、
残念ながら Bookworm では Legacy Camera モードは削除されてしまいました。
<br /><br />
以上を踏まえて現状をカメラの利用方法について整理すると、以下のようになります。将来を見据えれば、最新の OS で「<a href="https://raspibb2.blogspot.com/2023/03/picamera2-libcamera.html" target="_blank">本書の演習を picamera2 (libcamera) で実行する方法</a>」を用いるのがよいと思います。
<br /><br />
<table border="1">
<tr>
<td>32-bit / 64-bit 版 Bullseye および Bullseye</td><td>「<a href="https://raspibb2.blogspot.com/2023/03/picamera2-libcamera.html" target="_blank">本書の演習を picamera2 (libcamera) で実行する方法</a>」で配布しているサンプルファイルを利用する。なお、2023年1月に発売された Camera Module v.3 はこの手法でしか使えません。
</td>
</tr>
<tr>
<td>32-bit 版 Bullseye</td><td>Legacy Cameraモードを有効にした上で、本書付属のサンプルファイルを用いる。これが一番簡単。</td>
</tr>
<tr>
<td>64-bit 版 Bullseye</td><td>Legacy Cameraモードを有効にした上で、「<a href="https://raspibb2.blogspot.com/2021/02/blog-post.html" target="_blank">本書の演習をウェブカメラで実行する方法</a>」で配布しているサンプルファイルを利用する</td>
</tr>
</table>
<br />
さて、Bullseye で Legacy Camera モードを有効にする方法を用いる場合は、以下の方法で「Legacy Camera」のサポートを有効にする必要があります(デフォルトは無効です)。
<br /><br />
ターミナルを開いて以下の手順に従うことで、raspi-config により Legacy Camera を有効にします。
<ol>
<li>「 sudo raspi-config 」を実行することで raspi-config を起動</li>
<li>キーボードの「↓」キーを2回押し、「Interface Options」を選択してから「Enter」キーを押す</li>
<li>「I1 Legacy Camera Enable/Disable」があらかじめ選択されているので、「Enter」キーを押す</li>
<li>「Would you like to enable legacy camera support?」と聞かれるので「←」を一回押すことで「はい」を選択し、「Enter」キーを押す</li>
<li>「非推奨 (deprecated) であり将来サポートされない」という趣旨のことを言われるが、「了解」が選択された状態で「Enter」キーを押す</li>
<li>raspi-configを起動した状態の画面に戻るので、「TAB」キーを二回クリックし、「Finish」を選択した状態で「Enter」キーを押す</li>
<li>再起動を促されるので、「はい」が選択された状態で「Enter」キーを押す</li>
</ol>
以上で、Legacy Camera モードが有効になりますので、あとは上の表に従ってプログラムを利用してください。
<br /><br />
<h4>
p.193:WiringPi2-Pythonを使う演習をpigpioを用いて行う</h4>
本書では、ハードウェアPWM信号を出力するために、「WiringPi2-Python」を用いる記述をしていました。一方、本書より後に発売された「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」では、「WiringPi2-Python」ではなく、「pigpio」を用いています。
<br />
ここでは本書のハードウェアPWM信号を用いる演習を「pigpio」を用いて行う方法を解説します。それにより、「WiringPi2-Python」のインストールが不要になります。
なお、この項目の解説は「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」の読者向けのものとなりますのでご注意ください。
<br /><br />
「WiringPi2-Python」を用いる演習を「pigpio」で実施するには、サンプルファイルの変更が必要になります。
それを簡単に済ませる方法を解説します。本書の通り「WiringPi2-Python」でサンプルプログラムを実行したい方はその必要はありません。<br />
さて、まずターミナルを起動します。そして、本書のサンプルファイルが展開されたディレクトリに移動します。
ユーザーpiのホームディレクトリに展開した方は移動の必要がなく、「bluebacks」ディレクトリに展開した方は「 cd bluebacks 」コマンドを実行するのでした。
そして、以下の2つのコマンドを順に実行します。
<pre class="prettyprint">(1) wget https://raw.githubusercontent.com/neuralassembly/raspi/master/raspi2-pigpio.patch
(2) patch -p1 -i raspi2-pigpio.patch
</pre>
以上のコマンドにより、
「WiringPi2-Python」用のプログラムが、すべて「pigpio」用のプログラムに置き換えられます。
<br />
なお、もし WebIOPi 用にプログラムを /usr/share/webiopi/htdocs にコピー済だという方は、さらに次の2つのコマンドも順に実行し、
WebIOPi 用のファイルを一旦消してコピーしなおしてください。
<pre class="prettyprint">(1) suro rm -rf /usr/share/webiopi/htdocs/bb2
(2) cp -r bb2 /usr/share/webiopi/htdocs
</pre>
あとは、「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で解説されているように、
ハードウェアPWMを使用するプログラムの実行前に「sudo service pigpiod start」コマンドで pigpiod を実行しておくことを忘れないようにしましょう。なお、この注意が必要なのは本書6章と7章のみです。8章ではハードウェア PWM 信号の出力を行うのはサーボドライバーでありRaspberry Pi ではないため、pigpio は必要ではないのです。
<br /><br />
<h4>
p.193:WiringPi2-Python (WiringPi-Python) のインストールコマンド</h4>
本書ではハードウェアPWM信号を出力するために、WiringPi2-Python を用いるよう解説しました。その後、WiringPi2-Python のサポートは終了し、互換性がある新バージョンである WiringPi-Python に引き継がれました。本書のサンプルファイルは、この WiringPi-Python を用いるよう2023/3/28 に更新されています。WiringPi-Python のインストール法は以下の通りです。
<br />
ターミナルを起動して、以下のコマンドを順に実行しましょう。Python3 用の WiringPi-Python がインストールされます。
<br />
<pre class="prettyprint">(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
</pre>
なお、一度インストールしたWiringPi-Pythonを上書きインストールしたい場合、上記コマンドの実行前に、ホームディレクトリで下記のコマンドを実行して古いファイルを事前に実行しておきましょう。
<br />
<pre class="prettyprint">sudo rm -rf WiringPi-Python
</pre>
<br />
<h4>
p.196:WiringPi-Pythonを用いたプログラムの実行について</h4>
現在のRaspbianでは、多くの電子工作プログラムの実行には管理者権限が不要になりました。
<br />
しかし、WiringPi-Pythonを用いるbb2-06-01-zero.pyやbb2-06-02-pantilt.pyの実行には今でも管理者権限が必要です。<br />
正確には、精度の高いハードウェアPWMを用いるプログラムの実行には管理者権限が必要です。
<br />
<br />
用いている実行方法により下記のどれかのコマンドの実行が必要となります。
<br />
<pre class="prettyprint">管理者権限のIDLEで実行
sudo idle-python3.7 &
</pre>
<pre class="prettyprint">管理者権限のThonnyで実行
sudo thonny &
</pre>
<pre class="prettyprint">管理者権限のPython3コマンドで実行
sudo python3 bb2-06-01-zero.py
</pre>
<br />
<h4>
p.196:pigpio で bb2-06-01-zero.py を動かす場合の注意</h4>
「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で用いたpigpio で bb2-06-01-zero.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-06-01-zero.py の実行には管理者権限は不要です。
<br /><br />
<h4>
p.199~201:タミヤの工作キットで作ったカメラ台のカラー画像</h4>
タミヤの工作キットで作るカメラ台の作成方法を示す図ですが、書籍では画像がやや小さく見にくいかもしれません。下記に、カラーで解像度の高い画像を貼り付けますので、ご活用ください。<br />
<br />
画像をクリックすると画像が大きくなります。必要に応じて、大きくした画像上で右クリックして「名前を付けて保存」を選択して保存すると良いでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9HuWtbyvcfON16iv5tgvwauMq3SNKUcD8rUjlZaxBWJZNLslYaqCcMqNZCP1OQv1mthc9N6jHfZlJYPpzz8GEVzQBg_mxMz2NELnJpO_7roLEQWxLLsedHhg9awNrSg2l7ZjcPjBVoao/s1600/fig06-07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9HuWtbyvcfON16iv5tgvwauMq3SNKUcD8rUjlZaxBWJZNLslYaqCcMqNZCP1OQv1mthc9N6jHfZlJYPpzz8GEVzQBg_mxMz2NELnJpO_7roLEQWxLLsedHhg9awNrSg2l7ZjcPjBVoao/s640/fig06-07.png" width="640" /></a></div>
<div style="text-align: center;">
図6-7</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1JACBbHxQ5SksoA4M96Y53yxWieroqwlCrpffaBrPYdE79NAl8DUyDAOW-sNYGPlFrUzMy5aGvJuNC2RwIGV54zAf9kjuapdy6sjfml8ITnXVFkJQyOQ76zH5n5XTjh-SbLigBJY08G4/s1600/fig06-08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1JACBbHxQ5SksoA4M96Y53yxWieroqwlCrpffaBrPYdE79NAl8DUyDAOW-sNYGPlFrUzMy5aGvJuNC2RwIGV54zAf9kjuapdy6sjfml8ITnXVFkJQyOQ76zH5n5XTjh-SbLigBJY08G4/s640/fig06-08.png" width="640" /></a></div>
<div style="text-align: center;">
図6-8</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUo_ZXdHoM4ee1adf8U0fF6CE72u8b-8YQ0Nrw0jOnvyzSYElECyzqFlX8Pqm-b2vkD-OkwOCZZ_u9kjA89rCxHbuL9f5VpliqEfRKBusUyyKa7mBMS-iKDaCq6DloXKAi9gNABj2xsE/s1600/fig06-09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDUo_ZXdHoM4ee1adf8U0fF6CE72u8b-8YQ0Nrw0jOnvyzSYElECyzqFlX8Pqm-b2vkD-OkwOCZZ_u9kjA89rCxHbuL9f5VpliqEfRKBusUyyKa7mBMS-iKDaCq6DloXKAi9gNABj2xsE/s640/fig06-09.png" width="640" /></a></div>
<div style="text-align: center;">
図6-9</div>
<br />
<h3>
p.205:カメラマウントA838を用いた場合のカメラ台のカラー画像</h3>
同様に、図6-12、図6-13のカラー画像も載せます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyKD3Dq5DttQ1nbQ3CiJGf8eqHCE9QzbTiqNutHunjWT0Z4lAwKmHkd12hcqqaYaKpByQeH9htHWpYt1Narjsa4MLApluqI1qlAZG0IQJq48prMXc6-xxzcP8iSqIEFF7hJjTGnwBJAcY/s1600/fig06-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyKD3Dq5DttQ1nbQ3CiJGf8eqHCE9QzbTiqNutHunjWT0Z4lAwKmHkd12hcqqaYaKpByQeH9htHWpYt1Narjsa4MLApluqI1qlAZG0IQJq48prMXc6-xxzcP8iSqIEFF7hJjTGnwBJAcY/s640/fig06-12.png" width="640" /></a></div>
<div style="text-align: center;">
図6-12</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimfKR-FxdHYCXQ4qd2xwTUDJrTg9UKtaT_uZqB2KvK8nG6B5J1QJ_49YGV8-3H5T5X1HEqjKpivZJjIj4Movec_e6CKYEMOU7BiTsa1aJBPkbAVpbhE-7CRIvPqwvfLenUIRis_2OOVXM/s1600/fig06-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimfKR-FxdHYCXQ4qd2xwTUDJrTg9UKtaT_uZqB2KvK8nG6B5J1QJ_49YGV8-3H5T5X1HEqjKpivZJjIj4Movec_e6CKYEMOU7BiTsa1aJBPkbAVpbhE-7CRIvPqwvfLenUIRis_2OOVXM/s640/fig06-13.png" width="640" /></a></div>
<div style="text-align: center;">
図6-13</div>
<br />
<br />
<h4>
p.209:半固定抵抗の回転の向きについて</h4>
本書は、Arduino Sidekick Basic Kit付属の半固定抵抗を用い、「右に回すとAD変換後の値が大きくなる」回路を組みました。この回転の向きは、下図のように「半固定抵抗の3.3VピンとGNDへの接続を入れ替える」ことで逆にすることができます。<br />
<br />
お使いの半固定抵抗により回転の向きが異なることがありますので、配線の入れ替えにより好みの向きを選択してください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikQvAhiYyGMx2l_uVdJEPlSx0wP174MCPV9zPYEuoOlGWEvRivNwIP_U_0zAWIjy9SKU50PRnrfWpEBvHEpnFHfZ_Dt_bcGwxnevPizDNqJ9mGvDxZ4Rm12rpPbe392C3zv6k74fSD8lTq/s1600/DirectionOfVolume.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikQvAhiYyGMx2l_uVdJEPlSx0wP174MCPV9zPYEuoOlGWEvRivNwIP_U_0zAWIjy9SKU50PRnrfWpEBvHEpnFHfZ_Dt_bcGwxnevPizDNqJ9mGvDxZ4Rm12rpPbe392C3zv6k74fSD8lTq/s400/DirectionOfVolume.png" width="400" /></a></div>
<br />
<h4>
p.210:pigpio で bb2-06-02-pantilt.py を動かす場合の注意</h4>
「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で用いたpigpio で bb2-06-02-pantilt.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-06-02-pantilt.py の実行には管理者権限は不要です。
<br /><br />
<h4>
p.211:カメラモジュールのテスト用コマンド</h4>
211ページのコマンドはやや長いので、コピー用に再掲します。
<br />
<pre class="prettyprint">raspivid -t 0 -w 640 -h 480 -p 150,150,640,480
</pre>
なお、このコマンドは Raspberry Pi OS Bookworm および Bullseye では利用できません。7章で紹介した OpenCV をインストールした上で、コマンド「 python3 bb2-07-01-preview.py 」でカメラを映像を確認するのが良いでしょう。
<br />
<br />
<h4>
p.222:長いコマンドの入力には注意</h4>
p.222からp.223で紹介したmjpg-streamerのインストール用のコマンドは少し長いものが多く、入力を間違うと正しく演習ができなくなってしまいます。<br />
<br />
コピーできる形式で以下に再掲しますので、ブラウザで1行ずつコピーして、ターミナルで貼り付けて実行すると確実でしょう。その際、先頭の「(1)」などはコピーする必要はありませんのでご注意ください。
<br /><br />
ただし、Bookworm や Bullseye を用いていて、libcamera 対応の mjpg-streamer をインストールする場合はここで紹介したコマンドではなく、「<a href="https://raspibb2.blogspot.com/2023/03/picamera2-libcamera.html" target="_blank">本書の演習を picamera2 (libcamera) で実行する方法</a>」で紹介するコマンドを実行する必要がありますのでページを移動してください。
<br /><br />
さて、ここで紹介するコマンドは、libcamera を用いない場合、すなわち、Bullseye で Legacy Camera モードでカメラを利用する場合です。
また、ブラウザでのコピーは「コピーしたい文字をなぞってから『右クリックしてコピー』または『Ctrl+c』」、ターミナルへの貼り付けは「ターミナル上でメニューから『編集→貼り付け』または『Shift+Ctrl+v』」です(ただし、キーボードのCtrlとCapslockを入れ替えている場合、ショートカットキーは効かないようです)。<br />
<pre class="prettyprint">(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
</pre>
なお、古いOS を用いている方は、(2) のコマンドを
<pre class="prettyprint">(2) sudo apt install libjpeg8-dev cmake
</pre>
としなければならない場合があります。さらに、 Bullseye で Legacy Camera モードを使う場合は、本ページの
「p.184, Bookworm (Raspberry Pi OS 2023-10-10 以降) および Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について」の項目を参考に、Legacy Camera モードを有効にする必要がありますのでその点もご注意ください。
さらに、64-bit版 Bullseye を用いている方は、実行時に「<a href="https://raspibb2.blogspot.com/2021/02/blog-post.html" target="_blank">本書の演習をウェブカメラで実行する方法</a>」で配布しているサンプルファイル内の bb2-06-03-stream-webcam.sh を用いる必要があります。
<br /><br />
また、前著「Raspberry Piで学ぶ電子工作」をご利用いただいた方は、上記の7つのコマンドの実行前に、下記の2コマンドにより過去にインストールしたmjpg-streamerを一度削除した方が安全かもしれません。ターミナルLXTerminalを起動した直後の状態で順に実行してください。
<br />
<pre class="prettyprint">(1) sudo rm -rf /opt/mjpg-streamer
(2) rm -rf mjpg-streamer
</pre>
<br />
<h4>
p.224:mjpg-streamerの実行用コマンド</h4>
224ページのコマンドをコピー用に再掲します。
<br />
<pre class="prettyprint">sh bb2-06-03-stream.sh
</pre>
<br />
<h4>
p.224:mjpg-streamerの映像が表示されない場合のチェック項目</h4>
mjpg-streamerによる映像が表示されない場合、下記をチェックしましょう。
<br />
<ol>
<li>カメラの接続は正しいか(金属が露出した端子面がmicroSDカード側)(→6.1.1で解説)</li>
<li>メニューから「設定」→「Raspberry Piの設定」→「インターフェイス」→「カメラ」が「有効」になっているか(→6.4で解説)</li>
<li>mjpg-streamerのインストールが適切か(→本ページの「p.222:長いコマンドの入力には注意」)</li>
<li>mjpg-steamerの起動命令が適切か(→本ページの「p.224:mjpg-streamerの実行用コマンド」の末尾)</li>
</ol>
それ以外には「IPアドレスは正しいか」もチェックしてください。これらは、WebIOPiを用いた他の演習と同じですね。
<br />
<br />
<h4>
p.229:pigpio でブラウザ操作のカメラ台を動かす場合の注意</h4>
「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で用いたpigpio でブラウザ操作のカメラ台を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。その後で WebIOPi を起動するのです。
<br /><br />
<h4>
p.229:本章のプログラムを自動起動したい場合</h4>
本章のプログラムを、本書8.4.4で紹介した方法で自動起動し、さらにディスプレイやキーボードをRaspberry Piから外した状態で利用したい方がいらっしゃるかもしれません。<br />
<br />
NOOBS 1.9.0 (Raspbian 2016-03-18) までは問題なく動作したのですが、NOOBS 1.9.1 (Raspbian 2016-05-10) 以降は、「Raspbianが黒いコンソール画面で起動する状態」にしないと、ディスプレイを外した状態では正常動作しなくなりました。<br />
<br />
それを実現したい場合、設定アプリケーションを起動し、「システム(System)」タブの「ブート(Boot)」項目にある「CLI(To CLI)」にチェックを入れ、再起動してください。画面が黒い「コンソール」状態でRaspbianが起動し、本章のプログラムが自動起動で正常動作するようになります。<br />
なお、Raspbianが黒いコンソールで起動する状態から元に戻したい場合、コンソールで「startx」というコマンドを実行してデスクトップを起動してから、設定アプリケーションの「ブート(Boot)」項目で「デスクトップ(To Desktop)」を選択し、再起動してください。
<br />
<br />
もし、この「CLI起動によるWebIOPiの自動起動」でもサーボモーターが正常動作しない場合、以下を試してください。
まず、以下のコマンドを実行し、WebIOPiの自動起動を無効にします。
<br />
<pre class="prettyprint">sudo systemctl disable webiopi
</pre>
次に、以下のコマンドで、/etc/rc.localファイルを管理者権限で編集できる状態にします。
<br />
<pre class="prettyprint">sudo leafpad /etc/rc.local
</pre>
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">sudo mousepad /etc/rc.local
</pre>
そして、「exit 0」の上の行に、以下の2行を追記して保存し、再起動してください。
<br />
<pre class="prettyprint">sleep 10
sudo systemctl start webiopi
</pre>
以上で、/etc/rc.localからWebIOPiが起動され、サーボモーターが正常動作することを期待しています。
なお、「sleep 10」は「10秒待機する」の意味です。
安全のために「10秒」と大きな数値を選びましたが、
私の環境では「sleep 3」(3秒待機)程度でも正常動作しました。
さらに、この方法ではCLI起動ではなくGUI起動のままでもサーボモーターが正常動作しました。
<br />
<br />
<h3>
第7章</h3>
<h4>
7章全般:OpenCVのPython3での利用</h4>
2019/6/25に本書のサンプルプログラムを更新し、Python3およびOpenCV3でも動作するようにしました。それ以前にダウンロードされた方は、もう一度raspi2-sample.zipをダウンロードし、展開しなおした上でご活用ください。
<br />
<br />
なお、以下ではOpenCVのインストール方法について下記の2通りの方法を解説します。
<br />
<ul>
<li> Python3でOpenCVを利用する場合(最近のOS) </li>
<li> Python3でOpenCVを利用する場合(NOOBS 3.0.1 (Raspbian 2019-04-08) までの Stretch) </li>
</ul>
<br />
<h4>
p.238:Python3 用のOpenCVのインストール用コマンド (最近のOS) </h4>
最近のOSで Python3 と OpenCV を組み合わせて利用する方法を解説します。2つのコマンドがありますので、一つ一つ順に実行してください。
<br />
<pre class="prettyprint">sudo apt update
sudo apt install libopencv-dev python3-opencv
</pre>
<br />
<h4>
p.238:Python3 用のOpenCVのインストール用コマンド (NOOBS 3.0.1 (Raspbian 2019-04-08) までの Stretch) </h4>
NOOBS 3.0.1 (Raspbian 2019-04-08) までの Stretchで Python3 と OpenCV を組み合わせて利用する方法を解説します。3つのコマンドがありますので、一つ一つ順に実行してください。
<br />
<pre class="prettyprint">sudo apt update
sudo apt install libopencv-dev libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
sudo pip3 install opencv-python==4.1.1.26
</pre>
<br />
<h4>p.239: OpenCVを用いたプログラムの実行時のエラー</h4>
NOOBS 3.1.1 (Raspbian 2019-06-20) または NOOBS 3.2.0 (Raspbian 2019-07-10) でインストールした Raspbian Busterをお使いの場合、OpenCV を用いたプログラムを実行すると下記のエラーが出ます。
<pre class="prettyprint">
ImportError: /usr/lib/arm-linux-gnueabihf/neon/vfp/libavcodec.so.58: undefined symbol: bcm_host_is_fkms_active
</pre>
これは、Raspbian の kernel のバージョンが最新の OpenCV が期待するものより古くなっていることが原因です。
<br /><br />
解決方法は以下の2通りの方法どちらかです。
<ol>
<li>「sudo apt update」、「sudo apt dist-upgrade」で kernel を最新にする</li>
<li>microSDカードをフォーマットして最新の OS をインストールしなおす</li>
</ol>
1. の方が簡単ですのでまずこちらを試し、それで問題が出た場合は 2. を試すのが良いでしょう。
<br />
<br />
<h4>
p.239:bb2-07-01-preview.pyの実行用コマンド</h4>
239ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">python3 bb2-07-01-preview.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br />
<br />
<h4>
p.241:映像サイズを大きくする方法について</h4>
7章のプログラムでは、カメラから320x240のサイズの映像を取得し、何らかの画像処理を施して映像を表示しています。320x240という映像サイズは、画像処理の計算にかかる時間を考慮して決めています。大きくすると、計算に時間がかかり、映像が滑らかに表示されなくなるでしょう。<br />
<br />
しかし、320x240という映像サイズは、表示してみると小さいと感じるのも事実です。ここでは、この映像サイズを大きくする方法を紹介します。
方法は二つ考えられます。
<ol>
<li>カメラからの映像取得のサイズを 640x480 にする</li>
<li>画像処理はサイズ320x240の映像に対して行うが、結果の映像は640x480に引き伸ばして表示する</li>
</ol>
一つ目の方法は、性能が高い Raspberry Pi 4 などでは快適に動作するでしょうが、性能が低い Raspberry Pi Zero などでは動作が遅くなる可能性があります。
その場合は、二つ目の方法を試すと良いでしょう。
<br /><br />
では、一つ目の「カメラからの映像取得のサイズを 640x480 にする」方法を解説します。
2023/3/28 以降にダウンロードしたサンプルファイルでは、7章のプログラムの冒頭に下記のように解像度を指定している箇所があります。
<pre class="prettyprint">(w, h) = (320, 240)
</pre>
これを下記のように書き換えて保存すれば、縦横2倍のサイズの画像に対して画像処理が行われるようになります。
<pre class="prettyprint">(w, h) = (640, 480)
</pre>
次に、二つ目の「画像処理はサイズ320x240の映像に対して行うが、結果の映像は640x480に引き伸ばして表示する」方法を紹介します。
<br />
7章のプログラムの末尾付近には、下記の命令があります。
<br />
<pre class="prettyprint">cv2.imshow('frame', stream.array)
</pre>
という行があります。これは画像を画面に表示する命令なのですが、この命令を削除して下記の2行に置き換えると、320x240の画像が
640x480に引き伸ばして表示されます。(行頭のスペースの数は元の行と同じに統一してください)
<br />
<pre class="prettyprint">dst = cv2.resize(stream.array, (640, 480))
cv2.imshow('frame', dst)
</pre>
映像を引き伸ばして表示しているだけなので、画質は良くありませんが、
デモなどで映像を大きく表示したいときは使えると思います。
<br />
<br />
<h4>
p.241:7章のGUIプログラムを自動起動したい場合</h4>
7章のプログラムはGUIアプリケーションであり、/etc/rc.localに記述しても自動起動できません。
GUIアプリケーションを自動起動する方法を、「<a href="https://raspibb2.blogspot.jp/2017/01/gui.html" target="_blank">GUIアプリケーションの自動起動</a>」にまとめました。
<br />
<br />
<h4>
p.244:bb2-07-02-binary.pyの実行用コマンド</h4>
244ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">python3 bb2-07-02-binary.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br />
<br />
<h4>
p.250:bb2-07-03-cannyedge.pyの実行用コマンド</h4>
250ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">python3 bb2-07-03-cannyedge.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br />
<br />
<h4>
p.252:bb2-07-04-circle.pyの実行用コマンド</h4>
252ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">python3 bb2-07-04-circle.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br />
<br />
<h4>
p.257:bb2-07-05-face.pyの実行用コマンド</h4>
257ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">python3 bb2-07-05-face.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br />
<br />
<h4>
p.263:bb2-07-06-tracking-circle.pyの実行用コマンド</h4>
263ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">sudo python3 bb2-07-06-tracking-circle.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br />
<br />
<h4>
p.263:pigpio で bb2-07-06-tracking-circle.py を動かす場合の注意</h4>
「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で用いたpigpio で bb2-07-06-tracking-circle.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-07-06-tracking-circle.py の実行には管理者権限(sudo)は不要です。
<br /><br />
<h4>
p.268:bb2-07-07-tracking-face.pyの実行用コマンド</h4>
268ページの演習をPython3で実行するコマンドを記します。このコマンドの実行を楽に行うため、p.240で解説したTABキーの利用をマスターすることをお勧めします。
<pre class="prettyprint">sudo python3 bb2-07-07-tracking-face.py
</pre>
エラーが出る場合は2019/6/25に更新されたサンプルファイル raspi2-sample.zip をダウンロードし、展開しなした上でご活用ください。
<br /><br />
<h4>
p.268:pigpio で bb2-07-07-tracking-face.py を動かす場合の注意</h4>
「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で用いたpigpio で bb2-07-07-tracking-face.py を動かす場合、事前に「sudo service pigpiod start」で pigpiod を起動しておくことを忘れないようにしましょう。この場合、 bb2-07-07-tracking-face.py の実行には管理者権限(sudo)は不要です。
<br />
<br />
<h3>
第8章</h3>
<h4>
p.277:6脚ロボットのカラー画像について</h4>
6脚ロボットの作成方法を示す図ですが、書籍では画像がやや小さく見にくいかもしれません。下記に、カラーで解像度の高い画像を貼り付けますので、ご活用ください。<br />
<br />
画像をクリックすると画像が大きくなります。必要に応じて、大きくした画像上で右クリックして「名前を付けて保存」を選択して保存すると良いでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj381GnatSElbi8r6qqJMUvR8vQAcwpbYvCjls5jkq9hBNDlR0WHwmhOV1IBApnNO2sToco6JHUq7PF-alnlIa-mpRBle2Mx-IG9xye1wFmmQzh1jiJswu5S1JRfTue7aR-S5HIn3g9orA/s1600/fig08-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj381GnatSElbi8r6qqJMUvR8vQAcwpbYvCjls5jkq9hBNDlR0WHwmhOV1IBApnNO2sToco6JHUq7PF-alnlIa-mpRBle2Mx-IG9xye1wFmmQzh1jiJswu5S1JRfTue7aR-S5HIn3g9orA/s640/fig08-03.png" width="491" /></a></div>
<div style="text-align: center;">
図8-3</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzGGvqkTp9bPsLtaIGyharfNrloQgnfSKClYktYExlwAfbZrVoLAeS9b-YDdn7h2LiOhiQGgFIzBht97-pZTOTUtheupjAlAEP15nDIU8N-ETd8AG5ZKDupb1DDShYerqrYYfMweqU9WI/s1600/fig08-12.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="596" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzGGvqkTp9bPsLtaIGyharfNrloQgnfSKClYktYExlwAfbZrVoLAeS9b-YDdn7h2LiOhiQGgFIzBht97-pZTOTUtheupjAlAEP15nDIU8N-ETd8AG5ZKDupb1DDShYerqrYYfMweqU9WI/s640/fig08-12.jpg" width="640" /></a></div>
<div style="text-align: center;">
図8-12</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhABc8hYnh9pCsEY3S4GUZvUvtIIXdTl4eEvwG5oMHU1gUNEOP1y6JFckPWLvgAH3l00mZugO79b24sOPOeXl0kh3fMgmWTsxUmSGhlHbA4ijjhnhSysJObPbCh-Mszk72S_FaZzIQv1DE/s1600/fig08-16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="515" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhABc8hYnh9pCsEY3S4GUZvUvtIIXdTl4eEvwG5oMHU1gUNEOP1y6JFckPWLvgAH3l00mZugO79b24sOPOeXl0kh3fMgmWTsxUmSGhlHbA4ijjhnhSysJObPbCh-Mszk72S_FaZzIQv1DE/s640/fig08-16.jpg" width="640" /></a></div>
<div style="text-align: center;">
図8-16</div>
<br />
<h4>
p.280:ここまでの演習でハードウェア PWM 信号を出力するために pigpio を用いた方への注意</h4>
ここまでの演習で、「<a href="https://raspibb1a.blogspot.jp/" target="_blank">ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」で用いた pigpio でハードウェア PWM 信号を出力した方もいると思いますが、8章では pigpio は用いません。すなわち、service コマンドによる pigpiod の起動は不要ということです。なぜなら、8章ではハードウェア PWM 信号の出力を行うのはサーボドライバーであり Raspberry Pi ではないため、pigpio は必要ではないのです。
<br /><br />
<h4>
p.296:6脚ロボットの安定性について</h4>
ハンチング対策の解説において、サーボモーターSG90に与える電圧(乾電池の本数)によって6脚ロボットの挙動が異なることに触れました。サーボモーターの個体差などにもよりますが、6脚ロボットのモーターに与える電圧が大きく、その結果流れる電流が大きくなるとSG90の挙動が不安定になることがありました。<br />
具体的には「モーターの角度が指定していない角度に動き、そこでロックしてしまう」という現象が起きました。もし、同様の現象に悩まされている方は、以下に記す解消方法を試してみて下さい。なお、書籍の中でサーボドライバの類似品は「Adafruitのものと挙動が異なる場合がある」と記しましたが、類似品の中にはこの「指定していない角度でモーターがロック」という現象が起こりやすいものもあり、そのため、類似品はサポート対象外としました。<br />
<br />
<b>対策1:モーターに与える電圧を小さくする</b><br />
モーターに与える電圧を小さくすると、6脚ロボットが安定する傾向があります。簡単にこれを実現するは、乾電池1本の電圧(約1.5V)とエネループなどのニッケル水素充電池の電圧(約1.2V)が異なることを利用するのが簡単です。以下の様な電圧を簡単に作ることができます。<br />
<ul>
<li>約4.5V:乾電池3本</li>
<li>約3.6V:エネループなどのニッケル水素充電池3本</li>
</ul>
もしエネループなどのニッケル水素充電池をお持ちの場合、試してみると良いかもしれません。ただし、乾電池や充電池2本まで電圧を下げると、6脚ロボットは動作しませんので注意してください。なお、乾電池とニッケル水素充電池を混ぜて用いるのはやめましょう。<br />
また、乾電池を用いるにせよ、充電池を用いるにせよ、新品の乾電池あるいは充電直後の充電池は、使っているうちに徐々に電圧が小さくなっていきます(参考:<a href="http://ctlg.panasonic.co.jp/sanyo/products/eneloop/support/faq/eneloop.html" target="_blank">Panasonic | エネループシリーズについて</a>)。そのため、使っているうちに6脚ロボットの安定性が徐々に変化することはあり得ます。<br />
<br />
<b>対策2:</b><b>ロボットの脚の振り幅を小さくする</b><br />
6脚ロボットを安定させるもう一つの方法は、脚の振り幅を小さくすることです。脚の振り幅が小さいということは、モーターの回転する角度が小さいということなので、モーターに流れる電流が小さくなり、その結果6脚ロボットが安定して動作する傾向があります。ただし、ロボットの動きはややゆっくりになります。下記のファイルを変更することで実現できます。<br />
カメラなし、ハードウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/03/script.py<br />
カメラなし、ソフトウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/04/script.py<br />
カメラあり、ハードウェアPWMの場合:/usr/share/webiopi/htdocs/bb2/05/script.py<br />
これらのファイルの中で、下記の部分を見つけます。
<br />
<pre class="prettyprint">LEG_F_R = NEUTRAL + 100
LEG_F_L = NEUTRAL - 100
LEG_B_R = NEUTRAL - 100
LEG_B_L = NEUTRAL + 100
</pre>
4つある数字の100が、脚の振り幅(モーターの動く角度)に対応する数値です。これを小さめの値、例えば下記のように60に変更します。
<br />
<pre class="prettyprint">LEG_F_R = NEUTRAL + 60
LEG_F_L = NEUTRAL - 60
LEG_B_R = NEUTRAL - 60
LEG_B_L = NEUTRAL + 60
</pre>
変更して保存した後はWebIOPiを再起動する必要があります。WebIOPiが自動起動する設定になっている場合、Raspberry Piを再起動してしまうのが簡単でしょう。<br />
<br />
<b>対策3:モーターに与える電圧を大きくする</b><br />
さらに、<a href="https://twitter.com/Syun_itiHonda/status/934984137093427200" target="_blank">Syun'iti Hondaさん</a>のように、
モーター用の電源を
「約4.5V:乾電池3本」
から
「約4.8V:エネループなどのニッケル水素充電池4本」
に変更すると安定したというご報告もあります。このあたりはサーボモーターの個体差や消耗具合に依存するのかもしれません。
この場合、電池4本用の電池ボックスとしては「<a href="https://akizukidenshi.com/catalog/g/g100311/" target="_blank">電池ボックス 単3×4本 リード線・フタ・スイッチ付</a>」などがあります。
<br />
<br />
<h4>
p.296:サーボモーターの消耗について</h4>
本書ではSG-90というサーボモーターで6脚ロボットを作成しました。一般的に、サーボモーターは長く使っていると作成当初から挙動が変わり、交換が必要になる場合があります。そういう意味で、サーボモーターは消耗品と考えた方がよいかもしれません。
<br />
私の場合、6脚ロボットを初めて作成してから書籍が出版されるまでの約8ヶ月の間に、1つのサーボモーターを交換しました。具体的には、機体を持ったまま脚を動かした際、1つの脚だけ他の脚に比べて動きが遅くなったため交換しました。
<br /><br />
<h4>
p.301: Python 3用smbusモジュールのインストール</h4>
現在のRaspbianでは、301ページで行うPython 3用smbusモジュールのインストール作業は不要です。
インストールコマンドを実行しても「すでに最新バージョンです」などと表示されるだけで悪影響はありません。
<br />
<br />
<h4>
p.308: LCDへのIPアドレスの表示について(1)</h4>
本書では、Raspberry Piにブラウザからアクセスする際にIPアドレスを用いました。そのため、Raspberry Piにルーターなどから割り振られたIPアドレスを知る目的で、LCDを回路に取り付けました。<br />
<br />
しかし、本ページ下部の「p.335:IPアドレスでのURLの指定について」で記しますように、avahiという仕組みを用いると、IPアドレスではなく、下記のようなアドレスでのアクセスが可能になるのでした(ただし、p.335の注釈に示すように制限がありますので注意)。<br />
<ul>
<li>http://raspberrypi.local:8000/bb2/03/</li>
</ul>
これを用いると、回路からLCDが不要になるなどのメリットがあります。具体的には下記の通りです。
<br />
<ul>
<li>p.309の図8-13やp.310の図8-14からLCDを取り外して良い</li>
<li>p.310での/etc/rc.localへの「python3 /home/pi/bb2-08-04-lcd.py $_IP &」の記述が不要</li>
</ul>
さらに、Raspberry PiのIPアドレスを固定する、という方法でも、毎回IPアドレスを調べる必要がなくなりますね。こちらについては前著サポートページ内の「<a href="https://raspibb1.blogspot.com/2019/01/raspberry-piip.html" target="_blank">Raspberry PiのIPアドレスを固定する</a>」にまとめましたので、興味のある方は御覧ください<br />
<br />
4章の補足で述べたように、LCDにはロットの問題によるトラブルが発生しているので、この方法を用いてLCDなしの回路とする方が良いかもしれませんね。
<br />
<h4>
p.308:LCDへのIPアドレスの表示について(2)</h4>
6脚ロボットを制御するRaspberry PiのIPアドレスを知るため、LCDにIPアドレスを表示する方法を紹介しました。このとき、IPアドレスの取得に時間がかかるとIPアドレスではなく「Raspberry Pi」とLCDに表示されてしまいます。その様な場合、/etc/rc.localの適切な位置に「10秒待つ」ことを意味する「sleep 10」という命令を記述して対処する方法を紹介しました。<br />
<br />
それでIPアドレスが表示できるようになれば問題ありませんが、現在のRaspbianでは別の方法もありますのでそれを紹介します。<br />
<br />
現在のRaspbianの設定アプリケーションでは、下図(左)のように「Network at Boot」という項目があります。この「Wait for network」にチェックを入れて再起動すると、Raspberry Piのネットワークへの接続が完了してから起動が完了するようになります。その結果、「sleep 10」の記述なしでLCDにIPアドレスが表示されるようになる、というわけです。下図(右)のように以前からの設定アプリケーションraspi-configにも「Wait for Network at Boot」という項目が追加されており、「Slow Wait for network connection before completing boot」を選択することで、同様の効果が得られます。<br />
<br />
もしこの設定をしてもIPアドレスではなく「Raspberry Pi」とLCDに表示される場合、書籍に書かれているように/etc/rc.localの適切な位置に「sleep 10」と記述する方法を試してみるとよいでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4on0l5CgmnO3y_oEt5Y38u19yiY0uKBl-CRf7qo6UFinxgQiWAT-Ib4zd2d3I2dbWj9lDDdLsnx3dkuqx0sHgkazaOlK4krrBxaR7Zrg2-_uEJ3oogKjMTcVj7_p-pR1ZkfIIg7hQqIU/s1600/NetworkAtBootAll.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4on0l5CgmnO3y_oEt5Y38u19yiY0uKBl-CRf7qo6UFinxgQiWAT-Ib4zd2d3I2dbWj9lDDdLsnx3dkuqx0sHgkazaOlK4krrBxaR7Zrg2-_uEJ3oogKjMTcVj7_p-pR1ZkfIIg7hQqIU/s640/NetworkAtBootAll.png" width="640" /></a></div>
<br />
<h4>
p.311:IPアドレスをLCDに表示するプログラムを自動起動するための記述</h4>
IPアドレスをLCDに表示するプログラムを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
<br />
<pre class="prettyprint">python3 /home/pi/bb2-08-04-lcd.py $_IP
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-08-04-lcd.py $_IP」となる、ということです。
<br /><br />
また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
<br />
<pre class="prettyprint">python3 /home/pi/bluebacks/bb2-08-04-lcd.py $_IP
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.314:シャットダウン用プログラムを自動起動するための記述</h4>
シャットダウン用プログラムを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
<br />
<pre class="prettyprint">python3 /home/pi/bb2-08-05-shutdown.py &
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/bb2-08-05-shutdown.py &」となる、ということです。
<br /><br />
また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
<br />
<pre class="prettyprint">python3 /home/pi/bluebacks/bb2-08-05-shutdown.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.316:6脚ロボットに搭載したままRaspberry Piを用いる</h4>
6脚ロボットの演習中、トラブルなどでファイルを変更したくなることはあるものです。
そのような場合、Raspberry Piにもう一度ディスプレイ、キーボード、マウスを接続して変更することになりますが、やや面倒な操作になりますよね。
<br />
<br />
また、6脚ロボットの演習が終わった後、6脚ロボットに搭載したままRaspberry Piを使いたいという方もいるでしょう。
<br />
<br />
そこで、6脚ロボットに搭載したままRaspberry Piを使用する方法を2種類紹介します。どちらも、本書の入門編である「カラー図解 最新 Raspberry Piで学ぶ電子工作」の補足ページになっています。
<br />
<ul>
<li><a href="https://raspibb1.blogspot.com/2019/01/raspberry-pi1vnc.html" target="_blank">ディスプレイ・マウス・キーボードを接続せずにRaspberry Piを利用する(1)~VNC編</a></li>
<li><a href="https://raspibb1.blogspot.com/2019/01/raspberry-pi2ssh.html" target="_blank">ディスプレイ・マウス・キーボードを接続せずにRaspberry Piを利用する(2)~SSH編</a></li>
</ul>
ややハードルが高いかもしれませんが、どちらも身につける価値はある方法です。
<br />
<br />
<h4>
p.318:mjpg-streamerを自動起動するための記述</h4>
mjpg-streamerをを自動起動するために/etc/rc.localに記述する命令は下記の通りです。コピーなどしてご活用ください。
<br />
<pre class="prettyprint">sh /home/pi/bb2-06-03-stream.sh
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「sh /home/kanamaru/bb2-06-03-stream.sh」となる、ということです。
<br /><br />
また、サンプルをbluebacksフォルダに展開した場合は下記のコマンドに変更されるのでしたね。
<br />
<pre class="prettyprint">sh /home/pi/bluebacks/bb2-06-03-stream.sh
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.319:mjpg-streamerの映像が表示されない場合のチェック項目</h4>
mjpg-streamerによる映像が表示されない場合、下記をチェックしましょう。
<br />
<ol>
<li>カメラの接続は正しいか(金属が露出した端子面がmicroSDカード側)(→6.1.1で解説)</li>
<li>メニューから「設定」→「Raspberry Piの設定」→「インターフェイス」→「カメラ」が「有効」になっているか(→6.4で解説)</li>
<li>mjpg-streamerのインストールが適切か(→本ページの「p.222:長いコマンドの入力には注意」)</li>
<li>mjpg-steamerの起動命令が適切か(→本ページの「p.318:mjpg-streamerを自動起動するための記述」)</li>
</ol>
それ以外には「IPアドレスは正しいか」や「アドレスの末尾に『/』(スラッシュ)をつけているか」もチェックしてください。これらは、WebIOPiを用いた他の演習と同じですね。
<br />
<br />
<h3>
付録A</h3>
<h4>
p.325 圧縮されたサンプルファイルの展開に関する注意</h4>
NOOBS 3.1.1 (Raspbian 2019-06-20) 以降では、圧縮ファイルを展開するためのソフトウェアのデフォルトの設定が変化しましたので利用の際は注意が必要です。
<br />
下図(左)のように、展開先のデフォルトが「/tmp」とされ、また、展開時に自動的にフォルダが作られるようになっています。
<br />
これを、下図(右)のように
<br />
<ul>
<li>展開先に「 /home/pi 」または「 /home/pi/bluebacks 」と記入。ただし、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されていますので、この記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「 /home/kanamaru 」や「 /home/kanamaru/bluebacks 」となる、ということです。</li>
<li>「Ensure a containing directory」のチェックを外す</li>
</ul>
の2点を行ってから「展開」ボタンを押すようにしましょう。展開先に記す文字は、このページからコピー (Ctrl-c) して貼り付ける (Ctrl-v) と安心です。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNX52iZ2jf80kak9MZys3NySx2Q8zMRVE-tPJWGRUfQYT4sa5hUNUxhN07GijvS_T-8ldqQ58sCuTcBvNtu4WfRKVwd-ALkes0LLRgBQuLmdHAyhqEiuBcELYURXjR7hlaUbYFTPSG0Gw/s1600/archiver_all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="457" data-original-width="725" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNX52iZ2jf80kak9MZys3NySx2Q8zMRVE-tPJWGRUfQYT4sa5hUNUxhN07GijvS_T-8ldqQ58sCuTcBvNtu4WfRKVwd-ALkes0LLRgBQuLmdHAyhqEiuBcELYURXjR7hlaUbYFTPSG0Gw/s640/archiver_all.png" width="640" /></a></div>
<br />
<br />
<h3>
付録B</h3>
<h4>
p.329:WebIOPiのダウンロードとインストール</h4>
書籍では、WebIOPiのダウンロードをブラウザから行いましたが、以下で紹介する方法では、ダウンロード・展開・インストールを全てコマンドから行います。
<br />
<br />
ターミナルを起動し、以下のコマンドを一つずつ順に実行してください。WebIOPiのダウンロード・展開・インストールが行われます。ブラウザからコマンドを一つずつコピーし、ターミナルへ貼り付けて実行するのが確実でしょう。
<br />
<br />
コピーはブラウザ上でキーボードで「Ctrl+c」、貼り付けはLXTerminalのメニューから「編集」→「貼り付け」(またはCtrl+Shift+v)です。なお、行頭の「(1)」などの数字はコピーする必要はありませんのでご注意ください。
<br />
<pre class="prettyprint">(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
</pre>
「Do you want to access WebIOPi over Internet ? [y/n]」という質問が出た場合は、キーボードの n をタイプして Enter するのでした(現在はこの質問は出ません)。<br />
<br />
そして、引き続きp.331のコマンドを実行し、起動用ファイルを適切な位置に配置します。このコマンドもやや長いので、コピーできる形式で再掲します。<br />
<pre class="prettyprint">(1) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi.service
(2) sudo mv webiopi.service /etc/systemd/system/
</pre>
なお、上記の手順でWebIOPiをインストールしてもp.338の図B-3において「IN/OUT等が現れるはずのボタンに文字が現れず灰色のまま」という場合、まずはWebIOPiの再インストールを試してみましょう。そのためには、ターミナルを起動して下記の2つのコマンドで一つずつ実行し、過去のインストールファイルを一旦削除します。
<br />
<pre class="prettyprint">$ sudo rm -f WebIOPi-0.7.1.tar.gz
$ sudo rm -rf WebIOPi-0.7.1
</pre>
その後、もう一度上記のコマンドでWebIOPiをインストールします。
<br />
<br />
それでも症状が改善されない場合、原因はわかりませんが、OSであるRaspbianが壊れているという可能性もないとは言えません。余力があればOSを再インストールしてみることも検討してみると良いでしょう(私自身、OSの再インストールが必要だったことはないのですが、読者の方にはそれで改善したという方が複数名いらっしゃるようです)。
<br />
<br />
<h4>
p.332:WebIOPiについての各種コマンド</h4>
WebIOPiの起動/停止、自動起動/自動起動の停止、などのコマンドを以下に記します。コピーするなどしてご活用ください。
<br />
<br />
WebIOPiの起動コマンド
<br />
<pre class="prettyprint">sudo service webiopi start
</pre>
WebIOPiの停止コマンド
<br />
<pre class="prettyprint">sudo service webiopi stop
</pre>
WebIOPiが動作確認しているか確認するコマンド
<br />
<pre class="prettyprint">ps ax |grep webiopi
</pre>
WebIOPiの自動起動
<br />
<pre class="prettyprint">sudo systemctl enable webiopi
</pre>
WebIOPiの自動起動の停止
<br />
<pre class="prettyprint">sudo systemctl disable webiopi
</pre>
<br />
<h4>
p.335:IPアドレスでのURLの指定について</h4>
本書では、ブラウザからRaspberry Piにアクセスする際に、ルーターなどからRaspberry Piに割り振られたIPアドレスを用いました。すなわち、IPアドレスが192.168.1.3の場合にブラウザから例えば下記のようにアクセスしました。
<br />
<ul>
<li>http://192.168.1.3:8000/bb2/01/</li>
</ul>
しかし、この方法はifconfigコマンドなどで事前にIPアドレスを調べておく必要があり、やや面倒でした。<br />
<br />
現在のRaspbianでは、IPアドレスを用いずにRaspberry Piにアクセスできますのでその方法を紹介します。なお、この方法でRaspberry Piにアクセスできるのは下記のみです。<br />
<ul>
<li>iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです。ただし、Windows 10にApril 2018 Updateを適用すると、この方法が一時的に使えなくなります。WindowsからiTunesとBonjourを一旦削除してからiTunesをインストールしなおすとまた使えるようになるようです)</li>
<li>Mac OS X</li>
<li>iPhoneやiPad</li>
</ul>
Androidスマートフォンでは現時点ではこの方法ではRasbperry Piにはアクセスできないように思われます。<br />
<br />
上記の条件が満たされれば方法は簡単で、ブラウザのアドレス欄に例えば下記のように入力すればOKです。
<br />
<ul>
<li>http://raspberrypi.local:8000/bb2/01/</li>
</ul>
すなわち、IPアドレス「192.168.1.3」などの代わりに「raspberrypi.local」という記法が使える、というわけです。これは、Jessie上で動作しているavahiというソフトウェアの働きによります。<br />
<br />
なお、Jessie以前のWheezyで同じことを実現したい場合、LXTerminalを起動して下記のようにavahi-daemonをインストールする必要があります。
<br />
<ul>
<li>sudo apt update</li>
<li>sudo apt install avahi-daemon</li>
</ul>
インストール後に再起動すると、自動的にavahiが起動し、「raspberrypi.local」でのアクセスが可能になります。<br />
<br />
なお、同じネットワーク内でavahiが起動したRaspberry Piが2台以上あると、同じ名前「raspberrypi」のマシンが2つ以上ある状態になり、名前の衝突が起こります。その場合、2台目以降のRaspberry Piには「raspberrypi-2.local」などの名前が自動的につけられますのでご注意ください。名前が衝突しないよう、あらかじめ「raspberrypi」というマシン名を変更しておく方法もありますが、ここでは省略します。<br />
<br />
<h4>
p.339:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー</h4>
339ページでは、本書のサンプルファイルを/usr/share/webiopi/htdocsディレクトリへコピーするという作業を行います。
この作業は重要であり、これに失敗すると、以後の演習が期待通りに動作しません。そこで、コピーして利用できるよう、
そのコマンドをここに再掲します。
ターミナルソフトウェアLXTerminalを起動して、下記の2コマンドを一つずつ順に実行してください。
<br />
<pre class="prettyprint">sudo chown -R $USER /usr/share/webiopi/htdocs
cp -r bb2 /usr/share/webiopi/htdocs
</pre>
なお、本書のサンプルファイルをbluebacksディレクトリに展開した方は、上記2コマンド実行の前に「cd bluebacks」コマンドを実行して
bluebacksディレクトリに入り、その後2コマンドを実行するようにしてください。
<br />
<br />
<h4>
p.341:/etc/webiopi/config の myscript行</h4>
WebIOPiを用いる演習では、設定ファイル /etc/webiopi/config の[SCRIPT]セクションに、Pythonスクリプトの場所を示す行を記す必要があります。
記述に間違いがあるとWebIOPiが起動しませんので、コピーできるように正しい記述の例を以下に記しておきます。「01」の部分を演習によって変更する必要があります。
<br />
<pre class="prettyprint">myscript = /usr/share/webiopi/htdocs/bb2/01/script.py
</pre>
なお、この行を記述した後に WebIOPi が起動しなくなった場合、行の記述し間違い以外には、
<ul>
<li>サンプルファイルを /usr/share/webiopi/htdocs ディレクトリにコピーしていない
</ul>
という原因もありえます。その場合、本ページ上部の「p.339:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー」を参照してください。
<br /><br />
<h4>
p.343:コマンドでのプログラムの実行について</h4>
p.343にて、本書のプログラムをターミナルでコマンドで実行する方法が記されています。本ページは、すべてのプログラムを python3 で実行するよう方針を変更しましたので、プログラムの実行例は
<pre class="prettyprint">
python3 bb2-02-01-led.py
</pre>
となります。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com8tag:blogger.com,1999:blog-1299465193942557222.post-23576233461336933412023-03-29T20:43:00.007+09:002024-01-06T23:00:44.229+09:00本書の演習を picamera2 (libcamera) で実行する方法
<h3>1. はじめに</h3>
Raspberry Pi OS 2023-10-10 からはじまったバージョン Bookworm および <br />
Raspberry Pi OS 2021-10-30 からはじまったバージョン Bullseye では<br />
カメラモジュールの利用方法に大きな変更が加えられ、libcamera というライブラリを用いるようになりました。
これは、本書でカメラを用いるプログラムがそのままでは動かなくなる、ということを意味します。
<br /><br />
ただし、Bullseye では「Legacy Camera」という、これまでと互換性のあるカメラの利用方法が可能になっています。この Lecgacy Camera を用いれば本書でカメラを用いるプログラムはそのまま動作しますが、
残念ながら Bookworm では Legacy Camera モードは削除されてしまいました。
<br /><br />
そこで、本ページでは、Legacy Camera に頼らずに最新の OS で本書の演習を実行する方法を解説します。具体的には、libcamera ライブラリを利用する Python モジュールである picamera2 を使ってプログラムを実行します。
<br /><br />
本書のサンプルプログラムは picamera の旧バージョンを使って書かれていました。しかし、picamera2 は picamera とは互換性がありませんので、picamera2 用に書き換えられたプログラムをダウンロードして利用することになります。
<br /><br />
<h3>2. 準備</h3>
サポート環境は Bookworm および Bullseye 以の 32-bit または 64-bit 版の Raspberry Pi OS です。Bullseye の場合は、なるべく新しいバージョンを用いましょう。そうしないと、本ページで利用する picamera2 (python3-picamera2) がインストールされていないことがあるからです。
<br /><br />
また、Bullseye の場合、Legacy Camera モードは無効にしておく必要があります。OS インストール直後の状態ではあらかじめ無効になっています。一度有効にしてしまった方は、
ターミナルを開いて以下の手順に従うことで、raspi-config により Legacy Camera モードを無効にしましょう。
<ol>
<li>「 sudo raspi-config 」を実行することで raspi-config を起動</li>
<li>キーボードの「↓」キーを2回押し、「Interface Options」を選択してから「Enter」キーを押す</li>
<li>「I1 Legacy Camera Enable/Disable」があらかじめ選択されているので、「Enter」キーを押す</li>
<li>「Would you like to enable legacy camera support?」と聞かれるので「→」キーで「いいえ」が選択された状態にし、「Enter」キーを押す</li>
<li>「Legacy camera support is disabled」と表示されるので、「了解」が選択された状態で「Enter」キーを押す</li>
<li>raspi-configを起動した状態の画面に戻るので、「TAB」キーを二回クリックし、「Finish」を選択した状態で「Enter」キーを押す</li>
<li>再起動を促されるので、「はい」が選択された状態で「Enter」キーを押す</li>
</ol>
以上で、Legacy Camera モードが無効になります。
<br /><br />
次に、お使いのカメラモジュールのバージョンを把握してください。2023年3月現在、Raspberry Pi のカメラモジュールにはバージョン1から3があり、下図のような外観をしています。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfitihiOnPWB61L22aRcgRCek1C2w7_uWlkTXBG56jR5pWC5f-p1uyCe4yg9yKWyQKQnxEO3X--h1JOWA8bbs0gx4SsnZKvV_pdiORrblbVwLIXrhz9OCrrGCFocExie8pAGHrrMov7BYyD9slKJc8ljDSHGfZQVeTeNl1L2cerzgnTt1n-W9rUlBZ/s1280/cm123.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="513" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfitihiOnPWB61L22aRcgRCek1C2w7_uWlkTXBG56jR5pWC5f-p1uyCe4yg9yKWyQKQnxEO3X--h1JOWA8bbs0gx4SsnZKvV_pdiORrblbVwLIXrhz9OCrrGCFocExie8pAGHrrMov7BYyD9slKJc8ljDSHGfZQVeTeNl1L2cerzgnTt1n-W9rUlBZ/s600/cm123.jpg"/></a></div>
左から、バージョン1(基板が四角)、バージョン2(基板の角が丸く、レンズ周辺が黒)、バージョン3(基板の角が丸く、レンズ周辺が銀)です。基板上にもバージョンの記載がありますね。
<br /><br />
後でダウンロードして頂くプログラムでは、このカメラモジュールのバージョンにより設定が変わる箇所があります。
<br /><br />
<h3>3. ダウンロードと準備</h3>
それでは、picamera2 を利用するプログラムをダウンロードしましょう。
<br /><br />
ターミナルを開き、本書のサンプルファイル(「bb2-」で始まるファイル)が存在するディレクトリに移動してください。
サンプルファイルをホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
<br />
<pre class="prettyprint">cd bluebacks
</pre>
次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
<br />
<pre class="prettyprint">wget https://github.com/neuralassembly/raspi/raw/master/raspi2-picamera2.zip
unzip raspi2-picamera2.zip
rm raspi2-picamera2.zip
</pre>
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。Pythonpプログラムのファイル名末尾に全て「-picamera2.py」がついていることに注意してください。
<pre class="prettyprint">bb2-06-03-stream-libcamera.sh
bb2-07-01-preview-picamera2.py
bb2-07-02-binary-picamera2.py
bb2-07-03-cannyedge-picamera2.py
bb2-07-04-circle-picamera2.py
bb2-07-05-face-picamera2.py
bb2-07-06-tracking-circle-picamera2.py
bb2-07-07-tracking-face-picamera2.py
bb2-07-08-tracking-circle-pca9685-picamera2.py
bb2-07-09-tracking-face-pca9685-picamera2.py
</pre>
以下では、これらのファイルの使い方を解説していきます。
<br /><br />
<h3>4. 実行方法</h3>
さて、ダウンロードして展開したファイルの使い方を解説していきます。
<br /><br />
<h4>p.211 raspivid の代替</h4>
本書 p.211 では映像を映すために raspivid というアプリケーションを使っています。このアプリケーションは既に動作しませんので、下記のようにターミナルで libcamera-hello を実行するのが良いでしょう。
<pre class="prettyprint">libcamera-hello -t 0
</pre>
libcamera-hello が存在しないと言われた場合、下記のコマンドでインストールできます。
<pre class="prettyprint">sudo apt update
sudo apt install libcamera-apps
</pre>
なお、libcamera-hello ではなく、以下で使い方を示す bb2-07-01-preview-picamera2.py を実行しても良いです。
<br /><br />
<h4>p.213 mjpg-streamer の代替</h4>
映像配信用に、mjpg-streamer をインストールして用いますが、これも libcamera に対応したバージョンをインストールする必要があります。
<br /><br />
libcamera 対応の mjpg-streamer は <a href="https://github.com/ArduCAM/mjpg-streamer" target="_blank">ArduCAM さんが公開</a>していますが、これをこのまま用いると、
本書のように低解像度 (640x480) の映像を指定したときに以下の問題が現れます。
<ul>
<li>映像の画質が非常に悪い (カメラモジュール v.1) </li>
<li>映像の範囲が非常に狭い (カメラモジュール v.2 と 3) </li>
</ul>
この問題を<a href="https://github.com/neuralpi/mjpg-streamer" target="_blank">筆者が独自に修整した版</a>をここでは利用することにします。
<br /><br />
まず、これまでダウンロードまたはインストールした mjpg-streamer を削除するため、ターミナルを起動して以下のコマンドを実行しましょう。
<pre class="prettyprint">sudo rm -rf mjpg-streamer /opt/mjpg-streamer
</pre>
そして、以下の手順で修整済の libcamera 対応 mjpg-streamer をインストールしましょう。
<pre class="prettyprint">(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
</pre>
なお、OS として Bullseye やリリース直後の Bookworm をお使いの方は、上記の (5) で LibCamera.cpp のビルド中にエラーが起こると思います。その場合、エラーが出た状態から以下の 8 コマンドを一つずつ順に実行してください。この 8 コマンドが上記 (5)~(7) の代替、というイメージです。
<pre class="prettyprint">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
</pre>
インストール後は、上で展開して得られたシェルスクリプト bb2-06-03-stream-libcamera.sh を実行することで mjpg-streamer を起動しますが、
実行前に一つ注意があります。
bb2-06-03-stream-libcamera.sh をテキストディタで開くと以下のような箇所があります。
<pre class="prettyprint"> LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_libcamera.so -camver 1 -fps 15 -r 640x480 -s 640x480" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" > /dev/null 2>&1&
</pre>
このうち
<pre class="prettyprint">-camver 1
</pre>
の部分が、筆者が修整した部分に関連しており、カメラモジュールのバージョンの数字を指定しています。お使いのカメラモジュールがバージョン 2 か 3 なら、この数字を 2 または 3 に変更し、それからファイルを保存してください。
なお、この数値を 0 にするかあるいは -camver の設定自体を削除すると ArduCAM さんの mjpg-streamer と同じ挙動になります。
<br /><br />
保存が済んだら、コマンド
<pre class="prettyprint">sh bb2-06-03-stream-libcamera.sh
</pre>
を実行することで mjpg-streamer が起動されます。
<br /><br />
<h4>7章以降</h4>
7章では OpenCV を使う画像処理プログラムを実行します。OpenCV は下記のコマンドでインストールします。
<pre class="prettyprint">sudo apt update
sudo apt install python3-opencv libopencv-dev
</pre>
プログラムを実行する際は、「-picamera2」がついたファイルを実行するようにしてください。
例えば、書籍でサンプルファイル「bb2-07-01-preview.py」を実行する箇所があります。その場合、「bb2-07-01-preview.py」ではなく「bb2-07-01-preview-picamera2.py」を実行するようにする、ということです。
<br /><br />
7章の各プログラムの実行コマンドを以下に列挙しますので、必要に応じてコピーなどしてご活用ください。
<pre class="prettyprint">python3 bb2-07-01-preview-picamera2.py
python3 bb2-07-02-binary-picamera2.py
python3 bb2-07-03-cannyedge-picamera2.py
python3 bb2-07-04-circle-picamera2.py
python3 bb2-07-05-face-picamera2.py
python3 bb2-07-06-tracking-circle-picamera2.py
python3 bb2-07-07-tracking-face-picamera2.py
python3 bb2-07-08-tracking-circle-pca9685-picamera2.py
python3 bb2-07-09-tracking-face-pca9685-picamera2.py
</pre>
なお、libcamera.so.0.X.X のバージョンに関するエラーが出た場合、下記のコマンドで libcamera-dev と python3-picamera2 を更新すると良いかもしれません。
<pre class="prettyprint">sudo apt update
sudo apt install libcamera-dev python3-picamera2
</pre>
以上、お疲れさまでした。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-29902067783487577422021-11-28T13:59:00.001+09:002022-02-16T14:58:58.416+09:00本書の演習をウェブカメラで実行する方法<h4>
1. はじめに</h4>
本書では、Raspberry Piの公式カメラモジュールを用いた電子工作の例をいくつか紹介しました。
第6章のカメラ台、第7章の画像処理、第8章の六脚ロボットへのカメラの搭載などです。
<br />
<br />
本ページでは、カメラモジュールではなく市販のウェブカメラで演習を行う方法を紹介します。こちらで動作検証したカメラは<a href="https://www.logicool.co.jp/ja-jp/video/webcams" target="_blank">ロジクール社のC270およびC920</a>です。<br />
<br />
本ページでは「××社の○○と言うカメラで動くか」という質問や「××社の○○と言うカメラで動くようにして欲しい」という要望には応えることができません。<br />
<br />
カメラが異なることによるそのようなトラブルを避けるために、本書ではRaspberry Pi専用のカメラモジュールを使用する方針としたのだったからです。
本ページは上級者向けのサービスという位置づけとしますのでご理解ください。<br />
<br />
ところで、2022年2月、Raspberry Pi OS Bullseye の 64-bit 版が正式にリリースされました。この 64-bit 版 OS では、本書でこれまで用いていたカメラモジュールを用いるプログラムをそのまま利用することができません。カメラモジュールの利用法が大きく変わったためです(32-bit 版 OS ではこれまでどおり利用可能)。
本ページの「本書の演習をウェブカメラで実行する方法」を用いると、「64-bit 版 OS でカメラモジュールを用いた演習」が可能になる、という副作用があります。ただし、この方法は準備がやや面倒ですので、カメラモジュールを用いた演習を行いたい方はこれまで通り 32-bit 版 OS の利用をお勧めします。
<br />
<br />
<h4>
2. 手順</h4>
それではターミナルアプリケーションLXTerminalを開き、本書のサンプルファイル(「bb2-」で始まるファイル)が存在するディレクトリに移動してください。
サンプルファイルをユーザーpiのホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
<br />
<pre class="prettyprint">cd bluebacks
</pre>
次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
<br />
<pre class="prettyprint">wget https://github.com/neuralassembly/raspi/raw/master/raspi2-webcam.zip
unzip raspi2-webcam.zip
rm raspi2-webcam.zip
</pre>
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。ファイル名の末尾付近に全て「-webcam」がついていることに注意してください。
<br />
<pre class="prettyprint">bb2-06-03-stream-webcam.sh
bb2-07-01-preview-webcam.py
bb2-07-02-binary-webcam.py
bb2-07-03-cannyedge-webcam.py
bb2-07-04-circle-webcam.py
bb2-07-05-face-webcam.py
bb2-07-06-tracking-circle-webcam.py
bb2-07-07-tracking-face-webcam.py
bb2-07-08-tracking-circle-pca9685-webcam.py
bb2-07-09-tracking-face-pca9685-webcam.py
</pre>
あとは、以下に従って実行します。
<br />
<br />
<h4>
3. 実行</h4>
実行に関する注意を、いくつか例を挙げながら解説します。
例えば、本書 p.224 に、下記のコマンドを実行するよう指示があります。
<pre class="prettyprint">sh bb2-06-03-stream.sh
</pre>
このファイル「bb2-06-03-stream.sh」に対しては、ウェブカメラ対応の代替ファイル「bb2-06-03-stream-webcam.sh」が存在します。
そのような場合、上記コマンドの代わりに下記のコマンドを実行して欲しい、ということです。
<pre class="prettyprint">sh bb2-06-03-stream-webcam.sh
</pre>
同様に、p.239 には下記のコマンドを実行するよう指示があります(Python3 用のコマンドに変更してあります)。
<pre class="prettyprint">python3 bb2-07-01-preview.py
</pre>
このファイル「bb2-07-01-preview.py」に対しては、ウェブカメラ対応の代替ファイル「bb2-07-01-preview-webcam.py」が存在します。
そのような場合、上記コマンドの代わりに下記のコマンドを実行して欲しい、ということです。
<pre class="prettyprint">python3 bb2-07-01-preview-webcam.py
</pre>
以上のように、実行するファイルを書籍から読み替える形でコマンドを実行してください。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-12548598037944479922021-11-28T12:27:00.234+09:002021-11-30T16:30:30.915+09:00OpenWeatherの天気予報データをLCDに表示する<h3>0. はじめに</h3>
本書第4章では、「お天気Webサービス」の天気予報データをインターネット経由で取得し、それをLCDに表示するという演習を行いました。
<br />
しかし、「お天気Webサービス」は2020年7月でサービスを終了したらしく、その演習プログラムはそのままでは実行できなくなっています。
<br /><br />
そこで、その代替として、<a href="https://openweathermap.org/" target="_blank">OpenWeather</a> というサイトから天気予報データを取得し、それをLCDに表示するプログラムを作成しました。<br />
「お天気Webサービス」と比べると、「サイトにアカウントを作成し、APIキーを取得する」というひと手間が必要なところがやや面倒ですが、その点をクリアできれば、本書と (ほぼ) 同等の内容を実現できます。
<br /><br />
<a href="https://openweathermap.org/full-price#current" tartget="_blank">OpenWeather の料金体系</a>を見ると、無料枠から課金枠まで、様々な利用方法が提供されていることが分かります。
本ページでは、無料 (Free) の One Call API を利用します。一日1,000 呼び出し、一か月30,000呼び出しが可能であることが記されています。
<br /><br />
以下、本ページではその利用方法を紹介します。
<br /><br />
<h3>1. OpenWeather でのアカウントの作成とAPIキーの取得</h3>
<a href="https://openweathermap.org/" target="_blank">OpenWeather</a> の天気予報データを利用するには、まずサイトでアカウントを作成しなければなりません。その手順を簡単に解説します。
<ol>
<li><a href="https://home.openweathermap.org/users/sign_up" target="_blank">OpenWeatherのアカウント作成ページ</a>で必要事項を記入ます。
<ul>
<li>Username: 英語サイトなので、アルファベットからなるユーザー名を入力するのが良いでしょう。アカウント作成後に変更できます。</li>
<li>email: アカウント作成時に確認メールが届きますので、正確に入力してください。</li>
<li>Password / Repeat Password: パスワードを二回入力します。</li>
<li>I am 16 years old and over (16歳以上) の条件を満たしていればチェック</li>
<li>I agree with Privacy Policy ... 使用条件などをを理解したらチェック</li>
<li>System news, Product news, Corperate news はサイトからのメールを受け取りたければチェック</li>
<li>「私はロボットではありません」にチェック</li>
<li>以上を確認したら「Create Account」ボタンをクリック</li>
</ul>
</li>
<li>遷移先のページで、Company と Purposeを入力します。
<ul>
<li>Company は、個人ならば記入しなくて構いません</li>
<li>Purpose (使用目的) は、私の場合「Education/Science (教育と科学)」を選択しました</li>
<li>「Save」ボタンをクリック
</ul>
</li>
<li>以上が終わると、登録したメールにOpenWeather からメールが届きます。メールの中の「Verify your email」ボタンをクリックすると、登録完了です。</li>
</ol>
さて、以上が終わったあと、<a href="https://openweathermap.org/" target="_blank">OpenWeather</a> において、下図のように「ユーザー名」→「My API keys」と辿ると、API key を取得できます。
このAPI keyをコピーしてメモ帳などで保存しておきましょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3CNYlk0WfNbZwTnytm53K-EwJmN2HfjhlfSlv6VW9rncns_fHjtZz1CtJnOCJ-y5ojEBoZrrQaD9yOnt91jEEHZV_ngLxjIjG-xO0vcT6jlOlrh4ctC5axwqQNdf6tMBiwMjzcRRRMhs/s1013/show_apikey.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="360" data-original-width="1013" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3CNYlk0WfNbZwTnytm53K-EwJmN2HfjhlfSlv6VW9rncns_fHjtZz1CtJnOCJ-y5ojEBoZrrQaD9yOnt91jEEHZV_ngLxjIjG-xO0vcT6jlOlrh4ctC5axwqQNdf6tMBiwMjzcRRRMhs/s600/show_apikey.png"/></a></div>
なお、この API key は Raspberry Pi 上で用いるので、Raspberry Pi 上のブラウザでコピーし、Raspberry Pi 上のテキストエディタ Mousepad で保存するのが良いかもしれません。<br />
また、この API key は登録したメールアドレスにも届きますので、そちらからコピーしても良いでしょう。その中に「Within the next couple of hours, it will be activated and ready to use」とあるので、利用可能になるまで数時間かかることがあるのかもしれません。
私の場合、すぐに使えたように思うのですが、ちょっと自信がありません。
<br /><br />
<h3>2. OpenWeatherの天気予報データを利用するプログラムのダウンロードと準備</h3>
ここからは、OpenWeatherの天気予報データを利用するプログラムの利用方法を解説します。
これらのプログラムは、本書4章のプログラムの OpenWeather バージョン、ということができます。
<br /><br />
プログラムのダウンロードは Raspberry Pi 上で下記の2命令を実行することで行います。
命令はどこで実行しても構いませんが、本書のサンプルプログラムが存在する場所で実行すると、ファイルがまとまるので良いかもしれません。
<pre class="prettyprint">
https://raw.githubusercontent.com/neuralassembly/raspi/master/bb2-04-openweather.zip
unzip bb2-04-openweather.zip
</pre>
一つ目の命令で圧縮ファイルをダウンロードし、二つ目の命令で展開しています。
展開により現れるファイルは下記の5つです。
<ul>
<li>bb2-04-00-checkcity.py
</li>
<li>bb2-04-01-weather-ow.py
</li>
<li>bb2-04-02-forcast-ow.py
</li>
<li>bb2-04-04-lcd-4modes-ow.py
</li>
<li>bb2-04-05-lcd-3modes-ow.py
</li>
</ul>
最初の「bb2-04-00-checkcity.py」は、本書のサンプルプログラムには存在しなかったファイルです。
bb2-04-01~bb2-04-05 のファイルは本書のサンプルプログラムに同じ番号のものがありますが、
新しいファイルにはファイル名の末尾に「-ow」がついているので、区別することができます(OpenWeathterの略です)。
<br /><br />
これらのファイルを用いるには、上記5つのファイルに冒頭で入手した API key を記入して上書き保存しなければなりません。まずその解説を行います。
<br /><br />
これらの5つのファイルを mousepad のようなテキストエディタや、Thonny のような開発環境で開くと、どのファイルにも下記の行が見つかります(冒頭にスペースが入っている場合もあります)。
<pre class="prettyprint">
key = 'API_KEY'
</pre>
具体的には、5つのファイルの下記の行番号の位置に上の行があります。
<ul>
<li>bb2-04-00-checkcity.py: 5行目
</li>
<li>bb2-04-01-weather-ow.py: 7行目
</li>
<li>bb2-04-02-forcast-ow.py: 7行目
</li>
<li>bb2-04-04-lcd-4modes-ow.py: 100行目
</li>
<li>bb2-04-05-lcd-3modes-ow.py: 100行目
</li>
</ul>
この行の「API_KEY」の部分を、上でコピーして保存した皆さんの API key で書き換えます。
本当の API key を書くわけにはいかないので、イメージを記すと下記のようになります。
<pre class="prettyprint">
key = '................................'
</pre>
書き換えたら、ファイルを上書き保存してください。この作業を、5つのファイル全てで行います。
以上でプログラム実行前の準備は完了です。
<br /><br />
<h3>3. OpenWeatherの天気予報データを利用するプログラムの実行</h3>
ここからは、OpenWeatherの天気予報データを利用するプログラムの実行方法を解説します。
<br /><br />
本書に存在しないファイルである「bb2-04-00-checkcity.py」の利用法の解説のみ後まわしとし、残りの4ファイル
の解説を順に行います。
なお、デフォルトでは4ファイルは東京の天気を表示します。また、全てのファイルは Python3 でのみ動作します。
本書のサンプルファイルと異なり、Python2 のサポートを外しました。
<br /><br />
<h4>bb2-04-01-weather-ow.py の利用</h4>
Thonny で開いて実行するか、下記のコマンドで実行してください。
<pre class="prettyprint">
python3 bb2-04-01-weather-ow.py
</pre>
本書の図4-7のように、入手した天気予報データを全て表示するコマンドです。表示された中身を理解する必要はなく、
「天気予報データを入手できた」ということを確認できればそれで十分です。
<pre class="prettyprint">
(省略)
"weather": [
{
"id": 800,
"main": "Clear",
"description": "晴天",
"icon": "01d"
}
],
"clouds": 2,
"pop": 0,
"uvi": 3
}
]
}
</pre>
なお、取得されるデータは本書の図4-7の形式とは全く異なります。予報のデータは上の「"main": "Clear",」の部分を使っており、「"description": "晴天",」の部分は使っていません。
最終的に LCD に表示するうえで、"description" の部分はバリエーションが多すぎると思えたためです。
<br /><br />
<h4>bb2-04-02-forcast-ow.py の利用</h4>
Thonny で開いて実行するか、下記のコマンドで実行してください。
<pre class="prettyprint">
python3 bb2-04-02-forcast-ow.py
</pre>
本書の図4-8のように、3日間の予報のみをデータを整理して表示します。
<pre class="prettyprint">
今日, 雨, 9/17
明日, 雨, 12/18
明後日, 雨, 9/13
</pre>
なお、「お天気Webサービス」と異なり、「時々」や「のち」を含む結果は現れません。
「Clear(晴れ)」、「Clouds(曇り)」、「Rain(雨)」、「Snow(雪)」、「Thunderstorm(雷)」、「Drizzle(霧)」
の6種類の天気しか表示されません。その点はこのサイトの特性としてご了承ください。
<br /><br />
<h4>bb2-04-04-lcd-4modes-ow.py および bb2-04-05-lcd-3modes-ow.py の利用</h4>
これらのプログラムは本書図4-9の温度計およびLCDを含む回路を作成してから実行してください。実行結果は本書のプログラムと同じです。
<pre class="prettyprint">
python3 bb2-04-04-lcd-4modes-ow.py
python3 bb2-04-05-lcd-3modes-ow.py
</pre>
<br /><br />
<h4>bb2-04-00-checkcity.py の利用</h4>
さて、上で説明したプログラムは、全て東京での天気予報を表示するものでした。これを別の都市の天気予報に変更したいときに用いるプログラムが bb2-04-00-checkcity.py です。
その使い方を解説します。
<br /><br />
ここまでのプログラムで天気予報の対象位置を指定するためには、実は緯度と経度を用いなければなりませんでした。5つのプログラム全てで、API key を指定した行の近くに下記の2行が存在します。
<pre class="prettyprint">
lat = '35.6895'
lon = '139.6917'
</pre>
これは緯度35.6895、経度139.6917を表しており、実はこれが東京を意味していた、というわけです。「東京」という地名で位置を指定したいところですが、それは無料枠の One Call API ではできない、ということです。
<br /><br />
ですから、天気予報の対象地を変えたいときは、下記の流れで行う必要があります。
<ol>
<li>対象地を決める</li>
<li>対象地の緯度と経度を調べる</li>
<li>調べた緯度と経度を5つのプログラムに書き込み、上書き保存する</li>
</ol>
このとき、「対象地の緯度と経度を調べる」ときに用いるのが bb2-04-00-checkcity.py であるというわけです。早速試してみましょう。
<br /><br />
まず、<a href="https://openweathermap.org/weathermap?basemap=map&cities=true&layer=temperature&lat=30&lon=-20&zoom=5" target="_blank">こちらのサイト</a>から対象地を決め、そのスペルを確認しておきましょう。マウスドラッグで位置変更ができ、マウスホイールで拡大率の変更ができます。
<br />
例えば、「Sapporo」を選ぶことにします。
<br /><br />
次に、bb2-04-00-checkcity.py を Thonny や mousepad で開き、下記の行を見つけます。
<pre class="prettyprint">
city = 'Tokyo'
</pre>
この行のTokyoの部分をSapporoに変更し、上書き保存します。
<pre class="prettyprint">
city = 'Sapporo'
</pre>
そして、bb2-04-00-checkcity.py を Thonny または下記のコマンドで実行してください。
<pre class="prettyprint">
python3 bb2-04-00-checkcity.py
</pre>
すると、下記のように Sapporo の緯度と経度が得られます。
<pre class="prettyprint">
Sapporo
lat = '43.0642'
lon = '141.3469'
</pre>
このうち、下記の2行で bb2-04-01~bb2-04-05 のファイルの該当行を置き換えて保存すれば、それらのファイルは Sapporo の天気予報を出力するようになります。
<pre class="prettyprint">
lat = '43.0642'
lon = '141.3469'
</pre>
以上、お疲れさまでした。
<br /><br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-46752362880031962992021-11-14T15:29:00.007+09:002023-11-02T16:07:15.001+09:00Raspberry Pi OS Bookworm / Bullseye / Buster でlircを利用する<h3>
はじめに</h3>
Raspberry Pi OS Bookworm / Bullseye / Buster での lirc のインストールは容易です。下記の手順に従ってください。
<br />
<br />
<h3>
インストール (Raspberry Pi OS Bookworm / Bullseye / Buster の場合)</h3>
Raspberry Pi OS Bookworm / Bullseye / Buster の場合は下記の2コマンドをひとつずつ順に実行してlircをインストールしてください。
<br />
<pre class="prettyprint">sudo apt update
sudo apt install lirc
</pre>
以上でインストールが完了します。
<br />
<br />
<h3>
インストール後の設定</h3>
さて、インストール後の設定を本書の流れに即して解説すると以下のようになります。
<br />
<ul>
<li>/etc/modulesへの編集 (p.142): 今回の方法では/etc/modulesを編集する必要はありません。
</li>
<li>/boot/config.txtへのdtoverlayの追加 (p.142~p.143): まず、下記のコマンドで /boot/config.txt を編集用に開きます。
<pre class="prettyprint">sudo mousepad /boot/config.txt</pre>
そして、「#dtoverlay=gpio-ir-tx,gpio_pin=18」または「#dtoverlay=lirc-rpi」という行を見つけ、その次の行に下記を追記してから保存してpadを閉じます。
<pre class="prettyprint">dtoverlay=gpio-ir,gpio_pin=24
dtoverlay=gpio-ir-tx,gpio_pin=25</pre>
該当する行が見つからなかった場合は、ファイルの最後の行に上の内容を追記すればよいでしょう。
</li>
</ul>
<br /><br />
次に、p.143末尾からの /etc/lirc/hardware.conf の編集ですが、このファイルは存在しませんので、
以下の設定に差し替えます。<br />
<br />
まず、不要なファイルの名前を下記のコマンドで変えます。
<pre class="prettyprint">sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.dist
</pre>
次に、下記のコマンドをターミナルで実行し、設定ファイル /etc/lirc/lirc_options.conf を管理者権限のmousepadで開きます。
<br />
<pre class="prettyprint">sudo mousepad /etc/lirc/lirc_options.conf
</pre>
開いたファイルの中に、下記の2行があるのを見つけてください。
<br />
<pre class="prettyprint">driver = devinput
device = auto
</pre>
これを、irrecordを用いてリモコン信号を学習させる場合は以下のように編集し、編集が終わったら保存してmousepadを終了してください。
<br />
<pre class="prettyprint">driver = default
device = /dev/lirc1
</pre>
なお、今回の方法ではirsendを用いて信号を送信する場合は/etc/lirc/lirc_options.conf の上記の行を下記のように変更しなければなりません。演習後半でirsendコマンドを使うときにはこれを忘れないよう注意してください。
<br />
<pre class="prettyprint">driver = default
device = /dev/lirc0
</pre>
以上で設定は終わりですので、Raspberry Piを再起動します。/etc/lirc/lirc_options.confを保存した場合は、Raspberry Piを再起動が必要です。
<br />
<br />
<h3>
irrecordの実行</h3>
irrecord の場合は、上で注意したように /etc/lirc/lirc_options.conf の device 行が /dev/lirc1 に設定されていなければなりませんので注意してください。<br />
そして、引き続きターミナルでirrecordを実行するのですが、その際のコマンド (p.145) は、下記のように末尾の「TV」をつけずに実行してください。
<br />
<pre class="prettyprint">irrecord -n
</pre>
その後、p.147からのリモコンの学習に移るのですが、開始時の手順が若干変更されています。
<br />
まず、下記のメッセージが出るので一回Enterキーを押します。
<br />
<pre class="prettyprint">(略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to <lirc@bartelmus.de> so it can be made available to others.
Press RETURN to continue.
</pre>
すると、下記のように光の状態のチェックに入りますので、終わるまで数秒待ちます。
<br />
<pre class="prettyprint">Checking for ambient light creating too much disturbances.
Please don't press any buttons, just wait a few seconds...
</pre>
チェックが終わったら、下記のメッセージが現れますので、ここで「TV」を入力し、Enterキーを押してください。
<br />
<pre class="prettyprint">Enter name of remote (only ascii, no spaces) :
</pre>
つまり、こうですね。
<br />
<pre class="prettyprint">Enter name of remote (only ascii, no spaces) :TV
</pre>
すると、下記のようにもう一度Enterキーを押すことを促されます。これが、p.147末尾の「2度目の[Enter]キー」に該当しますので、Enterキーを押し、その後p.148の指示に従って様々なボタンを繰り返し押して行ってください。
<br />
<pre class="prettyprint">It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.
Press RETURN now to start recording.
</pre>
p.154までは書籍の指示通りで構いません。
<br />
<br />
なお、ピリオド文字「.」が画面を2行分埋め尽くすまでリモコンのボタンを押し続けるステップで、1行目と2行目の間に下記のメッセージが出ることがあります。
<br />
<pre class="prettyprint">Cannot find any gap, using an arbitrary 50 ms one. If you have a
regular remote for e. g., a TV or such this is probably a point
where you hit control-C. However, technical hardware like air
condition gear often works without any gap. If you think it's
reasonable that your remote lacks gap you can proceed.
Press RETURN to continue.
</pre>
これは「信号のギャップを見つけられない」というエラーを示しています。
この場合、そのまま作業を続けてもリモコンの認識に失敗しますので、一旦キーボードで「Ctrl-c」を入力してirrecordを終了してください。
<br />
<br />
そして、部屋の照明の状態の変更(日光が部屋に入らないようにしたり、蛍光灯の状態を変えたり)を行うか、
赤外線受信モジュールとリモコンの位置関係を変えるなど、実験環境を変えて再チャレンジしてください。
ピリオド文字「.」の1行目と2行目の間に上記エラーが出ない状態を実現して演習を継続するようにしてください。
<br />
<br />
ピリオド文字「.」の1行目と2行目の間のメッセージが下記のようになっていれば正常なので、そのまま継続してください。
<br />
<pre class="prettyprint">Got gap (XXXXX us)
Please keep on pressing buttons like described above.
</pre>
なお、途中で「ボタンの名前をキーボードで入力し、ボタンを押す」というプロセスがあります。このときはボタンの押す長さをやや長め(1秒程度)とすると成功しやすいでしょう。
<br />
<br />
irrecordの終了後、書籍では「TV」というファイルに設定が保存されましたが、現在は TV.lircd.confという名前のファイルが生成されます。
<br />
<br />
次に、ターミナルで下記のファイルを実行し、ファイルを移動します。ファイルの移動先も変更を受けています。
<pre class="prettyprint">sudo mv TV.lircd.conf /etc/lirc/lircd.conf.d/
</pre>
irsend を試す場合は、上で注意したように /etc/lirc/lirc_options.conf の device 行を /dev/lirc0 に変更しなければならないので注意してください。
そしてRaspberry Piを再起動するとLIRCが再び起動し、irsendコマンドが実行できるようになります。
<br /><br />
なお、「ps ax |grep lircd」で LIRC の実行状況を確認した際、このバージョンの LIRC で表示されるメッセージは以下のようになっています(冒頭のいくつかの数字は人により異なります)。
<pre class="prettyprint">502 ? Ss 0:00 /usr/sbin/lircd --nodaemon
</pre>
これが表示されていれば、LIRC が正常動作しているということです。p.156 に示した旧バージョンの LIRC の表示とは異なりますのでご注意ください。
<br /><br />
それ以降は書籍と同じです。
<br />
<br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com3tag:blogger.com,1999:blog-1299465193942557222.post-35141585383958950742019-06-26T13:22:00.001+09:002022-03-24T20:28:00.398+09:00kernel 4.14までを搭載したRaspiban Stretchでlircを利用する<h3>はじめに</h3>
OSのベースのバージョンがStretchになったRaspbianではLIRCのバージョンが上がり、
その設定方法が書籍から若干変更されています。ここでは、その変更点をまとめていきます。
<br /><br />
なお、この方法は kernel 4.14まででは動作しますが、kernel 4.19以降では動作しません。
aptコマンドでOSをアップデートするとkernel 4.19になってしまいこの方法では動作しなくなります。
<br /><br />
整理すると、ここで解説する方法は「2019年4月にリリースされたNOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のバージョンをOSアップデートせずに利用する場合」にのみ動作します
<br />
<br />
それより新しいOSを用いた場合の方法は、以下のうち該当する方を参考にしてください。
<ol>
<li><a href="https://raspibb2.blogspot.com/2021/11/raspberry-pi-os-bullseye-lirc.html" target="_blank">Raspberry Pi OS Buster / Bullseye でlircを利用する</a></li>
<li><a href="https://raspibb2.blogspot.com/2019/06/kernel-419raspbian-stretchbusterlirc.html" target="_blank">kernel 4.19以降を搭載したRaspiban Stretchでlircを利用する</a></li>
</ol>
<br />
<h3>インストール</h3>
さて、「2019年4月にリリースされたNOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のバージョンをOSアップデートせずに利用する場合」の設定を本書の流れに即して解説すると以下のようになります。
<br />
<ul>
<li>LIRCのインストール (p.141): 下記の2つのコマンドを一つずつ順に実行します。
<pre class="prettyprint">sudo apt update
sudo apt install lirc</pre>
</li>
<li>/etc/modulesへの lirc_dev の追加 (p.142): まず、下記のコマンドで /etc/modules を編集用に開きます。
<pre class="prettyprint">sudo leafpad /etc/modules</pre>
そして、末尾に「lirc_dev」を書き加えてから保存してleafpadを閉じます。
</li>
<li>/boot/config.txtへのdtoverlayの追加 (p.142~p.143): まず、下記のコマンドで /boot/config.txt を編集用に開きます。
<pre class="prettyprint">sudo leafpad /boot/config.txt</pre>
そして、「#dtoverlay=lirc-rpi」という行を見つけ、その次の行に下記を追記してから保存してleafpadを閉じます。
<pre class="prettyprint">dtoverlay=lirc-rpi,gpio_in_pin=24,gpio_out_pin=25</pre>
</li>
</ul>
次に、p.143末尾からの /etc/lirc/hardware.conf の編集ですが、このファイルは存在しませんので、
以下の設定に差し替えます。
まず、下記のコマンドをターミナルで実行し、設定ファイル /etc/lirc/lirc_options.conf を管理者権限のleafpadで開きます。
<br />
<pre class="prettyprint">sudo leafpad /etc/lirc/lirc_options.conf
</pre>
開いたファイルの中に、下記の2行があるのを見つけてください。
<br />
<pre class="prettyprint">driver = devinput
device = auto
</pre>
これを、以下のように編集し、編集が終わったら保存してleafpadを終了してください。
<br />
<pre class="prettyprint">driver = default
device = /dev/lirc0
</pre>
さらに、設定ファイル中に不要なファイルがあるので、ターミナルで下記の2つのコマンドを一つずつ順に実行し、
名前を変更します。
<br />
<pre class="prettyprint">cd /etc/lirc/lircd.conf.d/
sudo mv devinput.lircd.conf devinput.lircd.conf.dist
</pre>
以上で設定は終わりですので、Raspberry Piを再起動します。
<br />
<br />
<h3>irrecordの実行</h3>
次に、irrecordの実行です。Raspbian Stretch 以降では、この時点でLIRCが起動しています。さらに、LIRCが起動した状態でirrecordを実行するとエラーがでます。そのため、irrecordを実行するときは、ターミナルで下記のコマンドを実行し、LIRCを停止します。
<br />
<pre class="prettyprint">sudo service lircd stop
</pre>
そして、引き続きターミナルでirrecordを実行するのですが、その際のコマンド (p.145) は、下記のように末尾の「TV」をつけずに実行してください。
<br />
<pre class="prettyprint">irrecord -n -d /dev/lirc0
</pre>
その後、p.147からのリモコンの学習に移るのですが、開始時の手順が若干変更されています。
<br />
まず、下記のメッセージが出るので一回Enterキーを押します。
<br />
<pre class="prettyprint">(略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to <lirc@bartelmus.de> so it can be made available to others.
Press RETURN to continue.
</pre>
すると、下記のように光の状態のチェックに入りますので、終わるまで数秒待ちます。
<br />
<pre class="prettyprint">Checking for ambient light creating too much disturbances.
Please don't press any buttons, just wait a few seconds...
</pre>
チェックが終わったら、下記のメッセージが現れますので、ここで「TV」を入力し、Enterキーを押してください。
<br />
<pre class="prettyprint">Enter name of remote (only ascii, no spaces) :
</pre>
つまり、こうですね。
<br />
<pre class="prettyprint">Enter name of remote (only ascii, no spaces) :TV
</pre>
すると、下記のようにもう一度Enterキーを押すことを促されます。これが、p.147末尾の「2度目の[Enter]キー」に該当しますので、Enterキーを押し、その後p.148の指示に従って様々なボタンを繰り返し押して行ってください。
<br />
<pre class="prettyprint">It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.
Press RETURN now to start recording.
</pre>
p.154までは書籍の指示通りで構いません。
<br />
<br />
なお、ピリオド文字「.」が画面を2行分埋め尽くすまでリモコンのボタンを押し続けるステップで、1行目と2行目の間に下記のメッセージが出ることがあります。
<br />
<pre class="prettyprint">Cannot find any gap, using an arbitrary 50 ms one. If you have a
regular remote for e. g., a TV or such this is probably a point
where you hit control-C. However, technical hardware like air
condition gear often works without any gap. If you think it's
reasonable that your remote lacks gap you can proceed.
Press RETURN to continue.
</pre>
これは「信号のギャップを見つけられない」というエラーを示しています。
この場合、そのまま作業を続けてもリモコンの認識に失敗しますので、一旦キーボードで「Ctrl-c」を入力してirrecordを終了してください。
<br />
<br />
そして、部屋の照明の状態の変更(日光が部屋に入らないようにしたり、蛍光灯の状態を変えたり)を行うか、
赤外線受信モジュールとリモコンの位置関係を変えるなど、実験環境を変えて再チャレンジしてください。
ピリオド文字「.」の1行目と2行目の間に上記エラーが出ない状態を実現して演習を継続するようにしてください。
<br />
<br />
ピリオド文字「.」の1行目と2行目の間のメッセージが下記のようになっていれば正常なので、そのまま継続してください。
<br />
<pre class="prettyprint">Got gap (XXXXX us)
Please keep on pressing buttons like described above.
</pre>
irrecordの終了後、書籍では「TV」というファイルに設定が保存されましたが、Raspbian Stretch 以降では、TV.lircd.confという名前のファイルが生成されます。
<br />
<br />
次に、ターミナルで下記のファイルを実行し、ファイルを移動します。ファイルの移動先も変更を受けています。
<br />
<pre class="prettyprint">sudo mv TV.lircd.conf /etc/lirc/lircd.conf.d/
</pre>
そしてRaspberry Piを再起動するとLIRCが再び起動し、irsendコマンドが実行されるようになります。それ以降は書籍と同じです。
<br />
<br />
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-6127506922902615322019-06-26T13:21:00.008+09:002023-07-02T16:02:06.305+09:00kernel 4.19以降を搭載したRaspbian Stretchでlircを利用する<h3>
はじめに</h3>
2021年11月時点で、kernel 4.19以降が搭載された Raspbaian Stretch ではそのままではlircは動作しません。
Raspberry Pi OS Buster や Raspberry Pi OS Bullseye では簡単に lirc を利用できるよう改善されております。以下で解説していますので、そちらを利用することを推奨します。
<ul>
<li><a href="https://raspibb2.blogspot.com/2021/11/raspberry-pi-os-bullseye-lirc.html" target="_blank">Raspberry Pi OS Buster / Bullseye でlircを利用する</a></li>
</ul>
<br />
本ページは、それでもあえて「kernel 4.19以降が搭載されたRaspbaian Stretch」で lirc を利用したい、という方ための情報をまとめます。
<br />
<br />
kernel 4.19を搭載したRaspbian Stretchでlircを動作させるには、lircに kernel 4.19 用の変更(正確にはドライバであるgpio-ir用の変更)を加えてビルドしなおす必要があります。<br />
その変更案を考え、<a href="https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=235256" target="_blank">こちらのフォーラム</a>で紹介してきましたが、まとまってきたのでここに記します。
<br />
<br />
<h3>
インストール前の準備</h3>
まず、aptコマンドでlircをインストールした方は、そのlircは動作しませんので、下記のコマンドで一旦削除します。
<br />
<pre class="prettyprint">sudo apt remove liblirc0 liblircclient0 lirc
</pre>
次に、以下の3つのコマンドを一つずつ順に実行し、lircをビルドする環境を作ります。
<br />
<pre class="prettyprint">sudo su -c "grep '^deb ' /etc/apt/sources.list | sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"
sudo apt update
sudo apt install devscripts
</pre>
<br />
<br />
<h3>
インストール (Raspbian Stretch + kernel 4.19の場合)</h3>
kernel 4.19が搭載されたRapsbian Stretchの場合は下記の10コマンドをひとつずつ順に実行してlircをビルドおよびインストールします。
<br />
<pre class="prettyprint">sudo apt build-dep lirc
mkdir build
cd build
apt source lirc
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/lirc-gpio-ir.patch
patch -p0 -i lirc-gpio-ir.patch
cd lirc-0.9.4c
debuild -uc -us -b
cd ..
sudo apt install ./liblirc0_0.9.4c-9_armhf.deb ./liblirc-client0_0.9.4c-9_armhf.deb ./lirc_0.9.4c-9_armhf.deb
</pre>
なお、このインストールが終わった後、<strong>OSのアップデートをすると、対策済lircが対策なしlircで上書きインストールされます。<br />
そのため、liblirc0_0.9.4c-9_armhf.deb、liblirc-client0_0.9.4c-9_armhf.deb、lirc_0.9.4c-9_armhf.deb の3ファイルを保存しておき、必要に応じて最後のコマンドでインストールし直すのが良いでしょう</strong>。その場合、冒頭のlircを削除するコマンドで対策なしlircを事前に削除する必要があるかもしれませんのでご注意ください。
<br />
<br />
<h3>
インストール後の設定 (Raspbian Stretch + kernel 4.19の場合)</h3>
さて、インストール後の設定を本書の流れに即して解説すると以下のようになります。
<br />
<ul>
<li>/etc/modulesへの編集 (p.142): 今回の方法では/etc/modulesを編集する必要はありません。
</li>
<li>/boot/config.txtへのdtoverlayの追加 (p.142~p.143): まず、下記のコマンドで /boot/config.txt を編集用に開きます。
<pre class="prettyprint">sudo leafpad /boot/config.txt</pre>
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<pre class="prettyprint">sudo mousepad /boot/config.txt</pre>
そして、「#dtoverlay=gpio-ir-tx,gpio_pin=18」または「#dtoverlay=lirc-rpi」という行を見つけ、その次の行に下記を追記してから保存してleafpadを閉じます。
<pre class="prettyprint">dtoverlay=gpio-ir,gpio_pin=24
dtoverlay=gpio-ir-tx,gpio_pin=25</pre>
</li>
</ul>
次に、p.143末尾からの /etc/lirc/hardware.conf の編集ですが、このファイルは存在しませんので、
以下の設定に差し替えます。<br />
<br />
次に、下記のコマンドをターミナルで実行し、設定ファイル /etc/lirc/lirc_options.conf を管理者権限のleafpadで開きます。
<br />
<pre class="prettyprint">sudo leafpad /etc/lirc/lirc_options.conf
</pre>
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">sudo mousepad /etc/lirc/lirc_options.conf
</pre>
開いたファイルの中に、下記の2行があるのを見つけてください。
<br />
<pre class="prettyprint">driver = devinput
device = auto
</pre>
これを、irrecordを用いてリモコン信号を学習させる場合は以下のように編集し、編集が終わったら保存してleafpadを終了してください。
<br />
<pre class="prettyprint">driver = default
device = /dev/lirc1
</pre>
なお、今回の方法ではirsendを用いて信号を送信する場合は/etc/lirc/lirc_options.conf の上記の行を下記のように変更しなければなりません。演習後半でirsendコマンドを使うときはこれを忘れないよう注意してください。
<br />
<pre class="prettyprint">driver = default
device = /dev/lirc0
</pre>
以上で設定は終わりですので、Raspberry Piを再起動します。/etc/lirc/lirc_options.confを保存した場合は、Raspberry Piを再起動が必要です。
<br />
<br />
<h3>
irrecordの実行</h3>
irrecord の場合は、上で注意したように /etc/lirc/lirc_options.conf の device 行が /dev/lirc1 に設定されていなければなりませんので注意してください。<br />
そして、引き続きターミナルでirrecordを実行するのですが、その際のコマンド (p.145) は、下記のように末尾の「TV」をつけずに実行してください。
<br />
<pre class="prettyprint">irrecord -n
</pre>
その後、p.147からのリモコンの学習に移るのですが、開始時の手順が若干変更されています。
<br />
まず、下記のメッセージが出るので一回Enterキーを押します。
<br />
<pre class="prettyprint">(略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to <lirc@bartelmus.de> so it can be made available to others.
Press RETURN to continue.
</pre>
すると、下記のように光の状態のチェックに入りますので、終わるまで数秒待ちます。
<br />
<pre class="prettyprint">Checking for ambient light creating too much disturbances.
Please don't press any buttons, just wait a few seconds...
</pre>
チェックが終わったら、下記のメッセージが現れますので、ここで「TV」を入力し、Enterキーを押してください。
<br />
<pre class="prettyprint">Enter name of remote (only ascii, no spaces) :
</pre>
つまり、こうですね。
<br />
<pre class="prettyprint">Enter name of remote (only ascii, no spaces) :TV
</pre>
すると、下記のようにもう一度Enterキーを押すことを促されます。これが、p.147末尾の「2度目の[Enter]キー」に該当しますので、Enterキーを押し、その後p.148の指示に従って様々なボタンを繰り返し押して行ってください。
<br />
<pre class="prettyprint">It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.
Press RETURN now to start recording.
</pre>
p.154までは書籍の指示通りで構いません。
<br />
<br />
なお、ピリオド文字「.」が画面を2行分埋め尽くすまでリモコンのボタンを押し続けるステップで、1行目と2行目の間に下記のメッセージが出ることがあります。
<br />
<pre class="prettyprint">Cannot find any gap, using an arbitrary 50 ms one. If you have a
regular remote for e. g., a TV or such this is probably a point
where you hit control-C. However, technical hardware like air
condition gear often works without any gap. If you think it's
reasonable that your remote lacks gap you can proceed.
Press RETURN to continue.
</pre>
これは「信号のギャップを見つけられない」というエラーを示しています。
この場合、そのまま作業を続けてもリモコンの認識に失敗しますので、一旦キーボードで「Ctrl-c」を入力してirrecordを終了してください。
<br />
<br />
そして、部屋の照明の状態の変更(日光が部屋に入らないようにしたり、蛍光灯の状態を変えたり)を行うか、
赤外線受信モジュールとリモコンの位置関係を変えるなど、実験環境を変えて再チャレンジしてください。
ピリオド文字「.」の1行目と2行目の間に上記エラーが出ない状態を実現して演習を継続するようにしてください。
<br />
<br />
ピリオド文字「.」の1行目と2行目の間のメッセージが下記のようになっていれば正常なので、そのまま継続してください。
<br />
<pre class="prettyprint">Got gap (XXXXX us)
Please keep on pressing buttons like described above.
</pre>
なお、途中で「ボタンの名前をキーボードで入力し、ボタンを押す」というプロセスがあります。このときはボタンの押す長さをやや長め(1秒程度)とすると成功しやすいでしょう。
<br />
<br />
irrecordの終了後、書籍では「TV」というファイルに設定が保存されましたが、現在は TV.lircd.confという名前のファイルが生成されます。
<br />
<br />
次に、ターミナルで下記のファイルを実行し、ファイルを移動します。ファイルの移動先も変更を受けています。
<br />
<pre class="prettyprint">sudo mv TV.lircd.conf /etc/lirc/lircd.conf.d/
</pre>
irsend を試す場合は、上で注意したように /etc/lirc/lirc_options.conf の device 行を /dev/lirc0 に変更しなければならないので注意してください。
そしてRaspberry Piを再起動するとLIRCが再び起動し、irsendコマンドが実行できるようになります。
<br /><br />
なお、「ps ax |grep lircd」で LIRC の実行状況を確認した際、このバージョンの LIRC で表示されるメッセージは p.156 に示した旧バージョンの LIRC の表示とは異なりますのでご注意ください。
「 /usr/sbin/lircd 」という表示が見えれば LIRC が正常動作していると考えてよいと思います。
<br /><br />
それ以降は書籍と同じです。
<br />
<br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1299465193942557222.post-20183454199464187822018-08-27T17:56:00.003+09:002022-02-03T17:13:02.923+09:00画像処理の演習を Python3 用の OpenCV3 / OpenCV4で実行する方法<h3>
0. はじめに</h3>
Pythonにはバージョン2 (Python2) とバージョン3 (Python3)の2系統があります。本書のプログラムは、原則的に両方のバージョンで実行できるように記述しています。<br />
<br />
しかし、画像処理に用いるライブラリOpenCVだけは、Python2での利用に限定していました。2018年8月の時点の Raspbian Stretch で言えば、Python がバージョン2.7.13、OpenCVはバージョン2.4.9.1でした。<br />
<br />
これは、2015年の本書執筆時はPython3でOpenCVを用いる簡単な方法が見つからなかったためです。<br />
<br />
しかし、Python3でOpenCVを用いる方法が容易になりつつあることから、Python3で本書のOpenCVを用いたプログラムを実行する方法をここで紹介することにしました。<br />
<br />
<h3>
1. 準備</h3>
まず、本書でもインストールしたlibopencv-devをあらかじめインストールしておきます。下記の2つの命令を順に実行します。
<br />
<pre class="prettyprint">sudo apt update
sudo apt install libopencv-dev
</pre>
なお、このlibopencv-devは顔認識に用いるファイルhaarcascade_frontalface_alt.xmlのためだけにインストールします。
<br />
<br />
このあとは、用いているOSと利用したいOpenCVのバージョンによりコマンドが分かれます。
<br />
<br />
<h3>
2. Rasppbian Buster または Bullseye + Python3 + OpenCV3 の場合</h3>
Raspbian Buster または Bullseye をお使いの場合、apt コマンドでインストールできるOpenCV3をインストールするのが最も簡単ですのでお勧めです。
<br /><br />
下記のようにOpenCVをインストールします。
<pre class="prettyprint">sudo apt install python3-opencv
</pre>
以上で、Python3 用の OpenCV のインストールが終わりました。
<br />
<br />
2019年6月の時点で、Python3はバージョン3.7.3、OpenCV はバージョン3.2.0となりました。
<br /><br />
<h3>
3. Rasppbian Buster + Python3 + OpenCV4 の場合</h3>
Raspbian Busterをお使いの場合、pip3 コマンドでインストールするとOpenCV4がインストールされます。インストール中のネットワークトラブルによるエラーが多いので、上級者向けと考えています。
<br /><br />
まず、必要なパッケージをインストールします。
<pre class="prettyprint">sudo apt install libatlas-base-dev libjasper-dev libqtgui4 libqt4-test
</pre>
最後に、Python3 用の OpenCV4 をインストールします。
<br />
<pre class="prettyprint">sudo pip3 install opencv-python==4.5.1.48
</pre>
最後に、以下のコマンドを実行します。それが終わったらRaspberry Piを再起動します。
<pre class="prettyprint">echo "export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1" >> ~/.bashrc
</pre>
以上で、Python3 用の OpenCV4 のインストールが終わりました。
<br />
<br />
なお、OpenCVのバージョンを 4.5.1.48 に指定している理由は、それ以降 (4.5.3 など) では NumPy の新しいバージョン (1.21 など) を要求されるためです。<br />
NumPy 1.20 以降では、機械学習用のライブラリ TensorFlow 2.x の動作に問題が出る場合があるため、Numpy 1.19 で使える OpenCV 4.5.1.48 を指定しているのです。<br />
TensorFlow 2.x を使わない場合は OpenCV のバージョン指定は不要ですが、利用は自己責任でお願いします。
<br><br />
また、Raspberry Piでのpip(pip3)を用いたツールのインストールは、ネットワークのトラブルにより失敗することが多いようです。例えば、pip(pip3)コマンドを実行したときに下記のような40行程度のエラーが出ることがあります。
<br />
<pre class="prettyprint">Exception:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
status = self.run(options, args)
(中略)
File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'
</pre>
これは、インストール時のネットワークに問題があるときに出るエラーです。
Raspberry Piがネットワークに接続していないとき、および、ファイルのダウンロード元であるサーバーに問題があるときの両方で上記エラーが出ます。
<br />
あるいは、同様のエラーで
<br />
<pre class="prettyprint">THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.</pre>
と出る場合もあります。
<br />
<br />
Raspberry Piのネットワーク接続に問題がある場合はその改善を試みてください。<br />
一方、先方のサーバーに問題がある場合、時間をあけてからコマンドを再実行すると問題が解消される場合があります。Raspberry Pi上でpipを用いてツールをインストールする場合、サーバー側の問題なのか、何度もインストールを試みて初めてインストールに成功する、ということが多い印象があります。
<br /><br />
<h3>
4. Rasppbian Stretch + Python3 + OpenCV4 の場合</h3>
Raspbian Stretch上のPython3でOpenCV4を用いたい場合、以下のようにします。
<br /><br />
まず、必要なパッケージをインストールします。
<pre class="prettyprint">sudo apt install libatlas-base-dev libjasper-dev libqtgui4 python3-pyqt5 libqt4-test
</pre>
次に、Python3 用の OpenCV4 をインストールします。
<br />
<pre class="prettyprint">sudo pip3 install opencv-python==4.5.1.48
</pre>
以上で、Python3 用の OpenCV4 のインストールが終わりました。
<br />
<br />
<h3>
5. 本書のOpenCVを用いた演習の実行</h3>
執筆当時のプログラムではいくつかのプログラムに修正が必要だったので、
2019/6/25にサンプルファイル(raspi2-sample.zip)を更新しました。
それ以前にダウンロードされた方は公式サイトから raspi2-sample.zip をダウンロードしなおしてください。
<br /><br />
更新済のプログラムを用いる場合、実行方法は<a href="https://raspibb2.blogspot.com/2015/12/blog-post.html" target="_blank">解説ページ</a>に記した内容と変わりません。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com3tag:blogger.com,1999:blog-1299465193942557222.post-14207338842301688962018-02-03T22:43:00.002+09:002020-05-29T16:55:29.198+09:00Raspberry Pi + Google Assistant API + LIRCによりテレビを音声認識で操作する<h3>
0. はじめにのはじめに</h3>
2019年6月にGoogle自身がこの方法は<a href="https://developers.google.com/assistant/sdk/guides/library/python/" target="_blank">deprecated(廃止予定)である</a>としました。2020年3月31日にRaspberry Pi 4 で動作を確認しましたが、いずれ動作しなくなる可能性はありますのでそのつもりでご覧ください。
<br />
<br />
<h3>
1. はじめに</h3>
本サイトでは以前、「<a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a>」という記事を紹介しました。<br />
<br />
これは、Juliusという音声認識エンジンをRaspberry Piにインストールして音声認識を実現し、その結果に基づいて家電を操作するものでした。<br />
<br />
それに対し、本ページでは音声認識をRaspberry Piにインストールしたソフトウェアではなく、クラウド上のサービスで行う例を紹介します。<br />
<br />
この方法は、Raspberry Piが常にインターネットに接続していなければならないという欠点があるものの、音声認識の精度が高いというメリットがあります。両方試してみて比較するのも良いでしょう。<br />
<br />
下図は、それを実現している様子を示したものです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3HpUEk484Fig8mh3Ufh8ANOo7j22WweyY1s-BnLGpUaAvupMNzhUUAeXXILERztyml9q3olfyUiaYDLZfYVepeVLoRhbhk2pYlERRUODaiiZ46s9CjQRQalBoGmK1YVOgPkZQgWTwUts/s1600/2018-02-02+14.45.13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3HpUEk484Fig8mh3Ufh8ANOo7j22WweyY1s-BnLGpUaAvupMNzhUUAeXXILERztyml9q3olfyUiaYDLZfYVepeVLoRhbhk2pYlERRUODaiiZ46s9CjQRQalBoGmK1YVOgPkZQgWTwUts/s640/2018-02-02+14.45.13.jpg" width="640" /></a></div>
<br />
また、動作中の動画が下記になります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/LO2jxX_l8gA?rel=0" width="420"></iframe>
</div>
<br />
<br />
<h3>
2. 本ページの内容を実現するために必要なもの</h3>
本ページで解説する内容はクラウドサーバーとの連携が必要なため、書籍やサイトで解説してきた内容の中で最も難易度が高くなっております。ご注意ください。<br />
<br />
また、実行には下記のものが必要です。<br />
<ul>
<li>Googleのアカウント(GmailやAndroidスマートフォンで利用するもの)</li>
<li>Raspberry Piを常時インターネットに接続する環境</li>
<li>マイク(後述)</li>
<li>スピーカー(後述)</li>
</ul>
Googleアカウントの作成方法や利用方法は本サイトでは解説できませんのでご注意ください。<br />
<br />
<h3>
3. 音声入力(マイク)と音声出力(スピーカー)の設定</h3>
本ページの内容を実現するためには、マイクとスピーカーが必要です。どのような機器を用意すればよいか解説します。<br />
<br />
まず、マイクからです。Raspberry Piにはマイクの接続端子がありませんので、利用できる機器をあらかじめ調べておく必要があります。<br />
本ページでは、マイクを接続するためのデバイスとして「USBマイク系」と「USBサウンドデバイス系」の2系統を試しました。<br />
<br />
「USBマイク系」としては下記の2種類を試しました。<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B01M7YIYZV/" target="_blank">SANWA SUPPLY MM-MCU02BK USBマイクロホン</a>
</li>
<li><a href="https://www.amazon.co.jp/dp/B0027WPY82/" target="_blank">SANWA SUPPLY MM-MCUSB16 USBマイクロホン</a>
</li>
</ul>
「USBサウンドデバイス系」としては下記の3種類を試しました。<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B06XZY8JTZ/" target="_blank">Creative Sound Blaster Play!3 SB-PLAY3</a></li>
<li><a href="https://www.amazon.co.jp/dp/B00JIT6L4S/" target="_blank">Creative Sound Blaster Play!2 SB-PLAY2</a></li>
<li><a href="https://www.amazon.co.jp/dp/B001BKTIFQ/" target="_blank">Creative Sound Blaster Play! SB-PLAY</a></li>
</ul>
ただし、USBサウンドデバイスを用いる場合、さらにミニプラグ接続のPC用マイクも必要となります。これはどのようなマイクでも問題ないと思いますが、例えば<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B01CGLTD3U/" target="_blank">iBUFFALO マイクロフォン スタンドタイプ 3極プラグ搭載 ホワイト BSHSMPM01WH</a></li>
<li><a href="https://www.amazon.co.jp/dp/B00008BB7B/" target="_blank">サンワサプライ マルチメディアマイクロフォン MM-MC1</a></li>
</ul>
のようなものがあります。<br />
<br />
以上の「USBマイク系」と「USBサウンドデバイス系」のどれかからお好みの方法を選んでください。なお、上に示した動画では「<a href="https://www.amazon.co.jp/dp/B01M7YIYZV/" target="_blank">SANWA SUPPLY MM-MCU02BK USBマイクロホン</a>」を用いています。<br />
<br />
一方、スピーカーについては、ミニプラグで接続可能なものであれば何でも構いません。ただし、ミニプラグでのスピーカーの接続先については3通りの選択肢があります(後述します)。<br />
<br />
以上の物品を用意し接続した後、それらを利用可能にする設定を行います。これは、「用いるOSのバージョン」および「用いるマイクとスピーカーの組み合わせ」により計6パターンの選択肢がありますので、下記のうち該当する内容を実行してください。<br />
<br />
<h4>
3.1 (2020年2月までのOS) USBマイク+Raspberry Pi本体のミニプラグ端子へのスピーカー接続</h4>
ターミナルで以下の3コマンドを順番に実行してください。
<br />
<pre class="prettyprint">$ amixer cset numid=3 1
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/asoundrc
$ mv asoundrc .asoundrc
</pre>
<br />
<h4>
3.2 (2020年2月までのOS) USBマイク+HDMIディスプレイへのスピーカー接続</h4>
ターミナルで以下の3コマンドを順番に実行してください。
<br />
<pre class="prettyprint">$ amixer cset numid=3 2
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/asoundrc
$ mv asoundrc .asoundrc
</pre>
<br />
<h4>
3.3 (2020年2月までのOS) USBサウンドデバイスへのマイクとスピーカーの接続</h4>
ターミナルで以下の2コマンドを順番に実行してください。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/asoundrc2
$ mv asoundrc2 .asoundrc
</pre>
<br />
<h4>
3.4 (2020年5月以降のOS) USBマイク+Raspberry Pi本体のミニプラグ端子へのスピーカー接続</h4>
ターミナルで以下の2コマンドを順番に実行してください。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/asoundrc3
$ mv asoundrc3 .asoundrc
</pre>
<br />
<h4>
3.5 (2020年5月以降のOS) USBマイク+HDMIディスプレイへのスピーカー接続</h4>
ターミナルで以下の2コマンドを順番に実行してください。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/asoundrc4
$ mv asoundrc4 .asoundrc
</pre>
<br />
<h4>
3.5 (2020年5月以降のOS) USBサウンドデバイスへのマイクとスピーカーの接続</h4>
ターミナルで以下の2コマンドを順番に実行してください。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/asoundrc5
$ mv asoundrc5 .asoundrc
</pre>
<br />
<br />
<h4>
3.4 マイクとスピーカーの動作チェック</h4>
さて、3.1~3.3のどれかの方法でマイクとスピーカーの接続および設定が終わったら、動作チェックしてみましょう。<br />
<br />
まずはスピーカーのチェックです。ターミナルを起動して下記のコマンドを実行してみましょう。既に述べたように、本ページのコマンドはコピーと貼り付けによる実行を推奨します。
<br />
<pre class="prettyprint">$ speaker-test -t wav
</pre>
「Front, Left, …」という音声がスピーカーから流れるはずです。止めるにはターミナル上でキーボードのCtrlキーを押しながらcキーを押します(Ctrl-cといいます)。<br />
<br />
次に、マイクの動作チェックを行いましょう。下記のコマンドを実行すると、5秒間の音声がour.rawというファイル名で保存されますので、マイクに向かって話しかけてみましょう。
<br />
<pre class="prettyprint">$ arecord --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw
</pre>
録音が終わったら、下記のコマンドで再生してみます。
<br />
<pre class="prettyprint">$ aplay --format=S16_LE --rate=16000 out.raw
</pre>
マイクに話しかけた音声が再生されたら動作チェックは成功です。<br />
<br />
なお、機器のボリュームの調節は下記のコマンドで起動するアプリケーションを用いるのですが、操作方法にかなり癖があります。
<br />
<pre class="prettyprint">$ alsamixer
</pre>
alsamixerの終了コマンドとして[ESC]キーは覚えておきましょう。まず、[F6]キーでサウンドカードを選択します。USBマイクの場合、矢印の上下キーで「1 USB PnP Audio Device」を選択してEnterを押します。2020年5月以降のOSならば「2 USB PnP Audio Device」となっているでしょう。
その後、[TAB]キーを繰り返し押すことで再生/録音/全てのどれかに選択肢を合わせ、上下キーで音量を調節します。調節が終わったら[ESC]キーでalsamixerを終了します。
<br />
<br />
<h3>
4. サーバー側の準備</h3>
Googleの提供する方法で音声認識を実現する場合、下記の3つの方法が知られています。
<br />
<ul>
<li>Google Speech API v.2を用いる方法…古くからある方法。開発用途および個人用途のみ。1日50認識限定。</li>
<li>Google Cloud Speech APIを用いる方法…2017年4月にリリース。利用時の登録にクレジットカードが必要。</li>
<li>Google Assistant APIを用いる方法…Google Homeなどのようにコンピュータと対話するためのライブラリ。開発用途でのみ無料利用可能。一日500リクエストまで。</li>
</ul>
執筆時点では、3つめのGoogle Assistant APIの利用がお手軽に思えましたので、今回はこちらを試してみます。<br />
<br />
ここからは、Raspberry Piが通信する相手となるサーバーの準備を行います。非常に長い手順となりますので、一つずつ確実に実行していきましょう。<br />
<br />
なお、以下の手順は「<a href="https://developers.google.com/assistant/sdk/guides/library/python/" target="_blank">Introduction to the Google Assistant Library</a>」の解説に基づいています。<br />
<br />
まず、Raspberry PiのChromiumブラウザを起動して<a href="https://www.google.co.jp/" target="_blank">Google</a>にアクセスし、お持ちのGoogleアカウントでログインしておきましょう。下図の「ログイン」ボタンから行えます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigwNT3x-o5QfT4M-HZj0S3E_TBeiiCTMmz3-ACkFhzP5N-sBZ8_PlVVe_u-ZCktirdLG7CCobhhWBA65RoKcKpK0V3GzW_uyRZ5mgqnaZ5DdM7JVZM2szB58-ULnWYb0GWaKHvSy9bQW4/s1600/ga01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="407" data-original-width="843" height="307" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigwNT3x-o5QfT4M-HZj0S3E_TBeiiCTMmz3-ACkFhzP5N-sBZ8_PlVVe_u-ZCktirdLG7CCobhhWBA65RoKcKpK0V3GzW_uyRZ5mgqnaZ5DdM7JVZM2szB58-ULnWYb0GWaKHvSy9bQW4/s640/ga01.png" width="640" /></a></div>
<br />
すると、下図のようなログイン画面が現れますので、IDとパスワードを入力してログインします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ9f7eIiex4tNt4oS58XPQXC-rzohegeTJoNUCnaJ89l6CZjpA6OSXVVXJ5W3GL4YNVU4djk58YA13xC3CqGe_SawuFA1T8e9BPgZyiBLDlPOsUaAtTAJQFjhDyDqgREOJ_ddzHN2L5K8/s1600/ga02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="376" data-original-width="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ9f7eIiex4tNt4oS58XPQXC-rzohegeTJoNUCnaJ89l6CZjpA6OSXVVXJ5W3GL4YNVU4djk58YA13xC3CqGe_SawuFA1T8e9BPgZyiBLDlPOsUaAtTAJQFjhDyDqgREOJ_ddzHN2L5K8/s1600/ga02.png" /></a></div>
<br />
ログインが済んだら、Google Assistant APIを用いるためのプロジェクトを作成していきましょう。まず、Chromiumブラウザで「<a href="https://console.actions.google.com/" target="_blank">Welcome to Actions on Google</a>」のリンクをクリックして移動してください。<br />
<br />
リンク先に下図のようなボタンがありますので、クリックしてプロジェクトを作成します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzcDwGJCiO7zOxvmd7TL50EIz6SV9y1v1X7kuugZbJlV3gX2v5idUTQTZKDqCGjuLEJxEKptH_gW48CHwleqg125g0kGySkqgHpB3rJOMzd0j4Dv2BVhYh-T_5wRINDkzgohfMrblqmEA/s1600/assistant-new01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="347" data-original-width="396" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzcDwGJCiO7zOxvmd7TL50EIz6SV9y1v1X7kuugZbJlV3gX2v5idUTQTZKDqCGjuLEJxEKptH_gW48CHwleqg125g0kGySkqgHpB3rJOMzd0j4Dv2BVhYh-T_5wRINDkzgohfMrblqmEA/s1600/assistant-new01.png" /></a></div>
<br />
ここでは、プロジェクトの名前を「Google Assistantのテスト」の意味で「gatest」とし、デフォルト言語を「Japanese」に、国を「Japan」にしましょう。特に、言語をJapaneseにしないと、Google Assitant APIは日本語を認識してくれません。<br />
<br />
記入と設定が終わったら「CREATE PROJECT」をクリックします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNrCKeFup6tUyAb_xaTrzXhjB2QdMk77wsY56BjoJr7v6cYUPWOC9dhsejrBwRRRKtJby76wUBmBmBMVrb6vd8I-FBG09VgclEA6prfDZweFJa5-eSE49bGgxMYeXbfKMbYTN8bT5R0Gg/s1600/assistant-new02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="308" data-original-width="520" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNrCKeFup6tUyAb_xaTrzXhjB2QdMk77wsY56BjoJr7v6cYUPWOC9dhsejrBwRRRKtJby76wUBmBmBMVrb6vd8I-FBG09VgclEA6prfDZweFJa5-eSE49bGgxMYeXbfKMbYTN8bT5R0Gg/s1600/assistant-new02.png" /></a></div>
<br />
プロジェクト作成が終わったら、Chromium上のタブは閉じずにそのまま残しておきます。<br />
<br />
そして、そのまま今度は「<a href="https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview" target="_blank">Google Assistant API</a>」のリンクをクリックしてください。<br />
<br />
このとき、下図の赤い四角に記されているように、作成したプロジェクト「gatest」が選択されていることを確認してください。<br />
<br />
選択されていない場合、まずその部分をクリックしてプロジェクト「gatest」を見つけて選択します(現れるまでに時間がかかることがあります)。その後、そのタブを一旦閉じ、もう一度上「<a href="https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview" target="_blank">Google Assistant API</a>」のリンクをクリックすると、下図の状態が実現すると思います。<br />
<br />
そして、そのまま「有効にする」ボタンをクリックします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7nfVc5RotXzjzP6m9cgwl0B_-K7X__xSJZ1WNQ7wUtfAbdPOAOF8UkF87hebpIDEEnv2BQO4kKu3bP9SNyx0MXClbq8cxY1MeBo3wOGSSYS6PNM-wlXb9NsLoKf4KLXNxTeOIdqvz-Xc/s1600/assistant-new03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="328" data-original-width="516" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7nfVc5RotXzjzP6m9cgwl0B_-K7X__xSJZ1WNQ7wUtfAbdPOAOF8UkF87hebpIDEEnv2BQO4kKu3bP9SNyx0MXClbq8cxY1MeBo3wOGSSYS6PNM-wlXb9NsLoKf4KLXNxTeOIdqvz-Xc/s1600/assistant-new03.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
次に、「<a href="https://console.developers.google.com/apis/credentials/consent" target="_blank">OAuth consent screen</a>」のリンクをクリックします。すると下記のようなページが開きますので、「メールアドレスを選択してください」の部分をクリックします。選択肢として、お使いのGoogleのメールアドレスが現れますので、それを選択します。<br />
<br />
そして、ページ下部にある「保存」ボタンをクリックします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8RBgETYZw32_5yDr9_1SZnH7A3Y1i4qJZRtqcqqxGJ6xkL7TjGLJ_b2-rNmSU_yQxHLOeiNV94CEVboSW3__W1FJ0TENlZEYK7baYCR_T1AihKzoO_qr_ScvyUbDKgK8sJeXUj5hFb1M/s1600/oauth_register.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="614" data-original-width="740" height="531" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8RBgETYZw32_5yDr9_1SZnH7A3Y1i4qJZRtqcqqxGJ6xkL7TjGLJ_b2-rNmSU_yQxHLOeiNV94CEVboSW3__W1FJ0TENlZEYK7baYCR_T1AihKzoO_qr_ScvyUbDKgK8sJeXUj5hFb1M/s640/oauth_register.png" width="640" /></a></div>
<br />
ここまでの作業が終わったら、今度は「デバイスモデルの登録」の作業に移ります。<br />
<br />
さきほど閉じずに残しておいたタブに戻り、一番下にある下記のボタンをクリックします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEikcgjXY3YdUJX1nMlgv2CzqgSytOsjfZrkMb3eFx63HnEUSrIM9hDcqQLWxWmpB00NN3if_Vki0pwJTniHzMWItOJ0OWQExjwoUK50uHFQXVI9SC6_5tHg7dfCPEnR4Hv6xgMe2B5c8/s1600/assistant-new04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="114" data-original-width="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEikcgjXY3YdUJX1nMlgv2CzqgSytOsjfZrkMb3eFx63HnEUSrIM9hDcqQLWxWmpB00NN3if_Vki0pwJTniHzMWItOJ0OWQExjwoUK50uHFQXVI9SC6_5tHg7dfCPEnR4Hv6xgMe2B5c8/s1600/assistant-new04.png" /></a></div>
<br />
すると、次のような画面に遷移しますので、「REGISTER MODEL」をクリックします。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVS9CfIKzE-KyjaUONMQr7z5hoDb3WtWtU7ub9rcf7sOHFNzSZlf5UOiiQlx6BKeAC1BDOC8LIeiUe2-A7hOd8_5HTsYVd8PFT1jvex3izewjwgwN-8seicwH6J1rIJN3uBmcuG3yD8g/s1600/assistant-new05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="184" data-original-width="568" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCVS9CfIKzE-KyjaUONMQr7z5hoDb3WtWtU7ub9rcf7sOHFNzSZlf5UOiiQlx6BKeAC1BDOC8LIeiUe2-A7hOd8_5HTsYVd8PFT1jvex3izewjwgwN-8seicwH6J1rIJN3uBmcuG3yD8g/s1600/assistant-new05.png" /></a></div>
<br />
現れたウインドウに、例えば下記のように記入します。上の2つは<br />
<ul>
<li>Assistant SDK light</li>
<li>Assistant SDK developer</li>
</ul>
です。3つ目の「Light」は選択式となっています。<br />
<br />
これらは、本来は何を入力しても良いのですが、チュートリアルページのサンプルに合わせてこのような内容にしています。<br />
<br />
なお、ここで表示されている「Device Model id」の内容は、以下で多用しますので、コピーしてテキストエディタなどに記して控えておきましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCvYQlSB_pVWz6BhVGGUOLaGHvUOpk17B45KCqP7C1qlmCQm1J7D1Vlw-MNKCmREKxL4mWWBx1N4nPJP7-UG17CzSf1s59V8z6MYREm_rDHI_l3LYU321amNB_mIQNb0hoITqB3vmTSTk/s1600/assistant-new06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="435" data-original-width="625" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCvYQlSB_pVWz6BhVGGUOLaGHvUOpk17B45KCqP7C1qlmCQm1J7D1Vlw-MNKCmREKxL4mWWBx1N4nPJP7-UG17CzSf1s59V8z6MYREm_rDHI_l3LYU321amNB_mIQNb0hoITqB3vmTSTk/s1600/assistant-new06.png" /></a></div>
<br />
記入やメモが終わったら「REGISTER MODEL」ボタンをクリックします。<br />
<br />
すると、遷移した先のページで以下のようなボタンが現れますので、クリックしましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5jFjLysz8LdqoHSGxBPhFYYVRfZvbOvBMeC3kwDuH7qVNc_cIExTFIBTWEmRihyphenhyphenZtPFxzspwz602pP6qZlX2jxqvVXL8JtpInxIImUheiwEhq_OWeqJ6w430V71QeQDOUfvCtNIwVKVw/s1600/assistant-new07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="36" data-original-width="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5jFjLysz8LdqoHSGxBPhFYYVRfZvbOvBMeC3kwDuH7qVNc_cIExTFIBTWEmRihyphenhyphenZtPFxzspwz602pP6qZlX2jxqvVXL8JtpInxIImUheiwEhq_OWeqJ6w430V71QeQDOUfvCtNIwVKVw/s1600/assistant-new07.png" /></a></div>
<br />
すると、「client_secret_XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.json」という形式の、非常に長い名前のファイルがダウンロードされます。保存先はデフォルトで /home/pi/Downloads となります。<br />
<br />
このファイルを、Downloadsディレクトリからホームディレクトリ (/home/pi) に移動しておきましょう。<br />
<br />
ターミナルを起動し、下記のコマンドを実行してください。なお、先頭の「$」はコマンドの先頭を表す記号ですので、コマンドには含めないでください。また、最後の「.」(ピリオド)にも意味はありますので、忘れずにコマンドに含めてください。<br />
<pre class="prettyprint">$ mv Downloads/*.json .
</pre>
拡張子 json のファイルを、Downloadsディレクトリからカレントディレクトリ (.) に移動しています。以下、コマンドはブラウザ上でコピーし、ターミナルへ貼り付けて実行することを推奨します。
<br />
<br />
ここまで終わったらブラウザで「NEXT」ボタンをクリックします。<br />
<br />
次に、traitsを保存(SAVE TRAITS)するためのページに遷移しますが、ここでは「SKIP」をクリックしてスキップします。<br />
<br />
最終的に、下記のようにModel IDが確定します。先ほどメモしたModel IDが再掲されていますね。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWed_DlqA03dcxrALfOsuMcrs5aRpnCEquPSNouLaiBJQ1hxmHiVzwwXsgXqNyNBAXCdvcU02MvGIiL0ZENXpnY4QWNtiGTfGXIMXZYB5co-zc4iuGr4QS6FyU8i9nQven4WMk6xRUhoE/s1600/assistant-new08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="81" data-original-width="637" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWed_DlqA03dcxrALfOsuMcrs5aRpnCEquPSNouLaiBJQ1hxmHiVzwwXsgXqNyNBAXCdvcU02MvGIiL0ZENXpnY4QWNtiGTfGXIMXZYB5co-zc4iuGr4QS6FyU8i9nQven4WMk6xRUhoE/s1600/assistant-new08.png" /></a></div>
<br />
Model IDとともに、Project IDも以下で必要となりますので、ここで調べてメモしておきましょう。Chromiumブラウザで<a href="https://console.cloud.google.com/cloud-resource-manager?pli=1" target="_blank">リソース管理</a>ページに移動すると、先ほど作成したgatestに対する Project ID(プロジェクトID)が表示されていますのでこれもメモしておきましょう。<br />
<br />
恐らく、Model IDとProject IDは先頭が 「gatest-xxxxx」の形式で共通となっていることでしょう。<br />
<br />
次に、Chromiumブラウザで「<a href="https://myaccount.google.com/activitycontrols" target="_blank">アクティビティ管理</a>」のページに移動し、下記の4点の設定を確認してください。<br />
<ul>
<li>「ウェブとアプリのアクティビティ」を有効(青色)に</li>
<li>「Chrome の閲覧履歴と Google サービスを使用するウェブサイトやアプリでのアクティビティを含める」にチェック</li>
<li>「端末情報」を有効(青色)に</li>
<li>「音声アクティビティ」を有効(青色)に</li>
</ul>
以上でサーバーの設定は完了です。しかし、そのほかの設定はまだまだ続きます。<br />
<br />
<h3>
5. 様々なソフトウェアのインストール</h3>
まず、ターミナルを起動し、下記の5つのコマンドを順に実行してください。なお、先頭の「$」はコマンドの先頭を表す記号ですので、コマンドには含めないでください。
長いコマンドが続きますので、ブラウザ上でコマンドをCtrl-cでコピーし、ターミナル上の「編集」→「貼り付け」によりコマンドを貼り付けて実行することを推奨します。
<br />
<pre class="prettyprint">$ sudo apt update
$ sudo apt install python3-dev python3-venv
$ python3 -m venv env
$ env/bin/python -m pip install --upgrade pip setuptools
$ source env/bin/activate
</pre>
3つめのコマンドでは、/home/pi/env にpython3の仮想実行環境を用意しています。Google Assistant SDKのチュートリアルでは、仮想環境でのインストールと実行を行っていますので、本ページでもそれに従います。
<br />
<br />
また、最後のコマンド「source env/bin/activate」では作成した仮想環境を優先して利用するよう設定しています。それにより、コマンドプロンプトは下記のように変化します。
<br />
<pre class="prettyprint">(env) pi@raspberrypi:~ $
</pre>
本ページではこれを以下のように略記し、これの後に記されたコマンドは仮想環境で実行すべきコマンドであるものとします。
<br />
<pre class="prettyprint">(env) $
</pre>
さて、Pythonの仮想環境において下記の4つのコマンドを引き続き実行していきます。これまで通りコマンドのコピーと貼り付けにより実行しましょう。実行すべきコマンドは「$」の後ろの部分のみですので注意してください。
<br />
<pre class="prettyprint">(env) $ sudo apt install portaudio19-dev libffi-dev libssl-dev
(env) $ python -m pip install --upgrade google-assistant-library==1.0.0
(env) $ python -m pip install --upgrade google-assistant-sdk[samples]
(env) $ python -m pip install --upgrade google-auth-oauthlib[tool]
</pre>
以上でツールのインストールは完了です。次は引き続きツールとサーバーの連携作業となります。途中で作業をやめず、一気に最後まで進めた方が良いです。
<br />
<br />
<h3>
6. サーバーとの連携の設定</h3>
引き続き、下記のコマンドをターミナルで実行するのですが、これはこのまま実行してもうまくいきません。<br />
<pre class="prettyprint">(env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --scope https://www.googleapis.com/auth/gcm --save --headless --client-secrets /path/to/client_secret_client-id.json
</pre>
最後の「/path/to/client_secret_client-id.json」の部分を、皆さんが「サーバー側の準備」でダウンロードしたファイル「client_secret_XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.json」で読み替えて実行しないといけないのです。<br />
<br />
それを、下記の手順で実現しましょう。まず、上のコマンドをから末尾の「/path/to/client_secret_client-id.json」を省いた下記のコマンドをコピーし、ターミナルに貼り付けましょう。
<br />
<pre class="prettyprint">(env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --scope https://www.googleapis.com/auth/gcm --save --headless --client-secrets
</pre>
そして、そのコマンドの末尾にスペースを入力し、さらに「client」まで書きます。すなわち、下記のようになります。
<br />
<pre class="prettyprint">(env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --scope https://www.googleapis.com/auth/gcm --save --headless --client-secrets <strong>client</strong>
</pre>
そこで、キーボードの[TAB]キーを押します。すると、ファイル名が補完され、下記のようにコマンドが完成します。そこでEnterを押して実行します。
<br />
<br />
<pre class="prettyprint">(env) $ google-oauthlib-tool --scope https://www.googleapis.com/auth/assistant-sdk-prototype --scope https://www.googleapis.com/auth/gcm --save --headless --client-secrets client_secret_XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.json
</pre>
なお、ファイル名の「XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」の部分は人により異なりますので、「XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」をそのままコピーしても正しい実行結果は得られませんので注意してください。
また、[TAB]キーを押したときにファイル名が補完されるのは、「サーバー側の準備」で、<br />
<ul>
<li>ファイルをDownloadsディレクトリに保存したこと</li>
<li>保存したファイルをDownloadsディレクトリからホームディレクトリに移動したこと</li>
</ul>
の二点が正しく行われたときのみですので良く確認してください。<br />
<br />
基本的に本ページの内容は一つでも正しく実行されていない項目があればうまくいかないとお考え下さい。<br />
<br />
さて、コマンドが正しく実行されると、下図のように、ブラウザでアクセスすべきアドレスが現れます(図を拡大表示して形式を良く観察してください)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLx6ToyIOBBr5F6mbOhwXUjbgdF6MVVb1Y6Pb7ArfqP0wSJWhpsVPgvmOJ7WukMmvJIC_UoCy-7g3QIymKNlO4IZWOb2xOXa_SRDKeK21GRRImvF4L8WQYIw7wQmj3c2NIh9NdJhXVBIE/s1600/assistant-new09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="170" data-original-width="780" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLx6ToyIOBBr5F6mbOhwXUjbgdF6MVVb1Y6Pb7ArfqP0wSJWhpsVPgvmOJ7WukMmvJIC_UoCy-7g3QIymKNlO4IZWOb2xOXa_SRDKeK21GRRImvF4L8WQYIw7wQmj3c2NIh9NdJhXVBIE/s640/assistant-new09.png" width="640" /></a></div>
<br />
このアドレスの部分(「https://」から「consent」まで)をマウスでなぞり、ターミナル上で「編集」→「コピー」を選択してコピーします(Ctrl-cでコピーしようとするとコマンドが終了してしまいますので注意しましょう)。<br />
<br />
そして、chromiumブラウザのアドレス欄にコピーされたアドレスを貼り付けてEnterし、ブラウザでページを移動します。<br />
<br />
すると、アカウントの選択が求められた後、さらに下図のようにブラウザ上にgatestからのリクエストが表示されますので、許可ボタンをクリックしてください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPst4Uf7LoiebwX1Au_28sexZ_GUqM4EB7viG28pFECUk8bluaigGG2S761kTcvzwH_OzTV0I7hQEGCtXdvupmSMbExjbSeYHPxavTaLuoKWwdcfLp45sRXh9QWABozB2-YOpYrsxCEdw/s1600/ga16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="511" data-original-width="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPst4Uf7LoiebwX1Au_28sexZ_GUqM4EB7viG28pFECUk8bluaigGG2S761kTcvzwH_OzTV0I7hQEGCtXdvupmSMbExjbSeYHPxavTaLuoKWwdcfLp45sRXh9QWABozB2-YOpYrsxCEdw/s1600/ga16.png" /></a></div>
<br />
すると、ブラウザで下記のように長いコードが表示されますので、マウスでなぞってCtrl-cでコピーしてください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGsSqB3vf0M66QKyO8Sv2AZO_i_B76bG7WSrWrTtqNJD5m0gBmZhIpSdquL8fLN6fxFzBe6AkAGnRaXbP1rX95LjJmEn_ZY7iEtLBsSY2A9hHclzuHNX91nwQBMP1vZFUZH5s1RtvL-zA/s1600/ga17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="152" data-original-width="558" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGsSqB3vf0M66QKyO8Sv2AZO_i_B76bG7WSrWrTtqNJD5m0gBmZhIpSdquL8fLN6fxFzBe6AkAGnRaXbP1rX95LjJmEn_ZY7iEtLBsSY2A9hHclzuHNX91nwQBMP1vZFUZH5s1RtvL-zA/s1600/ga17.png" /></a></div>
<br />
そして、先ほどのターミナルに戻り、「編集」→「貼り付け」で貼り付け、Enterキーを押します。<br />
<br />
すると、下図のように「credentials saved: /home/pi/.config/google-oauthlib-tool/credentials.json」と表示されて処理が完了します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijHWcQVmol2xI7FaL9We9nmzQGUJMqpA-7nQdRQbX_sI743rAbQXwMRyY8sIuOjf3sZAgLKKNZcoCyt3Xkgabqmb7L5HVk8taMvj49gdzCCkEApRVI6ah1VAzpVfOYYgcF5rF_L0hi1uw/s1600/assistant-new10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="214" data-original-width="780" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijHWcQVmol2xI7FaL9We9nmzQGUJMqpA-7nQdRQbX_sI743rAbQXwMRyY8sIuOjf3sZAgLKKNZcoCyt3Xkgabqmb7L5HVk8taMvj49gdzCCkEApRVI6ah1VAzpVfOYYgcF5rF_L0hi1uw/s640/assistant-new10.png" width="640" /></a></div>
<br />
<h3>
7. 動作確認</h3>
以上で動作確認を行う準備が整いました。
<!--
サンプルを実行してマイクに話しかけてみます。ただし、コマンドの実行にはいくつか注意があります。<br />
<br />
下記のコマンドを実行するのですが、この中の2つの斜体部「<i>project-id</i>」と「<i>model-id</i>」を上でメモした、皆さんのProject IDとModel IDで置き換えて実行してください。<br />
<pre class="prettyprint">(env) $ googlesamples-assistant-hotword --project_id <i>project-id</i> --device_model_id <i>model-id</i>
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG-ZzvBszHJa2f7IUH9IZ7Up23Idtdzzsov42zk3vLwmTzlcuMMPMqoIBKg9FWm-4CE8LhOFeR9RMUlL0nfYhQr-Adcx7Ol0u6Ba4WePBqUp7rHB4pyDLxSJVUTbynrn1zwCe2ckLiLeQ/s1600/assistant-new11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="325" data-original-width="642" height="323" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG-ZzvBszHJa2f7IUH9IZ7Up23Idtdzzsov42zk3vLwmTzlcuMMPMqoIBKg9FWm-4CE8LhOFeR9RMUlL0nfYhQr-Adcx7Ol0u6Ba4WePBqUp7rHB4pyDLxSJVUTbynrn1zwCe2ckLiLeQ/s640/assistant-new11.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
実行したら、マイクに向かって「オーケー グーグル」と話しかけてください。<br />
<br />
認識されれば上図のように「ON_CONVERSATION_TURN_STARTED」と表示されますので、そのまま「今何時?」や「今日の天気」などと話しかけてみてください。スピーカーから返答が出力されるはずです。<br />
<br />
なお、AndroidスマートフォンやiPhoneなどをお持ちの場合、Googleのアプリケーションで「設定」→「設定」→「Assistant SDK light」とたどり、以下のように「アカウントに基づく情報」をオンにすると、「私は誰?」や「今日の予定」など、アカウントの個人情報に基づく質問にも答えてくれるようになります。なお、Googleのアプリケーションは、<a href="https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox" target="_blank">Android用</a>と<a href="https://itunes.apple.com/jp/app/id284815942" target="_blank">iPhone/iPad用</a>があります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeJyExmnM_mCn5IqRHgZnCx3tLQ2Umt-kqP8rtcyoegjbniTn6SEaGowZ5CgSREzf9tZzmSMyPQmxo7ut3iETsTxY4ZFdZKtDGgYa0LTNJ6pJ3urQVh5N9EZXCzzgfLr1W61QzLZkqhao/s1600/assistant-new12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="800" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeJyExmnM_mCn5IqRHgZnCx3tLQ2Umt-kqP8rtcyoegjbniTn6SEaGowZ5CgSREzf9tZzmSMyPQmxo7ut3iETsTxY4ZFdZKtDGgYa0LTNJ6pJ3urQVh5N9EZXCzzgfLr1W61QzLZkqhao/s640/assistant-new12.png" width="320" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgOozUckl_gpQWLyId9QcXMMZ-nVy2fN1tHxZScq8Aac5M7IgNC4ttSkXgjkPPHU-42mgPtNY18TKeuBh-jcjxGbNZnrlMkbQYHnRgErS7LuXJ7WwUPx-M4whL-ReNd3vi9WniLmxhzE/s1600/assistant-new13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="800" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgOozUckl_gpQWLyId9QcXMMZ-nVy2fN1tHxZScq8Aac5M7IgNC4ttSkXgjkPPHU-42mgPtNY18TKeuBh-jcjxGbNZnrlMkbQYHnRgErS7LuXJ7WwUPx-M4whL-ReNd3vi9WniLmxhzE/s640/assistant-new13.png" width="320" /></a></div>
<br />
<br />
最後に、このサンプルプログラムを終了するには、キーボードでCtrlキーを押しながらcキーを押してください(Ctrl-cといいます)。
<br />
<br />
<h3>
8. ここまでの話の整理</h3>
以上で長い設定が終わりました。<br />
<br />
一旦ここまでの設定が終わると、以後はターミナルを起動して下記の手順に従うことで、Google Assistantを試すことができます。
<br />
<ul>
<li>コマンド「source env/bin/activate」で仮想環境に入る</li>
<li>コマンド「googlesamples-assistant-hotword --project_id <i>project-id</i> --device_model_id <i>model-id</i>」を実行してからマイクに話しかける(斜体部は人により異なる)。終了はCtrl-c。</li>
</ul>
この基本に手を加え、「話しかけた後に何がアクションが起こる」という動作を実現するのが次の目標です。<br />
<br />
そこで、まず上記の「googlesamples-assistant-hotword」コマンドを別コマンドで実行する方法を学びましょう。<br />
<br />
ターミナルを新たに起動して仮想環境に入り、以下のコマンドを実行してみましょう。4つ目のコマンドを実行すると、googlesamples-assistant-hotwordと同じように、Gogole Assistantが音声を待ち受ける状態になります。これまで通り斜体部は皆さんのProject IDとModel IDで置き換えて実行してください。
<br />
<pre class="prettyprint">$ source env/bin/activate
(env) $ git clone https://github.com/googlesamples/assistant-sdk-python==1.0.0
(env) $ cp assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/library/hotword.py .
(env) $ python hotword.py --project_id <i>project-id</i> --device_model_id <i>model-id</i>
</pre>
2つめのコマンドではGoogle Assistant SDKのPython用のサンプルファイルをダウンロードしています。<br />
3つめのコマンドでは、その中のディレクトリに含まれる「hotword.py」というファイルをカレントディレクトリ (.) にコピーしています。<br />
そして、4つめのコマンドでコピーしたプログラムhotword.pyを実行することで、音声の待ち受けが始まりますので、マイクで話しかけることができます。終了はいつも通りCtrl-cです。<br />
<br />
このhotword.pyの内容を理解して編集することで、プログラムの挙動を自分好みのものにしよう、というのが以下で行うことです。<br />
<br />
<h3>
9. 音声でのテレビの操作</h3>
それでは、hotword.pyに手を加えテレビを操作できるように変更したファイルcontrolTV-ga.pyをダウンロードして実行してみましょう。<br />
<br />
ダウンロードは下記のように行います。ホームディレクトリでダウンロードするという前提で記しています。なお、ダウンロード自体は通常環境で行っても仮想環境で行っても構いません。
<br />
-->
まず、動作確認および音声認識用のファイルをダウンロードします。ダウンロードは通常環境と仮想環境のどちらで行っても構いません。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/controlTV-ga.py
</pre>
次に、動作確認を行います。もしこの時点でPythonの仮想環境に入っていなければ、次のコマンドで仮想環境に入ります。
<br />
<pre class="prettyprint">$ source env/bin/activate
</pre>
そして、実行すべきコマンドは下記になります。斜体部は上で確認した皆さんのProject IDとModel IDで置き換えて実行してください。
<br />
<pre class="prettyprint">$(env) $ python controlTV-ga.py --project_id <i>project-id</i> --device_model_id <i>model-id</i>
</pre>
実行したら、マイクに向かって「オーケー グーグル」と話しかけてください。
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT8YKsAOplgjJ-1JpwwOjelG1qJwCjiM0qfTUqzKpyFYwQDKCmZ1jzhtKXgvmz67c_KZgRoeq54PSDU4EsQLBoGDuP3G4AvRA97HJUcB6K-VzW4UMV6-BUb4CBtHEFI3Cph-qerm-ZB8Q/s1600/controlTV-snap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="449" data-original-width="659" height="436" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT8YKsAOplgjJ-1JpwwOjelG1qJwCjiM0qfTUqzKpyFYwQDKCmZ1jzhtKXgvmz67c_KZgRoeq54PSDU4EsQLBoGDuP3G4AvRA97HJUcB6K-VzW4UMV6-BUb4CBtHEFI3Cph-qerm-ZB8Q/s640/controlTV-snap.png" width="640" /></a></div>
<br />
認識されれば上図のように「ON_CONVERSATION_TURN_STARTED」と表示されますので、そのまま「今何時?」などと話しかけてみてください。スピーカーから返答が出力されるはずです。<br />
<br />
なお、AndroidスマートフォンやiPhoneなどをお持ちの場合、Googleのアプリケーションで「設定」→「設定」→「Assistant SDK light」とたどり、以下のように「アカウントに基づく情報」をオンにすると、「私は誰?」や「今日の予定」など、アカウントの個人情報に基づく質問にも答えてくれるようになります。なお、Googleのアプリケーションは、<a href="https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox" target="_blank">Android用</a>と<a href="https://itunes.apple.com/jp/app/id284815942" target="_blank">iPhone/iPad用</a>があります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeJyExmnM_mCn5IqRHgZnCx3tLQ2Umt-kqP8rtcyoegjbniTn6SEaGowZ5CgSREzf9tZzmSMyPQmxo7ut3iETsTxY4ZFdZKtDGgYa0LTNJ6pJ3urQVh5N9EZXCzzgfLr1W61QzLZkqhao/s1600/assistant-new12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="800" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeJyExmnM_mCn5IqRHgZnCx3tLQ2Umt-kqP8rtcyoegjbniTn6SEaGowZ5CgSREzf9tZzmSMyPQmxo7ut3iETsTxY4ZFdZKtDGgYa0LTNJ6pJ3urQVh5N9EZXCzzgfLr1W61QzLZkqhao/s640/assistant-new12.png" width="320" /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgOozUckl_gpQWLyId9QcXMMZ-nVy2fN1tHxZScq8Aac5M7IgNC4ttSkXgjkPPHU-42mgPtNY18TKeuBh-jcjxGbNZnrlMkbQYHnRgErS7LuXJ7WwUPx-M4whL-ReNd3vi9WniLmxhzE/s1600/assistant-new13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="800" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgOozUckl_gpQWLyId9QcXMMZ-nVy2fN1tHxZScq8Aac5M7IgNC4ttSkXgjkPPHU-42mgPtNY18TKeuBh-jcjxGbNZnrlMkbQYHnRgErS7LuXJ7WwUPx-M4whL-ReNd3vi9WniLmxhzE/s640/assistant-new13.png" width="320" /></a></div>
<br />
<br />
最後に、このサンプルプログラムを終了するには、キーボードでCtrlキーを押しながらcキーを押してください(Ctrl-cといいます)。
<br />
<br />
<h3>
8. 音声でのテレビの操作</h3>
この状態で、冒頭の動画のように「オーケーグーグル、テレビつけて」などとマイクに話かけると、
テレビをオンにする信号赤外線LEDより出力される、という流れです。
<br />
<br />
ダウンロードしたプログラム controlTV-ga.py のうち、テレビの操作に関わる部分を一部抜きだしたのが以下の部分になります。
<br />
<pre class="prettyprint"> if event.type == EventType.ON_RECOGNIZING_SPEECH_FINISHED:
s = event.args['text']
print(s)
if 'テレビ' in s and ('つけて' in s or 'オン' in s):
args = ['irsend', '-#', '1', 'SEND_ONCE', 'TV', 'power']
try:
subprocess.Popen(args)
except OSError:
print('command not found.')
assistant.stop_conversation()
elif 'テレビ' in s and ('消して' in s or 'オフ' in s):
args = ['irsend', '-#', '1', 'SEND_ONCE', 'TV', 'power']
try:
subprocess.Popen(args)
except OSError:
print('command not found.')
assistant.stop_conversation()
elif 'NHK 教育' in s or 'Eテレ' in s:
args = ['irsend', '-#', '1', 'SEND_ONCE', 'TV', 'ch2']
try:
subprocess.Popen(args)
except OSError:
print('command not found.')
assistant.stop_conversation()
</pre>
少し解説しましょう。
<br />
<br />
この部分は、「オーケーグーグル」と話しかけた後に発した言葉が「Google Assistant API」により音声認識された後の処理を表しています。「s」という変数に音声認識結果が格納されています。<br />
<br />
そこで、「if 'テレビ' in s」と書くと、「文字列 s に'テレビ'という語句が含まれていたら」という条件となります。<br />
<br />
さらに、and (なおかつ)、or (または)を組み合わせて条件を作成しています。<br />
<br />
結果的に「'テレビ' in s and ('つけて' in s or 'オン' in s)」という条件で、<br />
「sに’テレビ'と'つけて'が含まれている場合」または「sに’テレビ'と'オン'が含まれている場合」にテレビの電源がつくという動作になります。<br />
条件文を作る際のカッコ「()」の使い方にも注意しましょう。<br />
<br />
なお、テレビの電源を入れるための信号は、「irsend -# 1 SEND_ONCE TV power」という命令を実行することで行っています。この命令を有効にする方法は本書5章で解説されていますので、参照してください。赤外線LEDを用いた回路の作成方法も解説しています。<br />
<br />
それらの準備を済ませると、冒頭の動画のように音声に応じてテレビを操作することができます。<br />
<br />
なお、音声認識の結果に基づいてテレビを操作した後、「assistant.stop_conversation()」という命令を実行してGoogle Assistantとの会話をそこで打ち切っています。そうしないと、テレビへの命令を受け付けるたびにGoogle Assistantが「申し訳ありません、お役に立てそうにありません」と音声を発してしまうためです。<br />
<br />
<h3>
9. Google Assistantでのテレビ操作についての注意</h3>
以上のように、Google Assistantによる音声認識結果を直接if文で判定させることでテレビの制御を行いました。<br />
<br />
実は、Google Assistantには、家電などのオンオフを制御する公式な方法があります。例えば、<a href="https://developers.google.com/assistant/sdk/guides/library/python/extend/install-hardware" target="_blank">こちらのページ</a>ではRaspberry Piに接続したLEDをオンオフする方法が解説されています。<br />
<br />
しかし、この方法を用いてテレビのチャンネルを変える方法が思いつかなかったので、本ページでは音声認識結果を直接if文で判定する方法を取りました。<br />
<br />
<h3>
10. 仮想環境上のPythonを利用する際の注意</h3>
なお、本ページではGoogle Assistant SDKの公式ページで行われているのに合わせ、Python3の仮想環境を作成してその上でプログラムを実行しました。<br />
<br />
この方法を用いると、デフォルトでは電子工作用のライブラリを用いることができません。本書ではGPIOにアクセスするためにRPi.GPIOというライブラリを用いましたが、そのままではそれを利用することができないのです。<br />
<br />
既存ライブラリをPythonの仮想環境でも利用可能にするには、設定が必要です。<br />
設定ファイル /home/pi/env/pyvenv.cfg 内にある
<br />
<pre class="prettyprint">include-system-site-packages = false
</pre>
という行を
<br />
<pre class="prettyprint">include-system-site-packages = true
</pre>
に変更して保存すると、既存ライブラリが仮想環境でも利用可能になります。
<br />
<br />
<h3>
11. Google Assistant APIの利用制限について</h3>
Google Assistant APIは無制限に使えるわけではなく、
<br />
<ul>
<li>1日当たり500リクエスト</li>
<li>100秒当たり100リクエスト</li>
</ul>
という制限があります。ですから、何度も会話をしているとその制限を超え、結果が返ってこないことがあり得ます。
<br />
<br />
どの程度Google Assistant APIを利用しているかを確認する方法を以下に記します。<br />
<br />
「<a href="https://console.cloud.google.com/cloud-resource-manager" target="_blank">リソースの管理</a>」ページに行き、プロジェクト名をクリックします。
現れるページの左のカラムで「割り当て」をクリックします。
そして、現れた右の表示エリアで「Google Assistant API」を見つけてクリックすると、利用状況のグラフを見ることができます。
<br />
<br />
「太平洋時間(PT)の午前 0 時にリセット」と書かれておりますので、 その時間が過ぎればリクエスト数がリセットされてまた利用可能になるはずです。<br />
<br />
<h3>
13. Raspberry Pi起動時にプログラムを自動起動する</h3>
ここで紹介したcontrolTV-ga.pyは、実行するためのコマンドがやや複雑でした。<br />
<br />
このコマンドをシンプルに実行できるようにし、さらにRaspberry Pi起動時に自動で実行する方法を解説します。<br />
<br />
まず、コマンドをシンプルにする方法です。ターミナルを起動し、以下の2つのコマンドを順に実行しましょう。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/start-assistant.sh
$ chmod 755 start-assistant.sh
</pre>
以後実行するのはstart-assistant.shというコマンドになるのですが、その前にこのファイルの中身を編集する必要があります。まず、下記のコマンドを実行することでテキストエディタleafpadでstart-assistant.shを編集用に開きます。<br />
<pre class="prettyprint">$ leafpad start-assistant.sh
</pre>
このファイルの中身は下記のようになっています。
<br />
<pre class="prettyprint">#!/bin/bash
source /home/pi/env/bin/activate
# set if you are inside firewall
#export http_proxy=http://(proxy server):(port)/
#export https_proxy=http://(proxy server):(port)/
#export ftp_proxy=http://(proxy server):(port)/
python /home/pi/controlTV-ga.py --project_id gatest-xxxxx --device_model_id gatest-xxxxx-assistant-sdk-light-xxxxxx
</pre>
この最後の行の「gatest-xxxxx」と「gatest-xxxxx-assistant-sdk-light-xxxxxx」の部分を皆さんが使っているモデルのIDに変更してください。この行が、いつも実行しているcontrolTV-ga.pyを実行しているコマンドが記されていることはわかるでしょう。<br />
さらに、controlTV-ga.pyの位置がユーザpiのホームディレクトリ (/home/pi) であることを前提とされていることにも注意してください。
<br />
変更が終わったら、ファイルを上書き保存してleafpadを閉じましょう。
<br />
その後ターミナルを起動して、下記のコマンドを実行しましょう。これは仮想環境に入らずに実行して構いません。このファイル内部で仮想環境の利用設定とcontrolTV-ga.pyの実行が両方行われるので、プログラムの実行が容易になるというわけです。
<br />
<pre class="prettyprint">$ ./start-assistant.sh
</pre>
ここまでが実現できたら、Raspberry Pi起動時の自動実行が下記のように実現されます。
<br />
まず、下記のコマンドを実行してください。必要なファイルをダウンロードし、適切な場所に配置しています。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/assistant.service
$ sudo mv assistant.service /etc/systemd/system
</pre>
その後、下記のコマンドを実行すると、再起動時にcontrolTV-ga.pyが自動で起動します(ターミナルの表示がないのでわかりにくいですが…)。
<br />
<pre class="prettyprint">$ sudo systemctl enable assistant</pre>
上記の動画では、Raspberry Pi本体にキーボードとマウスが取り付けられていませんが、これはこの自動起動が行われていたからです。<br />
<br />
自動起動を無効にするには下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ sudo systemctl disable assistant
</pre>
<br />
<br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com9tag:blogger.com,1999:blog-1299465193942557222.post-51730793814145743362017-03-20T20:20:00.003+09:002021-11-30T17:02:01.900+09:00Raspberry Pi + Open JTalkによる音声合成で天気予報付き温度計に喋らせる<h3>
0. はじめに
</h3>
前回の記事「<a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a>」では、Raspberry Piで音声認識を行いました。<br />
<br />
今回はその逆、ということで音声合成を行ってみましょう。音声合成システムとしては<a href="http://open-jtalk.sourceforge.net/" target="_blank">Open JTalk</a>を用います。<br />
<br />
題材としては、本書第4章で作成した「天気予報付き温度計」に、「現在〇〇度」や「今日(明日)の天気は○○」のように音声合成により話す機能を追加してみます。<br />
<br />
作成した「喋る天気予報付き温度計」の様子は下図のようになります。見やすいよう大きいLCDを使っていますが、回路自体は書籍第4章とほぼ同じです。唯一異なるのが、温度計に喋らせるためのタクトスイッチを1つ追加した点です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfAwhiDRwVFmJSX7IO83Q6bsVc6g2-6Fc86ozhLiS6yONj4mhzmcPxb8MZ_SzdkE-jFBBuNRJFfZunwUiaBo2ulssdOK5M70PfgRDZSIPAFype4fAbBEvdo6cGABBQGP525gX9pGeeYUM/s1600/openjtalk2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="476" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfAwhiDRwVFmJSX7IO83Q6bsVc6g2-6Fc86ozhLiS6yONj4mhzmcPxb8MZ_SzdkE-jFBBuNRJFfZunwUiaBo2ulssdOK5M70PfgRDZSIPAFype4fAbBEvdo6cGABBQGP525gX9pGeeYUM/s640/openjtalk2.jpg" width="640" /></a></div>
<div style="text-align: center;">
喋る天気予報付き温度計</div>
<br />
この喋る天気予報付温度計の動作の様子を示したのが下記の動画です。温度計以外にも、音声認識と組み合わせて「音声認識の結果をそのままオウム返しで喋る」というデモンストレーションの様子も示しています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/CdGqGRgEvjc?rel=0" width="420"></iframe>
</div>
<br />
<br />
<h3>
1. Raspberry Piでのスピーカー(イヤフォン)の利用
</h3>
まずはRaspberry Piで音を鳴らせるようにしましょう。主に下記の3つの方法があります。<br />
<ol>
<li>Raspberry Pi本体のミニジャックにスピーカーやイヤフォンを接続する方法</li>
<li>Raspberry PiとつながったHDMIディスプレイにスピーカーやイヤフォンを接続する方法</li>
<li>USB接続のサウンドカードを利用する方法</li>
</ol>
このうち、Raspberry Pi本体のミニジャックから音声を出力したい方は、OSのバージョンによって異なる設定が必要です。<br />
2020-12-02以降の Raspberry Pi OS をお使いの方は、下記の設定によりミニジャックによる音声出力を設定してください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
<ol>
<li>ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く</li>
<li>キーボードの「Enter」キーを押し、「1 System Options」に入る</li>
<li>キーボードの「↓」キーを一回押し、「S2 Audio」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「S2 Audio」の設定画面に入る</li>
<li>キーボードの「↓」キーを一回押し、「1 Headphones」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「1 Headphones」を選択する</li>
<li>キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、raspi-config の設定画面を終了する</li>
</ol>
また、ミニジャックを利用したい方で 2020年2月までの Raspbian をお使いの方は、
ターミナルを起動して以下コマンドを実行してミニジャックを有効にしておきましょう。その他の場合の方はここでは何もせず先に進みます。
<br />
<pre class="prettyprint">$ amixer cset numid=3 1
</pre>
<br />
なお、USB接続のサウンドカードとしては以下の3種のみ動作確認をしました。
<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B06XZY8JTZ/" target="_blank">Creative Sound Blaster Play!3 SB-PLAY3</a></li>
<li><a href="https://www.amazon.co.jp/dp/B00JIT6L4S/" target="_blank">Creative Sound Blaster Play!2 SB-PLAY2</a></li>
<li><a href="https://www.amazon.co.jp/dp/B001BKTIFQ/" target="_blank">Creative Sound Blaster Play! SB-PLAY</a></li>
</ul>
<br />
<h3>
2. Open JTalkのインストール
</h3>
まず音声合成システムOpen JTalkのインストール方法を紹介します。<br />
<br />
ターミナルを起動して下記のコマンドを順に実行し、必要なソフトウェアをネットワークからインストールします。もちろんRaspberry Piがインターネットに接続されている必要があります。
<br />
<pre class="prettyprint">$ sudo apt update
$ sudo apt install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
</pre>
2 つ目のコマンド実行後に「続行しますか? [y/n]」などと聞かれた場合は、キーボードで「y」をタイプしてEnterキーを押して下さい。これらのインストールにより、「男性の声」での音声合成が可能になります。<br />
<br />
さらに、女性の声で音声合成する際に必要になるファイルもインストールしておきましょう。<a href="https://ja.osdn.net/projects/sfnet_mmdagent/releases/" target="_blank">こちら</a>より、MMDAgent_Example-1.8.zipをブラウザでダウンロードしておきます。バージョンが新しくなっている場合、新しいもののダウンロードで問題ないと思います。 ダウンロードされたファイルはDownloadsディレクトリ(フォルダ)(/home/pi/Downloads)に格納されますので、本書p.322の図A-1のようにファイルマネージャを用いてユーザーpiのホーム(/home/pi)に移動しましょう。
<br />
その後、ターミナルで下記のコマンドを順に実行します。なお、MMDAgentの新しいバージョンがダウンロードされた場合、バージョン番号の部分(「1.8」)を適切に読み替えてください。<br />
<pre class="prettyprint">$ unzip MMDAgent_Example-1.8.zip
$ sudo cp -r MMDAgent_Example-1.8/Voice/mei /usr/share/hts-voice/
</pre>
<br />
最後に、実際にOpen JTalkを呼び出して発話をさせるプログラム (スクリプトといいます) をダウンロードして実行可能にしましょう。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/speech.sh
$ chmod a+x speech.sh
$ sudo mv speech.sh /usr/local/bin
</pre>
以上でRaspberry Piに音声合成させるためのソフトウェアの準備ができました。
<br />
<br />
<h3>
3. Open JTalkの動作確認
</h3>
Open JTalkで音声合成を行う際、USB接続のサウンドカードを用いていないならば、そのまま実行が可能です。ターミナルを起動し、例えば下記のようなコマンドを実行します。<br />
<pre class="prettyprint">$ speech.sh ラズベリーパイ
</pre>
「ラズベリーパイ」の部分は前回の記事「<a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a>」でインストールしたMozcにより日本語入力を行い実現します。
うまくいけば、男性の声で「ラズベリーパイ」と発声されます。想像がつくように、「ラズベリーパイ」の部分を変更すれば、合成される音声もかわりますので試してみて下さい。また、音声の指示に半角空白を含ませたい場合、「speech.sh 'ラズベリー パイ'」のように「'」でくくる必要があります。
<br /><br />
なお、ここまでで音が正しく鳴るのは以下の2つの方法のどちらかで音声を聞いているでしょう。
<ul>
<li>Raspberry Pi本体のミニジャックにスピーカーやイヤフォンを接続する方法(2020年2月までのOSをご利用の場合)</li>
<li>Raspberry PiとつながったHDMIディスプレイにスピーカーやイヤフォンを接続する方法(OSのバージョンによらない)</li>
</ul>
それ以外の方法を用いている方は、プログラム実行前にプログラムの変更が必要です。ターミナルを起動し、実行スクリプトを編集用に管理者権限のleafpadで開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /usr/local/bin/speech.sh
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ sudo mousepad /usr/local/bin/speech.sh
</pre>
その中で下記の部分を見つけてください。
<br />
<pre class="prettyprint"># for the device on Raspberry Pi
aplay -q $TMPVOICE
# for USB sound card (old Raspbian)
# or earphone jack on Raspberrry Pi (Raspberry Pi OS 2020-05-27 or later)
#aplay -D plughw:1,0 -q $TMPVOICE
# for USB sound card (Raspberry Pi OS 2020-05-27 or later)
#aplay -D plughw:2,0 -q $TMPVOICE
</pre>
「aplay」と書かれた行が3行ありますが、1つめが有効になっており、2つ目と3つ目は先頭に「#」があるため無効になっています。
<br /><br />
ここで、「Raspberry Pi本体のミニジャックにスピーカーやイヤフォンを接続する方法(2020年5月以降のOSをご利用の場合)」および
「USB接続のサウンドカードを利用する方法(2020年2月までのOSをご利用の場合)」
を用いている場合は、
下記のように2番目のaplayのみを有効に変更してください。
<br />
<pre class="prettyprint"># for the device on Raspberry Pi
#aplay -q $TMPVOICE
# for USB sound card (old Raspbian)
# or earphone jack on Raspberrry Pi (Raspberry Pi OS 2020-05-27 or later)
aplay -D plughw:1,0 -q $TMPVOICE
# for USB sound card (Raspberry Pi OS 2020-05-27 or later)
#aplay -D plughw:2,0 -q $TMPVOICE
</pre>
すなわち、1つ目のaplayに「#」をつけて無効化し、2つ目のaplayから「#」を削除して有効化するわけです。「#」は半角文字で記述しましょう。
<br /><br />
また、「USB接続のサウンドカードを利用する方法(2020年5月以降のOSをご利用の場合)」を用いている場合は、
下記のように3番目のaplayのみを有効に変更してください。
<br />
<pre class="prettyprint"># for the device on Raspberry Pi
#aplay -q $TMPVOICE
# for USB sound card (old Raspbian)
# or earphone jack on Raspberrry Pi (Raspberry Pi OS 2020-05-27 or later)
#aplay -D plughw:1,0 -q $TMPVOICE
# for USB sound card (Raspberry Pi OS 2020-05-27 or later)
aplay -D plughw:2,0 -q $TMPVOICE
</pre>
自分に該当する方法での編集が終わったらファイルを保存してleafpadを閉じて構いません。この編集が終わったら、 ターミナルで「speech.sh ラズベリーパイ」などと実行することで、それぞれの場合でも音声合成が行えるはずです。
<br />
<br />
なお、ボリュームの変更方法にもいくつかのパターンがあります。speech.sh を変更せずに済んだ方は、デスクトップの右上のアイコンでボリュームを変更できます。
<br /><br />
一方、「Raspberry Pi本体のミニジャックにスピーカーやイヤフォンを接続する方法(2020年5月以降のOSをご利用の場合)」を用いている方は、次のコマンドが使えます。「70%」の部分を0~100%で変化させて適切なボリュームを見つけてください。
<pre class="prettyprint">amixer -q -c1 cset numid=1 70%
</pre>
また、「USB接続のサウンドカードを利用する方法(2020年2月までのOSをご利用の場合)」、ターミナルで例えば下記のようなコマンドを実行します。「10」の部分は0%~100%で表されたボリュームなので、適切な数値で読み替えます。特にイヤフォンを用いている場合、小さな値から試すのが無難です。
<pre class="prettyprint">$ amixer -c 1 sset 'Speaker' 10
</pre>
最後に、「USB接続のサウンドカードを利用する方法(2020年5月以降のOSをご利用の場合)」、ターミナルで例えば下記のようなコマンドを実行します。「10」の部分は0%~100%で表されたボリュームなので、適切な数値で読み替えます。特にイヤフォンを用いている場合、小さな値から試すのが無難です。
<pre class="prettyprint">$ amixer -c 2 sset 'Speaker' 10
</pre>
<br />
<br />
<h3>
4. 音声の変更(お好みで)
</h3>
デフォルトでは男性の声で音声合成されますが、これを女性の声に変更したい場合は、下記の手順に従ってください。
まず、ターミナルで下記のコマンドを実行し、実行スクリプトspeech.shを編集用に管理者権限のleafpadで開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /usr/local/bin/speech.sh
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ sudo mousepad /usr/local/bin/speech.sh
</pre>
その中で、下記の「HTSVOICE」で始まる部分に着目しましょう。
<br />
<pre class="prettyprint">HTSVOICE=/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice
#HTSVOICE=/usr/share/hts-voice/mei/mei_happy.htsvoice
#HTSVOICE=/usr/share/hts-voice/mei/mei_angry.htsvoice
#HTSVOICE=/usr/share/hts-voice/mei/mei_bashful.htsvoice
#HTSVOICE=/usr/share/hts-voice/mei/mei_normal.htsvoice
#HTSVOICE=/usr/share/hts-voice/mei/mei_sad.htsvoice
</pre>
この部分では、音声合成する際に用いる音声を選択しています。先頭に「#」がついている行はコメント文となっており、無効な行です。「#」がついていない 1 行のみが有効となっており、これが男性の声だったというわけです。<br />
<br />
有効とする行を変更し(「#」のつかない有効な行を1行だけとする)、leafpadで保存してから、もう一度「speech.sh ラズベリーパイ」などと実行してみましょう。
<br />
その際、leafpadを起動したターミナルとは別に新たにターミナルを開いて実行するのが良いでしょう。声がかわるのが分かるはずです。なお、女性の声に変更するためには、インストール時にMMDAgent_Example-1.8.zipをダウンロードして、必要なファイルを適切な位置にコピーしていることが必要ですのでご注意ください。<br />
<br />
<h3>
5. 応用1:天気予報機能付き温度計に喋らせる
</h3>
さて、以上により、Open JTalkとそれを呼び出すスクリプトにより音声合成ができることがわかりました。あとはこの機能をどう活用するかですが、まずは本書第4章で作成した「天気予報付き温度計」に発話機能を追加してみましょう。対象となるのは、本書第4章でこの温度計を作成した方となります。温度計とLCDの両方がI2C通信を行うものを用いますので、I2Cがあらかじめ有効にされている必要があります。<br />
<br />
まず、必要な回路は下記のようになります。本書と同様にLCDとして横8文字x縦2文字のAQM0802を用いる場合は下図のようになります。GPIO 23に接続したタクトスイッチが一つ増えているだけです。ただし、最近はAQM0802を用いる際に、特殊な対処法が必要になることが多いです。本書補足ページ「<a href="https://raspibb2.blogspot.jp/2015/12/blog-post.html" target="_blank">本書発売後の追加情報</a>」の「完成品のLCDを購入しても認識されない場合の暫定的な対処法」をご覧ください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqnLWO4Kx14pjShslY_T-zfCQP8GvONWeFygNePLSD5gHKrBU8K-piHZ0FGwSSlBZNhE6wG0sPn0NptGFNr3wIpI6Xor2HVBLer7r8UFjf3OG4CGjMJh_Rr_RJrZsbI2alB-139IRbRl4/s1600/openjtalk-circuit1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqnLWO4Kx14pjShslY_T-zfCQP8GvONWeFygNePLSD5gHKrBU8K-piHZ0FGwSSlBZNhE6wG0sPn0NptGFNr3wIpI6Xor2HVBLer7r8UFjf3OG4CGjMJh_Rr_RJrZsbI2alB-139IRbRl4/s1600/openjtalk-circuit1.png" /></a></div>
<br />
また、同じく「<a href="https://raspibb2.blogspot.jp/2015/12/blog-post.html" target="_blank">本書発売後の追加情報</a>」の「4章全般:利用できるLCDについて」で紹介したストロベリーリナックスの横16文字x縦2文字のLCDを用いる場合の回路図はこちらです。LCDのピン配置が異なるだけで、基本的には同じ回路です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHh8KkLvPMqI_Mrjyz7jqJPbWXJYVoTYbdHyQKOo5oEdrrtfryZP9-jWq5u2aDEn2z67upu1W-xKtonGQdo0hbP51LGbPzblXEaRrfh6eeX-kPnTOlcdnZWPcVKSjKp-O3pYeo9AlsRCk/s1600/openjtalk-circuit2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHh8KkLvPMqI_Mrjyz7jqJPbWXJYVoTYbdHyQKOo5oEdrrtfryZP9-jWq5u2aDEn2z67upu1W-xKtonGQdo0hbP51LGbPzblXEaRrfh6eeX-kPnTOlcdnZWPcVKSjKp-O3pYeo9AlsRCk/s640/openjtalk-circuit2.png" width="640" /></a></div>
<br />
これらの回路を動かすためのプログラムをダウンロードするため、ターミナルで下記のコマンドを実行してください。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/speech-weather.py
</pre>
このプログラムは、書籍と同じくLCDとしてAQM0802を用いる場合のプログラムとなっています。
ストロベリーリナックスの横16文字x縦2文字のLCDを用いる場合、プログラムを少し変更する必要があります。そのためには、このプログラムを編集用にleafpadで開きます。ターミナルで下記のコマンドを実行しましょう。
<br />
<pre class="prettyprint">$ leafpad speech-weather.py
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ mousepad speech-weather.py
</pre>
プログラム中で、211行目にある下記の部分に着目します。横16文字のLCDを用いる場合はこのうちchars_per_lineの数値を8から16に変更してください。また、contrastの値は、文字が薄い場合に40程度に変更してください。変更が終わったら保存してleafpadを閉じて構いません。
<br />
<pre class="prettyprint">contrast = 32 # 0から63のコントラスト。通常は32、文字が薄いときは40を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
</pre>
さて、プログラムを実行するには、ターミナル上で、プログラムspeech-weatherがあるディレクトリ(フォルダ)にて下記のコマンドを実行します。Python3 のみサポートしています。
<br />
<pre class="prettyprint">$ python3 speech-weather.py
</pre>
ただし、
「<a href="https://raspibb2.blogspot.com/2021/11/openweatherlcd.html" target="_balnk">OpenWeatherの天気予報データをLCDに表示する</a>」にもとづき、123行目の API_KEY の部分を、自分の API Key に置き換える必要があります。
<pre class="prettyprint">key = 'API_KEY'
</pre>
適切に動作すると、冒頭の動画のように「左のタクトスイッチで温度計のモード切替」、「右のタクトスイッチで音声合成」が実現されるはずです。<br />
<br />
このプログラム中で動作のポイントとなっているのは、81行目から始まる下記の部分です。modeというのは温度計の4つのモードを決める変数なのですが、その値に応じて、話す内容を場合分けしているのが見て取れます。
<br />
<pre class="prettyprint"> elif channel==23:
if mode==0:
s = '今日の天気は'+weather_kanji
args = ['speech.sh', s]
try:
subprocess.Popen(args)
except OSError:
print('no speech.sh')
elif mode==1 or mode==3:
s = '現在'+'{0:.1f}'.format(temperature)+'度'
args = ['speech.sh', s]
try:
subprocess.Popen(args)
except OSError:
print('no speech.sh')
elif mode==2:
s = '明日の天気は'+weather2_kanji
args = ['speech.sh', s]
try:
subprocess.Popen(args)
except OSError:
print('no speech.sh')
</pre>
<br />
<br />
<h3>
6. 応用2:音声認識と組み合わせてオウム返しで喋らせる
</h3>
最後に、音声認識と組み合わせ、音声認識の結果をオウム返しで喋る、という例を試してみましょう。こちらも冒頭の動画にて例示されていましたね。
この例は音声認識にかなりの計算パワーを必要としますので、Raspberry Pi 3を用いることを推奨します。Raspberry Pi 3を用いても、認識から発声まで5秒程度の時間がかかることがあることが動画から見て取れるでしょう。
さらに、ここから先の内容は「<a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a>」を一通り終えた方を対象とします。<br />
<br />
まず、音声認識を行う上で、どの辞書を用いるかに注意しておきましょう。「<a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-julius-lirc.html" target="_blank">Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する</a>」を終えた状態では「テレビ操作用の辞書」を用いる設定になっています。
一方、冒頭の動画では「Juliusのディクテーションキットのデフォルトの辞書」を用いました。どの辞書を用いても実行は可能ですが、もしデフォルトの辞書に戻したいならば、まずターミナルを起動して下記のように設定ファイルをleafpadで編集用に開きます。
<br />
<pre class="prettyprint">$ leafpad dictation-kit-v4.4/main.jconf
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ mousepad dictation-kit-v4.4/main.jconf
</pre>
この中で、辞書選択部分を下記のように「model/lang_m/bccwj.60k.htkdic」を用いるようにするのでした(先頭に「#」がない行のみが有効です)。
<br />
<pre class="prettyprint">## 単語辞書ファイル
##
-v model/lang_m/bccwj.60k.htkdic
#-v ../remocon.dic
</pre>
編集が終わったら保存してleafpadを閉じます。これにより、デフォルトの辞書が用いられるようになりました(ちなみに、自分でカスタマイズした辞書の方が単語数が少ないので認識速度は速いです)。<br />
<br />
次に、必要なプログラムをダウンロードするため、ターミナルを起動して下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/recog-speech.py
</pre>
このプログラムを実行するためには、事前に音声認識エンジンJuliusをモジュールモードで起動しておく必要があります。
そのためには、ターミナルを起動して下記のコマンドを実行するのでした。
<br />
<pre class="prettyprint">$ julius -C dictation-kit-v4.4/main.jconf -C dictation-kit-v4.4/am-gmm.jconf -demo -module
</pre>
その状態で、もう一枚別のターミナルを起動し、その上で下記のコマンドでプログラムを実行します。
<br />
<pre class="prettyprint">$ python recog-speech.py
</pre>
あとはマイクに向かって話せば冒頭の動画のような動作が実現します。動画にも注釈がありますが、音声合成の結果の音声をマイクが拾わないように注意してください。そうしないと、「認識」→「合成」→「認識」→「合成」→…が無限に繰り返されます(この現象の原因に気づくまでちょっと悩みました)
<br />
<br />
さて、このプログラムrecog-speech.pyのポイントは、38行目から始まる下記の部分です。
認識された語は「''」→「語1」→「語2」→…「語n」→「'。'」という順で届くのですが、これをひとまとめに
「語1語2…語n。」と結合してからspeech.shに渡しています。
<br />
<pre class="prettyprint"># 認識された単語wordの中に、u('...') という文字列が含まれるかどうかを
# チェックし、文字列に応じたアクションを記述します。
# u('...')でくくるのは、python2とpython3の互換性を保つためです。
if word != u(''):
recognized_word += word
if u('。') in word:
print(recognized_word)
args = ['speech.sh', recognized_word]
subprocess.Popen(args).wait()
recognized_word = u('')
</pre>
以上、お疲れさまでした。Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com1tag:blogger.com,1999:blog-1299465193942557222.post-83554494496344019502017-03-15T18:03:00.001+09:002020-12-09T14:36:43.115+09:00Raspberry Pi + Julius + LIRC により家電製品を音声認識で操作する<h3>
0. はじめに</h3>
本書の第5章において、LIRC(Linux Infrared Remote Control) というソフトウェアを用いてRaspberry Piをテレビなどの家電製品のリモコンにする方法を紹介しました。<br />
<br />
さらに、本ページの追加コンテンツ「<a href="https://raspibb2.blogspot.jp/2016/06/raspberry-pilirc.html" target="_blank">Raspberry Pi上のLIRCでエアコンを操作する</a>」において、書籍では触れられなかったエアコンの操作方法も紹介しました。<br />
<br />
これらにおいて、家電製品へ命令を送信する方法として下記の3つを用いました。<br />
<ol>
<li>ターミナル上でのirsendコマンドによる送信</li>
<li>タクトスイッチによる送信</li>
<li>WebIOPiによるブラウザ経由の送信</li>
</ol>
本ページではこれらの3つに加え、「音声による命令の送信」の方法を紹介します。音声認識のためには音声認識エンジンである<a href="http://julius.osdn.jp/" target="_blank">Julius</a>を用います。<br />
<br />
応用的なコンテンツとなりますので、本書第5章の「ターミナル上でのirsendコマンドによる送信(5.4.1章)」までの演習を終え、内容を理解している方を対象とします。<br />
<br />
また、用いるOSはNOOBS 2.3.0以降に含まれるRaspbianとします。少なくとも、OSがJessieやStretch(NOOBS 1.4.2以降)であることを前提とした解説がありますので、なるべく新しいバージョンのOSを用いてください。<br />
<br />
家電製品の操作に興味がないという方でも、本ページを読むことで「音声認識の結果を取得してその結果をもとに何らかのアクションを起こす」方法を知ることができます。<br />
<br />
なお、本ページのJuliusを用いる方法は音声認識機能をRaspberry Pi本体上のOSに追加する方法ですが、インターネット(クラウド)上の音声認識機能を用いる例として「<a href="https://raspibb2.blogspot.com/2018/02/raspberry-pi-google-assistant-api-lirc.html" target="_blank">Raspberry Pi + Google Assistant API + LIRCによりテレビを音声認識で操作する</a>」も追加しましたので、お好みの方をお試しください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicDbi-d0dnGrucUw4reBw9m3TvEu8HBCuW7SI61kSyW9-2N6_CTiVCui3rwWAK6uxvU9DLrU_vg4gxYC0KHCZL3uBPV3jKLep0GajyrNHd-48HGXG4rrN_oq3RrsCs2UxFp43mJ9U8BP8/s1600/2017-03-14+14.34.48.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicDbi-d0dnGrucUw4reBw9m3TvEu8HBCuW7SI61kSyW9-2N6_CTiVCui3rwWAK6uxvU9DLrU_vg4gxYC0KHCZL3uBPV3jKLep0GajyrNHd-48HGXG4rrN_oq3RrsCs2UxFp43mJ9U8BP8/s640/2017-03-14+14.34.48.jpg" width="640" /></a></div>
<div style="text-align: center;">
Raspberry PiにサンワプライのUSBマイクを接続した様子</div>
<br />
また、リモコンで操作できるLED照明に対して本ページの内容を適用したデモンストレーションの動画が下記になります。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="290" src="https://www.youtube.com/embed/NrKtrVFpArE?rel=0" width="420"></iframe>
</div>
<br />
<h3>
1. 音声認識を行うために必要な物品</h3>
音声認識を行うためにはマイクが必要ですが、Raspberry Piにはマイクを接続する端子がありません。マイクをRaspberry Piに接続するためには、外部機器を購入する必要があります。<br />
<br />
本ページでは、マイクを接続するためのデバイスとして下記の5つを試しました。これ以外のデバイスはサポート対象外としますのでご了承ください。<br />
<br />
[USBマイク系]
<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B01M7YIYZV/" target="_blank">SANWA SUPPLY MM-MCU02BK USBマイクロホン</a>
</li>
<li><a href="https://www.amazon.co.jp/dp/B0027WPY82/" target="_blank">SANWA SUPPLY MM-MCUSB16 USBマイクロホン</a>
</li>
</ul>
[USBサウンドデバイス系]
<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B06XZY8JTZ/" target="_blank">Creative Sound Blaster Play!3 SB-PLAY3</a></li>
<li><a href="https://www.amazon.co.jp/dp/B00JIT6L4S/" target="_blank">Creative Sound Blaster Play!2 SB-PLAY2</a></li>
<li><a href="https://www.amazon.co.jp/dp/B001BKTIFQ/" target="_blank">Creative Sound Blaster Play! SB-PLAY</a></li>
</ul>
どれもUSBデバイスであり、USB端子に接続すれば使えるようになります。<br />
<br />
ただし、USBサウンドデバイスを用いる場合、さらにミニジャック接続のPC用マイクも必要となります。これはどのようなマイクでも問題ないと思いますが、例えば
<br />
<ul>
<li><a href="https://www.amazon.co.jp/dp/B01CGLTD3U/" target="_blank">iBUFFALO マイクロフォン スタンドタイプ 3極プラグ搭載 ホワイト BSHSMPM01WH</a></li>
<li><a href="https://www.amazon.co.jp/dp/B00008BB7B/" target="_blank">サンワサプライ マルチメディアマイクロフォン MM-MC1</a></li>
</ul>
のようなものがあります。<br />
<br />
<h3>
2. 日本語入力メソッド mozc のインストール</h3>
以下の手順において、Raspberry Pi 上で日本語を入力しなければならない箇所があります。Raspberry Pi用のOSであるRaspbian(Jessie以降)で日本語を入力するため、Googleが開発した日本語入力システムMozcをインストールします。「Google日本語入力」のもととなったソフトウェアです。<br />
<br />
LXTerminalを起動し、下記の 2 つのコマンドを順に実行することで、ネットワークからMozcをダウンロードしてインストールします。なお、2 つ目のコマンドの実行後に「続行しますか? [y/n]」などと聞かれた場合は、キーボードで「y」をタイプしてEnterキーを押して下さい。<br />
<pre class="prettyprint">$ sudo apt update
$ sudo apt install ibus-mozc
</pre>
なお、1 つ目のコマンドは、インストールできるアプリケーションのリストを更新するためのものです。1 分程度かかる場合あります。2 つ目のコマンドで、Mozcをインストールしています。<br />
<br />
インストールが終った後はまずRaspberry Piを再起動します。その後、下図のように「US」と書かれた部分をマウスでクリックし「日本語 - Mozc」を選択してください。あとは「半角/全角」キーで日本語入力のオンオフを切り替えられます。
<br />
<br />
この際、キーボードの設定が英語キーボードに戻って「半角/全角」キーが効かなくなっていることがありますので、そのような場合はもう一度キーボードの設定をし直しましよう。<br />
<br />
日本語入力の動作チェックとして、ブラウザでGoogleなどにアクセスし、日本語で検索してみると良いでしょう。
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHaqtR6HrPKl1tCcpAR6ivyUcW9MiQd6-OH6VTNDNZt93IKhsLx7jePmPLK8fYPhKvTg6jsVZOgItV0_XxMoZRgraIyV4e7ccEIwKZwFHOhXe7yAHEF4eebFH6i0nAOqidox3N8D8pCDQo/s1600/mozc-all.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHaqtR6HrPKl1tCcpAR6ivyUcW9MiQd6-OH6VTNDNZt93IKhsLx7jePmPLK8fYPhKvTg6jsVZOgItV0_XxMoZRgraIyV4e7ccEIwKZwFHOhXe7yAHEF4eebFH6i0nAOqidox3N8D8pCDQo/s640/mozc-all.png" width="640" /></a></div>
<br />
<h3>
3. 音声認識エンジンJuliusのインストール</h3>
ここからは、Raspberry Pi上で音声認識を行うために用いるソフトウェアである<a href="http://julius.osdn.jp/" target="_blank">Julius</a>のインストール方法を解説します。<br />
<br />
まず、<a href="https://ja.osdn.net/projects/julius/releases/66547" target="_blank">こちら</a>より julius-4.4.2.tar.gz をダウンロードしてください。ブラウザでダウンロードすると、デフォルトでユーザーpiのDownloadsディレクトリ(フォルダ)にダウンロードされます。<br />
<br />
さらに、<a href="https://osdn.net/projects/julius/releases/66544" target="_blank">こちら</a>より、Juliusディクテーションキットの最新版である dictation-kit-v4.4.zip をダウンロードしてください。こちらは400MB以上のサイズがあり、解凍するとさらに800MBの容量が必要となります。事前にRaspberry PiのOSを格納したSDカードの容量に余裕があることを確認した方がよいでしょう。<br />
<br />
ターミナルを起動し、dfコマンドに-kオプションを付けて実行することで、SDカードの残り容量をKB単位で知ることができます。<br />
<pre class="prettyprint">$ df -k
ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置
/dev/root 6154176 5625008 193504 97% /
(以下略)
</pre>
上記の表示は、8GBのSDカードを用いてJuliusのインスト―ルを全て終えた状態でのSDカードの容量を示しています。使用率97%、残り容量193.504MBであることを示しますので、ほぼギリギリです。ですので、Juliusを用いる際は16GB以上のSDカードを用いることを推奨します。なお、2018年1月に確認したところ、この時期のRaspbianを用いると8GBのSDカードでは容量が足りませんでしたので、16GB以上のSDカードが必須だとお考え下さい。<br />
<br />
さて、ダウンロードが終わったら、 julius-4.4.2.tar.gz および dictation-kit-v4.4.zip をDownloadsディレクトリ(フォルダ)(/home/pi/Downloads)からユーザーpiのホーム(/home/pi)に移動しましょう。本書p.322の図A-1のようにファイルマネージャを用いるのが良いでしょう。<br />
<br />
次に、ターミナルを起動して下記のコマンドを順に実行し、Juliusのインストールに必要なライブラリをインストールします。
<br />
<pre class="prettyprint">$ sudo apt update
$ sudo apt install libasound2-dev
</pre>
上記のコマンドが終わったら、以下のコマンドでJuliusをインストールします。
<br />
<pre class="prettyprint">$ tar zxf julius-4.4.2.tar.gz
$ cd julius-4.4.2
$ ./configure --enable-words-int --with-mictype=alsa
$ make
$ sudo make install
</pre>
次に、 dictation-kit-v4.4.zip を下記のコマンドでユーザpiのホームに解凍します。これは解凍のみで構いません。
<br />
<pre class="prettyprint">$ cd
$ unzip dictation-kit-v4.4.zip
</pre>
以上でJuliusの準備は終了ですが、最後に、導入したマイクをJuliusで用いるための設定を行います。下記のコマンドにより、環境設定ファイル .bashrc テキストエディタ leafpadで開きましょう。
<br />
<pre class="prettyprint">$ cd
$ leafpad .bashrc
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ cd
$ mousepad .bashrc
</pre>
このファイルには様々な設定が書き込まれていますが、それを壊さないように注意しながら、ファイル末尾に下記の1行を追加しましょう。
<br />
<pre class="prettyprint">export ALSADEV=plughw:1,0
</pre>
なお、2020年5月27日(2020-05-27)以降のOSを利用している場合は、追加する行は以下の行としてください。
<pre class="prettyprint">export ALSADEV=plughw:2,0
</pre>
書き込みが終わったらファイルを保存してからleafpadを閉じます。<br />
<br />
以上が終わったら、Raspberry Piを一旦再起動しましょう。再起動の前に、(もし接続していなかったら)Raspberry PiにUSB経由のマイクデバイスを接続しておきましょう。<br />
<br />
<h3>
4. Juliusの動作確認</h3>
インストールしたJuliusの動作チェックをしてみましょう。ターミナルを起動し、下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ julius -C dictation-kit-v4.4/main.jconf -C dictation-kit-v4.4/am-gmm.jconf -demo
</pre>
長い命令ですので、本書p.344で解説した「TABキーによるファイル名の補完」をうまく活用しないと入力は大変です。それも難しい場合、上記コマンドのコピー&貼り付けで実行しても良いでしょう(個人的には、TABキーによる補完をマスターすることをお勧めします)。<br />
<br />
また、juliusコマンドに与えるオプションは、用いるディクテーションキットのバージョンに依存します。本ページではv4.4を用いた解説になっていますのでご注意ください。<br />
<br />
実行して数秒待つと、ターミナルに下記の表示が現れます。
<br />
<pre class="prettyprint">(省略)
Stat: adin_alsa: device name from ALSADEV: "plughw:1,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:1,0": Device [USB PnP Audio Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>
</pre>
「<<< please speak >>>」の表示が出たら、マイクに向かって何か話してください。認識結果がターミナルに表示されます。下記は、マイクに向かって「こんにちは」、「ラズベリーパイ」と話したときの表示です。
<br />
<pre class="prettyprint">(省略)
pass1_best: こんにちは 。
sentence1: こんにちは 。
pass1_best: ラズベリー 杯 、
sentence1: ラズベリー パイ 。
<<< please speak >>>
</pre>
認識に失敗することもありますが、必ずしも認識率が高いわけではありませんので、あまり気にしなくても良いでしょう。
<br />
<br />
認識動作を終了したい場合、ターミナル上で「Ctrl-c」(Ctrlキーを押しながらcキーを押す)を実行してJuliusを終了してください。<br />
<br />
なお、マイクの感度を調整したい場合、下記のコマンドをあらかじめターミナルで実行しておきます。「50」の部分は0%~100%の感度に相当する数字なので、適切な数字をいれます。100に近付く程感度が高いはずです。
<pre class="prettyprint">$ amixer -c 1 sset 'Mic' 50
</pre>
2020年5月27日(2020-05-27)以降のOSを利用している場合は、マイクの感度調節命令は下記としてください。
<pre class="prettyprint">$ amixer -c 2 sset 'Mic' 50
</pre>
<br />
<h3>
5. Juliusの辞書作成</h3>
ここまでで、Raspberry PiとJuliusを用いた音声認識が実現しました。これを本書第5章の内容と組み合わせ、テレビのリモコン操作を音声で行ってみましょう。マイクに向かって「電源」と話すと、テレビの電源のオン・オフが切り替る、などの動作です。<br />
<br />
そのためには、まず音声認識の認識率を向上させる必要があります。デフォルトでなぜ誤認識が多いかというと、Juliusが提示する認識語の候補が多すぎるからです。Juliusが認識に用いる辞書を、テレビ操作に必要な語句のみに限定すると、(当然ながら)認識率が向上します。今回の目的にはこれで十分ですので、試してみましょう。<br />
<br />
まず、テレビの操作に必要な語句を、下記の通りとします。左が表記、右が読みとします。<br />
<br />
<table border="1">
<tbody>
<tr>
<td>電源
</td>
<td>でんげん
</td>
</tr>
<tr>
<td>入力
</td>
<td>にゅうりょく
</td>
</tr>
<tr>
<td>1
</td>
<td>いち
</td>
</tr>
<tr>
<td>2
</td>
<td>に
</td>
</tr>
<tr>
<td>3
</td>
<td>さん
</td>
</tr>
<tr>
<td>4
</td>
<td>よん
</td>
</tr>
<tr>
<td>5
</td>
<td>ご
</td>
</tr>
<tr>
<td>6
</td>
<td>ろく
</td>
</tr>
<tr>
<td>7
</td>
<td>なな
</td>
</tr>
<tr>
<td>8
</td>
<td>はち
</td>
</tr>
<tr>
<td>9
</td>
<td>きゅう
</td>
</tr>
<tr>
<td>10
</td>
<td>じゅう
</td>
</tr>
<tr>
<td>11
</td>
<td>じゅういち
</td>
</tr>
<tr>
<td>12
</td>
<td>じゅうに
</td>
</tr>
<tr>
<td>ボリュームアップ
</td>
<td>ぼりゅーむあっぷ
</td>
</tr>
<tr>
<td>ボリュームダウン
</td>
<td>ぼりゅーむだうん
</td>
</tr>
<tr>
<td>チャンネルアップ
</td>
<td>ちゃんねるあっぷ
</td>
</tr>
<tr>
<td>チャンネルダウン
</td>
<td>ちゃんねるだうん
</td>
</tr>
</tbody></table>
<br />
この語句のみを記した辞書を作成するため、まずは上記の内容を記したテキストファイルを作成する必要があります。名前は任意ですが、ここでは remocon.yomi としましょう。<br />
<br />
下記のコマンドでremocon.yomiファイルを新規作成します。
<br />
<pre class="prettyprint">$ leafpad remocon.yomi
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ mousepad remocon.yomi
</pre>
なお、leafpadを用いない方のために記しておくと、このファイルはUTF-8の文字コードで記述する必要があります。
このファイルには、下記のように「表記」と「読み」を列挙します。
<br />
<pre class="prettyprint">電源 でんげん
入力 にゅうりょく
1 いち
2 に
3 さん
4 よん
5 ご
6 ろく
7 なな
8 はち
9 きゅう
10 じゅう
11 じゅういち
12 じゅうに
ボリュームアップ ぼりゅーむあっぷ
ボリュームダウン ぼりゅーむだうん
チャンネルアップ ちゃんねるあっぷ
チャンネルダウン ちゃんねるだうん
</pre>
上記の内容を記述する際には注意がいくつかあります。<br />
<br />
まず、「表記」と「読み」の間は「半角空白」か「TAB」などを区切り文字として記入します。
ただし、「半角空白」を区切り文字として用いる方針にすると、間違って「全角空白」を入力してしまうことがあり、トラブルの元です。
そのため、個人的には「TAB」を区切り文字とすることを推奨します。
具体的には例えば1行目の記述において下記のようにキーボードのTABキーを入力する、ということです。
<br />
<pre class="prettyprint">電源[TABキー]でんげん
</pre>
次に、上記の内容を記入する際、空行があってはいけません。典型的には、末尾に空行を入れてしまうことはしばしば起こりますので、注意しましょう。<br />
<br />
記入が終わったら、ファイルを保存してleafpadを閉じます。<br />
<br />
保存した remocon.yomi を元に、辞書ファイルを作成します。まずは、その際に用いる補助コマンドをダウンロードしましょう。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/addsil.pl
$ chmod a+x addsil.pl
</pre>
上記2コマンドの実行が終わったら、下記のコマンドにより、読みファイル remocon.yomi から辞書ファイル remocon.dic を作成します。
<br />
<pre class="prettyprint">$ iconv -f utf-8 -t euc-jp remocon.yomi | ./julius-4.4.2/gramtools/yomi2voca/yomi2voca.pl | iconv -f euc-jp -t utf-8 | ./addsil.pl > remocon.dic
</pre>
非常に長いコマンドなので、コピー&貼り付けで実行するのが無難でしょう。具体的には「remocon.yomi の文字コードをEUP-JPに変換」→「yomi2voca.pl コマンドにより読みをローマ字に変換」→「文字コードをUTF-8に変換」
→「ファイル先頭に休止状態の情報2行を追加」→「remocon.dic を保存」という流れで処理が実行されます。<br />
<br />
念のため、 remocon.dic の中身を確認しておきましょう。下記のコマンドで中身をleafpadで確認できます。UTF-8で記述されています。
<br />
<pre class="prettyprint">$ leafpad remocon.dic
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ mousepad remocon.dic
</pre>
中身は下記のようになっているはずです。<br />
<pre class="prettyprint"><s> [] silB
</s> [。] silE
電源 d e N g e N
入力 ny u u ry o k u
1 i ch i
2 n i
3 s a N
4 y o N
5 g o
6 r o k u
7 n a n a
8 h a ch i
9 ky u u
10 j u u
11 j u u i ch i
12 j u u n i
ボリュームアップ b o ry u: m u a q p u
ボリュームダウン b o ry u: m u d a u N
チャンネルアップ ch a N n e r u a q p u
チャンネルダウン ch a N n e r u d a u N
</pre>
読みがローマ字に変換されているのが yomi2voca.pl の効果、先頭2行が追加されているのが addsil.pl の効果です。確認が終わったらleafpadを閉じて構いません。<br />
<br />
なお、完成済みの辞書ファイル remocon.dic を下記のコマンドでダウンロードできますので、作成が面倒だという方はご活用ください。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/remocon.dic
</pre>
なお、既に remocon.dic が存在する場所で上記コマンドを実行すると、ダウンロードされたファイルの名前は remocon.dic.1 などと自動的に変更されますのでご注意ください。
<br />
<br />
以上でテレビ操作用の辞書ファイルを用意できましたので、Juliusがこれを用いるよう変更してみましょう。そのためには、julius を実行する時に利用する設定ファイル dictation-kit-v4.4/main.jconf を編集する必要があります。<br />
<br />
下記のコマンドで dictation-kit-v4.4/main.jconf を leafpadにより開きましょう。
<br />
<pre class="prettyprint">$ leafpad dictation-kit-v4.4/main.jconf
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ mousepad dictation-kit-v4.4/main.jconf
</pre>
この中に、辞書ファイルを指定している下記の場所があるので見つけてください。
<br />
<pre class="prettyprint">## 単語辞書ファイル
##
-v model/lang_m/bccwj.60k.htkdic
</pre>
これを下記のように編集してください。元からあった辞書指定行に「#」を追記して無効化し、新たに一行追加するわけです。全て半角で記述するよう注意しましょう。
<br />
<pre class="prettyprint">## 単語辞書ファイル
##
#-v model/lang_m/bccwj.60k.htkdic
-v ../remocon.dic
</pre>
なお、ここでの解説は、ディクテーションキットが /home/pi/dictation-kit-v4.4 に、作成した辞書ファイルが /home/pi/remocon.dic にあることを前提としています。追記した行にある「../」とは「一つ上の階層のディレクトリ(フォルダ)」を意味します。
ついでに、 dictation-kit-v4.4/main.jconf でもう一か所変更しておきましょう。下記の場所を見つけてください。
<br />
<pre class="prettyprint">-rejectshort 800 # 指定ミリ秒以下の長さの入力を棄却する
</pre>
これは、800ミリ秒以下の入力を無視する設定なのですが、この設定のままだと「に」や「ご」などのように短い音声の認識に失敗することが多くなります。
そこで、下記のようにこの数値を400に変更しましょう。半角で記述するよう注意しましょう。
<br />
<pre class="prettyprint">-rejectshort 400 # 指定ミリ秒以下の長さの入力を棄却する
</pre>
以上の変更が終わったら保存をしてからleafpadを閉じましょう。
そして、上と同様のjuliusコマンドで音声認識を試してみましょう。今度は上で列挙したテレビ操作用の単語しか認識されないはずです。
<br />
<br />
下記は「でんげん」、「いち」、「ぼりゅーむあっぷ」と話したときの様子です。警告(WARNING)は出ていますが、正しく認識されていることがわかります。
<br />
<pre class="prettyprint">pass1_best: 電源 。
WARNING: 00 _default: hypothesis stack exhausted, terminate search now
sentence1: 電源 。
pass1_best: 1 。
WARNING: 00 _default: hypothesis stack exhausted, terminate search now
sentence1: 1 。
pass1_best: ボリュームアップ
WARNING: 00 _default: hypothesis stack exhausted, terminate search now
sentence1: ボリュームアップ 。
</pre>
<br />
<h3>
6. moduleモードでのJuliusの実行</h3>
ここまででJuliusによる音声認識が実現できましたが、これを実現しているのは、配布されたファイルをインストールしてできたjuliusコマンドでした。<br />
<br />
しかし、我々が実現したいのは、音声認識の結果を自分で作成したプログラムから利用することです。それができて初めて、「『電源』という音声が認識されたら、テレビの電源をオンするための命令を送信する」などの動作が可能になるのです。<br />
<br />
そのためには、Juliusをmoduleモードと呼ばれるモードで動作させる必要があります。moduleモードの概念図を示したのが下図です。左側に描かれたmoduleモードで動作するjuliusがサーバーとなり、右側に描かれたクライアント(jcontrolコマンドや自作プログラム)からの認識の問い合わせに応答する、という仕組みです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9MvUSqGeW6TaNzEmc7cNnQq3f9ivRdUqeka0vpeKJXLWSYxH1LLViCmXISLYXIxokSb8e1uzfDMOQQZ_GY6cyhfQn1SOv96izF9M3IWtC3K66tB6gp9q1g8epxk9252YvExotCw2E_-U/s1600/julius_module.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9MvUSqGeW6TaNzEmc7cNnQq3f9ivRdUqeka0vpeKJXLWSYxH1LLViCmXISLYXIxokSb8e1uzfDMOQQZ_GY6cyhfQn1SOv96izF9M3IWtC3K66tB6gp9q1g8epxk9252YvExotCw2E_-U/s1600/julius_module.png" /></a></div>
<br />
イメージをつかむために、moduleモードの動作を試してみましょう。まず、下記のコマンドでjuliusをmoduleモードで起動しましょう。これまでとの違いは、末尾に「-module」がつくだけです。
<br />
<pre class="prettyprint">$ julius -C dictation-kit-v4.4/main.jconf -C dictation-kit-v4.4/am-gmm.jconf -demo -module
</pre>
しばらく待つと、ターミナルに下記の表示が現れます。juliusがサーバーとして動作し、クライアントからの接続を待ち受けていることが記されています。
<br />
<pre class="prettyprint">(省略)
Stat: server-client: socket ready as server
///////////////////////////////
/// Module mode ready
/// waiting client at 10500
///////////////////////////////
</pre>
moduleモードのjuliusが動作するターミナルはそのままにしておき、
もう一つ別のターミナルを起動しましょう。そこで下記のコマンドを実行します。jcontrolはjuliusに付属するコマンドで、moduleモードのjuliusに接続し結果を表示することができます。「localhost」とはjuliusが動作しているRaspberry Piを表わすホスト名です。
<br />
<pre class="prettyprint">$ jcontrol localhost
</pre>
すると、そのターミナル上では下記のように表示されます。
<br />
<pre class="prettyprint">connecting to localhost:10500...done
> <STARTPROC/>
> <INPUT STATUS="LISTEN" TIME="1489549742"/>
</pre>
一方、moduleモードのjuliusが動作するターミナル上の表示は下記のように変化します。
<br />
<pre class="prettyprint">(省略)
STAT: AD-in thread created
</pre>
その状態で、これまで通りマイクに何か話してみましょう。先ほどと同様「でんげん」、<br />
「いち」、「ぼりゅーむあっぷ」と話したとき、jcontrolコマンドを実行したターミナルには、例えば下記のように表示されます。
<br />
<pre class="prettyprint">(省略)
> <SHYPO RANK="1" SCORE="-2573.104004">
> <WHYPO WORD="" CLASSID="<s>" PHONE="silB" CM="0.958"/>
> <WHYPO WORD="<strong>電源</strong>" CLASSID="電源" PHONE="d e N g e N" CM="0.978"/>
> <WHYPO WORD="。" CLASSID="</s>" PHONE="silE" CM="1.000"/>
> </SHYPO>
(省略)
> <SHYPO RANK="1" SCORE="-1995.357666">
> <WHYPO WORD="" CLASSID="<s>" PHONE="silB" CM="0.927"/>
> <WHYPO WORD="<strong>1</strong>" CLASSID="1" PHONE="i ch i" CM="0.864"/>
> <WHYPO WORD="。" CLASSID="</s>" PHONE="silE" CM="1.000"/>
> </SHYPO>
(省略)
> <SHYPO RANK="1" SCORE="-2783.654053">
> <WHYPO WORD="" CLASSID="<s>" PHONE="silB" CM="0.953"/>
> <WHYPO WORD="<strong>ボリュームアップ</strong>" CLASSID="ボリュームアップ" PHONE="b o ry u: m u a q p u" CM="0.967"/>
> <WHYPO WORD="。" CLASSID="</s>" PHONE="silE" CM="1.000"/>
> </SHYPO>
</pre>
これまでとは形式がかなり異なりますが、「電源」、「1」、「ボリュームアップ」が認識されていることは見て取れるでしょう。
<br />
<br />
jcontrolを終了するには、jcontrolを実行しているターミナルで「Ctrl-c」を実行します。そうすると、moduleモードのjuliusは再びクライアントからの接続を待機する状態に戻ります。
moduleモードのjuliusを終了するには、やはりそのターミナルで「Ctrl-c」を実行してください。
<br />
<br />
さて、以上の動作確認により、目指すべきことがわかりました。jcontrolのようにmoduleモードのjuliusに接続し、得られた認識結果に応じてアクションを起こすプログラムを書けば良いのです。<br />
<br />
そのためのPythonプログラムを作成してみましたので、ダウンロードして試してみましょう。下記のコマンドで recog-TV.py をダウンロードできます。
<br />
<pre class="prettyprint">$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/recog-TV.py
</pre>
これを実行するため、<b>あらかじめmoduleモードのjuliusを起動しておきます</b>。
<br />
<br />
そして、別のターミナルを開き、下記のコマンドでrecog-TV.pyを実行します。
<br />
<pre class="prettyprint">$ python recog-TV.py
</pre>
実行後にすぐ<b>「socket error」と表示される場合はmoduleモードのjuliusが起動されていません</b>ので注意してください。
<br />
<br />
エラーがでなければ、マイクに向かって話しかけてみましょう。
<br />
<br />
LIRCを既にインストール済みだが起動されていない方ならば下記のように表示されるでしょうし、
<br />
<pre class="prettyprint">電源
irsend: could not connect to socket
irsend: No such file or directory
1
irsend: could not connect to socket
irsend: No such file or directory
ボリュームアップ
irsend: could not connect to socket
irsend: No such file or directory
</pre>
LIRCをインストールされていない方ならば下記のように表示されるでしょう。
<br />
<pre class="prettyprint">電源
command not found.
1
command not found.
ボリュームアップ
command not found.
</pre>
いずれにせよ、音声認識結果「電源」、「1」、「ボリュームアップ」が表示されていることがわかります。
<br />
<br />
このプログラム recog-TV.py は、音声が認識されたときに、テレビを操作する信号を出力するように作られています。
その準備ができていれば上記のエラーメッセージは出ないのですが、LIRCが起動していないときやLIRCがインストールされていない場合には
上記のようなメッセージが現れるというわけです。<br />
<br />
LIRCの準備は本書第5章の5.4.1までを終えれば完了します。すなわち、「irsend SEND_ONCE TV power」などのコマンドでテレビが操作できるようになれば良いわけです。その状態で「moduleモードのjulius」および「recog-TV.py」が適切に起動されれば、エラーがでず、音声によりテレビを操作できるようになります。<br />
<br />
もちろん、音声認識の結果をテレビの操作以外に用いることもできます。例えば、認識された言葉を合成音声でRaspnberry Piに発話させることも可能です。
その方法を、本ページの続編的な内容である「<a href="https://raspibb2.blogspot.jp/2017/03/raspberry-pi-open-jtalk.html" target="_blank">Raspberry Pi + Open JTalkによる音声合成で天気予報付き温度計に喋らせる</a>」にて紹介しておりますので、是非ご覧ください。
<br />
<br />
<h3>
7. 若干のコードの解説</h3>
サンプルファイル recog-TV.py を全て解説するのは難しいですが、このプログラムを<br />
改造したいという方のために重要な部分のみを解説します。
<br />
<br />
ポイントとなるのは以下の部分です。Web上での見やすさのためインデント(字下げ)は一部省略します。<br />
<pre class="prettyprint"># 認識された単語wordの中に、u('...') という文字列が含まれるかどうかを
# チェックし、文字列に応じたアクションを記述します。
# u('...')でくくるのは、python2とpython3の互換性を保つためです。
# 「対象となる文字が含まれているか」を調べていますので、
# 先に「『1』が含まれるか」をチェックすると
# 10~12がすべて「1」と判定されてしまいます。
# そのため、10~12のチェックを先に行っています。
if u('10') in word:
print(word)
args = ['irsend', '-#', '1', 'SEND_ONCE', 'TV', 'ch10']
try:
subprocess.Popen(args)
except OSError:
print('command not found.')
elif u('11') in word:
print(word)
args = ['irsend', '-#', '1', 'SEND_ONCE', 'TV', 'ch11']
try:
subprocess.Popen(args)
except OSError:
print('command not found.')
(以下略)
</pre>
この部分ではwordという変数の中に、認識された語句が格納されています。それをif~elif文により分岐させ、認識された語句ごとに実行する処理を変えている、というわけです。<br />
<br />
この部分をうまく書き換えることで、処理を色々と変えることができるでしょう。<br />
<br />
<h3>
8. 自動起動</h3>
最後に、ここで試したmoduleモードのjuliusとrecog-TV.pyを、Raspberry Pi起動時に自動で実行する方法を記しておきましょう。<br />
<br />
自動起動用のファイル/etc/rc.localにコマンドを追記します。まず、管理者権限のleafpadで/etc/rc.localを編集用に開きます。
<br />
<pre class="prettyprint">$ sudo leafpad /etc/rc.local
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">$ sudo mousepad /etc/rc.local
</pre>
そして、末尾にある「exit 0」の手前に下記の3つのコマンドを記述し、保存します。
<br />
<pre class="prettyprint">ALSADEV=plughw:1,0 julius -C /home/pi/dictation-kit-v4.4/main.jconf -C /home/pi/dictation-kit-v4.4/am-gmm.jconf -demo -module &
sleep 10
python /home/pi/recog-TV.py &
exit 0
</pre>
ポイントは、下記の通りです。
<br />
<ul>
<li>.bashrcに書いたALSADEVについての設定は/etc/rc.localでは読み込まれないので、直に書く</li>
<li>main.jconfやam-gmm.jconfは「dictation-kit-v4.4/main.jconf」のような相対パスではなく「/home/pi/dictation-kit-v4.4/main.jconf」のような絶対パスで書く</li>
<li>juliusの起動が終了するのを待つため、sleep文を挿入する</li>
<li>recog-TV.pyも絶対パスで書く</li>
</ul>
保存したらleafpadを終了し、Raspberry Piを再起動してみてください。自動で音声入力を受け付けるモードになっているはずです。<br />
<br />
以上、お疲れさまでした。Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com9tag:blogger.com,1999:blog-1299465193942557222.post-66007483434188312492017-01-07T00:28:00.001+09:002019-10-02T23:26:19.997+09:00GUIアプリケーションの自動起動<h3>
はじめに</h3>
Raspberry Piの起動時にアプリケーションを自動起動(自動実行)したい場合、設定ファイル /etc/rc.local に実行したいコマンドを記述する方法がよく知られています。
<br />
<br />
しかし、この方法で自動起動できるのはターミナル上で実行するCUIアプリケーションのみであり、GUIアプリケーションの場合は別の方法を用いる必要があります。ここではその方法を紹介します。<br />
<br />
本書の場合、7章「OpenCVによる画像処理と対象物追跡を行ってみよう」で紹介したプログラムが該当します。
なお、GUIアプリケーションであっても、ターミナルからどのようなコマンドで起動するかを知っておく必要があります。例えば、Chromiumブラウザなら「chromium-browser」などです。<br />
<br />
<h3>
方法</h3>
LXTerminalを起動し、下記のコマンドを実行します。<br />
この2つのコマンドは、「自動実行に必要なautostartというファイル」をデフォルトの場所からユーザーの場所にコピーするためのコマンドです。
<br />
<pre class="prettyprint">mkdir -p .config/lxsession/LXDE-pi
cp /etc/xdg/lxsession/LXDE-pi/autostart .config/lxsession/LXDE-pi
</pre>
次に、コピーしてきたautostartというファイルを編集します。
<br />
下記のコマンドを実行しましょう。
<br />
テキストエディタleafpadにより、自動起動するアプリケーションが列挙されたファイルが開きます。
<br />
<pre class="prettyprint">leafpad .config/lxsession/LXDE-pi/autostart
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">mousepad .config/lxsession/LXDE-pi/autostart
</pre>
中身は下記のようになっているはずです(2018年11月にリリースされたNOOBS3.0.0で確認しました)。
<br />
<pre class="prettyprint">@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
</pre>
この末尾に、起動したいアプリケーションのコマンドを追記します。例えば、本書7章で用いたbb2-07-01-preview.pyなら、下記のようになるでしょう。
<br />
<pre class="prettyprint">@python /home/pi/bb2-07-01-preview.py
</pre>
先頭に「@」つけることに注意してください。さらに、サンプルファイルの保存位置が異なるなら、適宜編集しましょう。
<br />
<br />
さらに、wiringpiを用いるbb2-07-06-tracking-circle.pyやbb2-07-06-tracking-face.pyなら先頭にsudoをつける必要があることにも注意してください。<br />
<br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com4tag:blogger.com,1999:blog-1299465193942557222.post-88095388010700957352016-06-30T21:22:00.004+09:002022-06-24T17:27:54.264+09:00Raspberry Pi上のLIRCでエアコンを操作する<h3>
0. はじめに</h3>
<strong>注意</strong>:2020年4月現在において、本ページに記しているエアコン操作の内容は、
「4.19.115+ 以降の kernel 4.19 や kernel 5.x を搭載したRasberry Pi OS Buster / Bullseye」または「kernel 4.14 を搭載した Rasbian Stretch」で動作します。
<br /><br />
注意しなければならないのは、
「4.19.115+ 以前の kernel 4.19 を搭載したRasbian Buster」および「アップグレードを実行して kernel 4.19 となった Rasbian Stretch」
では動作しない、ということです。
<br />
<br />
以上を踏まえ、本ページは以下の2通りに分けて記述します。
<ul>
<li>Rasberry Pi OS Buster / Bullseye の場合 (kernel 4.19.115+ 以降)</li>
<li>NOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のRaspbian StretchをOSアップデートをせずに利用している場合 (kernel 4.14)</li>
</ul>
<br />
<br />
<h3>
1. 予備知識</h3>
本書の第5章において、LIRC(Linux Infrared Remote Control) というソフトウェアを用いてRaspberry Piを家電製品のリモコンにする方法を紹介しました。<br />
<br />
その際、「エアコンのリモコンが発する信号はLIRCで認識できないため、テレビや照明などLIRCが認識できるリモコンを用いる」という方針をとりました。<br />
<br />
しかし、難易度は上がりますが、Raspberry Piをエアコンのリモコンとする方法はありますので、ここでその方法を紹介します。<br />
<br />
なお、この方法を試すには、LIRCの挙動をよく理解しておく必要がありますので、本書の第5章の演習を一通り終えている方を対象とします。<br />
<br />
<h4>
●エアコンのリモコンが発する信号は継続時間が長い</h4>
さて、書籍では「エアコンのリモコンが発する信号は継続時間が長い」と述べましたが、実際に信号を観測してそれを確かめてみましょう。<br />
<br />
「テレビの電源」、「エアコンのON信号」、「エアコンのOFF信号」を押したときのリモコンの赤外線LEDの点灯状態を記したのが下図です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuvEWYMRZQUSMd16TWZKuMbRvc8bbJot_jeeM_vkwJm0Gy8HFdfiKYZCsT-P4Dnw3xK2WIepyPrCkf8AtZk8u6OsHSH_h2yVepPTnPe4HdLous_Olf56ijnjtRC8j1XMPPnEengISQAP8/s1600/ACGraph01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuvEWYMRZQUSMd16TWZKuMbRvc8bbJot_jeeM_vkwJm0Gy8HFdfiKYZCsT-P4Dnw3xK2WIepyPrCkf8AtZk8u6OsHSH_h2yVepPTnPe4HdLous_Olf56ijnjtRC8j1XMPPnEengISQAP8/s640/ACGraph01.png" width="640" /></a></div>
<br />
この図は、本書図5-6の回路において赤外線リモコン受信モジュールが受信した信号をオシロスコープで取得し、上下反転するなどして見やすく加工したものです。<br />
<br />
まず、テレビの電源ボタンが押されたときの赤外線LEDの点滅状態は約64ミリ秒続くことがわかります。これは本書図5-4にも示されています。<br />
<br />
一方、エアコンの電源を入れる際の赤外線LEDの点滅状態は約127ミリ秒続くことが見て取れます。確かに、テレビの信号より継続時間が長いですね。
<br />
<br />
<h4>
●エアコンの電源ボタンはON時とOFF時で信号が異なる</h4>
さらに、上の図を見ると、「エアコンの電源ボタンはON時とOFF時とで信号が異なる」ことも見て取れます。<br />
<br />
信号の継続時間が長いのはON時のみで、OFF時の信号は継続時間が短いこともわかります。<br />
<br />
エアコンのリモコンは、多くの場合下図のように液晶画面がついており、このリモコンでエアコンがON状態かOFF状態かを管理しています。その状態に応じて、出力する信号を変えているわけです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMsqSaVxQmuZst9Qo6EleNtPzXKaHY5jjT9kpKlY_kX2Lnzt_ZplKfr9v7RlF-k0SyZCUxy9PJa-BdLUKnD-9C3YTIaSy1017ztjckrvJy1eYga84ciGa_aEtGL4elekaPRID-rHqEWCc/s1600/2016-06-30+14.33.24.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMsqSaVxQmuZst9Qo6EleNtPzXKaHY5jjT9kpKlY_kX2Lnzt_ZplKfr9v7RlF-k0SyZCUxy9PJa-BdLUKnD-9C3YTIaSy1017ztjckrvJy1eYga84ciGa_aEtGL4elekaPRID-rHqEWCc/s400/2016-06-30+14.33.24.jpg" width="400" /></a></div>
<br />
<h4>
●エアコンのON信号には様々な情報が乗っている</h4>
ここまで、「エアコンのON信号」と書いてきましたが、実はエアコンには様々なON信号があり得ます。<br />
<br />
これはエアコンのリモコンの使われ方を思い浮かべると分かりやすいと思います。私たちは、エアコンの電源をONにする前に、手元のリモコンで温度を変更したり、冷房/暖房や風量を切り替えてからエアコンの電源をONにすることがあります。<br />
<br />
電源をONにされたエアコンは、リモコンの設定に応じたモードで動作を開始するはずです。<br />
<br />
これは、「ON」という信号(上図のオレンジのグラフ)の中に、「設定温度」、「冷房/暖房」、「風量」などという情報が乗せられていることを意味します。逆に言えば、そのために信号の継続時間が長くなっているのだとも言えるでしょう。<br />
<br />
ですから、一言で「ON信号」といっても、「25度、冷房、風量弱のON信号」と「25度、暖房、風量弱のON信号」は信号の点滅パターンが異なるということになります。<br />
<br />
これは、LIRCを用いる上ではあまり都合が良くありません。なぜなら、LIRCはLEDの信号パターンによって異なる名前をつけて管理するので、ON信号だけで数十通りのバリエーションがあると管理が難しくなるからです。<br />
<br />
<h3>
2. 方針</h3>
以上を踏まえて、作業の方針を記します。<br />
<br />
上で述べたように、エアコンのリモコンにはON信号だけで様々なバリエーションがありますので、それらを全てRaspberry Piから利用可能にするのは現実的ではありません。<br />
<br />
そこで、ここでは
<br />
<ul>
<li>(お好みの設定での)電源オン</li>
<li>電源オフ</li>
</ul>
の2つの信号だけを取り扱います。<br />
<br />
信号数を2つより増やすことは難しくありませんので、一度2つの信号を利用できるようになってからチャレンジしてみると良いでしょう。<br />
<br />
さて、書籍でテレビのリモコンを取り扱った際、下記の順で説明しました。
<br />
<ul>
<li>(1) irrecordコマンドによる、リモコンから出力される信号の学習フェーズ</li>
<li>(2) irsendコマンドによる、信号の送信フェーズ</li>
</ul>
このうち(1)の学習フェーズはエアコンのリモコンではうまくいきませんので、これを
<br />
<ul>
<li>(1') mode2コマンドによる、リモコンから出力される信号の記録</li>
</ul>
と差し替えて解説を進めます。<br />
<br />
<h3>
3. エアコンの制御 (1)<br />
Rasberry Pi OS Buster / Bullseye の場合 (kernel 4.19.115+ 以降)
</h3>
ここからはまず「Rasberry Pi OS Buster / Bullseye の場合 (kernel 4.19.115+ 以降)」において、
mode2コマンドを用いてエアコンのリモコンが出力する信号を記録する方法を解説します。
<br /><br />
kernel 4.19.115+ 以降というのは、2020.5.27にリリースされたRaspberry Pi OS以降が該当します。<br />
ターミナルを起動して kernel のバージョンを確認してみましょう。下記のように 4.19.115-v7l+ や5.4以降であれば問題ありません。
<pre class="prettyprint">pi@raspberrypi:~ $ uname -r
4.19.115-v7l+
</pre>
それを確認したら、エアコンの制御に入りましょう。
<br /><br />
LIRCのインストールや設定は
「<a href="https://raspibb2.blogspot.com/2021/11/raspberry-pi-os-bullseye-lirc.html" target="_blank">Raspberry Pi OS Buster / Bullseye でlircを利用する</a>」
により済ませておいてください。
<br />
<br />
まず、本書図5-6の「赤外線リモコン受信モジュールを用いた回路」を作成します。<br />
<br />
そして、「(お好みの設定での)電源オン」信号の記録から始めましょう。このとき、/etc/lirc/lirc_options.conf の設定は以下である必要があります。この意味がわからない方は、「<a href="https://raspibb2.blogspot.com/2021/11/raspberry-pi-os-bullseye-lirc.html" target="_blank">Raspberry Pi OS Buster / Bullseye でlircを利用する</a>」の内容を復習しましょう。
<pre class="prettyprint">driver = default
device = /dev/lirc1
</pre>
そして、ターミナルLXTerminalを起動し、下記のコマンドを実行します。
<br />
<pre class="prettyprint">mode2 > on.txt
</pre>
ターミナルには以下の表示が現れます。そのまま赤外線リモコン受信モジュールに対してリモコンで「(お好みの設定での)電源オン」ボタンを一度押します。
<pre class="prettyprint">Using driver default on device /dev/lirc1
Trying device: /dev/lirc1
Using device: /dev/lirc1
</pre>
押してもターミナルは変化しませんが、気にせずターミナル上でCtrl-c (Ctrlキーを押しながらcキーを押す)を実行します。これにより、mode2コマンドが終了します。<br />
<br />
ここまでの作業がうまくいけば、「on.txt」というテキストファイルに「(お好みの設定での)電源オン」信号についての情報が記録されているはずです。ターミナルで「mousepad on.txt」または「leafpad on.txt」コマンドを実行するなどして、テキストエディタでon.txtを開いてみましょう。
<br />
<br />
エアコンのメーカーなどにより異なりますが、例えば下記のような情報が記録されています。何も記録されていない場合、LIRCの設定が正しくない可能性があります。本書の5章の演習を改めてやり直してみましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAO2xVqogK1Vq_HB__g0uYMN5LoYfJFACDUfor-zGj7OY3aIXtcLGqvet84mIsBJFwhQvhrRRT2VIPzKeS2FonDTlhjdoxn2P-XHNQLFG4zilM7lZt1sxxWUJ-AyX-cY22kTuzIetbOV0/s1600/ACGraph02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAO2xVqogK1Vq_HB__g0uYMN5LoYfJFACDUfor-zGj7OY3aIXtcLGqvet84mIsBJFwhQvhrRRT2VIPzKeS2FonDTlhjdoxn2P-XHNQLFG4zilM7lZt1sxxWUJ-AyX-cY22kTuzIetbOV0/s1600/ACGraph02.png" /></a></div>
<br />
これは何を表しているでしょうか。1行目は意味のない情報ですが、2行目以降は下図に示すエアコンのリモコンの点滅状態の拡大図を見ることで理解できます。<br />
<br />
on.txtに記録された「3327」、「1694」…などの数値は、下図のように点灯や消灯の継続時間を表しているというわけです(単位はマイクロ秒)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS6X_EihTXg-iykJE8XOn-rmzjKGJwuprWw8ToGfnZH9jbTvHbKRIk2GAaH_-KOAGUu0EKwdM-loBB95e6r96olOHMoTfkGCyZEWIl6AEgHYXJ4ADvd5e7_wXDm9mJsyg7phsgDDyckKY/s1600/ACGraph03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS6X_EihTXg-iykJE8XOn-rmzjKGJwuprWw8ToGfnZH9jbTvHbKRIk2GAaH_-KOAGUu0EKwdM-loBB95e6r96olOHMoTfkGCyZEWIl6AEgHYXJ4ADvd5e7_wXDm9mJsyg7phsgDDyckKY/s640/ACGraph03.png" width="640" /></a></div>
<br />
この数値のパターンを最終的にLIRCに渡すことになります。<br />
<br />
その前に、リモコンの「電源オフ」信号についても記録しておきましょう。先ほどと同様にターミナルで下記のコマンドを実行します。
<br />
<pre class="prettyprint">mode2 > off.txt
</pre>
記録先のファイル名が「off.txt」になっていることがわかるでしょうか。その状態で、リモコンの「電源オフ」ボタンを赤外線リモコン受信モジュールに向かって押します。押し終わったら、ターミナル上でCtrl-cを実行してmode2コマンドを終了します。さらに、off.txtを「mousepad off.txt」または「leafpad off.txt」コマンドによりleafpadで開き、中身が記録されていることも確認しておきましょう。
<br />
<br />
次に、LIRCでエアコンのリモコンの信号を取り扱えるようになる設定ファイルAC.lircd.confを作成していきます。<br />
<br />
書籍で取り扱ったテレビのリモコンの場合は、irrecordコマンドが自動的に生成してくれましたが、今回取り扱っているエアコンのリモコンの場合は手作業で作成する必要があります。<br />
<br />
まず、テキストエディタを起動します。ターミナルで「mousepad AC.lircd.conf」または「leafpad AC.lircd.conf」のコマンドを実行しましょう。
<br /><br />
そして、下記の雛形をコピーして、起動したテキストエディタに貼り付けます。<br />
<pre class="prettyprint">begin remote
name AC
flags RAW_CODES
eps 30
aeps 100
gap 200000
toggle_bit_mask 0x0
begin raw_codes
name on
# python getinterval.py on.txtの結果を貼り付け
name off
# python getinterval.py off.txtの結果を貼り付け
end raw_codes
end remote
</pre>
「#」のついた行はコメントとして無視されるのですが、そこに、on.txtとoff.txtに関する情報を貼り付けるよう指示されています。<br />
<br />
ただし、on.txtやoff.txtの中身をそのまま貼り付けるわけではありません。下図のように、on.txtやoff.txtのうち、必要なのは赤い四角で囲われた数値のみです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNjyQzLOuSiP8ChzHoqlS82nY0clOy94EoMkQ7MGKJrs9tBXnhcmsDUNMElmCZB_dj983KxjqxmNmU5j_-78yNIX1FialG-pyjNs4uut3Ewsg-eaKrHzeYoWtQ8JItxzbnzCTInoWWSSo/s1600/ACGraph04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNjyQzLOuSiP8ChzHoqlS82nY0clOy94EoMkQ7MGKJrs9tBXnhcmsDUNMElmCZB_dj983KxjqxmNmU5j_-78yNIX1FialG-pyjNs4uut3Ewsg-eaKrHzeYoWtQ8JItxzbnzCTInoWWSSo/s1600/ACGraph04.png" /></a></div>
<br />
これらの数値を手作業で抽出するのは大変なので、抽出を容易にするプログラムgetinterval.pyを用意しました。ターミナルで下記のコマンドを実行してこのプログラムをダウンロードしてください。<br />
<pre class="prettyprint">wget https://raw.githubusercontent.com/neuralassembly/raspi/master/getinterval.py
</pre>
ダウンロードが済んだら、ターミナルで下記のコマンドを実行してみましょう。
<br />
<pre class="prettyprint">python getinterval.py on.txt
</pre>
すると、on.txtのうち必要な部分のみが抽出され、下図のようにターミナル上に表示されます。<br />
<br />
これを(下図の場合、冒頭の3327から末尾の448までを)マウスでなぞり、メニューから「編集」→「コピー」でコピーします。そして、テキストエディタ上の該当箇所に貼り付けます(「編集」→「貼り付け」)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH061hoorZ765dT4EQqRT8rV7D8WZG4cgDa2PXZ2SUb6tcWwAqPzxmlniXKRibNTepfn9w5HrZ8CjbaCYOJ4adebz57yTQjBcXd9QakuJALYHYnc0DXeh9pcMJ3vC_XkpOhOKcn2NOAa0/s1600/ACGraph05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH061hoorZ765dT4EQqRT8rV7D8WZG4cgDa2PXZ2SUb6tcWwAqPzxmlniXKRibNTepfn9w5HrZ8CjbaCYOJ4adebz57yTQjBcXd9QakuJALYHYnc0DXeh9pcMJ3vC_XkpOhOKcn2NOAa0/s640/ACGraph05.png" width="640" /></a></div>
<br />
同様に、「python getinterval.py off.txt」の結果も指示のある場所に貼り付けます。「#」がついたコメント部は不要なので削除しました。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnICioxd2suEaZu0-RwP2mMzDCH1OZBm0EtWyVWINaQ6XP0-tQxLv_2RwWZLaunuPhj8R6jJznQUgfS52ZS9fAjkDojg0vqD9LhZtGfXj3QK50hahRFpp0R-teMgoR7YU3l7miwZbQkgA/s1600/ACGraph08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnICioxd2suEaZu0-RwP2mMzDCH1OZBm0EtWyVWINaQ6XP0-tQxLv_2RwWZLaunuPhj8R6jJznQUgfS52ZS9fAjkDojg0vqD9LhZtGfXj3QK50hahRFpp0R-teMgoR7YU3l7miwZbQkgA/s640/ACGraph08.png" width="562" /></a></div>
<br />
なおこの際、mousepadでは「編集」→「設定」→「表示」→「行を折り返す」、leafpadでは「オプション」→「右端で折り返す」にチェックを入れないと、結果が見にくいですので注意して下さい。
<br />
<br />
以上で、設定ファイルAC.lircd.confの作成は完了です。保存してテキストエディタを終了しましょう。<br />
<br />
なお、リモコンの信号は用いているエアコンで異なるため、上の設定ファイル上の数値をそのまま写しても意味はありませんのでご注意ください。お使いのリモコンを用いてこの設定ファイルを作成することが重要です。<br />
<br />
最後に、このAC.lircd.confを/etc/lirc/lircd.conf.d/にコピーしましょう。ターミナルを起動して下記のコマンドを実行します。
<br />
<pre class="prettyprint">$ sudo cp AC.lircd.conf /etc/lirc/lircd.conf.d/
</pre>
以上で、信号の記録は終わりです。次に、irsend で信号を送信しますので、
/etc/lirc/lirc_options.conf の設定を以下のように変更する必要があります。この意味がわからない方は、「<a href="https://raspibb2.blogspot.com/2019/06/kernel-419raspbian-stretchbusterlirc.html" target="_blank">kernel 4.19以降を搭載したRaspbian Buster/Stretchでlircを利用する</a>」の内容を復習しましょう。
<pre class="prettyprint">driver = default
device = /dev/lirc0
</pre>
以上が終わったら、Raspberry Piを再起動します。新しいAC.lircd.confを読みこんだ状態でlircdが自動的に起動し、irsend を利用可能な状態になるのでした。<br />
<br />
読み込んだAC.lircd.confに基づいて実際にエアコンに信号を送信する方法は本書5.4節と同じです。まず、図5-12の回路を作成する必要があります。<br />
<br />
実行するコマンドですが、作成したAC.lircd.confを注意深く見ると、
<br />
<ul>
<li>グループ名:AC (Air Conditionerの略)</li>
<li>信号名:on, off</li>
</ul>
であることが分かりますので、<br />
<ul>
<li>オン:irsend SEND_ONCE AC on</li>
<li>オフ:irsend SEND_ONCE AC off</li>
</ul>
となります。赤外線LEDをエアコンの受光面に向けて実行してみましょう。
<br /><br />
<h3>
4. エアコンの制御 (2)<br />
NOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のRaspbian StretchをOSアップデートをせずに利用している場合 (kernel 4.14)
</h3>
ここからは「NOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のRaspbian をOSアップデートをせずに利用している場合 (kernel 4.14)」において、
mode2コマンドを用いてエアコンのリモコンが出力する信号を記録する方法を解説します。
<br /><br />
LIRCのインストールや設定は「<a href="https://raspibb2.blogspot.com/2019/06/kernel-414raspiban-stretchlirc.html" target="_blank">kernel 4.14までを搭載したRaspiban Stretchでlircを利用する</a>」により済ませておいてください。
<br />
<br />
まず、本書図5-6の「赤外線リモコン受信モジュールを用いた回路」を作成します。<br />
<br />
なお、NOOBS 2.4.3以降に含まれるRaspbianをお使いの場合、LIRCが起動した状態では記録用のコマンドの実行時にエラーが出ますので、下記のコマンドであらかじめLIRCを停止しておきます。
<br />
<pre class="prettyprint">sudo service lircd stop
</pre>
LIRCを停止させたら、
まず、「(お好みの設定での)電源オン」信号の記録から始めましょう。ターミナルLXTerminalを起動し、下記のコマンドを実行します。
<br />
<pre class="prettyprint">mode2 -d /dev/lirc0 > on.txt
</pre>
ターミナル上では何も起きませんが、そのまま赤外線リモコン受信モジュールに対してリモコンで「(お好みの設定での)電源オン」ボタンを一度押します。<br />
<br />
押してもやはりターミナル上では何も起こっていませんが、気にせずターミナル上でCtrl-c (Ctrlキーを押しながらcキーを押す)を実行します。これにより、mode2コマンドが終了します。<br />
<br />
ここまでの作業がうまくいけば、「on.txt」というテキストファイルに「(お好みの設定での)電源オン」信号についての情報が記録されているはずです。ターミナルで「leafpad on.txt」コマンドを実行するなどして、テキストエディタLeafpadでon.txtを開いてみましょう。<br />
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。コマンドは「mousepad on.txt」となります。
<br />
エアコンのメーカーなどにより異なりますが、例えば下記のような情報が記録されています。何も記録されていない場合、LIRCの設定が正しくない可能性があります。本書の5章の演習を改めてやり直してみましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAO2xVqogK1Vq_HB__g0uYMN5LoYfJFACDUfor-zGj7OY3aIXtcLGqvet84mIsBJFwhQvhrRRT2VIPzKeS2FonDTlhjdoxn2P-XHNQLFG4zilM7lZt1sxxWUJ-AyX-cY22kTuzIetbOV0/s1600/ACGraph02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAO2xVqogK1Vq_HB__g0uYMN5LoYfJFACDUfor-zGj7OY3aIXtcLGqvet84mIsBJFwhQvhrRRT2VIPzKeS2FonDTlhjdoxn2P-XHNQLFG4zilM7lZt1sxxWUJ-AyX-cY22kTuzIetbOV0/s1600/ACGraph02.png" /></a></div>
<br />
これは何を表しているでしょうか。1行目は意味のない情報ですが、2行目以降は下図に示すエアコンのリモコンの点滅状態の拡大図を見ることで理解できます。<br />
<br />
on.txtに記録された「3327」、「1694」…などの数値は、下図のように点灯や消灯の継続時間を表しているというわけです(単位はマイクロ秒)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS6X_EihTXg-iykJE8XOn-rmzjKGJwuprWw8ToGfnZH9jbTvHbKRIk2GAaH_-KOAGUu0EKwdM-loBB95e6r96olOHMoTfkGCyZEWIl6AEgHYXJ4ADvd5e7_wXDm9mJsyg7phsgDDyckKY/s1600/ACGraph03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS6X_EihTXg-iykJE8XOn-rmzjKGJwuprWw8ToGfnZH9jbTvHbKRIk2GAaH_-KOAGUu0EKwdM-loBB95e6r96olOHMoTfkGCyZEWIl6AEgHYXJ4ADvd5e7_wXDm9mJsyg7phsgDDyckKY/s640/ACGraph03.png" width="640" /></a></div>
<br />
この数値のパターンを最終的にLIRCに渡すことになります。<br />
<br />
その前に、リモコンの「電源オフ」信号についても記録しておきましょう。先ほどと同様にターミナルで下記のコマンドを実行します。
<br />
<pre class="prettyprint">mode2 -d /dev/lirc0 > off.txt
</pre>
記録先のファイル名が「off.txt」になっていることがわかるでしょうか。その状態で、リモコンの「電源オフ」ボタンを赤外線リモコン受信モジュールに向かって押します。押し終わったら、ターミナル上でCtrl-cを実行してmode2コマンドを終了します。さらに、off.txtを「leafpad off.txt」コマンドによりleafpadで開き、中身が記録されていることも確認しておきましょう。<br />
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。コマンドは「mousepad off.txt」です。
<br />
<br />
次に、LIRCでエアコンのリモコンの信号を取り扱えるようになる設定ファイルlircd.confを作成していきます。<br />
<br />
書籍で取り扱ったテレビのリモコンの場合は、irrecordコマンドが自動的に生成してくれましたが、今回取り扱っているエアコンのリモコンの場合は手作業で作成する必要があります。<br />
<br />
まず、テキストエディタleafpadを起動します。ターミナルで下記のコマンドを実行しましょう。
<br />
<pre class="prettyprint">leafpad lircd.conf
</pre>
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
<br />
<pre class="prettyprint">mousepad lircd.conf
</pre>
そして、下記の雛形をコピーして、起動したleafpadに貼り付けます。<br />
<pre class="prettyprint">begin remote
name AC
flags RAW_CODES
eps 30
aeps 100
gap 200000
toggle_bit_mask 0x0
begin raw_codes
name on
# python getinterval.py on.txtの結果を貼り付け
name off
# python getinterval.py off.txtの結果を貼り付け
end raw_codes
end remote
</pre>
「#」のついた行はコメントとして無視されるのですが、そこに、on.txtとoff.txtに関する情報を貼り付けるよう指示されています。<br />
<br />
ただし、on.txtやoff.txtの中身をそのまま貼り付けるわけではありません。下図のように、on.txtやoff.txtのうち、必要なのは赤い四角で囲われた数値のみです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNjyQzLOuSiP8ChzHoqlS82nY0clOy94EoMkQ7MGKJrs9tBXnhcmsDUNMElmCZB_dj983KxjqxmNmU5j_-78yNIX1FialG-pyjNs4uut3Ewsg-eaKrHzeYoWtQ8JItxzbnzCTInoWWSSo/s1600/ACGraph04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNjyQzLOuSiP8ChzHoqlS82nY0clOy94EoMkQ7MGKJrs9tBXnhcmsDUNMElmCZB_dj983KxjqxmNmU5j_-78yNIX1FialG-pyjNs4uut3Ewsg-eaKrHzeYoWtQ8JItxzbnzCTInoWWSSo/s1600/ACGraph04.png" /></a></div>
<br />
これらの数値を手作業で抽出するのは大変なので、抽出を容易にするプログラムgetinterval.pyを用意しました。ターミナルで下記のコマンドを実行してこのプログラムをダウンロードしてください。<br />
<pre class="prettyprint">wget https://raw.githubusercontent.com/neuralassembly/raspi/master/getinterval.py
</pre>
ダウンロードが済んだら、ターミナルで下記のコマンドを実行してみましょう。
<br />
<pre class="prettyprint">python getinterval.py on.txt
</pre>
すると、on.txtのうち必要な部分のみが抽出され、下図のようにターミナル上に表示されます。<br />
<br />
これを(下図の場合、冒頭の3327から末尾の448までを)マウスでなぞり、メニューから「編集」→「コピー」でコピーします。そして、leafpad上の該当箇所に貼り付けます(「編集」→「貼り付け」)。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH061hoorZ765dT4EQqRT8rV7D8WZG4cgDa2PXZ2SUb6tcWwAqPzxmlniXKRibNTepfn9w5HrZ8CjbaCYOJ4adebz57yTQjBcXd9QakuJALYHYnc0DXeh9pcMJ3vC_XkpOhOKcn2NOAa0/s1600/ACGraph05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH061hoorZ765dT4EQqRT8rV7D8WZG4cgDa2PXZ2SUb6tcWwAqPzxmlniXKRibNTepfn9w5HrZ8CjbaCYOJ4adebz57yTQjBcXd9QakuJALYHYnc0DXeh9pcMJ3vC_XkpOhOKcn2NOAa0/s640/ACGraph05.png" width="640" /></a></div>
<br />
同様に、「python getinterval.py off.txt」の結果も指示のある場所に貼り付けます。「#」がついたコメント部は不要なので削除しました。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnICioxd2suEaZu0-RwP2mMzDCH1OZBm0EtWyVWINaQ6XP0-tQxLv_2RwWZLaunuPhj8R6jJznQUgfS52ZS9fAjkDojg0vqD9LhZtGfXj3QK50hahRFpp0R-teMgoR7YU3l7miwZbQkgA/s1600/ACGraph08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnICioxd2suEaZu0-RwP2mMzDCH1OZBm0EtWyVWINaQ6XP0-tQxLv_2RwWZLaunuPhj8R6jJznQUgfS52ZS9fAjkDojg0vqD9LhZtGfXj3QK50hahRFpp0R-teMgoR7YU3l7miwZbQkgA/s640/ACGraph08.png" width="562" /></a></div>
<br />
なおこの際、leafpad上で下図のように「オプション」→「右端で折り返す」にチェックを入れないと、結果が見にくいですので注意して下さい。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL2-tZrWQsU6ZERRmrSbkhWT1rRR1y22Cd6_-nj1jKWAHy__9Qv9tj0zlw-KFHefH94G3Rzwe-5FZFp6xtl8dfQQvP8ZzDvskaKLlOoK5TuOX7BXx4hdWnlHjHuS8vgge1d4Xe33XRwFE/s1600/ACGraph07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL2-tZrWQsU6ZERRmrSbkhWT1rRR1y22Cd6_-nj1jKWAHy__9Qv9tj0zlw-KFHefH94G3Rzwe-5FZFp6xtl8dfQQvP8ZzDvskaKLlOoK5TuOX7BXx4hdWnlHjHuS8vgge1d4Xe33XRwFE/s1600/ACGraph07.png" /></a></div>
<br />
以上で、設定ファイルlircd.confの作成は完了です。ホーム(/home/pi)に保存してleafpadを終了しましょう。<br />
<br />
なお、リモコンの信号は用いているエアコンで異なるため、上の設定ファイル上の数値をそのまま写しても意味はありませんのでご注意ください。お使いのリモコンを用いてこの設定ファイルを作成することが重要です。<br />
<br />
最後に、このlircd.confを/etc/lircにコピーしましょう。ターミナルを起動して下記のコマンドを実行します。
<br />
<pre class="prettyprint">sudo cp lircd.conf /etc/lirc
</pre>
なお、NOOBS 2.4.3以降では設定ファイルの保存場所が変わっていますので、コマンドは以下のようになります。
<br />
<pre class="prettyprint">$ sudo cp lircd.conf /etc/lirc/lircd.conf.d/
</pre>
コピーが終わったら、Raspberry Piを再起動します。新しいlircd.confを読みこんだ状態でlircdが自動的に起動するのでした。<br />
<br />
読み込んだlircd.confに基づいて実際にエアコンに信号を送信する方法は本書5.4節と同じです。まず、図5-12の回路を作成する必要があります。<br />
<br />
実行するコマンドですが、作成したlircd.confを注意深く見ると、
<br />
<ul>
<li>グループ名:AC (Air Conditionerの略)</li>
<li>信号名:on, off</li>
</ul>
であることが分かりますので、<br />
<ul>
<li>オン:irsend SEND_ONCE AC on</li>
<li>オフ:irsend SEND_ONCE AC off</li>
</ul>
となります。赤外線LEDをエアコンの受光面に向けて実行してみましょう。
<br /><br />
<h3>
5. タクトスイッチとブラウザによる実行</h3>
本ページのメインのコンテンツは以上となります。
<br />
あとは「5.4.2 タクトスイッチによるテレビの操作」と「5.4.3 ブラウザによるテレビの操作」をエアコン対応にすることが課題となりますが、これらに関しては方針を記すに留めたいと思います。<br />
<br />
まず、タクトスイッチについてはPythonプログラムbb2-05-01-TV.pyを編集する必要があります。プログラムから実行されるコマンドは例えば
<br />
<pre class="prettyprint">args = ['irsend', '-#', '1', 'SEND_ONCE', 'TV', 'power']
</pre>
のように記されていますが、これを
<br />
<pre class="prettyprint">args = ['irsend', '-#', '1', 'SEND_ONCE', '<strong>AC</strong>', '<strong>on</strong>']
</pre>
などと編集して保存すると、タクトスイッチを押したときにエアコンの電源をONする信号が出力されることになります。
<br />
<br />
ブラウザによる操作の場合、編集する必要があるファイルは、<br />
「/usr/share/webiopi/htdocs/bb2/01/index.html」<br />
となります。<br />
この中で、やや長い下記の部分が、テレビリモコンのボタンを配置している部分になります。
<br />
<pre class="prettyprint"><div align="center">
<table border="0">
(略)
</table>
</div>
</pre>
これを削除し、下記を追加すれば、エアコンONとエアコンOFFのボタンのみが現れます。
<br />
<pre class="prettyprint"><button id="on" onClick="sendCommand('AC', 'on')">エアコンON</button>
<button id="off" onClick="sendCommand('AC', 'off')">エアコンOFF</button>
</pre>
<br />
以上となります。Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0