이번 포스팅에서는 라즈베리파이에서 PWM을 이용해 LED를 제어하는 실습을 진행하겠습니다.
회로도
PWM0은GPIO12,18을 PWM1은 GPIO13,19를 사용합니다.
위의 회로도에서는 PWM0을 사용하여 GPIO18 pin을 이용하여 실습을 진행하도록 하였습니다.
PWM device tree Overlay 설정
- 라즈베리파이가 pwm sysfs interface 를 지원하도록 설정
- 명령어 앞에 쉘 인터페이스 문자($, # 등) 는 쓰지 않는 것임
- > 가 아니라 >>로 입력
- 띄어쓰기 주의
$ sudo su
# echo dtoverlay=pwm >> /boot/config.txt
# reboot
- 재부팅후 ls /sys/class/pwm/를 입력하였을때 pwmchip0이 보이지 않는다면 위의 과정을 다시 진행합니다.
- /sys/class/pwm/pwmchip0 로 이동 후 LED를 제어해보겠습니다.
켜지는 지 확인해보았다면 pwmled.c 라는 c파일을 만들어 코드를 작성해보겠습니다.
#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>
#include <stdlib.h>
void ledPwmControl(int gpio)
{
pinMode(gpio, OUTPUT); /* Pin의 출력 설정 */
softPwmCreate(gpio, 0, 255); /* PWM의 범위 설정 */
for(int i = 0; i < 10000; i++)
{
softPwmWrite(gpio, i&255); /* PWM 값을 출력: LED 켜기 */
delay(5);
}
softPwmWrite(gpio, 0); /* LED 끄기 */
}
int main(int argc, char **argv)
{
int gno;
if(argc < 2)
{
printf("Usage : %s GPIO_NO\n", argv[0]);
return -1;
}
gno = atoi(argv[1]);
wiringPiSetup( ); /* wiringPi 초기화 */
ledPwmControl(gno);
return 0;
}
코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.
pi@raspberrypi:~ $ gcc -o pwmled pwmled.c -lwiringPi
pi@raspberrypi:~ $ sudo ./pwmled 1
위의 명령어를 통해 프로그램을 실행시켜 LED 밝기가 1분동안 점진적으로 변화하는 것을 확인 할 수 있습니다.
WiringPi 라이브러리 사용 이후에는 sysfs로 PWM이 제어되지 않는 오류가 있습니다.
- WiringPi 내부에서 PWM 사용을 위한 resource cleanup이 제대로 되지 않는 것으로 추정
- 다시 sysfs를 사용하기 위해서는 reboot 필요
'Embedded > Raspberry PI' 카테고리의 다른 글
OpenCV (0) | 2024.01.04 |
---|---|
ADC with SPI (4) | 2024.01.03 |
Serial Interfaces (2) | 2023.12.28 |
Raspberry PI GPIO 실습(3) (2) | 2023.12.27 |
Raspberry PI GPIO 실습(2) (0) | 2023.12.22 |