マイクロビット(m_08)microbit.pin
pin
前回からの続きになります。
(06-8)get_analog_period_microseconds() ※pin5-16,19-20だけ
PWM 信号の周期を period にマイクロ秒単位で測定します。
返り値は16の倍数になるようです。
たぶんset_analog_period_microseconds(period)で設定できる値が16の倍数のため、返り値は256usから16の倍数になるのだと思います。
>>> from microbit import *
>>> pin8.write_analog(0)
>>> pin8.set_analog_period_microseconds(256) #256 設定可能最小値
>>> pin8.get_analog_period_microseconds()
256
>>> pin8.set_analog_period_microseconds(266) #266 が返らない(たぶん設定できない)
>>> pin8.get_analog_period_microseconds()
256
>>> pin8.set_analog_period_microseconds(272) #16の倍数なら設定値が返る
>>> pin8.get_analog_period_microseconds()
272
>>> pin8.set_analog_period_microseconds(512) #16の倍数なら設定値が返る
>>> pin8.get_analog_period_microseconds()
512
>>> pin8.set_analog_period_microseconds(522)
>>> pin8.get_analog_period_microseconds()
512
>>> pin8.set_analog_period_microseconds(528)
>>> pin8.get_analog_period_microseconds()
528
上限はなさそうな感じです。
>>> pin8.set_analog_period_microseconds(10240) #'0x2800'
>>> pin8.get_analog_period_microseconds()
10240
>>> pin8.set_analog_period_microseconds(102400)
>>> pin8.get_analog_period_microseconds()
102400
>>> pin8.set_analog_period_microseconds(65536) #'0xffff'
>>> pin8.get_analog_period_microseconds()
65536
>>> pin8.set_analog_period_microseconds(655360) #'0x63ffd8'
>>> pin8.get_analog_period_microseconds()
655360
(06-9)read_analog() ※pin0-4だけ
端子の電圧を読み取り、0 (0V の意味)から 1023 (約3.3V の意味)までの間の整数として返します。
read_analog()する前にNO_PULLに設定をした方が良いと思います。
※私の解釈のミスがあるのかも知れません。以下は参考程度としてください。
電源電圧Vccを10kΩ/10kΩで分圧点の1/2Vccをpin0に接続しています。そのためread_analogの返り値は1024/2=512になるハズです。
>>> from microbit import *
>>> pin0.get_mode() # pin0のモードは'unused'
'unused'
>>> pin0.get_pull() # pin0のプルモードは'unused'のためエラーになる
Traceback (most recent call last):
File "", line 1, in
ValueError: Pin 0 in unused mode
>>> pin0.read_digital() # pin0のモードをread_digitalにする
1
>>> pin0.get_pull() # pin0のプルモードは'1'(PULL_DOWN)になる
1
>>> pin0.read_analog() # アナログ値を読むプルダウンだと 368(誤値)が返る
368
>>> pin0.set_pull(pin0.PULL_UP) # プルアップだと 656(誤値)が返る
>>> pin0.read_analog()
656
>>> pin0.set_pull(pin0.NO_PULL) # プルなしだと 517(正値)が返る
>>> pin0.read_analog()
517
>>> pin0.get_pull() # プルモードが読めない、'unused'になっている?
Traceback (most recent call last):
File "", line 1, in
ValueError: Pin 0 in unused mode
>>> pin0.set_pull(pin0.NO_PULL) # プルなしを確認してみる>問題無い
>>> pin0.get_pull()
0
>>> pin0.read_analog() # プルなしなので516(正値)が返る
516
>>> pin0.get_pull() # プルモードが読めない
Traceback (most recent call last):
File "", line 1, in
ValueError: Pin 0 in unused mode
>>> pin0.read_analog() # プルモード?だが 516(正値)が返る
516 # モードの切替がないので問題ない
PULL_DOWN時の値を明示すると(上記ではread_digitalで代用)
>>> pin0.set_pull(pin0.PULL_DOWN) # プルダウンだと 368(誤値)が返る
>>> pin0.get_pull()
1
>>> pin0.read_analog()
368
本来、モード変更時にプルモードの設定など自動で変わってくれるはずですが・・read_analog()では変わらないようです。get_mode()の返り値に’read_analog’がないからかも知れません。
read_digital()を実行すると自動でPULL_DOWNになります。そのまま継続してread_analog()を行うと、PULL_DOWN状態で読み込むようです。ただし上記のように’unused mode’扱いになるので、実際のPULL状態は分かりません。
read_analog()を実行後に他のモードに変更しなければ、read_analog()の繰返しは問題無いようです。結局、read_analog()を実行する前にはプルモードをNO_PULLに設定した方が無難に思います。※私の解釈のミスがあるのかも知れませんので御注意ください。
(06-10)is_touched()
端子を指で触れている場合は True 、そうでない場合は False を返します。
pin0.is_touched()
セットで考えた方が良いかも? >>>> 詳細は次項に
このテストは、端子と接地(GND)の間にどれだけの抵抗があるかを測定することによって行われます。
抵抗が少ないと True の判定を返します。指での検出を確実にするには、体の別の部分、たとえばもう片方の手で GND 端子に触れる必要があるかもしれません。
(06-11)その他
プルモードについて
BBC micro:bit MicroPython ドキュメンテーション「https://microbit-micropython.readthedocs.io/ja/latest/pin.html」に端子が入力モード read_analog/ read_digital/ is_touched に変わると端子のプルモードが、各々 NO_PULL/ PULL_DOWN/ PULL_UP に自動的に設定されると記載されています。
>>> from microbit import *
>>> pin0.set_pull(pin0.PULL_DOWN)
>>> pin0.get_pull()
1 #PULL_DOWNは'1'
>>> pin0.set_pull(pin0.NO_PULL)
>>> pin0.get_pull()
0 #NO_PULLは'0'
>>> pin0.set_pull(pin0.PULL_UP)
>>> pin0.get_pull()
3 #PULL_UPは'3'
プルモードの確認
read_analog()、is_touched()後のget_pull()はエラーになる。各々NO_PULL/ PULL_UPになるハズだが、プルモードの確認はできないようです。
>>> pin0.read_digital() # high 入力
1
>>> pin0.get_pull()
1 # PULL_DOWNは'1'
>>> pin0.read_analog()
995
>>> pin0.get_pull() # read_analog後のget_pullはエラー
Traceback (most recent call last):
File "", line 1, in
ValueError: Pin 0 in unused mode
>>> pin0.is_touched()
False
>>> pin0.get_pull() # is_touched後のget_pullはエラー
Traceback (most recent call last):
File "", line 1, in
ValueError: Pin 0 in touch mode
>>>
read_digital()の場合
>>> pin0.set_pull(pin0.NO_PULL) #NO_PULL(0)に設定
>>> pin0.read_digital() #read_digitalを実行
1
>>> pin0.get_pull()
0 #NO_PULL(0)のまま保持
>>> pin0.set_pull(pin0.PULL_UP) #PULL_UP(3)に設定
>>> pin0.read_digital() #read_digitalを実行
1
>>> pin0.get_pull()
3 #PULL_UP(3)のまま保持
>>> pin0.is_touched() #touchedに変更
False
>>> pin0.read_digital() #read_digitalを実行
0
>>> pin0.get_pull()
1 #自動的にPULL_DOWN(1)になる
他モード(write_digital、read_analog、is_touchedなど)からread_digital()を実行した場合は、自動的にPULL_DOWN(1)になるようです。
read_analog()、is_touched()はget_pull()で確認できないようですが、他モードから実行した場合には各々NO_PULL/ PULL_UPになっていると思われます。 ※私の解釈のミスがあるのかも知れません。
まとめ
microbitモジュールのpinについて記載しました。read_analog()はNO_PULLに、is_touched()は PULL_UPにセットしてから使用した方が良いかもしれません。