관련 포스팅
3. 전자 회로 제작 과정
3.1 개발 보드 선택
구분 | Arduino UNO | Raspberry Pi 4 |
---|---|---|
언어 | C++ | Python |
멀티태스킹 | X | O |
입출력 전압 | 0~5V | 0~3.3V |
ADC | O(A0~A5 핀) | X |
리소스 | 부족 | 충분 |
- 라즈베리파이의 경우 0~3.3V 범위의 GPIO를 사용하기 때문에 5V 전압에 맞춰져있는 디바이스를 사용할 시 변환 작업이 필요합니다.
- 라즈베리파이에는 내장 ADC(Analog to Digital Converter)가 없기 때문에 아날로그 센서를 사용할 때 별도의 ADC 회로를 구축해 주어야 합니다.
- 아두이노에서 사용할 수 있는 SRAM은 2048bytes로 개발 시 리소스가 부족할 우려가 있습니다.
- 본 프로젝트의 경우 모든 동작이 순차적으로 수행되는 상황이 많아, 멀티쓰레드를 사용하지 않고도 어렵지 않게 구현할 수 있을 것으로 예상하였습니다. 또한 SD 카드라는 별도의 저장 장치에 pointcloud를 저장할 예정이므로, 리소스 부족 문제도 해결할 수 있을 것으로 생각하였습니다. 이에 본 3D scanner에서는 회로를 단순화하기 용이한 아두이노 UNO를 개발 보드로 선정하였습니다.
- VScode에 아두이노 extension을 설치하여 개발 환경을 구축하였습니다.
3.2 IR 거리 센서 거리-전압 관계 fitting
GP2Y0A21YK0F distance-voltage relation
본 프로젝트에서는 Sharp 사의 GP2Y0A21YK0F IR 거리 센서를 사용하였습니다. 데이터 시트를 참고하여 유효한 범위(L > 50mm)에서 거리-전압 관계를 log-log fitting하여 다음과 같은 관계식을 얻었습니다.
\[L=299.88 \cdot V^{-1.173}\]3.3 모터 드라이버 및 스텝 모터 선택
Comparison between L298n and A4988 motor driver
구분 | L298n | A4988 |
---|---|---|
배선 | 단순 | 복잡 |
제어핀 | 4개 | 2개 |
진동&소음 | 큼 | 작음 |
비고 | - | 분주 조절 가능 |
Comparison between applied motion 4017-875 and 42shdc3025-24b stepper motor
구분 | Applied motion 4017-875 | 42shdc3025-24b |
---|---|---|
Rated voltage | 3.5V | 3.96V |
Rated current | 0.35A | 0.9A |
- Rotating plate를 5t 아크릴 원판으로 제작하였기 때문에 회전 관성 모멘트가 굉장히 큽니다. 이로 인해 θ-방향으로 plate를 회전할 시 많은 토크가 요구되어, 대부분의 스텝 모터에서 탈조 현상이 발생해버렸습니다.
- 시행착오를 거친 결과, 소비 전력이 큰 42shdc3025-24b 스텝 모터와 분주 조절이 가능한 A4988을 조합하고, A4988을 16분주로 설정하여 rotating plate를 작동시킬 수 있었습니다.
- z-방향 이동에 사용하는 리드 스크류 회전에는 큰 토크가 요구되지 않으므로, 상대적으로 배선이 단순한 L298n 모터 드라이버와 남은 스텝 모터(4017-875)를 사용하였습니다.
3.4 SD card reader 자작
원래는 PC와 시리얼 통신으로 바로 pointcloud 정보를 전송하려고 했으나, 계획을 변경하여 SD 카드를 사용하기로 하였습니다. 인터넷을 뒤져보니 나름 구조가 단순한거 같아 직접 자작해보기로 하였습니다. SD 카드 리더는 아래의 글을 참고하여 제작하였습니다.
참고 자료
DIY SD card reader
- SD 카드 어댑터에 핀헤더를 납땜하여 회로를 구성하고 마이크로 SD 카드를 삽입하여 데이터를 읽고 씁니다.
- SD 카드 리더는 SPI 통신에 사용되는 4개의 핀(CS, MOSI, MISO, SCK)과 3.3V, GND 총 6개의 핀으로 구성되어 있습니다. 핀맵에 맞추어 연결해줍니다.
- SD 카드는 3.3V 입출력을 사용하므로 voltage divider 회로를 사용하여 아두이노의 5V 입출력 신호를 3.3V에 맞춰 변환해줍니다. (저는 1kohm 저항과 470ohm 저항을 사용하였습니다.)
- 이렇게 만든 DIY SD card reader는 매우 잘 동작했지만, 이후 순간접착제로 붙이는 과정에서 SD 카드 인식부가 녹아 합선이 발생하였습니다. 결국 급하게 SD card reader를 인터넷에서 구입하여 사용하였습니다. (2500원밖에 안합니다. 그냥 살걸…)
3.5 아두이노 proto-shield 회로 설계 및 납땜
Prototype circuit
그림처럼 브레드보드에 모든 디바이스를 연결하고 실험해보았습니다. 잘 되는걸 확인한 다음 바로 납땜을 시작하였습니다.
Proto-shield circuit design (front)
Proto-shield circuit design (back)
Proto-shield circuit result (front)
Proto-shield circuit result (back)
아두이노 보드 위에 장착할 수 있는 특수한 기능의 회로를 shield라고 합니다. 그중에는 사용자가 직접 회로를 납땜하여 꾸밀 수 있는 proto-shield라는 것이 있습니다. 저는 proto-shield에 3D scanner 시스템을 납땜하여 사용하였습니다.
- F/F 점퍼선의 한쪽 끝을 몰렉스 커넥터로 바꾼 케이블을 사용하여 디바이스와 proto-shield 사이 체결을 용이하게 하였습니다. 이를 위해 proto-shield에는 다양한 몰렉스 커넥터를 납땜하여 아두이노 입출력 핀과 연결해주었습니다.
- A4988 모터 드라이버는 proto-shield 중앙에 핀헤더를 납땜한 후 연결하였습니다.
3.6 회로 케이스 설계 및 제작
Circuit case modeling plan
Circuit case modeling floor plan
Circuit case assembly
그림과 같이 3D scanner에 들어가는 전자 부품과 아두이노, 전원부를 담는 케이스를 설계하고 제작하였습니다. 3t 아크릴을 커팅하여 제작하였습니다.
3.7 전자 회로 완성
3D scanner circuit diagram
3D scanner electric device system
Arduino UNO pin | Electric device |
---|---|
D2, D3 | Rotary encoder(encoder) |
D4, D5, D6, D7 | L298n motor driver |
D8, D9 | A4988 motor drivier |
D10, D11, D12, D13 | SD card reader |
A0 | Rotary encoder(button) |
A1 | IR distance sensor |
A2 | Limit SW |
A4, A5 | LCD I2C module |
3.7.1 아두이노 UNO
- USB type-B 포트를 통해 PC와 시리얼 통신을 수행합니다.
- SMPS의 12V 소스를 전원으로 작동합니다.
- 몰렉스 커넥터와 A4988 모터 드라이버 전용 핀헤더 소켓을 납땜한 proto-shield를 장착하였습니다.
3.7.2 전원부
- 220V IEC power cable을 꽂을 수 있는 connector와 전원 스위치, 5W 퓨즈로 구성되어 있습니다.
- Power connector는 SMPS의 220V AC 전원 입력부와 연결되며, SMPS의 12V 출력은 아두이노 UNO와 A4988, L298n 모터 드라이버에 인가됩니다.
3.7.3 Rotary encoder
- 사용자가 3D scanner를 제어할 수 있도록 입력 장치 역할을 수행합니다.
- 시계, 반시계 방향으로 encoder를 돌리는 입력과 버튼을 클릭하는 입력을 받을 수 있습니다.
- 아두이노 UNO에 배정되어있는 인터럽트 핀(D2, D3)을 사용하여 encoder 입력을 즉각적으로 처리할 수 있도록 하였습니다.
- 남은 디지털 핀이 없어, 버튼 입력은 A0 핀에 할당하였습니다. 별도의 pull-up 회로를 꾸미지 않았고, 아두이노 내부 pull-up 저항을 사용하였습니다.
3.7.4 L298n motor driver & z-dir stepper motor
- z-방향 stepper motor를 제어하기 위해 L298n 모터 드라이버를 사용하였습니다.
- 4개의 디지털 핀 D4, D5, D6, D7을 사용하여 모터 드라이버에 입력 신호를 인가합니다.
3.7.5 A4988 motor driver & θ-dir stepper motor
- A4988 모터 드라이버를 16 분주 모드로 사용하여 스텝 모터가 속도는 느리지만 큰 토크를 낼 수 있도록 하였습니다.
- 2개의 디지털 핀 D8, D9를 사용합니다. 하나는 모터의 회전 방향을 HIGH, LOW로 조절하고, 하나는 PWM의 duration을 조절하여 모터의 회전 속도를 조절합니다.
3.7.6 SD card reader
- 3D 스캔 결과인 pointcloud 파일을 SD 카드에 저장합니다.
- 아두이노 UNO에 배정되어있는 SPI 통신 핀(D10-Chip Select, D11-MOSI, D12-MISO, D13-SCK)을 사용하였습니다.
3.7.7 IR distance sensor
- Sharp 사의 GP2Y0A21YK0F IR 거리 센서를 사용하였습니다.
- 거리 센서 carriage에서 물체의 표면까지의 거리를 측정하여 원통 좌표계에서의 r 값을 산출합니다.
- 0~5V 사이의 전압을 출력하는 아날로그 센서 값을 읽기 위해 ADC(Analog to Digital Converter)가 내장되어있는 A1핀에 할당하였습니다.
3.7.8 Limit SW
- 거리 센서 carriage가 프로파일 프레임에 닿는지 여부를 판단하는 역할을 수행합니다.
- 자체 회로에 pull-up 저항이 존재합니다.
- 남은 디지털 핀이 없어 A2 핀에 할당하였지만, 디지털 입력으로 받습니다.
3.7.9 LCD I2C module
- 16×2 사이즈의 display를 사용하여 사용자가 3D 스캐너 상태를 파악할 수 있도록 합니다.
- 가용할 수 있는 핀이 부족하여 I2C 모듈이 장착된 LCD를 사용하였습니다.
- 아두이노 UNO에 배정되어있는 I2C 통신 핀(A4-SCL, A5-SDA)을 사용하였습니다.