Posts

HC-05 모듈을 사용한 아두이노 스케치 블루투스 SPP 업로드

지금부터 소개하는 방법은 상당히 오래된 방법이지만 아직도 유용하게 사용할수 있는 방법으로 ArduinoIDE 스케치 업로드 버튼을 누르고 사용자가 직접 하드리셋을 시켜줄 필요도 없다.  HC-05 와 같은 저렴한 블루투스 클래식 모듈은 SPP 통신을 지원한다.   HC-05에 적절한 펌웨어 설정과 적절한 회로구성만 있다면 마치 USB 를 통해 스케치를 업로드하는것 처럼 사용할수 있다. 위 이미지 처럼 온보드 형태로 PCB 로 만들고자 할때 모듈을 잘 골라야하는데 펌웨어 버전이 다른거나 HC-05 와 비슷한 BC04 라는 제품이 있다.  좀 더 다양한 테스트를 받았고 상위 호환의 제품으로 보이지만 이 모듈은 사용하면 안된다.  비슷한 제품인 BC04은 HC-05 제품과 비교하여 AT 명령어 셋의 일부가 누락되어 있으며 핀 아웃 마저 다르다.  따라서 온보드 형태의 PCB 를 만들어야하는 경우 HC-05 그대로 사용하거나 모듈 부분만 떼어내서 사용하는 방법이 확실하다. 먼저 아두이노와 HC-05의 하드웨어 결선 방법이다. HC-05 의 핀아웃을 보자면 정변 기준 왼쪽부터 STATE, RxD, TxD, GND, VCC, EN 이 있다. 핀 들의 순서를 기준으로 필요한 회로도를 작성하면 다음과 같다. HC-05 는 3.3V 로 동작하는 모듈로 이보다 높은 전압에 노출되면 회로가 손상되거나 오작동 할 가능성이 높아진다. 때문에 이렇게 전압이 다른 두 컨트롤러를 통신할때는 전압 레벨을 맞춰줄수 있는 레벨 컨버터 를 사용하는것이 좋다. 레벨 컨버터의 경우 모스펫을 사용하는방법 저항을 사용하는 방법 다이오드를 사용하는 방법 등 여러가지가 있지만 가장 빠르고 안정적이며 범용적으로 사용할수 있는 모스펫을 사용하는 방법을 추천한다. 보통은 RX TX 에 모두 설계를 적용하지만 HC-05 기준 RX 만 모스펫을 적용하였다 아래 회로는 모스펫을 이용한 로직 레벨 컨버터 설계로 안정적으로 신호를 변환할 수 있는 방법중 하나이다.  풀업 저항은 범용적으로 10K 이 많이 사용되지만 1K

ATmega 시리즈를 위한 Standalone AVR Programmer

Image
예전에 제품 설계에 ATmega328PB 를 사용해야 했었는데 아쉽게도 사용하던 펌웨어 다운로드 장비에서 PB 제품군을 지원하지 않았다. 업체에 문의도 넣었지만 업무가 많은지 업데이트는 없었다. 이미 스탠드얼론 프로그래머에 익숙해졌기 때문에 일반적인 AVR ISP 프로그래머는 불편해서 사용할 수 없는 노릇이었다. 사실 AVR 에 적용 가능한 스탠드얼론 프로그래머 프로젝트는 많기 때문에 만드는 건 어렵지 않다. 문제는 성능인데 기존에 사용하던 제품은 MCU에 매우 빠른 속도로 펌웨어를 다운 받을 수 있었기 때문이다. 지금 소개하는 장치는 그렇게 빠른 속도는 낼 수 없지만 저렴하게 만들 수 있다는 것에 감사한다. IC 는 ATmega328P 를 사용하였고 microSD 통신에 로직 컨버터로 74HC4050 을 사용하였다. ATmega328P 의 D2 에 연결된 택트 버튼을 누르면 프로그래밍이 시작되고 SD 카드로 부터 데이터를 읽어올 때 택트 버튼에 있는 LED 로 표시하도록 하였다. 타겟 장치로 연결되는 ISP 포트의 경우 리산테크의 10 to 6 케이블을 사용할 것 이기 때문에 그대로 만들어준다. 타겟 장치로의 ISP 연결은 D5~D8을 사용하도록 했다.  그리고 칩셋의 ISP 를 다른 기능으로 사용하는 설계는 ISP 프로그래머 기기에서 에러를 출력하는 경우가 있기 때문에 가능하다면 임시로 회로를 비활성 할 수 있는 기능을 넣거나 사전에 프로그램을 다운받는 것이 좋다. 자! 40mm x 50mm 라는 매우 컴팩트한 사이즈의 AVR 프로그래머 가 만들어졌다. SD 카드에 저장된 데이터를 원 버튼으로 타겟 장치의 전원이나 USB 로 입력된 전원 소스로 펌웨어를 쓸 수 있다. 위 영상은 간단한 동작 시연 영상으로 디지털 핀의 LED를 하나씩 깜빡이는 간단한 예제를 업로드 하는 영상이다. 펌웨어 기록 프로세스에서 검증 단계를 제외하면 다운로드 프로세스 시간을 단축 할 수 있다. AnnaJinK/AVR_FLASHER (github.com)

V-USB 를 활용한 ATmega328/168P기반의 USB 키보드 1

Image
키보드나 마우스 혹은 조이스틱과 같은 장치를 만들어보려고 할 때 HID 프로파일을 지원하는 제품을 찾게 된다. 이러한 제품의 경우 개발이 간편하고 고급 기능을 지원하지만 단가가 높은 편이다.  반면 ATmega AVR 에  V-USB를 사용하면 ATmega8 과 같은 비교적 저렴한 가격의 IC 로도 USB 1.1 규격의 키보드나 마우스, 조이스틱과 같은 다양한 USB 장치들을 만들 수 있다. V-USB 관련하여 아래 웹사이트에 재미있는 프로젝트들이 많이 있다. V-USB - A Firmware-Only USB Driver for Atmel(r) AVR(r) Microcontrollers (obdev.at) 이번에 ATmega328/168P와 V-USB를 사용해서 5V 로 동작하는 작은 테스트용 키보드를 만들어 보려고 한다. V-USB 를 사용한 장치는 호스트 장치와 연결시 ATmega328/168P에 있는 UART 포트인 PD0 와 PD1으로 통신하지 않고 PD2 와 PD4 를 사용하게 된다. 여기서ATmega328/168P의 경우 5V 전원 공급에서 디지털 포트도 5V 까지 동작하게 되는데 이 부분을 주의해야 한다. 일반적으로 USB는 전원 공급에 5V를 사용하지만, 양쪽 데이터 라인은 HIGH 에서 2.8V~3.6V, LOW 에서 0.0V~0.3V  전압으로 정격화된다. 이는 호스트 측으로 입력이 3.6V 보다 높아지지 않도록 주의해야 함을 의미한다. 만약 5V 신호를 그대로 USB 데이터 라인에 입력하게 되면 호스트 장치의 입력 회로를 손상시킬 수 있다. USB 데이터 라인의 회로 손상을 방지하기 위해 일반적으로 사용되는 방법으로 왼쪽 회로처럼 데이터 라인에 3.6V 제너 다이오드를 병렬로 사용해서 전압을 조정하는 방법이 있다. 만약 이 방법이 마음에 들지 않는다면 ATmega328/168P 에 3.3V 전원을 공급하는 방법도 있다. 오른쪽 회로는 아두이노 호환 보드에서 흔하게 볼 수 있는 CH340C를 사용한 USB 시리얼 통신 포트이다. ATmega3

Raspberry Pi Zero W/2W - 게임보이 만들기 4 - 샘플 테스트

Image
샘플을 주문하여 PCB 납땜을 하면서 설계하면서 발견하지 아쉬운 점들이 하나 둘 발견되었다.  첫 번째로 원활한 테스트에 필요한 테스트 포인트 설계를 누락 했다.  이게 없어서 PCB 도 너무 지저분해졌고 회로 찾아가며 테스트 하는데 너무 많은 시간을 소비했다.  두 번째로는 디스플레이 백라이트 설계가 완전히 잘못되었다. 지금 생각하면 너무 바보 같은데 회로도 설계시 심볼을 회전하면서 결선이 틀어진 모양이다. 일단 테스트는 백라이트 컨트롤 없이 항상 켜져있도록 만들어두고 테스트를 하였다    전원부의 경우 예상했던 5.15V 보다 높은 5.18V을 얻게 되었다.  이 정도의 전압도 사용에 큰 문제가 되지는 않지만 정확한 값을 얻기 위해서는 가변저항을 사용하는 것이 좋아 보인다. 큰 문제는 USB 에 특정 장치들을 연결할 때 발견되었다. 충전이 가능한 제품 중에서 연결하면 무조건 5W 이상을 끌어가도록 설계된 제품들이 있는데 이런 제품들이 문제였다. TPS61230의 최대 출력은 2.1A 이기 때문에 저방전 배터리를 사용하면 1.2A 이상 끌어가는 상황이 오면 시스템이 불안정해지면서 전원부가 셧다운된다.  가장 먼저 Raspberry Pi OS 를 설치해보았다. USB 장치와 microSD 카드도 잘 인식되고 컨트롤러도 잘 인식이 되었다. 구현된 모든 인터페이스는 잘 작동됨을 확인하였다. 사용자의 손길이 필요한 부분은 디스플레이와 오디오 출력 말고는 없어 보인다. RetroPie 의 경우 Wi-Fi 드라이버를 직접 넣어줘야 하지만 그 외에는 Raspberry Pi OS 와 동일하다. RecalBox는 Raspberry Pi OS 와 많이 다르기도 하고 화면 출력과 네트워크 드라이버 부분에 좀 더 연구가 필요하다. 디스플레이는 2.8 인치 ili9341 TFT 를 사용했으며, RetroPie 와Raspberry Pi OS에서 fbcp-ili9341 드라이버를 사용하여 구동 시킬 수 있었다. fbcp-ili9341 드라이버를 빌드 과정은 다음과 같은 과정이 필요하

Raspberry Pi Zero W/2W - RetroPie 에서 Wi-Fi 스캔이 안될때

Image
Raspberry Pi Zero W/2W 에 RetroPie를 설치해보면 너무나 당연한 것처럼 Wi-Fi가 되질 않는다. 아마 이것 저건 만져보면서 결국 포기하는 사람들도 있으리라 생각한다. Wi-Fi가 안되는 이유에 는 보통 다음과 같은 내용이 가장 많이 보인다.  첫 번째 국가 설정을 한국으로 하면 안된다. 두 번째 공유기에 사용된 칩셋과 호환성 문제다.  세 번째 구형 커널 및 운영체제가 설치되었다.  그러나 라즈베리 커뮤니티 포럼에 올라오는 글들을 보면 이건 비단 한국 지역만의 문제는 아니며, 요즘은 보통 구형 OS를 사용하는 환경에서 주로 발생한다.  사실 Wi-Fi 관련하여 제기되는 문제는 최신 브로드컴 펌웨어로 해결이 가능하다. 실제로 최신 Raspberry Pi OS 이미지를 설치하면 별다른 설정 없이 바로 Wi-Fi 에 연결하여 사용할 수 있으며, 지역 설정 또한 한국이어도 상관 없다. 이런 사실은 Raspberry Pi Imager 소프트웨어에서 각 OS 의 릴리즈 날짜 만으로도 짐작 할 수 있는데, RetroPie도 구형 Raspberry Pi OS 를 기준으로 만들어진 것으로 보인다. 해결 방법은 간단하다.  Raspberry Pi OS의 브로드컴 드라이버를 받아서 RetroPie가 설치된 Raspberry Pi의 /lib/firmware/brcm/ 경로에 카피 해주면 거짓말처럼 Wi-Fi 가 스캔도 잘 되고 연결도 잘된다.  RetroPie 의 업데이트가 아직 없는 이유는 알 수 없지만 테스트가 더 필요한 부분이 있는지도 모른다. 1. Pi OS의 /lib/firmware/brcm/ 경로에 있는 모든 파일을 다운 받는다. 2. RetroPie의 /boot 영역에 다운 받은 brcm 폴더를 넣어준다. 3. RetroPie F4 로 터미널로 이동하여 "sudo cp -r /boot/brcm /lib/firmware/" 입력한다. 4. "sudo reboot" 로 재부팅  유선 랜이나 다른 네트워크를 통해

Raspberry Pi Zero W/2W - 게임보이 만들기 3 - 오디오 설계

Image
이번에 설계할 부분은 오디오 출력 부분이다.  Raspberry Pi Zero의 경우는 별도의 오디오 출력 포트가 존재하지 않는다. 그 대신 PWM 을 지원하는 GPIO18, GPIO13 또는 GPIO19 를 오디오 출력 에 사용할 수 있다. 예전에는 사용자가 오디오 출력에 사용할 포트를 직접 커널 파일로 구성하여 시스템에 추가 해주어야 했는데, 이제는 audremap.dtbo 파일이 OS 에 내장되기 때문에 그럴 필요가 없다. 오디오 출력을 하기 위해서는 하드웨어 회로 구성과 config.txt 파일 마지막 줄에 dtoverlay=audremap,pins_12,13 를 추가해주면 된다.  참고로 PWM0 는 12,18 번이 PWM1은 13,19 번이 채널을 공유하기 때문에 오디오 포트로 오버레이 설정시 주의가 필요하다. 예를 들어 동일 채널의 포트에 오디오 출력을 하고 있는 중에 LED 제어 같은 다른 용도로도 사용하게 되면 오디오 출력에 문제가 발생할 수 있다. 오디오 회로는 위와 같이 설계하였다. 필요한 경우 필터 회로를 구성할 수 있도록 FB와 MLCC를 두었다. 사용하지 않을 가능성이 높지만 재미 요소 중 하나가 될지도 모른다. XPT9971와 같은 형태의 오디오 앰프는 MODE 의 상태에 때라 동작 방식이 다르다. LOW 에서는 AB Class 로 HIGH 에서는 D Class 앰프로 동작한다. 내가 알기로 XPT9971 의 경우 MODE 는 내부 풀업으로 기본 세팅되어 있다. 따라서 AB Class 로 사용하고 싶다면 LOW 로 세팅해주면 된다. D Class 는 효율 중심이고 AB Class 는 음질이 괜찮다고 하지만 솔직히 이렇게 저렴한 앰프는 그런 차이는 느끼기 힘들다고 생각한다. 실제로 소리가 달라지긴 하는데 둘 다 구리다. SD 의 경우 앰프를 켜고 끄는데 사용할 수 있는데 HIGH 일 때 꺼지고 LOW 일 때 켜진다고 보면 된다. 그리고 퍽 소리가 신경 쓰일 수 있는데 별도 스위치 회로를 구성해 앰프가 확실하게 켜진 다음 스피커 회로가

Raspberry Pi Zero W/2W - USB OTG + mini HDMI 어댑터 만들기 2

Image
이번 프로젝트는 Raspberry Pi Zero 2W와 위 사진과 같이 결합되도록 만드는 것이 목표다. 라우팅 작업하기 전에 확인차 CAD프로그램으로 조립을 해보았다. 언뜻 보면 치수가 잘 맞는 것 같지만 사실 그렇지는 않았다. Mini HDMI 의 경우 치수가 명확하게 나와있지 않아서 보드에 물릴 부분은 1mm 로 잡고 설계하였다. 그리고 제공된 데이터 상에는 위 사진처럼 접점이 왼쪽이 비워져 있지만 판매자가 올린 상세 페이지에는 빈 공간이 오른쪽인 제품과 왼쪽인 쪽인 제품이 같이 나와있다. 주문해도 판매자의 재고량에 따라 설계에 맞지 않는 제품이 올 수 도 있겠다는 생각도 든다. 데이터를 올렸으면 사진 도 동일한 제품으로 올려줘야지 이러면 곤란하다. Micro USB 는 그나마 괜찮았다. 접점이 이렇게 아주 약간  붕 떠있는데, 측정해보니 0.15mm 정도였다. 그래도 이 정도로는 큰 문제가 되진 않는다고 생각한다. 문제점은 부품을 배치하면서 발견하였다. Raspberry Pi Zero의 USB 와 HDMI 단자에 맞춤 설계를 하고 라우팅 작업을 하려 던 찰나 3D 뷰어로 이리저리 돌려보면서 뿌듯해 하다가 정면을 보게 되었는데, USB와 HDMI 의 수평이 맞지 않는 것을 발견하였다. 실제로 CAD 프로그램으로 측정해보니 단차가 0.3mm 정도 있었다. 큰 문제가 될 것 같지는 않지만 사실 이런 단차는 최소화 하는 것이 맞다. PCB 두께를 0.8mm 정도로 줄이고 HDMI 를 납땜 할 때 어느 정도 조절이 가능하다. 두께가 얇아 질수록 사용하면서 PCB가 휘어질 가능성은 높아지지만 있지만 올려질 부품이 별로 없기 때문에 큰 문제가 될 것 같지는 않다.