性能が高いバージョンの方が学習が快適に進むでしょう。上の表では「Model B系」の上部のもの、すなわちPi 4 B、Pi 3 B+、Pi 3 Bなどが該当します。
また、Raspberry Piには「Model A系」と呼ばれる、「Model B系」をコンパクトにしたシリーズもありますが、これらはUSBポート数やメモリ容量が少ないため、初めてRaspberry Piを使うという方にはお勧めしません。メモリが少ないと、ブラウザによるインターネットの閲覧など、通常のPCとしての用途で動作が遅くなることがあるのです。
一方、安さやコンパクトさという点で、Raspberry Pi Zeroシリーズに注目している方も多いでしょう。性能という点では、Pi Zeroシリーズは
Model B系のPi 3 Bなどにくらべてかなり劣りますので、本書のようにGUIを使ったデスクトップで学ぶのには必ずしも適していません。
なお、本書は2014年に発行された書籍であるため、上記の表のどれにも属さない旧タイプのModel B (下図左端) を主な対象にして記述されています。下図には、その後発売されたModel B+ (Pi 1 B+)、Raspberry Pi 2 (Pi 2 B)、Raspberry Pi 3 (Pi 3 B) も表示されています。ご覧になってわかるように、Raspberry Pi 2やRaspberry Pi 3の形状やピン数などはModel B+ (Pi 1 B+) とほとんど同じです。そのため、本書を読む際、
書籍では「8GB以上のSDメモリーカード」と記しましたが、OSであるRaspbianのバージョンが上がるに従い、必要なSDメモリーカードの容量も増えておりますので16GB~32GBのものを推奨します。なお、64GB以上のサイズのmicroSDカードは、exFATという形式でフォーマットされており、Raspberry Piが起動しませんので、16GB~32GBのmicroSDカードを用意するのが良いでしょう。
Raspberry Pi 2およびRaspberry Pi 3は、Model B+と同様、microSDカードが必須です。そのため、本書を読む際にModel B+についての情報を参考にしてください。
さらに、個人的な体験ですが、Raspberry Pi 2やRaspberry Pi 3にclass 2などの遅いmicroSDカードを用いた場合、動作に引っかかりを感じることが多くありました。そのため、Raspberry Pi 2やRaspberry Pi 3に用いるmicroSDカードは、高速なclass 10のものを推奨します。
本書ではRaspberry Pi用の電源として1.0A以上の5V電源を用いるよう記述しております。2015年2月に発売されたRaspberry Pi 2でも同じ電源で動作することを確認しましたが、ネットの情報によると、安価で信頼性の低い電源やケーブルを用いるとRaspberry Pi 2が起動しないことがある、とのことでした。もしRaspberry Pi 2が起動しない場合、電源やケーブルの変更を検討してみると良いでしょう。
また、Raspberry Pi 3用の電源として、公式では2.5A以上の5V電源を推奨しています。ただし、これは電力消費の大きいUSB機器を複数接続する場合などを想定した高めの推奨値と考えられます。私自身は、1.5Aの5V電源でRaspberry Pi 3を起動し本書の動作確認をとっていますが、特に問題は起こっていません。
ただし、流せる電流の小さい電源を用いると、Raspberry Pi 3は正常動作するものの、Raspberry Pi 3の性能をフルに引き出すことができない、という報告もあります。ですから、高性能なRaspberry Pi 3の性能をフル活用したい方は、Raspberry Pi 3の公式電源を導入してみると良いでしょう。
「sudo apt upgrade」により、インストールされたアプリケーションのパッケージを更新したり、「sudo rpi-update」によりfirmwareを更新したRaspbianはサポートの対象外とします。その理由は下記の通りですのでご了承ください。
古いSDメモリーカードフォーマッターを用いてRaspberry Piで一度用いたSDカードをフォーマットする場合、
最近のNOOBS (Raspbian)では
「一度目のフォーマットに失敗し、二度目のフォーマットで成功する」ようになっていました。
二度目のフォーマットで成功するため大きな問題はありませんが、
SDメモリーカードフォーマッターを最新版にアップグレードすると、一度でフォーマットに成功するようになりましたので、
気になる方はお試しください。
電子工作に必要なパーツを集めたセットの1つとして、本書ではArduino Sidekick Basic Kitを紹介しましたが、この商品は現在千石電商オンラインショップやamazonではバージョン2に切り替わっています。
本書では、Raspberry Pi Model Bの5Vピン、3.3Vピン、GPIOに流せる電流を解説していますが、Model B+以降は5Vから3.3Vへ降圧するレギュレータの効率が上がったことと、Raspberry Pi自体の消費電力が変更になった影響で、このデータが大きく変わっています。
公式情報ではありませんが、インターネット上の議論に基づいたデータを下記にまとめます。参考にしたサイトを表の下に記します。
図3-12で解説したように、Model BとModel B+はGPIOポートのピン数が異なり、上から13段目まで(ピン1からピン26まで)が両モデルで共通となっています。本書ではこの共通部分のみを使うようにしておりますので、本書の回路は全てModel BとModel B+の両方で動作します。また、Raspberry Pi 2とRaspberry Pi 3はModel B+と同じピン配置なので、Model B+と同様に回路を作成します。
ただし、ピンを使う際にその「ピンの数え方」に注意しないとModel B+/Raspberry Pi 2/Raspberry Pi 3で間違った回路を作成してしまう可能性がありますので、その点について補足したいと思います。
NOOBS 1.4.1までに含まれるRaspbianでは、PythonでGPIOにアクセスするプログラムを実行するためには管理者権限が必要でした。すなわち、本書でプログラムを実行する際、
NOOBS 1.4.2以降では、PythonでGPIOにアクセスするプログラムでも、管理者権限が不要になりました。そのため、下記のような方法でもプログラムを実行できます。
しかし、2015年12月頃以降に購入した完成品LCDではRaspberry Piで動作(認識)しない、という報告が読者の方から入ってきました。販売店に確認したところ、「LCDの新しいロットでは電流の引き込み能力が低くRaspberry Piで動作(認識)しない」との回答でした。
このままでは多くの方が第7章の演習を実行できなくなってしまいますので、2つの対処方法を下の「p.171:完成品のLCDを購入しても認識されない場合の対処法」に記しましたのでご覧ください。
なお、『「7章全般:利用できるLCDについて」で紹介している16x2のLCD』も、同じチップを用いたLCDですので、このロットによる問題が将来起こらないとは限りません。その場合はやはり下で紹介する対処法を試すことになるでしょう。
完成品ではなくLCDピッチ変換キットを購入した場合、温度センサモジュールとLCDモジュールの作成の際にはんだづけが必要となります。温度センサーモジュールに比べ、LCDモジュールはピンの間隔が狭い上に本数が多いので、はんだづけに失敗しやすいかもしれません。典型的な失敗例は下図(A)のいもはんだと下図(B)のブリッジです。
その後、本書163ページの「●I2C用モジュールの読み込み」に進み、「/etc/modules」に「i2c-dev」を追記して再起動します。Raspbianのバージョンによっては「i2c-dev」が既に書かれている場合もあります。その場合はそのままで構いません。あとは本書の通りに進めてください。
p.171:07-02-LCD.py実行時のエラーについて
LCDを用いるプログラムの一つ目である07-02-LCD.pyを実行した際、下記のエラーが出たという報告がありました。
Traceback (most recent call last):
File "/home/pi/07-02-LCD.py", line 70, in <module>
setup_aqm0802a()
File "/home/pi/07-02-LCD.py", line 17, in setup_aqm0802a
sys.exit()
SystemExit
これは、回路上のLCDがプログラムから認識されていない場合に起こるエラーです。まずはLCDが認識されることを目指します。認識されているかどうかのチェックは次項をご覧ください。
p.171:I2Cデバイスの認識について
LCDを用いたプログラムを実行するためには、Raspberry PiからLCDが認識されていることが必要です。LCDが認識されているかどうかのチェック方法は、書籍に記さなかったのですが、ここで紹介します。
まず、温度センサとLCDを接続した回路(p.170の図7-7)を作成した状態でLXTerminalを起動し、下記のコマンドを実行しましょう。
sudo i2cdetect -y 1
このコマンドは、Raspberry Piに接続されたI2Cデバイスのアドレスを出力するものです。NOOBS 1.4.2以降のRaspbian(Jessie, Stretch, Buster)では管理者権限を表す「sudo」は不要ですが、上記のようにsudoをつけても問題なく動作します。
正常な出力結果は下図のようになります。48が温度センサのアドレス0x48を表し、3eがLCDのアドレス0x3eを表します。48が表示されなければ温度センサを用いるプログラムは正常動作しませんし、3eが表示されなければLCDを用いるプログラムは動作しませんので、まずは下図の出力が得られることを目指しましょう。
そのためには、温度センサ、LCDの製作過程や回路などを見直すのが基本的な方針ですが、上で述べたように、「新しいロットのLCDはRaspberry Piから認識されない」という問題に該当しているかもしれません。そのため、次項も引き続きお読みください。
p.171:完成品のLCDを購入しても認識されない場合の対処法
<LCD対処法:予備知識>
読者の方により、完成品のLCD(AQM0802)を購入しても、Raspberry Piから認識されない(上記のi2cdetectコマンドを実行しても3eが表示されない)ことがあることを教えて頂きました。
私も新たに完成品のLCD(AQM0802)を購入してみましたが、確かに同じ状況になりました。販売店に問い合わせたところ、「LCDの新しいロットでは電流の引き込み能力が低くRaspberry Piで動作(認識)しない」との回答でした。
しかし、そのようなLCDでも動作させる方法はありますので、ここで紹介したいと思います。まず、必要な予備知識から解説します。
LCDモジュールの基板の裏には、下図(A)または(B)のように、PUと書かれた部分にジャンパとよばれる電極が2セットあります。LCDモジュールを自分ではんだづけした方は下図(A)の状態、完成品を購入した方は下図(B)の状態の方が多いでしょう。下図(A)の状態では、一つの正方形内の凹凸状の電極は絶縁されています。ここにはんだを盛り下図(B)のようにすると電極が接続され、LCDモジュールの基板上のプルアップ抵抗が有効になります。そのため、これらの状態をそれぞれ
「PUなし」、「PUあり」と呼ぶことにします(PUはpull-upの略です)。
一般に、プルアップ抵抗はI2C接続時に必要になるものですが、Raspberry Pi内部に既にこのプルアップ抵抗が存在するので、LCDモジュールの基板上では必ずしもこのプルアップ抵抗の有効化は必要ありませんでした。そのため、正常動作するLCDでは「PUなし」、「PUあり」のどちらでもLCDは動作しました。
既に述べたように、「PUなし」から「PUあり」の状態にするには、凸と凹の電極にまたがるようにはんだを盛ります。逆に、「PUあり」から「PUなし」の状態に戻すには、上図(C)のように、はんだ吸い取り線(例えば
こちら)を用いてPU部からはんだを除去するのが簡単です。
以上の予備知識のもと、どなたにでも容易に実現可能な暫定的対処法と、上級者向けの正式な対処法との2つを紹介します。
<LCD対処法:暫定版>
まずは、どなたにでも容易に実現可能な暫定的対処法を紹介しましょう。
Raspberry Piから認識されない完成品LCD(AQM0802)に対して、回路に下図のようにSDA部からGNDの間に抵抗を追加すると、動作を確認することができます。
抵抗の大きさRとしては、下記の範囲のものが有効でした。
- PUありの場合のR:2kΩ
- PUなしの場合のR:2kΩ~4.7kΩ程度
後に述べるように、私はPUなし(PU部のはんだをはんだ吸い取り線で除去した状態)で4.7kΩの抵抗を用いることを推奨します。4.7kΩでI2C通信のエラーの頻度が高い場合は3.9kΩが良いかもしれません。抵抗は例えば、
2kΩ、
3.9kΩ、
4.7kΩなどが購入できます。
なお、この方法を用いると、3.3VピンからGNDまで1.8kΩ+RkΩの抵抗で接続されることになるので、約0.5mAから1.0mA程度の電流が流れ続けます(1.8kΩの抵抗は、Raspberry Pi本体内部にあるI2C用のプルアップ抵抗です)。この程度の大きさの電流がRaspberry Piに問題を起こすことはないと思われますが、本来不要な電流が流れる手法であることは注意しておいてください。なお、比較のために記すと、3章でLEDを点灯したときに流れる電流は約5mAです。
以上で、暫定的対処法の解説は終わりますが、以下、動作しない完成品LCDで何が起こっているか、そしてこの方法により何が起こるのかを簡単に記しておきます。
まず、「動作しない完成品LCD」の何が問題かを記したのが下図です。I2C通信時にLCDから
Raspberry Piに対してACK信号と呼ばれるLOW信号を出力する場面があります。正常動作するLCDでは、このACK信号は約0.8Vとなっています。これはこのLCDの仕様の範囲内の動作です。しかし、「動作しない完成品LCD」ではこれが約1.2Vとなってしまっています。これをRaspberry PiがLOWと認識できないため、処理がそこで止まっているようです。
これに対し、暫定的な対応法ではこのACK信号を下図のように約1.0Vまで引き下げています。ただし、下図に示されている通り、3.3VであるべきHIGH信号まで下げてしまいますので、下げすぎると、Rapberry PiからHIGH信号も認識できなくなってしまいます。図を見るとわかる通り、「PUあり、R=2kΩ」ではHIGHが2Vまで下がっており、HIGHと認識されなくなる直前だろうと思います。これが「PUなし、R=4.7kΩ」を推奨する理由です。
ただし、いずれにせよこれはあくまで暫定的な対処法です。正常なI2C通信では必要のない対処法ですのでご注意ください。
<LCD対処法:正式版(ただし上級者向け)>
最後に、LCD(AQM0802)を用いるための正式な方法を紹介します。ただし、これは「表面実装用」と呼ばれるタイプのチップをはんだづけする必要があり、かなりの上級者向けとなりますので、自信のある方のみお試しください。
この方法には、I2CバスリピーターPCA9515ADと呼ばれるチップが必要となります。これをブレッドボードで用いるためには、下記の3点が必要となり、下図のようにはんだづけする必要があります。
なお、上図の「EN」はENABLEの略で、利用時はHIGH(3.3V)に接続します。
PCA9515ADはリンク先の写真で分かる通り、表面実装用と呼ばれるタイプの部品であり、これを基板上にはんだづけするには、やや高度な技術が必要です。そのため、この方法は上級者向けと言えるでしょう。
表面実装用の部品のはんだづけする方法は、例えば下記のYouTube動画が参考になるでしょう。
さらに、この動画にあるように、ピンセットやフラックスもあると良いでしょう。例えば下記のようなものです。
このPCA9515を利用するための概念図が下図です。書籍の図7-5をイメージして記しました。
この小型液晶AQM0802の新しいロットを使う上で問題になるのが、Raspberry Pi上にあるプルアップ抵抗1.8kΩが小さすぎることです。新しいロットのAQM0802を使う上では10kΩが推奨されています。しかし、Raspberry Piのプルアップ抵抗は基板上に固定されており、そのため、プルアップ抵抗を小さくすることは容易なものの(接続するプルアップ抵抗の数を増やせばよい)、大きくすることは簡単ではありません。
そこで、上図のようにPCA9515を用いてRaspberry Piおよび温度センサ側と小型液晶側を切り離し、左側をプルアップ抵抗1.8kΩで、右側をプルアップ抵抗10kΩで利用できるようにするというわけです。
そのためには、ブレッドボード上で下図のような回路を組みます。図を簡単にするために、小型液晶側のプルアップ抵抗は、小型液晶モジュールのプルアップ抵抗PUを用いることにしました。上の解説「<LCD対処法:予備知識>」を参考に、
2箇所のPUに半田を盛り、基板上のプルアップ抵抗を有効にしてください。
p.178:プログラム07-03-LCD-temp.py実行中のエラーについて
プログラム07-03-LCD-temp.pyは、温度計のデータを毎秒取得し、LCDに表示するものですが、実行開始からしばらくたつとエラーがでてプログラムが終了する、という報告がありました。LCDへのI2C通信が失敗したタイミングでエラーが起こるようです。
I2C通信に失敗する頻度は人により異なるようですが、頻繁にプログラムが終了するという方は、対策済みのプログラム07-03-LCD-temp-mod.pyをダウンロードし、そちらをお試しください。
ターミナルでダウンロードする場合は下記の命令を試してください。
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/07-03-LCD-temp-mod.py
ブラウザからダウンロードしたいかたは、
こちらのリンク上でマウスを右クリックし、「対象をファイルに保存」や「リンク先を別名で保存」などを選択して下さい。
使い方は旧ファイルと同じです。I2C通信に失敗しても終了しないプログラムになっています。このプログラムは毎秒LCDに表示をしますので、接続エラーが連続して起こらない限りは正しく動作します。
7章全般:利用できるLCDについて1~秋月電子編
本書で紹介したLCDの新しいロットでは、上で記したように何らかの対処をしないとRaspberry Piでは利用できなくなってしまいました。抵抗1本の追加で暫定的に利用可能になるのは不幸中の幸いではありました。
2017年4月に、秋月電子通商さんより上記のLCDを正式にRaspberry Piで利用可能にしたモジュールキットが販売開始され、さらに2017年6月にはその完成版が販売開始されましたのでここで紹介します。なお、組み立てキットの方は狭いピッチ(ピン間隔)の半田付けが必要になりますので、半田付けにある程度慣れている方向けとなります。商品へのリンクは下記になります。
組み立てキットに含まれるパーツを図示したのが下図(左)となっています。ピンソケットが2種含まれていますので、お好みの方を半田付けします。
完成品にはLCDを立てて使うためのピンソケットがあらかじめ取り付けられているようです。
なお、本書のようにブレッドボードで利用するためには、組み立てキットに下図(中)のようにピンヘッダを別途購入して半田付けすることをお勧めします。ピンヘッダとは、例えば下記のようなものです。丁度のサイズのものを購入するよりは、長いものを購入してニッパでカットするのが一般的です。
ピン配置は本書のものとは異なり、上図(右)のようになっています。
利用例は下図のようになっています。下図(左)がピンソケットを用いた場合で、Raspberry PiのGPIO(3.3V/SDA/SCL/GPIO4/GNDと続くピン)に直接させるようになっています。完成品ではLCDを立てて使うようなピンソケットとなっています。ただし、これではGPIOのピンの一部が利用できなくなってしまいますので、「オス-メス ジャンパワイヤ」を介してGPIOに接続するのがお勧めです。
ピンヘッダを用いて作成したLCDならば本書のようにブレッドボートで利用可能です。その様子を示したのが下図(右)です。なお、基板の「LED」ピンを3.3Vに接続すると、図のようにLCDのバックライトが点灯した状態になります。お好みで利用してください。ピンソケットでGPIOに直接差したLCDならば、GPIO 4をHIGHにすることでバックライトが点灯します。なお、バックライトを利用するには、LCDを基板に半田付けする際に2か所の四角いピンも半田付けする必要がありますのでご注意ください。
7章全般:利用できるLCDについて2~ストロベリーリナックス編
本書では上で紹介したように、秋月電子通商で入手可能な8文字x2行のLCDを用いました。
よりたくさんの文字を表示できるLCDとして、ストロベリーリナックスで取り扱われている以下のものが利用可能です。どちらも16文字x2行ですので、本書で取り扱ったものの倍の文字数を表示できます。
利用している様子が下図になります。「sudo python 07-02-LCD.py 'Hello, Raspberry Pi!'」を実行した様子です。
なお、プログラムですが、本書刊行後に修整した下記をお勧めします。このLCDのための修整ではありませんが、下記に記した通りのメリットがあります。
これらをターミナルでダウンロードする場合、下記のコマンドを実行してください。
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/07-02-LCD-mod.py
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/07-03-LCD-temp-mod.py
なお、これらのLCDが本書のLCDと共通でのプログラムで利用可能な理由は、コントローラーICとしてST7032iと呼ばれるものが共通で用いられているためです。それ以外のLCDは本書のプログラムでは動作しませんのでご注意ください。
なお、回路の接続は本書のものとは少し異なります。上図のどちらの液晶を用いる場合も下図を参考にしてください。
プログラムは、一行だけ変更が必要です。07-02-LCD.pyや07-03-LCD-temp.pyには下記のようにLCDの文字数を設定している行があります。これらは8x2の液晶であることを示しています。
chars_per_line = 8
display_lines = 2
これを下記のように変更して保存すれば完了です。
chars_per_line = 16
display_lines = 2
また、「I2C低電圧キャラクタ液晶モジュール(16x2行)」では文字がやや薄いことがわかるでしょう。その場合、上記の修整版プログラムにしか存在しませんが、下記の行を見つけ、数字を40程度にすると見やすい濃さの文字になります。
contrast = 32 # 0から63のコントラスト。通常は32、文字が薄いときは40を推奨
7章全般:LCDにカタカナを表示する
本書で用いたLCD、および上で紹介した16x2のLCDはどちらもカタカナを表示することができます。本書のプログラムを若干修整したものを用いる必要がありますが、ここで紹介します。
修整したプログラムは下記です(上の補足で何度か紹介したものと同じです)。
これらをターミナルでダウンロードする場合、下記のコマンドを実行してください。
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/07-02-LCD-mod.py
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/07-03-LCD-temp-mod.py
例えば、07-02-LCD-mod.pyを開いて見ると、末尾に下記の記述があります。
# アルファベットと記号は「''」でくくってそのまま表示可能
write_string('Hello World')
# カタカナや特殊記号は文字コードを一文字ずつ入力
# 以下は「ラズベリー パイ」と表示する例
#s = chr(0xd7)+chr(0xbd)+chr(0xde)+chr(0xcd)+chr(0xde)+chr(0xd8)+chr(0xb0)+' '+chr(0xca)+chr(0xdf)+chr(0xb2)
#write_string(s)
このうち、「write_string('Hello World')」の先頭に「#」を記述して無効にし、
「s = chr(0xd7)+(略)」と「write_string(s)」の先頭の「#」を削除して有効にします。これを保存して実行すれば、下図のように「ラズベリー パイ」と表示されます。
上のコードでは「ch(0xd7)」が「ラ」を表しており、それを「+」記号でつないでいます。空白文字だけは英数字と同じ扱いで「' '」と表記しています。カタカナと記号の対応表は下記になります。色々試して見ると面白いでしょう。
ただし、上で紹介したストロベリーリナックスの2つのLCDでは、下記対応表の一番左の列の文字(0x06~0x0f)は表示されないようです。ご了承ください。
第8章
p.192など:半固定抵抗の回転の向きについて
6章の注釈でも既に述べたように、「半固定抵抗の3.3VピンとGNDへの接続を入れ替える」ことで、AD変換の値が大きくなる回転の向きを逆にすることができます。
お使いの半固定抵抗により回転の向きが異なることがありますので、配線の入れ替えにより好みの向きを選択してください。
p.181:RGBフルカラーLEDについて
Arduino Sidekick Basic Kitに含まれるRGBフルカラーLEDは共通アノード(アノードコモン)、秋月電子通商のパーツセットに含まれるRGBフルカラーLEDは共通カソード(カソードコモン)です。
共通カソード(カソードコモン)のRGBフルカラーLEDを用いる場合、書籍とサンプルファイルの指示に従い、プログラムを編集してから用いる必要がありますので、御注意ください。
回路の配線も異なりますので書籍中の図をよく見て配線しましょう。
p.181:LED光拡散キャップ白(5mm)
8章および9章で5mmサイズのRGBフルカラーLEDを使う際、光拡散キャップを取り付けると色が見やすくなるため使用を推奨しました。
上で紹介した「Arduino Sidekick Basic Kit バージョン2」を購入された場合、含まれるRGBカラーLEDは光拡散キャップが不要なパッケージに変更されておりますので、使用する必要はありません。
下記の写真は、左から順に「Arduino Sidekick Basic Kit バージョン1に含まれるRGBフルカラーLED(端子カット済)」、「光拡散キャップ」、「Arduino Sidekick Basic Kit バージョン2に含まれるRGBフルカラーLED」です。
p.204:DCモーターのノイズについて
書籍でも触れたように、DCモーターを動かすと大きなノイズが発生します。Wifiを使ってRaspberry Piをネットワークに接続している場合、 ある条件が重なったときにDCモーターのノイズによりWifiの接続が切れてしまう現象が見られました。USB機器の相性に起因するようですが、起こる確率はあまり高くないように思います。もし運悪くそのような状況に遭遇した場合、下記の対策を検討してみてください。
- Raspberry Piに接続してるUSB機器、典型的にはキーボードとマウスを別のものに変更する
- 書籍p.212の図8-12のように、DCモーターにコンデンサを3個とりつける(端子間1個、端子-外装間2個)。書籍p.212の図8-12をカラーで再掲しますので、参考にしてみてください。
筆者の場合、上記2つのどちらの方法でも解決できました。なお、このDCモーターのノイズの問題は9.6章および10章でも起こりえますので注意してください。
p.181:サーボモーター
本書では、Arduino Sidekick Starter Kitに含まれるサーボモーター以外に、比較的安価に入手できるサーボモーターとして秋月電子通商で取り扱われている下記のものを紹介しました。
その後、秋月電子通商ではさらに安価なサーボモーターとして下記のものも取り扱われるようになりました。
amazonではSG-90の複数個セットも取り扱われております。
このSG-90やSG92Rを用いて本書の演習を行うこともできるのですが、このような安価なサーボは故障や動作不良もあり得ると考え、1個ではなく複数個購入すべきだと思います。そういう意味では、これらのサーボモーターはトラブルがあった時に対処できる上級者向けの商品であると個人的には思います。
p.202:モータードライバ TA7291Pについて
モータードライバのTA7291Pはすでに生産が終了しており、今後入手が困難になることが予想されます。
代替品として、下記を選びました。TA7291Pを入手できないときはお試しください。
このモータードライバは、ピンヘッダを自分で半田付けするキットとなっています。完成状態は下図の通りです。
このモータードライバを用いて図8-11と同等の回路を組むには下図のようにします(クリックすると拡大されます)。上で述べたように、電池ボックスは電池三本用のものをお使いください。
p.212:wiringPiを用いたハードウェアPWM信号によるサーボモーターの制御
本書ではwiringPiを用いてGPIO 18に対して精度の高いハードウェアPWM信号を出力し、サーボモーター1個の角度を制御しました。
Raspberry Pi Model BではハードウェアPWM信号はGPIO 18からの1つのみしか出力できなかったのですが、Raspberry Pi Model B+以降(Raspberry Pi 2 Model B含む)では、ハードウェアPWM信号を2つ出力できます。
下図のように、1つ目のPWM0はGPIO 18かGPIO 12のどちらかから、2つ目のPWM1はGPIO 13かGPIO 19のどちらかから出力できます。その方法は本書で解説した方法と同じですので試してみてください。
p.213:wiringPiのダウンロードとインストール
書籍執筆時に比べ、wiringPiのインストール方法が大きく異なっています。Raspbianのバージョンにより異なりますので、順に解説します。
NOOBS 1.4.2以降に含まれるRaspbian(Jessie, Stretch, Buster)では、wiringPiはデフォルトでインストールされていますので、改めてインストールをする必要はありません。p.214のWiringPi2-Pythonのインストールから行ってください。なお、NOOBS 1.4.2以降ではPythonでGPIOにアクセスするプログラムに管理者権限が不要になったのですが、このwiringPiを用いる場合は依然として管理者権限が必要です。「sudo idle &」で起動したIDLEでプログラムを実行してください。
NOOBS 1.4.1までのRaspbian(Wheezy)では下記のコマンドのようにaptで簡単にwiringPiをインストールできるようになっています。
$ sudo apt update
$ sudo apt install wiringpi
これがp.213の3つのコマンドの代わりとなりますので、これを終えた後にp.214のWiringPi2-Pythonのインストールに進んでください。
p.214:WiringPi2-Pythonのインストール
p.214のWiringPi2-Pythonのインストールですが、やや長いコマンドが多いので、コピー&貼り付けできる形で以下に再掲します。必要に応じて活用してください。なお、(3)のダウンロードサイトは、書籍に記したサイトでは更新が終了されたので変更してあります。
(2019.4.9: python2用とpython3用の両方をインストールするようコマンドを追加しました)
(1) $ cd
(2) $ sudo apt update
(3) $ sudo apt install python-dev python-setuptools python3-dev python3-setuptools
(4) $ git clone https://github.com/neuralassembly/WiringPi2-Python.git
(5) $ cd WiringPi2-Python
(6) $ sudo python setup.py install
(7) $ sudo python3 setup.py install
p.216:WiringPi2-Pythonを用いたプログラムの実行について
最近のNOOBSに含まれるRaspbianでは、多くの電子工作プログラムの実行には管理者権限が不要になりました。
しかし、WiringPi2-Pythonを用いる08-04-servo.pyの実行には今でも管理者権限が必要です。
正確には、精度の高いPWM(ハードウェアPWM)を用いるプログラムの実行には管理者権限が必要です。
用いている実行方法により下記のどれかのコマンドの実行が必要となります。
管理者権限のIDLEで実行
sudo idle &
管理者権限のThonnyで実行
sudo thonny &
管理者権限のPython2コマンドで実行
sudo python 08-04-servo.py
管理者権限のPython3コマンドで実行
sudo python3 08-04-servo.py
第9章
p.227:WebIOPiのダウンロードサイト
WebIOPiのダウンロードサイトは、下記に変更されていますので注意してください。現在、ページの上部に「Cayenne」というソフトへのリンクがありますが、「Cayenne」ではなく、「WebIOPi 0.7.1」をダウンロードするようにしてください。
p.227:NOOBS 1.4.2以降におけるWebIOPiのダウンロードと展開
書籍の段階では、epiphanyでWebIOPiをダウンロードするとXarchiverという展開ソフトが自動で起動しましたので、そのソフトを用いて圧縮ファイルの展開を行いました。
しかしNOOBS 1.4.2以降では、epiphanyでWebIOPiをダウンロードしてもXarchiverは起動しない場合があります。その場合、ユーザーpiのホームのダウンロード(Downloads)ディレクトリにWebIOPi-0.7.1.tar.gzが保存されていますので、それを以下の手順で展開してください。
- ファイルマネージャを起動し、ダウンロード(Downloads)ディレクトリにあるWebIOPi-0.7.1.tar.gzを、ユーザーpiのホームディレクトリに移動する(p.306の図B-2が類似しているので参考になるでしょう)
- ターミナルを起動し、下記のコマンドでWebIOPi-0.7.1.tar.gzを展開してください。
- tar zxf WebIOPi-0.7.1.tar.gz
- 以上が終わったら、このまま以下の記述に従い、WebIOPiをインストールしてください。
p.227:WebIOPiのバージョンとインストール
本書はWebIOPi 0.7.0を用いて解説しましたが、2015年2月10日にWebIOPi 0.7.1がリリースされました。Model BとModel B+で正常動作するこのバージョンでWebIOPiの開発は実質停止しているようですが、有志により Raspberry Pi 2 や Pi 3 で動作させる方法が公開されていますので、その方法でインストールしましょう。
全てのバージョンのRaspberry Piで以下の方法でインストールしてください。なお、デモアプリケーションではGPIOが40ピン分表示されますが、GPIOが26ピンのModel Bでは、26ピン分までのGPIOのみを用いるようにしてください。
まず、本書p.228と同じ方法でWebIOPi-0.7.1をダウンロードし、/home/piに展開してください。必ず、WebIOPi-0.7.0ではなくWebIOPi-0.7.1を用いてください。この時点でユーザーpiのホームディレクトリにWebIOPi-0.7.1ディレクトリができています。そして、p.228のインストール時の2つのコマンドを以下の4つに変更します。
二つ目の命令は複雑なので、ブラウザ上でCtrl-cでコマンドをコピーし、「編集」→「貼り付け」でターミナルに貼り付けると良いかもしれませんね。
$ cd WebIOPi-0.7.1/
$ wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi-pi2bplus.patch
$ patch -p1 -i webiopi-pi2bplus.patch
$ sudo ./setup.sh
最後に、下記のような質問をされますので、「n」を入力してEnterキーを押し、インストールを完了してください。
Do you want to access WebIOPi over Internet ? [y/n]
この質問は「インターネットから家の中などにあるRaspberry Piにアクセスしますか?」という内容の質問なのですが、本書ではp.226で触れたように、同一ネットワーク内からのアクセスのみを考えますので、「いいえ」に相当する「n」を入力するわけです。
以上の方法に従わずにそのままWebIOPi 0.7.1をインストールすると、下図のようにデモアプリケーションであるGPIO Headerにおいて、「IN/OUT」などの文字が現れるべきボタンが灰色のみのボタンとなってしまいます(書籍237ページ図9-6に対応)。その場合、WebIOPiを再インストールしてみましょう。ユーザーpiのホームディレクトリ(フォルダ)で下記のコマンドにより過去のインストール時のファイルを一旦削除します。
$ sudo rm -rf WebIOPi-0.7.1/
その後、上記の4コマンドを入力し、WebIOPi 0.7.1をインストールしてみてください。なお、この「ボタンに文字がなく灰色一色になる」状況を解決しないと、9章の残りの内容は正常に動作しませんのでご注意ください。
なお、再インストールを行っても状況が変わらないという場合、原因はわかりませんが、OSであるRaspbianが壊れているという可能性もないとは言えません。余力があればOSを再インストールしてみることも検討してみると良いでしょう(私自身、OSの再インストールが必要だったことはないのですが、読者の方にはそれで改善したという方が複数名いらっしゃるようです)。
p.229:WebIOPiについての各種コマンド
WebIOPiの起動/停止、自動起動/自動起動の停止、などのコマンドは現在では書籍と異なっています。下記の通りですので、コピーするなどしてご活用ください。
WebIOPiの起動コマンド
sudo service webiopi start
WebIOPiの停止コマンド
sudo service webiopi stop
WebIOPiが動作確認しているか確認するコマンド
ps ax |grep webiopi
WebIOPiの自動起動
sudo systemctl enable webiopi
WebIOPiの自動起動の停止
sudo systemctl disable webiopi
p.232:IPアドレスでのURLの指定について
本書では、ブラウザからRaspberry Piにアクセスする際に、ルーターなどからRaspberry Piに割り振られたIPアドレスを用いました。すなわち、IPアドレスが192.168.1.3の場合にブラウザから例えば下記のようにアクセスしました。
- http://192.168.1.3:8000/bb/01/
しかし、この方法はifconfigコマンドなどで事前にIPアドレスを調べておく必要があり、やや面倒でした。
このIPアドレスの指定を簡単化する方法としては、以下の2つが考えられます。
- Raspberry PiのIPアドレスを固定し、毎回同じアドレスの指定で済むようにする
- IPアドレスではなく、「raspberrypi.local」のような名前で指定する
1つ目については、解説がやや長くなるため「
Raspberry PiのIPアドレスを固定する」というページにまとめましたので興味のある方は御覧ください。
以下では、2つめの「raspberrypi.local」のような名前で指定する方法について記します
NOOBS 1.4.2以降に含まれるRaspbian(Jessie, Stretch, Buster)では、IPアドレスを用いずに「raspberrypi.local」のような名前でRaspberry Piにアクセスできます。ただし、この方法でRaspberry Piにアクセスできるのは下記のみです。
- iTunesをインストールしたWindows(iTunesに含まれるBonjourというアプリケーションが必要なためです。ただし、Windows 10にApril 2018 Updateを適用すると、この方法が一時的に使えなくなります。WindowsからiTunesとBonjourを一旦削除してからiTunesをインストールしなおすとまた使えるようになるようです)
- Mac OS X
- iPhoneやiPad
Androidスマートフォンでは現時点ではこの方法ではRasbperry Piにはアクセスできないように思われます。
上記の条件が満たされた場合、方法は簡単で、ブラウザのアドレス欄に例えば下記のように入力すればOKです。
- http://raspberrypi.local:8000/bb/01/
すなわち、IPアドレス「192.168.1.3」などの代わりに「raspberrypi.local」という記法が使える、というわけです。これは、Jessie、Stretch、Buster上で動作しているavahiというソフトウェアの働きによります。
なお、Jessie以前のWheezyで同じことを実現したい場合、LXTerminalを起動して下記のようにavahi-daemonをインストールする必要があります。
- sudo apt update
- sudo apt install avahi-daemon
インストール後に再起動すると、自動的にavahiが起動し、「raspberrypi.local」でのアクセスが可能になります。
なお、同じネットワーク内でavahiが起動したRaspberry Piが2台以上あると、同じ名前「raspberrypi」のマシンが2つ以上ある状態になり、名前の衝突が起こります。その場合、2台目以降のRaspberry Piには「raspberrypi-2.local」などの名前が自動的につけられますのでご注意ください。名前が衝突しないよう、あらかじめ「raspberrypi」というマシン名を変更しておく方法もありますが、ここでは省略します。
p.240:WebIOPi用サンプルファイルの/usr/share/webiopi/htdocsディレクトリへのコピー
240ページでは、本書のサンプルファイルを/usr/share/webiopi/htdocsディレクトリへコピーするという作業を行います。
この作業は重要であり、これに失敗すると、以後の演習が期待通りに動作しません。そこで、コピーして利用できるよう、
そのコマンドをここに再掲します。
ターミナルソフトウェアLXTerminalを起動して、下記の2コマンドを一つずつ順に実行してください。
sudo chown -R pi /usr/share/webiopi/htdocs
cp -r 09-samples/bb /usr/share/webiopi/htdocs
なお、本書のサンプルファイルをbluebacksディレクトリに展開した方は、上記2コマンド実行の前に「cd bluebacks」コマンドを実行して
bluebacksディレクトリに入り、その後2コマンドを実行するようにしてください。
p.240:/etc/webiopi/config の myscript行
9.3以降の演習は設定ファイル /etc/webiopi/config の[SCRIPT]セクションに、Pythonスクリプトの場所を示す行を記す必要があります。
記述に間違いがあるとWebIOPiが起動しませんので、コピーできるように正しい記述を以下に記しておきます。
myscript = /usr/share/webiopi/htdocs/bb/01/script.py
p.251:Python3でI2Cを用いる方法について
執筆時に比べ、Python3でI2Cを用いるためのインストール作業が簡単になっています。
$ sudo apt update
$ sudo apt install python3-smbus
この2行がp.251の9つのコマンドの代わりとなります。機会があれば試してみてください。
p.255:デジタル温度計のloop関数について
9.4節において、WebIOPiを用いて温度計の値をブラウザから読み取る方法を紹介しました。書籍のように、手動でWebIOPiを起動する場合は問題ないのですが、10章のキャタピラ式模型のようにWebIOPiを自動起動する場合、9.4節のプログラムがうまく動作せず温度がブラウザで読み取れないことがわかりました。
これは、WebIOPiのloop関数が、手動起動した場合は問題なく動作するものの、自動起動ではうまく機能しないことが原因のようです。
修正プログラムは以下の手順で導入できますので、デジタル温度計プログラムを自動起動で実行したい方は試してみてください。WebIOPiのloop関数を用いず、スレッドという機能で温度を読み取るように変更しています。もちろん、自動起動ではなく手動起動でも動作します。
$ sudo rm -r /usr/share/webiopi/htdocs/bb/02
$ rm -r 02
$ rm 02.zip
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/02.zip
$ unzip 02.zip
$ mv 02 /usr/share/webiopi/htdocs/bb/
2番目と3番目の命令では既存のディレクトリとファイルの削除を行っており、「そのようなファイルは存在しない」というメッセージが出る場合がありますが気にしなくとも構いません。
p.256:RGBフルカラーLEDについて
Arduino Sidekick Basic Kitに含まれるRGBフルカラーLEDは共通アノード(アノードコモン)、秋月電子通商のパーツセットに含まれるRGBフルカラーLEDは共通カソード(カソードコモン)です。
共通カソード(カソードコモン)のRGBフルカラーLEDを用いる場合、書籍とサンプルファイルの指示に従い、プログラムを編集してから用いる必要がありますので、御注意ください。
回路の配線も異なりますので書籍中の図をよく見て配線しましょう。
p.262:モータードライバ TA7291Pについて
上の「p.202:モータードライバ TA7291Pについて」で述べたように、モータードライバ TA7291Pの入手が難しいときは下記の代替品をお使いください。
このモータードライバを用いて図9-13と同等の回路を組むには下図のようにします(クリックすると拡大されます)。上で述べたように、電池ボックスは電池三本用のものをお使いください。
p.262:DCモーターのノイズについて
もし、DCモーターを動かしたときにWifiの接続が切れるような現象が見られた場合、本ページ上部の「p.204:DCモーターのノイズについて」にある対策を御覧ください。
10章
p.281:モータードライバ TA7291Pについて
上の「p.202:モータードライバ TA7291Pについて」で述べたように、モータードライバ TA7291Pの入手が難しいときは下記の代替品をお使いください。
このモータードライバを用いて図10-4と同等の回路を組むには下図のようにします(クリックすると拡大されます)。上で述べたように、電池ボックスは電池三本用のものをお使いください。
さらに、このモータードライバを用いて図10-6と同等の回路を組むには下図のようにします(クリックすると拡大されます)。こちらも電池ボックスは電池三本用のものをお使いください。
p.276:DCモーターのノイズについて
もし、DCモーターを動かしたときにWifiの接続が切れるような現象が見られた場合、本ページ上部の「p.204:DCモーターのノイズについて」にある対策を御覧ください。
p.288:/etc/rc.localに追加する1行
LCDにIPアドレスを表示するプログラムの自動起動のために/etc/rc.localに追加する行は下記の通りです。必要に応じてコピーしてご活用ください。
sudo python /home/pi/07-02-LCD.py $_IP &
サンプルファイルをbluebacksディレクトリに保存した場合は下記になるのでしたね。
sudo python /home/pi/bluebacks/07-02-LCD.py $_IP &
p.288: LCDへのIPアドレスの表示について(1)
本書では、Raspberry Piにブラウザからアクセスする際にIPアドレスを用いました。そのため、Raspberry Piにルーターなどから割り振られたIPアドレスを知る目的で、LCDを回路に取り付けました。
しかし、「p.232:IPアドレスでのURLの指定について」の注意で紹介しましたように、avahiという仕組みを用いると、IPアドレスではなく、下記のようなアドレスでのアクセスが可能になるのでした。
- http://raspberrypi.local:8000/bb/05/
これを用いると、回路からLCDが不要になるなどのメリットがあります。具体的には下記の通りです。
- p.286の図10-6からLCDを取り外して良い
- p.288での/etc/rc.localへの「sudo python /home/pi/07-02-LCD.py $_IP &」の記述が不要
さらに、Raspberry PiのIPアドレスを固定する、という方法でも、毎回IPアドレスを調べる必要がなくなりますね。こちらについては「
Raspberry PiのIPアドレスを固定する」にまとめましたので、興味のある方は御覧ください。
7章の補足で述べたように、LCDにはロットの問題によるトラブルが発生していますので、これら方法を用いてLCDなしの回路とする方が良いかもしれませんね。
起動時にLCDへIPアドレスを表示する方法を記しましたが、IPアドレスの表示に成功するのは、「Raspberry PiにIPアドレスが割り振られる」→「LCDにIPアドレスが表示される」という順番で処理が行なわれたときのみです。
ネットワーク環境やNOOBSのバージョンによっては、Raspberry PiにIPアドレスが割り振られるタイミングが遅く、LCDにIPアドレスが表示されない、ということがありました。その場合、LCDには「Raspberry Pi」と表示されます。
まず、NOOBS 1.4.2以降に含まれるRaspbian(Jessie, Stretch, Buster)を用いている方向けの方法です。
Jessie以降に含まれる設定アプリケーションでは、下図(左)のように「Network at Boot」という項目があります。この「Wait for network」にチェックを入れて再起動すると、Raspberry Piのネットワークへの接続が完了してから起動が完了するようになります。その結果、LCDにIPアドレスが表示されるようになる、というわけです。下図(右)のように以前からの設定アプリケーションraspi-configにも「Wait for Network at Boot」という項目が追加されており、「Slow Wait for network connection before completing boot」を選択することで、同様の効果が得られます。