2017-08-20 3 views
0

2015年8月19日現在、マスタービルドからLua 5.1.4を実行しているNodeMCUからIR情報を読み取ろうとしています。NodeMCU gpioが正しく起動しない

私はGPIOの仕組みを誤解している可能性があります。私がやっていることに関連する例を見つけるのは苦労しています。

pin = 4 
pulse_prev_time = 0 
irCallback = nil 

function trgPulse(level, now) 
    gpio.trig(pin, level == gpio.HIGH and "down" or "up", trgPulse) 

    duration = now - pulse_prev_time 
    print(level, duration) 

    pulse_prev_time = now 
end 

function init(callback) 
    irCallback = callback 
    gpio.mode(pin, gpio.INT) 
    gpio.trig(pin, 'down', trgPulse) 
end 

-- example 
print("Monitoring IR") 
init(function (code) 
    print("omg i got something", code) 
end) 

私は、低オン初期に割り込みを起動し、その後trgPulseでローからハイに交流しています。そうすることで、レベルが1から0に変わることを完全なパターンで期待します。しかし、出力はそうでない場合を示しています。

1 519855430 
1 1197 
0 609 
0 4192 
0 2994 
1 589 
1 2994 
1 1198 
1 3593 
0 4201 
1 23357 
0 608 
0 5390 
1 1188 
1 4191 
1 1198 
0 3601 
0 3594 
1 25147 
0 608 
1 4781 
0 2405 
1 3584 
0 4799 
0 1798 
1 1188 
1 2994 

だから私は明らかに間違って何かをやっているか、根本的にGPIOがどのように動作するか理解していません。これが予想される場合、低レベルまたは高レベルが変更されなかった場合、割り込みは何度も何度も呼び出されますか?そして、これが間違っていると思われる場合は、それを修正する方法はありますか?

+0

私はそのプラットフォームに精通していませんが、あなたはIR入力に騒音がないと確信していますか?私が最初にやることは、それを切り離し、入力を地面に接続し、何が起こるかを見ることです。また、そのプラットフォームではわからないが、割込みエッジを変更する一部のマイクロコントローラでは、割込みルーチンでうまく動作しない場合があります。スペア入力がIR受信機に接続し、エッジごとに設定する場合があります。 – PeterJ

+0

IR情報を読み取るとどういう意味ですか?ピン4に何を接続しましたか? – Piglet

+0

私は騒音が出るのではないかと疑っています。私はリモコンのボタンをタップした直後にデータ割り込みの変化を見るだけです。それは私のボタンプレスの持続時間の間続くので、かなり安定しているようです。 ピン4にIRレシーバが接続されています。 – holmes

答えて

0

私は明らかに間違って何かをやっているか、根本的にGPIOは、私はそれが両方の組み合わせビットだ疑い

をどのように機能するかを理解していない - 後者が前者のための原因である可能性があります。

私の説明は、私の世界ではない機械的/電子的な観点からは100%正確ではないかもしれませんが、GPIOの書き込みソフトウェアに関する限り十分であるはずです。スイッチは最終的に1になるまで0と1の間でバウンスする傾向があります。これを読む良い記事はhttps://www.allaboutcircuits.com/technical-articles/switch-bounce-how-to-deal-with-it/です。その効果は、ハードウェアおよび/またはソフトウェアを用いて対処することができる。

通常、ソフトウェアで行うには、「定まった状態」にのみ興味があるので、バウンスする信号をスキップするために何らかの遅延を導入する必要があります。 delayはセンサー/スイッチに固有の経験的価値である:私はhttps://gist.github.com/marcelstoer/59563e791effa4acb65f

-- inspired by https://github.com/hackhitchin/esp8266-co-uk/blob/master/tutorials/introduction-to-gpio-api.md 
-- and http://www.esp8266.com/viewtopic.php?f=24&t=4833&start=5#p29127 
local pin = 4 --> GPIO2 

function debounce (func) 
    local last = 0 
    local delay = 50000 -- 50ms * 1000 as tmr.now() has μs resolution 

    return function (...) 
     local now = tmr.now() 
     local delta = now - last 
     if delta < 0 then delta = delta + 2147483647 end; -- proposed because of delta rolling over, https://github.com/hackhitchin/esp8266-co-uk/issues/2 
     if delta < delay then return end; 

     last = now 
     return func(...) 
    end 
end 

function onChange() 
    print('The pin value has changed to '..gpio.read(pin)) 
end 

gpio.mode(pin, gpio.INT, gpio.PULLUP) -- see https://github.com/hackhitchin/esp8266-co-uk/pull/1 
gpio.trig(pin, 'both', debounce(onChange)) 

ノートで、そのために使用NodeMCU Luaの機能を文書化!

+0

非常に可能性があります。私はそれを試してみましょう! – holmes

関連する問題