최근, 교육자들로부터 몇 가지 요청을 받았습니다. 수업용으로 완벽한 마이크로컨트롤러 선택에 도움을 줄 수 있는 지침을 찾고 있는 중이었습니다.
선택할 수 있는 저비용 고성능 제품이 너무 많기 때문에 이는 간단한 질문이 아닙니다. 8051, MSP430, Z8, AVR, 그리고 PIC와 같은 고전적인 8비트 마이크로컨트롤러가 있으며, 다수의 제조업체에서 공급하는 ARM과 그 외 32비트 제품 같은 최신 제품도 있으며, 또한 SoC(System on Chip, 시스템 온 칩)와 FPGA(Field Programmable Gate Array, 필드 프로그래머블 게이트 어레이) 같은 옵션도 있습니다. 이러한 고급 마이크로컨트롤러 옵션은 유연한 아날로그 처리와 고속 및 병렬 디지털 처리 성능을 제공합니다.
어디서부터 시작해야 할까요?
완벽한 마이크로컨트롤러는 하나도 없다는 것을 받아들여야 합니다. 대신, 설계자가 정해진 설계에 맞게 최적화할 수 있는 다양한 마이크로컨트롤러가 있습니다. 완벽한 마이크로컨트롤러는 단 하나도 없기 때문에, 수업에 사용할 단 하나의 솔루션을 기대해서는 안 됩니다.
교실에서 마이크로컨트롤러를 가르친 제 경험과 의견을 공유하고자 합니다. 디지키 팀에 합류하기 전, 완전 초보에서부터 스스로 성과를 보이는 학생이 있는 캡스톤 전기공학 수업에 이르기까지 다양한 학생들에게 마이크로컨트롤러 수업을 가르쳤습니다. 또한 다양한 마이크로컨트롤러를 사용해 수업을 진행하였습니다. 제가 가장 경함이 많은 교수는 아니지만, 이 게시글에서 일부 유용한 내용을 찾을 수도 있을 것입니다.
이 게시글의 내용은 1/2학기 마이크로컨트롤러 수업에 적용 가능합니다. 이 게시글의 개념은 고등학교 고학년 학생 및 공과 또는 전기공학 프로그램에 입학하는 대학생에게 적합합니다. 마이크로컨트롤러를 외부 회로에 연결함으로써 프로그래밍과 시제품 제작 필요성 사이의 균형을 맞추려 노력할 것입니다.
프로그래밍 기초
교육자가 해결해야 하는 첫 번째 문제 중 하나는 학생들의 프로그래밍 기술 수준입니다. 마이크로컨트롤러의 잠재력을 발휘하기 위해서는 데이터 타입, 분기, 반복, 함수와 같은 개념을 신속하게 배워야 합니다.
어려운 방법
마이크로컨트롤러에 하드웨어를 연결한 상태로 프로그래밍, 주변 장치의 동작, 규격서의 레지스터 설명에 대한 해석도 동시에 가르쳐 보는 것입니다.
쉬운 방법
여러분의 학업 프로그램에 아직 입문 프로그래밍 수업이 없다고 가정하면 두 가지 선택지가 있습니다. 첫째는 GDB 온라인 디버거와 같은 온라인 도구를 사용하는 C 프로그래밍에 중점을 두고 마이크로컨트롤러 외적인 부분에 수업 시간을 한 달간 할애하는 것입니다. 다른 안은 아두이노 커뮤니티를 활용하는 것입니다. 삼색 LED나 압전 버저와 같은 단순한 하드웨어를 사용하여 분기, 반복 그리고 함수를 탐구하는 것입니다.
기술 조언: 아두이노라는 용어에는 여러 측면이 있습니다. 하나는 아두이노라는 회사 자체에 초점을 맞추는 것입니다. 다른 하나는 크고 활동적인 커뮤니티 기반을 가진 오픈 소스 플랫폼이라는 것을 인지하는 것입니다. 이는 모든 학생들이 활용해야 할 귀중한 정보입니다.
동시에, 아두이노와 관련된 교육적 모순을 인지할 필요가 있습니다. 쉽게 프로그래밍하기 위해 설계되었지만, 프로그램은 단순하지 않습니다. 예를 들어, “단순한” digitalWrite() 함수에 대해 생각해 보십시오. 이 함수를 모든 아두이노 제품군에 원활하게 통합하기 위한 아두이노 코드는 결코 단순하지 않다는 것을 알게 될 것입니다.
브레드보드 친화적 장치
전기 기술 또는 전기 공학 수업을 가르친다고 가정하면, 학생들은 브레드보드 회로를 기대해야 합니다. 이는 학생들이 마이크로컨트롤러의 목적을 이해하고 이전 전자공학 수업에서 배운 내용을 보강하는 데 도움이 될 것입니다.
브레드보드와 관련하여, 아래와 같은 몇 가지 적용 가능한 폼 팩터가 있습니다:
- DIP(Dual Inline Package, 이중 직렬 패키지) 마이크로컨트롤러: 마이크로컨트롤러 대부분은 표면 실장 형태로 생산됩니다. 한 가지 예외가 마이크로칩 테크놀로지에서 계속 생산하고 있는 DIP 패키지 형태의 마이크로컨트롤러입니다.
- SMD(Surface Mount Device, 표면 실장 장치) - DIP 어댑터: 어댑터 기판을 사용하면 대부분의 저가형 마이크로컨트롤러를 브레드보드와 함께 사용할 수 있습니다.
- 브레드보드 친화적 장치: 많은 마이크로컨트롤러 평가 기판이 대상 마이크로컨트롤러와 프로그래머, 심지어 인서킷 디버거를 포함하고 있습니다. Silicon Labs의 Busy Bee, ST마이크로일렉트로닉스의 Nucleo, 마이크로칩의 Curiosity Nano, 그리고 아두이노의 나노 제품군 등이 대표적입니다. 마이크로컨트롤러 개발 키트를 브레드보드와 인터페이스할 수 있는 쉴드(shield), 햇(HAT), 케이프(cape) 또는 다른 이름을 가진 확장 기판들도 있습니다.
저전압 추세에 맞춰 3.3VDC 부품에 주력할 것을 추천드리며 그에 따라 향후 유연성도 높아질 것입니다.
선호하는 옵션
마이크로칩의 PIC와 AVR이 눈에 띕니다. 이 제품들 대부분은 8, 14, 20, 28, 그리고 40핀 DIP 패키지 형태로 사용 가능합니다.
기술 조언: 점점 더 작은 풋프린트를 지향하는 트렌드에 따라 많은 고유한 SMD 패키지가 있습니다. 패키지가 큰 SMD 소자 중에서 SOIC 제품을 종종 볼 수 있습니다. 이런 SOIC-16용 어댑터를 사용할 수 있습니다. 이 소자는 기술 및 공학 1학년 학생들이 충분히 납땜할 수 있는 수준입니다. 폐PCB에서 약간만 연습하면 열풍기 또는 작은 평범한 납땜 인두를 사용하여 SOIC를 납땜할 수 있습니다.
디버깅 기법
프로그램을 빨리 디버그 할 수 있는 능력을 개발해야 합니다. 여기에는 컴파일 및 런타임 오류도 포함됩니다. 대부분의 IDE는 컴파일 오류에 대한 지원이 잘 되어 있으며 간혹 의심스러운 코드 라인으로 이동해 보여주는 도구도 있습니다. 런타임 오류에 대해서는 이러한 지원이 제공되지 않습니다.
중급 학생들이 사용할 수 있는 디버깅 기법에는 다음과 같은 것들이 있습니다:
- 브레이크포인트(breakpoint, 중단점)와 워치포인트(watchpoint, 감시점): 지원한다면, 이 도구들을 통해 프로그래머는 마이크로컨트롤러 내부를 “들여다보고” 마이크로컨트롤러의 주변 장치와 관련된 변수와 레지스터를 검사 및 심지어 변경할 수도 있습니다.
- 입출력 핀(들): 이는 외부 LED나 오실로스코프로 듀티 사이클을 보는 것만큼 간단합니다. 보다 복잡한 사례에는 멀티 비트 로직 분석기를 사용할 수도 있을 것입니다.
- 프린트 문: 이 간단한 기법으로 프로그래머는 직렬 모니터 또는 직렬 그래픽 디스플레이에 값을 표시할 수 있습니다. 강력한 기법이지만, 마이크로컨트롤러의 리소스를 소비하며 고속 처리의 타이밍에 지장을 줄 수 있습니다.
- 시뮬레이션: 사용이 가능하다면, 이 도구를 통해 브레이크포인트 및 워치포인트와 유사하게 (마이크로컨트롤러를) 이해할 수 있습니다.
학생들은 디버깅 기법을 배우고 적용하는 데 많은 시간을 보낼 것입니다. 교육자로서, 학생들의 학습을 지원하기 위해서는 상호 공조하는 마이크로컨트롤러, IDE 그리고 관련 디버깅 도구를 선택하는 것이 중요합니다. 모든 것을 고려할 때, 브레이크포인트와 워치 윈도우(watch windows, 감시창)가 이 과정에 필수적인 부분이라고 강조하고 싶습니다.
아직 보지 않으셨다면, Jay Carlson의 The Amazing $1 Microcontroller를 살펴볼 좋은 시점입니다. 해당 사이트는 교육 환경에 적합한 다양한 저가 마이크로컨트롤러에 대한 심도 있는 탐구를 제공합니다. 마이크로컨트롤러와 이를 지원하는 인프라의 여러 측면을 나란히 비교하여 살펴봄으로써 전체 마이크로컨트롤러 생태계를 총체적으로 이해할 수 있습니다.
선호하는 옵션
저가 인서킷 디버거를 지원하는 모든 플랫폼을 선호합니다. Carlson의 제안과 저 자신의 경험에 비춰, Silicon Labs의 8051과 작은 PIC16 제품군을 포함한 8비트 마이크로컨트롤러를 선호하는 경향이 있습니다. 새로운 MPLAB의 지원으로 ATtiny도 강력한 후보입니다.
주변 장치 활성화
그래픽적인 주변 장치 설정 도구는 프로그래머의 작업 흐름에 있어 중요한 부분입니다. 오늘날 거의 모든 IDE(Integrated Development Environment, 통합 개발 환경)는 이러한 자동화된 도구를 포함하고 있습니다. 그럴 만한 이유가 있습니다. 마이크로컨트롤러 주변 장치의 크기와 복잡성이 급증함에 따라 관련 규격서의 크기와 복잡성도 증가하였습니다.
교육자로서, 우리는 한 발 물러나 이러한 도구가 적절한지 질문할 필요가 있습니다. 최신의 200MHz 32비트 ARM과 설정 도구 사용의 업계 표준 관행에 주목할 필요가 있다는 타당한 주장이 있습니다. 그러나, 주변 장치 설정과 관련된 기초와 사고 과정을 학생들에게 가르치기 위해 학생들에게 기본 이론을 가르쳐야 한다는 강력한 주장도 있습니다.
이론과 관행을 분리하는 것이 중요합니다.
먼저 노련한 마이크로컨트롤러 프로그래머의 행동을 그들이 생각하는 그리고 경험 많은 전문가가 될 수 있었던 근본적인 기반과 혼동하지 않도록 주의해야 합니다. 자동화된 도구가 예상치 못한 동작을 하게 될 경우, 학생들은 규격서를 찾아 해석할 수 있어야만 합니다.
따라서, 선택 과정에 규격서의 페이지 길이를 고려하시기 바랍니다. 페이지 길이는 마이크로컨트롤러 주변 장치의 복잡성과 직접적으로 관련이 있습니다. 100페이지로 제한하고 싶지만, 이렇게 하면 거의 모든 최신 마이크로컨트롤러가 제외됩니다. 300페이지면 보다 적절할 것입니다. 이 정도면 초보자에게 적당하면서도 감당 가능한 수준의 주변 장치 세트일 것입니다.
학생들에게 자원이 부족할 것이라는 합리적 비판이 있을 수 있으며, 충분히 일리가 있습니다. 실제로 메모리와 입출력 핀이 부족할 수도 있습니다. 그러나, 이는 소자 최적화를 할 수 있는 학습 기회가 될 수도 있습니다. 학생들은 프로그램 크기를 최소화하기 위해 정수 계산에서 배웠던 것을 조사할 것입니다. LCD 드라이버 핀 4비트를 4 x 4 푸시버튼 행렬의 열(column) 선택기로 사용하면 핀 멀티플렉싱을 조사할 것입니다. 입출력을 확장할 수 있는 개인적으로 가장 좋아하는 해결책도 있습니다. 더블 버퍼인 SN74HC595N은 직렬 통신에 입문하기에 훌륭한 소자입니다. MCP23017-E/SP도 실험실에 추가해 두기에 좋은 소자입니다. 이 특정 I^2C 소자는 입출력 핀 방향의 개념을 보강하면서 직렬 통신에 대한 학습을 이어 나갑니다.
선호하는 옵션
작고 단순한 것이 좋습니다. 여전히 8051, PIC16 및 ATtiny를 선호하는 편입니다.
인터럽트 서비스 루틴, 스택, 문맥 저장 및 슬립
ISR(Interrupt Service Routine, 인터럽트 서비스 루틴)은 관련 하드웨어 및 프로그래밍 기법과 더불어 마이크로컨트롤러 프로그래밍에서 가장 중요한 부분입니다. 이들은 마이크로컨트롤러를 정의하며 효율적인 실시간 처리의 핵심입니다. 이를 이해한 학생은 RTOS(Real Time Operating System, 실시간 운영 체제)와 같은 상위 개념과 DMA(Direct Memory Access, 직접 메모리 접근)와 같은 고급 주변 장치로 넘어갈 준비가 된 것입니다. 안타깝게도, 이러한 추상적인 개념들은 복잡해서 초보자가 쉽게 알 수는 없습니다. 복잡성은 마이크로컨트롤러의 설정 옵션과 대등하다고도 주장할 수 있습니다.
RTOS에 대해 생각해보죠. 이는 강력한 마이크로컨트롤러 기반 프로그래밍 도구로 공부할 가치가 있습니다. 유의미한 RTOS의 논의에는 문맥 교환과 타이머의 개념이 수반됩니다. 단순하게 접근하면 RTOS는 일정한 간격으로 작업 간 교환을 수행하는 마이크로컨트롤러 소프트웨어로 볼 수 있습니다. 그 결과 마이크로컨트롤러는 작업을 동시에 수행하는 것처럼 보입니다. RTOS는 각 요소가 무엇을, 언제, 어떻게 동작 시켜야 하는지를 정의한 잘 짜인 프로토콜을 통해 문맥 교환 및 조정의 백그라운드 작업(background task)을 처리합니다.
앞서 우리는 완벽한 마이크로컨트롤러는 존재하지 않으며, 대신 정해진 제품의 설계에 맞게 최적화할 수 있는 마이크로컨트롤러를 선택한다고 언급하였습니다. 대부분의 제품에서 멀티태스킹 기능과 같은 RTOS가 필요하지만, RTOS와 관련된 오버헤드(overhead)가 필요하거나 요구되지는 않습니다. 이 문제에 대한 해결책은 마이크로컨트롤러만큼이나 오래되었으며 ISR의 형태로 제공됩니다.
ISR을 통해 마이크로컨트롤러는 포그라운드-백그라운드(foreground-background) 스케줄러를 사용하여 동작할 수 있습니다. 포그라운드가 ISR이고 백그라운드는 main( )의 내용입니다. 간단한 예로는 4 세그먼트 디지털 시계 디스플레이와 같은 다중 세그먼트 SSD(Seven Segment Display, 7 세그먼트 디스플레이) 멀티플렉서가 있습니다. main()의 프로그램이 표시할 값을 계산할 것입니다. 그런 다음 타이머에 기반한 ISR을 사용하여 특정 세그먼트를 활성화합니다. 백그라운드에서 마이크로컨트롤러는 대부분의 시간 동안 대기 모드에 있을 것입니다. 그동안 ISR은 지속적인 시각 효과를 유지하기 위해 각 SSD 세그먼트를 충실히 업데이트할 것입니다.
학생들의 첫 탐구에 적합한 다른 ISR 예제로는 다음이 있습니다:
- 비교적 정확한 시간 지연을 제공하는 논블로킹 타이머
- 직렬 모니터 또는 직렬 기록 장치에 위치를 주기적으로 보고하는 고속 구적 엔코더(quadrature encoder) 읽기
- 주파수 측정
- 펄스 폭 측정
- 노래 재생(음(note)과 음가(note duration)에 대한 두 개의 타이머 사용)
- 타이밍이 확정적인(deterministic) 비례(Proportional) 또는 비례 미분(Proportional Derivative) 제어기
이러한 고전적인 ISR에 기반한 아이디어들 모두 간단하지 않습니다. 문제 해결의 어려움은 말할 것도 없이, 포그라운드와 백그라운그 처리 간에 멀티바이트 정보의 전송과 관련하여 상당한 어려움이 있습니다. 학생들이 플래그(flag)와 메일박스(mailbox) 같은 해결책을 배워 나가면, RTOS와 관련된 세마포어(semaphore)와 잠금(lock) 같은 개념에 대해서도 준비가 될 것입니다.
같은 맥락에서, 수업 시간은 소중한 자원입니다. 핵심 내용이 불필요한 정보에 묻히지 않도록 모든 노력을 기울여야 합니다. 이를 위한 가장 좋은 방법 중 하나는 비교적 간단한 마이크로컨트롤러를 선택하는 것입니다. 기능 집합이 작고 그에 따라 규격서도 작으면 학생들은 구현과 관련된 세부 사항을 빠르게 파악할 수 있습니다. 아이디어와 관련된 다양한 설정 옵션을 찾아 수십 페이지를 읽어야 할 필요가 없습니다. 목표는 아이디어를 명확히 한 다음 효과적인 해결책을 구현하면서 배우는 것입니다.
선호하는 옵션
작고 단순한 것이 좋습니다. 6핀 PIC10으로 다시 돌아가지는 않을 것입니다. 대신, 단순한 PIC16 제품군 중에서 8051 또는 ATtiny가 적합할 것입니다.
기술 조언: 이 섹션을 마치기 전에, 8051을 좀 더 자세히 살펴봐야 합니다. 제 생각에, 8051은 문맥 교환을 위한 가장 멋진 해결책 중 하나입니다. PIC에는 하나의 작업 레지스터(working register) (W)가 있으며 AVR에는 ALU(Arithmetic Logic Unit, 산술 논리 장치)와 밀접하게 관련된 32개의 8비트 레지스터가 있습니다. 8051에도 32개의 8비트 레지스터가 있지만, 한 번에 8개의 레지스터만 접근할 수 있습니다. 두 개의 뱅크 선택 비트가 어떤 옥텟이 사용 가능한지 결정합니다. 이를 통해 프로그래머는 싱글 사이클(single cycle) 명령어로 다양한 작업 간에 문맥을 교환할 수 있습니다. 이 스마트한 솔루션은 포그라운드-백그라운드 처리와 같은 상황에서 유리할 수 있습니다.
비용
최근의 세계적인 사건들로 많은 학교가 전자 공학 실험실을 운영하는 방식을 바꾸었습니다. 온라인 또는 하이브리드 수업이 이제는 일반적입니다. 학생들이 본인의 부품과 테스트 장비를 구입해야 하는 경우가 많습니다. 따라서, 마이크로컨트롤러뿐만 아니라 지원 하드웨어의 비용까지도 신중하게 고려해야 합니다.
다수의 평가 키트가 프로그래머를 포함하고 있으며 일부는 통합된 인서킷 디버거도 포함하고 있기에, 단연코 평가 키트는 나아갈 방향입니다. 앞서 언급한 Nucleo, Curiosity와 Busy Bee 모두가 대표적인 예입니다. 이들은 사용하기 편리하지만 일회성 제품입니다.
대안으로, 학생들은 모든 기능이 갖춰진 외부 디버거를 대신 구매할 수도 있습니다. 대략 평가 기판 2~3개의 가격으로 디버거와 마이크로컨트롤러 여분 몇 개를 구매할 수 있을 것입니다. 예로는 Silicon Labs의 USB Debug Adapter 또는 마이크로칩 테크놀로지의 MPLAB SNAP이 있습니다. 두 장치 모두 가격과 기능이 비슷합니다. 마이크로칩은 PIC와 AVR 소자를 모두 프로그래밍할 수 있다는 점에서 이점이 있을 수 있습니다.
교육적 관점에서, 학생들이 마이크로컨트롤러를 디버거에 물리적으로 직접 연결하는 것은 좋은 부분이 있습니다. 이를 통해 관련 프로그래밍 입출력 핀들을 다른 장치와 공유할 수 있는지 아니면 공유할 수 없는지에 대해 더 잘 이해할 수 있게 됩니다. 이 개념은 마이크로컨트롤러의 전원 공급에도 적용됩니다. 배웠던 교육을 통해 학생들은 마이크로컨트롤러, 디버거용 헤더 그리고 적절한 전원을 갖춘 PCB를 처음부터 제작할 수 있는 능력을 키울 수 있을 것입니다.
선호하는 옵션
변함없습니다. 작은 PIC16 계열인 8051과 ATtiny를 여전히 선호합니다.
기술 조언: ATtiny의 일부 부품은 아두이노를 프로그래머로 사용해 프로그래밍할 수도 있습니다. 비용 측면에서는 매력적이지만, 이 시스템은 인서킷 디버깅 기능이 부족합니다.
교재와 포럼 자료
이 게시글은 PIC 및 AVR 계열의 일부 제품과 8051 같은 마이크로컨트롤러의 사용을 지지합니다. 이들은 새로운 소자가 아닙니다. 8051과 그 파생 제품은 1980년으로 거슬러 올라가며 PIC는 1976년으로 거슬러 올라갑니다. AVR은 상대적으로 새로운 소자로 1996년에 등장하였습니다. 아마 이 소자들은 여러분보다 나이가 많을 것이며, 대부분의 학생들보다는 확실히 나이가 많을 것입니다. 이 상황을 어떻게 보느냐에 따라 이는 좋은 소식일 수도 그리고 나쁜 소식일 수도 있습니다.
우선, 이러한 8비트 마이크로컨트롤러의 오랜 지속성을 인정할 필요가 있습니다. 이들은 수십 년을 우리와 함께 해왔으며 앞으로도 함께 할 가능성이 높습니다. 이는 그들이 여전히 유의미하며 연구할 가치가 있음을 다른 방식으로 말하는 것입니다. 8051을 예로 들어보면, Keil 프로세서를 지원하는 소자 페이지를 방문할 때마다 항상 깊은 인상을 받습니다. 8051 파생 제품의 목록은 새로운 제품이 추가될 때마다 New! 라고 굵게 표시되며 계속해서 늘어나고 있습니다.
다음으로, 수십 년에 걸쳐 방대한 관련 자료가 생성되었다는 것도 인정할 필요가 있습니다. 이 중 많은 부분이 오늘날의 8비트 제품에 여전히 유효합니다. 20년 이상 활발히 활동하고 있는 AVR Freaks와 같은 다양한 포럼도 있습니다. 다음은 관련 포럼을 추린 목록입니다:
나쁜 소식도 있으며, 그 중 일부는 이론과 관행을 분리하는 문제에서 비롯됩니다.
마이크로컨트롤러 교육의 솔루션을 아키텍처는 노후되고 기능은 제한된 50년 된 부품에서 찾는다고 말하는 것에는 위험이 있습니다. 이러한 주장이 설득력이 있다고 믿고 싶지만, 대중적인 솔루션은 아닙니다. 대신, 32비트 ARM, RTOS 및 Python 같은 고성능 솔루션과 아두이노 같은 플랫폼에 대해 많은 관심이 쏠리고 있습니다. 이로 인해 교재의 선택이 어려워집니다. 그러나, 간단한 검색만으로도 출판일이 10~20년은 넘었지만 여전히 많은 교재가 있음을 알 수 있습니다.
교재의 부족 문제는 대체로 제조업체에 의해 완화됩니다. 그러한 자원 중 하나가 Microchip University입니다. 다양한 기술 포럼에 대해서도 이미 언급하였습니다. 동영상도 이용할 수 있습니다. 많은 자료들이 지식이 풍부한 교수들에 의해 고품질로 제작되었습니다. 학생들이 학업에 진지하게 관심을 가지고 있다면 AI도 유용한 도구가 될 수 있습니다.
마무리 소감
마무리를 하면서, 이 주제에 대한 여러분의 생각을 공유해 주십시오. 거의 50년이 되어가는 마이크로컨트롤러 아키텍처가 고급 주제의 토대라는 것에 동의하시나요? 시제품 제작 실습이 적절하게 균형 잡혀 있나요? 더 나은 방법이 있나요? 우리가 무엇을 간과하였을까요?
감사합니다,
APDahlen