[Elixir/Neurs] LED 펄스 폭 변조(PWM)
10762 단어 elixiriotraspberrypinerves
저는 올해 Nerves 사물인터넷 프레임워크와 Raspberry Pi을 배우기 시작했습니다.나는 나의 불로장생약 프로그램으로 하드웨어를 제어하는 것을 정말 좋아한다.
대부분의 초보자들은 공식 예시인 nerves-project/nerves_examples/blinky이 GPIO 플래시 보드를 통해 LED를 탑재하거나 nerves-project/nerves_examples/hello_gpio 플래시 보드에 있는 LED를 통해 시작한다고 생각합니다.그리고 사람들은 다음에 무엇을 해야 할지 생각하게 된다.
나의 예에서 나는 Pulse-width modulation (PWM)에 대해 호기심을 느꼈고 PWM을 사용하여 나의 LED를 확장하기 시작했다.
LED용 PWM
우선 나는 그것이 무엇인지 이해하기 시작했다.나는 그것의 기본 원리를 이해하기 위해 많은 문장과 유튜브 동영상을 보았다.
나는 PWM의 본질을 매우 간결하게 설명하기 때문에 아래의 위키백과 그림을 좋아한다.
긴 말은 짧게 말하자면, 그것은 일정 시간 동안의 출퇴근 시간을 통제하는 비율에 관한 것이다.
GPIO를 통해 LED를 제어하는 상황에서 우리는 PWM을 이용하여 두 가지 일을 할 수 있는데 이것은 내가 처음 그것을 배울 때 매우 재미있었다.
1. 다양한 켜기/끄기 시간을 가진 LED 깜박임
frequency (Hz)의 빈도가 비교적 낮을 때(예를 들어 1-2Hz) LED가 정기적으로 켜지고 꺼지는 것을 볼 수 있다.
따라서 duty cycle을 바꾸면 반짝이는 시간을 바꿀 수 있다.이거 재미있다.
2. LED 밝기 변경
주파수가 점점 높아지면서 예를 들어 100Hz에 달하면 우리는 어느 한 점을 초과한 반짝임을 더 이상 관찰할 수 없다.이런 주파수로
공백을 차지하는 작용은 밝기와 유사하다.다시 말하면 우리는 파의 도형 구역을 밝기로 고려할 수 있다.그들은 디지털 신호를 아날로그 신호로 바꾸는 이런 기술은 매우 흔하고 서보 모터를 제어하는 것과 같은 많은 다른 일에 응용된다고 말한다.
하드웨어 및 소프트웨어 PWM
내가 구글에서 몇 가지 문제를 검색하고 물었을 때, 나는 PWM에는 두 가지 유형이 있는데 그것이 바로 하드웨어와 소프트웨어라는 것을 알게 되었다.
소프트웨어 펄스폭 변조
소프트웨어 PWM은 고주파에 사용할 수 없는 것 같습니다. 왜냐하면 저는 많은 출처를 읽었기 때문입니다. 예를 들어 다음과 같습니다.
하드웨어 펄스폭 변조
하드웨어 PWM은 하드웨어에 따라 다릅니다.따라서 장치마다 기능이 다를 수 있다.Raspberry Pi's GPIO usage documentation에 따르면 PWM이 다음 위치에서 사용할 수 있는 가이드는 다음과 같습니다.
Pigpiox.Pwm
module에서 제공하는 기능을 통해 pigpio daemon을 사용하여 파형을 구축하고 발송할 수 있습니다.Pigpiox 장생불로 약고가 있는데 나무베리 껍질을 둘러싼 포장이다.
타겟보드에서 PWM을 지원하지 않는 경우 PWM/Servo Driver board like this에 연결하고 직렬 통신을 통해 PWM을 제어할 수 있습니다.
실험
그럼에도 불구하고 제 맞춤형 소프트웨어를 실현하는 것이 재미있어서 저는 이렇게 했습니다.제 코드 mnishiguchi/nerves_hello_pwm입니다.
git clone https://github.com/mnishiguchi/nerves_hello_pwm
이 항목은 두 개의 라이브러리를 가져옵니다.elixir-circuits/circuits_gpio-GPIO
tokafish/pigpiox- 나무베리 Pi의 pigpiod 외부 포장으로 하드웨어 PWM에 접근할 수 있습니다.
사용법
수동으로 제작된 발전기 전력 공급 PWM 스케줄러
# A GPIO pin for an LED.
gpio_pin = 12
# Get a reference to the LED.
{:ok, led_ref} = Circuits.GPIO.open(gpio_pin, :output)
# Start a scheduler with on/off callback functions and initial settings for the
# period (frequency in Hz and duty cycle in percentage).
NervesHelloPwm.PwmScheduler.start_link(%{
id: gpio_pin,
frequency: 1,
duty_cycle: 50,
on_fn: fn -> Circuits.GPIO.write(led_ref, 1) end,
off_fn: fn -> Circuits.GPIO.write(led_ref, 0) end
})
# Change the on/off ratio to 4:1.
NervesHelloPwm.PwmScheduler.change_period(gpio_pin, 1, 80)
# Change the frequency to 2Hz (2x faster than 1Hz).
NervesHelloPwm.PwmScheduler.change_period(gpio_pin, 2, 80)
# Stop the scheduler.
NervesHelloPwm.PwmScheduler.stop(gpio_pin)
** (EXIT from #PID<0.1202.0>) shell process exited with reason: shutdown
PWM 스케줄러 프로세스는 ID 등록을 사용하기 때문에 ID가 고유한 경우 여러 개의 PWM 스케줄러 프로세스를 시작할 수 있습니다.Elixir의
Process.send_after
함수는 밀리초 정밀도이기 때문에 펄스 정밀도에 제한이 있다.따라서 나는 NervesHelloPwm.PwmScheduler
에 100Hz(10ms/주기)의 최대 주파수를 넣었는데 이것은 LED의 밝기를 어둡게 하기에 충분할 것이다.만약 우리가 더욱 빠르고 정확한 PWM을 필요로 한다면, 우리는 외부 PWM 드라이버를 사용하여 목표 장치의 내장 하드웨어 PWM에 접근하는 다른 방법을 고려해야 한다.
tokafish/pigpiox의 PWM 기능을 사용하는 하드웨어 PWM
하드웨어 PWM은 LED 밝기를 변경할 때 더 부드럽게 느껴집니다.
gpio = 12
frequency = 800
Pigpiox.Pwm.hardware_pwm(gpio, frequency, 1_000_000) # 100%
Pigpiox.Pwm.hardware_pwm(gpio, frequency, 500_000) # 50%
Pigpiox.Pwm.hardware_pwm(gpio, frequency, 100_000) # 10%
Pigpiox.Pwm.hardware_pwm(gpio, frequency, 10_000) # 1%
서보 드라이브를 사용하는 PWM
지금 나는 신경으로 Adafruit 16-Channel PWM/Servo HAT for Raspberry Pi을 놀려고 한다.
나중에 쓸게요.
마침내
나는 신경을 어떻게 이용하는지 깨닫는 데 시간이 걸렸다.그러나 이것은 대량의 새로운 것을 배우고 불로장생약/신경프로그래밍을 연습할 수 있는 절호의 기회이다.가장 중요한 것은 불로장생약/신경 지역사회가 열정적이고 남을 돕는 것을 좋아한다는 것이다. 이것은 정말 대단하다.나는 내가 배운 것으로 너에게 보답할 것이다.
Reference
이 문제에 관하여([Elixir/Neurs] LED 펄스 폭 변조(PWM)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mnishiguchi/elixir-nerves-pulse-width-modulation-pwm-for-led-mj2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)