IoT演習第３回、GPIOと電気回路その１


# 1. はじめに
[IoT演習シラバス案その２（授業計画表）](https://qiita.com/takashiyamanoue/items/0cf9d58265bff5883698)の第３週に予定している内容の一部です。

（以下の説明で、自分のパソコンの表示が以下の説明の表示と異なる場合があります。例えば、英語で表示されているものが日本語であったり、その逆であったり、C:ドライブの名前が異なったりする場合があります。ソフトウェアのバージョンが異なって、名前が異なる場合もあります。表示が異なっていて、どう操作すれば良いかわからない場合は、他の同様のWebページを参照したり、担当者に聞いたりしてください）

マイクロコントローラ（マイコンと呼ぶこともあります）は、コンピュータ(CPU+メモリ)と入出力機能を、ICの１つのチップや１枚のボードにまとめたものです。マイコンには電源を供給する端子の他に入出力を行う端子がついています。マイコンの入出力端子に、情報を入力するセンサ、情報を出力する表示装置、動作を行うアクチュエータ（モータなど）を接続して、様々な物を制御することができます。

https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9

今回は、マイクロコントローラの入出力を行う端子のうち、GPIO (General Purpose Input Output ) 端子について説明します。内容は以下のとおりです。

## 第3回 GPIOと電気回路その１
1. Pico の汎用入出力ピン（GPIOピン)
2. GPIOからデジタル値の出力方法
3. 電気回路入門, オームの法則
4. ブレッドボード, ジャンプワイヤ― , 抵抗 , LED の説明
5. GPIOの電気的特性
6. LEDを光らせるときの抵抗値の計算方法
7. テスター の使い方
8. 電気回路を作るときの注意（ ショート は絶対にさせないように）
9. 演習: Pico Wの外部に接続したLEDのＬチカプログラムの作成
10. 授業の振り返り

# 2. Pico W の汎用入出力端子（GPIO端子)
汎用入出力端子(General Purpose I/O 端子、GPIOピン)とは、入出力機能を持つマイクロコントローラ等で、実行時の設定により、入力にも出力にもなる端子（ピン）のことを表します。Raspberry Pi Pico W(Pico W)の[PINOUT図](https://datasheets.raspberrypi.com/picow/PicoW-A4-Pinout.pdf)の、GP0からGP28までのGPで始まってその後ろに数字が続く名前のついた端子がGPIO端子を表します。

![20240623-pico-w-pinout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/2176bd80-b906-bdcb-f260-222c74f3c9ac.png)

一つの端子（ピン）に複数の名前がついている場合がありますが、これはそのピンが、それぞれの名前が表す複数の機能を持つことを表します。この機能はプログラムによって切り替えることができます。GPIOは、High(高い電圧、1と書くこともあります)かLow(低い電圧、0と書くこともあります)の値を入力したり、出力したりします。なお、入力の時は、この端子とGNDとラベルが付いた端子の間に外部から電圧をかけます。出力の時は、この端子とGNDとラベルが付いた端子の間にPico Wによって電圧がかかります。

https://datasheets.raspberrypi.com/picow/PicoW-A4-Pinout.pdf

# 3. GPIOからデジタル値の出力方法
(<文字列>は、実際のプログラムの中では、この部分が名前や数字などで置き換えられることを表します)

Pico W の MicroPython において、GPIO端子の１つを出力端子に設定する場合、以下の文を実行します。ここで<変数名>は、プログラム中で使う端子の名前を表します。<GPIOの端子番号>は、GPIOの端子番号を表します。
```Python
<変数名> = Pin(<GPIOの端子番号>, Pin.OUT)
```
いくつかの端子番号には名前が結びづけられていて、端子番号の代わりに、その名前を使うことができます。例えば、
```Python
led = Pin('LED', Pin.OUT)
```
は、Pico Wのボード上の緑色の発光ダイオードに接続された、GPIOの0番端子を出力(Pin.OUT)に設定し、変数 led に、その端子にデジタル出力を行うインスタンスを代入することを表します。この発光ダイオードを点灯するには、
```Python
led.on()
```
を実行します。この時、LEDが接続されたGPIO端子にHigh(1)が出力されます。
この発光ダイオードを消灯するには、
```Python
led.off()
```
を実行します。この時、LEDが接続されたGPIO端子にLow(0)が出力されます。

# 4. 電気回路入門, オームの法則
マイクロコントローラの端子は、入力のときは、外部からその端子にかかる電圧を測ることにより情報を入力します。出力の時は、内部からその端子に電圧をかけて、端子に接続されている機器に、情報を送ったり、動かしたり、制御したりします。入力のときは、端子にかかる電圧がマイクロコントローラの入力端子の最大許容電圧を超えないように注意する必要があります。出力のときは、端子を流れる電流がマイクロコントローラの最大許容電流を超えないように注意する必要があります。

端子にかかる電圧や端子を流れる電流の概略を計算するためには、簡単な電気回路に関する知識とオームの法則を知っておくと便利です。

<img width="400" alt="ohm-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/4487da0b-6fec-020b-e793-cc6bdfc53839.png">

上の図のように、電圧がV(単位はV、ボルト)の電池（電源）とR(単位はΩ、オーム)抵抗が(銅線など、電気を通す線、導線で)接続されているとき、電池と抵抗を流れる電流の大きさI (単位はA、アンペア)は、電圧値を抵抗値で割った値になる性質があります。これがオームの法則です。(導線の抵抗は0であると仮定しています。) 電流と電圧から抵抗の値を調べたり、電流と抵抗の値から電圧の値を調べたりすることもできます。なお、上の図のように電源、抵抗などの素子が接続されて電流が流れるものを、「電気回路」または「回路」と呼びます。

# 5. ブレッドボード, ジャンプワイヤ― , 抵抗 , LED の説明
今回はブレッドボードという部品に、Pico W、抵抗、LEDを挿して、これらをジャンプワイヤーで接続して、ハードウェアを作成します。

## 5.1 ブレッドボード
市販製品の電気回路では、抵抗などの部品同士を接続するために、導線が印刷されたプリント基盤(PCB)に部品を半田付けしている場合が多いです。PCBに部品を半田付けした回路は接触不良が少なく信頼性が高いのですが、これで様々な回路を、簡単に、試しに、作ってみることは困難です。
簡単に、様々な回路を試しに作ってみるためには、ブレッドボードがよく使われています。
ブレッドボードとは、部品を差し込む穴がたくさん開いていて、穴の列の一定方向が電気的につながるよう、金属のクリップが埋め込まれているものです。

ブレッドボードの詳細については、以下のリンク先を読んでください。

https://shop.sunhayato.co.jp/blogs/problem-solving/breadboard

http://www.ee.ibaraki.ac.jp/09student/Lectures/KisoDenki/BB/BB-intro.html

## 5.2 ジャンプワイヤー
ジャンプワイヤーは、ブレッドボードに差し込まれた部品同士を、接続するための、両端の部分がが剥き出しになったビニール被膜の導線です。

## 5.3 抵抗

回路を流れる電流を調整したり、電源の電圧を低くしたりするために、「抵抗」がよく使われます。抵抗は抵抗値の他に、その抵抗値の精度や、その抵抗が消費可能な最大電力が決まっています。
抵抗の詳細については、以下のリンク先を読んでください。

https://ja.wikipedia.org/wiki/%E6%8A%B5%E6%8A%97%E5%99%A8

## 5.4 LED

LED(発光ダイオード)とは、ある方向に一定以上の電圧をかけて電流を流すと、発光する素子です。ダイオードとは、一方向にしか電流を流さない（厳密には反対方向には電流が流れにくくなる）素子です。発光ダイオードはダイオードでもあるので、逆方向に（最大逆方向電圧$V_R$以内の）電圧をかけても電流が流れず、発光しません。また、発光する方向に電圧をかけても、一定以上の電圧（順方向降下電圧$V_F$と呼びます）をかけないと発光しませんし、電流も流れにくいです。また、電流を流しすぎると壊れます。壊れない最大の電流の値を、最大順方向電流、$I_F$、と呼びます。最大逆方向電圧$V_R$以上の逆方向電圧をかけても壊れる場合があります。発光ダイオードはそれにかける電圧の大きさとその時に流れる電流の大きさが比例しないので、オームの法則は成り立ちません。発光ダイオードに、順方向に$V_F$を超えた電圧を直接かけると、急に大きな電流が流れ始め、壊れる場合があります。発光ダイオードに流れる電流を制限するため、発光ダイオードに抵抗を直列に接続して、流れる電流の値を制限することがよく行われています。

発光ダイオードの極性は、リード線の長い方が+, 短い方が-となっていて、リード線の長さをみることで識別できます(+から-方向に電流を流す場合が順方向です)。

https://ja.wikipedia.org/wiki/%E7%99%BA%E5%85%89%E3%83%80%E3%82%A4%E3%82%AA%E3%83%BC%E3%83%89

順方向降下電圧($V_F$)は、使う発光ダイオードの仕様書に書いてあります。また、$V_F$を測定できるテスターもあります。以下のリンク先に発光ダイオードの仕様書の例を示します。

https://akizukidenshi.com/goodsaffix/OSR5JA3Z74A.pdf


# 6. GPIOの電気的特性

Pico WのGPIO端子は、GPIO端子と、GND(ground端子、接地端子、Common端子などと呼ぶ場合があります)との間に、入力のときは、2V以上（最大3.3V）電圧がかかっているとき、High(または1)、0.8V未満の電圧の時はLow(または0)が入力されます。(0.8Vから2Vまでのときは未定)。出力の時は、High(または1)の時、端子には 3.3V、Low(または0)の時、端子にはほぼ0Vの電圧が出力されます。出力端子に流すことができる電流の最大値（最大許容電流）は、すべての端子に出力される(または入力される)電流の合計が50mA, 1端子の出力電流は標準設定では、4mAになっています。(1mA...1ミリアンペア...は 1/1000 Aのことを表します)

https://deepbluembedded.com/raspberry-pi-pico-w-pinout-diagram-gpio-guide/

# 7. LEDを光らせるときの抵抗値の計算方法
GPIOを出力の設定にして、LEDを点灯させる場合、LEDにかかる電圧が順方向になるように、なおかつ、その電圧が順方向降下電圧$V_F$を超え、GPIO端子に流れる電流の値が、端子の許容最大電流以内に収まるようにする必要があります。
Pico Wの場合、GPIOがHighの時、3.3Vの電圧が端子とGND端子の間にかかります（この電圧を$V_H$とします）。

Pico W、ブレッドボード、発光ダイオード、抵抗(1KΩ)、ジャンプワイヤー２本を使って、以下の図のようにGPIO(この図ではGPIOの15番端子, GP15)とGND端子の間にLEDと1k(Ω)(1000Ω)の抵抗が直列に接続した場合を考えてみます。

<img width="400" alt="pico-led-09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/14532366-d735-fd87-36b9-8324c1c970cc.png">

上の図を回路図で表すと、以下のように書くことができます。

<img width="400" alt="pico-led-07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/5c29bfc2-9a1c-3283-a92b-c380757345b7.png">

GP15にHigh(1)が出力されているときは、GP15とGNDの間に3.3Vの電圧($V_H$)がかかり、下の図の左のような回路となって、電流$I=\frac{V_H-V_F}{R1}$ が流れます。発光ダイオードの順方向降下電圧$V_F$が2.1Vのとき、$I=\frac{3.3-2.1}{1000}=0.0012...$=1.2mAとなります。4mAを超えていないので大丈夫です。
GP15にLow(0)が出力されているときは、GP15とGNDの間に0Vの電圧($V_L$)がかかり、下の図の右のような回路となります。流れる電流を表す式の計算結果は負の値になってしまいますが、この式は順方向に、$V_F$以上の電圧がかかった時の電流をあらわしているので、この式にはあてはまりません。単純に、電圧がかかっていないので、電流も0になって、LEDには流れず、LEDは光りません。

![pico-led-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/30f24ce8-94d7-5c04-fe4c-61db7420d7ff.png)


https://zenn.dev/ythk/articles/ythk-raspico-led01"

# 8. テスター の使い方
## 8.1 テスターの概要

https://www.monotaro.com/note/readingseries/testerkiso/

## 8.2 電圧の測り方

https://www.monotaro.com/note/readingseries/testerkiso/0205/

## 8.3 抵抗の測り方

https://www.monotaro.com/note/readingseries/testerkiso/0204/

## 8.4 電流の測り方

https://www.monotaro.com/note/readingseries/testerkiso/0206/

# 9. 電気回路を作るときの注意（ ショート は絶対にさせないように）
オームの法則により、回路に流れる電流は電圧の大きさに比例し、抵抗の大きさに反比例します。従って、電圧がかかっている部分の抵抗が0になると無限の大きさの電流が流れることになります。実際には導線や電源もわずかに抵抗を持っているので無限の大きさの電流が流れることはないのですが、それでも大きな電流が流れて、電源が壊れたり、導線が熱くなったり、その結果、火が発生したりすることがあり、非常に危険です。Pico WのGPIOのどれかを出力に設定した時、GPIOとGNDの間が導線で直接接続されることがないように気をつけてください。ショートにならないように、Pico Wをパソコンや電源に繋げる前に、出力を設定するGPIO端子とGNDの間の抵抗が0でないことを確認することを勧めます。また、Pico Wに電源を入れたまま回路を変更すると、誤ってショートさせてしまう可能性があります。回路を変更するときは、必ず電源を外して行うことを勧めます。

もし、どこかが異様に熱くなったり、変なにおいを感じたりしたら、すぐに、PCとPico Wの間のUSBケーブルを引き抜いて、Pico Wの電源を切ってください。

# 10. 演習: Pico Wの外部に接続したLEDのＬチカプログラムの作成

(以下は、[第２回](https://qiita.com/takashiyamanoue/items/4baba8e23c86dc07962d)で説明している、Anaconda(Python), VSCode, VSCodeのMicroPicoのExtentionがインストール済みであることを前提としています。)

演習として、実際に、Pico WにLEDと抵抗を接続して、ハードウェアを作成し、これを点滅させるプログラムを作成、実行してみます。ハードウェアは「7. LEDを光らせるときの抵抗値の計算方法」に書いた回路をそのままつかうことにします。
プログラムは、第２回のPico WのボードのLEDを点滅させるプログラムをちょっと修正(led=Pin('LED', Pin.OUT)をled=Pin(15, Pin.OUT)に書き換えるだけ)すればよいです。以下のプログラムが修正したものです。

```Python
from machine import Pin
import time
led=Pin(15, Pin.OUT)
while True:
    led.on()
    time.sleep(1.0)
    led.off()
    time.sleep(1.0)
```

[第２回](https://qiita.com/takashiyamanoue/items/4baba8e23c86dc07962d)の「7. Visual Studio Code (VSCode) の起動」の説明以降に従って、上のプログラムを作成、実行します。以下の図は、MicroPicoの拡張機能をインストールしたVSCodeでプログラムを作成し、View ->MicroPico：Configure Project を実行し、VSCodeを実行しているPCと、LED, 抵抗を接続したPico WをUSBケーブルを接続したのち、Runボタンをclickして、プログラムを実行しようとしているところです。

![pico-led-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/0e79cf57-c515-b8e0-5f36-79e8ec4f7f11.png)

実行が開始されると、以下の図のようにLEDの点滅が繰り返し行われます。

![pico-led-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/baf0abe7-a99b-8c81-5d24-7af9a570789e.png)