AVR PCM 데이터 재생, 적외선 응용 물체인식 방문 환영장치 만들기 (AVR PCM Data Player)

2013.05.26 22:28




현재 군 복무중인 상태입니다.



한달만에 찾아오는 새로운 NEW입니다.^

그동안 너무 포스팅이 없었나봐요.. 방문자도 약간 감소한것이.. 그건 그렇고 다시 본론으로 ㅎ

이번에는 WAV파일을 바이너리 편집기로 분해해서 물체나 사람이 지나갈시에 "울산 공업고등학교에 오신 것을 환영합니다." 라고 재생하도록 만들어봤는데요.

이 것저것 바쁘다 보니 여태 만들었던 다른 작품에 비해 완성도가 크게 떨어지네요. ㄷ

그럼 바로 작품 자랑 & 소개 시작할까요? :-)



회로도 및 PCB 제작


제 첫 의도는 인체감지센서를 이용해서 원거리를 인식해 문앞, 입구에 설치해서 사람이 지나갈 때 마다 멘트가 재생되는 것이 의도였습니다.

그래서 인체감지 센서를 구매하려고 사이트를 들어갔는데... 인체감지센서가 비싸서 포기!...

그래서 생각한 방법 두번째 레이저와 CDS를 이용해서 빛이 끊기면 센서가 인식되도록 구성하자..!!

생각은 좋았으나, 또 레이저를 구하지 못해 결국 가장 흔한 ST-7L과 EL-7L로 적외선 인식 구동했습니다. 인식거리는 한 20~30cm정도 되나요....○_○

정말 응용해서 사용하실 분은 인체감지센서나 레이저&CDS를 구하시기 바랍니다.ㅎ


IR 센서 송신부 회로도

NE555로 구성되어서, 38Khz를 출력하도록 구성된 회로이나, 콘덴서와 저항 오차가 큰지 25Khz정도 출력됩니다. 계산값에 좀 많이 빗나갔습니다만, 구동에 문제가 없어서 그대로 사용합니다.




 적외선 수신 PCM 데이터 재생 회로

이 회로가 가장 중심이죠.ㅎ Atmega328 AVR 컨트롤러에 PCM 데이터를 넣어두고, PC0 포트에 입력이 들어올 때 마다 PB1핀의 기능인 PWM출력기능을 사용해서 PCM데이터를 출력합니다. 출력된 PCM데이터는 트랜지스터에 의해 증폭되어 스피커에 소리로 나오게 된답니다.^

그리고 감도를 조정하는 부분은 R2인데 가변저항으로 만들지않고 고정저항으로 설계해 감도 조정이 불가능합니다. 감도를 조정할 부분이 필요하시다면 가변저항으로 수정이 필요하답니다.^



 항상 하던 PCB 자체제작




소프트하고 고급스러운 느낌으로 사진 찍어 보았습니다. ㅎㅎ

요것을 납땜 까지 끝내면.....



여기서 뭔가 또 옥에 티가 있지 않나요.ㅎㅎ 

회로도는 ST-7L을 사용했는데 기판에 센서 부분이 KSM603이네요..ㅎ 수신 기판은 프로토 타입인데..KSM603으로 해도 인식될줄 알고 만들었다가 실패하는 바람에... 그리고 여태까지 만들고 남은 자투리 기판을 이용했더니 남는 기판이 없어서 새로 만들 수 없었습니다.

그래서 그냥 사용하다 보니 저렇게 되어버렸네요.....



만드는데 필요한 정보를 팍팍 공개합니다.


소스코드부터 PCB아트윅된 파일 까지 팍팍 공개해 드립니다. ㅎㅎ

Wave 파일을 010에디터로 분해한 다음 PCM데이터 부분만 추출하여 재생하는 소스입니다.^

다운로드 받으시면서 댓글하나라도 남겨주시면 감사하겠습니다.^

 AVR Studio용 소스코드 - 구글 드라이브로 연결됩니다.


 PCM Data Player PCB아트윅 - 구글드라이브로 연결됩니다.


 PCM Data Making Tools Kit - 구글드라이브로 연결됩니다.


 글 읽어주는 사이트 링크 - 새창으로 이동합니다.






말하는 음원파일 PCM데이터 만들기.


요청이 많으셔서 목소리 음성파일을 녹음하고, 010 에디터로 PCM 데이터를 만들어 내는 과정까지 내용 추가합니다.


 곰녹음기로 음성파일 녹음 및 WAV로 저장하기


1. 곰녹음기를 실행합니다.




2. 글 읽어주는 사이트에 접속해서 설정합니다.

Enter Text에 읽고자 하는 멘트를 Language는 Korean으로 Voice에서 원하는 목소리를 설정하고 Say It을 눌러 정상적으로 읽어지는지 확인합니다.





3. 곰녹음기로 녹음을 시작합니다.

곰 녹음기에서 녹음 버튼 혹은 F12를 누르고 녹음 파일을 저장할 위치를 지정해 줍니다.

기본값은 \내문서\곰녹음기 입니다.






4. 곰녹음기로 녹음을 완료하고 자르개를 실행합니다.


 




5. 자르개에서 음성이 녹음된 부분을 지정해서 자르기를 눌러 저장합니다.

역시 기본값 \내문서\곰녹음기에 잘라낸 파일로 저장됩니다.






6. 마지막 잘라낸 파일 열기는 아니요를 눌러줍니다.

이제 음성이 녹음된 MP3 파일 만들기가 끝났습니다.






 녹음된 MP3파일 Wav 파일로 변환하기

여기서는 MP3파일을 Wav파일로 변환하게 되는데요, 기타 MP3 to WAV 프로그램을 이용하셔서 변환하셔도 됩니다, 하지만 반드시 변환 설정은 샘플링주파수 8000~16000Hz, 채널 Mono, 비트 8Bit 설정이여야 합니다.


1. Mp3 to Wma 컨버터를 실행합니다.





2. 이전 작업에 녹음해둔 파일을 추가해 줍니다.

아까 저장해 두었던 기본값 경로는 \내문서\곰녹음기 이고, 잘라낸파일_곰녹음기_1 파일을 불러옵니다.






3. 출력 포맷을 Wav로 변경해줍니다.





4. 출력옵션 상세설정에서 출력옵션을 설정합니다.

채널은 Mono, 비트는 8Bit, 샘플링 주파수는 원하는 품질에 따라 8000Hz~16000Hz 정도 설정합니다.






5. 모든설정을 마친 후 변환을 눌러줍니다.

변환할 파일 목록의 상태바가 모두 차면 역시 파일추가했던 장소에 변환할 파일과 같은 이름으로 웨이브 파일이 새로 생성됩니다.





 010 에디터로 PCM 배열 데이터로 변환하기

이제 PCM데이터를 만드는 마무리 작업단계로 010 에디터로 헤더부분을 떼어내고 데이터만 추출해 냅니다.


1. 010 에디터를 실행합니다.





2. 010 에디터에 변환한 Wav파일을 열기 합니다.






3. 010 에디터에서 열기한 파일의 Data부분을 선택합니다.

struct DATACHUNK data의 uchar samples[배열길이]가 재생을 원하는 PCM데이터 부분입니다.

uchar samples[배열길이] 클릭해줍니다.


 



4. 선택한 데이터 부분을 복사합니다.





5. File > New > New Hex File을 눌러 새로운 빈 Hex파일을 생성하고 붙여넣습니다.






6. File > Export Hex를 눌러 C언어 배열값으로 변환합니다.





7. 변환 파일 종류를 C Code (*.cpp *.c)로 설정합니다.

설정한 후 Export를 눌러주면 지정한 폴더나 열기 했던 파일의 경로에 변환되어 저장됩니다.






8. PCM 데이터 추출이 완료되었습니다.

이제 이 파일을 pcm_sample.h 파일로 사용하시면 됩니다.

그전에 unsigned char hexData[17764] = { 라고 되어있는 부분을 

const long pcm_length = 배열길이 

const unsigned char pcm_samples[] PROGMEM ={ PCM 데이터 내용 .....};

으로 변경하셔서 파일이름을 pcm_sample.h 로 변경하시면 됩니다.



사진이 너무 많아서 작성하기 힘들었네요, 변환하는 방법이 도움이 되시기 바랍니다.



동작 영상




울산 공업 고등학교에 오신 것을 환영합니다. ~~

갤럭시 S2로 촬영했는데도 화질이 좋지 못하네요...ㄷ 

왜 휴대폰 카메라는 아무리 좋아져도 동영상 화질이 저런지 모르겠습니다.

그건 그렇고 또 하나 만들었네요 ㅎㅎ, 다음은 무엇에 도전할까요?


댓글을 달아주시는 그대는 천사~!!

BinGoon AVR/AVR 작품, Project , , , , , , , , , , ,

  1. 이전 댓글 더보기
  2. Blog Icon
    [Adios]

    일단 소스 작성하는데 에러는 없앴네요ㅎㅎㅋ 정상작동될지는 미지수입니당 ;ㅅ;
    저희가 피에조스위치를 자체제작해서(!) (예를들어) 1번 스위치가 작동하면 작은 소리를, 2번 스위치가 작동하면 큰 소리를 내도록 하는 장치를 만들어보려고 하는 거거든요ㅎㅎㅎ(이걸 응용하면 건반을 누르는 힘에 따라 소리 크기가 다른 피아노를 만들 수 있다... 라는걸 보여주기위한 데모버젼이죠ㅎㅎㅋ)
    지금 이것저것 소스도 손보고 있고 회로 구성도 하고 있는 중입니다만 어찌 될 지는 끝까지 가 봐야 알 거 같네요ㅇㅇ;;

    아 참, 수정중인 소스코드에 관련해서 질문 좀 해도 될까요? 이메일로 문의드릴게요 ㅎㅎㅎㅋ

  3. 약간 장치에 대해서 상상을 하게 되는데요....ㅎㅎ
    일단 도움이 되실지는 모르겠는데.. 네이버 메일 쪽으로 연락드렸습니다.^ 부족한 제 실력에게 질문을 해주셔서 감사드립니다.

    꼭 성공하시길 바라겠습니다.^^

  4. Blog Icon
    초보자

    답변감사드립니다^^
    제가 생각하는건 아트메가128에 sd card 1기가 한개연결하고 카드에는 텍스트파일로 pwm으로전송할 pcm 헥사데이터를저장하고 나중에 아트메가128 에서 읽어와서 스피커로출력하는겁니다 이게가능할까요? . . . 그리고 wav파일을 헥사로변경하여 작품을 만드셨던데 mp3 파일을 헥사로 변경하여도 가능할까요?
    답변부탁드리겠습니다.

  5. 안녕하세요^ 추석이 껴있는데다 이것저것 정신없어서 댓글을 늦게 봤네요^
    Wav파일 같은 경우에는 음원이 무압축된 PCM데이터가 그대로 사용되지만 mp3 파일 같은 경우는 손실 압축방식사용으로 별도의 코덱이나 소프트웨어 코덱을 구현해야 하는것으로 알고 있어요^ 이것에 대해서는 블로그 오른쪽 하단 링크중 당근이의 AVR 카페에 가시면 도움받으실수 있을 것입니다.

    저도 mp3 재생해볼려고 글 게시 해봤었는데 구조가 SD카드에서 mp3읽어와서 코덱IC에 뿌려주는 방식으로 많이 설계되 있는것 같더군요.
    저도 배우는 입장이라 많은 도움 못드리지만 작은 도움이라도 되셨기를 바랍니다^

  6. Blog Icon
    초보자

    안녕하세요? 추석 잘 보내셨는지요?^^
    저 한가지 질문드리겠습니다.
    저는 아트메가128에 크리스탈 16Mhz로 설정하고 테스트하려고하는데
    wav 파일생성 시 샘플링 주파수는 16000hz로 하고 bps 16bit 로 하면 될까요?
    아니면 그냥 예제 화면으로 보여주신거처럼 8000hz에 8bit로 해도 상관없을까요?
    만일 16mhz에 16bit 할 경우 데이터용량 크기가 더 커질까요?
    답변부탁드리겠습니다.
    아 그리고 하나더 추가드립니다.
    스피커는 어떤거 사야할까요?
    디바이스마트에 보니깐 8옴짜린데 W가 다른게 여러종류 있던데 어떤거 사면 좋을까요?

  7. 안녕하세요^ 월요일이 되서야 답변을 등록하네요^ 먼저 PCM데이터의 크기는 샘플링 비트 수와 샘플링 주파수의 증가에 따라 크기가 커지는데요. 16Bit에 16000Hz로 데이터를 만드시면 재생시간이 매우 짧아질 것 같습니다. 그리고 스피커는 Voice일 경우 일반적인 스피커 크기에서 좀 더 큰 사이즈의 스피커로 했을때 찢어지는 소음의 크기가 줄어드는 것을 확인 할 수 있었습니다^ 모바일에서 작성해서 조금 성의 없어 보일지 모르지만 만드시는데 도움이 되시기를 바랍니다^^

  8. Blog Icon
    [Adios]

    아참, 적외선센서로 ba2m ddt 라는 제품 추천요ㅎㅎ 저희가 자율로봇 만들때 공을 인식하는 센서로 사용했었거든요 ㅎㅎㅎㅎㅋ

  9. 시험 기간이라서 관리를 못했습니다. ;;
    적외선 센서가 필요한 곳이 생기면 한번 활용해 보도록 하겠습니다. ^^

  10. Blog Icon
    쌩초보

    avr 초보로서 궁금한게 생겨서 질문드립니다.
    지금 아래쪽에 AVR IR Senser PCM쪽 회로도를 보시면
    mega328회로에 연결된 T2가 수광부로 보여지는데요
    1.그럼 위쪽 회로 IR Trnasmitter에 있는 회로는 어디에 쓰이는 건지 궁금하네요.
    2.그리고 AVR IR Senser PCM쪽 회로도 보시면
    JP1에 2핀 JP2에 6핀 JP3에 2핀이 나오는데요
    JP3는 스피커를 연결하는걸로 보이고
    JP2는 UART통신을 하기위해 쓰이는거같은데
    JP1은 어디랑 연결하는 건가요?
    3.그리고 8MHz의 크리스탈을 달아주셧는데
    328이 8MHz라서 그런건가요?

    한쪽벽면만 수광부 발광부를 만들어 사람이 지나가면 음성이나오도록 하고싶은데 조언좀 부탁드립니다.

  11. 안녕하세요.^ 늦었지만 바로 답변드리겠습니다.

    1. IR Transmitter는 송신부로 만들었구, 각각 왼쪽에 송신 오른쪽에 수신을 만들어서 단순히 적외선이 차단되면, 수신부 쪽에서는 이것을 인지해서 멘트가 나오도록 되어있습니다.

    2. JP1은 PWR로 5~6V의 전원, JP2는 6핀으로 Atmega328에 프로그램을 넣을 때 사용하는 ISP핀입니다. 그리고 JP3은 아시는 대로 스피커에 연결하는 단자랍니다.^

    3. Atmega328은 16Mhz까지 안정적으로 사용가능한 MCU인데요, 구지 8Mhz를 사용한 이유는 8Mhz에서 만들어진 PCM데이터의 샘플링 주파수를 맞추기가 용이하기 때문입니다. 제 PCM데이터는 8000Hz의 샘플링 주파수를 가지는데요, 이것은 다시말하면 125uS마다 그때의 전압값을 저장했다는 뜻이 됩니다. 이 것을 재생하려면 다시 125uS마다 그 때에 맞는 전압을 출력해 주어야 하는데, 125uS에 근접하게 맞추기가 용이한게 8Mhz OR 16Mhz라서 그렇게 사용하게 된것 같습니다.

    그리고 저는 부품이 비싸서 간단하게 ST-7L과 EL-7L로 송수신부를 분리해서 제작했는데요, 이것을 인체감지 센서로 대체해서 한쪽으로 만들어 두시면 됩니다. 인체감지센서도 적외선으로 동작하긴 하는데, 인체에서 발생하는 미세한 적외선을 인지하여 사람이 지나가는 것을 인식하는 센서입니다. 사용된 곳은 아파트나, 빌라에 사람이 있을 때 천장에 불이 켜지는 그 센서로 아시면 되겠습니다.^ 도움이 되셨기를 바랍니다.^

  12. Blog Icon
    질문자

    소스코드 변경하지않고 128로도 작동하나요?
    위쪽 ljjk674님이 글쓰신걸보니
    코드비전으로 만든소스중에 클럭은 16메가로주셧는데
    아래 디파인 샘플 레이트는 8메가로 설정되어있는데 상관없는건가요?

  13. #define Sample_Rate는 딱히 중요한 값이 아니라, 사용하는 PCM데이터의 샘플링주파수를 기록해 놓기 위해서 입력해 둔것 같습니다. 오픈소스라 기재되어있었는데, 수정 사용하여 따로 제거하지는 않았구요. Ijjk674님도 동일하게 8000Hz의 샘플링시간을 주었는데.. 16Mhz로 사용해도 정상적으로 작동하게 되는 이유는 타이머 카운터에 있습니다. 타이머 카운터 0 SETUP에 보시면, TIMSK=1로 클럭을 그대로 입력받고, 256번 카운팅 되면 인터럽트로 점프하는데요. 이 때 원래 값인 8Mhz의 경우 0.000000125초 * 256 으로 0.000032초가 됩니다. 이 때 ISR(TIMER0_OVF_vect)로 점프하게 되면 sample_count--; 구문이 있는데요. 이것이 0이 되어야지 if(sample_count == 0) 조건을 만족하게 되어 아래 구문을 실행하게 됩니다. 그런데 원본소스는 sample_count의 초기값이 4이므로, 4번 반복하게되면 0.000032 * 4로 0.000128초로 125uS에 근접한 값에 맞춰서 다시 재생될수 있도록 되는 것을 알수 있습니다.

    그럼 16Mhz의 경우는 클럭을 그대로 입력받으므로 1/주파수로 주기값을 구합니다. 0.0000000625초가 나오고 이값이 256번 카운팅 될 때 interrupt로 점프 하므로 0.000016초가 나오고, Ijjk674 님이 만드신 소스는 sample_count가 8이므로 8번 카운팅을 추가로 해준다면 샘플링 주파수는 0.000128초로 똑같이 나오게 됩니다. 따라서 문제없이 재생이 가능하게 되지요.^

  14. Blog Icon
    초보탱큐

    안녕하세요.
    이리 좋은 정보가.........
    정보 찾다 보니 여기까지 왔는데, 지난번에도 뵈었었는데.
    반갑기도 하고 기쁘기도 하고........
    이걸(음성출력문제) 어찌해야 하나 하고 한참 고민하고 있었는데.
    너무 너무 감사합니다.
    답변도 친절히 모두 해주시고, 게다가 정보도 주시고, 모르면 알려주시고.......
    고맙다는말과 칭찬만 하고 싶네요.
    오늘부터 또 새로운 도전입니다.
    저는 atmega8/codevision만으로 구동하려고 하는데 가능할까요?
    모르면 많이 물어볼겁니다. 용서하세요. 감사합니다.

  15. 학생이라 답변주기가 긴 것이 불편하지 않으시다면, 크게 어려움 없을 것 같습니다.^^ 그리고 Atmega8로는 PCM데이터를 재생하기에는 플래시 메모리용량이 부족할 것같습니다. 그래서 Atmega328이나 플래시메모리가 좀 큰 AVR로 만드시는 것을 권장드립니다.^^, 컴파일러는 두가지 어떤것을 사용하시건 문제가 없습니다. ㅎㅎ
    그리고 저도 배우는 학생입니다.^ 감사까지는 너무 부담스러워요 ㅎㅎ

  16. Blog Icon
    쌩초보

    적외선센서를 한쪽에 설치했구요 아트메가 128로 구현하는데 성공했습니다~
    현재 적외선 센서에 손을 가져다되면 음성이 출력되는데
    좀더 나아가 손을 가져다되면 음성1이 다시 손이 빠지면 음성2가 출력되도록하고싶은데
    아트메가 한개로 가능할까요? 조언좀해주세요~

  17. 안녕하세요.^ 바로 답글 드리겠습니다. PCM샘플을 다른 배열로 두개 지정해놓고 센서를 2조 설치 후에 인식 순서에 따라 타이머/카운터 인터럽트 처리 부분에 조건문을 넣으면 어떨까 싶습니다만 저도 시도해 보지 않아서 동작이 될지는 장담할수가 없겠습니다. 빈약하지만 만드시는데 도움 되시기 바랍니다 :)

  18. Blog Icon
    초보남

    안녕하세요?
    제가 지금 atmega128로 해서 pwm으로 스피커를 이용해서 소리를 내려고 합니다. 그래서 BinGoon님의 회로를 참고하여 동일하게 회로를 구성해서 빵판에 테스트해봤습니다.
    그런데 소리가 너무 작게 들리고, 스피커의 저항이 계속 뜨거워져서 질문드립니다.
    2S3205 트랜지스터를 구매했는데 회로도는 npn형 방식인데 제가 산건 pnp형 방식인거같습니다.
    트랜지스터 다리 3개를 어떻게 연결해야하는지요? 그리고 스피커 8옴1W 삿는데 납땜할수있는 핀이 총 4개 있습니다.
    여기서 5V로 연결하는 다리랑 트랜지스터로 연결하는 다리가 어떤건지 알 수 있을까요? 조언부탁드립니다.

  19. 2SC3205라면 NPN타입이 맞습니다. 펑평한 면에서 봤을때 전면에 C3205라고 적혀있다면 여기서 C가 NPN타입을 의미합니다. 연결하실때는 역시 평평한 면에서 보았을때 왼쪽 다리 부터 ECB순이고, 회로도 기호에서는 화살표 있는 쪽이 E 없는 쪽이 C 중간이 B입니다. 트랜지스터를 알맞게 연결했음에도 불구하고 저항쪽에서 발열이 일어난다면 저항의 용량W 및 값을 흐르는 전류량에 따라 변경하셔야 할 것 같습니다^ 도움이 되셨기를 바랍니다^

  20. Blog Icon
    초보남

    답변감사드립니다.
    말씀해주신대로라면 E는 GND, C는 스피커, B는 저항 연결해서 포트 연결인데 해보니깐 소리가 안납니다...
    그래서 제가 임의로 여기저기 꼽아 보다가
    E(왼쪽다리)에는 GND, C 중앙다리 에는 128 pwm 출력포트
    B 오른쪽다리에는 스피커 연결했습니다.
    그러니깐 소리가 아주 작게 들립니다.
    지금 C 랑 B가 바뀐거같습니다...
    왜이런걸까요?...
    그리고 스피커에 납땝하는게 4개 있는데 이거는 방향없나요?...
    답변부탁드리겠습니다.

  21. 안녕하세요^
    주말이 되어 좀전에 만들어둔 PCM Player를 모두 꺼내서 테스트 해봤는데요. 470옴 저항에서 발열이 발생하지 않고, 트랜지스터도 문제가 없습니다. 혹시 C3205가 문제인지 확인 할 수 있도록 다른 트랜지스터가 있다면 IC(컬렉터전류)가 1A 정도 되고, Hfe(증폭도)가 100정도 되는 트랜지스터로 변경해서 동작해 보시기를 바랍니다. C3205는 혹시 제조사에 따라서 트랜지스터 핀아웃이 다를 수 있으니, 구매하신 트랜지스터 제조사의 부품정보(데이터시트)를 참고 해 보아야 할 것 같습니다. 일반적으로는 ECB 순서로 대부분 사용되고 있어서요.^ 그리고 스피커는 양쪽에 + 표시 -표시 된 곳 2곳만 납땜해서 선을 뽑아내시면 된답니다.^ 별도의 극성은 없어서 그냥 연결하시면 되구요.^

  22. Blog Icon
    초보남

    답변감사합니다
    한가지궁금한점이 있습니다
    스피커 크기에따라 소리가 크고작고 그런가요?
    제가산건 천오백원짜리 동전크기 두 세배짜린데 소리가너무작아요
    혹시 작품동영상에 나와있는 스피커 어디서구매하셨는지요?

  23. 제가 사용한 스피커는 구매한게 아니고 버리려던 라디오에서 분해 해서 만들었습니다. 스펙은 4옴 1~2W 짜리이구요. 스펙이 그다지 중요한게 아니라 울릴수 있는 뒷면의 공간이 중요한 것 같습니다.

    저도 제작 중에 다음 링크와 같은 타입스피커 http://www.eleparts.co.kr/EPX38GWC를 사용해 보았는데, 유독 소형에 겉면이 필름으로 덮여있는 스피커에서만 소리가 너무 작게 나오는 것을 알 수 있었습니다. 그래서 일반적인 뒷면이 조금 튀어나와 있는 타입을 사용하는 것이 맞는 게 아닌가 싶습니다. 부족하지만 도움이 되셨기를 바랍니다.^

  24. Blog Icon
    이은경

    안녕하새요??? 이 작품을 한번 구현해 보려고 합니다
    혹시 궁금한 점 여쭤 보고 싶은게 많은데 혹기 카톡 아이디 알려주실수 있으세요?? 제거 또 여자라서 이런부분이 약하네오 제발 부탁드립니다^^ 사기 이런거 절대 아니구요

  25. 안녕하세요.^
    답변이 늦어져서 죄송합니다. 먼저 카카오톡은 개인적인 용도로 사용하고 있어서 알려드리기 곤란하구요. 이메일로 질문 보내면 스마트폰으로 계속해서 동기화 되고 있기 때문에 바로 답변 드릴수 있습니다. 그래서 오른쪽 상단 프로필 바에 기재되어있는 이메일로 보내주시면 되겠습니다. 감사합니다.^

  26. Blog Icon
    이은경

    알겠습니당~~^^

  27. Blog Icon
    이은경

    안녕하세요ㅋㅋㅋ 죄송한데 원리좀 자세하게 알랴주실수 있으세요?????

  28. 메일로 따로 답변 보내 드렸는데, 여기 댓글도 달려있어서 추가로 입력해 둡니다.^ 그리고 댓글 중 유사한 댓글이 많아서 동작원리에 대해 추가로 알고싶은 부분은 댓글을 참고하시면 도움이 되실것 같습니다.
    동작원리는 일단 기본베이스가 소리는 주파수이고 전자와 전기의 주파수란 시간에 따라 전압이 변화하는것을 의미합니다. 이 때 PCM데이터를 추출한 웨이브파일의 샘플링 주파수가 8000Hz이고 샘플비트가 8Bit라면 주기는 1/주파수 이므로 125uS마다 전압이 변하는 256등분된 신호의 데이터로 이것이 PCM데이터 이게 됩니다. 이것을 AVR의 메모리에 저장시켜두고 다시 디코딩하는것은 타이머카운터0오버플로우로 다시 125uS에 근사한 시간을 만들어 타이머카운터1로 8bit PWM기능으로 125uS마다 전압의 변화를 줘서 원래의 신호로 재생하게 되는 것입니다.

    만드시는데 도움 되셨기를 바래요.~^

  29. Blog Icon
    만들자

    수고많으십니다.
    제가 블로거님 회로를 참조해서 atmega128에서 pwm으로 스피커로 출력가능하도록 하였습니다.
    현재 8옴 10W 스피커로 했습니다.
    스피커는 이대로 두고 지금 소리 크기를 더 크게 할 수 없나요?
    전압은 5V입니다. 12V로 해도 소리가 비슷하네요 트랜지스터로 증폭해야할까요?
    도움부탁드립니다.
    수고하세요.

  30. 안녕하세요.^
    혹시 전원의 전압을 12V로 한것인가요? 스피커를 통해 연결되는 컬렉터 단의 VCC에만 12V를 입력시켜 주신건가요?
    전원의 전압은 무조건 3~6V 이내로 사용해 주셔야 하고, 입력을 컬렉터 단에 12V 입력했을 때도 소리크기가 향상되지 않는다면, OPAMP를 통한 비반전 전압증폭을 해서 출력해야 할 것 같습니다. 부족하지만 도움되시기 바랍니다.^

    ps. 댓글 입력후에 9V 건전지 2개 직렬연결로 테스트해 보았는데, 스피커와 연결되는 VCC단에 18V를 입력했을 때 불륨이 올라갑니다. 하지만, 크게 향상되지 않기 때문에 큰 소리를 원하시면, LM386 같은 앰프 IC로 회로를 구성해서 출력을 높이시기 바랍니다.^

  31. Blog Icon
    김찬섭

    안녕하세요!! 블로거님의 자료를 참조하여 똑같이 avr pcm 데이터 재생 장치를 만들었는데요,
    avr 328에 소스를 넣는것까지는 성공을 했는데, 스피커에서는 여전히 울산공업고등학교에 오신것을
    환영합니다. 라는 멘트만 나오네요.
    블로거님이 캡쳐 해놓은대로 010에디터로 pcm_sample.h 를 만들어서 교체를 했는데도 말이죠..
    여기는 안나와 있는데 혹시 소스파일에 다른 부분을 손봐야 하나요?
    어떻게 해야 막막해서 .. 도움 부탁드릴꼐요 ㅠㅠ

  32. 안녕하세요.^
    개인적인 사정이 있어 답변을 늦게 작성드립니다.
    먼저 pcm_sample.h 파일의 PCM데이터를 변경하셨다면, 소스코드를 새로 빌드 하셨는지 확인이 필요해 보입니다. 따라서 AVR Studio 4에서 Build All을 눌러 새로 생성된 Hex파일을 다운로드 해보시기 바랍니다.^ 혹시 더 필요한 정보가 있다면 연락 바랍니다.^

  33. 최소 주기를 31.25Khz 로 만들고, PWM 폭을 바꿔주는 주기는

    인터럽트 서비스 루틴에서 4번을 카운트하니까 31.25 / 4 = 7.8125Khz 가 됩니다.

    즉 7.8125Khz(약 8Khz) 마다 PWM 폭을 PCM sample 어레이에서 읽어온 후 OCR1A 레지스터에

    써넣어 바꿉니다.

  34. 안녕하세요.^ 먼저 의견 제공 감사드리구요.
    2014년 새해 복 많이 받으시기 바랍니다.
    의견 주신점도 맞을지 모르겠으나 제가 이해한것은 PWM폭은 CTC모드에 의해서 OCR1A레지스터값과 비교해서 변경되게 됩니다. 그리고 다시 PCM데이터를 아날로그신호로 복조하는 주기는 타이머/카운터0번 인터럽트에 의해 결정되며, 8Mhz 크리스탈의 주파수를 입력으로 받았을 때 1/8000000 = 0.000000125s, 이것을 타이머/카운터0번 인터럽트는 256번 카운팅했을 때 ISR(TIMER0_OVF_vect) 부분으로 점프하므로 0.000000125 x 256 = 0.000032s, 그리고 인터럽트 벡터 루틴으로 점프해서 4번은 다운카운팅하므로 0.000032s x 4 = 0.000128s 라는 최종 시간이 나오게 됩니다. 그 때 마다 배열 값을 플래시에서 읽어 OCR1A 레지스터에 작성중인 루틴으로 보아서 128uS마다 8Bit값의 PWM 펄스폭변조를 통해서 전압값이 변화하므로 128uS마다 점을 찍어 전압그래프를 그려보았을 때 아날로그 파형이 나오므로 복조되었다고 판단됩니다.^ 그리고 31.25Khz라는 주파수는 타이머/카운터1번을 사용해서 PWM 펄스폭 변조시에 듀티비가 100%가 되면 나오는 펄스 주파수를 의미하는 것으로 보입니다.^

    의견 제공 감사하구요, 제가 이해한 것이 틀리다면 정정하도록 하겠습니다.^

  35. Blog Icon
    열혈

    안녕하세요? 2014년 새해 복 많이 받으세요~
    제가 BinGoon님 자료를 참고해서 pwm으로 스피커로 음성 파일을 출력하는기능을 만들었습니다.
    일단 따라 하면서 만들긴 했는데 막상 만들고 나니 왜 이게 이렇게 작동됬을까? 라는 생각이 들었습니다.
    그래서 제가 pwm 자료를 찾아보니깐 듀티비 라고 해서 듀티비에 따라 출력 전압의 높고 낮음을 조절한다라고 봤습니다. 하지만 제가 이게 어떤 부분이 스피커랑 관련 있는지 이해가 안되네요..
    실례가 안된다면 pwm이랑 스피커 부분에 대해서 자세한 설명 부탁 드려도 될까요?...
    도움 부탁드리겠습니다.

  36. 안녕하세요^ 2014년 새해복 많이 받으시기를 바랍니다.^^
    먼저 전자에서 아날로그 신호란, 단위시간당 연속적으로 변화하는 신호를 의미합니다. 이 뜻은 예를 들어 설명하자면 1초에는 전압이 0V였고, 2초에는 1V 3초에는 2V 4초에는 3V 5초에는 4V 6초에는 5V 7초에는 4V 8초에는 3V 9초에는 2V 10초에는 1V 11초에 0V 라면 이 것을 1초마다 전압에 대한 점을 찍어 그래프를 그려보면 삼각형 모양의 삼각파 신호모양이 나오게 됩니다. 이것은 사실 디지털로 표현한 아날로그 이긴 하지만 아날로그는 측정할수 없을 만큼 세밀하게 전압이 변하고 있다고 생각하시면 되겠습니다.^

    그러면 우리가 말하는 음성도 어떤 파형, 진동에 의해서 생성되는 것인데요, 이것을 디지털 신호로 만들기 위해서 샘플링 주파수(주기)라는 시간마다 전압값을 몇 비트 단위로 저장합니다. 그래서 만들어 지는 데이터가 PCM 데이터이고, 이것을 복조하려면 다시 샘플링 주파수(주기)라는 시간 마다 저장된 데이터 만큼의 전압을 변화시켜 주어야 단위시간마다 그래프를 그려보면 파형이 생성되겠지요!!

    그래서 예제에서는 PWM 펄스폭 변조를 통해서 입력받는 5~6V전압을 256등분 하여 전압을 세분화 합니다. 5V 일때 256등분 되면 1당 약 0.019V 값을 가지게 되는군요, 무튼 PWM은 AVR에서 OCR1A레지스터 값에 입력해주는 값에 의해서 256등분으로 0~100%까지 출력할수 있고, 그 원리는 만약 OCR1A에 1이라는 값을 입력해 준다면 매우 짧은 시간동안 반복해서 1만큼은 5V신호를 출력합니다. 그리고 255만큼은 신호를 출력하지 않는다면, 너무 출력 변화 속도가 빠르므로, 우리가 측정기로 측정했을 때 약 0.019V가 출력되게 되는것입니다.

    이것을 위에 말한 샘플링 주파수(주기)마다 저장된 데이터 8Bit데이터 값만큼 PWM 변화를 주게되면 샘플링 주파수(주기)마다 전압값을 점을 찍어보면 다시 파형이 생성되게 되지요.!!

    그리고 스피커는 나타나는 파형을 고정자석 옆에 감겨있는 코일에 전압변화에 의한 (전자석이 되었다 안되었다)하는 반응으로 떨림을 일으켜서 소리를 발생하는 부품입니다.^^
    도움 되셨기를 바라겠습니다.^

  37. Blog Icon
    열혈

    답변 감사합니다.^^
    한가지만 더 질문드리겠습니다.
    저는 ATmega128에서 만들어서
    TCCR1B의 설정값을
    // 분주비 : clk/1 = 16MHz
    // 16MHZ 로 해서 16 / 256 = 62.5kHz
    으로 했습니다.
    이렇게 해서 음성 출력하는데는 문제가 없었습니다.
    BinGoon 님 께서는 8MHz로 31.25kHz 로 출력하셨는데
    여기서 31.25kHz와 62.5kHz의 차이가 어떤 의미를 가지는지 궁금합니다.

  38. 네. 빈군님도 틀린말이 아닙니다. ^^

    제가 이해하기론. 이렇습니다.

    TCCR1A = (1<<COM1A1) | (1<<WGM10);
    TCCR1B = (1<<WGM12) | (1<<CS10);

    여기서 TCCR1A와 TCCR1B에 씌어진 값은
    31.25Khz 주기로 PWM 파형을 발생하라는 것입니다.
    분주비가 1(no prescale)이므로
    8Mhz / 255 + (1:그 다음주기) = 31.25Khz 가 되죠.
    이 부분에서 PWM 주기에 관련된 것은 완전히 끝납니다.
    ---

    그리고...

    TCCR0B|=(1<<CS00);
    TCNT0=0;
    TIMSK0|=(1<<TOIE0);
    sample_count = 4;

    이 부분은 PWM 펄스에 그 폭을 써 넣는 주기를 정해주기
    위해 타이머 카운터 0을 사용합니다.
    여기도 마찬가지로 31.25Khz를 4번 카운트해서 7.8125Khz를
    만듭니다.
    -------

    이 소스에서는 PWM 파형을 31.25Khz 속도로 발생시키면서
    PCM data는 7.8125Khz 속도로 써넣고 있죠.

    물론 스피커 출력단자에서 보면 똑 같아 보입니다.
    (PWM 8Khz, PCM data write 7.8125Khz)는
    (PWM 31.25Khz, PCM data write 7.8125Khz)와
    같습니다.

    빈군님이 처음부터 소스 설명을 저렇게 했더라면
    좋았을듯 합니다.

  39. PWM 폭의 값을 써넣는 시간을 주기로 표현한것이 아니라 주파수로 표현하여 주셨네요. 처음에는 무슨소리인가 했습니다. 또한 PWM 8Khz와 31.25Khz 주파수에 대한 설명도 도움이 됬습니다. DAC에서는 단순히 전압의 변화를 표현하므로, PWM의 주파수는 별로 상관이 없을 것 같네요. :>

    포스팅 본문에서는 별도의 설명을 하고있지 않지만, 다음 답글 부터 참고해서 작성하도록 하겠습니다.^ 지원감사드립니다. 그리고 고등학생이라 아직 부족한 부분이 많습니다, 혹시 대학생이나, 연구 관련직에 계신 분인가요?

  40. Blog Icon
    건이

    안녕하세요^^ 처음뵙습니다.
    이제 막 전자분야를 공부하려는 입문하려는 왕초보로서 이런 섬세하고 배려있는 설명에 정말 감사합니다.
    덕분에 이작품을 한번 무작정 만들어보고 싶은 강한욕구가 생기네요.

    그런데, 제가 ORCAD 16.6 버전을 사용중인데.. 공개하신 PCB 파일을 열어볼려고 하니
    ERR0R(SPMHDB-228):The database is corrupted. It may have been
    copied from a different architecture using ASC2 mode... copy using binary mode.
    라고 에러가 뜨네요. 초짜라서 무슨오류인지 모르겠네요.
    아무래도 배우는입장에서 직접 그려보는게 좋겠죠? 그래도 무슨오류인지 아시면 도움부탁드립니다.

    그리고 PCB를 손수제작하시는거 처음봤는데.. 마냥 신기하네요.
    BinGoon님 처럼 혼자 회로를 그리고 PCB까지 만들고 납땜까지 가내수공업을 해보고 싶은데,,
    PCB 제작방법에 대해 설명 좀 부탁드릴게요.

    ( 아!! 그리고 ATmega328.. AVR계열이 아닌 8051 마이컴계열로도 동작이 가능할지 궁금하네요)

  41. 안녕하세요.^^
    제가 직장에서 근무를 하게 된 터라 빠른 답변은 조금 어려워 졌지만, 문제 없다면 계속 연락드리겠습니다. 먼저 블로그에 업로드 되어있는 모든 PCB 레이아웃은 EAGLE CAD라는 프로그램 기반으로 그려졌기 떄문에 ORCAD로는 열리지가 않습니다. 그래서 EAGLE CAD를 이용하셔서 그려서 거버로 만드신다면, ORCAD Layout에서 열기가 가능하답니다.^

    그리고 PCB 제작은 먼저 직접 집에서 하는 방법은 두가지 방법이 있는데요, 토너로 PCB제작용 기판에 다리미로 열을 가해 전사시켜서 제작하는 방식과 감광PCB라고 PCB제작용 기판에 초록색으로 자외선에 반응하는 물질이 발라져있는 PCB기판이 있는데요, 이 기판의 경우는 만들고자 하는 패턴을 OHP필름같은 투명한 필름에 인쇄한 후 감광기판에 초록색 부분 위에 적당히 올려서 태양 빛이나, 자외선등으로 적절한 시간동안 쬐어주면 패턴이랑 자외선을 맞은부분이 서로 다른색을 띄게 됩니다. 여기서 현상액에 기판을 담궈 천천히 흔들어 주셔서 자외선을 쬔부분을 제거해 주시고 이 후 과정은 전사PCB, 노광 PCB 모두 에칭액에 담구어 불필요한 구리부분을 제거해 준 다음에 드릴을 이용해 홀을 뚫어 가공하시면 됩니다.

    혹시 실크스크린이 필요하다면 토너로 전사하여 TOP면에 전사할수도 있구요.^^ 온라인이라서 답변에 한계가 있네요, 정보 제공이 부족해서 죄송스럽습니다.

    마지막으로 질문주신 8051의 경우 8051은 입력받는 클럭 대비 실제 타이머/카운터 동작시에 1카운팅을 세는데 클럭을 분주되어 입력받는다고 들었어요, 그래도 만든 PCM데이터의 SAMPLE RATE(8Khz)를 다시 소리로 만드는데 출력주기와 전압의 변화만 잘 표현하면 재생될것 같기도 합니다. 허나 저는 AVR과 PIC을 조금 사용해보고, 8051은 이용해 보지않아서 지원이 조금 힘들것 같습니다.

    그리고 블로그 관리도 직장근무로 조금 소홀해 졌는데 소중한 댓글 감사드립니다.^^

  42. Blog Icon
    김용훈

    여기에서 소개된 툴을 사용하여 음성재생에 성공하였습니다. 문제는 음성에 잡음이 너무 많이 들어가서 명료하지 않습니다. 어떻게 해야 깨끗한 음질을 얻을 수 있을까요?

  43. 안녕하세요.^^
    여기서 만든 장치는 PCM데이터를 그대로 재생하는 것이라, 잡음이 일반적으로 재생하는 것보다 많이 낄수 있습니다. 그나마 잡음을 줄이려면, PCM데이터 샘플 주기를 정확히 맞춰야 되며, 변환하는 PCM소스가 샘플 주파수가 높고, 비트수가 높아야 되는데 이 경우 용량이 커지게 되서 328로는 재생할 수가 없습니다.

    SD카드와 코덱 IC를 이용해서 재생하는 회로를 구성하는 방법도 있으나, 아직 SD 컨트롤 하는방법을 숙지하지 않아서 도움을 드리지 못해 죄송합니다.

  44. Blog Icon

    비밀댓글입니다

  45. 안녕하세요. 음성을 송수신 하는것은 PCM 데이터를 8비트씩 전송한 다음 미리 받아둬야 되는데, 제가 소프트웨어가 약해서 구현이 가능할지 모르겠습니다.
    일단 만들어보시겠다면, 제안은 드리도록 하겠습니다.^^
    부족하지만 도움되는 답글이 되었기를 바랍니다.

  46. Blog Icon
    MK

    제가 pcm8비트를 받아서 pwm으로 바꾸지 않고 dac칩에 집어넣어서 아날로그로 바꾸려고 합니다. 그렇다면
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include "pcm_sample.h"
    #include <avr/interrupt.h>
    #define SAMPLE_RATE 16000;

    #include <util/delay.h>

    volatile unsigned int sample;
    int sample_count;

    ISR(TIMER0_OVF_vect)
    {

    sample_count--;
    if (sample_count == 0)
    {
    sample_count = 8;
    OCR1A = pgm_read_byte(&pcm_samples[sample++]);
    if(sample>pcm_length)sample=0;
    }
    }

    int main(void)
    {
    unsigned char input;

    DDRC=0x00;
    PORTC=0xFF;

    /* use OC1A pin as output */
    DDRB = (1<<PB0);


    TCCR0|=(1<<CS00);
    TCNT0=0;
    TIMSK|=(1<<TOIE0);
    sample_count = 8;
    sei(); //???????? ????



    while(1)
    {

    sei();
    _delay_ms(2100);
    sample=0;


    }

    이 코딩이 원래있던 코딩에서 pwm을 없앤 코딩이되나요? 그리고 8비트를 dac칩에 연결된 8개의 포트로 보내야 하는데 그 코딩은 어떤식으로 해야할까요?

  47. 안녕하세요.
    먼저 답변이 늦어서 죄송합니다. DAC를 이용해서 소리를 출력하려고 하는 경우 8비트 이므로, AVR의 특정 핀 예를들어 B포트 8비트로 소리를 출력하고 싶다면 PB0~PB7까지 핀을 DAC의 DA0~DA7까지 연결시켜 줍니다. 그런다음에
    #include <util/delay.h>

    volatile unsigned int sample;
    int sample_count;

    ISR(TIMER0_OVF_vect)
    {

    sample_count--;
    if (sample_count == 0)
    {
    sample_count = 8;
    OCR1A = pgm_read_byte(&pcm_samples[sample++]);
    if(sample>pcm_length)sample=0;
    }
    }
    OCR1A 구동과 관련된 레지스터를 모두 삭제해 주시고 다음 구문을
    #include <util/delay.h>

    volatile unsigned int sample;
    int sample_count;

    ISR(TIMER0_OVF_vect)
    {

    sample_count--;
    if (sample_count == 0)
    {
    sample_count = 8;
    PORTB = pgm_read_byte(&pcm_samples[sample++]);
    if(sample>pcm_length)sample=0;
    }
    }
    로 변경해 주시면 아마 구동이 가능하지 않을까 생각해 봅니다. 제가 실험을 할 수 없는 상황이라 구체적인 도움은 드릴수 없지만, 실험 해 보시면서 피드백 부탁드립니다. 그럼 부족하지만 도움되는 답글이 되었기를 바랍니다.^^

티스토리 툴바