GPIOとPWMとは何ですか
GPIOとは、プログラムから入力にも出力にも使える、マイコンの汎用のピンです。PWMは、そのピンを速く入り切りして、ライトの明るさやモーターの速さを変える方法です。
このレッスンでは、ピンを出力にして動かし、決まった周期でPWMの信号を作ります。
このレッスンのゴール
メモ
ピンを決まった周期で動かし、PWMのデューティ比を計算することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| GPIO | 入力にも出力にも使えるピン | |
| 出力 | チップがピンの高さを決める向き | |
| 周期 | 同じ動きがくり返される1回分の長さ | 16ティック |
| ティック | クロックの1歩 | |
| PWM | ピンを速く入り切りして、強さを変える方法 | |
| デューティ比 | 1周期のうち、ピンが高い時間の割合 |
学生が入力するセルは、このプレビューでは空白です。
ピンは出力にしてから使う
ピンは、ビット1つで決まります。DDR のビットを1にすると、そのピンは出力になります。
PORT のビットを1にすると、出力ピンは高くなります。PIN を読むと、ピンの今の高さが分かります。出力ピンの PIN は、チップが出している値です。
画面の語は英語です
重要
ラボのチップは、実在しないマイコンのシミュレータです。スクリプトが出す語は英語です。最後の行は、8ティックのあいだの点滅で、# が点灯、. が消灯です。
ピン0を出力にして点滅させる
docker exec jupyter python3 steps/pins.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
点滅は1ティックごとの反転
出力は、まず DDR が 0b00000001 です。ピン0が出力になりました。次に PORT と PIN が、どちらも 0b00000001 になります。
最後の行は #.#.#.#. です。スクリプトは、1ティックごとにビット0を反転しているので、点灯と消灯が交互に並びます。
PWMは高い時間の割合で強さを決める
ラボのタイマーは、0から15までを数えて、また0に戻ります。1周期は16ティックです。
TCNT が OCR より小さいあいだ、ピン5は高くなります。OCR が大きいほど、高い時間が長くなり、ライトは明るくなります。
比較値とデューティ比の表
| OCR | 高いティック | 低いティック | デューティ比 |
|---|---|---|---|
| 4 | 4 | 12 | 4 ÷ 16 = 25パーセント |
| 8 | 8 | 8 | 8 ÷ 16 = 50パーセント |
| 12 | 12 | 4 | 12 ÷ 16 = 75パーセント |
学生が入力するセルは、このプレビューでは空白です。
比較値4、8、12のPWMを見る
docker exec jupyter python3 steps/pwm.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の1行は1周期分
各行は、compare、1周期分の16文字、on、off、duty の順です。compare 8 の行は、# が8個、. が8個で、デューティ比は50です。
行の中の % 記号は、パーセントのことです。周期は16のまま変わらず、高い割合だけが変わっています。
周期10のPWMを手元で作る
period = 10 # 1周期のティック数
compare = 3 # 比較値
line = ""
for tick in range(period):
if tick < compare: # カウンタが比較値より小さいあいだ高い
line = line + "#"
else:
line = line + "."
print(line)
print("デューティ比", compare * 100 // period, "パーセント")
# 練習: compare を 7 に変えて、もう一度実行しましょう。
よくある間違い
注意
「デューティ比を上げると、点滅が速くなる」と考える人が多くいます。周期は変わりません。変わるのは、1周期のうち高い時間の割合です。点滅の速さは、周期で決まります。