라즈베리 파이 GPIO 스피커 - lajeubeli pai GPIO seupikeo

The Speaker Bonnet is a 3W stereo amplifier add-on for the Raspberry Pi. It uses I2S, so you get really crisp audio. The digital data goes right into the amplifier so there's no static like you hear from the headphone jack. It works with any and all Raspberry Pi computers with a 2x20 connector - A+, B+, Zero, Pi 2, Pi 3.

Once soldered just plug in any 4Ω to 8Ω speakers through the terminal blocks or Adafruit’s speaker set through the JST.

To install:

curl -sS https://raw.githubusercontent.com/adafruit/\
Raspberry-Pi-Installer-Scripts/master/i2samp.sh | bash

Details

라즈베리 파이 GPIO 스피커 - lajeubeli pai GPIO seupikeo

HDMI 모니터 또는 TV에 스피커가 내장되어 있다면 오디오를 HDMI 케이블을 통해 재생할 수 있지만, 헤드폰 잭을 꼽아서 헤드폰이나 다른 스피커를 사용할 수도 있습니다. 디스플레이 장치가 스피커를 갖고 있다고 알리면 HDMI를 통해 소리를 출력하는 것이 디폴트이고, 그렇지 않다면 헤드폰 잭으로 출력됩니다. 원하는 설정이 이것과 다르거나, 자동으로 감지하는 것이 올바르지 않을 때에는, 수동으로 출력을 변경할 수 있습니다.

오디오 출력 변경하기

오디오 출력을 설정하는 세 가지 방법이 있습니다.

데스크톱 볼륨 제어

데스크톱 작업막대의 볼륨 아이콘을 오른쪽 클릭하면 오디오 출력 선택기가 나타나며, 이것을 가지고 내부 오디오 출력을 선택할 수 있습니다. 또한, USB 사운드 카드나 블루투스 오디오 장치와 같은 외부 오디오 장치를 선택할 수도 있습니다. 현재 선택한 오디오 출력 장치에 대하여 녹색 표시가 보입니다. 이것을 바꾸려면 팝업 메뉴에서 원하는 출력을 클릭합니다. 볼륨 조절과 소리 끄기는 현재 선택된 장치에 대해 동작합니다.

명령행

명령행에 다음의 명령을 입력하여 오디오 출력을 HDMI로 설정합니다.

amixer cset numid=3 2

출력이 2, 즉 HDMI로 설정됩니다. 출력을 1로 설정하면 아날로그(헤드폰 잭)이 선택됩니다. 기본 설정은 0으로 자동입니다.

raspi-config

명령행에서 다음을 입력하여 raspi-config를 실행합니다.

sudo raspi-config

다음과 같은 구성 화면이 열릴 것입니다.

라즈베리 파이 GPIO 스피커 - lajeubeli pai GPIO seupikeo

고급 옵션을 선택하고 (여기서 옵션 7로 표시되지만 사용자의 옵션과 다를 수 있음) Enter를 누르십시오.

이제 Audio(여기서는 A6으로 표시되지만 옵션은 다를 수 있음)라는 옵션을 선택하고 Enter를 누릅니다.

라즈베리 파이 GPIO 스피커 - lajeubeli pai GPIO seupikeo

기본 Auto 옵션을 대신할 수 있는 두 모드가 보일 것입니다. 모드를 선택하고 Enter를 누르고 오른쪽 화살표 키를 눌러 선택 목록을 빠져나온 다음,

sudo raspi-config
1를 선택하여 구성 도구를 종료합니다.

오디오 설정 수정을 완료 한 후 변경 사항을 적용하려면 Raspberry Pi를 다시 시작해야합니다.

여전히 HDMI를 통해 소리가 나오지 않으면

드문 경우로,

sudo raspi-config
2를 편집하여 강제로 HDMI 모드(소리를 내보내지 않는 DVI 모드와 반대)로 설정해야할 수도 있습니다.
sudo raspi-config
3를 편집하여
sudo raspi-config
4로 설정한 다음, 변경을 적용하기 위해 리부트합니다.

LED 소자를 전원에 연결할 때 일반적으로 저항을 연결한다. 전자 부품들은 각각 정격전력을 가지는데 이 허용 한계가 넘어감으로써 부품의 손상이 발생할 수 있다. 이 전력을 저항을 사용하여 제어할 수 있다.

저항의 크기는 LED의 허용 한계에 따라 다른데, 이 때 필요한 저항의 값은 옴(Ohm)의 공식으로 계산한다.

V(전압) = I(전류) X R(저항)

라즈베리 파이 GPIO 스피커 - lajeubeli pai GPIO seupikeo

일반적으로 LED 보호를 위해서 220/330Ω을 사용하여 10mA 이상의 과전류가 흐르는 것을 방지한다. 저항이 너무 크면 LED의 불빛이 약할 수 있다.

4) 저항 값 읽기

 순서

 4밴드 

 첫 번째 띠

 두 번째 띠

 -

 세 번째 띠

 마지막 띠

 5밴드 세 번째 띠 네 번째 띠

 의미

 첫번 째 숫자

 두 번째 숫자

 세 번째 숫자

 10의 제곱수

 오차 범위

 검은색

 0

 10의 0승

 갈색

 1

 10의 1승

 ±1%(F)

 빨간색

 2

 10의 2승 

 ±2%(G)

 주황색

 3

 10의 3승

 노란색

 4

 10의 4승

(±5%)

 초록색

 5

 10의 5승

 ±0.5%(D)

 파란색

 6

 10의 6승

 ±0.25%(C)

 보라색

 7

 10의 7승

 ±0.1%(B)

 회색

 8

 10의 8승

 ±0.05%(A)

(±10%)

 흰색

 9

 10의 9승

 금색

 10의 -1승

 ±5%(J)

 은색

 10의 -2승

 ±10%(K)

 없음

 ±20%(M)

※ 노란색과 회색은 고전압에서 도료의 특성을 피하기 위해서 사용 될 수 있다.

색상으로 판별이 힘들다면 멀티미터(Multimeter, 멀티테스터)라는 장비를 사용하면 편리하게 저항값을 구할 수 있다.

5. echo 명령어를 통한 LED 점멸 

- GPIO 제어를 위해 기본적인 디바이스 파일인 /sys/class/gpio를 사용

- GPIO 18번 핀 제어를 위해 /sys/calss/gpio/export에 18을 출력하면 /sys/class/gpio/gpio18 폴더가 생성됨

gpio18 핀에 echo 명령어를 사용하여 1이나 0을 출력

pi@raspberrypi ~ $ echo "18" > /sys/class/gpio/export

pi@raspberrypi ~ $ echo "out" > /sys/class/gpio/gpio18/direction

pi@raspberrypi ~ $ echo "1" > /sys/class/gpio/gpio18/value

pi@raspberrypi ~ $ echo "0" > /sys/class/gpio/gpio18/value

pi@raspberrypi ~ $ echo "18" > /sys/class/gpio/unexpect

cs

점멸하는 LED

 /sys/class

유닉스에서는 파일이나 디렉터리, 디바이스, 소켓등을 파일로 취급한다. /sys/class는 커널 내에 있는 sysfs 커널 모듈에서 제공하는 가상 파일 시스템(Virtual File System)으로 커널 영역 내에 있는 디바이스 유저 영역이 함께 작업할 수 있는 기능을 제공한다.

sysfs 커널 모듈을 사용하려면 리눅스 커널 매뉴에서 Device Drivers의 GPIO Support를 설정하고 컴파일하면 된다.

6. 파일 입출력을 통한 LED 점멸

아래 코드는 실행하면 LED에 불이 들어오고, 콘솔에 데이터를 아무거나 입력하면 LED가 꺼진다.

    fd = open("/sys/class/gpio/export", O_WRONLY); 

    write(fd, buf, strlen(buf));

    /* 해당 GPIO 디바이스의 방향 설정 */

    sprintf(buf, "/sys/class/gpio/gpio%d/direction", gpio); 

    /* LED를 위해 디바이스를 출력으로 설정: 입력의 경우 write(fd, "in", 3); 사용 */

    sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio); 

    fd = open("/sys/class/gpio/unexport", O_WRONLY);

    write(fd, buf, strlen(buf));

int main(int argc, char** argv)

        printf("Usage : %s GPIO_NO\n", argv[0]);

cs

7. gpio 명령어를 사용한 LED 점멸

1) gpio 명령어?

- 라즈베리 파이에서 GPIO를 쉽게 사용가능하도록 하는 명령어

- wiringPi 설치 필요

- root 권한이 아니더라도 실행 가능

GPIO 도움말

pi@raspberrypi ~/chapter3/wiringPi $ gpio

       gpio [-g|-1] [-x extension:params] ...

       gpio [-p]  ...

       gpio  ...

       gpio export/edge/unexport ...

cs

2) WiringPi?

- 라즈베리 파이에서 사용하는 BC2835/BCM2836의 GPIO 사용을 위한 C 언어 라이브러리

- 아두이노와 비슷한 문법으로 쉽게 프로그래밍 가능

- Git을 사용하여 설치

// 프로젝트 다운로드

$ git clone git://git.drogon.net/wiringPi

$ cd wiringPi/

// 프로젝트 업데이트 확인

$ git pull origin

// 빌드

$ ./build

pi@raspberrypi ~/chapter3 $ git clone git://git.drogon.net/wiringPi

Cloning into 'wiringPi'...

remote: Counting objects: 914, done.

remote: Compressing objects: 100% (748/748), done.

remote: Total 914 (delta 652), reused 217 (delta 142)

Receiving objects: 100% (914/914), 286.33 KiB | 126 KiB/s, done.

Resolving deltas: 100% (652/652), done.

pi@raspberrypi ~/chapter3 $ cd wiringPi/

pi@raspberrypi ~/chapter3/wiringPi $ git pull origin

pi@raspberrypi ~/chapter3/wiringPi $ ./build

NOTE: To compile programs with wiringPi, you need to add:

  to your compile line(s) To use the Gertboard, MaxDetect, etc.

  code (the devLib), you need to also add:

cs

3) GPIO 명령어 활용

GPIO 명령어 사용 예 1

pi@raspberrypi ~/chapter3/wiringPi $ gpio -g mode 18 out

pi@raspberrypi ~/chapter3/wiringPi $ gpio -g write 18 1

pi@raspberrypi ~/chapter3/wiringPi $ gpio -g write 18 0

cs

GPIO 명령어 사용 예 2

pi@raspberrypi ~/chapter3/wiringPi $ gpio export 18 out

pi@raspberrypi ~/chapter3/wiringPi $ gpio -g write 18 1

pi@raspberrypi ~/chapter3/wiringPi $ gpio unexport 18

cs

4) wiringPi를 이용한 LED 제어 프로그래밍

다음 프로그램을 작성하자.

LED 불이 5번 껐다 켜지는 프로그램이다.

    /* HIGH(1)과 LOW(0)을 1초의 딜레이를 가지면서 출력) */

        digitalWrite(gpio, HIGH);

int main(int argc, char** argv)

        printf("Usage : %s GPIO_NO\n",argv[0]);

    wiringPiSetup(); // wiringPi 초기화 함수

cs

gcc 라인 끝에 -lwiringPi를 써야 헤더파일에 제대로 인크루드된다.

pi@raspberrypi ~/chapter3 $ gcc -o wiringled wiringled.c -lwiringPi

cs

루트 권한으로 프로그램을 실행하자.

pi@raspberrypi ~/chapter3 $ sudo ./wiringled 1

cs

소감 : 후후후 완전 신기

8. 스위치와 센서를 이용한 입출력

스위치와 조도센서를 사용하여 led 출력을 조정해보자(모터, 스피커, 7세그먼트는 장비가 없으니 나중에 --;;)

1) 스위치 사용

- 스위치나 센서로 데이터를 받아오는 것이 가능

- 온도 센서를 사용한 에어컨 작동, 빛의 양에 따른 조명/커튼 여닫이 기능 등에 사용

Tack Switch(택 스위치)

- 누르지 않은 상태 on, 누른 상태이면 off로 동작(혹은 반대)

- 4개의 핀을 가지고 있다.

- 2개씩 한쌍으로 사용

아래 처럼 연결하면 된다(3.3V라는 새로운 핀이 등장...)

브레드보드를 추가로 더 구매가 필요하다 --;;
(저항도 없이 창의적으로 어떻게든 스위치 연결... 문제 생기는게 아닌가 모르것다... 일단 해보자)

(저항도 10k옴을 쓰란다... 나는 없는디 ㅋㅋㅋ)

--> test 해보니 동작은 하는데 라즈베리 파이 전원이 내려간다 --;; 치명적인 듯...

10k옴 저항을 꼭 설치하여 사용하도록 한다.

--> 찾아보니 있다 10k --;; 글씨를 못알아봤을뿐... 다시 설치 

다음 코드를 작성하여 테스트해보자.

    pinMode(SW, INPUT);    /* Pin 모드를 입력으로 설정 */

    for (i=0; i < 10000000; i++)

        if(digitalRead(SW) == LOW)    /* Push 버튼이 눌러지면 (LOW) */

            digitalWrite(LED, HIGH);    /* LED 켜기(On) */

            digitalWrite(LED, LOW);        /* LED 켜기(Off) */

int main(int argc, char** argv)

    switchContorol();        /* 스위치 사용을 위한 함수 */

cs

10k옴을 설치한 후 테스한 모습이다.

누르지 않으면 꺼지고 누르고 있어야지만 켜진다. 택 스위치가 이런 방식인가 보다. 리모컨 같은?

2) 조도 센서 사용한 LED 조작

황화카드뮴(CdS)
- 빛에 따라서 저항이 바뀌는 화학 물질

- 빛이 들어오면 저항 감소 / 빛이 없으면 저항이 증가

- 빛 감지 센서에 많이 사용

회로 구성(책에서는 스위치랑 다른 장비까지
모두 연결했으나 나는 브레드보드가 부족하니 ... 조도 센서와 LED만 부착)

    pinMode(SW, INPUT);        /* Pin 모드를 입력으로 설정 */

    pinMode(CDS, INPUT);    /* Pin 모드를 입력으로 설정 */

    pinMode(LED, OUTPUT);    /* Pin 모드를 출력으로 설정 */

    for (i = 0; i < 10000000; i++)

        if(digitalRead(CDS) == HIGH)    /* 빛이 감지되면(HIGH) */

            digitalWrite(LED, HIGH);    /* LED 켜기(On) */

            digitalWrite(LED,LOW);        /* LED 끄기(Off) */

int main(int argc, char** argv)

    /* 빛 감지 센서 사용을 위한 함수 호출 */

cs

빛이 들어오면 켜지고, 빛이 없으면 꺼진다..

(ㅋㅋㅋㅋㅋ 반대로 만들었구나 밝은 데를 더 밝게 ㅋㅋㅋ) 잘 안보인다.

9. 스피커

wiringPI를 사용하면 스피커를 통해 간단한 음악을 연주할 수 있다. 스피커는 전기적인 신호를 공기의 떨림으로 바꾸어 소리를 출력한다.

기존의 회로에 GND와 GPIO 22번 핀을 이용하여 스피커를 연결하자(스피커는 일반적으로 극성이 없다).

음악에서 사용하는 계이름은 1939년 영국 국제협약에 의해서 라(A)음을 440Hz로 하고 있고, 옥타브(Octave) 사이의 간격은 약 2배의 크기를 갖는다.

 음이름

 계이름

 주파수 (Frequency)

 C

 도

 130.81

 C#/Db

 138.59

 D

 레

 146.83

 D#/Eb

 155.56

 E

 미

 164.81

 F

 파

 174.61

 F#/Gb

 185.00

 G

 솔

 196.00

 G#/Ab

 207.65

 A

 라

 220.00

 A#/Bb

 233.08

 B

 시

 246.94

 C

 도

 261.63

 C#/Db

 277.18

 D

 레

 293.66

 D#/Eb

 311.13

 E

 미

 329.63

 F

 파

 349.23

 F#/Gb

 369.99

 G

 솔

 391.00

 G#/Ab

 415.30

 A

 라

 440.00

 A#/Bb

 466.16

 B

 시

 493.88

 C

 도

 523.25

 C#/Db

 544.37

 D

 레

 587.33

 D#/Eb

 622.25

 E

 미

 659.26

 F

 파

 698.46

 F#/Gb

 739.99

 G

 솔

 783.99

 G#/Ab

 830.61

 A

 라

 880.00

 A#/Bb

 923.33

 B

 시

 987.77

 C

 도

 1046.50

학교종 악보

'학교종'의 첫 번째 음절인 '솔솔라라'는 '391 391 440 440'으로 표시할 수 있다.

#define TOTAL  32 //  학교종의 전체 계이름의 수

int notes[] = { // 학교종을 연주하기 위한 계이름

  391, 391, 440, 440, 391, 391, 329.63, 329.63, \

  391, 391, 329.63, 329.63, 293.66, 293.66, 293.66, 0, \

  391, 391, 440, 440, 391, 391, 329.63, 329.63, \

  391, 329.63, 293.66, 329.63, 261.63, 261.63, 261.63, 0

   softToneCreate(SPKR) ; // 톤 출력을 위한 GPIO 설정

      softToneWrite(SPKR, notes[i]); // 톤 출력 : 학교종 연주 

      delay(280); //음의 전체 길이만큼 출력되도록 대기

int main(int argc, char** argv)

   musicPlay( ); // 음악 연주를 위한 함수 호출

cs

wiringPi에서 스피커 사용을 위해라는 헤더 파일 필요하며 출력되는 음의 길이는 delay()를 통해서 조정할 수 있다.

10. 온습도 센서

라즈베리 파이에서 다양한 온습도 센서(Digital Temperature/Humidity Sensor)를 사용해서 관련 값을 감지할 수 있다. 온습도 센서 중에서 SHTxx, DHTxx, RHTxx 등의 다양한 모델들이 있는데 이 중에서 DHT11을 이용해서 온습도를 측정해보겠다.

DHT11은 4개의 단자를 제공한다. 연결 단자의 방향이 잘못되면 DHT11이 타는 경우도 발생할 수 있다.

 DHT11 단자

 라즈베리파이 2

 첫 번째

 3.3V

 두 번째

 3.3V의 5k옴 저항(10k옴을 병렬)로 연결

 세 번째

 -

 네 번째

 접지

 콘덴서 읽기

 콘덴서(capicitor)는 전자회로에서 전기적 에너지를 저장하는 디바이스로 일정한용량을 가지고 있다. 이를 전류를 저장하는 Dam(댐)이라고 생각하면 이해하기 편한데, 컨덴서가 비어있는 경우 컨덴서의 용량만큼 전류를 저장하고, 컨덴서 외부의 전류가 댐에 저장된 전류의 크기보다 적으면 컨덴서에 저장한 전류를 밖으로 보낸다. 컨덴서엣 전류가 가득 차게 되면 흐르지 않는데, 이러한 성질을 이용해서 일반적으로 직류 전류를 차단하고 교류 전류만 통과시키는 데 사용한다.

컨덴서는 알루미늄 형태의 전해 컨덴서, 세라믹 컨덴서, 고체 형태의 탄달 컨덴서(Tantalum Capacitor), 가변 컨덴서 등 여러 종류가 있다. 컨덴서는 일반적으로 극성이 없는데, 전해 커넨서와 같이 극성이 있는 컨덴서도 있다. 전해 컨덴서의 경우 다이오드처럼 다리가 긴 쪽이 양극(+)이며, 음극(-)에는 보통 필름에 아래 방향의 줄 표시가 되어있다.

전해 컨덴서와 같이 컨덴서의 옆면 용량이 직접 표시된 것도 있지만, 세라믹 컨덴서처럼 세 자리 숫자만 표시만 표시되어 있는 컨덴서도 있다. 일반적으로 첫 번째와 두 번째 숫자는 값을 나타내고, 마지막 세 번째 숫자는 10의 제곱수를 의미한다. 컨덴서의 기본 단위는 피코 패럿(pF)으로 예를 들어, 컨덴서에 104라고 적혀있으면 10x10⁴pF으로 0.01μF과 같다.