2019年6月27日木曜日

NodeMCU DevKit & MicroPythonでBlink

Lチカです。
from time import sleep
from machine import Pin

led = Pin(2, Pin.OUT)

for i in range(10) :
	led.value(not led.value())
	sleep(0.5)
ESP-12Eモジュール上のLEDを10回点滅するだけの簡単なもの。
value(0)で点灯、value(1)で消灯する配線になっています。
NodeMCU DevKitには、もう一つLEDが搭載されているのでそちらも使ってLチカチカ。
こちらも、value(0)で点灯、value(1)で消灯する配線になっているので応用。
from time import sleep
from machine import Pin

led1 = Pin(2,   Pin.OUT)
led2 = Pin(16, Pin.OUT)

for i in range(10) :
	led1.value(not led1.value())
	led2.value(not led1.value())
	sleep(0.5)
このNodeMCU DevKit上のLEDとESP-12Eモジュール上のLEDが交互に点滅。
次は、入力のテスト。
タクトスイッチを使って回路を組んでも良いのですが、NodeMCU DevKItにはボタンが設置されているので使わない手はありません。
起動時にしか有効化されず、GPIOに直結されている"FLASH"ボタンを使います。(下図赤枠)
"RST"ボタンは、押すとリセットされGPIOにも割り当てされていないので使用出来ません。
タクトスイッチは、プルアップされているので未操作時のタクトスイッチの入力値はvalue(1)となります。一方、タクトスイッチの終端はGNDに接続されているので、押下により入力値はvalue(0)へと変化する配線です。
# First version for Tactile Switch
from time import sleep
from machine import Pin

led1 = Pin(2,   Pin.OUT)
led2 = Pin(16, Pin.OUT)
btn = Pin(0, Pin.IN)

while True :
	if not btn.value() :
		led1.value(btn.value())
		led2.value(btn.value())
	else :
		led1.value(not led1.value())
		led2.value(not led1.value())
		sleep(0.4)
	sleep(0.1)
LEDが交互に点滅しているのは以前と同じですが、タクトスイッチを押すと両方のLEDが点灯した状態になります。ただし、試すとわかるのですが最大0.5秒のラグが発生します。
で、割り込み処理を組み込んだのが以下。
# Interrupt version for Tactile Switch
from time import sleep
from machine import Pin

irq_state = 1
led1 = Pin(2,   Pin.OUT)
led2 = Pin(16, Pin.OUT)
btn = Pin(0, Pin.IN)

def pressed_btn(b) :
	global led1, led2, irq_state
	led1.value(0)
	led2.value(0)
	irq_state = b.value()

btn.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=pressed_btn)

while True :
	if irq_state :
		led1.value(not led1.value())
		led2.value(not led1.value())
		sleep(0.5)
ESP8266では、Pin.IRQ_LOW_LEVELPin.IRQ_HIGH_LEVELが使えなかったのでパッチ当てのような作りになってしまいましたが、先のコードよりは少し反応が良くなったかな?
これがアリなのわかりませんが、pressed_btn関数の中でWhileを使ったループ。
# Interrupt and loop version for Tactile Switch
from time import sleep
from machine import Pin

led1 = Pin(2,   Pin.OUT)
led2 = Pin(16, Pin.OUT)
btn = Pin(0, Pin.IN)

def pressed_btn(b) :
	global led1, led2
	buf = [led1.value(),led2.value()]
	while b.value() < 1 :
		led1.value(0)
		led2.value(0)
	led1.value(not buf[0])
	led2.value(not buf[1])
	irq_state = b.value()

btn.irq(trigger=Pin.IRQ_FALLING, handler=pressed_btn)

while True :
	led1.value(not led1.value())
	led2.value(not led1.value())
	sleep(0.5)
Pythonの勉強も兼ねて触っているので、拙い部分も多いのでもっと正しいコードもありそうですし、その辺りも勉強して行かねばです。
最後に、PWMを利用したアナログ出力でのLチカ。IO16は利用不可なのでIO2のみ。
from time import sleep
from math import sin, pi
from machine import Pin, PWM

led1 = PWM(Pin(2), freq=500, duty=1023)
led2 = Pin(16, Pin.OUT)
btn = Pin(0, Pin.IN)

def pressed_btn(b) :
	global led1, led2
	led2.value(1)
	i = 5
	while b.value() < 1 :
		led1.duty( int( sin( i / 10 * pi ) * 500 + 500 ))
		sleep(0.025)
		i+=1
	led1.duty(1023)

btn.irq(trigger=Pin.IRQ_FALLING, handler=pressed_btn)

while True :
	led2.value(not led2.value())
	sleep(0.5)
タクトスイッチを押している間だけ明暗を1024階調のSinカーブで繰り返す動作。
元ネタはMicroPythonドキュメントの"Quick reference for the ESP8266"、"7.1. Fading an LED"です。最新版のサイトで見て下さい。

0 件のコメント:

コメントを投稿