今回はスイッチの回路を製作します。
今回やること
ラズベリーパイで動作しているNode-REDに、リモートからアクセスしている方も多いと思います。このようなケースでは、ラズベリーパイ本体に接続しているディスプレイをオフにしていることもあるのではないでしょうか。
このような場合、ラスベリーパイをシャットダウンするのってちょっと面倒ですよね。ラズベリーパイのディスプレイの電源を入れて、デスクトップ画面が表示されたら、シャットダウンメニューを選択する必要があります。
もっと簡単にボタンひとつでラズベリーパイをシャットダウンできると便利です。
ということで、今回のテーマへの誘導が無理やり感たっぷりって感じですが、これからブレッドボードにスイッチを追加して、スイッチを押すとラズベリーパイをシャットダウンできるようにしましょう!
今回の記事では以下の内容を説明します。
- ラズベリーパイGPIOピンの内部
これから、GPIOピンをスイッチの入力として使用していきます。最初にラズベリーパイGPIOピンの内部がどのような仕組みになっているのか説明します。 - スイッチ回路の概要
ラズベリーパイGPIOピンの内部がわかったところで、スイッチ回路をどのようにすればスイッチの状態を読み取ることができるか説明します。 - GPIOピンの入力時の問題
GPIOピンを入力として使用するとき、独特の問題がありますので、その問題の内容を説明します。 - 解決策
その問題には有効な解決策があります。その具体的な方法を説明します。 - スイッチ回路製作
ブレッドボード上にスイッチの回路を製作します。
ラズベリーパイGPIOピンの内部
これから、ラズベリーパイのGPIOピンにスイッチを接続して、スイッチの状態を読み取っていきます。
とはいっても、どのようにしたらGPIOピンに接続したスイッチの状態を読み取ることができるのか、今の段階ではよくわかりませんよね。
そこで、最初にGPIOピンの内部がどのようになっているか、理解しておくことにします。
フルカラーLED制御の回路を製作したとき、ラスベリーパイGPIOピンの内部は以下のように電子的なスイッチが入っていることを説明しました。
大変申し訳ございません!
上の図は、間違ってはいないのですが、正しくもありません。
上の図をよく考えてみると、GPIOピンの出力電圧は制御できますが、どうみてもピンの状態を読み取ることはできませんよね。
実は、ラズベリーパイGPIOピンの内部は、以下のように「出力電圧の制御」と「ピンの電圧の読み取り」のどちらかを選択できるようになっているんです。
このように、ラズベリーパイのGPIOピンは、ピン内部の電圧計により電圧を読み取ることができます。
ところで、フルカラーLED制御のフローを作成したときは「rpi – gpio out」ノードを使いましたよね。
「rpi – gpio out」ノードのフローでは、ラズベリーパイ内部は以下のように自動的に「出力電圧制御」が選択されていたんです。
Node-REDには、GPIOピンの電圧を読み取るために「rpi – gpio in」ノードか用意されています。
この「rpi – gpio in」ノードを使用すると、以下のように自動的に「電圧読み取り」の機能が選択されます。
ところで、上の図では0Vから5Vまで読み取れる電圧計のイラストで説明しましたが、実際のラズベリーパイのGPIOピンの電圧読み取りには、かなり制限があります。
具体的には、上の電圧計で読み取れる電圧は「0V」か「3.3V」のどちらかのみになります。途中の電圧、例えば「2.5V」という電圧は「2.5V」として読み取ることができません。
さらにラズベリーパイGPIOピンの電圧計が読み取った電圧は、「0V」の場合が「0」、「3.3V」の場合は「1」という値で読み取ることになります。
とはいっても、電圧自体は0Vと3.3V以外にもいろいろありますよね。例えばピンの電圧が「2.5V」というような中途半端な場合はどのように読み取られるのでしょうか。
ラズベリーパイのGPIOピン内部の電圧計は、無理やり「0V」か「3.3V」のどちらかで読み取ってしまいます。
当然ながら0Vに近い値は「0V」、3.3Vに近い値は「3.3V」として読み取ってくれますが、半分ぐらいの電圧はどちらで読み取られるかはわかりません。
そのため、スイッチ回路を製作するときは、GPIOピンの電圧値が0Vか3.3Vのどちらかになるようにする必要があります。
ということで、さっそくスイッチ回路を考えていきましょう。
この回路は、スイッチがONのときにGPIOピンが3.3Vに接続されるようにしてみました。
このスイッチ回路で特に問題なさそうですが、実はこのスイッチ回路はうまく動かないんです。
これから、この回路の問題点と解決策を説明していきます。
GPIOピンの入力時の問題
先ほどのスイッチ回路は、スイッチを押したとき、GPIOピンの電圧を読み取ると3.3Vになりました。
この回路で、スイッチを離したときはGPIOピンに何もつながれていないので、0Vになりそうな気がしませんか?
実はここが問題なんです。何もつながれていないピン(金属)の電圧は何Vになるかわからないんです。
電気回路に慣れていないと、ちょっと?と思われるかもしれませんので、実際に確認してみましょう。
以下の画像は、電圧や電流などを測定することができる測定器です。この測定器で電池の電圧を測定すると、以下のように読み取ることができます。
この測定器を以下のように何も接続しないと、、、
こんな感じで、0Vにはなりません。何Vになるかというと、よくわからないんです。測定器が置いてある場所の環境によります。ただいえることは、どんな環境でも0Vにはなりません。
ラズベリーパイのGPIOピン内部の電圧計もこの測定器と同じように、何も接続していないとその時の電圧は不安定な状態になります。
そこで、スイッチをOFFにしたとき、GPIOピンが0Vになるようにする必要があるわけです。
解決策
問題はスイッチOFFのときに0Vにならないわけなので、すぐに思いつく解決策としては以下のようにスイッチOFFのとき、0Vになるように接続する、という案です。
うまくいきそうですが、残念ながら問題があります。
上のように接続すると、確かにスイッチOFFのときはGPIOピンは0Vになります。でもスイッチをONにすると、3.3Vと0Vが直接接続されてしまい、電流が流れ過ぎてショート状態になってしまいます。この状態になるとラスベリーパイはすぐに壊れてしまいます。
この問題に対する解決策は、スイッチをONにしたときにショートの状態にならないように、以下のように電流を流れにくくする抵抗を入れることにより解決します。
このようにすると、スイッチがOFFのときはGPIOピンは0V、ONのときは3.3Vになります。
この抵抗は「プルダウン抵抗」という名前がついています。
「プルダウン抵抗」とは抵抗の役割の名前ですので、実際に「プルダウン抵抗」という製品が売っているわけではありませんので注意してください。また、次回の記事で「プルダウン」という言葉がノードの設定で出てきますので覚えておいてください。
ここで、なぜ「プルダウン」という名前になっているか補足しておきます。
上の回路では、スイッチがOFFのとき、GPIOピンの電圧を0Vにしていますよね。「0Vにする」というのを「下の方(ダウン)の電圧に引っ張る(プル)」という意味合いで「プルダウン」と呼んでいます。
スイッチOFFのとき本当に0Vになるのか?
少し電子工作をされたことがある方は、プルダウン抵抗を入れると、スイッチOFFのときにはGround(0V)とGPIOピンの間に抵抗が入っているので、GPIOピンは0Vにならないのではないか?と思われるかもしれません。
スイッチOFFのとき、抵抗が入っていてもGPIOピンは0Vになります。この理由について簡単に説明しておきます。
電圧と電流、抵抗の関係式ってありましたよね。(電圧)=(電流)×(抵抗)という式です。スイッチOFFのとき、GPIOピン−抵抗−Goundのラインには電流は流れません。つまり抵抗には電流が流れません。先ほどの関係式では、(抵抗の両端の電圧) = (電流=0) × (抵抗) = 0ということになり、抵抗の両端の電圧は0Vになります。つまり、スイッチOFFのときは抵抗があってもGPIOピンの電圧は0Vになります。
ところで「プルダウン抵抗」というものがあるのであれば、「プルアップ抵抗」もありそうですよね。
というわけで、実際にプルアップ抵抗という接続方法もありますので、どのような回路か確認してきおましょう。
先ほどは、スイッチをONにするとGPIOピンが3.3Vになりました。以下のように接続を変えると、スイッチONのときはGPIOピンが0V、スイッチOFFのときはGPIOピンが3.3Vになります。
このときの抵抗は、スイッチがOFFのときにGPIOピンを3.3V、つまり上の方に引っ張っているので「プルアップ抵抗」と呼んでいます。
ラズベリーパイGPIOピンのプルアップ/プルダウン抵抗
ということで、スイッチ回路にはプルアップまたはプルダウン抵抗が必要になるので、回路製作はちょっと面倒ですよね。
ここでいいニュースがあります。
実は、ラスベリーパイGPIOピンの内部には、このプルアップ/プルダウン抵抗が内蔵されているんです。両方とも内蔵されていて、電子的なスイッチでどちらかを有効にできるようになっています。(両方無効にする選択もできます)
ただ、抵抗の値の関係から、ちょっとノイズに弱い、という注意点があります。
今回製作する回路では、あまりノイズを気にする必要はありませんが、例えばモーター制御など、電気の力で機械的に何かを動かす制御をする場合はノイズが多くなります。
その場合は、GPIO内部のプルアップ/プルダウン抵抗は使用せず、外部に抵抗を接続します。外部に接続する抵抗は10kΩを選ぶとよいでしょう。
今回製作するスイッチ回路は、GPIOピン内部のプルアップ抵抗を使用することにします。
スイッチ回路製作
それでは、ラズベリーパイGPIOピン内部のプルアップ抵抗を使用したスイッチ回路を製作していきましょう。
とはいっても、スイッチがONのときにGPIOピンが0Vになるようにするだけです。
ピンはGPIO番号の24番ピンを使用して、以下のようにスイッチを接続することにします。
説明が長かった割には、ずいぶん簡単な回路ですよね…
ブレッドボード回路図
スイッチ回路を製作する前に、スイッチの接続がどのようになっているか確認しておきましょう。
今回購入したスイッチはピンが4本ありますが、内部は以下のように接続されています。
ピンが出ている辺を上下に置いたとき、上の図のように内部接続されています。スイッチを押したときにどことどこのピンが接続されるか確認しておいてください。
ブレッドボードで上の接続を実現する方法はいくつかありますが、今回は以下のように製作してみました。
(1)最初にスイッチをブレッドボードの16列から18列を使用して中央の溝をまたぐように配置してみました。また、ラズベリーパイのGPIOピンと接続するためのピンヘッダは3ピンにしてスイッチの片側の列と接続できるように配置しました。最後に、スイッチのもう片方をGound(0V)にするため、黄色のジャンパワイヤで上のように接続しました。
これでスイッチ回路の完成です。
あとは、ラズベリーパイのGPIOピンに以下のように接続します。今回接続する部分をピンク色の線で示しました。
今回は回路を製作したのみで、動作確認は次回の記事になります。
次回の記事では、このボタンが押されたときにラズベリーパイをシャットダウンするフローを作成します。また、ついでにDashboardにもラズベリーパイのシャットダウンボタンを用意します。
更新履歴
日付 | 内容 |
---|---|
2022.8.9 | 新規投稿 |