행복한 하루

라즈베리파이 제로 프로젝트(12) – Pioneer600 모듈 (LED 제어 - PWM) 본문

RaspberryPi/Raspberry Pi Zero

라즈베리파이 제로 프로젝트(12) – Pioneer600 모듈 (LED 제어 - PWM)

변화의 물결 2021. 2. 13. 01:48

 

 

안녕하세요.

 

  두 번째 시간으로 PWM으로 LED를 제어해보겠습니다. 이전에 내용도 있지만,  모듈이 바뀌었으니 다시 한번 내용 추가해서 확인해보겠습니다.

1. Pioneer600 LED 회로 확인

  - 첫 번째 시간에서는 On/Off만 확인했고 회로를 보지 않았습니다. 그래서 회로를 확인하면 아래와 같이 되어 있습니다.

  - D1 LED가 일반 핀으로 제어할 수 있게 연결되어 있고 D3는 전원과 연결되어 있고, D2는 이후 강의에 나오겠지만, PCF8574라고 해서 8-bit I/O expander for I2C-bus와 연결되어 있습니다. 그래서 나중에 한 번 더 LED 제어할 때 보게 될 것입니다.

 

LED 회로

2. 소스 확인

  - 소스를 보기 전에 하나 더 확인해야 할 것이 있습니다. 소스 구성이 wiringPi와 python으로 나누어져 있습니다.

  이것이 문제가 아니라, 아래의 라즈베리파이 제로가 핀 구성상 라이브러리 차이로 핀 매칭이 조금 다르게 되어 있기 때문에 WiringPi를 사용할 경우 밝은 파랑으로 표시된 Wiring을 핀 맵을 보아야 하고, Python의 경우 BCM 핀 맵을 보아야 합니다.

  그래서 WiringPi 인 경우 Led 제어 핀이 25번으로 되어 있고 Python인 경우 26번으로 소스가 되어 있습니다.

 

라즈베리파이 핀 구성

 

  

1) WiringPi 소스

  - int softPwmCreate (int pin, int initialValue, int pwmRange)  함수로 주기를 설정합니다.

 함수 인자를 보면 핀 번호, 초기 값(듀티값) 입니다. 조금 살펴볼 내용은 pwmRange(주기)입니다. 간단하게 보면 범위(최댓값)라고 생각할 수 있습니다. 그런데 그렇게만 생각할 것이 아니라 주파수를 고려한다면 한 번 더 생각해야 합니다.

 

  주기는 (1~1024) x 0.1ms로 생각해서 값을 넣어야 합니다. 그래서 pwmRange 값을 200이라고 한다면 200 x 0.1ms = 20ms로 주기가 생기게 되고 주파수(f=1/t)로 보면 50Hz가 됩니다.

 리턴 값으로 0이면 정상적으로 호출한 것이고 그렇지 않으면 에러 값을 리턴합니다.

 

  - void softPwmWrite (int pin, int value) 함수로 듀티값을 변경하여 펄스를 만듭니다. 듀티값을 pwmRange와 상관관계가 있어서 value의 최댓값은 pwnRange가 됩니다. 듀티값을 10을 넣으면 1.0ms의 High 신호를 만들고, 19.0ms의 Low 신호를 만들어 하나의 펄스를 만들게 됩니다.

 

  - 무한 루프를 돌면서 듀티값을 +5씩 증가하면서 LED의 밝기를 변경시키는 것을 확인할 수 있습니다.

 

  - 주기와 딜레이 값을 조금 바꿔주었습니다.

  

#include <stdio.h>
#include<wiringPi.h>
#include<softPwm.h>

int led = 25;
unsigned char i;

int main()
{
        wiringPiSetup();
        softPwmCreate(led,0,200);
        while(1)
        {
                i += 5;
                if (i > 200)i = 0;
                softPwmWrite(led,i);
                delay(50);

        }
}

 

pi@raspberrypi:~/Pioneer600/LED/wiringPi $ make clean && make

pi@raspberrypi:~/Pioneer600/LED/wiringPi $ ./pwm

 

2) Python 소스

  - GPIO 라이브러리를 사용하여 LED 26핀을 출력으로 설정합니다.

그리고 PWM을 초기화하기 위해서는 GPIO.PWM(핀 번호, 주파수) 함수로 설정합니다.

start(0) 시작 출력 듀티비를 0(Off) 상태로 합니다. 그리고 5씩 증가하며 듀티비를 5%씩 증가시켜주었다가 다시 감소시키는 로직을 수행합니다.

 

  - 키보드 인터럽트가 발생하면 PWM을 멈추게 하고 GPIO 해제해줍니다.  

  

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
LED = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)

p = GPIO.PWM(LED,50)
p.start(0)
try:
        while True:
                for dc in range(0,101,5):
                        p.ChangeDutyCycle(dc)
                        time.sleep(0.05)
                for dc in range(100,-1,-5):
                        p.ChangeDutyCycle(dc)
                        time.sleep(0.05)
except KeyboardInterrupt:
        pass
        p.stop()
        GPIO.cleanup()

  pi@raspberrypi:~/Pioneer600/LED/python $ sudo python pwm.py

 

 - 주의할 점은 bcm, wiringPi 핀 차이와 PWM 듀티를 설정하는 방법이 조금 다름으로 한번 알아보고 제어해야 합니다

 

작동 사진

3. LED 동작 영상

 

   

감사합니다.

 

 

<참고사이트>

http://wiringpi.com/reference/software-pwm-library/

2. RPi PWM 제어 종결

https://m.blog.naver.com/unonet/220509103675

3. 파이썬과 C언어 이용하여 라즈베리 파이의 GPIO 제어하기

https://m.blog.naver.com/ubicomputing/220565168709  

 

 

“쿠팡 파트너스 활동을 통해 일정액의 수수료를 받을 수 있음"

Comments