Сьогоднішня схема – чотири світлодіоди загоряються послідовно з плавним підвищенням яскравості. Особливістю даного скрипту є використання функціїPWM модуля GPIO. Ім'я функціїPWM – розшифровується як pulse width modulation – широтно-імпульсна модуляція. Вона має два параметри – номер порту та частота.
Функція генерує так званий об'єкт, значення якого надається будь-якій змінній - наприклад, greenfrq. Змінна по суті зберігає параметри модуляції для певного порту. Змінній greefrq надається стан функції PWM для порту green=7 і частотою 50Гц. 50Гц вважається оптимальною частотою для широтно-імпульсної модуляції – людське око не може розпізнати моргання діода (вважається, що людина не розпізнає частоти від 24Гц). Подвійну частоту точно замінити буде не можна - виходить, що світлодіод, що моргає, з цією частотою здаватиметься постійно включеним. Навіщо це потрібно, якщо можна просто увімкнути діод? Про це трохи далі! greenfrq = GPIO.PWM(green, 50) На початку всі діоди вимкнені: greenfrq.start(0) Далі в тілі скрипта з використанням циклів (while, for) та додаткового методу змінюється величинаСкважності - в англ.джерелах використовується зворотна величинаDutyCycle (з вікі). У Вікіпедії про шпаруватість сказано наступне –Скважність – одна з класифікаційних ознак імпульсних систем, що визначає відношення його періоду проходження (повторення) до тривалості імпульсу. Величина, обернена шпаруватості і часто використовується в англомовній літературі, називається коефіцієнтом заповнення (англ. Duty cycle). *В анімації наочно показано що таке шпаруватість-коефіцієнт наповнення. Посилання: Добре.Вікіпедія.
Далі методgreenfrq.ChangeDutyCycle(c) – за його допомогою можна змінювати значеннякоефіцієнт заповнення. Якщо він дорівнює нулю, то ніякого сигналу подаватися на пін не буде, якщо 100, то сигнал буде постійно - аналогічно, якби діод був просто включений без будь-яких модулів модуляції. А от якщо, наприклад, 50, то половину цигла діод буде включений, половину вимкнений і при частоті 50Гц, діод моргатиме 50 разів на секунду.
То навіщо це потрібно? Особливо якщо ми все одно не бачимо моргання 50Гц? Відповідь дуже проста, почну я з кінця - raspberry pi може або подавати сигнал на пін, або не подавати. Не можна зменшити величину сигналу. Тому, наприклад, не можна змусити діод горіти слабше або двигун крутитися повільніше - тільки ВКЛ або ВИКЛ! Використовуючи коефіцієнт заповнення можна подавати сигнал лише на 50% кожну секунду, таким чином на діод або моторчик буде подаватися менше енергії і діод горітиме слабше або мотор крутитиметься повільніше.
Далі, використовуючи цикли, можна "запалити" світлодіод змінюючи коефіцієнт заповнення від нуля до 100%. Щоб ви встигли помітити затемнення, потрібно в кожному циклі залишити місце для time.sleep: for c in range(0, 100, 2): greenfrq.ChangeDutyCycle(c) time.sleep(0.03) Все те ж саме працює для “гасіння” діода, але у зворотний бік: for c in range(100, -1, -2): greenfrq.ChangeDutyCycle(c) time.sleep( 0.03) В кінці скрипту необхідно відключити запущені модулі та очистити стан пінів: except KeyboardInterrupt: greenfrq.stop() yellowfrq.stop() redfrq.stop() bluefrq.stop() GPIO.cleanup()
Сам скрипт: $ cat 1_led-dimming_with_modulation_4LEDs.py # PWM - pulse width modulation import RPi.GPIO як GPIO import time GPIO.setmode(GPIO.BOARD)
green = 7; yellow=12; red=16; blue=18 LED = [green,yellow,red,blue]