Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých nožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu. Dioda tak buď svítí, nebo nesvítí – nedá se nastavit poloviční intenzita, nedá se plynule rozsvěcet nebo zhasínat.
Tuhle nevýhodu ale můžeme obejít s využitím dvou faktů. Ten první je, že diodám – na rozdíl od žárovek nebo zářivek – nevadí časté vypínání a zapínání. Opotřebovávají se spíš svícením a časem. Druhý je, že lidské oko nestačí zaznamenat pohyby a změny, které probíhají rychleji než zhruba za setinu vteřiny.
Pojďme tedy velice rychle blikat – a oblafnout tak naše oči a mozky!
from machine import Pin
from time import sleep
pin_diody = Pin(14, Pin.OUT)
while True:
pin_diody.value(0) # vypnout LED
sleep(2/100) # počkat dvě setiny vteřiny
pin_diody.value(1) # zapnout LED
sleep(1/100) # počkat jednu setinu vteřiny
Zkus si pohrát s hodnotami pro time.sleep
.
Takhle fungují prakticky všechna stmívatelná LED světla – rychlé blikání je ekonomičtější a přesnější než např. nastavování nižšího napětí.
Dokážeš napsat program, který diodu postupně, plynule rozsvítí?
Protože je takovéhle rychlé blikání užitečné ve spoustě různých situací, obsahuje MicroPython speciální funkci: umí blikat samostatně. Nastavíš, jak rychle má blikat a jak dlouho má trvat každé bliknutí, a MicroPython pak bude blikat automaticky, zatímco tvůj program se může věnovat něčemu jinému.
Téhle funkci se říká pulzně šířková modulace –
angl. Pulse Width Modulation, neboli PWM.
Z MicroPythonu jde tahle funkce ovládat pomocí třídy
machine.PWM
.
Každý objekt téhle třídy umí ovládat jednu nožičku
a dají se u něj nastavit dva parametry:
freq
– frekvence, tedy kolikrát za sekundu se LED rozsvítí a zase zhasne aduty
– anglicky duty cycle, česky střída, nastavuje „šířku pulzu”,
tedy jak dlouho bude dioda při každém bliknutí svítit.
Hodnota duty
může být od 0, kdy LED
nesvítí vůbec, do 1023, kdy svítí celou dobu.
Nastavíš-li duty=512
, bude dioda
svítit s poloviční intenzitou (512 = 1024/2).Nastavíš-li PWM(freq=50, duty=512)
, dioda bude blikat 50× za sekundu.
Vždycky jednu setinu vteřiny bude svítit a na jednu
setinu vteřiny zhasne.
from machine import Pin, PWM
pin_diody = Pin(14, Pin.OUT)
pwm = PWM(pin_diody, freq=50, duty=512)
Zkus nastavit i nižší frekvenci, třeba 3 nebo 1, ať blikání vidíš přímo!
PWM se dá zrušit metodou pwm.deinit()
.
Jako s otvíráním souborů, je dobré po sobě uklidit –
i když zatím můžeš jednoduše restartovat celé zařízení.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-jaro-2019-pondeli:micropython:6", "title": "Velice rychle blikat", "html": "\n \n \n\n <h2>Velice rychle blikat</h2>\n<p>Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých\nnožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu.\nDioda tak buď svítí, nebo nesvítí – nedá se\nnastavit poloviční intenzita, nedá se plynule rozsvěcet nebo zhasínat.</p>\n<p>Tuhle nevýhodu ale můžeme obejít s využitím dvou faktů.\nTen první je, že diodám – na rozdíl od žárovek nebo\nzářivek – nevadí časté vypínání a zapínání.\nOpotřebovávají se spíš svícením a časem.\nDruhý je, že lidské oko nestačí zaznamenat pohyby a\nzměny, které probíhají rychleji než zhruba za\nsetinu vteřiny.</p>\n<p>Pojďme tedy velice rychle blikat – a oblafnout tak naše oči a mozky!</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"kn\">from</span> <span class=\"nn\">time</span> <span class=\"kn\">import</span> <span class=\"n\">sleep</span>\n\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"c1\"># vypnout LED</span>\n <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"o\">/</span><span class=\"mi\">100</span><span class=\"p\">)</span> <span class=\"c1\"># počkat dvě setiny vteřiny</span>\n <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"c1\"># zapnout LED</span>\n <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">/</span><span class=\"mi\">100</span><span class=\"p\">)</span> <span class=\"c1\"># počkat jednu setinu vteřiny</span>\n</pre></div><p>Zkus si pohrát s hodnotami pro <code>time.sleep</code>.</p>\n<div class=\"admonition note\"><p>Takhle fungují prakticky všechna stmívatelná LED\nsvětla – rychlé blikání je ekonomičtější a přesnější\nnež např. nastavování nižšího napětí.</p>\n</div><p>Dokážeš napsat program, který diodu postupně, plynule rozsvítí?</p>\n<div class=\"solution\" id=\"solution-0\">\n <h3>Řešení</h3>\n <div class=\"solution-cover\">\n <a href=\"/2019/brno-jaro-2019-pondeli/micropython/pwm/index/solutions/0/\"><span class=\"link-text\">Ukázat řešení</span></a>\n </div>\n <div class=\"solution-body\" aria-hidden=\"true\">\n <div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span>\n<span class=\"kn\">from</span> <span class=\"nn\">time</span> <span class=\"kn\">import</span> <span class=\"n\">sleep</span>\n\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n\n<span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"mi\">0</span>\n <span class=\"k\">while</span> <span class=\"bp\">True</span><span class=\"p\">:</span>\n <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">x</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n <span class=\"n\">sleep</span><span class=\"p\">((</span><span class=\"mi\">100</span><span class=\"o\">-</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"mi\">10000</span><span class=\"p\">)</span>\n <span class=\"n\">pin_diody</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n <span class=\"n\">sleep</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">/</span><span class=\"mi\">10000</span><span class=\"p\">)</span>\n\n <span class=\"k\">if</span> <span class=\"n\">x</span> <span class=\"o\">></span> <span class=\"mi\">100</span><span class=\"p\">:</span>\n <span class=\"k\">break</span>\n</pre></div><p>Princip je úplně stejný, jen proměnná <code>x</code> se neustále mění a tím ovlivňuje\nintenzitu svícení.</p>\n </div>\n</div><p>Protože je takovéhle rychlé blikání užitečné ve spoustě\nrůzných situací, obsahuje MicroPython speciální funkci: umí blikat samostatně.\nNastavíš, jak rychle má blikat a jak dlouho má trvat\nkaždé bliknutí, a MicroPython pak bude blikat automaticky,\nzatímco tvůj program se může věnovat něčemu jinému.</p>\n<p>Téhle funkci se říká <em>pulzně šířková modulace</em> –\nangl. <em>Pulse Width Modulation</em>, neboli <em>PWM</em>.\nZ MicroPythonu jde tahle funkce ovládat pomocí třídy\n<code>machine.PWM</code>.\nKaždý objekt téhle třídy umí ovládat jednu nožičku\na dají se u něj nastavit dva parametry:</p>\n<ul>\n<li><code>freq</code> – frekvence, tedy kolikrát za sekundu se LED rozsvítí a zase zhasne a</li>\n<li><code>duty</code> – anglicky <em>duty cycle</em>, česky <em>střída</em>, nastavuje „šířku pulzu”,\ntedy jak dlouho bude dioda při každém bliknutí svítit.\nHodnota <code>duty</code> může být od 0, kdy LED\nnesvítí vůbec, do 1023, kdy svítí celou dobu.\nNastavíš-li <code>duty=512</code>, bude dioda\nsvítit s poloviční intenzitou (512 = 1024/2).</li>\n</ul>\n<p>Nastavíš-li <code>PWM(freq=50, duty=512)</code>, dioda bude blikat 50× za sekundu.\nVždycky jednu setinu vteřiny bude svítit a na jednu\nsetinu vteřiny zhasne.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">from</span> <span class=\"nn\">machine</span> <span class=\"kn\">import</span> <span class=\"n\">Pin</span><span class=\"p\">,</span> <span class=\"n\">PWM</span>\n\n<span class=\"n\">pin_diody</span> <span class=\"o\">=</span> <span class=\"n\">Pin</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"n\">Pin</span><span class=\"o\">.</span><span class=\"n\">OUT</span><span class=\"p\">)</span>\n<span class=\"n\">pwm</span> <span class=\"o\">=</span> <span class=\"n\">PWM</span><span class=\"p\">(</span><span class=\"n\">pin_diody</span><span class=\"p\">,</span> <span class=\"n\">freq</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">,</span> <span class=\"n\">duty</span><span class=\"o\">=</span><span class=\"mi\">512</span><span class=\"p\">)</span>\n</pre></div><p>Zkus nastavit i nižší frekvenci, třeba 3 nebo 1, ať blikání vidíš přímo!</p>\n<p>PWM se dá zrušit metodou <code>pwm.deinit()</code>.\nJako s otvíráním souborů, je dobré po sobě uklidit –\ni když zatím můžeš jednoduše restartovat celé zařízení.</p>\n\n\n " } } }