tag:blogger.com,1999:blog-19699423102977871102024-03-24T21:00:11.980+09:00ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-1969942310297787110.post-78367049493048157252024-02-13T18:56:00.000+09:002024-02-13T18:58:13.941+09:00ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作 補足情報トップ<h3>はじめに</h3>
本ページは、2020年6月に発売された金丸隆志著「カラー図解 最新 Raspberry Piで学ぶ電子工作」(講談社ブルーバックス)の補足情報をまとめるためのページです。
<br /><br />
以下のページに、書籍で利用したコマンド一覧や補足情報などを掲載します。<br />
<ul>
<li><a href="https://raspibb1a.blogspot.com/2024/02/pi-zero-pi-5.html" target="_blank">本書の内容を Pi Zero ~ Pi 5 で実行する方法</a></li>
</ul>
<br />
<h3>その他の補足情報</h3>
カメラモジュールを用いる演習を picamera2 を用いたり、あるいはウェブカメラで実行したい方は以下のページをご覧ください。<br />
<ul>
<li><a href="https://raspibb1a.blogspot.com/2023/03/picamera2-libcamera.html" target="_blank">本書の演習を picamera2 (libcamera) で実行する方法</a></li>
<li><a href="https://raspibb1a.blogspot.com/2021/04/blog-post.html" target="_blank">本書の演習をウェブカメラで実行する方法</a></li>
</ul>
<br />
Raspberry Pi Zero W 系を利用したい方はこちらをご覧ください。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/raspberry-pi-zero-wh.html" target="_blank">Raspberry Pi Zero W 系で本書の演習を行う方法</a></li>
</ul>
<br />
2021年1月に発表された Raspberry Pi Pico で電子工作してみたい方は以下のページをご覧ください。<br />
<ul>
<li><a href="https://raspibb1a.blogspot.com/2021/04/raspberry-pi-pico.html" target="_blank">本書の電子工作パーツをRaspberry Pi Picoで利用する</a></li>
<li><a href="https://raspibb1a.blogspot.com/2023/03/raspberry-pi-pico-w-wifi.html" target="_blank">Raspberry Pi Pico W を使って Wifi 経由で回路を制御してみよう</a></li>
</ul>
<br />
職場や学校などで、プロキシ(Proxy)環境下で Raspberry Pi を使う方は以下のページをご覧ください。<br />
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/proxy.html" target="_blank">プロキシ(Proxy)環境下での本書の演習の実行</a></li>
</ul>
<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>
<li><a href="https://raspibb1.blogspot.com/2019/01/raspberry-piip.html" target="_blank">Raspberry PiのIPアドレスを固定する</a></li>
</ul>
<br />
<h3>感想やレビューなど</h3>
最後に、読者の方々の感想などを下記にまとめます。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/07/blog-post.html" target="_blank">読者の方々の声</a></li>
</ul>Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-80219762038329990232024-02-13T18:55:00.014+09:002024-03-22T17:20:00.016+09:00本書の内容を Pi Zero ~ Pi 5 で実行する方法
<h3>
サンプルプログラムと回路配線図について</h3>
Pi 5 対応のサンプルプログラム、回路配線図、応用PDFは下記のリンクからダウンロードしてください。サンプルファイルを圧縮したファイルのファイル名は「 raspi1a-sample-pi5.zip 」と変更されており、「-pi5」の部分がこのファイルが Pi 5 対応であることを意味しています。
<ul>
<li><a href="https://github.com/neuralassembly/raspi/raw/master/raspi1a-sample-pi5.zip" target="_blank">Pi 5 対応サンプルプログラム raspi1a-sample-pi5.zip</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784065193396/appendix/attachments/RaspberryPi1a-Circuit.pdf" target="_blank">回路配線図</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784065193396/appendix/attachments/RaspberryPi1a-PDF_p01-39.pdf" target="_blank">応用PDF(電子版には書籍末尾についています)</a></li>
</ul>
なお、サンプルファイルである「raspi1a-sample-pi5.zip」をWindowsでダウンロードすると、Windows Defender によりウィルスと誤検出されることが多いようです(2024.3月現在)。<br />
<strong>検出されるファイルに問題がないことは確認済み</strong>です。そのため、Windows ではなく<strong>Raspberry Piで直接ダウンロードすることを推奨</strong>します。
<br /><br />
回路配線図の PDF と応用PDF は Raspberry Pi 上のブラウザでも見られますが、ブラウザ上の「↓」(ダウンロード)ボタンでダウンロードし、ファイルマネージャーで PDF ファイルを右クリックし「アプリケーションで開く」→「アクセサリ」→「ドキュメントビューア」などで開いてもよいでしょう。<br />
「選択したアプリケーションをこのファイルタイプのデフォルトのアクションとする」にチェックを入れればそのアプリケーションで開くのがデフォルト動作となります。
<br /><br />
<h3>
はじめに</h3>
本ページでは、金丸隆志著「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」(講談社ブルーバックス)の内容を Raspberry Pi Zero ~ Raspberry Pi 5 で動作させるための補足情報を紹介します。
<br /><br />
2023年9月に海外で発表された Raspberry Pi 5 (以下 Pi 5) では、GPIO を用いる仕組みがそれまでのバージョンの Raspberry Pi とは大きく異なります。<br />
その影響で、本書で解説したサンプルプログラムは Pi 5 では動作しなくなってしまいました。
<br /><br />
Pi 5 で本書の演習を実行するためには、本書のプログラムをほぼ全て書き換えねばなりません。<br />
しかし書き換えを実行すると、そのプログラムは Pi 5 だけではなく、ほぼ全ての Raspberry Pi のバージョンで動作するというメリットがあります。
<br /><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>OSバージョン</td>
</tr>
<tr>
<td>2023/5/3</td><td>Raspberry Pi OS 2023-05-03</td><td rowspan="1">Bullseye (最終版)</td>
</tr>
<tr>
<td>2023/10/10</td><td>Raspberry Pi OS 2023-10-10</td><td rowspan="2">Bookworm</td>
</tr>
<tr>
<td>2023/12/5</td><td>Raspberry Pi OS 2023-10-10</td>
</tr>
</tbody></table>
<br />
なお、それ以前の古いOSに対する情報(Pi Zero~Pi 4までのみ対応)は、下記のページに残してありますが、恐らく今後需要は減っていくでしょう。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/04/blog-post.html" target="_blank">書籍で用いたコマンドおよび補足情報(Pi Zero~Pi 4までの古い情報)</a></li>
</ul>
下の写真は、本書の10章で作成したタンクを Raspberry Pi 5 で作成し、タブレットで操作している様子です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0eDixV3-FMBgqdwvODAFUEkY8-bJdREZ_GN26axRxZ0nfzgg7jWUF2paTS2-01TYpedYCNacT1VTFy1Rs3Rf8uRDVTOqR2AM3I2CAbq0nshBOS5tiDGvrOPLiBiZTyEPbABKkAWmFreCSzzcxlpKRkhfgsxrbymxNykzdcE5kflkb8WnQtMDRFxYYMEA/s1280/pi5-tank.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="720" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0eDixV3-FMBgqdwvODAFUEkY8-bJdREZ_GN26axRxZ0nfzgg7jWUF2paTS2-01TYpedYCNacT1VTFy1Rs3Rf8uRDVTOqR2AM3I2CAbq0nshBOS5tiDGvrOPLiBiZTyEPbABKkAWmFreCSzzcxlpKRkhfgsxrbymxNykzdcE5kflkb8WnQtMDRFxYYMEA/s600/pi5-tank.jpg"/></a></div>
<br />
<h3>
本ページで表示するコマンドの利用方法</h3>
本ページには、本書の演習を実行するために必要なコマンドを全て記し、さらに、本書への補足情報を記していきます。コマンドを本ページからコピーして実行することにより、書き写すことによるミスの恐れがなく確実に実行できます。
<br />
<br />
本ページのコマンドをコピーにより活用するためには、まずRaspberry Pi上のブラウザ(Chromium)で本ページを開きます。<br />
<br />
そして、コピーしたいコマンドをマウスでなぞり色を反転してください。その状態からそのコマンドをコピーするには下記の二つの方法のうちどちらかを実行してください。<br />
<ul>
<li>色を反転した領域をマウスで右クリックして「コピー」を選択する</li>
<li>キーボードの「Ctrl」キーを押しながら「c」キーを押す(Ctrl-c)</li>
</ul>
<div>
そして、コピーされたコマンドをターミナルソフトウェアに貼り付けるには、下記の三つの方法のうちどれかを実行してください。</div>
<ul>
<li>LXTerminalのメニューから「編集」→「貼り付け」を選択する</li>
<li>LXTerminal上でキーボードの「Ctrl」キーと「Shift」キーを押しながら「v」キーを押す(Ctrl+Shift+v)</li>
<li>LXTerminal上でマウスのホイールを押し込む(ただし、この方法は正確には「コピーされた文字を貼り付ける」のではなく「マウスで色が反転された文字を貼り付ける」という動作になります)</li>
</ul>
いずれかの方法でLXTerminalにコマンドが貼り付けられたら、そのままキーボードの「Enter」キーを押せばコマンドが実行されます。<br />
<br />
なお、複数のコマンドが複数行にわたって連続して書かれている場合、コピー、貼り付け、実行はコマンド一つごとに行ってください。
<br /><br />
<h3>2章</h3>
<h4>
p.29: 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>をご覧ください。本書2章と同等の内容をアップデートされた状態で見ることができますので、参考にしてください。
<br /><br />
<h4>p.33, microSDカードの容量について</h4>
書籍では、容量が16GB以上のmicroSDカードを推奨しました。しかし、2023年10月にリリースされたOSでは、16GBでは容量が足りなくなることを確認しています。容量が32GB以上のmicroSDカードを用意して下さい。
<br /><br />
<h4>p.49, Raspberry Pi Zero WH に対する周辺機器の取り付け</h4>
Raspberry Pi Zero WH へ周辺機器を取り付けて電源を入れる方法は以下のページをご覧ください。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/raspberry-pi-zero-wh.html" target="_blank">Raspberry Pi Zero WHで本書の演習を行う方法</a></li>
</ul>
<br />
<h3>3章</h3>
<h4>p.65, 秋月電子通商のパーツセット</h4>
本書用の秋月電子通商のパーツセットは、以下のリンク先で購入できます。
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g115351/" target="_blank">ラズパイ4対応 Raspberry Pi で学ぶ電子工作 パーツセット (秋月電子通商)</a></li>
</ul>
<br />
下記のように、書籍とパーツのセットもあります。
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g115352/" target="_blank">ラズパイ4対応 Raspberry Pi で学ぶ電子工作(書籍+パーツセット) (秋月電子通商)</a></li>
</ul>
<br />
<h3>4章</h3>
<h4>p.92, 4章のサンプルプログラム</h4>
4章ではLEDを点滅するプログラムとして下記の2つのプログラムを用います。
<ul>
<li>04-01-led.py</li>
<li>04-02-led.py</li>
</ul>
書籍では、GPIOの制御に RPi.GPIO というライブラリを用いていましたが、これは Pi 5 では動作しなくなっています。そこで、本ページでダウンロードして頂いた raspi1a-sample-pi5.zip に含まれるファイルでは使用ライブラリを RPi.GPIO から <a href="https://gpiozero.readthedocs.io/en/latest/" target="_blank">gpiozero</a> に変更しています。動作は同じですので安心してご利用ください。
<br /><br />
<h3>5章</h3>
<h4>p.112, 5章のサンプルプログラム</h4>
5章ではタクトスイッチを用いるプログラムとして下記の6つのプログラムを紹介しています。
<ul>
<li>05-01-sw.py</li>
<li>05-02-sw-pd.py</li>
<li>05-03-event-pd.py</li>
<li>05-04-sw-camera.py</li>
<li>05-05-sw-mp3.py</li>
<li>05-06-sw-poweroff.pyy</li>
</ul>
4章と同様、本ページでダウンロードして頂いた raspi1a-sample-pi5.zip に含まれるファイルでは GPIO を制御するためのライブラリを RPi.GPIO から <a href="https://gpiozero.readthedocs.io/en/latest/" target="_blank">gpiozero</a> に変更しています。動作は同じですので安心してご利用ください。
<br /><br />
<h4>p.128, カメラモジュールを利用したプログラムについて</h4>
Raspberry Pi をカメラにするためのプログラム 05-04-sw-camera.py にはいくつかの注意があります。
<br /><br />
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 でも利用可能です。本書のキャタピラ式模型に搭載する場合、200mm のものが良いのではないかと思います。
<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://1.bp.blogspot.com/-WSUAKHaGeUA/XuMZR2TnylI/AAAAAAAAHu0/8gWzJ9gwvpYdFobmpHpGYamM3HVBxyW9QCLcBGAsYHQ/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://1.bp.blogspot.com/-WSUAKHaGeUA/XuMZR2TnylI/AAAAAAAAHu0/8gWzJ9gwvpYdFobmpHpGYamM3HVBxyW9QCLcBGAsYHQ/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>
さらに、映像を保存するために OpenCV という画像処理ライブラリを用いますので、以下のコマンドで OpenCV をインストールする必要があります。
<pre class="prettyprint">
sudo apt update
sudp apt install python3-opencv
</pre>
以上の準備の下、 05-04-sw-camera.py を実行することができます。
<br /><br />
<h4>p.132, コマンドプロンプトの表記</h4>
p.132ではコマンドプロンプトの表記として以下を紹介しました。
<pre class="prettyprint">
pi@raspbberrypi:~ $
</pre>
ここに見える「pi」はユーザー名を表しており、ユーザー名「pi」は2022年4月以前の古いOSで用いられていたデフォルトのユーザー名です。最新のOSを用いている方ならば、「pi」の部分に自分で決めたユーザー名が表示されているでしょう。
私の場合でしたら「pi」ではなく「kanamaru」と表示されます。
<br /><br />
<h4>p.132, mplayer のインスト―ルコマンド</h4>
以下のコマンドは、インストール可能なソフトウェアのリストを更新します。
<pre class="prettyprint">sudo apt update
</pre>
以下のコマンドで、mplayerをインストールします。
<pre class="prettyprint">sudo apt install mplayer
</pre>
途中で「続行しますか?」や「検証なしにこれらのパッケージをインストールしますか?」と質問された場合、それぞれで[y]をタイプしたあと[Enter]キーを押して続行しましょう。
<br /><br />
<h4>p.133, mplayer の実行コマンド</h4>
プログラムの存在するディレクトリ(フォルダ)で以下のコマンドを実行すると、05-07-test.mp3 というサンプル音声を再生することができます。音が鳴らない場合は引き続き以下もお読みください。
<pre class="prettyprint">mplayer 05-07-test.mp3
</pre>
なお、サンプルプログラムを bluebacks ディレクトリ(フォルダ)に保存した場合は、上記コマンドを実行する前に以下のコマンドを実行して bluebacks ディレクトリ内に移動する必要があります。
<pre class="prettyprint">cd bluebacks
</pre>
<h4>p.134, 音声の出力先を変更する方法</h4>
音声を HDMI ケーブル経由ではなく、Raspberry Pi の基板上のイヤフォンジャックから聞きたい場合、デフォルトでは音が鳴らないことがあります。
イヤフォンジャックから鳴らすための方法は、OSのバージョンにより異なります。
<br /><br />
<h4><2023-10-10版以降の Raspberry Pi OS をご利用の場合(Bookworm)></h4>
もし、デフォルトでピンジャックから音が出ていない場合、以下の指示に従ってください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
<ol>
<li>ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く</li>
<li>キーボードの「↓」キーを五回押し、「6 Advanced Options」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「6 Advanced Options」に入る</li>
<li>キーボードの「↓」キーを六回押し、「A7 Audio Config」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「A7 Audio Config」に入る</li>
<li>キーボードの「上」キーを一回押し、「1 PulseAudio」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「1 PulseAudio」を選択する</li>
<li>キーボードの「Enter」キーを押し、「了解」を選択する</li>
<li>キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押すと、再起動され設定が有効になる</li>
</ol>
<br /><br />
<h4>Raspberry Pi OS が Bullseye の場合></h4>
2020-12-02版およびそれ以降の Raspberry Pi OS をご利用で、なおかつイヤフォンジャックから音が鳴らない場合、raspi-configというコマンドで音声の出力先をイヤフォンジャックに切り替えます。
以下の手順に従ってください。
<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>
<br />
以上で、下記コマンドで
<pre class="prettyprint">mplayer 05-07-test.mp3
</pre>
イヤフォンジャックから音声が出るようになります。
<br /><br />
<h3>
6章</h3>
<h4>
全般:AD コンバータ MCP3208 の利用のために SPI を有効にしておく</h4>
6章でも、本ページでダウンロードして頂いた raspi1a-sample-pi5.zip に含まれるファイルでは GPIOを 制御するためのライブラリとして <a href="https://gpiozero.readthedocs.io/en/latest/" target="_blank">gpiozero</a> を用いています。おおむね書籍と同様の使い方ができるプログラムを用意していますが、6章(および8章)のプログラムは「事前に SPI を有効にしておかなければならない」点が異なります。具体的には以下の指示に従ってください。
<ol>
<li>デスクトップ左上のメニューから、「設定」→「Raspberry Piの設定」を起動</li>
<li>「インターフェイス」タブをクリック</li>
<li>「SPI」のスイッチをONにして有効化する</li>
</ol>
以上で SPI の有効化は完了です。06-01-print.py や 06-02-led.py を書籍と同様に利用できるでしょう。なお、06-04-manual-spi.py は 06-01 を SPI を無効な状態で実現するためのプログラムですが、使用する必要性はあまりないと思います。
<br /><br />
<h4>
p.144:半固定抵抗の回転の向きについて</h4>
本書では、半固定抵抗として秋月電子通商の「<a href="https://akizukidenshi.com/catalog/g/g108012/" target="_blank">半固定ボリューム 10kΩ</a>」を用いて解説をしています(パーツセットに含まれるものです)。<br />
<br />
半固定抵抗は、製品の種類によって、AD変換により得られた値が大きくなる回転の向きが異なることがあります。<br />
<br />
そのような場合、下図のように、3.3VとGNDへの接続を逆にすると良いでしょう。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-PXD1aMjjIPc/V4hjnV18voI/AAAAAAAAEtk/djfCqNyzpws5wHcrOTk8Dt2W1l9mzNNYQCLcB/s1600/VolumeNotice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://3.bp.blogspot.com/-PXD1aMjjIPc/V4hjnV18voI/AAAAAAAAEtk/djfCqNyzpws5wHcrOTk8Dt2W1l9mzNNYQCLcB/s400/VolumeNotice.png" width="400" /></a></div>
<br />
<h3>7章</h3>
<h4>
全般:7章のプログラム</h4>
7章の I2C を用いるプログラムは、書籍とほぼ同じです。これらのプログラムでは RPi.GPIO を用いておらず、変更の必要がないためです。
<br /><br />
<h4>p.162, I2C利用のための準備</h4>
I2Cを利用するためには、設定アプリケーションのインターフェイスにおける「I2C」を有効にする必要があります。
<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=50000
</pre>
ファイルを保存したら、テキストエディタを閉じ、Raspberry Piを再起動してください。
この設定は、I2Cの動作速度をデフォルトの100kHzから50kHzに落とす働きがあります。そうしないと、kernel 6.6.20 以降の Pi 5では7.3で用いるLCDが動作しないことがあったため、この設定を行います。Pi 4 Bまでの機種ではこの設定は必要ありません。<br />
将来はこの設定は不要になるかもしれませんが、2024年3月後半時点では、解決されていません。
<br /><br />
<h4>p.165, 接続されている I2C デバイスのアドレスを表示するコマンド</h4>
接続されている I2C デバイスのアドレスを表示するコマンドは以下の通りです。
<pre class="prettyprint">i2cdetect -y 1
</pre>
<h4>p.178, LCD へ文字を表示するプログラムの実行コマンド</h4>
ターミナルから 07-02-LCD.py を実行するコマンドは以下の通りです。付録C.3「タブによる補完」を学ぶと、ターミナルでのプログラムの実行が格段に楽になりますので興味のある方は参考にしてください。
<pre class="prettyprint">python3 07-02-LCD.py
</pre>
なお、サンプルプログラムを bluebacks ディレクトリに保存した場合は、上記コマンドを実行する前に以下のコマンドを実行して bluebacks ディレクトリ内に移動する必要があります。
<pre class="prettyprint">cd bluebacks
</pre>
<h4>p.179, LCD へ文字を表示するプログラムをコマンドライン引数つきで実行するコマンド</h4>
<pre class="prettyprint">python3 07-02-LCD.py 'test'
</pre>
<h3>8章</h3>
<h4>
全般:8章のプログラム</h4>
これまでの章と同様、本ページでダウンロードして頂いた raspi1a-sample-pi5.zip に含まれるファイルでは GPIO を制御するライブラリを RPi.GPIO から <a href="https://gpiozero.readthedocs.io/en/latest/" target="_blank">gpiozero</a> に変更しています。動作は同じですので安心してご利用ください。
<br /><br />
なお、ハードウェアPWMを用いる 8.6 章(p.214)の内容は、pigpio や WiringPi-Python(本書旧版)などの外部ライブラリを用いるのではなく、自作のプログラムを利用しています。本ページ下部にある該当ページの補足をご覧ください。
<br /><br />
<h4>p.214, ハードウェアPWMを利用するための準備</h4>
本書p.214 では、ハードウェアPWMを用いるための解説を行っていますが、本ページでは別の仕組みでハードウェアPWMを実現しますので、本書 p.214 の指示に従う必要はありません。
その代替として、以下のように /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 />
本ページでダウンロードした raspi1a-sample-pi5.zip に含まれる 08-04-servo.py を利用できますので試してみてください。
同様に、追加 PDF 17ページの 08-06-2servos.py も利用可能です。
<br /><br />
なお、Pi 5 をお使いで、アップデートした OS や 2024年3月リリースの OS で kernel 6.6.20 をお使いの方は、ハードウェアPWMを使うプログラムが動作しなくなっています。この問題は kernel 6.6.21 以降で修正される予定ですが、<br />
それまでは、サーボモーターを用いた演習を後回しにするか、2023年12月にリリースされたOSをアップデートせずに用いるのが良いでしょう。
<br /><br />
<h3>9章</h3>
<h4>p.227, WebIOPi ではなく FastAPI を用いる</h4>
第9章ではブラウザを介して回路の制御を行います。そのために、本書では WebIOPi というライブラリを用いました。WebIOPi は、Webサーバーとなる機能と GPIO を操作する機能を組み合わせたライブラリなのでした。
<br />
しかし、WebIOPi は Raspberry Pi 5 では動作しませんので、本ページではその代替として FastAPI というライブラリを用います。FastAPI は python3 で簡易的な Webサーバーを作成できるライブラリです。GPIO を操作する機能はありませんので、gpiozero などと組み合わせて用います。
<br /><br />
以上の理由から、WebIOPi についての解説がほとんどである本書 p.227~p.243 の解説は現時点ではほぼ参考になりませんし、そこでの手順に従う必要もありません。代わりに、本ページの解説をご覧ください。
<br /><br />
まず、下記コマンドで FastAPI をインストールします。
<pre class="prettyprint">
sudo apt update
sudo apt install python3-fastapi
</pre>
以上で FastAPI を用いた演習の準備は完了です。個別の演習の実行方法を以下で解説していきます。
<br /><br />
<h4>p.243, ブラウザでLEDのオンオフを制御する</h4>
9.3 章(p.243)の演習を実行するためには、まず図9-4の回路を作成します。
その後、FastAPI を用いて書かれた Web サーバーを下記の手順で実行します。
<br />
まず、ターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「09-01-led」に移動します。
<pre class="prettyprint">
cd 09-01-led
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/09-01-led
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/9-1
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/9-1 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.246 の図 9-6 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
<br />
<h4>p.234, IP アドレスを調べるためのコマンド</h4>
<pre class="prettyprint">ifconfig
</pre>
<br />
<h4>p.234:IPアドレスでのURLの指定について</h4>
本書では、ブラウザからRaspberry Piにアクセスする際に、ルーターなどからRaspberry Piに割り振られたIPアドレスを用いました。すなわち、IPアドレスが192.168.1.3の場合にブラウザから例えば下記のようにアクセスしました。
<br />
<ul>
<li>http://192.168.1.3:8000/9-1</li>
</ul>
しかし、この方法はifconfigコマンドなどで事前にIPアドレスを調べておく必要があり、やや面倒でした。<br />
このIPアドレスの指定を簡単化する方法をPDFの付録E(PDF32)に記しましたが、ここにも記しておきます。
<br /><br />
以下の環境では、IPアドレスを用いずに「raspberrypi.local」のような名前でRaspberry Piにアクセスできます。
<ul>
<li>iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです)</li>
<li>macOS</li>
<li>iPhoneやiPad</li>
</ul>
上記の環境では、ブラウザのアドレス欄に例えば下記のように入力すればIPアドレスを用いずにアクセスできます。
<br />
<ul>
<li>http://raspberrypi.local:8000/9-1</li>
</ul>
これは、Raspberry Pi OS上で動作しているavahiというソフトウェアの働きによります。<br />
<br /><br />
<h4>p.252, ブラウザで温度センサの値の表示</h4>
9.4 の演習も FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
それが済んでいるなら、p.253 の図9-8 の回路を作成しましょう。
そしてターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「09-02-temp」に移動します。
<pre class="prettyprint">
cd 09-02-temp
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/09-02-temp
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/9-2
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/9-2 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.254 の図 9-9 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
<br />
<h4>p.257, ブラウザでフルカラーLEDの制御</h4>
9.5 の演習も FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
それが済んでいるなら、p.257 の図9-10 の回路を作成しましょう。
そしてターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「09-03-rgbled」に移動します。
<pre class="prettyprint">
cd 09-03-rgbled
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/09-03-rgbled
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/9-3
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/9-3 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.259 の図 9-11 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
<br />
<h4>p.263, ブラウザでDCモーターの速度制御</h4>
9.6 の演習も FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
それが済んでいるなら、p.264 の図9-12 の回路を作成しましょう。
そしてターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「09-04-dcmotor」に移動します。
<pre class="prettyprint">
cd 09-04-dcmotor
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/09-04-dcmotor
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/9-4
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/9-4 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.266 の図 9-13 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
<br />
<h4>PDF19, ブラウザでサーボモーターの制御</h4>
追加 PDF 19ページにある 9.7 の演習も FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
さらに、ハードウェアPWMを使いますので、
本ページ上部「p.214, ハードウェアPWMを利用するための準備」の指示に従い、
/boot/config.txt (将来は /boot/firmware/config.txt)の末尾に「 dtoverlay=pwm-2chan 」を追記しておく必要があります。
<br /><br />
以上が済んでいるなら、PDF 20 ページ の図9-14 の回路を作成しましょう。
そしてターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「09-05-servo」に移動します。
<pre class="prettyprint">
cd 09-05-servo
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/09-05-servo
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/9-5
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/9-5 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は PDF21 の図 9-15 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
<br />
<h3>10章</h3>
<h4>全般, FastAPI の準備が必要</h4>
第10章でも第9章と同様、 WebIOPi ではなく FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
<br />
<h4>p.281, ブラウザでツインモーターギヤーボックスの動作確認</h4>
10.3 の演習 (p.281) も FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
FastAPI の準備が済んでいるなら、p.282 ページ の図10-4 の回路を作成しましょう。
そしてターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「10-01-tank」に移動します。
<pre class="prettyprint">
cd 10-01-tank
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/10-01-tank
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/10-1
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/10-1 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.284 の図 10-5 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
<br />
<h4>p.286, FastAPI を用いたプログラムの自動起動</h4>
p.286 には WebIOPi の自動起動の方法が記されていますが、本ページでは、これを「FastAPI を用いたプログラムの自動起動」、すなわち「python3 app.py コマンドの自動起動」に置き換えて解説します。
<br /><br />
「python3 app.py コマンドの自動起動」を実現するためには、このコマンドをサービスとして登録するのが確実です。
そのために必要なファイルは、サンプルファイルの中の 10-01-tank ディレクトリにある webtank.service というテキストファイルとして保存されています。
このファイルを活用する前に、その内容を皆さんの環境に合わせてカスタマイズする必要があります。
<br /><br />
このファイルは単なるテキストファイルのですので、テキストエディタ(mousepad)で開いてみましょう。
<br /><br />
管理者権限は不要ですのでファイルマネージャから開いても良いですし、コマンドで開く場合、「 cd 10-01-tank 」または「 cd blubacks/10-01-tank 」でディレクトリを移動した後、下記コマンドで開けます。
<pre class="prettyprint">
mousepad webtank.service
</pre>
すると、以下の内容がみられます。
<pre class="prettyprint">
[Unit]
Description=WebTank
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/pi/10-01-tank
#WorkingDirectory=/home/pi/bluebacks/10-01-tank
ExecStart=/usr/bin/python3 -m app
TimeoutStopSec=5
StandardOutput=null
[Install]
WantedBy = multi-user.target
</pre>
変更しなければならないのは下記の部分、すなわち、プログラムが存在するディレクトリを指定している部分です。
<pre class="prettyprint">
WorkingDirectory=/home/pi/10-01-tank
#WorkingDirectory=/home/pi/bluebacks/10-01-tank
</pre>
2行ありますが、2行目の先頭に「#」がついていますのでこちらは無効化された状態です。<br />
1行目がサンプルファイルをホームディレクトリに直に展開した場合、2行目がサンプルファイルを bluebacks ディレクトリ内に展開した場合ですので、
自分に合った方を有効にしてください。<br />
<br />
次に着目して頂きたいのは、ディレクトリの「/home/pi」の部分です。この「pi」はユーザー名を現していますので、これを皆さんのユーザー名に変更してください。
私の場合でしたら、「pi」の部分を「kanamaru」に変更、ということです。
変更が済んだら上書き保存し、mousepad を閉じてください。
<br /><br />
その後、下記のコマンドで webtank.service ファイルを /etc/systemd/system ディレクトリに管理者権限でコピーします。
<pre class="prettyprint">
sudo cp webtank.service /etc/systemd/system/
</pre>
そうすると、ブラウザでキャタピラ式模型を操作するためのプログラムが「webtank」という名前のサービスとして利用できるようになります。サービスの起動と終了を行うコマンドは以下の通りです。これらのコマンドは、どのディレクトリで実行しても構いません。
<br /><br />
サービス起動(python3 app.py を実行するのと同等)
<pre class="prettyprint">
sudo service webtank start
</pre>
サービス終了(python3 app.py の終了と同等)
<pre class="prettyprint">
sudo service webtank 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 webtank
</pre>
このコマンドを実行後、Raspberry Pi を再起動すると、自動で webtank が起動されるようになります。ps ax コマンドで確認してみましょう。
<br /><br />
自動起動を無効に戻すには、以下のコマンドを用います。
<pre class="prettyprint">
sudo systemctl disable webtank
</pre>
<br />
<h4>p.287, IPアドレスの自動表示</h4>
IP アドレスを自動表示する方法は書籍の解説通りです。/etc/rc.local を管理者権限のテキストエディタで開くコマンドは下記の通りです。
<pre class="prettyprint">sudo mousepad /etc/rc.local
</pre>
<br />
<h4>p.287, IPアドレスをLCDに表示するために /etc/rc.local に記入するコマンド</h4>
IPアドレスをLCDに表示するために /etc/rc.local に記入するコマンドは下記の通りです。
<pre class="prettyprint">python3 /home/pi/07-02-LCD.py $_IP
</pre>
なお、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/07-02-LCD.py $_IP」となる、ということです。
<br /><br />
また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">python3 /home/pi/bluebacks/07-02-LCD.py $_IP
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
なお、p.289 の「ネットワークを待つ (Wait for network)」の設定は今はありません。そのため、 Raspberry Pi がネットワークに接続されるより前に上記コマンドが実行され、
LCD に IP アドレスが表示されない、ということが起こりえます。
<br />
そのような状態になった場合、以下の3つの対策が思いつきます。
<ul>
<li>上記コマンドの1行上に「sleep 10」と書かれた行(10秒待つ、の意味)を挿入して保存する</li>
<li>「p.234:IPアドレスでのURLの指定について」を参考に、IPアドレスではなく、raspberrypi.local でブラウザのアドレスを指定する(LCDへのIPアドレスの表示が不要になる)</li>
<li>IPアドレスのLCDへの表示プログラムを、/etc/rc.local に書くのではなく、service として登録する</li>
</ul>
1番目か2番目の対策が簡単だと思います。3番目の対策は、希望があったら公開します。
<br />
<br />
<h4>p.291, シャットダウンプログラムの自動実行のために /etc/rc.local に記入するコマンド</h4>
シャットダウンプログラムの自動実行も、おおむね書籍の解説の通りです。実行するファイル名が、「10-01~」から「10-04~」に変更されていますので注意してください。
このプログラムも RPi.GPIO から gpiozero の利用へ変更されています。
<br /><br />
/etc/rc.local へ記入する行は下記です。末尾の「&」も忘れずにコピーしましょう。
<pre class="prettyprint">python3 /home/pi/10-04-sw-poweroff.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
なお、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">python3 /home/pi/bluebacks/10-04-sw-poweroff.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.292:キャタピラ式模型のメンテナンス</h4>
キャタピラ式模型を長く使っていると、だんだん動作が安定しなくなってくることがあります。例えば「右のキャタピラは正常動作するが、左はなかなか動かない」などです。
<br />
<br />
もちろん、「ジャンパーワイヤーが抜けていないか」など、回路の配線をまずはチェックすべきです。
しかし回路の配線に問題がなかった場合、どこに注意してメンテナンスすべきかを以下に記します。上から順にチェックしていきましょう。
<br />
<ol>
<li>電池の残量不足ではないかチェック:基本ではありますが、まずはここからチェックしましょう。</li>
<li>ジャンパワイヤのチェック:ジャンパワイヤの抜き差しをする際、持ち手ではなくケーブルを引っ張ることを繰り返すと中で断線することがあります。断線したかどうかは外から見ただけではわかりません。断線が疑われるジャンパワイヤは捨ててしまった方がよいでしょう。
</li>
<li>モーターの軸が空回りしていないかチェック:モーターの軸にはピニオンギアが取り付けられています。ピニオンギアが劣化してゆるくなり、モーターの軸が空回りすることがしばしば起こります。これはモーターをギアボックスから取り外してみないとわかりません。ピニオンギアがゆるくなっていた場合、「<a href="https://www.tamiya.com/japan/products/89836/index.html" target="_blank">AO-7005 8Tピニオンセット白(10個)</a>」などを購入して交換しましょう。
</li>
<li>ギアボックスで空回りしているシャフトがないかチェック:ギアボックスの作成の際、イモネジを六角レンチで締めてシャフトを固定している部分があります。そこが緩んで空回りしていないかチェックしましょう。
</li>
<li>ブレッドボードのチェック:ブレッドボードを長くつかっていると、なんらかの理由でブレッドボード内部の抵抗が大きくなりモーターがあまり回転しなくなることがあります。筆者は複数回そのような経験をしています。安価なもので良いのでテスターを購入すると内部の抵抗の大きさをチェックできます。内部の抵抗が大きく計測されたブレッドボードは消耗品と考えて捨ててしまった方がよいでしょう。
</li>
<li>モーターのチェック:上のどの問題にも該当しなかった場合、モーターに問題がある可能性があります。新品の「<a href="https://www.tamiya.com/japan/products/94380/index.html" target="_blank">AO-1001 FA-130タイプノーマルモーター</a>」を購入して交換してみるのも手です。
</li>
<li>モータードライバーのチェック:上のどの問題にも該当しなかった場合、モータードライバに問題がある可能性があります。新品のモータードライバーを購入して交換してみるのも手です。
</li>
</ol>
<br />
<h4>p.292, Raspberry Pi 5 でのカメラの取り付けについて</h4>
Raspberry Pi 5 でカメラモジュールを用いる場合、別途ケーブルを購入しなければいけないわけですが、キャタピラ式模型に搭載する場合、必要な長さを考えると下記のものが良いのではないかと思います。標準のものよりケーブルが硬いので取り扱いに注意してください。
<ul>
<li><a href="https://www.switch-science.com/products/9255" target="_blank">Raspberry Pi 5 FPCカメラケーブル(200mm)</a></li>
</ul>
<br />
<h4>p.293, mjpg-streamer のインストールコマンド</h4>
p.293 で紹介した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.294:mjpg-streamerの実行用コマンド</h4>
mjpg-streamerの実行用ファイルは、書籍から名称が変わり 10-05-stream.py です。以前まではこのファイルは拡張子が sh のシェルスクリプトでしたが、Python によるスクリプトに変更しました。<br />
理由は、libcamera 対応の mjpg-streamer が時折異常終了するため(典型的には 30 分おきくらい)、2秒おきに実行状況をチェックして必要に応じて mjpg-streamer を再起動させるためです。
<br />
お手元のファイルが Python ファイル (拡張子 py) ではなくシェルスクリプトのまま(拡張子 sh)の場合は、raspi1a-sample-pi5.zip をダウンロードしなおしてください(2024.2.28更新)。
<br /><br />
このファイルを実行する前に、使用しているカメラモジュールの設定が必要な場合があります。
まず、mousepad で 10-05-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 の実行コマンドを /etc/rc.local に記すことになります。記す内容は下記の通りです。
<pre class="prettyprint">python3 /home/pi/10-05-stream.py &
</pre>
ただし、「pi」の部分は自分のユーザー名に変更する必要があります。
<br /><br />
なお、サンプルファイルを bluebacks ディレクトリに展開したのならば、記すコマンドは下記です。
<pre class="prettyprint">python3 /home/pi/bluebacks/10-05-stream.py &
</pre>
こちらも、「pi」の部分は自分のユーザー名に変更する必要があります。
<br /><br />
<h4>p.296, カメラ付きキャタピラ式模型を制御するためのプログラム</h4>
p.296 におけるカメラ付きキャタピラ式模型を制御にも FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
FastAPI の準備が済んでいるなら、p.282 ページ の図10-4 の回路を作成しましょう。さらに、mjpg-streamer が起動済である必要があります。
そしてターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「10-02-image」に移動します。
<pre class="prettyprint">
cd 10-02-image
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/10-02-image
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/10-2
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/10-2 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は p.297 の図 10-9 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
なお、このカメラ付きキャタピラ式模型を制御するためのプログラムを自動起動したい場合、webtank.service の中身の WorkingDirectory を 10-02-image に変更した上で /etc/systemd/system にコピーすれば良いでしょう。
<br /><br />
なお、ブラウザ上のカメラの映像ですが、上述した mjpg-streamer が異常終了の問題が起こった場合、映像がそこで停止しているでしょう。その場合、ブラウザで再読み込みを実行すると、映像が再び流れ始めると思います。
<br /><br />
<h4>PDF 26, カメラ+サーボモーター付きキャタピラ式模型を制御するためのプログラム</h4>
PDF 26 におけるカメラ+サーボモーター付きキャタピラ式模型を制御にも FastAPI を用います。本ページ上部にある「p.227, WebIOPi ではなく FastAPI を用いる」の解説により、FastAPI をインストールしておく必要があります。
<br /><br />
FastAPI の準備が済んでいるなら、PDF29 ページ の図10-13 の回路を作成しましょう。さらに、mjpg-streamer が起動済である必要があります。さらに、ハードウェアPWMを使いますので、
本ページ上部「p.214, ハードウェアPWMを利用するための準備」の指示に従い、
/boot/config.txt (将来は /boot/firmware/config.txt)の末尾に「 dtoverlay=pwm-2chan 」を追記しておく必要があります。
<br /><br />
以上の準備のもとターミナルを新規に開き、下記のコマンドを実行することで Webサーバーのプログラムが存在するディレクトリ「10-03-servo」に移動します。
<pre class="prettyprint">
cd 10-03-servo
</pre>
サンプルプログラムを bluebacks ディレクトリに展開した場合の移動コマンドは以下です。
<pre class="prettyprint">
cd bluebacks/10-03-servo
</pre>
移動したら、下記のコマンドで Web サーバーを実行します。
<pre class="prettyprint">
python3 app.py
</pre>
このコマンドが実行されたままの状態で、ブラウザで下記のアドレスにアクセスします。ブラウザは Raspberry Pi のものでも、同一ネットワーク内にある PC やスマートフォンのものでも構いません。
<pre class="prettyprint">
http://(Raspberry PiのIPアドレス):8000/10-3
</pre>
例えば、Raspberry PiのIPアドレスが 192.168.1.3 ならば、ブラウザのアドレス欄に「 http://192.168.1.3:8000/10-3 」を記入して Enter キーを押す、ということです。
Raspberry PiのIPアドレスの調べ方は、本書 p.234 に載っているように ifconfig コマンドを用いても良いですし、Raspberry Pi のデスクトップ右上の Wifi アイコンにマウスポインタを重ねることでも調べられると思います。
<br /><br />
現れるページの見た目と機能は PDF30 の図 10-14 と同じです。なお、「{"detail":"Not Found"}」というエラーが表示される場合、もう一度 raspi1a-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>
なお、このカメラ+サーボモーター付きキャタピラ式模型を制御するためのプログラムを自動起動したい場合、webtank.service の中身の WorkingDirectory を 10-03-servo に変更した上で /etc/systemd/system にコピーすれば良いでしょう。
<br /><br />
<h4>PDF 29, DCモーターとサーボモーターを同時に使うとサーボモーターが不安定になる場合(図10-13)</h4>
図10-13のようにDCモーターとサーボモーターを同時に使うとサーボモーターが不安定になる場合があります。
<br /><br />
これは、DCモーターの回転により発生するノイズがサーボモーターに影響を与えているためです。この問題に対する簡単な対処法は、下図のように
サーボモーターの電源用配線を、Raspberry Pi の 5V ピンに接続することです。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-jumrIs9LBiY/X9l6JfN4EGI/AAAAAAAAH64/ZotCf29zBR8yUz4iqJATkFXGE-DoMaSNwCLcBGAsYHQ/s1320/fig10-13mod.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1110" data-original-width="1320" src="https://1.bp.blogspot.com/-jumrIs9LBiY/X9l6JfN4EGI/AAAAAAAAH64/ZotCf29zBR8yUz4iqJATkFXGE-DoMaSNwCLcBGAsYHQ/s600/fig10-13mod.png"/></a></div>
このような接続をすると、今度はサーボモーターの負荷により Raspberry Pi が不安定になる可能性がありますが、以下の条件が満たされれば Raspberry Pi は安定して動作します。
<ul>
<li>サーボモーターにあまり大きな負荷をかけない。この演習の例では、Raspberry Pi のカメラモジュールという軽いものを動かすだけなので問題にはなりにくいでしょう</li>
<li>Raspberry Piを動作させるためのモバイルバッテリーの流せる電流量(「A」や「mA」で表示されているもの)が大きい。筆者は Raspberry Pi 4 に対して 3.0 A のバッテリーを用意しました</li>
</ul>
なお、この DC モーターによるノイズの問題に関しては、本書p.213の図8-12のように、DCモーターに3つのコンデンサを取り付けることでも改善が期待できます。
<br /><br />
<h3>付録</h3>
<h4>p.308, サンプルファイルの展開先(図B-4)</h4>
<pre class="prettyprint">/home/pi/bluebacks
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上の記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「/home/kanamaru/bluebacks」となる、ということです。
<br /><br />
<h4>p.310, nano の設定ファイル .nanorc に記す内容</h4>
<pre class="prettyprint">set tabsize "4"
set tabstospaces
</pre>
<h4>p.310, vi の設定ファイル .vimrc に記す内容</h4>
<pre class="prettyprint">set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4
</pre>
<h4>p.312, 日本語入力ソフトウェアのインストールコマンド</h4>
日本語入力ソフトウェアのインストールについて、これまで本書では ibus-mozc のインストールをお勧めしてきましたが、OS の更新に伴い メニューバー上での挙動がおかしい、などの不具合が増えてきましたので、
別のソフトウェアである fcitx-mozc に切り替えた方が良いかもしれません。
<br /><br />
まず、インストール済の ibus-mozc を削除するには以下のコマンドを実行します。
<pre class="prettyprint">sudo apt remove ibus-mozc ibus
</pre>
その後 Raspberry Pi を再起動することで ibus-mozc の削除が完了します。
<br /><br />
そして、fcitx-mozc のインストールは下記のコマンドで行います。
<pre class="prettyprint">sudo apt update
sudo apt install fcitx-mozc
</pre>
再起動後、半角/全角キーや Ctrl+スペースキーにより、日本語入力をオンオフできます。
<br /><br />
<h4>p.313, 日本語フォントのインストールコマンド</h4>
<pre class="prettyprint">
sudo apt install fonts-vlgothic
</pre>
<h3>補足PDF</h3>
<br /><br />
<h4>PDF 11, デジタル温度計の自動実行のために /etc/rc.local に記すコマンド</h4>
末尾の「&」も忘れずにコピーしましょう。
<pre class="prettyprint">python3 /home/pi/07-03-LCD-temp.py &
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/07-03-LCD-temp.py &」となる、ということです。
<br /><br />
また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">python3 /home/pi/bluebacks/07-03-LCD-temp.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-88246501195529242332024-02-13T18:54:00.000+09:002024-02-13T18:59:21.650+09:00読者の方々の声本ページでは、読者の方々の感想などをご紹介したいと思います。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Raspberry Piを用いたデジタル温度計(I2C接続)<br>・Raspberry Pi 3 modelB<br>・ADT7410使用温度センサモジュール<br>・I2C低電圧キャラクタ液晶モジュール(16×2行)<br>etc<br>はんだづけとか10年ぶりだったwwただの趣味です(独学中の素人)<a href="https://twitter.com/hashtag/RaspberryPi%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#RaspberryPiで学ぶ電子工作</a> <a href="https://t.co/kTrgHSjQtI">pic.twitter.com/kTrgHSjQtI</a></p>— 👑Match (@hayato37616523) <a href="https://twitter.com/hayato37616523/status/1455781256101171204?ref_src=twsrc%5Etfw">November 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">やったー、嬉しい🥰<br>タクトスイッチを押したらLEDが点くやつ、コピペでできました👍<br>こんな数行でできちゃうんだぁ〜!<br>もっといろんな色の電線が欲しいなぁ😅<a href="https://twitter.com/hashtag/RaspberryPi%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#RaspberryPiで学ぶ電子工作</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://twitter.com/hashtag/python?src=hash&ref_src=twsrc%5Etfw">#python</a> <a href="https://t.co/p47KSadwoJ">pic.twitter.com/p47KSadwoJ</a></p>— ナルシー (@NarcyCars) <a href="https://twitter.com/NarcyCars/status/1363007908049420291?ref_src=twsrc%5Etfw">February 20, 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">Raspberry Piを使ってスマホやPCから操作できるキャタピラ式模型が完成したぞ!初心者でも電子工作でここまでできた! <a href="https://t.co/CpWgLHC0od">pic.twitter.com/CpWgLHC0od</a></p>— 『』 (@osashimi1314) <a href="https://twitter.com/osashimi1314/status/1413603621338456070?ref_src=twsrc%5Etfw">July 9, 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">ラズパイ電子工作。タクトスイッチによるMP3音楽のON、OFF。<br>エリッククラプトンの曲を再生させてる😃<br>テキストは <a href="https://twitter.com/hashtag/RasberryPi%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C?src=hash&ref_src=twsrc%5Etfw">#RasberryPiで学ぶ電子工作</a><br>講談社ブルーバックス <a href="https://t.co/uQ2HXGhyqm">pic.twitter.com/uQ2HXGhyqm</a></p>— くりしゅな通信 ∴ (@yogaG6_33_9) <a href="https://twitter.com/yogaG6_33_9/status/1345924001344880642?ref_src=twsrc%5Etfw">January 4, 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">ラズパイ、Webサーバーにする前に電子工作して遊びたいので買いました <a href="https://t.co/tBUAUoFxv1">pic.twitter.com/tBUAUoFxv1</a></p>— ひらっち🦊ばーちゃるケモミミ美少女狐娘エンジニア (@hirattchi0928) <a href="https://twitter.com/hirattchi0928/status/1333620092471427072?ref_src=twsrc%5Etfw">December 1, 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"><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> 4 <a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%AB%E3%83%BC?src=hash&ref_src=twsrc%5Etfw">#スマートカー</a> を <a href="https://twitter.com/hashtag/WebIOPi?src=hash&ref_src=twsrc%5Etfw">#WebIOPi</a> で動かしました。「RaspberryPiで学ぶ電子工作」のプログラムを少し変えて操作しています。動作も動画も概ね途切れることなくスムーズです☺️。ただ何故か偶に通信が切れて途切れます😰?通信を工夫したいなぁと思います。<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/fYUr3FXJCk">pic.twitter.com/fYUr3FXJCk</a></p>— pass810 (@pass810) <a href="https://twitter.com/pass810/status/1332536698677313537?ref_src=twsrc%5Etfw">November 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">Aruduino、ESP32、Rasberry Pi、IchigoJam…<br>お好きなマイコンボードはどれですか?<br><br>ブルーバックスの『Raspberry Piで学ぶ電子工作』は最新のラズパイ4にも対応! <a href="https://t.co/sK8eSRLoot">pic.twitter.com/sK8eSRLoot</a></p>— 学生図書委員会 (仙台高専広瀬) (@Book_Committee) <a href="https://twitter.com/Book_Committee/status/1320881416448606208?ref_src=twsrc%5Etfw">October 27, 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">本とキットとラズパイ、合計1万3000円で、ちっさいLED1個を、光らせちゃうぜぇ〜!(エガちゃん風) <a href="https://t.co/1S7ppEJsnd">pic.twitter.com/1S7ppEJsnd</a></p>— chimishito.nekaesu (@nekaesu) <a href="https://twitter.com/nekaesu/status/1316330612475588609?ref_src=twsrc%5Etfw">October 14, 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">1万円以下で、新品ネットPCを手に入れる ~食べられないれど、すごい「ラズベリーパイ」(第1回)~ <a href="https://twitter.com/hashtag/Ubntu?src=hash&ref_src=twsrc%5Etfw">#Ubntu</a> <a href="https://twitter.com/hashtag/%E3%83%8D%E3%83%83%E3%83%88PC?src=hash&ref_src=twsrc%5Etfw">#ネットPC</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/%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://twitter.com/hashtag/%E6%BF%80%E5%AE%89%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3?src=hash&ref_src=twsrc%5Etfw">#激安パソコン</a> <a href="https://twitter.com/hashtag/%E9%87%91%E4%B8%B8%E9%9A%86%E5%BF%97?src=hash&ref_src=twsrc%5Etfw">#金丸隆志</a> <a href="https://twitter.com/hashtag/%E8%AC%9B%E8%AB%87%E7%A4%BE?src=hash&ref_src=twsrc%5Etfw">#講談社</a> <a href="https://twitter.com/kdspr3?ref_src=twsrc%5Etfw">@kdspr3</a> <a href="https://twitter.com/sokushinbu?ref_src=twsrc%5Etfw">@sokushinbu</a> <a href="https://t.co/WHYrK2bDtq">https://t.co/WHYrK2bDtq</a></p>— J-CAST BOOKウォッチ (@jcast_book) <a href="https://twitter.com/jcast_book/status/1277140700073562113?ref_src=twsrc%5Etfw">June 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">【ラズパイがすごい「二つの側面」】<br><br>Raspberry Piには「プログラミングを学ぶためのコンピュータ」と、「電子工作と親和性の高いコンピュータ」という、二つの側面があります。 : <a href="https://t.co/vBFeUOW3Td">https://t.co/vBFeUOW3Td</a> <a href="https://twitter.com/hashtag/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9?src=hash&ref_src=twsrc%5Etfw">#ブルーバックス</a></p>— 講談社ブルーバックス (@bluebacks_pub) <a href="https://twitter.com/bluebacks_pub/status/1274809626320461825?ref_src=twsrc%5Etfw">June 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<br />
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com9tag:blogger.com,1999:blog-1969942310297787110.post-34607522686894474872023-03-29T23:53:00.028+09:002024-02-13T19:12:18.564+09:00書籍で用いたコマンドおよび補足情報(Pi Zero~Pi 4までの古い情報)<h3>
より新しい情報</h3>
Raspberry Pi 5 が海外で発表され、それに対応した OS Bookworm がリリースされるに伴い、本ページの内容は古くなっています。下記の新しいページをご覧ください。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2024/02/pi-zero-pi-5.html" target="_blank">本書の内容を Pi Zero ~ Pi 5 で実行する方法</a></li>
</ul>
以下は、それ以前の古い情報を残しておいたものです。
<br />
<br />
<h3>
サンプルプログラムと回路配線図について</h3>
サンプルプログラム、回路配線図、応用PDFは下記のリンクからダウンロードしてください。
<ul>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784065193396/appendix/attachments/raspi1a-sample.zip" target="_blank">サンプルプログラム</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784065193396/appendix/attachments/RaspberryPi1a-Circuit.pdf" target="_blank">回路配線図</a></li>
<li><a href="https://bluebacks.kodansha.co.jp/books/9784065193396/appendix/attachments/RaspberryPi1a-PDF_p01-39.pdf" target="_blank">応用PDF(電子版には書籍末尾についています)</a></li>
</ul>
回路配線図の PDF と応用PDF は Raspberry Pi 上のブラウザでも見られますが、ブラウザ上の「↓」(ダウンロード)ボタンでダウンロードし、ファイルマネージャーで PDF ファイルを右クリックし「アプリケーションで開く」→「アクセサリ」→「ドキュメントビューア」などで開いてもよいでしょう。<br />
「選択したアプリケーションをこのファイルタイプのデフォルトのアクションとする」にチェックを入れればそのアプリケーションで開くのがデフォルト動作となります。
<br /><br />
<h3>
本ページで表示するコマンドの利用方法</h3>
本ページには、本書の演習を実行するために必要なコマンドを全て記し、さらに、本書への補足情報を記していきます。コマンドを本ページからコピーして実行することにより、書き写すことによるミスの恐れがなく確実に実行できます。
<br />
<br />
本ページのコマンドをコピーにより活用するためには、まずRaspberry Pi上のブラウザ(Chromium)で本ページを開きます。<br />
<br />
そして、コピーしたいコマンドをマウスでなぞり色を反転してください。その状態からそのコマンドをコピーするには下記の二つの方法のうちどちらかを実行してください。<br />
<ul>
<li>色を反転した領域をマウスで右クリックして「コピー」を選択する</li>
<li>キーボードの「Ctrl」キーを押しながら「c」キーを押す(Ctrl-c)</li>
</ul>
<div>
そして、コピーされたコマンドをターミナルソフトウェアに貼り付けるには、下記の三つの方法のうちどれかを実行してください。</div>
<ul>
<li>LXTerminalのメニューから「編集」→「貼り付け」を選択する</li>
<li>LXTerminal上でキーボードの「Ctrl」キーと「Shift」キーを押しながら「v」キーを押す(Ctrl+Shift+v)</li>
<li>LXTerminal上でマウスのホイールを押し込む(ただし、この方法は正確には「コピーされた文字を貼り付ける」のではなく「マウスで色が反転された文字を貼り付ける」という動作になります)</li>
</ul>
いずれかの方法でLXTerminalにコマンドが貼り付けられたら、そのままキーボードの「Enter」キーを押せばコマンドが実行されます。<br />
<br />
なお、複数のコマンドが複数行にわたって連続して書かれている場合、コピー、貼り付け、実行はコマンド一つごとに行ってください。<br />
<br />
<h3>2章</h3>
<h4>
p.29: 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>をご覧ください。本書2章と同等の内容をアップデートされた状態で見ることができますので、参考にしてください。
<br /><br />
<h4>p.33, microSDカードの容量について</h4>
書籍では、容量が16GB以上のmicroSDカードを推奨しました。しかし、2023年10月にリリースされたOSでは、16GBでは容量が足りなくなることを確認しています。容量が32GB以上のmicroSDカードを用意して下さい。
<br /><br />
<h4>p.49, Raspberry Pi Zero W 系の機種に対する周辺機器の取り付け</h4>
Raspberry Pi Zero W 系の機種へ周辺機器を取り付けて電源を入れる方法は以下のページをご覧ください。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/raspberry-pi-zero-wh.html" target="_blank">Raspberry Pi Zero W 系で本書の演習を行う方法</a></li>
</ul>
<br />
<h3>3章</h3>
<h4>p.65, 秋月電子通商のパーツセット</h4>
本書用の秋月電子通商のパーツセットは、以下のリンク先で購入できます。
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g115351/" target="_blank">ラズパイ4対応 Raspberry Pi で学ぶ電子工作 パーツセット (秋月電子通商)</a></li>
</ul>
<br />
下記のように、書籍とパーツのセットもあります。
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g115352/" target="_blank">ラズパイ4対応 Raspberry Pi で学ぶ電子工作(書籍+パーツセット) (秋月電子通商)</a></li>
</ul>
<br />
<h3>5章</h3>
<h4>p.128, 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://raspibb1a.blogspot.com/2023/03/picamera2-libcamera.html" target="_blank">本書の演習を picamera2 (libcamera) で実行する方法</a>」を使っていただくのが良いのではないかと思います。
<br /><br />
<table border="1">
<tr>
<td>32-bit 版 および 64-bit 版 Bookworm および Bullseye</td><td>「<a href="https://raspibb1a.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://raspibb1a.blogspot.com/2021/04/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.129, Raspberry Pi Zero WH にカメラモジュールを取り付ける方法</h4>
Raspberry Pi Zero WH にカメラモジュールを取り付ける方法以下のページをご覧ください。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2020/06/raspberry-pi-zero-wh.html" target="_blank">Raspberry Pi Zero WHで本書の演習を行う方法</a></li>
</ul>
<br />
<h4>p.132, コマンドプロンプトの表記</h4>
p.132ではコマンドプロンプトの表記として以下を紹介しました。
<pre class="prettyprint">
pi@raspbberrypi:~ $
</pre>
ここに見える「pi」はユーザー名を表しており、ユーザー名「pi」は2022年4月以前の古いOSで用いられていたデフォルトのユーザー名です。最新のOSを用いている方ならば、「pi」の部分に自分で決めたユーザー名が表示されているでしょう。
<br /><br />
<h4>p.132, mplayer のインスト―ルコマンド</h4>
以下のコマンドは、インストール可能なソフトウェアのリストを更新します。
<pre class="prettyprint">sudo apt update
</pre>
以下のコマンドで、mplayerをインストールします。
<pre class="prettyprint">sudo apt install mplayer
</pre>
途中で「続行しますか?」や「検証なしにこれらのパッケージをインストールしますか?」と質問された場合、それぞれで[y]をタイプしたあと[Enter]キーを押して続行しましょう。
<br /><br />
<h4>p.133, mplayer の実行コマンド</h4>
プログラムの存在するディレクトリ(フォルダ)で以下のコマンドを実行すると、test.mp3 というサンプル音声を再生することができます。音が鳴らない場合は引き続き以下もお読みください。
<pre class="prettyprint">mplayer test.mp3
</pre>
なお、サンプルプログラムを bluebacks ディレクトリ(フォルダ)に保存した場合は、上記コマンドを実行する前に以下のコマンドを実行して bluebacks ディレクトリ内に移動する必要があります。
<pre class="prettyprint">cd bluebacks
</pre>
<h4>p.134, 音声の出力先を変更する方法</h4>
音声を HDMI ケーブル経由ではなく、Raspberry Pi の基板上のイヤフォンジャックから聞きたい場合、デフォルトでは音が鳴らないことがあります。
イヤフォンジャックから鳴らすための方法は、OSのバージョンにより異なります。
<br /><br />
<h4><2023-10-10版以降の Raspberry Pi OS をご利用の場合(Bookworm)></h4>
もし、デフォルトでピンジャックから音が出ていない場合、以下の指示に従ってください。なお、raspi-config コマンドを実行中は、キーボードの Esc キーが「戻る」に対応しますので、困ったら Esc キーを何度か押してみると良いでしょう。
<ol>
<li>ターミナルで「 sudo raspi-config 」コマンドを実行し、設定画面を開く</li>
<li>キーボードの「↓」キーを五回押し、「6 Advanced Options」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「6 Advanced Options」に入る</li>
<li>キーボードの「↓」キーを六回押し、「A7 Audio Config」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「A7 Audio Config」に入る</li>
<li>キーボードの「上」キーを一回押し、「1 PulseAudio」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押し、「1 PulseAudio」を選択する</li>
<li>キーボードの「Enter」キーを押し、「了解」を選択する</li>
<li>キーボードの「TAB」キー二回を押し、「Finish」にフォーカスを合わせる</li>
<li>キーボードの「Enter」キーを押すと、再起動され設定が有効になる</li>
</ol>
<br /><br />
<h4><2020-12-02版およびそれ以降の Raspberry Pi OS をご利用の場合(Bullseye)></h4>
2020-12-02版およびそれ以降の Raspberry Pi OS をご利用で、なおかつイヤフォンジャックから音が鳴らない場合、raspi-configというコマンドで音声の出力先をイヤフォンジャックに切り替えます。
以下の手順に従ってください。
<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>
<br />
以上で、下記コマンドで
<pre class="prettyprint">mplayer test.mp3
</pre>
イヤフォンジャックから音声が出るようになります。
<br /><br />
<h4><2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合></h4>
次は、2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合で、なおかつイヤフォンジャックから音が鳴らない場合です。
音声を再生するコマンドを以下に変えるとイヤフォンジャックから音が鳴ります。
「-ao alsa:device=hw=1,0」が「イヤフォンジャックからの再生」を意味します。「-ao alsa:device=hw=0,0」なら「HDMIからの再生」です。
<pre class="prettyprint">mplayer -ao alsa:device=hw=1,0 test.mp3
</pre>
<h4><2020年2月までの Raspbian をご利用の場合></h4>
2020年2月までの Raspbian をご利用の場合、ターミナルで一度以下のコマンドを実行すると、以後「mplayer test.mp3」コマンドでイヤフォンジャックから音が鳴るようになります。
<pre class="prettyprint">amixer cset numid=3 1
</pre>
なお、末尾の「1」がイヤフォンジャックからの音声出力を意味し、「0」なら自動認識、「2」ならHDMIからの音声出力を意味します。
<br /><br />
<h4>p.134, 05-05-sw-mp3.pyをイヤフォンジャックからの音声出力で実行する</h4>
プログラム 05-05-sw-mp3.py をイヤフォンジャックからの音声出力で実行したい場合の補足です。
やはり、OSのバージョンにより方法が異なります。
<br /><br />
<h4><2020-12-02版およびそれ以降の Raspberry Pi OS、または2020年2月までの Raspbian をご利用の場合></h4>
2020-12-02版およびそれ以降の Raspberry Pi OS、または2020年2月までの Raspbian をご利用の場合、上で行った「イヤフォンジャックから音を鳴らす設定」を行っていれば、
デフォルトのままの 05-05-sw-mp3.py で音を鳴らすことができます。「デフォルトのままの 05-05-sw-mp3.py 」とは、
12、13行目が以下の状態になっているものです。
<pre class="prettyprint">
args = ['mplayer', 'test.mp3']
#args = ['mplayer', '-ao', 'alsa:device=hw=1,0', 'test.mp3']
</pre>
<h4><2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合></h4>
2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合、プログラム 05-05-sw-mp3.py に対して以下を実行してください。
<br /><br />
まず、Thonny でプログラムを開くと、12、13行目に以下の行が見つかります。
<pre class="prettyprint">
args = ['mplayer', 'test.mp3']
#args = ['mplayer', '-ao', 'alsa:device=hw=1,0', 'test.mp3']
</pre>
一つ目の行が実際に実行される行であり、二つ目の行は「#」があるので無効な行です。これを、以下のように「#」の有無が逆になるよう編集してファイルを保存してください。
<pre class="prettyprint">
#args = ['mplayer', 'test.mp3']
args = ['mplayer', '-ao', 'alsa:device=hw=1,0', 'test.mp3']
</pre>
以上により、2020-5-27版および2020-8-20版の Raspberry Pi OS で 05-05-sw-mp3.py をイヤフォンジャックからの音声出力で実行できるようになります。
<br /><br />
<h3>
6章</h3>
<h4>
p.144:半固定抵抗の回転の向きについて</h4>
本書では、半固定抵抗として秋月電子通商の「<a href="https://akizukidenshi.com/catalog/g/g108012/" target="_blank">半固定ボリューム 10kΩ</a>」を用いて解説をしています(パーツセットに含まれるものです)。<br />
<br />
半固定抵抗は、製品の種類によって、AD変換により得られた値が大きくなる回転の向きが異なることがあります。<br />
<br />
そのような場合、下図のように、3.3VとGNDへの接続を逆にすると良いでしょう。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-PXD1aMjjIPc/V4hjnV18voI/AAAAAAAAEtk/djfCqNyzpws5wHcrOTk8Dt2W1l9mzNNYQCLcB/s1600/VolumeNotice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://3.bp.blogspot.com/-PXD1aMjjIPc/V4hjnV18voI/AAAAAAAAEtk/djfCqNyzpws5wHcrOTk8Dt2W1l9mzNNYQCLcB/s400/VolumeNotice.png" width="400" /></a></div>
<br />
<h3>7章</h3>
<h4>p.165, 接続されている I2C デバイスのアドレスを表示するコマンド</h4>
接続されている I2C デバイスのアドレスを表示するコマンドは以下の通りです。
<pre class="prettyprint">i2cdetect -y 1
</pre>
<h4>p.178, LCD へ文字を表示するプログラムの実行コマンド</h4>
ターミナルから 07-02-LCD.py を実行するコマンドは以下の通りです。付録C.3「タブによる補完」を学ぶと、ターミナルでのプログラムの実行が格段に楽になりますので興味のある方は参考にしてください。
<pre class="prettyprint">python3 07-02-LCD.py
</pre>
なお、サンプルプログラムを bluebacks ディレクトリに保存した場合は、上記コマンドを実行する前に以下のコマンドを実行して bluebacks ディレクトリ内に移動する必要があります。
<pre class="prettyprint">cd bluebacks
</pre>
<h4>p.179, LCD へ文字を表示するプログラムをコマンドライン引数つきで実行するコマンド</h4>
<pre class="prettyprint">python3 07-02-LCD.py 'test'
</pre>
<h3>8章</h3>
<h4>p.203, 用いるモータードライバ</h4>
本書では「<a href="https://akizukidenshi.com/catalog/g/g109848/" target="_blank">DRV8835使用ステッピング&DCモータドライバモジュール</a>」というモータードライバを用います。
本書のパーツセットを購入する際、本書の旧版用のパーツセットを購入してしまうと、 TA7291P というモータードライバが同梱されています。手元にこのモータードライバしかないという場合、
「<a href="https://raspibb1a.blogspot.com/2020/06/blog-post.html" target="_blank">旧版との違いについて</a>」ページにある TA7291P 用の回路の配線図を参考にしてください。
<br /><br />
なお、「<a href="https://akizukidenshi.com/catalog/g/g109848/" target="_blank">DRV8835使用ステッピング&DCモータドライバモジュール</a>」が品切れの場合でも、
このモータードライバが同梱された<a href="https://akizukidenshi.com/catalog/g/g115351/" target="_blank">本書のパーツセット</a>は入手可能なことがありますのでチェックしてみてください。
<br /><br />
<h4>p.217, pigpiod の開始・停止・再起動コマンド</h4>
pigpiod の開始・停止・再起動コマンドはそれぞれ以下の通りですので、必要なコマンドをコピーしてご利用ください。
<pre class="prettyprint">sudo service pigpiod start
</pre>
<pre class="prettyprint">sudo service pigpiod stop
</pre>
<pre class="prettyprint">sudo service pigpiod restart
</pre>
<h3>9章</h3>
<h4>p.228, WebIOPi のインストールコマンド</h4>
WebIOPi のインストールコマンドは下記の通りです。全てのコマンドが長いので、一つずつ順番にコピーして確実に実行していきましょう。なおコピーの際、先頭の「(1)」、「(2)」などの数字を含めないよう注意してください。
<pre class="prettyprint">(1) wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
(2) tar zxf WebIOPi-0.7.1.tar.gz
(3) cd WebIOPi-0.7.1/
(4) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi-pi2bplus.patch
(5) patch -p1 -i webiopi-pi2bplus.patch
(6) sudo ./setup.sh
</pre>
なお、(6) のコマンド終了後に
「Do you want to access WebIOPi over Internet ? [y/n]」
という質問が出た場合は、キーボードの n をタイプして Enter するのでした(現在はこの質問は出ません)。
<br /><br />
WebIOPi のインストールが終了したらそのまま以下の 2 つのコマンドも一つずつコピー&貼り付けにより確実に実行しましょう。
<pre class="prettyprint">(1) wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi.service
(2) sudo mv webiopi.service /etc/systemd/system/
</pre>
なお、一度 WebIOPi のインストールに失敗するなどして、もう一度やり直したい場合、以下の 2 つのコマンドをコピー&貼り付けにより順番に実行し、WebIOPi のファイルを一度削除してからインストールコマンドを再実行しましょう。
<pre class="prettyprint">(1) sudo rm -f WebIOPi-0.7.1.tar.gz
(2) sudo rm -rf WebIOPi-0.7.1
</pre>
<h4>p.230, WebIOPi の起動コマンド</h4>
<pre class="prettyprint">sudo service webiopi start
</pre>
<h4>p.230, WebIOPi が起動されているか確認するためのコマンド</h4>
<pre class="prettyprint">ps ax |grep webiopi
</pre>
<h4>p.231, WebIOPi の停止コマンド</h4>
<pre class="prettyprint">sudo service webiopi stop
</pre>
<h4>p.232, WebIOPi を自動起動するためのコマンドとその解除コマンド</h4>
<pre class="prettyprint">sudo systemctl enable webiopi
</pre>
<pre class="prettyprint">sudo systemctl disable webiopi
</pre>
<h4>p.234, IP アドレスを調べるためのコマンド</h4>
<pre class="prettyprint">ifconfig
</pre>
<h4>p.234:IPアドレスでのURLの指定について</h4>
本書では、ブラウザからRaspberry Piにアクセスする際に、ルーターなどからRaspberry Piに割り振られたIPアドレスを用いました。すなわち、IPアドレスが192.168.1.3の場合にブラウザから例えば下記のようにアクセスしました。
<br />
<ul>
<li>http://192.168.1.3:8000/bb/01/</li>
</ul>
しかし、この方法はifconfigコマンドなどで事前にIPアドレスを調べておく必要があり、やや面倒でした。<br />
このIPアドレスの指定を簡単化する方法をPDFの付録Eに記しましたが、ここにも記しておきます。
<br /><br />
以下の環境では、IPアドレスを用いずに「raspberrypi.local」のような名前でRaspberry Piにアクセスできます。
<ul>
<li>iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです)</li>
<li>macOS</li>
<li>iPhoneやiPad</li>
</ul>
上記の環境では、ブラウザのアドレス欄に例えば下記のように入力すればIPアドレスを用いずにアクセスできます。
<br />
<ul>
<li>http://raspberrypi.local:8000/bb/01/</li>
</ul>
これは、Raspberry Pi OS上で動作しているavahiというソフトウェアの働きによります。<br />
<br />
<h4>p.241, サンプルファイルを WebIOPi のフォルダにコピーするコマンド</h4>
このコマンドを実行し忘れると、9章、10章の演習を実行できませんので確実に実行しましょう。
2つのコマンドがありますので、 1つずつ順番に実行してください。サンプルファイルが存在するフォルダで実行する必要がありますので、サンプルファイルを bluebacks フォルダに保存した方は、事前に「cd bluebacks」コマンドを実行しておく必要があります。
<pre class="prettyprint">sudo chown -R $USER /usr/share/webiopi/htdocs
cp -r 09-samples/bb /usr/share/webiopi/htdocs
</pre>
<h4>p.242, WebIOPi の設定ファイルを管理者権限のテキストエディタで開くコマンド</h4>
<pre class="prettyprint">sudo mousepad /etc/webiopi/config
</pre>
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) より前の OS ではテキストエディタとしてleafpadではなくmousepadを用います。
<pre class="prettyprint">sudo leafpad /etc/webiopi/config
</pre>
<h4>p.243, WebIOPi のパスワードを変更するためのコマンド</h4>
<pre class="prettyprint">sudo webiopi-passwd
</pre>
<h4>p.245, WebIOPi の設定ファイルに追加する内容</h4>
こちらの記述も、間違えると9章、10章の演習を実行できません。具体的には、記述間違いにより WebIOPi が起動しなくなります。そのため、コピー&貼り付けにより確実に記述するのが良いでしょう。
<pre class="prettyprint">myscript = /usr/share/webiopi/htdocs/bb/01/script.py
</pre>
なお、この行を記述した後に WebIOPi が起動しなくなった場合、行の記述し間違い以外には、
<ul>
<li>サンプルファイルを /usr/share/webiopi/htdocs ディレクトリにコピーしていない
</ul>
という原因もありえます。その場合、本ページ上部の「p.241, サンプルファイルを WebIOPi のフォルダにコピーするコマンド」を参照してください。
<br /><br />
<h3>10章</h3>
<h4>p.287, /etc/rc.local を管理者権限のテキストエディタで開くコマンド</h4>
<pre class="prettyprint">sudo mousepad /etc/rc.local
</pre>
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) より前の OS ではテキストエディタとしてleafpadではなくmousepadを用います。
<pre class="prettyprint">sudo leafpad /etc/rc.local
</pre>
<h4>p.287, IPアドレスをLCDに表示するために /etc/rc.local に記入するコマンド</h4>
<pre class="prettyprint">python3 /home/pi/07-02-LCD.py $_IP
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/07-02-LCD.py $_IP」となる、ということです。
<br /><br />
また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">python3 /home/pi/bluebacks/07-02-LCD.py $_IP
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>p.291, シャットダウンプログラムの自動実行のために /etc/rc.local に記入するコマンド</h4>
末尾の「&」も忘れずにコピーしましょう。
<pre class="prettyprint">python3 /home/pi/10-01-sw-poweroff.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
なお、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">python3 /home/pi/bluebacks/10-01-sw-poweroff.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>
p.292:キャタピラ式模型のメンテナンス</h4>
キャタピラ式模型を長く使っていると、だんだん動作が安定しなくなってくることがあります。例えば「右のキャタピラは正常動作するが、左はなかなか動かない」などです。
<br />
<br />
もちろん、「ジャンパーワイヤーが抜けていないか」など、回路の配線をまずはチェックすべきです。
しかし回路の配線に問題がなかった場合、どこに注意してメンテナンスすべきかを以下に記します。上から順にチェックしていきましょう。
<br />
<ol>
<li>電池の残量不足ではないかチェック:基本ではありますが、まずはここからチェックしましょう。</li>
<li>ジャンパワイヤのチェック:ジャンパワイヤの抜き差しをする際、持ち手ではなくケーブルを引っ張ることを繰り返すと中で断線することがあります。断線したかどうかは外から見ただけではわかりません。断線が疑われるジャンパワイヤは捨ててしまった方がよいでしょう。
</li>
<li>モーターの軸が空回りしていないかチェック:モーターの軸にはピニオンギアが取り付けられています。ピニオンギアが劣化してゆるくなり、モーターの軸が空回りすることがしばしば起こります。これはモーターをギアボックスから取り外してみないとわかりません。ピニオンギアがゆるくなっていた場合、「<a href="https://www.tamiya.com/japan/products/89836/index.html" target="_blank">AO-7005 8Tピニオンセット白(10個)</a>」などを購入して交換しましょう。
</li>
<li>ギアボックスで空回りしているシャフトがないかチェック:ギアボックスの作成の際、イモネジを六角レンチで締めてシャフトを固定している部分があります。そこが緩んで空回りしていないかチェックしましょう。
</li>
<li>ブレッドボードのチェック:ブレッドボードを長くつかっていると、なんらかの理由でブレッドボード内部の抵抗が大きくなりモーターがあまり回転しなくなることがあります。筆者は複数回そのような経験をしています。安価なもので良いのでテスターを購入すると内部の抵抗の大きさをチェックできます。内部の抵抗が大きく計測されたブレッドボードは消耗品と考えて捨ててしまった方がよいでしょう。
</li>
<li>モーターのチェック:上のどの問題にも該当しなかった場合、モーターに問題がある可能性があります。新品の「<a href="https://www.tamiya.com/japan/products/94380/index.html" target="_blank">AO-1001 FA-130タイプノーマルモーター</a>」を購入して交換してみるのも手です。
</li>
<li>モータードライバーのチェック:上のどの問題にも該当しなかった場合、モータードライバに問題がある可能性があります。新品のモータードライバーを購入して交換してみるのも手です。
</li>
</ol>
<br />
<h4>p.293, mjpg-streamer のインストールコマンド</h4>
mjpg-streamer のインストールコマンドは下記の通りです。全てのコマンドが長いので、一つずつ順番にコピーして確実に実行していきましょう。
<br /><br />
ただし、Bookworm や Bullseye を用いていて、libcamera 対応の mjpg-streamer をインストールする場合は、ここで紹介するコマンドではなく、「<a href="https://raspibb1a.blogspot.com/2023/03/picamera2-libcamera.html" target="_blank">本書の演習を picamera2 (libcamera) で実行する方法</a>」で紹介するコマンドを実行する必要がありますのでページを移動してください。
<br /><br />
さて、ここで紹介するコマンドは、libcamera を用いない場合すなわち、Bullseye の Legacy Camera モードでカメラを利用する場合です。
コピーの際、先頭の「(1)」、「(2)」などの数字を含めないよう注意してください。
<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>
に変更しなければならいない場合があります。
<br /><br />
また、 Bullseye を用いている方は、本ページの
「p.128, Bookworm (Raspberry Pi OS 2023-10-10 以降) および Bullseye (Raspberry Pi OS 2021-10-30 以降) でのカメラの利用について」の項目を参考に、Legacy Camera モードを有効にする必要がありますのでその点もご注意ください。
さらに、64-bit版 Bullseye を用いている方は、実行時に「<a href="https://raspibb1a.blogspot.com/2021/04/blog-post.html" target="_blank">本書の演習をウェブカメラで実行する方法</a>」で配布しているサンプルファイル内の 10-02-stream-webcam.sh を用いる必要があります。
<br /><br />
また、一度 mjpg-streamer のインストールに失敗するなどして、もう一度やり直したい場合、以下の 2 つのコマンドをコピー&貼り付けにより順番に実行し、mjpg-streamer のファイルを一度削除してからインストールコマンドを再実行しましょう。
<pre class="prettyprint">(1) sudo rm -rf /opt/mjpg-streamer
(2) rm -rf mjpg-streamer
</pre>
<h4>p.294, mjpg-streamer の自動実行のために /etc/rc.local に記入するコマンド</h4>
<pre class="prettyprint">sh /home/pi/10-02-stream.sh
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「sh /home/kanamaru/10-02-stream.sh」となる、ということです。
<br /><br />
また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">sh /home/pi/bluebacks/10-02-stream.sh
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h3>付録</h3>
<h4>p.308, サンプルファイルの展開先(図B-4)</h4>
<pre class="prettyprint">/home/pi/bluebacks
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上の記述の pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「/home/kanamaru/bluebacks」となる、ということです。
<br /><br />
<h4>p.310, nano の設定ファイル .nanorc に記す内容</h4>
<pre class="prettyprint">set tabsize "4"
set tabstospaces
</pre>
<h4>p.310, vi の設定ファイル .vimrc に記す内容</h4>
<pre class="prettyprint">set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4
</pre>
<h4>p.312, 日本語入力ソフトウェアのインストールコマンド</h4>
日本語入力ソフトウェアのインストールについて、これまで本書では ibus-mozc のインストールをお勧めしてきましたが、OS の更新に伴い メニューバー上での挙動がおかしい、などの不具合が増えてきましたので、
別のソフトウェアである fcitx-mozc に切り替えた方が良いかもしれません。
<br /><br />
まず、インストール済の ibus-mozc を削除するには以下のコマンドを実行します。
<pre class="prettyprint">sudo apt remove ibus-mozc ibus
</pre>
その後 Raspberry Pi を再起動することで ibus-mozc の削除が完了します。
<br /><br />
そして、fcitx-mozc のインストールは下記のコマンドで行います。
<pre class="prettyprint">sudo apt update
sudo apt install fcitx-mozc
</pre>
再起動後、半角/全角キーや Ctrl+スペースキーにより、日本語入力をオンオフできます。
<br /><br />
<h4>p.313, 日本語フォントのインストールコマンド</h4>
<pre class="prettyprint">
sudo apt install fonts-vlgothic
</pre>
<h3>補足PDF</h3>
<h4>PDF9, 06-03-volume.py で音声のボリュームを変更する</h4>
プログラム 06-03-volume.py で音声のボリュームを変更する場合、音声出力先や、用いているOSのバージョンにより方法が異なりますので以下の指示に従ってください。
<br /><br />
<h4><2022年 9 月以降の Raspberry Pi OS をご利用の場合></h4>
2022年 9 月以降の Raspberry Pi OS をご利用の場合、音声出力先がHDMI、イヤフォンジャックのどちらの場合も、ファイル 06-03-volume.py の変更が必要となります。
<br /><br />
まず、イヤフォンジャックから音声を出力したい場合、本ページ「p.134, 音声の出力先を変更する方法」の方法に基づき、音声の出力先をイヤフォンジャックに変更して下さい。HDMI経由で音声出力したい場合はデフォルトのままで構いません。
<br />
すると、音声の出力先がどちらであっても、以下のデフォルトのコマンドで音声が鳴ります。
<pre class="prettyprint">
mplayer test.mp3
</pre>
また、音声の出力先がどちらであっても、06-03-volume.py に対して変更が必要になります。Thonny でプログラムを開くと 57、58行目に以下の行が見つかります。
<pre class="prettyprint">
args = ['amixer','-q','cset','numid=1',vol]
#args = ['amixer','-q','-c1','cset','numid=1',vol]
</pre>
これを以下のように変更して保存して下さい。「numid=1」の部分を「numid=3」に変更しています。
<pre class="prettyprint">
args = ['amixer','-q','cset','numid=3',vol]
#args = ['amixer','-q','-c1','cset','numid=1',vol]
</pre>
以上で、06-03-volume.py によりボリュームを変更可能になります。
<br /><br />
<h4><2020-12-02版から 2022年春までの Raspberry Pi OS をご利用の場合></h4>
2020-12-02版から 2022年春までの Raspberry Pi OS をご利用の場合、音声出力先がHDMI、イヤフォンジャックのどちらの場合も、ファイル 06-03-volume.py の変更が必要となります。
<br /><br />
まず、イヤフォンジャックから音声を出力したい場合、本ページ「p.134, 音声の出力先を変更する方法」の方法に基づき、音声の出力先をイヤフォンジャックに変更して下さい。HDMI経由で音声出力したい場合はデフォルトのままで構いません。
<br />
すると、音声の出力先がどちらであっても、以下のデフォルトのコマンドで音声が鳴ります。
<pre class="prettyprint">
mplayer test.mp3
</pre>
また、音声の出力先がどちらであっても、06-03-volume.py に対して変更が必要になります。Thonny でプログラムを開くと 57、58行目に以下の行が見つかります。
<pre class="prettyprint">
args = ['amixer','-q','cset','numid=1',vol]
#args = ['amixer','-q','-c1','cset','numid=1',vol]
</pre>
これを以下のように変更して保存して下さい。元からあった行に「#」をつけて無効化し、その上に一行追加しています。
<pre class="prettyprint">
args = ['amixer','-q','-D','pulse','set','Master',vol]
#args = ['amixer','-q','cset','numid=1',vol]
#args = ['amixer','-q','-c1','cset','numid=1',vol]
</pre>
以上で、06-03-volume.py によりボリュームを変更可能になります。
<br /><br />
<h4><2020-5-27版および2020-8-20版の Raspberry Pi OS をご利用の場合></h4>
2020-5-27版および2020-8-20版の Raspberry Pi OS で音声出力先をイヤフォンジャックにしたい場合、
書籍に記述してある通りに実行します。すなわち、音声再生コマンドを以下のコマンドに置き換えるのでした。
<pre class="prettyprint">
mplayer -ao alsa:device=hw=1,0 test.mp3
</pre>
そして、06-03-volume.py に対しては、変更が必要となるのでした。Thonny でプログラムを開くと、57、58行目に以下の行が見つかります。
<pre class="prettyprint">
args = ['amixer','-q','cset','numid=1',vol]
#args = ['amixer','-q','-c1','cset','numid=1',vol]
</pre>
一つ目の行が実際に実行される行であり、二つ目の行は「#」があるので無効な行です。これを、以下のように「#」の有無が逆になるよう編集してファイルを保存してください。
<pre class="prettyprint">
#args = ['amixer','-q','cset','numid=1',vol]
args = ['amixer','-q','-c1','cset','numid=1',vol]
</pre>
以上で、06-03-volume.py によりボリュームを変更可能になります。
<br /><br />
<h4>PDF 11, デジタル温度計の自動実行のために /etc/rc.local に記すコマンド</h4>
末尾の「&」も忘れずにコピーしましょう。
<pre class="prettyprint">python3 /home/pi/07-03-LCD-temp.py &
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「python3 /home/kanamaru/07-03-LCD-temp.py &」となる、ということです。
<br /><br />
また、サンプルファイルを bluebacks ディレクトリに展開した方の場合、記入する行は以下です。
<pre class="prettyprint">python3 /home/pi/bluebacks/07-03-LCD-temp.py &
</pre>
上と同様に、「pi」は自分のユーザー名に置き換えてください。
<br /><br />
<h4>PDF 29, DCモーターとサーボモーターを同時に使うとサーボモーターが不安定になる場合(図10-13)</h4>
図10-13のようにDCモーターとサーボモーターを同時に使うとサーボモーターが不安定になる場合があります。
<br /><br />
これは、DCモーターの回転により発生するノイズがサーボモーターに影響を与えているためです。この問題に対する簡単な対処法は、下図のように
サーボモーターの電源用配線を、Raspberry Pi の 5V ピンに接続することです。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-jumrIs9LBiY/X9l6JfN4EGI/AAAAAAAAH64/ZotCf29zBR8yUz4iqJATkFXGE-DoMaSNwCLcBGAsYHQ/s1320/fig10-13mod.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1110" data-original-width="1320" src="https://1.bp.blogspot.com/-jumrIs9LBiY/X9l6JfN4EGI/AAAAAAAAH64/ZotCf29zBR8yUz4iqJATkFXGE-DoMaSNwCLcBGAsYHQ/s600/fig10-13mod.png"/></a></div>
このような接続をすると、今度はサーボモーターの負荷により Raspberry Pi が不安定になる可能性がありますが、以下の条件が満たされれば Raspberry Pi は安定して動作します。
<ul>
<li>サーボモーターにあまり大きな負荷をかけない。この演習の例では、Raspberry Pi のカメラモジュールという軽いものを動かすだけなので問題にはなりにくいでしょう</li>
<li>Raspberry Piを動作させるためのモバイルバッテリーの流せる電流量(「A」や「mA」で表示されているもの)が大きい。筆者は Raspberry Pi 4 に対して 3.0 A のバッテリーを用意しました</li>
</ul>
なお、この DC モーターによるノイズの問題に関しては、本書p.213の図8-12のように、DCモーターに3つのコンデンサを取り付けることでも改善が期待できます。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com12tag:blogger.com,1999:blog-1969942310297787110.post-21006796108330852632023-03-29T23:47:00.008+09:002024-01-06T22:58:14.652+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 />
ターミナルを開き、本書のサンプルファイル(数字で始まるファイル)が存在するディレクトリに移動してください。
サンプルファイルをホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
<br />
<pre class="prettyprint">cd bluebacks
</pre>
次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
<br />
<pre class="prettyprint">wget https://github.com/neuralassembly/raspi/raw/master/raspi1a-picamera2.zip
unzip raspi1a-picamera2.zip
rm raspi1a-picamera2.zip
</pre>
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。Pythonpプログラムにはファイル名末尾に「-picamera2.py」がついていることに注意してください。
<pre class="prettyprint">05-04-sw-camera-picamera2.py
10-02-stream-libcamera.sh
</pre>
以下では、これらのファイルの使い方を解説していきます。
<br /><br />
<h3>4. 実行方法</h3>
さて、ダウンロードして展開したファイルの使い方を解説していきます。
<h4>p.128 タクトスイッチをカメラのシャッターに (5.6)</h4>
5.6章ではタクトスイッチをカメラのシャッターにするため、プログラムでカメラの映像を表示する必要がありました。
<br /><br />
そのプログラムの picamera2 版が 05-04-sw-camera-picamera2.py です。このプログラムを実行するには、画像処理用のライブラリである OpenCV をインストールする必要があります。
ターミナルを起動して下記のコマンドを実行すると、OpenCV をインストールできます。
<pre class="prettyprint">sudo apt update
sudo apt install python3-opencv
</pre>
プログラムは、下記のコマンドで(または Thonny で)実行します。
<pre class="prettyprint">python3 05-04-sw-camera-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>
<br /><br />
<h4>p.292 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>
インストール後は、上で展開して得られたシェルスクリプト 10-02-stream-libcamera.sh を実行することで mjpg-streamer を起動しますが、
実行前に一つ注意があります。
10-02-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 10-02-stream-libcamera.sh
</pre>
を実行することで mjpg-streamer が起動されます。
<br /><br />
以上、お疲れさまでした。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-61941165495609372622023-03-28T20:38:00.005+09:002024-01-26T11:01:01.042+09:00Raspberry Pi Pico W を使って Wifi 経由で回路を制御してみよう
<h3>0. はじめに</h3>
「<a href="https://raspibb1a.blogspot.com/2021/04/raspberry-pi-pico.html" target="_blank">本書の電子工作パーツをRaspberry Pi Picoで利用する</a>」にて、<a href="https://akizukidenshi.com/catalog/g/g115351/" target="_blank">本書の公式パーツセット</a>を Raspberry Pi Pico (以下 Pico)で利用する方法を紹介しました。
<br /><br />
Wifi 機能のない Raspberry Pi Pico で実行できる演習は、 本書で Wifi 接続を用いない 1 章から 8 章の内容でした。
<br /><br />
一方、2023年3月、Wifi 機能付きの Raspberry Pi Pico W (以下 Pico W)が日本で販売開始されました。Pico W を用いると、 Wifi 接続を用いる 9 章および 10 章の演習をある程度再現できるようになります。
具体的には、本ページでは下記の内容を取り扱います。
<ul>
<li>9章の内容: PC やスマートフォンのブラウザで、Pico W に接続された LED / I2C温度センサ / RGB フルカラー LED / DCモータ / サーボモータ を制御</li>
<li>10章の内容: PCやスマートフォンのブラウザで、Pico W を搭載したキャタピラ式模型を制御</li>
</ul>
10章のキャタピラ式模型を Pico W で実現した様子を示したのが下図です。もともと Raspberry Pi が配置されていたスペースが空いていますが、これは 回路と Pico W を全てブレッドボード上に配置できるからです。回路動作用のバッテリーが、大電流を流せないものでも良い、というメリットもあります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqUuB1Pmzxioy_6s3YugfRj586BVYALRK5IwHpAONnV7qzOtTuk1dQU19ryUK35KfGbm9DD3NUytNNdDbdVp4gjmOV0rq-fFa_-po2LGJ0jpCS6rtGhVppH4lZk3kBfJCM7_zwrnGUei7tOI1AwR2JRVJ1GBIII7NvexZic3xROxp6cv_vwT2xfdIr/s845/picotank.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="634" data-original-width="845" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqUuB1Pmzxioy_6s3YugfRj586BVYALRK5IwHpAONnV7qzOtTuk1dQU19ryUK35KfGbm9DD3NUytNNdDbdVp4gjmOV0rq-fFa_-po2LGJ0jpCS6rtGhVppH4lZk3kBfJCM7_zwrnGUei7tOI1AwR2JRVJ1GBIII7NvexZic3xROxp6cv_vwT2xfdIr/s600/picotank.jpg"/></a></div>
そして、このキャタピラ式模型の動作の様子が下記の YouTube 動画です。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="400" src="https://www.youtube.com/embed/YeUcF3QBpws?rel=0" width="600"></iframe>
</div>
<br />
<br />
なお、Wifi 経由での Pico W の制御には欠点もあり、回路への制御信号の送信が、ブラウザのページ再読み込みのタイミングでしか行えないため、ブラウザに対して行ったアクションへのレスポンスが悪い、という問題があります。
<br /><br />
さて、本ページでは以上の内容の実現方法を解説していきます。
<br /><br />
その内容に進む前に、「<a href="https://raspibb1a.blogspot.com/2021/04/raspberry-pi-pico.html" target="_blank">本書の電子工作パーツをRaspberry Pi Picoで利用する</a>」を参考に、
下記の内容を進めておいてください。Pico W でも、Pico 用の演習をすべて実行することができます。Pico W を購入できるサイトもリンク先で紹介されています。
<ul>
<li>Pico W への MicroPython 環境のインストール (Pico と Pico W では UF2 ファイルが異なるので注意)</li>
<li>Windows などへの、開発環境 Thonny のインストール</li>
<li>Pico W で Python プログラムを実行する方法の習得</li>
</ul>
<br />
<h3>1. ブラウザのボタンによるLEDの点灯</h3>
まずは、PCやスマートフォンのブラウザから、Pico W に接続された LED のオン / オフを切り替える演習を行ってみましょう。9.3 章の内容です。必要な回路は下図の通りです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVtRjfgjXSwx8ZtE-N-3OiURQX-_tClqdSayPIE0deXfU6bJ7oVXpCxAhUzy_x2a9cifahVNHc6hsEvEato1Yuz38cHEi8u9E48LeuuSp7gfSyQlbL_gF9XF9ipvOACxWAVSRB2UjbwKZf1IzjDUP3QZ_8fdxjdPEsjBvuc-yn5W5r6p7ShR0L-RUf/s1000/pico-09-01-led.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="890" data-original-width="1000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVtRjfgjXSwx8ZtE-N-3OiURQX-_tClqdSayPIE0deXfU6bJ7oVXpCxAhUzy_x2a9cifahVNHc6hsEvEato1Yuz38cHEi8u9E48LeuuSp7gfSyQlbL_gF9XF9ipvOACxWAVSRB2UjbwKZf1IzjDUP3QZ_8fdxjdPEsjBvuc-yn5W5r6p7ShR0L-RUf/s600/pico-09-01-led.png"/></a></div>
見てわかる通り、LED以外に I2C 接続の小型 LCD も接続されています。これは、Pico W に割り当てられた IP アドレスやエラーメッセージを表示するためのものです。この LCD を接続しなくても演習は実行可能ですが、その場合、Pico W からのメッセージを Windows などの PC 上で見るしかなくなります。LCD を接続すること、すなわち Windows などの PC なしでも Pico W を動作させられるようにすることを強く推奨します。
<br /><br />
さて、この回路に対して実行するプログラムは以下の通りです。なお、本ページで紹介するプログラムはすべて<a href="https://core-electronics.com.au/guides/raspberry-pi-pico-w-create-a-simple-http-server/" target="_blank">こちらのページの解説</a>を参考に作成しました。
<pre class="prettyprint">
import time
import sys
import network
import socket
from time import sleep
from machine import Pin, I2C
led = Pin(16, Pin.OUT)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
##### for LCD
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
##### end of LCD
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
html = """<!DOCTYPE html><html>
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>1 - LEDの点灯制御</title>
<style>button {
width: auto;
height: auto;
background: %s;
font-weight: normal;
font-size: 14pt;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
color: #ffffff;
padding: 10px 20px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
border: 1px solid #003366;
-moz-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
-webkit-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
text-shadow:
0px -1px 0px rgba(000,000,000,0.7),
0px 1px 0px rgba(255,255,255,0.3);
}
</style></head>
<p>下のボタンを押すごとに、LEDの点灯状態が変化します。</p>
<div align="center">
<form><button name="led" value="toggle" type="submit">LED</button></form>
</div>
</body></html>
"""
# Wait for connect or fail
max_wait = 20
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
write_string('waiting for conn') #showing on LCD
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
write_string('conn. failed') # showing on LCD
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
write_string(status[0]) #showing on LCD
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind(addr)
except OSError as e:
print(e)
s.close()
s = None
write_string('socket error') #showing on LCD
sys.exit()
s.listen(1)
print('listening on', addr)
ledState = 0
buttonColor = '#003366'
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
#print('client connected from', addr)
request = cl.recv(1024)
#print("request:")
#print(request)
request = str(request)
led_toggle = request.find('led=toggle')
#print( 'led_toggle = ' + str(led_toggle))
if led_toggle == 8:
#print("led toggle")
ledState = 1 - ledState
led.value(ledState)
if ledState == 0:
buttonColor = '#003366'
else:
buttonColor = '#26a1ff'
response = html % buttonColor
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
print('connection closed')
except KeyboardInterrupt as e:
break
s.close()
s = None
</pre>
このプログラムを実行するための注意をいくつか記します。本ページのプログラムにはすべて下記のように、用いている Wifi の SSID (アクセスポイント名) とそのパスワードを記す項目があります。
ここを<b>皆さんの環境における SSID とパスワードに変更しないと本ページのプログラムは全て動作しません</b>のでご注意ください。なお、2.4GHzの周波数帯の Wifi アクセスポイントにしか接続できませんのでご注意ください。
<pre class="prettyprint">
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
</pre>
また、本ページの回路を LCD なしで実行する場合、プログラム中の下記の部分を消し、
<pre class="prettyprint">
##### for LCD
(省略)
##### End of LCD
</pre>
下記の内容で差し替える必要があります。この変更も、<b>本ページのすべてのプログラムで共通</b>です。
<pre class="prettyprint">
def write_string(s):
pass
</pre>
さらに、プログラムの書き換え時は、Pico W 上で動作しているプログラムを Thonny の「STOP (停止)」ボタンから一旦停止する必要があることもご注意ください。
<br />
<br />
記述できたら Pico W でプログラムを実行してみましょう。LCD 上に(または Thonny のコンソール上に)Pico W に割り当てられた IP アドレス(例えば、 192.168.1.40 のようなもの)が表示されれば、実行が成功した可能性が高いでしょう。下図のような状態です。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy9-RSjXGdhWNQU3EeWyML7oFbHlCMTmzhvGlx8-DwgederGZcxAGzv-xEh90VqwgB-ePDgtIgjtUnSUoySNqrCa3b-YwdDl5xEzLhsqa6gr1i3bedkvw7vmkxDtoT4-2osAOKNuPnagvH8tPceQ-Bduf2_CX-ssB8h9g7lzUu9_iJEJjg_WN-Dd0w/s1600/LCD_address.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="280" data-original-width="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy9-RSjXGdhWNQU3EeWyML7oFbHlCMTmzhvGlx8-DwgederGZcxAGzv-xEh90VqwgB-ePDgtIgjtUnSUoySNqrCa3b-YwdDl5xEzLhsqa6gr1i3bedkvw7vmkxDtoT4-2osAOKNuPnagvH8tPceQ-Bduf2_CX-ssB8h9g7lzUu9_iJEJjg_WN-Dd0w/s1600/LCD_address.jpg"/></a></div>
そうしたら、Pico W と同じネットワーク内に存在する PC やスマートフォンのブラウザでアドレス(例えば 192.168.1.40 の場合、 http://192.168.1.40/ )にアクセスしてみましょう。下図のようなページが現れるはずです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8lxlWTJaCKDKtWR0aPRPa4f2e6stCj3NTRE6FbA_8vqIzTUN2xrbraQSLTw70KjgVA4bOVVByeWUjlPjbYx7JdfA-yAXx8Ht6fxNLJvQJMJe3lPvnSJF4la7ZZk4c1eJl4MvR1XaQkekk8ISzqBbO9gAR8fzEmoF2T1NuofcJnOQj2v4ACkPYyCMV/s1600/01_led_01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="280" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8lxlWTJaCKDKtWR0aPRPa4f2e6stCj3NTRE6FbA_8vqIzTUN2xrbraQSLTw70KjgVA4bOVVByeWUjlPjbYx7JdfA-yAXx8Ht6fxNLJvQJMJe3lPvnSJF4la7ZZk4c1eJl4MvR1XaQkekk8ISzqBbO9gAR8fzEmoF2T1NuofcJnOQj2v4ACkPYyCMV/s1600/01_led_01.png"/></a></div>
ブラウザ上のボタンを押すことで Pico W に接続された LED の点灯/消灯が切り替わります。LED 点灯時の画面の様子は下記の通りで、ボタンの色が変わります。これは、本書の Raspberry Pi 版のプログラムと同じ挙動です。ただし、上で既に述べたように、回路のアクションはブラウザ上のページの再読み込みのタイミングでしか起こりませんので、反応が遅いという問題がありますのでご了承ください。これは、本ページの以下のプログラム全てに当てはまります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaVzp4K74KlmkxrbW_K-bHdIf9W8Nez_Vcd0aK2Vbxj98lRJn-VglTdpJOk2d5UpQQM1Oc3A_ZjPm5KCjk3qGaDzSETkU3pq140n6QMOfHpIwwO6ehsLhjpjPseYYC7Ssn7upit5n_dcvnxDMPfG9yCezlccUVUy7JIEpQ3ReSSI5DUmoRpMmq6BFw/s1600/01_led_02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="280" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaVzp4K74KlmkxrbW_K-bHdIf9W8Nez_Vcd0aK2Vbxj98lRJn-VglTdpJOk2d5UpQQM1Oc3A_ZjPm5KCjk3qGaDzSETkU3pq140n6QMOfHpIwwO6ehsLhjpjPseYYC7Ssn7upit5n_dcvnxDMPfG9yCezlccUVUy7JIEpQ3ReSSI5DUmoRpMmq6BFw/s1600/01_led_02.png"/></a></div>
なお、ここでの解説がよくわからないという場合、本書 9 章の記述を読み直してみることを推奨します。本ページは、本書読者の方を対象としているため、本書と重複する内容の記述は最低限にとどめています。
<br /><br />
<h3>2. ブラウザへの温度センサの値の表示</h3>
PCやスマートフォンのブラウザに、Pico W に接続された I2C 温度センサの値を表示する演習を行ってみましょう。9.4 章の内容です。必要な回路は下図の通りです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikNvjnKpqghX9fyAvoOoGSY6dEI4lT1sP1fuUgYuqWLUuWiASSNH9JxTpXRBWA7v76iP5naHCvhHgmG-nYg-mCDmtvf1cXfj1zBNwv7M9ATlYWDGK9F8Pw3U0SmSUvTB4JlD8XccBDWRp0T6JzQO_zyr0q3s0vdz8MwZsSRwPlZB2Z4QcXWRj2MtwI/s1210/pico-09-02-temp.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="930" data-original-width="1210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikNvjnKpqghX9fyAvoOoGSY6dEI4lT1sP1fuUgYuqWLUuWiASSNH9JxTpXRBWA7v76iP5naHCvhHgmG-nYg-mCDmtvf1cXfj1zBNwv7M9ATlYWDGK9F8Pw3U0SmSUvTB4JlD8XccBDWRp0T6JzQO_zyr0q3s0vdz8MwZsSRwPlZB2Z4QcXWRj2MtwI/s600/pico-09-02-temp.png"/></a></div>
そして、この回路上で実行すべきプログラムは下記の通りです。
<pre class="prettyprint">
import time
import sys
import network
import socket
from time import sleep
from machine import Pin, I2C
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
##### for temperature sensor
def read_adt7410():
word_data = int.from_bytes(i2c.readfrom_mem(address_adt7410, register_adt7410, 4), 'little')
data = (word_data & 0xff00)>>8 | (word_data & 0xff)<<8
data = data>>3 # 13ビットデータ
if data & 0x1000 == 0: # 温度が正または0の場合
temperature = data*0.0625
else: # 温度が負の場合、 絶対値を取ってからマイナスをかける
temperature = ( (~data&0x1fff) + 1)*-0.0625
return temperature
address_adt7410 = 0x48
register_adt7410 = 0x00
##### end of temperature sensor
##### for LCD
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
##### end of LCD
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
# refresh per 5 sec.
html = """<!DOCTYPE html><html>
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<meta http-equiv="refresh" content="5">
<title>2 - I2C温度センサ(ADT7410)による温度の取得</title>
</head>
<div align="center">
<p>温度: %s</p>
</div>
</body></html>
"""
# Wait for connect or fail
max_wait = 20
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
write_string('waiting for conn') #showing on LCD
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
write_string('conn. failed') # showing on LCD
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
write_string(status[0]) #showing on LCD
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind(addr)
except OSError as e:
print(e)
s.close()
s = None
write_string('socket error') #showing on LCD
sys.exit()
s.listen(1)
print('listening on', addr)
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
#print('client connected from', addr)
request = cl.recv(1024)
#print("request:")
#print(request)
request = str(request)
inputValue = read_adt7410()
inputStr = '{:.1f}'.format(inputValue)
response = html % inputStr
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
print('connection closed')
except KeyboardInterrupt as e:
break
s.close()
s = None
</pre>
なお、「1. ブラウザのボタンによるLEDの点灯」で述べたように、YOUR_WIFI_SSID と YOUR_WIFI_PASSWORD を自分の環境のものに変更することと、
LCD なしでプログラムを実行したい場合は「# for LCD ~ # End of LCD」の部分の差し替えが必要ですのでご注意ください。
<br /><br />
さらに、プログラムの書き換え時は、Pico W 上で動作しているプログラムを Thonny の「STOP (停止)」ボタンから一旦停止する必要があることもご注意ください。
<br /><br />
以上のプログラムを実行し、ブラウザでアクセスすると下記のようなページが開きます。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCVR4TzfVm5eXiGqBRz2Df1wLME5waEbZnXDftOL9-SAKT6vpYtoFLwOmFcTfDOAF8_B0nJ0UwQd0zvCriiFy6LZyuI-7g9msL4KQycq6IlN7wWFvCEAxs9pjM_jqUjDMWeLVsFv7dI0aiac971OCLqnvRsBtBP1Ev2Okz7PK_xzAomiSDhjkHReas/s1600/02_temp.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="280" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCVR4TzfVm5eXiGqBRz2Df1wLME5waEbZnXDftOL9-SAKT6vpYtoFLwOmFcTfDOAF8_B0nJ0UwQd0zvCriiFy6LZyuI-7g9msL4KQycq6IlN7wWFvCEAxs9pjM_jqUjDMWeLVsFv7dI0aiac971OCLqnvRsBtBP1Ev2Okz7PK_xzAomiSDhjkHReas/s1600/02_temp.png"/></a></div>
5秒おきにページが再読み込みされ、センサの値がページ上で更新されるようになっています。
これは、プログラム中の下記の部分で設定されています。あまり頻繁に通信が行われるのも良くないですので、この部分を小さな値に変更することはお勧めしません。
<pre class="prettyprint">
<meta http-equiv="refresh" content="5">
</pre>
<br /><br />
<h3>3. ブラウザのボタンによるRGBフルカラーLED の制御</h3>
PCやスマートフォンのブラウザで、Pico W に接続された RGBフルカラーLED の色を制御する演習を行ってみましょう。9.5 章の内容です。
<br /><br />
なお、Rapsberry Pi を対象とした本書では、RGBフルカラーLEDの色の制御に、ブラウザのスライダを用いました。
しかし、Pico W ではスライダを用いるのは難しそうに思えましたので(専門的に言えば、JavaScript で取得したスライダの値を回路に反映する方法が思いつかない)、簡易的にボタンによる制御を行うことにしました。
<br /><br />
必要な回路は下図の通りです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZf4qBOfr7iXo4geI906G85Cl57BqJRcSS3AcCsQ6WbCemG2CDEDMt6yPFysAuTL2f-f0GkLn-H15yVVq4WQF6SLRZFve3L91RIkF6CQZ5i2u2n2_Msam1O21lUqeskJvylPri5uvS-UIsrAbZYYS9yzi95UOqFnMbLqOHAHd3qcFYtoSllUh03ZDu/s1350/pico-09-03-rgbled.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1034" data-original-width="1350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZf4qBOfr7iXo4geI906G85Cl57BqJRcSS3AcCsQ6WbCemG2CDEDMt6yPFysAuTL2f-f0GkLn-H15yVVq4WQF6SLRZFve3L91RIkF6CQZ5i2u2n2_Msam1O21lUqeskJvylPri5uvS-UIsrAbZYYS9yzi95UOqFnMbLqOHAHd3qcFYtoSllUh03ZDu/s600/pico-09-03-rgbled.png"/></a></div>
そして、この回路上で実行すべきプログラムは下記の通りです。
<pre class="prettyprint">
import time
import sys
import network
import socket
from time import sleep
from machine import Pin, PWM, I2C
pwm1 = PWM(Pin(16))
pwm2 = PWM(Pin(17))
pwm3 = PWM(Pin(18))
pwm1.freq(100)
pwm2.freq(100)
pwm3.freq(100)
pwm1.duty_u16(0)
pwm2.duty_u16(0)
pwm3.duty_u16(0)
# アノードコモンの場合、下記の3行を有効に
#pwm1.duty_u16(65535)
#pwm2.duty_u16(65535)
#pwm3.duty_u16(65535)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
##### for LCD
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
##### end of LCD
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
html = """<!DOCTYPE html><html>
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>3 - RGBフルカラーLEDの制御</title>
<style>button {
width: auto;
height: auto;
background: #003366;
font-weight: normal;
font-size: 14pt;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
color: #ffffff;
padding: 10px 20px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
border: 1px solid #003366;
-moz-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
-webkit-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
text-shadow:
0px -1px 0px rgba(000,000,000,0.7),
0px 1px 0px rgba(255,255,255,0.3);
}
</style></head>
<p>ボタンをクリックすることで、RGBフルカラーLEDの色が変わります。</p>
<p>どの行のボタンが赤、青、緑の何色に対応するかは用いるRGBフルカラーLEDの種類によって異なります。</p>
<div align="center">
<form>色 1 <button name="col1_0" value="on" type="submit" style="background: %s;"> 0 </button>
<button name="col1_1" value="on" type="submit" style="background: %s;"> 1 </button>
<button name="col1_2" value="on" type="submit" style="background: %s;"> 2 </button>
<button name="col1_3" value="on" type="submit" style="background: %s;"> 3 </button>
<button name="col1_4" value="on" type="submit" style="background: %s;"> 4 </button>
</form>
<br /><br />
<form>色 2 <button name="col2_0" value="on" type="submit" style="background: %s;"> 0 </button>
<button name="col2_1" value="on" type="submit" style="background: %s;"> 1 </button>
<button name="col2_2" value="on" type="submit" style="background: %s;"> 2 </button>
<button name="col2_3" value="on" type="submit" style="background: %s;"> 3 </button>
<button name="col2_4" value="on" type="submit" style="background: %s;"> 4 </button>
</form>
<br /><br />
<form>色 3 <button name="col3_0" value="on" type="submit" style="background: %s;"> 0 </button>
<button name="col3_1" value="on" type="submit" style="background: %s;"> 1 </button>
<button name="col3_2" value="on" type="submit" style="background: %s;"> 2 </button>
<button name="col3_3" value="on" type="submit" style="background: %s;"> 3 </button>
<button name="col3_4" value="on" type="submit" style="background: %s;"> 4 </button>
</form>
<br /><br />
</div>
</body></html>
"""
# Wait for connect or fail
max_wait = 20
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
write_string('waiting for conn') #showing on LCD
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
write_string('conn. failed') # showing on LCD
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
write_string(status[0]) #showing on LCD
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind(addr)
except OSError as e:
print(e)
s.close()
s = None
write_string('socket error') #showing on LCD
sys.exit()
s.listen(1)
print('listening on', addr)
onCol = '#26a1ff'
offCol = '#003366'
col1_strs = (onCol, offCol, offCol, offCol, offCol)
col2_strs = (onCol, offCol, offCol, offCol, offCol)
col3_strs = (onCol, offCol, offCol, offCol, offCol)
colall_strs = col1_strs + col2_strs + col3_strs
buttonValMax = 4
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
#print('client connected from', addr)
request = cl.recv(1024)
#print("request:")
#print(request)
request = str(request)
col1_0_on = request.find('col1_0=on')
col1_1_on = request.find('col1_1=on')
col1_2_on = request.find('col1_2=on')
col1_3_on = request.find('col1_3=on')
col1_4_on = request.find('col1_4=on')
col2_0_on = request.find('col2_0=on')
col2_1_on = request.find('col2_1=on')
col2_2_on = request.find('col2_2=on')
col2_3_on = request.find('col2_3=on')
col2_4_on = request.find('col2_4=on')
col3_0_on = request.find('col3_0=on')
col3_1_on = request.find('col3_1=on')
col3_2_on = request.find('col3_2=on')
col3_3_on = request.find('col3_3=on')
col3_4_on = request.find('col3_4=on')
if col1_0_on == 8:
col1_strs = (onCol, offCol, offCol, offCol, offCol)
duty = 0
if col1_1_on == 8:
col1_strs = (offCol, onCol, offCol, offCol, offCol)
duty = 1
if col1_2_on == 8:
col1_strs = (offCol, offCol, onCol, offCol, offCol)
duty = 2
if col1_3_on == 8:
col1_strs = (offCol, offCol, offCol, onCol, offCol)
duty = 3
if col1_4_on == 8:
col1_strs = (offCol, offCol, offCol, offCol, onCol)
duty = 4
if col2_0_on == 8:
col2_strs = (onCol, offCol, offCol, offCol, offCol)
duty = 0
if col2_1_on == 8:
col2_strs = (offCol, onCol, offCol, offCol, offCol)
duty = 1
if col2_2_on == 8:
col2_strs = (offCol, offCol, onCol, offCol, offCol)
duty = 2
if col2_3_on == 8:
col2_strs = (offCol, offCol, offCol, onCol, offCol)
duty = 3
if col2_4_on == 8:
col2_strs = (offCol, offCol, offCol, offCol, onCol)
duty = 4
if col3_0_on == 8:
col3_strs = (onCol, offCol, offCol, offCol, offCol)
duty = 0
if col3_1_on == 8:
col3_strs = (offCol, onCol, offCol, offCol, offCol)
duty = 1
if col3_2_on == 8:
col3_strs = (offCol, offCol, onCol, offCol, offCol)
duty = 2
if col3_3_on == 8:
col3_strs = (offCol, offCol, offCol, onCol, offCol)
duty = 3
if col3_4_on == 8:
col3_strs = (offCol, offCol, offCol, offCol, onCol)
duty = 4
# アノードコモンの場合、下記の行を有効に
#duty = buttonValMax - duty
if col1_0_on == 8 or col1_1_on == 8 or col1_2_on == 8 or col1_3_on == 8 or col1_4_on == 8:
pwm1.duty_u16(int(duty*65535/buttonValMax))
if col2_0_on == 8 or col2_1_on == 8 or col2_2_on == 8 or col2_3_on == 8 or col2_4_on == 8:
pwm2.duty_u16(int(duty*65535/buttonValMax))
if col3_0_on == 8 or col3_1_on == 8 or col3_2_on == 8 or col3_3_on == 8 or col3_4_on == 8:
pwm3.duty_u16(int(duty*65535/buttonValMax))
colall_strs = col1_strs + col2_strs + col3_strs
response = html % colall_strs
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
print('connection closed')
except KeyboardInterrupt as e:
break
s.close()
s = None
</pre>
なお、「1. ブラウザのボタンによるLEDの点灯」で述べたように、YOUR_WIFI_SSID と YOUR_WIFI_PASSWORD を自分の環境のものに変更することと、
LCD なしでプログラムを実行したい場合は「# for LCD ~ # End of LCD」の部分の差し替えが必要ですのでご注意ください。
<br /><br />
さらに、プログラムの書き換え時は、Pico W 上で動作しているプログラムを Thonny の「STOP (停止)」ボタンから一旦停止する必要があることもご注意ください。
<br /><br />
以上のプログラムを実行じ、ブラウザで LCD 上のアドレスにアクセスすると、下記のようなページが開きます。スライダの代わりに、ボタンによってRGBフルカラーLEDの3つの色の明るさを調整する仕組みです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVOfDz_ULTI0JdmhyriU9TIBosf5A3QPC7M7fZ_1Jkz0Ps-cjzMNpZLIIMXkHG5s4CWJ656ASroyrqy6uBj8YjPClHTuCCyLk0LNf5SyHo1uPCM9uMQAR9OYfaTT_O7MtPy-e4fX24bzOBbFcnFgYaWE6q3RzHsDCBb2c4IaaSiseEjKVkWMtzwpVg/s1600/03_rgbled.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="630" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVOfDz_ULTI0JdmhyriU9TIBosf5A3QPC7M7fZ_1Jkz0Ps-cjzMNpZLIIMXkHG5s4CWJ656ASroyrqy6uBj8YjPClHTuCCyLk0LNf5SyHo1uPCM9uMQAR9OYfaTT_O7MtPy-e4fX24bzOBbFcnFgYaWE6q3RzHsDCBb2c4IaaSiseEjKVkWMtzwpVg/s1600/03_rgbled.png"/></a></div>
<br /><br />
<h3>4. ブラウザのボタンによる DC モーターの速度制御</h3>
PCやスマートフォンのブラウザで、Pico W に接続された DC モーターの回転速度を制御する演習を行ってみましょう。9.6 章の内容です。
<br /><br />
なお、Rapsberry Pi を対象とした本書では、DC モーターの速度制御に、ブラウザのタッチイベントを用いました。
しかし、Pico W ではタッチイベントを用いるのは難しそうに思えましたので(専門的に言えば、JavaScript で取得したタッチイベントの情報を回路に反映する方法が思いつかない)、簡易的にボタンによる制御を行うことにしました。
<br /><br />
必要な回路は下図の通りです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqOSb_IzCdjODDPqxDhEDy1-Klp0OW847Ft5KEXh_7QS8bbZKcyYNItSm5QU09YzEg33U5XHDqdnn82_kr_Sgs3tT3s82BcrvH0Az2_aQwXsqm_pcetzYbVCq7JfkRTbO6S9c4DLxR4sHCCUgzxFBiV7FJ0OZ2qSK-VwtM7A1bTl6xdilZULB7bL2d/s1256/pico-09-04-dcmotor.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1010" data-original-width="1256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqOSb_IzCdjODDPqxDhEDy1-Klp0OW847Ft5KEXh_7QS8bbZKcyYNItSm5QU09YzEg33U5XHDqdnn82_kr_Sgs3tT3s82BcrvH0Az2_aQwXsqm_pcetzYbVCq7JfkRTbO6S9c4DLxR4sHCCUgzxFBiV7FJ0OZ2qSK-VwtM7A1bTl6xdilZULB7bL2d/s600/pico-09-04-dcmotor.png"/></a></div>
<pre class="prettyprint">
import time
import sys
import network
import socket
from time import sleep
from machine import Pin, PWM, I2C
pwm1 = PWM(Pin(16))
pwm2 = PWM(Pin(17))
pwm1.freq(100)
pwm2.freq(100)
pwm1.duty_u16(0)
pwm2.duty_u16(0)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
##### for LCD
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
##### end of LCD
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
html = """<!DOCTYPE html><html>
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>4 - ボタンによるDCモーターの速度制御</title>
<style>button {
width: auto;
height: auto;
background: #003366;
font-weight: normal;
font-size: 14pt;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
color: #ffffff;
padding: 10px 20px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
border: 1px solid #003366;
-moz-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
-webkit-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
text-shadow:
0px -1px 0px rgba(000,000,000,0.7),
0px 1px 0px rgba(255,255,255,0.3);
}
</style></head>
<p>押したボタンにより、モーターが回転を開始します。中央のボタンをクリックしないとモーターは止まりません。</p>
<div align="center">
<form><button name="vel_n2" value="on" type="submit" style="background: %s;"> -2 </button>
<button name="vel_n1" value="on" type="submit" style="background: %s;"> -1 </button>
<button name="vel_0" value="on" type="submit" style="background: %s;"> 0 </button>
<button name="vel_p1" value="on" type="submit" style="background: %s;"> +1 </button>
<button name="vel_p2" value="on" type="submit" style="background: %s;"> +2 </button>
</form>
<br /><br />
</div>
</body></html>
"""
# Wait for connect or fail
max_wait = 20
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
write_string('waiting for conn') #showing on LCD
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
write_string('conn. failed') # showing on LCD
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
write_string(status[0]) #showing on LCD
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind(addr)
except OSError as e:
print(e)
s.close()
s = None
write_string('socket error') #showing on LCD
sys.exit()
s.listen(1)
print('listening on', addr)
onCol = '#26a1ff'
offCol = '#003366'
vel_strs = (offCol, offCol, onCol, offCol, offCol)
duty_max = 0.7
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
#print('client connected from', addr)
request = cl.recv(1024)
#print("request:")
#print(request)
request = str(request)
vel_n2_on = request.find('vel_n2=on')
vel_n1_on = request.find('vel_n1=on')
vel_0_on = request.find('vel_0=on')
vel_p1_on = request.find('vel_p1=on')
vel_p2_on = request.find('vel_p2=on')
if vel_n2_on == 8:
vel_strs = (onCol, offCol, offCol, offCol, offCol)
pwm2.duty_u16(0)
pwm1.duty_u16(int(65535*duty_max))
if vel_n1_on == 8:
vel_strs = (offCol, onCol, offCol, offCol, offCol)
pwm2.duty_u16(0)
pwm1.duty_u16(int(65535*duty_max/2))
if vel_0_on == 8:
vel_strs = (offCol, offCol, onCol, offCol, offCol)
pwm1.duty_u16(0)
pwm2.duty_u16(0)
if vel_p1_on == 8:
vel_strs = (offCol, offCol, offCol, onCol, offCol)
pwm1.duty_u16(0)
pwm2.duty_u16(int(65535*duty_max/2))
if vel_p2_on == 8:
vel_strs = (offCol, offCol, offCol, offCol, onCol)
pwm1.duty_u16(0)
pwm2.duty_u16(int(65535*duty_max))
response = html % vel_strs
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
print('connection closed')
except KeyboardInterrupt as e:
break
s.close()
s = None
</pre>
なお、「1. ブラウザのボタンによるLEDの点灯」で述べたように、YOUR_WIFI_SSID と YOUR_WIFI_PASSWORD を自分の環境のものに変更することと、
LCD なしでプログラムを実行したい場合は「# for LCD ~ # End of LCD」の部分の差し替えが必要ですのでご注意ください。
<br /><br />
さらに、プログラムの書き換え時は、Pico W 上で動作しているプログラムを Thonny の「STOP (停止)」ボタンから一旦停止する必要があることもご注意ください。
<br /><br />
以上のプログラムを実行し、LCD上のアドレスにブラウザでアクセスすると、下記のようなページが開きます。タッチの代わりに、ボタンでモーターの回転の向きと速度を調整する仕組みです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjUhdWYCtofBNP0j-vOQpwrptX93ond2116O4L0DiEhBCyNe5T3YiKirOyB4FYCBmVc1YTWeP6ZSxgXpw6nD8vhjz3ZojwHVrsoyN-8QToGQOSLJMjQeqvq5gcDY4OSNJo1KSBgne7RFf1DXDheDOdAXwTkO36FBmCmzCfCt0NPEMe7nJV84pGlN-b/s1600/04_dcmotor.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="300" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjUhdWYCtofBNP0j-vOQpwrptX93ond2116O4L0DiEhBCyNe5T3YiKirOyB4FYCBmVc1YTWeP6ZSxgXpw6nD8vhjz3ZojwHVrsoyN-8QToGQOSLJMjQeqvq5gcDY4OSNJo1KSBgne7RFf1DXDheDOdAXwTkO36FBmCmzCfCt0NPEMe7nJV84pGlN-b/s1600/04_dcmotor.png"/></a></div>
<br /><br />
<h3>5. ブラウザのボタンによるサーボモーターの角度制御</h3>
PCやスマートフォンのブラウザで、Pico W に接続されたサーボモーターの角度を制御する演習を行ってみましょう。9.7 章(付録 PDF)の内容です。
<br /><br />
なお、Rapsberry Pi を対象とした本書では、サーボモーターの角度制御に、ブラウザのスライダを用いました。
しかし、Pico W ではスライダを用いるのは難しそうに思えましたので(専門的に言えば、JavaScript で取得したスライダの値を回路に反映する方法が思いつかない)、簡易的にボタンによる制御を行うことにしました。
<br /><br />
必要な回路は下図の通りです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0MMzW3NpcCMjceURBC3bQt3NbbKmiQxNb9yB_73UPxCT1XYbQS6KiBHL0o1LSTp34g5NCHWtrYwMx3a_72XjyXdqlXp1jzYS4NIU42PxqYA6dWZ9MZQwYpcH016zxFul1yd0nV_I9muyq5jl9nVtI05VEyD41Gxw71QCXtyigc9VZv3tZBY792L8/s1256/pico-09-07-servo.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1010" data-original-width="1256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha0MMzW3NpcCMjceURBC3bQt3NbbKmiQxNb9yB_73UPxCT1XYbQS6KiBHL0o1LSTp34g5NCHWtrYwMx3a_72XjyXdqlXp1jzYS4NIU42PxqYA6dWZ9MZQwYpcH016zxFul1yd0nV_I9muyq5jl9nVtI05VEyD41Gxw71QCXtyigc9VZv3tZBY792L8/s600/pico-09-07-servo.png"/></a></div>
<pre class="prettyprint">
import time
import sys
import network
import socket
from time import sleep
from machine import Pin, PWM, I2C
def servo_duty_hwpwm_web(val):
val_min = 0
val_max = 4
servo_min = 0.035 # 最小デューティ比3.5%
servo_max = 0.1 # 最大デューティ比10%
if val < val_min:
val = val_min
duty = (servo_min-servo_max)*(val-val_min)/(val_max-val_min) + servo_max
# 一般的なサーボモーターはこちらを有効に
#duty = (servo_max-servo_min)*(val-val_min)/(val_max-val_min) + servo_min
return duty
pwm1 = PWM(Pin(16))
pwm1.freq(50)
pwm1.duty_u16(int(65535*servo_duty_hwpwm_web(2)))
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
##### for LCD
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
##### end of LCD
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
html = """<!DOCTYPE html><html>
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>7 - サーボモーターの制御</title>
<style>button {
width: auto;
height: auto;
background: #003366;
font-weight: normal;
font-size: 14pt;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
color: #ffffff;
padding: 10px 20px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
border: 1px solid #003366;
-moz-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
-webkit-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
text-shadow:
0px -1px 0px rgba(000,000,000,0.7),
0px 1px 0px rgba(255,255,255,0.3);
}
</style></head>
<p>押したボタンにより、サーボモーターの位置が決まります。</p>
<div align="center">
<form><button name="pos0" value="on" type="submit" style="background: %s;"> 0 </button>
<button name="pos1" value="on" type="submit" style="background: %s;"> 1 </button>
<button name="pos2" value="on" type="submit" style="background: %s;"> 2 </button>
<button name="pos3" value="on" type="submit" style="background: %s;"> 3 </button>
<button name="pos4" value="on" type="submit" style="background: %s;"> 4 </button>
</form>
<br /><br />
</div>
</body></html>
"""
# Wait for connect or fail
max_wait = 20
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
write_string('waiting for conn') #showing on LCD
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
write_string('conn. failed') # showing on LCD
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
write_string(status[0]) #showing on LCD
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind(addr)
except OSError as e:
print(e)
s.close()
s = None
write_string('socket error') #showing on LCD
sys.exit()
s.listen(1)
print('listening on', addr)
onCol = '#26a1ff'
offCol = '#003366'
pos_strs = (offCol, offCol, onCol, offCol, offCol)
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
#print('client connected from', addr)
request = cl.recv(1024)
#print("request:")
#print(request)
request = str(request)
pos0_on = request.find('pos0=on')
pos1_on = request.find('pos1=on')
pos2_on = request.find('pos2=on')
pos3_on = request.find('pos3=on')
pos4_on = request.find('pos4=on')
if pos0_on == 8:
pos_strs = (onCol, offCol, offCol, offCol, offCol)
pwm1.duty_u16(int(65535*servo_duty_hwpwm_web(0)))
if pos1_on == 8:
pos_strs = (offCol, onCol, offCol, offCol, offCol)
pwm1.duty_u16(int(65535*servo_duty_hwpwm_web(1)))
if pos2_on == 8:
pos_strs = (offCol, offCol, onCol, offCol, offCol)
pwm1.duty_u16(int(65535*servo_duty_hwpwm_web(2)))
if pos3_on == 8:
pos_strs = (offCol, offCol, offCol, onCol, offCol)
pwm1.duty_u16(int(65535*servo_duty_hwpwm_web(3)))
if pos4_on == 8:
pos_strs = (offCol, offCol, offCol, offCol, onCol)
pwm1.duty_u16(int(65535*servo_duty_hwpwm_web(4)))
response = html % pos_strs
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
print('connection closed')
except KeyboardInterrupt as e:
break
s.close()
s = None
</pre>
なお、「1. ブラウザのボタンによるLEDの点灯」で述べたように、YOUR_WIFI_SSID と YOUR_WIFI_PASSWORD を自分の環境のものに変更することと、
LCD なしでプログラムを実行したい場合は「# for LCD ~ # End of LCD」の部分の差し替えが必要ですのでご注意ください。
<br /><br />
さらに、プログラムの書き換え時は、Pico W 上で動作しているプログラムを Thonny の「STOP (停止)」ボタンから一旦停止する必要があることもご注意ください。
<br /><br />
以上のプログラムを実行し、LCD上のアドレスにブラウザでアクセスすると、下記のようなページが開きます。スライダの代わりに、ボタンでサーボモーターの位置を調整する仕組みです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-mwrDJo9yGRDJfENpWEWnm6gns1PfQ8Gqqw9EJLjCVnVKjS-UDnNKS_t6NtGCekAwsB-tYbbgLrdyZj0kgKtlrs8Og_CganjvavEh_bXc2cO7EtaIcwlmjlxwMF9aRMTmw12mjn2uM8w6eFPSESBkZUioV6j0W0Hwj7tQ3aluw0OpNjv2_5-8iVx/s1600/07_servo.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="280" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-mwrDJo9yGRDJfENpWEWnm6gns1PfQ8Gqqw9EJLjCVnVKjS-UDnNKS_t6NtGCekAwsB-tYbbgLrdyZj0kgKtlrs8Og_CganjvavEh_bXc2cO7EtaIcwlmjlxwMF9aRMTmw12mjn2uM8w6eFPSESBkZUioV6j0W0Hwj7tQ3aluw0OpNjv2_5-8iVx/s1600/07_servo.png"/></a></div>
<br /><br />
<h3>6. ブラウザのボタンによるキャタピラ式模型の制御</h3>
PCやスマートフォンのブラウザで、Pico W に接続されたキャタピラ式模型を制御する演習を行ってみましょう。10 章の内容です。
<br /><br />
ここまでの演習同様、「前進」、「後退」、「右旋回」、「左旋回」、「静止」という 5 つのボタンによる簡易的な制御ですのでご了承ください。
<br /><br />
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj__oTHIDfwK1E_LNpUZSVdxRx2Lxif54Rhb8WlJmiVxYwAvtmEinRcuA4fX5_UgJtHlVSl-qUDAuE-vNdVoKE8zuKIq6J-GHjFN9-xVW6epP3DypPUU4rpQot5H66BahHgem9hWnEOEJ7T22MCGts6P1-Zt3MHmbnr3yUvyBTfWrqJtmZw3mSuMyuL/s1256/pico-09-05-tank.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1010" data-original-width="1256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj__oTHIDfwK1E_LNpUZSVdxRx2Lxif54Rhb8WlJmiVxYwAvtmEinRcuA4fX5_UgJtHlVSl-qUDAuE-vNdVoKE8zuKIq6J-GHjFN9-xVW6epP3DypPUU4rpQot5H66BahHgem9hWnEOEJ7T22MCGts6P1-Zt3MHmbnr3yUvyBTfWrqJtmZw3mSuMyuL/s600/pico-09-05-tank.png"/></a></div>
<pre class="prettyprint">
import time
import sys
import network
import socket
from time import sleep
from machine import Pin, PWM, I2C
pwm1 = PWM(Pin(16))
pwm2 = PWM(Pin(17))
pwm3 = PWM(Pin(18))
pwm4 = PWM(Pin(19))
pwm1.freq(100)
pwm2.freq(100)
pwm3.freq(100)
pwm4.freq(100)
pwm1.duty_u16(0)
pwm2.duty_u16(0)
pwm3.duty_u16(0)
pwm4.duty_u16(0)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
ssid = 'YOUR_WIFI_SSID'
password = 'YOUR_WIFI_PASSWORD'
##### for LCD
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
##### end of LCD
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
html = """<!DOCTYPE html><html>
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>5 - クローラーの操作</title>
<style>button {
width: auto;
height: auto;
background: #003366;
font-weight: normal;
font-size: 14pt;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
color: #ffffff;
padding: 10px 20px;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
border: 1px solid #003366;
-moz-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
-webkit-box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
box-shadow:
0px 1px 3px rgba(000,000,000,0.5),
inset 0px 0px 1px rgba(255,255,255,0.5);
text-shadow:
0px -1px 0px rgba(000,000,000,0.7),
0px 1px 0px rgba(255,255,255,0.3);
}
</style></head>
<p>押したボタンにより、クローラーが移動します。中央のボタンをクリックしないとクローラーは止まりません。</p>
<div align="center">
<table border="0">
<tr align="center">
<td></td>
<td><form><button name="forward" value="on" type="submit" style="background: %s;"> ↑ </button></form></td>
<td></td>
</tr>
<tr align="center">
<td><form><button name="rot_l" value="on" type="submit" style="background: %s;"> ← </button></form></td>
<td><form><button name="stop" value="on" type="submit" style="background: %s;"> 〇 </button></form></td>
<td><form><button name="rot_r" value="on" type="submit" style="background: %s;"> → </button></form></td>
</tr>
<tr align="center">
<td></td>
<td><form><button name="backward" value="on" type="submit" style="background: %s;"> ↓ </button></form></td>
<td></td>
</tr>
</table>
<br /><br />
</div>
</body></html>
"""
# Wait for connect or fail
max_wait = 20
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
write_string('waiting for conn') #showing on LCD
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
write_string('conn. failed') # showing on LCD
raise RuntimeError('network connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
write_string(status[0]) #showing on LCD
# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s.bind(addr)
except OSError as e:
print(e)
s.close()
s = None
write_string('socket error') #showing on LCD
sys.exit()
s.listen(1)
print('listening on', addr)
onCol = '#26a1ff'
offCol = '#003366'
move_strs = (offCol, offCol, onCol, offCol, offCol)
duty_max = 0.7
# Listen for connections, serve client
while True:
try:
cl, addr = s.accept()
#print('client connected from', addr)
request = cl.recv(1024)
#print("request:")
#print(request)
request = str(request)
forward_on = request.find('forward=on')
rot_l_on = request.find('rot_l=on')
stop_on = request.find('stop=on')
rot_r_on = request.find('rot_r=on')
backward_on = request.find('backward=on')
if forward_on == 8:
move_strs = (onCol, offCol, offCol, offCol, offCol)
pwm2.duty_u16(0)
pwm1.duty_u16(int(65535*duty_max))
pwm4.duty_u16(0)
pwm3.duty_u16(int(65535*duty_max))
if rot_l_on == 8:
move_strs = (offCol, onCol, offCol, offCol, offCol)
pwm1.duty_u16(0)
pwm2.duty_u16(int(65535*duty_max))
pwm4.duty_u16(0)
pwm3.duty_u16(int(65535*duty_max))
if stop_on == 8:
move_strs = (offCol, offCol, onCol, offCol, offCol)
pwm1.duty_u16(0)
pwm2.duty_u16(0)
pwm3.duty_u16(0)
pwm4.duty_u16(0)
if rot_r_on == 8:
move_strs = (offCol, offCol, offCol, onCol, offCol)
pwm2.duty_u16(0)
pwm1.duty_u16(int(65535*duty_max))
pwm3.duty_u16(0)
pwm4.duty_u16(int(65535*duty_max))
if backward_on == 8:
move_strs = (offCol, offCol, offCol, offCol, onCol)
pwm1.duty_u16(0)
pwm2.duty_u16(int(65535*duty_max))
pwm3.duty_u16(0)
pwm4.duty_u16(int(65535*duty_max))
response = html % move_strs
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
except OSError as e:
print('connection closed')
except KeyboardInterrupt as e:
break
s.close()
s = None
</pre>
なお、「1. ブラウザのボタンによるLEDの点灯」で述べたように、YOUR_WIFI_SSID と YOUR_WIFI_PASSWORD を自分の環境のものに変更することと、
LCD なしでプログラムを実行したい場合は「# for LCD ~ # End of LCD」の部分の差し替えが必要ですのでご注意ください。
<br /><br />
さらに、プログラムの書き換え時は、Pico W 上で動作しているプログラムを Thonny から一旦停止する必要があることもご注意ください。
<br /><br />
以上のプログラムを実行し、LCD上のアドレスにブラウザでアクセスすると、下記のようなページが開きます。タッチの代わりに、ボタンでキャタピラ式模型の移動方法を変更する仕組みです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhykrT2maLdxhjwfBZw5l_WGR0X1R2X_9524t8kQs6GeUa1PdfE2SoB0dbDvA-wVHDQQ1trh_oket9TJbRmOOEizJKE9J32GpnDM4HEpH029UAdVgXAunPtCtnrRgcKpIAxtZcX_Qr6XRApvW1KDSptN1cE2Zu90X5yjbQKxqnze7ZUZ81uAERlTw3Q/s1600/05_tank.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="460" data-original-width="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhykrT2maLdxhjwfBZw5l_WGR0X1R2X_9524t8kQs6GeUa1PdfE2SoB0dbDvA-wVHDQQ1trh_oket9TJbRmOOEizJKE9J32GpnDM4HEpH029UAdVgXAunPtCtnrRgcKpIAxtZcX_Qr6XRApvW1KDSptN1cE2Zu90X5yjbQKxqnze7ZUZ81uAERlTw3Q/s1600/05_tank.png"/></a></div>Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-51428263450412849152021-04-04T14:00:00.001+09:002022-05-10T15:30:09.337+09:00本書の演習をウェブカメラで実行する方法<h4>
1. はじめに</h4>
本書では、Raspberry Piの公式カメラモジュールを用いた電子工作の例を2つだけ紹介しました。
タクトスイッチをカメラのシャッターにする例(第5章)およびキャタピラ式模型へカメラを搭載する例(第10章)です。
<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を開き、本書のサンプルファイル(「04-」などの数字で始まるファイル)が存在するディレクトリに移動してください。
サンプルファイルをユーザーpiのホームディレクトリに展開した方は移動の必要はありません。bluebacksディレクトリに展開した方は下記のコマンドを実行するのでした。
<br />
<pre class="prettyprint">cd bluebacks
</pre>
次に、下記の3つのコマンドを順に実行して、必要なファイルのダウンロードと展開を行ってください。コマンドはコピー&貼り付けで実行することを推奨します。展開後はダウンロードした圧縮ファイルは不要となるので削除しています。
<br />
<pre class="prettyprint">wget https://github.com/neuralassembly/raspi/raw/master/raspi1a-webcam.zip
unzip raspi1a-webcam.zip
rm raspi1a-webcam.zip
</pre>
なお、展開されるファイルの名前は既存のサンプルファイルとは異なりますので、サンプルファイルが上書きされることはありません。展開により現れるファイルは下記の通りです。ファイル名の末尾付近に全て「-webcam」がついていることに注意してください。
<br />
<pre class="prettyprint">05-04-sw-camera-webcam.py
10-02-stream-webcam.sh
</pre>
あとは、以下に従って実行します。
<br />
<br />
<h4>
3. 実行</h4>
実行に関する注意を、いくつか例を挙げながら解説します。
<br />
<br />
例えば、本書 p.130 にファイル 05-04-sw-camera.py を実行するよう指示があります。<br />
このファイル「05-04-sw-camera.py」に対しては、ウェブカメラ対応の代替ファイル「05-04-sw-camera-webcam.py」が存在します。
そのような場合、代替ファイルを実行して欲しい、ということです。
<br /><br />
ただし、05-04-sw-camera-webcam.py の実行には、下記の2つのコマンドを順に実行することで OpenCV という画像処理ライブラリをインストールする必要があります。
<pre class="prettyprint">sudo apt update
sudo apt install python3-opencv
</pre>
同様に、p.294 には下記のコマンドを /etc/rc.local に記述するよう指示があります。
<pre class="prettyprint">sh /home/pi/10-02-stream.sh
</pre>
このファイル「10-02-stream.sh」に対しては、ウェブカメラ対応の代替ファイル「10-02-stream-webcam.sh」が存在します。
そのような場合、上記コマンドの代わりに下記のコマンドを記述して欲しい、ということです。
<pre class="prettyprint">sh /home/pi/10-02-stream-webcam.sh
</pre>
なお、2022年4月にリリースされた OS よりデフォルトユーザー pi は廃止されています。そのため、上のコマンドの pi の部分は、皆さんが作成したユーザー名で置き換変える必要があります。すなわち、「kanamaru」というユーザーを作成したのなら、「sh /home/kanamaru/10-02-stream-webcam.sh」となります。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-73063731164463807232021-04-04T13:19:00.039+09:002024-02-02T00:48:12.751+09:00本書の電子工作パーツをRaspberry Pi Picoで利用する
<h3>はじめに</h3>
2021年1月にRaspberry Pi Picoが発表されました。例えば下記のショップで取り扱われています(品切れのときもあります)。後で述べるように、購入する場合は「Pico にピンヘッダを実装したもの」あるいは「Pico H (ピンヘッダ実装済のPico)」がお勧めです。
<ul>
<li>秋月電子通商 (<a href="https://akizukidenshi.com/catalog/g/g116132/" target="_blank">通常版</a>/ <a href="https://akizukidenshi.com/catalog/g/g118085/" target="_blank">Pico H、完成品</a>)</li>
<li>千石電商 (<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5S4T" target="_blank">通常版</a>/<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5YEC" target="_blank">Pico H, ピンヘッダ実装済</a>)</li>
<li>スイッチサイエンス (<a href="https://www.switch-science.com/products/6900" target="_blank">通常版</a>/<a href="https://www.switch-science.com/products/8170" target="_blank">Pico H, ピンヘッダ実装済</a>)</li>
<li>KSY (<a href="https://raspberry-pi.ksyic.com/main/index/pdp.id/634" target="_blank">通常版</a>/<a href="https://raspberry-pi.ksyic.com/main/index/pdp.id/697" target="_blank">ピンヘッダ実装版</a>/<a href="https://raspberry-pi.ksyic.com/main/index/pdp.id/864" target="_blank">Pico H, ピンヘッダ実装済</a>)</li>
</ul>
また、2023年3月には、Wifi対応の Raspberry Pi Pico W も発売されました。
<ul>
<li>秋月電子通商 (<a href="https://akizukidenshi.com/catalog/g/g117947/" target="_blank">Pico W、Wifi対応</a>
/<a href="https://akizukidenshi.com/catalog/g/g118086/" target="_blank">Pico WH、ピンヘッダ実装済)</a></li>
<li>千石電商 (<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-65C4" target="_blank">Pico W、Wifi対応</a>/<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-65YB" target="_blank">Pico WH、ピンヘッダ実装済</a>)</li>
<li>スイッチサイエンス (<a href="https://www.switch-science.com/products/8171" target="_blank">Pico W、Wifi対応</a>
/<a href="https://www.switch-science.com/products/8172" target="_blank">Pico WH、ピンヘッダ実装済</a>)
</li>
<li>KSY (<a href="https://raspberry-pi.ksyic.com/main/index/pdp.id/863" target="_blank">Pico W、Wifi対応</a>/<a href="https://raspberry-pi.ksyic.com/main/index/pdp.id/865" target="_blank">Pico WH、ピンヘッダ実装済</a>)</li>
</ul>
Raspberry Pi Pico は従来の Raspberry Pi シリーズのように「コンピューター」として使うものではなく、以下のように「マイクロコントローラー」に分類される商品です。マイクロコントローラーの代表例として、本書1章では Arduino UNO を紹介したのでした。
<br /><br />
<table border="1">
<tr>
<td>コンピューター</td><td>Raspberry Pi Zero / 1 / 2 / 3 / 4 など</td>
</tr>
<tr>
<td>マイクロコントローラー</td><td>Arduino UNO、Raspberry Pi Pico など</td>
</tr>
</table>
<br />
これは、Raspberry Pi Pico は Linux OS をインストールして利用するものではないということを意味します。また従来の Raspberry Pi ではできたことで、Raspberry Pi Pico にはできないことがたくさんあります。本書の範囲で言えば、カメラを利用する演習などです。
<br /><br />
しかし、電子工作は Linux OS を用いる手法よりもマイクロコントローラーを用いて行う手法の方が歴史がありますし、Raspberry Pi Pico の方が優れている面もまたたくさんあります。例えば、出力できるハードウェアPWMが16個であることや、電源投入後すぐに回路が動き出すことなどです。
<br /><br />
本書を購入された方は、<a href="https://akizukidenshi.com/catalog/g/g115351/" target="_blank">秋月電子通商さんによるパーツセット</a>などの電子工作パーツを合わせて購入された方も多いでしょう。その電子工作パーツを Raspberry Pi Pico で利用してみると、電子工作の世界をより深く知ることができます。従来の Raspberry Pi と Raspberry Pi Pico の利点を知ることで、それぞれを適材適所で使い分けることもできるでしょう。
<br /><br />
なお、Raspberry Pi 財団は、公式の<a href="https://www.switch-science.com/products/6425/" target="_blank">キーボード</a>や<a href="https://www.switch-science.com/products/6426/" target="_blank">マウス</a>を販売するなど、ユーザーが愛着を持てるようなブランド作りにこだわっているように筆者には思えます。従来のシリーズとは異なる Raspberry Pi Pico にも接することで、皆さんの Raspberry Pi シリーズへの愛着はさらに増すかもしれません。
<br /><br />
そこで、本ページでは本書で用いた電子工作パーツを Raspberry Pi Pico でも用いる方法を紹介します。
<br /><br />
下図は、本書4章で行ったLチカを Raspberry Pi Pico で実行している様子です。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-ZvAawoqZskQ/YGguL00DaBI/AAAAAAAAIDc/JIY0xE_4vyQfvquQ6R0qKzSKnPZGyK7wgCPcBGAYYCw/s1024/pico-led.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="836" data-original-width="1024" src="https://1.bp.blogspot.com/-ZvAawoqZskQ/YGguL00DaBI/AAAAAAAAIDc/JIY0xE_4vyQfvquQ6R0qKzSKnPZGyK7wgCPcBGAYYCw/s600/pico-led.jpg"/></a></div>
以下、本ページでは本書 1 章から 8 章の演習のうち、Raspberry Pi Pico でも実行可能なものを紹介します。<br />
Raspberry Pi Pico W を用いている方は、9章以降の Wifi 接続を必要とする演習も実行可能です。本ページで Raspberry Pi Pico の取り扱いに慣れてから以下のページに進むとよいでしょう。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2023/03/raspberry-pi-pico-w-wifi.html" target="_blank">Raspberry Pi Pico W を使って Wifi 経由で回路を制御してみよう</a></li>
</ul>
<br />
<h3>初回のみ実行すればよい準備</h3>
さてここからは、Raspberry Pi Pico で電子工作するために、最初に一回だけ実行すればよい準備を行っていきます。<br /><br />
ピンヘッダが取り付けられていない Raspberry Pi Pico を購入された方は、それをはんだ付けする必要があります。
<br />
はんだ付けをしたくない方には、あらかじめページ上部のリンクでピンヘッダ実装済のものを購入するのがお勧めです。
<br /><br />
さて、Raspberry Pi Pico (Pico W 含む) に自分でピンヘッダをはんだ付けする場合、ピンヘッダとよばれるパーツを入手する必要があります。例えば秋月電子通商さんの下記のものがあります。
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/gC-00167/" target="_blank">ピンヘッダ 1×40 (40P)</a></li>
</ul>
これは40ピンのピンヘッダですが、これをニッパで半分にカットして20ピンのものを2つ用意します。なお、ピンヘッダを2つにカットする際、ピンヘッダのプラスチック部が破損することがありますので、
ピンヘッダは複数購入するのが安全です。
<br /><br />
ピンヘッダをはんだ付けする際、ピンヘッダと Raspberry Pi Pico のみでは固定するのに苦労します。下図のようにブレッドボードに差した状態ではんだ付けするのが簡単です。
はんだ付けのコツはp.162の図7-2をご覧ください。ピンとランドの両方を熱することが重要なのでした。
<br /><br />
なお、手早く行わないとブレッドボードが溶けてきますので注意しましょう。ブレッドボードは安価なので、もし溶けてしまったとしても新しいものを購入することは比較的容易です。
<br /><br />
このはんだ付けが、Raspberry Pi Picoを用いる上で最も難易度が高い作業だと個人的には思います。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-gcSSV2XFf-s/YGguMT4aQTI/AAAAAAAAID4/jEBtv1Jrov8JW_3oHY68hxvJpjK0lOApwCPcBGAYYCw/s1024/pico-solder.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="747" data-original-width="1024" src="https://1.bp.blogspot.com/-gcSSV2XFf-s/YGguMT4aQTI/AAAAAAAAID4/jEBtv1Jrov8JW_3oHY68hxvJpjK0lOApwCPcBGAYYCw/s600/pico-solder.jpg"/></a></div>
ピンヘッダが装着されたら、Raspberry Pi Pico を PC に接続します。PCは Windows や macOS を搭載したものでもよいですし、従来の Raspberry Pi Zero / 1 / 2 / 3 / 4 でも構いません。以下では、Raspberry Pi Pico を Windows PC と接続した場合を例に解説を進めます。
<br /><br />
PCとの接続には microUSB ケーブルを用います。<strong>microUSB ケーブルは、充電専用のものではなくPCと通信可能なものを用意してください</strong>。充電専用のケーブルでは以下の作業を実行できません。
<br /><br />
そして、<strong>Raspberry Pi Pico の基板上の白い BOOTSEL ボタンを押しながら microUSB ケーブルをPCのUSBポートに接続</strong>します。BOOTSEL ボタンを押しながらPCに接続すると、Raspberry Pi Pico は PC からは USB メモリのようなストレージとして見えます。
<br /><br />
私の Windows 10 では、下図のようなストレージとして表示されました。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-W7WSPh2um48/YGguJI2iP7I/AAAAAAAAID8/oy1IjNme2O0WZws0O8SNrej57L-cJWV_gCPcBGAYYCw/s0/pico-config01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="60" data-original-width="260" src="https://1.bp.blogspot.com/-W7WSPh2um48/YGguJI2iP7I/AAAAAAAAID8/oy1IjNme2O0WZws0O8SNrej57L-cJWV_gCPcBGAYYCw/s0/pico-config01.png"/></a></div>
このストレージの内部を見ると、下図のように INDEX.HTM と INFO_UF2.TXT というファイルが存在します。図中に先回りで記述されているように、ここに UF2 と呼ばれるファイルをダウンロード(あるいはコピー)します。このファイルは、Raspberry Pi Pico を MicroPython という言語で用いるために必要なものです。MicroPythonとは、マイクロコントローラーで動作させるための Python です。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-RGAJJS4MS2w/YGguJm72YRI/AAAAAAAAIDw/xm2TShjymBMc2M-fi69lrikhjJau4k68wCPcBGAYYCw/s0/pico-config02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="256" data-original-width="450" src="https://1.bp.blogspot.com/-RGAJJS4MS2w/YGguJm72YRI/AAAAAAAAIDw/xm2TShjymBMc2M-fi69lrikhjJau4k68wCPcBGAYYCw/s0/pico-config02.png"/></a></div>
UF2ファイルは<a href="https://www.raspberrypi.com/documentation/microcontrollers/micropython.html" target="_blank">Raspberry Pi の公式ページのこちら</a>よりダウンロードできます。ページ中の「Download the correct MicroPython UF2 file for your board」という箇所にある UF2 ファイルをダウンロードします。Pico 用と Pico W 用がありますので、ご自分のお使いの Pico にあったファイルを選びましょう。Pico H を用いている方は Pico 用を、Pico WH を用いている方は Pico W 用を選択します。
<br /><br />
執筆時には、Pico用の場合「rp2-pico-20221011-unstable-v1.19.1-543-gab317a0d6.uf2」という名称のファイルがダウンロードされました。
<strong>このファイルを、先ほどの Raspberry Pi Pico を表すストレージに直接ダウンロードするか、あるいはダウンロードされたファイルをストレージにコピーしましょう。</strong>
ストレージへのダウンロードまたはコピーが完了すると、Raspberry Pi Pico が自動的に再起動されます。
<br /><br />
それにより、基板上の白い BOOTSEL ボタンを押さずに Raspberry Pi Pico に電源を入れたときと同じ状態になり、Raspberry Pi Pico で MicroPython が利用できるようになります。
Raspberry Pi Pico の次回以降の起動の際は、何も押さずに Raspberry Pi Pico と PC を microUSB ケーブルで接続するだけで OK です。
<br /><br />
次に、Raspberry Pi Pico 上で MicroPython プログラムを実行するために、開発環境である Thonny をインストールします。
PC として Windows や macOS をお使いの場合、多くの方は Thonny をインストールしていないでしょうから、<a href="https://thonny.org/" target="_blank">こちら</a>から各 OS 用の Thonny をダウンロードし、インストールしてください。
<br /><br />
PC として Raspberry Pi を用いる場合はインストール済の Thonny を用いて構いません。ただし、Raspberry Pi OS が古い場合、下記コマンドで Thonny を最新にした方が良いでしょう。
<pre class="prettyprint">
sudo apt update
sudo apt install thonny
</pre>
さて、インストールした Thonny を起動します。そのウインドウの右下に例えば「Python 3.7.9」のように Pythonのバージョンが書かれていますので、そこをマウスでクリックします。
すると、下図の状態になりますので、Configure Interpreter をクリックします。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-3mAT_hhXVLs/YGguKdkBJWI/AAAAAAAAIDs/1-T3E_RpMQUDpm2kqkXYBfYy3CZG0wWmACPcBGAYYCw/s1023/pico-config04.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="771" data-original-width="1023" src="https://1.bp.blogspot.com/-3mAT_hhXVLs/YGguKdkBJWI/AAAAAAAAIDs/1-T3E_RpMQUDpm2kqkXYBfYy3CZG0wWmACPcBGAYYCw/s600/pico-config04.png"/></a></div>
すると、下図のウインドウが開きますので、「MicroPython (Raspberry Pi Pico)」をクリックし、OKボタンをクリックしましょう。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-3g8uRPv7RdA/YGguKTayZRI/AAAAAAAAIDs/IPutuhyYF5kB0DGewSuMYPeqabeRb1b5ACPcBGAYYCw/s802/pico-config05.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="702" data-original-width="802" src="https://1.bp.blogspot.com/-3g8uRPv7RdA/YGguKTayZRI/AAAAAAAAIDs/IPutuhyYF5kB0DGewSuMYPeqabeRb1b5ACPcBGAYYCw/s600/pico-config05.png"/></a></div>
するとウインドウの右下の表示が以下のようになります。この状態になったら、Raspberry Pi Pico で MicroPython プログラムを実行するための開発環境として Thonny を利用することができます。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-1T4RB_VlMsg/YGguKgZl5fI/AAAAAAAAIDw/Xnr4fITjge41NHsx7F2Qk1OBteOW6RC5gCPcBGAYYCw/s0/pico-config06.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="100" data-original-width="250" src="https://1.bp.blogspot.com/-1T4RB_VlMsg/YGguKgZl5fI/AAAAAAAAIDw/Xnr4fITjge41NHsx7F2Qk1OBteOW6RC5gCPcBGAYYCw/s0/pico-config06.png"/></a></div>
今回初めて Thonny をインストールした方の場合、 このまま Thonny を Raspberry Pi Pico 専用の開発環境にしてしまってもよいでしょう。そうではない場合、すなわち、これまで Thonny を通常の Python の開発環境としても利用していた場合、 Raspberry Pi Pico 用プログラムの開発が終わったら上の画面で「The same interpreter which runs Thonny (default)」をクリックし、Thonny をデフォルトの状態に戻す必要がありますのでご注意ください。
<br /><br />
<h3>4章のLチカを実行してみよう</h3>
さて、以上で準備は整いました。ここからは、本書4章以降で用いた電子工作パーツを Raspberry Pi Pico (Pico W 含む) で利用する方法を解説していきます。
<br /><br />
Raspberry Pi Pico のピン配置は以下のようになっています。このうちそれぞれの電子工作パーツに必要なピンを用いて回路を作成していきます。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-YIjdcyZM2-A/YGguMWyX4iI/AAAAAAAAID8/QAqv6O03UiwzqvlgZ2q79ffg6C8vX_1cQCPcBGAYYCw/s972/pico-pin.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="638" data-original-width="972" src="https://1.bp.blogspot.com/-YIjdcyZM2-A/YGguMWyX4iI/AAAAAAAAID8/QAqv6O03UiwzqvlgZ2q79ffg6C8vX_1cQCPcBGAYYCw/s600/pico-pin.png"/></a>
</div>
<div align="center"><a href="https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf" target="_blank">Raspberry Pi Pico Datasheet</a> の p.4 より引用</div>
<br /><br />
まず、4章で用いたLEDでLチカを行うための回路を以下に示します。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-fpGJETuxrEs/YGguHe0K4nI/AAAAAAAAIDs/0C1sFBfCHdwB1359_Qt_T7DDDiZ8Tq_mwCPcBGAYYCw/s1000/pico-04-01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="590" data-original-width="1000" src="https://1.bp.blogspot.com/-fpGJETuxrEs/YGguHe0K4nI/AAAAAAAAIDs/0C1sFBfCHdwB1359_Qt_T7DDDiZ8Tq_mwCPcBGAYYCw/s600/pico-04-01.png"/></a></div>
そして、実行すべきプログラムは以下のものです。
<pre class="prettyprint">
from machine import Pin
from time import sleep
led = Pin(16, Pin.OUT)
while True:
led.toggle()
sleep(0.5)
</pre>
このプログラムをコピーして下図のように Thonny 上に貼り付けます。そして、貼り付けが終わったら緑色の実行ボタンをクリックしましょう。新しい Thonny を使っている場合、すぐにプログラムが実行され、 ブレッドボード上の LED が点滅すると思います。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-xeNgxicXibA/YGguKzywwtI/AAAAAAAAIDs/6YMUW8uA398emrNvMO_UqVMgwMONrb3_wCPcBGAYYCw/s802/pico-config07.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="702" data-original-width="802" src="https://1.bp.blogspot.com/-xeNgxicXibA/YGguKzywwtI/AAAAAAAAIDs/6YMUW8uA398emrNvMO_UqVMgwMONrb3_wCPcBGAYYCw/s600/pico-config07.png"/></a></div>
以下のウインドウが現れますので、「Raspberry Pi Pico」をクリックしましょう。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-QjcORR2TopY/YGguLEwMemI/AAAAAAAAID8/a5lieNq6j2YnDhMDCJvXTvzbBcKGspNYgCPcBGAYYCw/s0/pico-config08.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="202" data-original-width="214" src="https://1.bp.blogspot.com/-QjcORR2TopY/YGguLEwMemI/AAAAAAAAID8/a5lieNq6j2YnDhMDCJvXTvzbBcKGspNYgCPcBGAYYCw/s0/pico-config08.png"/></a></div>
すると、下図のように Raspberry Pi Pico 上に保存する際のファイル名を聞かれます。<strong>以下のすべてのプログラムで、プログラム名を main.py としてOKをクリックしてください</strong>。
main.py は特別なファイル名となっており、Raspberry Pi Pico に電源が投入されたときに自動的に実行されるプログラムとなるのです。新しい Thonny を使っている場合、メニューの「ファイル」→「保存」または「名前を付けて保存」からこれらの画面を出すことができます。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-a3iuzNxVrGI/YGguLEwqU_I/AAAAAAAAIDw/-F6vnXlnV4Um9EyIXgyfErTah1_1JbW7ACPcBGAYYCw/s0/pico-config09.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="409" data-original-width="553" src="https://1.bp.blogspot.com/-a3iuzNxVrGI/YGguLEwqU_I/AAAAAAAAIDw/-F6vnXlnV4Um9EyIXgyfErTah1_1JbW7ACPcBGAYYCw/s0/pico-config09.png"/></a></div>
なお、このとき、「Device is busy... (以下省略)」というエラーメッセージが表示された場合、Raspberry Pi Pico 上でプログラム実行中の可能性があります。その場合、Thonny の「STOP(停止)」ボタンをクリックし、実行中のプログラムを停止してから保存するようにしてください。これは、本ページの以下のプログラムでも共通のことですので、覚えておきましょう。
<br /><br />
さて、OKボタンをクリックすると、main.py が保存され、さらにそのプログラムが実行されます。
<br /><br />
さて、以上の方法でプログラムを実行すれば、ブレッドボード上でLEDが点滅しているはずです。これをLチカと呼ぶのでした。
<br /><br />
Lチカを確認できたら、Raspberry Pi Pico の電源を一旦切ってから入れ直し、Lチカプログラムが自動実行されることも確認してみましょう。ただし、上で述べたように Raspberry Pi Pico 上に main.py というファイル名でプログラムを保存しないと、この「電源投入と同時に行われるプログラム自動実行」は機能しませんのでご注意ください。
<br /><br />
なお、Raspberry Pi Pico は従来の Linux OS をインストールする Raspberry Pi と異なり、いきなり USB ケーブルを抜いて電源を切っても構いません。
<br /><br />
USBケーブルを接続して Raspberry Pi Pico に電源を入れなおすと、即座にLチカが始まったのではないでしょうか?
このように「プログラムの自動実行が容易であること」、「電源投入後にすぐに回路が動作すること」が Raspberry Pi Pico の特長です。
<br /><br />
Linux OS をインストールする従来の Raspberry Pi ではプログラムの自動実行がそれなりに大変であり(本書での紹介はp.286~291)、回路が動作するまでには OS の起動を待たねばなりませんから 1 分程度の時間がかかるのでした。
<br /><br />
さて、以上で Raspberry Pi Pico で電子工作パーツを動かす基本の解説は終わりです。以下では、残りの章で用いた電子工作パーツ用の回路図とプログラムを列挙していきます。
<br /><br />
<h3>5章のタクトスイッチを使ってみよう</h3>
タクトスイッチを利用するための回路が下図です。タクトスイッチの状況に応じて点灯させるための LED も取り付けられています。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-1EP0RenoA9w/YGguHbexiwI/AAAAAAAAIDs/GkW62G33l0c1szzmmPi0c6at8rmErMSvgCPcBGAYYCw/s1000/pico-05-01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="590" data-original-width="1000" src="https://1.bp.blogspot.com/-1EP0RenoA9w/YGguHbexiwI/AAAAAAAAIDs/GkW62G33l0c1szzmmPi0c6at8rmErMSvgCPcBGAYYCw/s600/pico-05-01.png"/></a></div>
上の回路に対し、「タクトスイッチを押している間だけ LED が点灯する」という動作のプログラムが以下です。本書のサンプルでは 05-02-sw-pd.py に相当します。
このプログラムをコピーして Thonny 上に貼り付け、緑色の実行ボタンをクリックして Raspberry Pi Pico 上に main.py という名前で保存することで実行するのでした。
<pre class="prettyprint">
from machine import Pin
led = Pin(16, Pin.OUT)
switch = Pin(17, Pin.IN, Pin.PULL_DOWN)
while True:
if switch.value()==1:
led.value(1)
else:
led.value(0)
</pre>
一方、「タクトスイッチを押すたびに LED の点灯/消灯が切り替わる」という動作のプログラムが以下です。本書のサンプルでは 05-03-sw-pd-event.py に相当します。
「一度イベントを検出したら 200ms の間は次のイベントを検出しない」という機能がライブラリになさそうなので、プログラム上で時間を計測して実現しています。
<pre class="prettyprint">
from machine import Pin
import time
def switch_pressed(p):
global prev_time, counter, led
pressed_time = time.ticks_ms()
if pressed_time < prev_time + 200 :
return
led.toggle()
prev_time = pressed_time
prev_time = time.ticks_ms()
led = Pin(16, Pin.OUT)
switch = Pin(17, Pin.IN, Pin.PULL_DOWN)
switch.irq(trigger=Pin.IRQ_RISING, handler=switch_pressed)
</pre>
上記のどちらのプログラムも、Thonny に貼り付けて実行ボタンをクリックし、Raspberry Pi Pico 上に main.py という名称で保存して実行するのでした。
<br /><br />
<h3>6章の半固定抵抗でアナログ値を使ってみよう</h3>
6章のAD変換によるアナログ値の利用をRaspberry Pi Picoでも実行してみましょう。書籍で用いた従来の Raspberry Pi と違うのは、 Raspberry Pi Pico には ADコンバータが内蔵されており、別途用意する必要がないことです。ピン配置図で ADC0~2 と書かれているピンでADコンバータを利用できます。
<br /><br />
早速試してみましょう。半固定抵抗を用いる回路図が以下です。これは本書p.144の図6-6に相当します。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-553AD87eggQ/YGguHC_dbcI/AAAAAAAAIDw/68ac5tYeYfYIgTUhW4USEW-s9BSN_iBMwCPcBGAYYCw/s1000/pico-06-01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="590" data-original-width="1000" src="https://1.bp.blogspot.com/-553AD87eggQ/YGguHC_dbcI/AAAAAAAAIDw/68ac5tYeYfYIgTUhW4USEW-s9BSN_iBMwCPcBGAYYCw/s600/pico-06-01.png"/></a></div>
この回路を利用するためのプログラムが以下です。
本書のサンプルでは 06-01-print.py に相当します。
このプログラムをコピーして Thonny 上に貼り付け、緑色の実行ボタンをクリックして Raspberry Pi Pico 上に main.py という名前で保存することで実行するのでした。
<pre class="prettyprint">
from machine import ADC
from time import sleep
adc = ADC(26)
# Values in a range [272, 65535] were shown.
while True:
value = adc.read_u16()
print(value)
sleep(0.2)
</pre>
Raspberry Pi Pico の ADコンバータを read_u16 関数で読み取ると、0~65535 の数値が読み取れます。ただし、私が試したところ、小さな値としては 272 程度までしか下がらず、
0という値は出力されませんでした。そのことがコメントとして書かれています。
<br /><br />
次に、フォトレジスタ(CdSセル)により明るさを読み取り、暗ければLEDを点灯するという演習を試してみましょう。回路図は以下で、これは本書p.155の図6-9に相当します。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-ieYfSJnLEeE/YGguH1mQtcI/AAAAAAAAID0/nCnw2i03ylI-x6c_yLGjoxXmWgB-JCaUQCPcBGAYYCw/s1014/pico-06-02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="600" data-original-width="1014" src="https://1.bp.blogspot.com/-ieYfSJnLEeE/YGguH1mQtcI/AAAAAAAAID0/nCnw2i03ylI-x6c_yLGjoxXmWgB-JCaUQCPcBGAYYCw/s600/pico-06-02.png"/></a></div>
この回路を利用するためのプログラムが以下です。
本書のサンプルでは 06-02-led.py に相当します。このプログラムでは明るい/暗いの境界の値を 50000 と定めています。必要に応じて変更してください。
<pre class="prettyprint">
from machine import ADC, Pin
from time import sleep
adc = ADC(26)
led = Pin(16, Pin.OUT)
# Values in a range [272, 65535] were shown.
while True:
value = adc.read_u16()
if value < 50000:
led.value(1)
else:
led.value(0)
print(value)
sleep(0.2)
</pre>
<br /><br />
<h3>7章のI2Cデバイスを使ってみよう</h3>
次に、7章で用いたI2Cデバイスである温度センサと LCD を利用してみましょう。
<br /><br />
温度センサを用いる回路図は以下です。本書p.164の図7-4に相当します。なお、I2C用のプルアップ抵抗ですが、RP2040 内部の 50~80kΩ のプルアップ抵抗が有効にされるようで、本ページの演習は全てI2C用のプルアップ抵抗なしで動作します(<a href="https://zenn.dev/nanase_t/scraps/95395adcaa6ec1" target="_blank">参考</a>)。 50~80kΩ では大きすぎる、という場合に数 kΩのプルアップ抵抗を別途追加すると良いでしょう。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-fpsrS5Crq40/YGguILBEIjI/AAAAAAAAIDs/BpBZvhWOlNsYlbNMt1tBR0aI4mBN4ry6gCPcBGAYYCw/s1000/pico-07-01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="624" data-original-width="1000" src="https://1.bp.blogspot.com/-fpsrS5Crq40/YGguILBEIjI/AAAAAAAAIDs/BpBZvhWOlNsYlbNMt1tBR0aI4mBN4ry6gCPcBGAYYCw/s600/pico-07-01.png"/></a></div>
この回路を動かすためのプログラムは以下です。本書のサンプルでは 07-01-temp.py に相当します。
<pre class="prettyprint">
from machine import Pin, I2C
from time import sleep
def read_adt7410():
word_data = int.from_bytes(i2c.readfrom_mem(address_adt7410, register_adt7410, 2), 'little', False)
data = (word_data & 0xff00)>>8 | (word_data & 0xff)<<8
data = data>>3 # 13ビットデータ
if data & 0x1000 == 0: # 温度が正または0の場合
temperature = data*0.0625
else: # 温度が負の場合、 絶対値を取ってからマイナスをかける
temperature = ( (~data&0x1fff) + 1)*-0.0625
return temperature
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
address_adt7410 = 0x48
register_adt7410 = 0x00
while True:
inputValue = read_adt7410()
print(inputValue)
sleep(0.5)
</pre>
次に、温度センサとLCDを同時に用いる回路は以下です。これは、本書p.171の図7-6に相当します。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-gskPsyv3j34/YGguIXGjaDI/AAAAAAAAIDw/fL5DbiBHBsYPm-0DCIiS8QXrn9uGGoONwCPcBGAYYCw/s1210/pico-07-02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="930" data-original-width="1210" src="https://1.bp.blogspot.com/-gskPsyv3j34/YGguIXGjaDI/AAAAAAAAIDw/fL5DbiBHBsYPm-0DCIiS8QXrn9uGGoONwCPcBGAYYCw/s600/pico-07-02.png"/></a></div>
この回路を動かすためのプログラムは以下です。本書のサンプルでは 07-02-LCD.py に相当します。
<pre class="prettyprint">
from machine import Pin, I2C
from time import sleep
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
write_string('Hello World')
# カタカナや特殊記号は文字コードを一文字ずつ入力
# 以下は「ラズベリー パイ」と表示する例
#s = chr(0xd7)+chr(0xbd)+chr(0xde)+chr(0xcd)+chr(0xde)+chr(0xd8)+chr(0xb0)+' '+chr(0xca)+chr(0xdf)+chr(0xb2)
#write_string(s)
</pre>
また、温度センサの値をLCDに表示するためのプログラムは以下です。本書のサンプルでは 07-03-LCD-temp.py に相当します。
なお、古いバージョンの MicroPython では、温度センサで値を読み取り、LCDに結果を表示する際、間に「i2c.scan()」という命令を実行しないとエラーが出ていましたので、そのことがコメント文で記されています。
<pre class="prettyprint">
from machine import Pin, I2C
from time import sleep
def read_adt7410():
word_data = int.from_bytes(i2c.readfrom_mem(address_adt7410, register_adt7410, 2), 'little', False)
data = (word_data & 0xff00)>>8 | (word_data & 0xff)<<8
data = data>>3 # 13ビットデータ
if data & 0x1000 == 0: # 温度が正または0の場合
temperature = data*0.0625
else: # 温度が負の場合、 絶対値を取ってからマイナスをかける
temperature = ( (~data&0x1fff) + 1)*-0.0625
return temperature
def setup_st7032():
c_lower = (contrast & 0xf)
c_upper = (contrast & 0x30)>>4
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x39, 0x14, 0x70|c_lower, 0x54|c_upper, 0x6c]))
sleep(0.2)
i2c.writeto_mem(address_st7032, register_setting, bytes([0x38, 0x0d, 0x01]))
sleep(0.001)
def clear():
global position
global line
position = 0
line = 0
i2c.writeto_mem(address_st7032, register_setting, bytes([0x01]))
sleep(0.001)
def newline():
global position
global line
if line == display_lines-1:
clear()
else:
line += 1
position = chars_per_line*line
i2c.writeto_mem(address_st7032, register_setting, bytes([0xc0]))
sleep(0.001)
def write_string(s):
for c in list(s):
write_char(ord(c))
def write_char(c):
global position
byte_data = check_writable(c)
if position == display_chars:
clear()
elif position == chars_per_line*(line+1):
newline()
i2c.writeto_mem(address_st7032, register_display, bytes([byte_data]))
position += 1
def check_writable(c):
if c >= 0x06 and c <= 0xff :
return c
else:
return 0x20 # 空白文字
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
i2c.scan()
address_adt7410 = 0x48
register_adt7410 = 0x00
address_st7032 = 0x3e
register_setting = 0x00
register_display = 0x40
contrast = 32 # 0から63のコントラスト。30から40程度を推奨
chars_per_line = 8 # LCDの横方向の文字数
display_lines = 2 # LCDの行数
display_chars = chars_per_line*display_lines
position = 0
line = 0
setup_st7032()
while True:
inputValue = read_adt7410()
#i2c.scan() # 古い MicroPython ではデバイス切り替え時に必要だった
clear()
s = str(inputValue)
write_string(s)
sleep(1)
</pre>
<br /><br />
<h3>8章で学んだPWMを使ってみよう</h3>
最後に8章で学んだ PWM を Raspberry Pi Pico でも利用してみましょう。 Raspberry Pi Pico ではハードウェア PWM を 16 個出力できます。これは従来の Raspberry Pi の 2 個に比べると大きな利点です。本ページでは解説しませんが、従来の Raspberry Pi と Raspberry Pi Pico を接続し、お互いの利点を活かす方法もあります(希望があれば接続方法を解説するかもしれません)。
<br /><br />
さて、PWMにより LED の明るさを変更するための回路は以下です。これは、本書p.194の図8-6に相当します。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-AuZJU8t_X9E/YGguIkc0JLI/AAAAAAAAIDw/Xc3LY2qiP14ypfpECS_uY1g8LTOEW5c7wCPcBGAYYCw/s1000/pico-08-01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="590" data-original-width="1000" src="https://1.bp.blogspot.com/-AuZJU8t_X9E/YGguIkc0JLI/AAAAAAAAIDw/Xc3LY2qiP14ypfpECS_uY1g8LTOEW5c7wCPcBGAYYCw/s600/pico-08-01.png"/></a></div>
この回路を動かすためのプログラムは以下です。本書のサンプルでは 08-01-led.py に相当します。ADコンバータの読みが 272~65535となっていましたので、デューティ比の計算にその補正が入っています。
<pre class="prettyprint">
from machine import Pin, ADC, PWM
from time import sleep
adc = ADC(26)
pwm = PWM(Pin(16))
pwm.freq(100)
# Values in a range [272, 65535] were shown.
adc_min = 272
adc_max = 65535
while True:
value = adc.read_u16()
print(value)
duty = (value-adc_min)/(adc_max-adc_min)
if duty < 0:
duty = 0
pwm.duty_u16(int(65535*duty))
sleep(0.2)
</pre>
次に、3つのPWMにより RGBフルカラーLED の色を変更するための回路は以下です。これは、本書p.200の図8-8に相当します。半固定抵抗を3つ並べる際にスペースが必要となりますので、この回路は大きめのブレッドボードがないと実現できませんのでご注意ください。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-rJRjFHCEUB0/YGguIxj-UAI/AAAAAAAAIDs/WuJXj6khp2sVYORwwMZtvD6MZ9gqEBYzACPcBGAYYCw/s1566/pico-08-02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="634" data-original-width="1566" src="https://1.bp.blogspot.com/-rJRjFHCEUB0/YGguIxj-UAI/AAAAAAAAIDs/WuJXj6khp2sVYORwwMZtvD6MZ9gqEBYzACPcBGAYYCw/s600/pico-08-02.png"/></a></div>
この回路を動かすためのプログラムは以下です。本書のサンプルでは 08-02-rgbled.py に相当します。ADコンバータの読みが 272~65535となっていましたので、デューティ比の計算にその補正が入っています。
<pre class="prettyprint">
from machine import Pin, ADC, PWM
from time import sleep
adc1 = ADC(26)
adc2 = ADC(27)
adc3 = ADC(28)
pwm1 = PWM(Pin(16))
pwm2 = PWM(Pin(17))
pwm3 = PWM(Pin(18))
pwm1.freq(100)
pwm2.freq(100)
pwm3.freq(100)
# Values in a range [272, 65535] were shown.
adc_min = 272
adc_max = 65535
while True:
value1 = adc1.read_u16()
value2 = adc2.read_u16()
value3 = adc3.read_u16()
duty1 = (value1-adc_min)/(adc_max-adc_min)
duty2 = (value2-adc_min)/(adc_max-adc_min)
duty3 = (value3-adc_min)/(adc_max-adc_min)
if duty1 < 0:
duty1 = 0
if duty2 < 0:
duty2 = 0
if duty3 < 0:
duty3 = 0
# アノードコモンの場合、下記の3行を有効に
#duty1 = 1 - duty1
#duty2 = 1 - duty2
#duty3 = 1 - duty3
pwm1.duty_u16(int(65535*duty1))
pwm2.duty_u16(int(65535*duty2))
pwm3.duty_u16(int(65535*duty3))
sleep(0.2)
</pre>
次に、PWMにより DC モーターを制御するための回路は以下です。これは、本書p.208の図8-11に相当します。モータードライバーと半固定抵抗の配置が窮屈になっていますので、大きめのブレッドボードをお持ちの方は、そちらで余裕をもって配置すると良いでしょう。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-W2NbUXh5CBY/YGq--qepNoI/AAAAAAAAIEU/FU_F-cCUZI4BT5CZi8xGjSjaigz7ZlsXQCLcBGAsYHQ/s1168/pico-08-03.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="798" data-original-width="1168" src="https://1.bp.blogspot.com/-W2NbUXh5CBY/YGq--qepNoI/AAAAAAAAIEU/FU_F-cCUZI4BT5CZi8xGjSjaigz7ZlsXQCLcBGAsYHQ/s600/pico-08-03.png"/></a></div>
この回路を動かすためのプログラムは以下です。本書のサンプルでは 08-03-dcmotor.py に相当します。ADコンバータの読みが 272~65535となっていましたので、デューティ比の計算にその補正が入っています。
<pre class="prettyprint">
from machine import Pin, ADC, PWM
from time import sleep
adc = ADC(26)
pwm1 = PWM(Pin(16))
pwm2 = PWM(Pin(17))
pwm1.freq(100)
pwm2.freq(100)
# Values in a range [272, 65535] were shown.
adc_min = 272
adc_max = 65535
adc_mid = (adc_min + adc_max)/2
duty_max = 0.7
while True:
inputVal = adc.read_u16()
if inputVal < adc_mid:
pwm2.duty_u16(0)
duty = (adc_mid-inputVal)/(adc_mid-adc_min)
if duty > 1:
duty = 1
duty *= duty_max
pwm1.duty_u16(int(65535*duty))
else:
pwm1.duty_u16(0)
duty = (inputVal-adc_mid)/(adc_max-adc_mid)
if duty > 1:
duty = 1
duty *= duty_max
pwm2.duty_u16(int(65535*duty))
sleep(0.5)
</pre>
最後に、PWMにより RC サーボモーターを制御するための回路は以下です。これは、本書p.215の図8-13に相当します。
<div class="separator" style="clear: both;"><a href="https://1.bp.blogspot.com/-usM0LiwjEXw/YGguJHH74EI/AAAAAAAAIDo/sZ5o2fzCnacvRe0WjgXbAxUof45bVPpTgCPcBGAYYCw/s1168/pico-08-04.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="798" data-original-width="1168" src="https://1.bp.blogspot.com/-usM0LiwjEXw/YGguJHH74EI/AAAAAAAAIDo/sZ5o2fzCnacvRe0WjgXbAxUof45bVPpTgCPcBGAYYCw/s600/pico-08-04.png"/></a></div>
この回路を動かすためのプログラムは以下です。本書のサンプルでは 08-04-servo.py に相当します。ADコンバータの読みが 272~65535となっていましたので、デューティ比の計算にその補正が入っています。
<pre class="prettyprint">
from machine import Pin, ADC, PWM
from time import sleep
def servo_duty_hwpwm(val):
val_min = 272
val_max = 65535
servo_min = 0.035 # 最小デューティ比3.5%
servo_max = 0.1 # 最大デューティ比10%
if val < val_min:
val = val_min
duty = (servo_min-servo_max)*(val-val_min)/(val_max-val_min) + servo_max
# 一般的なサーボモーターはこちらを有効に
#duty = (servo_max-servo_min)*(val-val_min)/(val_max-val_min) + servo_min
return duty
adc = ADC(26)
pwm = PWM(Pin(16))
pwm.freq(50)
while True:
value = adc.read_u16()
duty = servo_duty_hwpwm(value)
pwm.duty_u16(int(65535*duty))
sleep(0.2)
</pre>
<br /><br />
<h3>おわりに</h3>
以上、本書で実行した 1 章から 8 章の演習のうち、Raspberry Pi Pico でも実行可能なものを紹介しました。
<br /><br />
9章以降の Wifi 接続を必要とする演習は、2023年3月に日本発売された、Wifi機能付きの Raspberry Pi Pico W を用いればおおむね動作させることができます(機能の制限はありますが)。その方法を示したのが下記のページです。
<ul>
<li><a href="https://raspibb1a.blogspot.com/2023/03/raspberry-pi-pico-w-wifi.html" target="_blank">Raspberry Pi Pico W を使って Wifi 経由で回路を制御してみよう</a></li>
</ul>
一方、本書の続編である「<a href="https://raspibb2.blogspot.com/" target="_blank">実例で学ぶRaspberry Pi電子工作</a>」で紹介した、インターネットに接続する演習や画像処理を行う演習、「<a href="https://mlbb1.blogspot.com/" target="_blank">Raspberry Piではじめる機械学習</a>」で紹介した、機械学習やディープラーニングを行う演習も、従来の Raspberry Pi の得意分野と言えるでしょう。
<br /><br />
本ページをきっかけに、Raspberry Pi を用いた電子工作に対する皆さんのアイディアがさらに膨らむと幸いです。
<br /><br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com2tag:blogger.com,1999:blog-1969942310297787110.post-87310813113363004742020-06-20T15:38:00.001+09:002020-06-20T15:38:43.042+09:00プロキシ(Proxy)環境下での本書の演習の実行<h3>
はじめに</h3>
職場や学校などでは、ネットワークに接続するためにプロキシ(Proxy)サーバーと呼ばれるものを介する場合が多いと思います。そのような環境下では、本書でネットワーク接続を必要とする演習をそのままでは実行できません。<br />
<br />
下記の設定を行えば、全ての演習を実行できるようになりますが、上級者向けの内容ですので、職場や学校のネットワーク管理者など、ネットワークに詳しい方と一緒に作業することをお勧めします。<br />
<br />
<h3>
aptコマンド</h3>
ソフトウェアのインストールの際などに実行するaptコマンドを用いるための方法です。<br />
<br />
まず、ターミナルソフトウェアLXTerminalを起動し、以下のように管理者権限のテキストエディタmousepadで設定ファイル/etc/apt/apt.confを作成します。
<br />
<pre class="prettyprint">$ sudo mousepad /etc/apt/apt.conf
</pre>
なお、古い OS ではテキストエディタとしてmousepadではなくleafpadを用います。
<br />
<pre class="prettyprint">$ sudo leafpad /etc/apt/apt.conf
</pre>
このファイルに下記の内容を記述します。「プロキシサーバー名」や「ポート番号」は環境によって異なりますので、ネットワーク管理者にお尋ねください。<br />
<pre class="prettyprint">Acquire::http::proxy "http://プロキシサーバー名:ポート番号/";
Acquire::https::proxy "https://プロキシサーバー名:ポート番号/";
Acquire::ftp::proxy "ftp://プロキシサーバー名:ポート番号/";
Acquire::socks::proxy "socks://プロキシサーバー名:ポート番号/";
</pre>
記述が終わったら、ファイルを保存してからleafpadを閉じてかまいません。
<br />
<br />
以上で、「sudo apt install (パッケージ名)」、「sudo apt update」などのコマンドが実行できるようになります。<br />
<br />
<h3>
wgetコマンドやブラウザなど</h3>
次に、ファイルのダウンロードなどで用いるwgetコマンドや、ブラウザを利用するための方法です。
<br />
<br />
ターミナルソフトウェアLXTerminalを起動し、以下のように管理者権限のテキストエディタmousepadで設定ファイル/etc/environmentを編集用に開きます。
<br />
<pre class="prettyprint">$ sudo mousepad /etc/environment
</pre>
なお、古い OS ではテキストエディタとしてmousepadではなくleafpadを用います。
<br />
<pre class="prettyprint">$ sudo leafpad /etc/environment
</pre>
多くの場合 /etc/environment は何も書かれていない空のファイルですので、そのまま以下の3行を記入してください。「プロキシサーバー名」や「ポート番号」は環境によって異なりますので、ネットワーク管理者にお尋ねください。もし何かが書かれていた場合も、その内容を壊さないように注意しながら、ファイルの末尾に以下の内容を記します。
<br />
<pre class="prettyprint">http_proxy=http://プロキシサーバー名:ポート番号/
https_proxy=http://プロキシサーバー名:ポート番号/
ftp_proxy=http://プロキシサーバー名:ポート番号/
</pre>
以上の設定を記述したらファイルを保存してテキストエディタを閉じます。この設定を読み込むためにRaspberry Piを再起動してください。再起動後、ブラウザでインターネット上のウェブサイトを閲覧できるようになっているはずです。
<br />
<br />
<h3>
時刻合わせ</h3>
プロキシ環境下ではRaspberry Piの時刻合わせが機能しない場合が多いと思います。そのような場合、もし職場や学校内に時刻合わせサーバーが存在すれば、下記の方法で時刻を合わせることができます。<br />
<br />
ターミナルソフトウェアLXTerminalを起動し、以下のように管理者権限のテキストエディタmousepadで設定ファイル/etc/systemd/timesyncd.confを開きます。<br />
<pre class="prettyprint">$ sudo mousepad /etc/systemd/timesyncd.conf
</pre>
なお、古い OS ではテキストエディタとしてmousepadではなくleafpadを用います。
<br />
<pre class="prettyprint">$ sudo leafpad /etc/systemd/timesyncd.conf
</pre>
ファイル内で下記のような箇所を見つけます。
<br />
<pre class="prettyprint">(略)
[Time]
#NTP=
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3
.debian.pool.ntp.org
</pre>
このうち、NTPに関する行の先頭の「#」を削除し、「=」の右辺にお使いの時刻合わせサーバーを記述します。
時刻合わせサーバが存在するかどうかはネットワーク管理者にお尋ねください。<br />
記述後、Raspberry Piを再起動すれば時刻が合うようになります。
<br />
<br />
<h3>
プロキシ(Proxy)環境下での本書9章と10章の実行</h3>
さて、以上で本書の内容をプロキシ環境下で学べるようになりましたが、9章と10章を学ぶ際にはもう一点、注意すべきことがあります。<br />
<br />
これらの章では、PCやスマートフォンのブラウザを通して、同一ネットワーク内のRaspberry Piにアクセスし、回路を制御します。この際の模式図が下図です。このPCやスマートフォンでは、通常のインターネットへのアクセスの際にプロキシサーバを経由しなければなりませんが、同一ネットワーク内のRaspberry Piへアクセスする場合は、プロキシサーバーを経由せず直接アクセスせねばなりません。<br />
<br />
そのために、Raspberry PiのIPアドレス(ここでは192.168.1.3とします)を「プロキシの例外サイト」としてあらかじめ登録しておく必要があります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-fp_QnoVpsbk/VSIg22P8hyI/AAAAAAAADzw/hC5XmxTylUU/s1600/proxy1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://1.bp.blogspot.com/-fp_QnoVpsbk/VSIg22P8hyI/AAAAAAAADzw/hC5XmxTylUU/s1600/proxy1.png" width="376" /></a></div>
<br />
Windowsの場合の例外サイトの設定法を示したのが下図です。「インターネットオプション」から「LANの設定」を辿るとプロキシサーバーを設定できます。さらに「詳細設定」ボタンをクリックすることで、例外サイトを設定できます。図では192.168.1.3が登録されていることがわかるでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-yguvs4C513o/VSIg2zlvZKI/AAAAAAAADzs/UZIbAn6Xm-0/s1600/proxy2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://1.bp.blogspot.com/-yguvs4C513o/VSIg2zlvZKI/AAAAAAAADzs/UZIbAn6Xm-0/s1600/proxy2.png" width="640" /></a></div>
<br />
この「例外サイト」の設定はmacOSにも存在します。「システム環境設定」→「ネットワーク」<br />
→「詳細」→「プロキシ」です。<br />
<br />
しかし、iOS(iPhoneやiPad)の場合、この例外サイトの設定は存在しないため、iOSでプロキシの設定自体を無効にする(すなわち、上の図でインターネットへのアクセスができない状態にする)しかありません(pacファイルと呼ばれるものをサーバーに設置してこの問題を回避する方法もありますが、ここでは割愛します)。<br />
<br />
androidの場合、Wifiの設定に例外サイトの設定があるのですが、この設定が存在しない場合(あるいは機能しない場合)は、やはりプロキシの設定を無効にしてRaspberry Piにアクセスせざるを得ないことがあります。<br />
<br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-64973354226629426402020-06-12T15:19:00.017+09:002024-01-27T17:43:43.220+09:00Raspberry Pi Zero W 系で本書の演習を行う方法<h3>
はじめに</h3>
本書の演習で Raspberry Pi Zeroシリーズを用いる方法はサポートページで解説すると述べました。本ページにでその解説を行います。<br />
<br />
Raspberry Pi Zero W 系の機種では、GPIO ポートにピンヘッダが取り付けられた Raspberry Pi Zero WH が最も簡単です。ピンヘッダが取り付けられていないと、本書で用いるオス-メスタイプのジャンパーワイヤを用いることができません。ピンヘッダが取り付けられていない機種に対しては、ピンヘッダを自分で取り付ける必要があり、ハードルがかなり上がります。
<br /><br />
また、Raspberry Pi Zero W 系の機種は、搭載メモリ量が 512MB と少ないためデスクトップでブラウザを使うのにも支障が出るレベルです。ですので、Raspberry Pi Zero W 系の機種は「デスクトップなど不要」と思えるような上級者向けのものだとお考え下さい。
<br /><br />
<h3>
周辺機器の接続方法</h3>
Raspberry Pi Zero WHと周辺機器との接続は下図のようになります。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-dlR141FTw-g/XuMZG4DzZlI/AAAAAAAAHuw/LJqUzicoaps0gVTVAmK81An-oWPKKkXogCLcBGAsYHQ/s1600/PiZero_connect.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="788" data-original-width="1056" height="476" src="https://1.bp.blogspot.com/-dlR141FTw-g/XuMZG4DzZlI/AAAAAAAAHuw/LJqUzicoaps0gVTVAmK81An-oWPKKkXogCLcBGAsYHQ/s640/PiZero_connect.png" width="640" /></a></div>
<br />
図からわかるように、以下のものが必要となります。<br />
<ul>
<li>HDMI(メス)-ミニHDMI(オス)変換アダプタ。例えば<a href="https://www.amazon.co.jp/dp/B004FWEULO/" target="_blank">SANWA SUPPLY AD-HD07M</a></li>
<li>USB OTGケーブル。例えば <a href="https://www.amazon.co.jp/dp/B005WNBLN0/" target="_blank">iBUFFALO BSMPC11C01BK</a></li>
<li>USBハブ(ACアダプターなしのバスパワータイプでOK)。
2つ以上のUSB機器(例えばマウスとキーボード)を接続する場合には必要です。</li>
</ul>
Raspberry Pi Zero WH をセット販売で購入した場合、「HDMI(メス)-ミニHDMI(オス)変換アダプタ」や「USB OTGケーブル」はセットに含まれる場合もあるようですので、ご確認ください。
<br /><br />
なお、ピンヘッダが取り付けられていない Pi Zero シリーズで電子工作の演習を行いたい場合、以下の方法がありますが自己責任でお願いします。
<ol>
<li>
まず、下記のようなテストワイヤをGPIO部の穴に差し込んで使うという方法がまずあります。ただし、これはあくまでテスト用であり、本書のように何度もGPIOを利用する場合、何度も抜き差しすることで接触が悪くなることが考えられるためお勧めできません。<br />
<ul>
<li><a href="https://akizukidenshi.com/catalog/g/g109830/" target="_blank">スルーホール用テストワイヤ TP-200(10本入):秋月電子通商</a></li>
</ul>
</li>
<li>それ以外には、下記のように 40 ピンのピンヘッダをハンマーで打ち込む GPIO Hammer Header という製品もありますが、日本のサイトではほぼ売り切れのようです。amazon.co.jp では買えるようですが、装着に必要な治具 (Jig) が付属しない可能性があり、お勧めしにくいです。
<ul>
<li><a href="https://www.switch-science.com/catalog/3189/" target="_blank">GPIO Hammer Header : スイッチサイエンス</a></li>
</ul>
海外通販を利用できる方なら、公式から Jig つきのもの <a href="https://shop.pimoroni.com/products/gpio-hammer-header?variant=35643318026" target="_blank">Pimoroni: GPIO Hammer Header (Solderless) – Male + Female + Installation Jig</a> を購入するのが確実でしょう。 <a href="https://learn.pimoroni.com/article/fitting-hammer-headers" target="_blank">治具 (Jig) の利用法はこちら</a>で見られます。<br /><br /></li>
<li>最後に、<a href="https://akizukidenshi.com/catalog/g/g100080/" target="_blank">ピンヘッダ 2×20 (40P)</a>を半田付けする方法です。半田付けが得意な方以外にはお勧めできません。
個人的な感想ですが、一般的なセンサモジュールなどよりも半田ごてで熱すべき時間が長く、かなり難易度が高いと思いました。
</li>
</ol>
<br />
<h3>
本書の演習の実行について</h3>
Raspberry Pi Zero W 系の機種を用いて本書の演習を行う場合、注意が必要なのは下記となるでしょう。
<br />
<ul>
<li>5.6 カメラのシャッターの演習:カメラモジュールを接続するための専用ケーブルが必要</li>
<li>5.7 MP3ファイルの再生:オーディオジャックがないので、音声はHDMI経由のみでの出力となるでしょう</li>
<li>6.5 音声のボリューム:同様に音声はHDMI経由のみとなるでしょう</li>
<li>10.4 キャタピラ式模型へのカメラの搭載:カメラモジュールを接続するための専用ケーブルが必要</li>
</ul>
なお、カメラモジュールの専用ケーブルとは、例えば「<a href="https://www.switch-science.com/catalog/3195/" target="_blank">Raspberry Pi Zero用カメラケーブル</a>」です。
Raspberry Pi Zero WH をセット販売で購入した場合は付属する場合があるようですので確認してください。
専用ケーブルでRaspberry Pi Zero WH にカメラモジュールを取りつけた様子が下図です。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-WSUAKHaGeUA/XuMZR2TnylI/AAAAAAAAHu0/8gWzJ9gwvpYdFobmpHpGYamM3HVBxyW9QCLcBGAsYHQ/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://1.bp.blogspot.com/-WSUAKHaGeUA/XuMZR2TnylI/AAAAAAAAHu0/8gWzJ9gwvpYdFobmpHpGYamM3HVBxyW9QCLcBGAsYHQ/s640/PiZero_camera.jpg" width="640" /></a></div>
<br />
ケーブルを取り付ける際、金属が露出した端子面を、どちらも緑色の基板の方を向くようにします。基板上のカバーを引き出し、ケーブルを差し込んだ後でカバーを押し込むことでケーブルが固定されます。<br />
<br />
<br />
<h3>
デスクトップやブラウザの利用に関する注意</h3>
本書で学習する場合、「デスクトップでブラウザで補足ページを開きコマンドなどをコピーしてターミナルに貼り付ける」というスタイルで学習するのが最も容易です。
<br /><br />
しかし、Raspberry Pi Zero W 系の機種の計算能力では、ブラウザがまともに動作しないことが多いと思います。ページ表示の待ち時間が長く、十分な時間待ったとしてもページが表示されるとは限らない、というのが主な症状です。
<br /><br />
さらに、そもそもグラフィックをもったデスクトップを利用することも、OS が新しくなるとともに厳しくなっています。例えば、OS の更新 (sudo apt dist-upgrade) に何時間もかかり、その間なにもできない、ということが起こりえます。
<br /><br />
これらの問題は、 Pi Zero 系のメモリが少ないことが原因と思われます。
<br /><br />
そのため、Raspberry Pi Zero W 系の機種を用いる場合、ブラウザの利用をあきらめ、
「<a href="https://raspibb1.blogspot.com/2019/01/raspberry-pi2ssh.html" target="_blank">ディスプレイ・マウス・キーボードを接続せずにRaspberry Piを利用する(2)~SSH編</a> (本書旧版の補足ページ)」の解説に従い、
Windows (など) から、Raspberry Pi へターミナルソフトウェアでログインして利用する、という方法を用いるのが現実的です。
この方法を用いると、電子回路の制御には Raspberry Pi Zero W 系の機種を用い、補足ページの閲覧は Windows を用い、コマンドの貼り付けはターミナルソフトウェア経由で行う、ということが可能になります。
<br /><br />
とはいえ、この方法は Linux に慣れている人向けの方法です。ですから、Raspberry Pi Zero W 系の機種は初心者向けとは言い難いところがあります。
<br /><br />
なお、以上のように「ターミナルソフトウェアでログインして利用」の方法が確立したら、デスクトップの起動をやめてしまうのも、メモリ消費量の削減になり効果的です。そうすることで、OS の更新が現実的な時間で終了するようになる、という経験があります。そのためには「設定」→「Raspberry Piの設定」で「ブート」項目を「デスクトップ」から「CLI」に変更して再起動すればよいのです。そうすることで、デスクトップが開かず、コマンドラインインターフェースのみのOSが起動するでしょう。
<br /><br />
なお、その設定を元に戻したければ、
<pre class="prettyprint">
sudo raspi-config
</pre>
で raspi-config を起動し、「1. System Options」→「S5 Boot / Auto Login」→「B4 Desktop Autologin」の順に選択しましょう。
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com2tag:blogger.com,1999:blog-1969942310297787110.post-39477036654454730192020-06-11T16:44:00.001+09:002024-01-26T17:04:35.315+09:00旧版との違いについて<h3>
はじめに</h3>
「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」は旧版である「<a href="https://raspibb1.blogspot.jp/" target="_blank"> カラー図解 最新 Raspberry Piで学ぶ電子工作</a>」の改訂版です。<br />
<br />
旧版とどのような違いがあるのか、本ページでまとめます。<br />
<br />
<h3>
旧版との違い</h3>
<br />
<h4>
全体に関して</h4>
全体的には最新のハードウェアと OS に対応したことが大きな変更点です。
<br />
<ul>
<li>Raspberry Pi 4 対応</li>
<li>最新の OS (2020年5月リリースのRaspberry Pi OS) への対応
</li>
</ul>
<br />
<h4>
2章:インストール法</h4>
旧版では、OS のインストールに NOOBS というパッケージを用いた方法を解説しましたが、新版では 2020年2月に新たに公開された Raspberry Pi Imager というソフトウェアによるインストール法を解説しています。
<br />
<br />
NOOBS ではインストール作業が Raspberry Pi 上で行われたのですが、Raspberry Pi Imager では、皆さんが普段お使いの Windows か macOS でインストールが行われます。そのため、インストールの難易度が少し下がることが期待されます。
<br />
<br />
<h4>
4章:用いる開発環境</h4>
旧版では IDLE という開発環境を紹介しましたが、新版では Thonny という開発環境を用いるよう変更しています。それに伴い、推奨する Python のバージョンは Python2 から Python3 となりました。ただし、旧版からどちらのバージョンの Python でも動作するように記述されていました。
<br />
<br />
<h4>
5章:タクトスイッチで用いる GPIO</h4>
旧版では、タクトスイッチで用いる GPIO が以下のように章ごとに異なっていました。
<br />
<ul>
<li>5章:GPIO 24</li>
<li>10章 : GPIO 17</li>
</ul>
新版ではこれを以下のように統一しました。サンプルプログラムもそれに伴って変更されていますので、旧版用のプログラムを新版用に用いることのないようにしてください。
<br />
<ul>
<li>5章、10章:GPIO 27</li>
</ul>
また、タクトスイッチをカメラシャッターにすサンプルプログラム 05-04-sw-camera.py では、よりカメラに似た挙動となるよう、実行中にプレビュー画面を表示するようにしました。
<br />
さらに、タクトスイッチで音声ファイルを再生するサンプルプログラム 05-05-sw-mp3.py では、音声再生用プログラムとして mpg321 から mplayer に変更しました。これによりプチプチいっていたノイズが消えます。
<br />
<br />
<h4>
7章:小型LCD</h4>
I2C 接続する小型 LCD を「<a href="https://akizukidenshi.com/catalog/g/g111753/" target="_blank">Raspberry Pi キャラクタ液晶ディスプレイモジュール完成品</a>」に変更しました。
<br />
<br />
<h4>
8章:DCモーター用のモータードライバ</h4>
旧版で用いたモータードライバ TA7291P は入手困難になりましたので、代替品として「<a href="https://akizukidenshi.com/catalog/g/g109848/" target="_blank">DRV8835使用ステッピング&DCモータドライバモジュール</a>」を用いるように回路を変更しました。このモータードライバを「<a href="https://akizukidenshi.com/catalog/g/g112240/" target="_blank">電池ボックス 単3×3本 リード線・スイッチ付</a>」により乾電池3本で用います。
<br />
<br />
<h4>
8章:ハードウェアPWM信号を出力する方法</h4>
旧版ではサーボモーターを制御するためのハードウェアPWM信号の出力に WiringPi-Python を用いましたが、新版では pigpio というライブラリを用いるよう変更しました。
<br />
<br />
<h4>
旧版用のパーツセットを購入してしまった場合</h4>
本書の旧版用のパーツセットを購入してしまった場合、モータードライバ TA7291P が同梱されています。手元にこのモータードライバしかない場合、以下に示す回路の配線図を代替として用いてください。
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-1nRtrJ40cBw/XuHfWfwwFII/AAAAAAAAHuY/BUBf0G0i6yAlzzrBxsfwcY5NyPOHsnU-QCLcBGAsYHQ/s1600/fig08-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="477" data-original-width="830" height="367" src="https://1.bp.blogspot.com/-1nRtrJ40cBw/XuHfWfwwFII/AAAAAAAAHuY/BUBf0G0i6yAlzzrBxsfwcY5NyPOHsnU-QCLcBGAsYHQ/s640/fig08-11.png" width="640" /></a></div>
<div align="center">
図8-11 を TA7291P で実現する方法
</div>
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Xs4i7sWZYkE/XuHfWCHWWdI/AAAAAAAAHuQ/duhdCijEKpwsdZpnPbF8xDn81JYLO6eegCLcBGAsYHQ/s1600/fig09-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="494" data-original-width="560" src="https://1.bp.blogspot.com/-Xs4i7sWZYkE/XuHfWCHWWdI/AAAAAAAAHuQ/duhdCijEKpwsdZpnPbF8xDn81JYLO6eegCLcBGAsYHQ/s1600/fig09-12.png" /></a></div>
<div align="center">
図9-12 を TA7291P で実現する方法
</div>
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-pygmgd-50YQ/XuHfWCT0EYI/AAAAAAAAHuU/Chcs1V74ubIx8RGxxaV3UsEfrKeAKZVAwCLcBGAsYHQ/s1600/fig10-04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="536" data-original-width="832" height="412" src="https://1.bp.blogspot.com/-pygmgd-50YQ/XuHfWCT0EYI/AAAAAAAAHuU/Chcs1V74ubIx8RGxxaV3UsEfrKeAKZVAwCLcBGAsYHQ/s640/fig10-04.png" width="640" /></a></div>
<div align="center">
図10-4 を TA7291P で実現する方法
</div>
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ypbAGxSTt84/XuHfWy7mMDI/AAAAAAAAHuc/J2N05bOLNnc_BCI5UAUtLqlekVukP8xQwCLcBGAsYHQ/s1600/fig10-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="545" data-original-width="920" height="378" src="https://1.bp.blogspot.com/-ypbAGxSTt84/XuHfWy7mMDI/AAAAAAAAHuc/J2N05bOLNnc_BCI5UAUtLqlekVukP8xQwCLcBGAsYHQ/s640/fig10-06.png" width="640" /></a></div>
<div align="center">
図10-6 を TA7291P で実現する方法
</div>
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-H0CmzKfIB3M/XuHfXI93pxI/AAAAAAAAHug/qCYKq5mA1M4TcImwCHtMtC8m7SRltZ38ACLcBGAsYHQ/s1600/fig10-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="650" data-original-width="920" height="452" src="https://1.bp.blogspot.com/-H0CmzKfIB3M/XuHfXI93pxI/AAAAAAAAHug/qCYKq5mA1M4TcImwCHtMtC8m7SRltZ38ACLcBGAsYHQ/s640/fig10-13.png" width="640" /></a></div>
<div align="center">
図10-13(応用PDF内) を TA7291P で実現する方法
</div>
<br /><br />Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-91719349969030144022020-06-09T11:35:00.000+09:002020-06-09T11:45:10.641+09:00ディスプレイがRaspberry Pi 4と相性が悪い場合の対処法Raspberry Pi 4には、相性の悪いディスプレイがあるという問題があるようです。そのようなディスプレイでは、OSをインストールしたmicroSDカードを挿入してRaspberry Piに電源を入れてもディスプレイに映像が映りません。
<br />
<br />
本ページではその場合の対処法を記します。
<br />
<br />
Raspberry Pi 用に OS をインストールした microSD カードを PC に接続します。そして、エクスプローラーの「PC」の項目を見ると、下記のように「boot」というディスクが存在していることがわかります。ここをダブルクリックすると、中に「config.txt」というテキストファイルがあるので、メモ帳などのテキストエディタで開きます。通常は config.txt をダブルクリックするとメモ帳で開くはずです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-08BKm3c_cT0/Xt71IQNn-OI/AAAAAAAAHt0/2wYWTsIH8Nkd_f8jdZiAQf_Vu0wKDYI7gCLcBGAsYHQ/s1600/newimager4_08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="100" data-original-width="500" src="https://1.bp.blogspot.com/-08BKm3c_cT0/Xt71IQNn-OI/AAAAAAAAHt0/2wYWTsIH8Nkd_f8jdZiAQf_Vu0wKDYI7gCLcBGAsYHQ/s1600/newimager4_08.png" /></a></div>
<br />
すると、下図のようなファイルが開かれますので、6行目の「#hdmi_safe=1」という行の先頭の「#」を削除し、上書き保存してメモ帳を閉じてください。<br />
<br />
なお、古い Windows を用いている方は、このファイルが正しく開けません(正しく改行されて見えない)。その場合「<a href="https://sakura-editor.github.io/download.html" target="_blank">サクラエディタ (V2 (Unicode版))</a>」のように改行を正しく処理できるテキストエディタをインストールし、そのサクラエディタで config.txt を開くようにしてください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-_2ZLAy8jf4w/XkJBsZ9ne2I/AAAAAAAAHT4/WPdwNsth3wkS8glXgrHNaREO-aFp_XA7ACLcBGAsYHQ/s1600/flashing15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="336" data-original-width="941" height="228" src="https://1.bp.blogspot.com/-_2ZLAy8jf4w/XkJBsZ9ne2I/AAAAAAAAHT4/WPdwNsth3wkS8glXgrHNaREO-aFp_XA7ACLcBGAsYHQ/s640/flashing15.png" width="640" /></a></div>
<br />
さて、「#」を削除して保存したら microSD カードを Windows から取り外し、再び Raspberry Pi 4 に接続して電源を投入してみましょう。<br />
<br />
今度はディスプレイに映像が映ったでしょうか。<br />
ただし、映った場合も画面の解像度は低い状態かもしません。それが嫌な場合、別のディスプレイを用意するしかなさそうです。<br />
<br />
新しい情報が入ったら追記します。Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0tag:blogger.com,1999:blog-1969942310297787110.post-51113509966563767642020-06-09T11:17:00.003+09:002022-04-09T18:45:09.866+09:00OSイメージを用いてRaspberry Pi OSをインストールする<h3>
0. はじめに</h3>
本書では、Raspberry PiのOSである Raspberry Pi OS を、Raspberry Pi Imagerというソフトウェアを用いてインストールしました。このソフトウェアは、OSをmicroSDカードに書き込む時にOSのダウンロードも同時に行ってくれます。
<br /><br />
職場や学校などでは、この方法でのOSのインストールに失敗することがあるようです。ネットワーク環境により、OSのダウンロードに失敗するためのようです。
<br />
<br />
そこで、職場や学校などでもOSのインストールが可能な方法を紹介します。Raspberry Pi Imagerを用いて、あらかじめダウンロード済のOSイメージをmicroSDカードに書き込むという方法です。
<br /><br />
<h3>
1. 拡張子の表示</h3>
イメージファイルによってOSをインストールする際、Windows において「ファイルの拡張子」を表示する設定にしておくのをお勧めします。
ファイルの拡張子とは、
ファイル名「2022-01-28-raspios-bullseye-armhf-full.zip」における「.zip」部や
ファイル名「2022-04-04-raspios-bullseye-armhf-full.img.xz」における「.img.xz」部のことを指します。
<br /><br />
Windows のデフォルトの設定では、この拡張子が表示されない設定になっており、そのままだと解説において混乱を招くと考えられるからです。
<br /><br />
Windows 10 の場合、エクスプローラーを起動し、下図のように「表示」タブ内の「ファイル名拡張子」にチェックを入れることで、拡張子が表示されるようになります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAI0I278GQgca44ifWTfOzaA3jSHe1f-M1IieOAdMevO7kdmWdQrS2iLk70jYhqHPR18rjtwPuBHNSOxVS7E3zDqNvBCdYcAnmmmsvi76rnDoQKXLXcSeas1kbGMRZmKT36Fgd__H1VP5MWN6uRo0sO_m65iNbFAZrai3-OyoTda8_oACk57SLGKbm/s1125/win10_ext.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="152" data-original-width="1125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAI0I278GQgca44ifWTfOzaA3jSHe1f-M1IieOAdMevO7kdmWdQrS2iLk70jYhqHPR18rjtwPuBHNSOxVS7E3zDqNvBCdYcAnmmmsvi76rnDoQKXLXcSeas1kbGMRZmKT36Fgd__H1VP5MWN6uRo0sO_m65iNbFAZrai3-OyoTda8_oACk57SLGKbm/s600/win10_ext.png"/></a></div>
Windows 11 の場合、エクスプローラーを起動し、下図のように「表示」→「表示」とたどって、「ファイル名拡張子」にチェックを入れましょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3fi9FdH52I__TXdJC7k59FpIPSfqT8cdStYf2GlXqXJ9QEUCAW3UvDoNL8FqgeX05WYJiwx_usKVaDxubthl6eFlvVGXh7QuSYydAfuN0X83PCsn9ut3p_IxurU_RQRgGEqY70AuzaeCz9USJtmmemgiSLkktK9-dMO5HuRr2pNKs1VyxF9ds6585/s880/win11_ext.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="600" data-original-width="880" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3fi9FdH52I__TXdJC7k59FpIPSfqT8cdStYf2GlXqXJ9QEUCAW3UvDoNL8FqgeX05WYJiwx_usKVaDxubthl6eFlvVGXh7QuSYydAfuN0X83PCsn9ut3p_IxurU_RQRgGEqY70AuzaeCz9USJtmmemgiSLkktK9-dMO5HuRr2pNKs1VyxF9ds6585/s600/win11_ext.png"/></a></div>
以上の準備ができたら先に進みます。
<br />
<br />
<h3>
2. 必要なものの準備</h3>
それでは、「Raspberry Pi OS のイメージで OS を インストールする」方法を解説します。まず、皆さんが普段お使いの PC で Raspberry Pi OS のイメージをダウンロードします。<br />
<ul>
<li><a href="https://www.raspberrypi.org/software/operating-systems/" target="_blank">Raspberry Pi OS イメージのダウンロードページ</a></li>
</ul>
にアクセスしましょう。<br />
<br />
下図のようなページが現れますので、「Raspberry Pi OS with desktop and recommended software」の「Download」ボタンをクリックします。<br />
<br />
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIPreu2WZNqe2RfBGOBp1vq_7e3gGpg6TVd1b7oCkMAON9HvlPyGz6IZx_8Lz3Qg50IMkUx_V7dFdP2nhlB9OHl4yeNTXG43tsZdKiH8GnoR-LUZJUU_HpPVbVj6gbpSzeEs2HG63yaUPs-Ozr2UIp_NEzyw7baAvtKnNrDqlzW10JopivN5w0bYe/s1200/imager172_01.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="900" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIPreu2WZNqe2RfBGOBp1vq_7e3gGpg6TVd1b7oCkMAON9HvlPyGz6IZx_8Lz3Qg50IMkUx_V7dFdP2nhlB9OHl4yeNTXG43tsZdKiH8GnoR-LUZJUU_HpPVbVj6gbpSzeEs2HG63yaUPs-Ozr2UIp_NEzyw7baAvtKnNrDqlzW10JopivN5w0bYe/s600/imager172_01.png"/></a></div>
すると、(執筆時点では)2022-04-04-raspios-bullseye-armhf-full.img.xz という名前の圧縮ファイルがダウンロードされます。
<br />
古いOSイメージを試したい場合、JAISTの下記のリンクをたどると良いでしょう。
<br />
<ul>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_armhf/images/" target="_blank">古いRaspberry Pi OSイメージ (2020年5月以降)</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_full/images/" target="_blank">古いRaspbianイメージ (2018年11月~2020年2月)</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/" target="_blank">古いRaspbianイメージ (それ以前)</a></li>
</ul>
あるいは、OSのバージョンを指定してダウンロードしたい場合、下記のリンクをたどると良いでしょう。
<ul>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_armhf/images/raspios_full_armhf-2021-05-28/" target="_blank">Buster 最終版 (2021年5月)</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_full/images/raspbian_full-2019-04-09/" target="_blank">Stretch 最終版 (2019年4月)</a></li>
<li><a href="http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2017-07-05/" target="_blank">Jessie 最終版 (2017年7月)</a></li>
</ul>
古い OS のファイルをダウンロードした場合、例えば「2022-01-28-raspios-bullseye-armhf-full.zip」というファイル名となっていることがあります。<br />
まとめると、ダウンロードしたファイルは、OSのバージョンによって「ファイル名.img.xz」または「ファイル名.zip」のどちらかの名称であるということです。
<br /><br />
本ページのタイトルに「イメージファイルを使って」とありますが、ダウンロードしたファイルはこの「イメージファイル」を「圧縮」したファイルです。圧縮の手法が、拡張子に表示されている「xz」や「zip」であるというわけです。
<br /><br />
ですから、ここからの流れは通常ならば「圧縮ファイルを『展開』してイメージファイルを取り出す」→「イメージファイルを microSD カードに書き込む」
となります。しかし、本ページでは「展開」という作業は行わす、圧縮されたファイルのまま作業を続けます。
その理由は以下の二つです。
<ul>
<li>microSD カードに書き込むためのツール Raspberry Pi Imagerは、圧縮されたイメージファイルのままでmicroSDカードへの書き込みができる</li>
<li>xz で圧縮されたファイルは、Windows のデフォルト環境では展開できない</li>
</ul>
以下で、圧縮されたイメージファイルをそのまま microSD カードに書き込む方法を解説します。なお、便宜上「圧縮されたイメージファイル」のことを「イメージファイル」と呼ぶことがありますので、混乱しないようご注意ください。
<br /><br />
<h3>
3. Raspberry Pi Imager による OS イメージの microSD カードへの書き込み</h3>
ここでは、Raspberry Pi用OSのインストールソフトウェアであるRaspberry Pi Imager を用いてイメージファイルを microSD カードに書き込む方法を紹介します。
<br />
インストール済のRaspberry Pi Imagerを起動するには、検索窓で「ras」などと記入して現れるRaspberry Pi Imagerをクリックします。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPpFvoqDDUAsv-oTdM_4LnKTfoDdBLGmjfxjNT4-KGfsM2s_zL3vP6pplZJhLTbw9aP12yEqFAI2jzTGn_5VjBLHIFAKuBwlLL2i0ZuMQtTnPSgsbM_tjDArnK1D3ijHqiFGN6DbCcMrJckLj4-Iko663jwIrd0RJpk7bU0aPwmxZV8F8AXkUks5hK/s788/imager172_02.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="786" data-original-width="788" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPpFvoqDDUAsv-oTdM_4LnKTfoDdBLGmjfxjNT4-KGfsM2s_zL3vP6pplZJhLTbw9aP12yEqFAI2jzTGn_5VjBLHIFAKuBwlLL2i0ZuMQtTnPSgsbM_tjDArnK1D3ijHqiFGN6DbCcMrJckLj4-Iko663jwIrd0RJpk7bU0aPwmxZV8F8AXkUks5hK/s600/imager172_02.png"/></a></div>
さて、起動したRaspberry Pi Imagerで「OS (Operating System)」の部分の「OS を選ぶ (CHOOSE OS)」ボタンをクリックしましょう。現れた画面で下図のように「カスタムイメージを使う (Use custom)」を選択します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj40aR9HgHWOlp2pb3mz8eK5scG0cqHbnIDgiU-wbZzNPm7fwKWuiU3NldDlB9XI16VTWgefnNTA9G9zQT4CP0Tm6ZUETNYmfnnHqEWgzvg3hslFyBwgDGMOLS7PEuVXZtiaSMxlnKyfWj-G7aVdlnO2UmJUltvq2ZfE36wHiQ4pRx-lGIaLtu5uBkA/s682/imager172_03.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="452" data-original-width="682" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj40aR9HgHWOlp2pb3mz8eK5scG0cqHbnIDgiU-wbZzNPm7fwKWuiU3NldDlB9XI16VTWgefnNTA9G9zQT4CP0Tm6ZUETNYmfnnHqEWgzvg3hslFyBwgDGMOLS7PEuVXZtiaSMxlnKyfWj-G7aVdlnO2UmJUltvq2ZfE36wHiQ4pRx-lGIaLtu5uBkA/s600/imager172_03.png"/></a></div>
すると、イメージファイルの選択画面になりますので、先ほどダウンロードしたファイルを指定します。下図は、ファイル「2022-04-04-raspios-bullseye-armhf-full.img.xz」を指定している様子です。なお、下図でファイル名が「.img.xz」の部分まで表示されているのは、本ページ冒頭で拡張子を表示する設定をしたためです。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbmzJyLqF-IkEtW1QVqA6Bxirh05qvizWaEW6mrhzVGPPT1G7HZxaBg1wyTOArfGFSKPOqmX005mndKlQhB9WaWU7JbP-vHzHxst7a3lxbYxPgfDSPk2_gPJEHp7D69yNzRC0xf4llI7rsnifqIHZYR4ib_BnP3xJMdo9lGlEs833sZaWYw8NcWIX4/s649/imager172_04.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="440" data-original-width="649" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbmzJyLqF-IkEtW1QVqA6Bxirh05qvizWaEW6mrhzVGPPT1G7HZxaBg1wyTOArfGFSKPOqmX005mndKlQhB9WaWU7JbP-vHzHxst7a3lxbYxPgfDSPk2_gPJEHp7D69yNzRC0xf4llI7rsnifqIHZYR4ib_BnP3xJMdo9lGlEs833sZaWYw8NcWIX4/s600/imager172_04.png"/></a></div>
次に、Raspberry Pi Imagerで、「ストレージ (SD Card)」の部分の「ストレージを選ぶ (CHOOSE SD CARD)」ボタンをクリックしましょう。microSDカードが接続済であれば下図のようにカードが現れますので、クリックして選択しましょう。
<br />
<br />
なお、外付けハードディスクなどをPCに接続しているとこの選択肢が複数現れます。<strong>microSDカードを表す適切な方を選択しないと皆さんの大切なデータが壊されてしまいますので注意して選択</strong>しましょう。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSr-wxyBQKy8J8yPGTnz6oumIlB-wcsW2Zplp5axh21pCVL_UUy2AmunVv8IAvaOx87UwkrifBFXOZ0Sdsqg5o7OMzVRqCWgyQ5QNHY8wM1odBgYRo2vk6yWua7TEMzVTbGFYQ5OPjqU7PkYiCexCeer-V9TuExiHi8Q7PewvdTvvgu_R_UYiwTO3K/s682/imager172_05.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="452" data-original-width="682" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSr-wxyBQKy8J8yPGTnz6oumIlB-wcsW2Zplp5axh21pCVL_UUy2AmunVv8IAvaOx87UwkrifBFXOZ0Sdsqg5o7OMzVRqCWgyQ5QNHY8wM1odBgYRo2vk6yWua7TEMzVTbGFYQ5OPjqU7PkYiCexCeer-V9TuExiHi8Q7PewvdTvvgu_R_UYiwTO3K/s600/imager172_05.png"/></a></div>
あとはRaspberry Pi Imagerで「書き込む (WRITE)」ボタンをクリックしましょう。「本当に続けますか?」という警告に「はい」を選択すると、
下図のように書き込み (Writing)が始まります。確認 (Verifying)までが終わると、書き込みが終了します。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL66tW45rkn--li12zRivjVExTDhHNDQCsklC-2b0PjcaTnH6jvI5UCDh5n8Vlo3pk6Ma6ahH_WdruDGczdutY8Z7r33KUohMr0jZpz33P9RQBC50aGiGkgmdMcw8qv9s33rXhwTEDy-wLCu84MMrO6U7bbOmxUhHMAkmFkE5j2dKJUzMJYsL7PuzJ/s682/imager172_06.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="452" data-original-width="682" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL66tW45rkn--li12zRivjVExTDhHNDQCsklC-2b0PjcaTnH6jvI5UCDh5n8Vlo3pk6Ma6ahH_WdruDGczdutY8Z7r33KUohMr0jZpz33P9RQBC50aGiGkgmdMcw8qv9s33rXhwTEDy-wLCu84MMrO6U7bbOmxUhHMAkmFkE5j2dKJUzMJYsL7PuzJ/s600/imager172_06.png"/></a></div>
下図の画面が出たらmicroSDカードを取り外し、その後Raspberry Pi Imagerを終了しましょう。取り外した microSD カードを Raspberry Pi にセットして起動することになります。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiTIZY6iIRXJFiKLl9avpDwquIGBKBGVhU5o5wb-CAD9ZSytGKy2REn_GqUD1AAEdRE1rKf5t4Qf1oCBZaWICm646qI_Dqh6gJHnJgGdAtM6mNh_aSH_EGuWqkfcoNsBoe66sk0WJncTDkQ8_Mo1Hq9oJPMevW9v2UcO6aserjSMlpa65ijttrqSd6/s682/imager172_07.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="452" data-original-width="682" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiTIZY6iIRXJFiKLl9avpDwquIGBKBGVhU5o5wb-CAD9ZSytGKy2REn_GqUD1AAEdRE1rKf5t4Qf1oCBZaWICm646qI_Dqh6gJHnJgGdAtM6mNh_aSH_EGuWqkfcoNsBoe66sk0WJncTDkQ8_Mo1Hq9oJPMevW9v2UcO6aserjSMlpa65ijttrqSd6/s600/imager172_07.png"/></a></div>
<br />
<br />
Takashi Kanamaruhttp://www.blogger.com/profile/11364738618850170255noreply@blogger.com0