DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

RaspberryPiにスイッチを付ける

RaspberryPiには便利なGPIO入出力端子が付いている。

 

マイコンでは「入出力ポート」と呼ばれ、パソコンからのLAN接続で設定するポートとは違いマイコンから出ている物理的な足(端子)のことを指す。

 

マイコンにも種類が沢山ありポートの役割はマイコンによって内容が違う。

PWMや1-WireやMCLRやA/DやRX/TX等等、入力だけのもの出力だけのもの使える機能もマイコンによってかなり違うのでここでは任意に入出力を設定できる「汎用ポート」として使えるポートのことだけを書く。

 

RaspberryPiもARMというマイコンを載せている。マイコンをある程度扱い易いようにした「マイコンボート」と呼ばれている物だ。

なのでマイコン単品に比べると幾分か扱い易い設計になっている。

 

RaspberryPiのGPIOを触る時に一番気を付けないといけないのはボードの電源は5Vだが、GPIOは3.3V入出力だということ。GPIOに5Vを入力すると壊れる。

 

RaspberryPiはデジタルIOポートのみでアナログIOポートが付いていない。つまり入出力は全て3.3VかGND(0V)かどちらかを入出力することになる。

 

ちなみに以下説明で

「3.3V、HI、+」は同義

「0V、LO、ー、GND」は同義

と解釈して読んで欲しい。

 

単体のスイッチを付ける場合、マイコンが「+」か「ー」かどちらかを判断するようにしなければならない。「+」にも「ー」にも端子を付けないと変な値(「+」「-」が高速で入れ代わる)が入力されてしまう。特に商用周波数(50Hz,60Hz)で「+」「ー」が入れ替わって入力されるとう現象はよくあることで、このように意図せずスイッチされてしまう状態を「ノイズ」と呼ぶ。

 

まず、3.3Vの電源とGNDがあるとする。マイコンからはこの「どちらの値か?」を読むのだが、

これを直接繋いだ場合。

f:id:DreamerDream:20151224111213j:plain

「短絡」と呼び、一番やってはダメな回路だ。配線が焼き切れるか電源が壊れる。

(実際の回路作成時には単純なミスでよくやってしまう。)

 

短絡させないために回路に適切な「抵抗」を入れる(抵抗値は1K〜10KΩ程度)

f:id:DreamerDream:20151224111343j:plain

こうすると抵抗を介して「+」「ー」が結ばれることになるので電流は流れるが一気には流れることはなく配線も焼き切れない。

 

この状態でマイコンに「+」か「ー」かを読ませる事が出来る。

※黄色がマイコン

この接続ではマイコンには「+」が入力されている。

f:id:DreamerDream:20151224111746j:plain

こうすれば「ー」が入力される。

f:id:DreamerDream:20151224112322j:plain

 

では、問題

f:id:DreamerDream:20151224112322j:plain

Q.上のこの状態で抵抗からGNDへ繋がっている線をカットしたらどうなるだろうか?(要はGNDを無くすということ)

 

A.マイコンへは抵抗を介して「+」が入力される。

f:id:DreamerDream:20151224112425j:plain

 

再び抵抗をGNDへ繋げるとマイコンへは「ー」が入力されることになる。

f:id:DreamerDream:20151224112544j:plain

 

この状態が「プルアップ」と呼ばれている状態だ。

f:id:DreamerDream:20151224112425j:plain

この時に用いられる抵抗が「プルアップ抵抗」と呼ばれ、「1K〜10K」程度までの抵抗がよく使われているらしいが、抵抗値が低いとノイズに強くなるが電流が多く流れるため消費電流が多くなる。

逆に抵抗値が高いと消費電流は低くなるがノイズに弱くなる。

この辺りは機械を用いる環境と経験で抵抗値を考慮するべきだろう。

 

マイコンにはプログラムで「内部プルアップ」という機能を使えるものがある。 これを設定しておくとプルアップ回路をマイコン内部で構成出来るというもの。

マイコン内部にプルアップ抵抗が予め内臓されているので先程つけた抵抗を省略できるという機能だ。

こんな感じ(黄色部分がマイコン)

f:id:DreamerDream:20151224113334j:plain

こうするとマイコンから出ている端子をGNDへ繋げると「-」が入力され、スイッチONと認識され、GNDから切り離すとOFFと単純に認識させる事ができる。

(逆に抵抗を介してGNDへ入力しておき3.3Vへ繋げるとONと認識するよう接続する「プルダウン」という方法もあるがややこしくなるのでここでは割愛しておく。)

 

「+」でスイッチOFF、「-」でスイッチONという考え方は少し面倒くさい(僕も最初は戸惑った)が電子工作とはこういうものだ。

 

これで一番単純な「スイッチ」という物理的な回路の説明は終了。

プッシュスイッチでもスライドスイッチでもトグルスイッチでも同じように使う事が可能。

以前に書いた記事のスイッチ回路も同じ。

 

dreamerdream.hateblo.jp

 

 

回路が出来れば後はマイコン側でいかにうまくスイッチを読み込ませるか?という問題になる。

物理的なプッシュスイッチは人間の感覚では「押したらON」だけれど、機械から見ると「高速でON-OFFを繰り返し、最後にONになる」となる。 

なぜなら、マイコンは○kHzやMHzといった人間では認識出来ないぐらい高速な間隔でスイッチを読み込むから一瞬起こる「ON-OFFの中途半端な域」を認識出来てしまうのだ。

単純に「スイッチがONになったら画面にONと表示する」というプログラムを書いた場合、一度スイッチを押しただけなのに何回もONと表示されるという現象が起こる。これを「チャタリング(バウンス)」と呼ぶ。

 

これを回避するためには「スイッチがONになったらスイッチを読む作業を10ms間止める」というようにプログラムするのが一番単純な方法だ。

 

個人的に カッコイイと思うのは「ミサイルスイッチ」とよばれるスイッチ。

何に使うんだろ?これ?

 

kampa.me