Sunday, September 29, 2019

ESP-EYE 그리고 ESP32-CAM (세 번째 카메라 테스트)



약 2년전, Home Security를 위해 카메라 영상을 WIFI로 전송하는 장치를 구현하였다. (http://withthing.blogspot.com/2018/12/upgrade-home-cctv.html)

당시, ArduCAM이 촬영한 영상을 ESP8266가 받고, ESP8266으로 구현한 WebServer에 영상을 Streaming 혹은 Capture 영상을 보이도록 하였다. 여기에 MQTT로 Camera를 제어하기 위한 dashboard를 만들었다. (ESP8266은 내부망이기 때문에 port forwarding을 설정하였다.)

두 번째로는, 또 다른 카메라(ov7670)과 아두이노를 사용하여 PC에서 시리얼로 영상을 전송받아 출력하였다.
https://helloiot.wordpress.com/2017/08/02/ov7670-arduino-nano/



첫 번째 시도였던, ArduCAM+ESP8266 조합이 여러모로 쓸모가 있는데, 그것은 ESP8266이 WIFI는 기본이고 Arduino 대비 우월한 성능(속도, 메모리 등)으로 MCU의 역할을 수행하기 때문에 할 수 있는 일들이 많기 때문이다.  그래서 나는 언제부턴가 아두이노 보다 ESP를 더 많이 활용하고 있다.  다만 이 값 싸고 훌륭한 모듈이 중국에서 만들어졌다는것이 안타깝고...  아직 품질이나 안정성도 비교적 떨어진다.  그러나 수 많은 사람들이 이 모듈을 사용하기 시작하면서 framework가 많이 발전하였다.

그런 와중에 ESP에서 ESP-EYE 개발킷을 - 이들의 기존 제품가격 대비 - 싸지 않은 가격(2만원대)에 출시하였고, 이는 음성인식, 얼굴인식 기능까지 open source로 구현되는 상당히 호기심 가는 제품이기에 구매하여 테스트 해보았다.

비싼가격(?) 때문인지 패키징도 잘 되어있고, PCB보드도 기존과 다르게 상당히 신경쓴 모습을 볼 수 있었다.


Image result for esp-eye

펌웨어 소스코드는 오픈소스로 github에서 esp-who로 공개되어 있다. 이를 빌드 하기 위한 tool-chain은 역시 같은 곳에서 esp-idf로 공개되어 있다.

모든것을 준비하고 펌웨어를 성공적으로 빌드하고 전원을 넣고 실행을 하였다.
그리고 들뜬 마음으로 serial monitor를 보았더니...




카메라가 인식되지 않는다고 한다.

인터넷을 좀 찾아보니 카메라 연결문제, 설정문제, 전원문제 등 다양한 이야기들이 있었지만 좀처럼 해결되지 않았다.  카메라가 고장난것일까?

그래서 ESP-EYE의 카피버전? 정도로 생각되는 ESP32-CAM을 추가로 구해서 다시 실험을 하기로 했다. 이 제품은 aliexpress에서 저렴하게 구할 수 있고...  물론 배송은 한달이다.


역시 잊을만 하니 드디어 배송되었다. 하도 늦게 배송이 이루어지니 막상 물건이 오면, "이게 뭐였더라?" 할 때도 있다.


ESP32-CAM은 Arduino IDE에서 CameraWebServer 예제를 사용해볼 수 있다.
CameraWebServer는 'ESP32 Wrover Module' 보드의 예제이다.

ESP32 Wrover Module

주의: Partition Scheme: "디폴트" 가 아니라 "Huge APP (3MB No OTA)" 로 설정해야 함.
ESP32 Wrover Module은 추가보드 매니저에 다음을 추가 하여야 함: https://dl.espressif.com/dl/package_esp32_index.json


CameraWebServer 예제




펌웨어를 빌드하고 실행해 보았다. 역시... 한번에 되리라고는 기대도 안했다.

"Brownout detector was triggered"

위 메세지와 함께 무한부팅~!  씐난다!

보통 저 메세지는 전원이 딸리면 재부팅하는 경우의 메세지인데...
brownout detector를 off 해보았다. 그러나... 정상동작 하지 않았다. 당연히 전원이 부족해서 발생하는 트리거인데 이걸 끈다고 정상작동하겠냐..

원래 ESP8266은 고질적인 초기 전원문제가 있다. 이는 WIFI 때문으로 알려져있고... 이를 해결하기 위해 전원단에 capacitor를 추가하기도 한다.


ESP32-CAM의 연결도는 다음과 같다.




ESP-EYE와는 다르게 USB-TTL이 없으므로 외부의 USB-TTL 어뎁터를 사용해야 한다.
누군가는 이렇게 동작하니까 이 도식을 올렸을 터인데.  나의 경우 동작하지 않았다.
(인터넷을 찾아보면 많은 사람들이 나와 같은 문제를 겪는 것 같다.)


내가 잠깐 착각한 것이 있다.  USB-TTL이 전원 공급용이 아니라는 것을.
FTDI에도 물론 Power out이 있다. 그러나 이것은 logic ic에 전원을 공급하기 위한 용도일 뿐이라 그 전원은 어떤 서킷에는 충분하지 못할 것이다.

내가 가지고 있는 <FT232RL FTDI USB 3.3V 5.5V to TTL Serial Adapter Module> 모듈은 5V, 3.3V 출력이 가능하다.

나중에 ESP32-CAM의 전원사용량을 확인해 보니, 5V에서 약 210mA정도를 사용하였다.

처음에는 USB 허브 전원문제 인것 같았다. USB 2.0의 출력이 최대 900mA(단일 포트에서는 100mA인것 같은데.. 900mA는 여러 포트를 동원해야 하는 것인지? 잘 모름)라니까 문제가 없을 것 같기도 하고. 단일 포트에서 100mA라면 문제가 되는 상황이고. 하여튼 확실하지 않으니 허브에 외부전원(5V, 4A)을 (겨우 맞는것을 찾아) 연결하였다.

그럼 되야겠지?   하... 여전히 안된다. 하지만 이는 곧 이해가 되기 시작했다.

USB-TTL의 출력 자체가 딸리는 구나.

그래서 USB-TTL에 ESP32-CAM이 연결된 상태로 전력을 확인해보았다.

최대 70mA...    될리가 없지.

USB-TTL에 전원을 충분히 공급해주는것과 상관 없이 이놈의 출력 전원이 그정도 뿐이니 애당초 될리가 없는 것이다.

FT232RL datasheet를 찾아보았더니 내부 레귤레이터의 출력은 50mA가 최고란다.





5V로 dip switching하는 경우에는 regulator를 사용하지 않을 것 같아 테스트 해보았는데, 무조건 regulator를 통하는것 같다. 출력은 변함이 없었다.

USB-TTL adapter에 따라 전원 공급이 충분한 제품이 있을 수도 있을 것이다.

아무튼 이러한 상황이므로, 외부 전원을 ESP32-CAM에 직접 인가해 보았다.

짜짠~!




아, 쫌 기쁘다.  삽질 끝에 카메라 웹 서버가 잘 동작한다!


정리하면, USB-TTL adapter는 전원용이 아니라는 것.  ESP시리즈는 WIFI 땜시 전원을 많이 사용한다는 점!

따라서 ESP는 배터리 전원을 사용할 경우 WIFI 사용을 최소화 하고 sleep mode를 최대한 활용해야 하며, 가능하면 외부전원을 안정적으로 공급할 수 있어야 할 것이다.


이것의 발단이 된 ESP-EYE 보드는 여전히 안된다. 얘는 설계가 잘 되었는지 애초에 전원 문제는 없었다.

아닐 수도 있으나 카메라 자체의 문제도 살짝 의심되므로 카메라 모듈만 알리를 통해 추가 구매 하였다. 이 결과는 한달 후인 다음달에나 알 수 있을 것이다.



ESP 모듈의 활용도는 정말 많다. 소개하지 않았지만 이 안에는 다양한 센서가 있고 32비트 코이어며, 메모리도 많고 RF도 지원한다. 그것도 매우 저렴한 가격에!




공식적으로 세 번째 카메라 테스트 이지만, 사실 2.5번째 정도 되는 실험이 잠시 진행되었었다. 이것은 FIFO 버퍼가 없는 카메라 센서를 FPGA에 연결하여 VGA로 스트리밍 하는 목표였다. 하지만, FPGA는 그리 간단하지 않았고 DRAM을 다루는 부분부터 필자의 지식한계를 넘어서 나중으로 나중으로 미룬 상태이다.  이것에 관한 성과가 있게 되면 공유할 계획이다.









Thursday, September 5, 2019

Inside the IC


내가 가지고 있는 IC를 미니 현미경으로 확대해 보았다. 뭔가 구조가 보이긴 하네..

Wednesday, September 4, 2019

MQTT broker 서비스를 이사가다.

장치간의 메시징(통신)을 위해 MQTT - Message Queuing Telemetry Transport,  ISO standard (ISO/IEC PRF 20922) - 프로토콜을 사용하고 있고, 다음 그림과 같이 MQTT broker(or server)가 연결된 디바이스들(subscriber)의 mqtt에 기반한 메시징을 중계해준다.


Image from www.mathworks.com


알려진대로 매우 가벼운 프로토콜이기 때문에 IoT 디바이스들에 적용되기에 적합하다.

문제는 mqtt broker인데 이는 서버이므로 PC든 라즈베리 파이든 NAS든 broker를 구동할 서버가 준비되어야 한다. 여기에는 두가지 문제가 있는데, 하나는 간단한 응용을 위해 항시 켜져있는 서버를 운용해야 한다는 점과, 서버가 내부 IP 영역에 존재하면 그 외부의 장치들은 접근하기가 어렵다는 것이다. 물론, 전자의 경우 NAS같이 원래 항상 운용되는 장비가 있다면 거기에 mqtt broker를 설치/운용할 수 있으며, 후자의 경우 port forwarding 을 사용하여 내/외부 모두 접근이 가능한 서버를 구축할 수도 있을 것이다.
그런데 간단한 구축을 위해 너무 귀찮잖아!

이런 경우를 위해 유/무료로 mqtt broker 운용해주는 site들이 여럿 있다.

나같은 경우 CloudMQTT에서 제공하는 무료 서비스를 사용하고 있었다.
무료의 경우 생성할 수 있는 채널 수 등이 제한되어 있었는데, 그래도 충분히 활용할 만 했었다. 그런데, 오랜만에 새로운 채널을 생성하려고 했는데 이게 웬걸. 무료 정책이 바뀌어서 기존에 만든것은 유지하지만 새롭게 만들거나 변경하는것이 불가능했다. 뭔가 하려면 기존것을 상당부분 삭제해야 하는 상황이다!

[CloudMQTT 무료버전]

Cute Cat

  • 5 users/acl rules/connections
  • 10 Kbit/s

CloudMQTT 무료 서비스는 사용자수던, acl rule(채널)수던, 접속자 수던 5개로 제한되고 있고, 통신속도는 10 Kbit/s !  이거 너무하지 않은가?


그래서 다른 대안을 찾기 시작했고, broker로 유명한 mosquitto를 제공하는 재단에서 mqtt 테스트 서버를 무료로 제공하기에 이를 사용하기로 하였다.
물론, 다른 무료 서버들도 많이 있다. 선택은 사용자가 적절히!

[Public MQTT Brokers]
https://mntolia.com/10-free-public-private-mqtt-brokers-for-testing-prototyping/



테스트 서버의 접속 url은 http://test.mosquitto.org/ 이다.

접속 port에 따라서 서비스 형태가 약간 다르다.
  • 1883 : MQTT, unencrypted
  • 8883 : MQTT, encrypted
  • 8884 : MQTT, encrypted, client certificate required
  • 8080 : MQTT over WebSockets, unencrypted
  • 8081 : MQTT over WebSockets, encrypted


IoT의 소형장치들은 대부분 보안에 취약하다. 이는 미래에 큰 화두가 될 것이다.
나는 테스트를 위한 (보안이 필요 없는) 정보를 주고받는 정도이므로 1883 포트를 사용한다.

무료가 항상 그렇듯 본 서비스도 donation을 받는다. 한달에 약 $70가 운용비용이라고 하는데, 설마 이정도도 ECLIPSE 재단에서 지불을 못할까?

테스트 해보니 속도도 빠르고 별 문제가 없어서, 앞으로는 본 서비스를 활용할 계획이다.



Saturday, December 8, 2018

Upgrade Smoke Sensor

아두이노를 배우는 초기에 만들어본 담배연기센서. 담배연기 혹은 휘발성연기가 발생하면 경보를 울리게 된다.  당시, 아파트 담배연기에 대응하기 위해 만들었던 장치이다. 담배연기가 발생하면 빠르게 문을 닫거나 환풍기를 틀거나 할 생각이었다.

배우는 초기라 bulky 하게 만들었는데, 아래와 같이 box안에 넣었다. 그리고 코드를 수정하여 보다 정확하게 결과를 출력할 수 있도록 하였다.








Upgrade Home CCTV

OV2640과 ESP8266을 사용하여 우리집 거실을 감시하는 나만의 CCTV를 만들었다. 
화면은 mqtt 프로토콜을 사용하여 화면을 전송하고 몇가지 설정을 수행하도록 만들었다. 관련 post는 https://helloiot.wordpress.com/2017/09/20/ov2640-esp8266/ 에서 볼 수 있다.
당시에는 커버가 마땅히 없었기 때문에, 남는 CCTV를 분해하고 그 커버를 사용하여 나만의 CCTV를 완성하였다. 1년정도 사용하였는데, 아직 잘 작동하고 있고 지금도 유용하게 사용중이다.





3-Phase Motor Driving Test

하드디스크를 분해할 일이 생겨 모터만 빼내었다. 3상 모터인것을 확인하고, 인터넷에서 모터를 제어하는 회로를 찾아 만들어 보았다. 약 4000 rpm을 넘게 회전하는 것을 확인하였다. 



HDD모터 외에 미니카세트에서 뽑아놓은 초박형 모터가 같은 구조이길래 확인차 테스트 해보았다.  HDD의 모터에 비해 진동이 심했으며 작아서 그런지 열도 심했다. 아래 열화상화면 참고. (사실 모터의 스펙을 모르고 테스트를 위해 전류를 2A까지 끌어 올렸기 때문이다.)
확실히 HDD의 모터가 밸런스가 잘 잡혀있는지 고 rpm에서 진동을 느끼기 어려웠다.

테스트를 통해 고속 회전만을 위한 모터는 처음부터 pwm을 빠르게 해서도 안된다는 것을 알았다. 그것은 모터의 회전 위치에 따라 정확히 전류를 on/off 해줘야 하는데, 어긋나면 오히려 stall 현상으로 모터가 회전을 멈춘다.  그래서 정확한 pwm을 구사하려면 모터의 회전자 위치(혹은 속도)를 정확히 알아야 하는데, HDD 모터에서는 hall sensor를 찾을 수 없었다.
자료를 찾다 보니 고속 rpm에서는 모터에서 회전시 발생하는 back-EMF(역기전력) 특성을 사용해 회전 위치를 파악하고 모터를 제어할 수 있다는 것을 알았다.
나는 역기전력에 대해 아직 잘 모르기 때문에 저주파에서 고주파로 단계별로 전환 하였으며, 해당 모터에 대한 datasheet가 없기 때문에 (타지 않는 범위에서) 전류를 높혀 강한 자기력으로 모터의 회전이 빠르게 해당 pwm에 동기화 될 수 있도록 하였다.  하지만, 그래도 회전중의 모터를 건드려서 충격을 주면 바로 stall로 빠질 수 있다. (잡고 움직이는 정도로 stall이 발생하지는 않았다.)

필시 hdd의 motor controller는 back-emf를 사용하여 모터를 제어하는 것이리라... 라고 예상해본다. (잘 모릅니다. ^^)

모터의 ground는 멀티미터를 사용하여 한곳을 기준으로 잡고 나머지 3곳에 대해 각기 저항값을 확인해보면 가장 적은 조합을 갖는 쪽으로 ground를 찾을 수 있다. 관련자료는 인터넷에 많으니 따로 소개하지는 않겠다.







Motor driver를 테스트하기 위한 코드는 다음과 같다: 모터 자체에는 encoder가 없었기 때문에 회전속도를 photoelectric sensor를 설치하여 측정해 보았고 이를 위해 작성한 코드는 아래와 같다:

How to use String in VHDL or Verilog.

Whenever you want to use VHDL (or Verilog) code to send text to the UART or LCD, you must write the text in hexadecimal format. I thought it was very annoying. So, I was looking for an answer that could save my patience. However, everything I have found is no different in any way.

I could not bear it. So I tried to convert the text of an ASCII string into a hexadecimal array automatically, like this :
Refer to line #123


Thursday, September 27, 2018

FPGA PLL Test (Lattice, Altera)

얼마전에 FPGA를 공부해볼 요량으로 Lattice iCEstick(iCE40HX1K)을 구매했다. 테스트 첫날 FPGA가 MCU와는 전혀 딴판이라는 것을 알았고 동시에 상당히 흥미가 생겼다.

간단히 내장 LED등 제어해보다가 clock을 multiplication할 수 있다는 것을 알고 인터넷의 간단한 예제를 찾아 실행해 봤으나 허사였다. 나중에 알고보니 예제들이 대부분 simulation을 위한 것이었고(시뮬레이션과 합성의 차이를 모르는 때) after 키워드가 시뮬레이션 용이라는 것을 몰랐다. (내가 본 시뮬레이션 예제들은 참조신호를 복사해 지연시키고 xor하여 논리합으로 구현하는 것이었다.  이것이 간단히 구현되는 바람에 상당히 매력을 느낀상태였다.) 어쩐지 아무리 after를 줘봐도 신호차이가 발생하지 않더라.

나중에 PLL(Phase Locked Loop)을 사용하여 신호 주기를 변경할 수 있고, 이는 칩 업체마다 PLL 모듈을 제공한다는 것을 알았다.

iCE40 family도 PLL을 제공하며, 이중 HX1K는 1개를 제공(TQ144 혹은 CB132 패키지만)한다.  내가 이쪽에 문외한이라 최대한 인터넷에서 간단한 예제를 찾아봤으나 쉽게 찾을 수는 없었는데, 그중 가장 간단한 예제를 결국 찾아 실행되는것을 확인하였고, 이를 'iCE40 sysCLOCK PLL Design and Usage Guide' 문서의 설명대로 파라메타
를 일부 조정하여 아래와 같은 결과(96.15Mhz)를 얻었다. 나와 같은 초보자들에게 참고가 되길 바란다.



아래 테스트한 verilog hdl 코드를 올린다. 




PLL설정을 다시 이해하고 테스트 해보았다. 12Mhz의 클럭을 가지고 있는 Lattice ice40이 낼 수 있는 최대 클럭은 384Mhz 이다.



이와 유사하게 50Mhz 클럭을 가진 Altera Cyclone IV의 PLL을 이용하여 500Mhz 클럭을 만들어 보았다. 이것은 1GHz 이상의 더 빠른 클럭 생성이 가능하다.


Sunday, June 10, 2018

Arduino Minimization [Part 1] Standalone MCU [Eng]

The development board, the Arduino series, is really an easy-to-access development kit that does not need a foundation in electronics to make real electronic circuitry. It's like programming in BASIC language.
arduino uno에 대한 이미지 검색결과
Arduino Uno

However, when using the development board such as Arduino Uno, there are some troubles. One is to purchase Arduino Uno whenever you develop to practice miscellaneous projects. The genuine price of Uno board is about 20,000 won(Korean), and the compatible product is about 5 ~ 6 thousand won, so purchasing several boards for simple experiment is a burden. I've been testing a lot of trivial things because of curiosity. That's why I bought many development kits like Uno, Mega, and Due. In the end, I remember wandering to Ali Express and buying a compatible board as cheaply as possible.

It is a little unfortunate that you try to disassemble what you've already made on the breadboard each time to try something new. It's no different than buying an expensive Lego to destruct to make new one.

Another problem is the size of the development board itself. I try to implement a simple system, but even the simplest uno board is not small enough because it is the size of a palm. And it's a little annoying that it contains things that seem to be not needed. Of course, there are smaller versions like Arduino Pro Mini and Arduino Nano that have the same performance to Uno.

arduino nano에 대한 이미지 검색결과
Arduino Nano
arduino pro mini에 대한 이미지 검색결과
Arduino Pro Mini
Arduino Pro Mini is the smallest but requires a separate FTDI to upload sketches.

ftdi232에 대한 이미지 검색결과
FTDI232


The Arduino Pro Mini still has some unnecessary elements inside, such as voltage regulators, indicator LEDs, and switches as the case may be. If only the MCU is available, it can be integrated directly on the development test board, which will be most advantageous for miniaturization. So, can not we just use core chips (MCUs)? Of course, it is possible, but there are some restrictions to use it. Let's talk about the easy-to-handle DIP type. (If you can handle SMD well, you can use SMD type.)

atmega328p dip에 대한 이미지 검색결과
ATmega328p DIP type

ATmega328p (below 328) in the form of DIP can be used on a universal board. From now on, let's just talk about the more important thing, not just appearance, for using the MCU in an independent form. First, an external power supply is basically required for the MCU to operate.

atmega328p pinout에 대한 이미지 검색결과
ATmega328p Pinout

The 328 has two VINs. The power must be applied within the drive voltage at pin numbers 7, 8 and 21, 22. The 328 may already be operational when the power is turned on. However, an external clock signal must be provided for normal operation. This part corresponds to pin numbers 9 and 10 written in XTAL.
arduino uno crystal oscillator에 대한 이미지 검색결과
Crystal
The 328 can be driven with an external clock with a set of power and crystal + capacitors. However, you can also remove it because the 328 contains its own oscillator already. So why use an external clock? It is because of the difference in precision performance that 328 can not use 16Mhz, which is the default speed in Uno, when using internal clock, and it operates at 8Mhz maximum.

You do not have to use 16Mhz, right? That's right. If you are dealing with sensors for IoT implementation, logic implementation is more important than the clock speed. Of course, even in the case of logic implementation, if the sensor needs the sophisticated timing and resolution, it is good to be unconditionally fast. And the timer is limited to half of 62.5Khz at 16Mhz because it runs at clock speed.

Please read the following article about timer:

But today, our value lies in miniaturization. Let's use the built-in oscillator and proceed to the next story.

With the built-in oscillator, there are no additional components to connect to the 328. Now let's talk about how to get a program (sketch) upload. This part will be covered in [Part 2].

I think the convenience of the Arduino is probably due to the bootloader in many case. It obscures the complex settings for the MCU and eliminates the need for programming peripherals. Next, let's talk about it.


Coming soon: Using Arduino Minimization [Part 2] Bootloader










Saturday, June 9, 2018

아두이노 최소화로 사용하기 [1부] MCU의 독립

개발보드인 아두이노 시리즈는 정말 실전 전자회로 자작품을 만드는데 전자공학에 기초가 없는 초보자도 접근하기 쉬운 개발키트이다. 프로그램으로 따지자면, BASIC 같은 것이리라.
arduino uno에 대한 이미지 검색결과
Arduino Uno

그러나, 아두이노 우노 등 개발보드를 사용하다 보면 몇가지 고민거리가 생긴다. 하나는 잡다한 프로젝트를 연습삼아 개발해볼때 마다 아두이노 우노를 구매하기가 그렇다. 우노 보드의 정품가는 약 2만원대, 호환품은 약 5~6천원대이므로 간단한 여러가지 실험을 위해 여러개를 구매하는것은 좀 아깝고 부담도 된다. 필자는 지금도 그렇지만 초창기 여러가지 궁금한 것들을 테스트 하느라 벌려 놓은것이 많았고 그러한 이유로 Uno, Mega, Due 등 여러가지를 구매하여 사용하게 되었다. 이후로는 최대한 싸구려 호환보드를 구매하기 위해 알리익스프레스를 뒤적거리던 기억도 난다.

혹은, 매번 기존에 빵판에 만들어 놓은것을 해체하여 새로운 것을 시도하는것도 좀 무언가 아깝기도 하다. 기껏 시제품(?)을 만들어 놓고 해체하면 비싼 레고 구매해서 잘 만들어 놓고 다른 것 해보겠다고 뽀개는 것과 비슷하지 않은가.

또 하나의 문제점은 개발보드의 크기 자체에 있다.  간단한 시스템을 구현해 보려는데 가장 단순한 우노 보드만 봐도 손바닥 만한것이 소형화에 문제가 있고, 핵심 부품인 MCU(ATmega328p) 외에 나머지 별로 필요해 보이지 않는 것들까지 포함되는게 좀 거슬리기도 한다. 물론, 이런 경우를 위해 Arduino Pro Mini와 Arduino Nano와 같은 우노와 같은 성능의 소형 버전이 존재한다. 

arduino nano에 대한 이미지 검색결과
Arduino Nano
arduino pro mini에 대한 이미지 검색결과
Arduino Pro Mini
Arduino Pro Mini의 경우 가장 소형이지만 스케치를 업로드 하기 위해서는 별도의 FTDI가 필요하다.

ftdi232에 대한 이미지 검색결과
FTDI232


Arduino Pro Mini를 봐도 내부에 전압 레귤레이터, 인디케이터 LED, 스위치 등 사실 경우에 따라 불필요한 소자들이 여전히 존재한다. MCU만 사용할 수 있으면 개발 테스트 보드에 직접 통합이 가능하므로 소형화에 가장 유리할 것이다. 그렇다면, 그냥 핵심 칩(MCU)만 사용할 수는 없을까?

물론 가능하다, 다만 그렇게 사용하기에는 몇가지 제약이 따른다. 여기서는 다루기 쉬운 DIP 타입을 기준으로 이야기 해보자. (SMD를 잘 다룰 수 있다면 SMD 타입을 사용할 수도 있겠다.)

atmega328p dip에 대한 이미지 검색결과
ATmega328p DIP type

우선 DIP 형태의 ATmega328p(이하 328)는 만능기판에 사용할 수 있으니 논하기가 적합한것 같다. 그럼, 외형적인 이야기는 이만하고, MCU를 독립적인 형태로 사용하기 위한 보다 중요한 문제를 이야기 해보도록 하자.

우선 MCU가 동작하기 위해서는 기본적으로 외부 전원이 필요하다. 

atmega328p pinout에 대한 이미지 검색결과
ATmega328p Pinout

328의 전원은 두곳이다. 핀번호 7, 8번과 22, 21번에서 328의 구동전압으로 전원을 인가한다.  전원을 넣는것 만으로도 328은 이미 동작을 시작할 수도 있다. 다만, 동작이 가능하려면 외부에서 클럭 신호가 주어져야 한다. 그 부분은 XTAL이라고 적혀있는 핀번호 9, 10번에 해당한다. 
arduino uno crystal oscillator에 대한 이미지 검색결과
Crystal
전원과 crystal + capacitor 세트로 이루어진 외부 클럭이면 328은 자체적으로 구동될 수 있다. 하지만, 이마저도 제거할 수 있는데, 그것은 328은 자체 발진기를 내부에 포함하고 있기 때문이다. 그런데 왜 외부 클럭을 구지 사용할까? 그것은 성능(정교함)의 차이 때문이라고 할 수 있을 것 같은데, 내부 클럭을 사용 시에는 328이 우노에서 기본 설정속도인 16Mhz를 사용할 수 없고 최대 8Mhz로 동작하기 때문이다.

16Mhz를 사용하지 않으면 되잖아? 맞는 말이다. 보통 IoT 구현을 위한 센서류를 다루다 보면, MCU의 역할이 연산의 속도 보다는 로직 구현이 더 중요하기 때문에, 빠르면 좋겠지만 8Mhz의 속도가 충분한 경우가 많다.  물론 로직의 구현이라고 하더라도, 센서와의 연동 과정에서 클럭의 정교함이 필요한 경우에는 무조건 빠른게 좋다. 왜냐면 타이머는 클럭에 맞추어 돌아가기 때문이다.

타이머 분주에 관련하여 다음 글을 읽어보기를 바란다:

하지만 오늘 우리의 가치는 소형화에 있다. 내장 발진기를 사용하는것으로 하고 다음 이야기를 진행해보도록 하자.

내장 발진기를 사용하게 되면 더 이상 328에 추가적으로 연계할 부품은 없다. 
이제 이 상태에서 어떻게 프로그램(스케치)을 올리게 되는지 이야기를 해보자. 이 부분은 [2부] 에서 다루도록 하겠다.  

아두이노의 편리함은 MCU에 대한 복잡한 설정부분을 감추고 프로그래밍에 필요한 주변장치를 필요없게 해주는 부트로더 덕분이 아닐까 한다. 다음에 바로 그 이야기를 해보도록 하자.


예고: 아두이노 최소화로 사용하기 [2부] 부트로더