Изменение частоты импульсов на GPIO Raspberry Pi.

В этом видео:
– изменение частоты импульсов на GPIO пине;
– метод ChangeFrequency();
– разбор Python скрипта изменяющего частоту импульсов.

===================
Disclaimer.
Wordpress портит форматирование скрипта, а это очень важно для Python. Оригинальное форматирование смотрите по ссылке или в видео.
v41.3-script-pic
===================
Я продолжаю рассказывать о том что можно делать с GPIO портами на raspberry pi.
Сегодня о том как можно менять частоту импульсов подаваемых Raspberry pi на какой-либо пин.
Меняя частоту подаваемого сигнала во время выполения программы можно менять световую индикацию – менять частоту вспышек светодиодов(сегодня я это покажу). Можно подавать звуковые сигналы с разной частотой – например, при изменении дальности до какого-либо объекта, достижении процесса какого-либо статуса или значения… Другие возможные применение можете придумать и сами =)

Особенностью сегодняшнего скрипта является использование метода ChangeFrequency() функции PWM модуля GPIO в дополнении к уже рассмотреному методу ChangeDutyCycle().
В рассматриваемой схеме используется два пина и два диода подключённых через резисторы для ограничения тока.

В начале определяются объекты p и q функции PWM. Определяется контретный порт и частота для каждого объекта. Порт определяется через Массив LED[i], а частота выставлена в 50Гц.
p = GPIO.PWM(LED[0], 50)
q = GPIO.PWM(LED[1], 50)

Далее в первой части цикла происходит “зажигание” двух светодиодов, происходит это с использованием уже знакомого метода ChangeDutyCycle. С нуля % до 100. Оба диода плавно загораются и мы не видим морганий.
for c in range(0, 101, 2):
p.ChangeDutyCycle(c)
q.ChangeDutyCycle(c)
time.sleep(0.1)

Далее я меняю частоту подачи импульсов на диод подключённый к пину 16 с 50Гц до 10. Делается это методом ChangeFrequency:
q.ChangeFrequency(10)

На что это повлияет?
Теперь при выполнении следующего блока с оператором цикла for мы видим как жёлтый светодиод начинает загораться с заметным морганием. Красный светодиод гаснет плавно, без морганий.
for c in range(0, 101, 2):
p.ChangeDutyCycle(100-c)
q.ChangeDutyCycle(c)

Всё тоже самое происходит в обратном направлении – жёлтый светодиод гаснет с заметным морганием, а красный зажигается плавно.
for c in range(0, 101, 2):
p.ChangeDutyCycle(c)
q.ChangeDutyCycle(100-c)
time.sleep(0.1)

В последней части цикла while происходит возвращение частоты пульсации жёлтого диода к 50Гц и цикл повторяется. Мы снова не видим мерцание жёлтого диода:
q.ChangeFrequency(50)
В конце скрипта, как обычно, необходимо отключить запущенные модули и очистить состояние пинов:
except KeyboardInterrupt:
p.stop()
q.stop()
GPIO.cleanup()

На сегодня всё.
Удачи!

Сам скрипт:
“Один пин загорается и тухнет, второй в эти же циклы идёт в противофазе с частотой 10Гц.”
pi@raspberrypi:~/my_python_tests $ cat 2_led-dimming_with_modulation_2LEDs_2cycles.py
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
LED = [12,16]

GPIO.setup(LED[0], GPIO.OUT)
GPIO.setup(LED[1], GPIO.OUT)

print ("Ctrl+C exits the program")

p = GPIO.PWM(LED[0], 50)
q = GPIO.PWM(LED[1], 50)
p.start(0)
q.start(0)

try:
while True:
for c in range(0, 101, 2):
p.ChangeDutyCycle(c)
q.ChangeDutyCycle(c)
time.sleep(0.1)
q.ChangeFrequency(10)
for c in range(0, 101, 2):
p.ChangeDutyCycle(100-c)
q.ChangeDutyCycle(c)
time.sleep(0.1)
time.sleep(1)
for c in range(0, 101, 2):
p.ChangeDutyCycle(c)
q.ChangeDutyCycle(100-c)
time.sleep(0.1)
time.sleep(1)
q.ChangeFrequency(50)

except KeyboardInterrupt:
p.stop()
q.stop()
GPIO.cleanup()