마이크로컨트롤러
센서가 읽은 값을 보고 무엇을 할지 정하려면 판단을 맡을 컴퓨터가 필요합니다. 그 일을 노트북에 맡길 수도 있지만, 액자 뒤나 옷 안에 노트북을 넣을 수는 없습니다. 그래서 쓰는 것이 손톱만 한 컴퓨터입니다.
마이크로컨트롤러(microcontroller)
계산 장치와 기억 장치, 그리고 바깥과 신호를 주고받는 다리(핀)를 한 칩에 모아 놓은 아주 작은 컴퓨터입니다. 화면도 자판도 없고, 대신 센서와 구동기(액추에이터)를 바로 꽂을 수 있습니다.
| 비교할 점 | 노트북 | 마이크로컨트롤러 |
|---|---|---|
| 켜면 | 운영 체제가 먼저 뜨고, 그 위에서 프로그램을 고른다 | 운영 체제가 없다. 넣어 둔 프로그램이 곧바로 돈다 |
| 동시에 | 여러 프로그램이 번갈아 돈다 | 대개 하나만 돈다. 그래서 반응 시간이 거의 일정하다 |
| 바깥과 | 화면 · 자판 · 통신으로 이어진다 | 핀에 선을 꽂아 센서와 구동기에 직접 이어진다 |
| 전기 | 많이 먹는다. 배터리로는 몇 시간 | 아주 적게 먹는다. 작은 전지로도 오래 간다 |
이 과목에서는 라즈베리파이 피코(Raspberry Pi Pico)라는 보드를 쓰겠습니다. 손가락 두 마디쯤 되는 크기에 파이썬으로 프로그램을 쓸 수 있어서 처음 배우기에 알맞습니다.
「하나만 돈다」가 왜 장점인가
노트북은 여러 일을 번갈아 하므로, 같은 명령이라도 어떤 때는 조금 늦게 실행됩니다. 평소에는 티가 안 나지만 0.01초를 다투는 일에서는 문제가 됩니다. 마이크로컨트롤러는 다른 일을 하지 않으므로 늘 거의 같은 빠르기로 답합니다.
「운영 체제가 없다」는 것은 편리하기만 할까요? 운영 체제가 해 주던 일 가운데 여기서는 누가 해야 하는 일이 하나 생깁니다. 무엇일까요?
준비하기
실습을 하려면 두 가지를 준비해야 합니다. 하나는 보드 쪽에, 다른 하나는 내 컴퓨터 쪽에 넣습니다. 이 둘을 헷갈리면 「깔았는데 안 된다」는 말이 나옵니다.
펌웨어(firmware) — 보드 쪽에 넣는 것
보드가 파이썬을 알아듣게 만들어 주는 소프트웨어입니다. 이것을 넣기 전의 피코는 파이썬이라는 말을 모릅니다. 여기서는 작은 기기용으로 줄여 만든 마이크로파이썬(MicroPython)을 넣습니다.
보드에 한 번 넣어 두면 계속 남아 있습니다. 다른 사람이 쓰던 보드라면 이미 들어 있을 수도 있습니다.
편집기 — 내 컴퓨터 쪽에 까는 것
코드를 쓰고, USB로 이어진 보드에 보내고 실행시키는 프로그램입니다. 여기서는 토니(Thonny)를 씁니다. 화면이 단순해서 처음 쓰기 좋습니다.
깔고 나서 어느 보드에 연결할지 한 번 정해 주어야 합니다. 이 설정을 안 하면 코드가 보드가 아니라 내 컴퓨터에서 돌아, 「machine이라는 모듈이 없다」는 말이 나옵니다.
파일을 어디에 저장하는가
편집기에서 저장할 때 「내 컴퓨터에 저장」과 「보드에 저장」을 고르게 됩니다. 이 선택이 중요합니다. 보드에 저장한 것이라야 USB를 뽑고 전지에만 이어도 혼자 돌 수 있습니다. 내 컴퓨터에 둔 파일은 편집기를 통해 보낼 때만 실행됩니다.
전원만 넣어도 돌게 하려면
보드에 저장할 때 파일 이름을 main.py로 두면, 전원이
들어올 때마다 그 파일이 스스로 실행됩니다. 작품을 전시할 때는 이렇게 해 두어야
노트북을 옆에 두고 있지 않아도 됩니다.
친구가 「코드를 실행했더니 machine을 못 찾는다고 나온다」고 합니다. 무엇을 확인해 보라고 하면 좋을까요?
선 세 가닥
부품을 보드에 이을 때 겁먹기 쉽지만, 빛 띠나 온습도 센서처럼 많은 부품은 선 세 가닥이면 이어집니다. 이름만 알면 됩니다.
| 이름 | 하는 일 | 빠뜨리면 |
|---|---|---|
| 전원선 | 부품이 움직일 힘을 준다. 보드의 3V3이나 VBUS 핀에서 나온다. 부품마다 알맞은 전압이 다르므로 설명서를 봐야 한다. | 부품이 아무 반응도 하지 않는다 |
| 접지선 | 전기가 돌아 나가는 길이다. 보드의 GND 핀에 잇는다. 물길로 치면 나가는 쪽이다. | 회로가 이어지지 않아 역시 아무 일도 일어나지 않는다 |
| 신호선 | 보드와 부품이 값과 명령을 주고받는 선이다. 센서면 값이 들어오고, 구동기면 명령이 나간다. GP로 시작하는 핀에 잇는다. | 부품은 살아 있는데 말이 통하지 않는다 |
접지선은 빠뜨리기 쉽다
전원선과 신호선은 하는 일이 뚜렷해서 잊지 않습니다. 접지선은 「그냥 남는 선」처럼 보여서 빠뜨리기 쉽습니다. 그런데 이것이 없으면 전기가 흐르지 못합니다. 부품이 반응하지 않을 때 가장 먼저 확인할 선입니다.
브레드보드는 왜 쓰는가
구멍이 촘촘히 뚫린 판을 브레드보드라고 합니다. 안에서 줄지어 있는 구멍끼리 미리 이어져 있어서, 같은 줄에 꽂기만 하면 납땜 없이 회로가 됩니다.
납땜을 하면 튼튼하지만 한 번 붙이면 바꾸기 어렵습니다. 만드는 동안에는 수없이 바꿔 꽂게 되므로 브레드보드가 알맞습니다. 다 만들고 전시할 때가 되면 그때 튼튼하게 고정합니다.
부품이 전혀 반응하지 않을 때와 켜지기는 하는데 명령을 안 들을 때, 각각 어느 선을 먼저 살펴보아야 할까요?
첫 프로그램
이제 빛을 켜 보겠습니다. 쓸 부품은 여러 알이 한 줄로 박힌 빛 띠입니다. 알마다 색과 밝기를 따로 정할 수 있어서 작품에 두루 쓰입니다. 신호선은 GP0번 핀에 꽂아 두었다고 하겠습니다.
한 알만 켜기
# 네오픽셀 띠의 첫 번째 알만 켠다.
# 띠의 DI(데이터 입력) 선은 GP0번 핀에 꽂아 두었다고 본다.
from machine import Pin
import neopixel
import time
DATA_PIN = 0 # 띠의 DI를 꽂은 핀 번호
COUNT = 8 # 띠에 달린 알의 개수
strip = neopixel.NeoPixel(Pin(DATA_PIN), COUNT)
strip[0] = (0, 40, 60) # 빨강 0, 초록 40, 파랑 60
strip.write() # 정한 값을 실제로 띠에 보낸다
time.sleep(3)
strip[0] = (0, 0, 0)
strip.write()줄마다 무슨 일이 일어나는지 살펴보겠습니다.
| 코드 | 하는 일 |
|---|---|
from machine import Pin |
보드의 핀을 다루는 도구를 가져온다. 이 줄에서 machine을 못 찾는다는 오류가 나면 편집기가 보드가 아니라 내 컴퓨터를 보고 있는 것이다. |
import neopixel |
빛 띠를 다루는 도구를 가져온다. 피코용 마이크로파이썬 펌웨어에 들어 있어 따로 넣지 않아도 되는 도구다. |
strip = neopixel.NeoPixel(...) |
「몇 번 핀에 몇 알짜리 띠가 달려 있다」고 알려 준다. 이 줄부터
strip이라는 이름으로 띠를 다룰 수 있다.
|
strip[0] = (0, 40, 60) |
첫 알의 색을 정해 두기만 한다. 세 숫자는 차례로 빨강 · 초록 · 파랑의 세기이고, 0부터 255까지다. |
strip.write() |
정해 둔 값을 실제로 띠에 보낸다. 이 줄이 없으면 아무 일도 일어나지 않는다. |
자주 겪는 일 — 색을 정했는데 안 켜진다
strip[0] = ...은 메모장에 적어 두는 것이고
strip.write()는 그 메모대로 실제로 하는 것입니다.
여러 알의 색을 정한 뒤 마지막에 한 번만 보내면 됩니다. 알마다 보내고 잠깐씩 쉬면
차례로 켜지는 것처럼 보입니다 — 그것도 하나의 표현입니다.
밝기를 40 · 60처럼 낮게 잡은 데는 까닭이 있습니다. 255에 가까우면 눈이 부셔서 색이 구별되지 않고, 전기도 훨씬 많이 먹습니다. 작품에서는 낮은 값이 대체로 더 곱습니다.
한 알씩 차례로 켜기
이제 알을 하나씩 이어 켜 보겠습니다. 반복이 들어가고, 같은 일을 여러 번 쓰지 않으려고 모두 끄는 일에 이름을 붙였습니다.
# 띠의 알을 한 알씩 차례로 켜고, 끝까지 가면 모두 끈 뒤 다시 시작한다.
from machine import Pin
import neopixel
import time
DATA_PIN = 0
COUNT = 8
strip = neopixel.NeoPixel(Pin(DATA_PIN), COUNT)
def clear():
"""띠의 모든 알을 끈다."""
for i in range(COUNT):
strip[i] = (0, 0, 0)
strip.write()
while True:
for i in range(COUNT):
strip[i] = (0, 30, 50)
strip.write()
time.sleep(0.1)
time.sleep(0.5)
clear()
time.sleep(0.5)while True:안의 것은 전원이 끊길 때까지 계속 반복됩니다. 작품은 대개 이렇게 만듭니다.time.sleep(0.1)의 숫자를 바꾸면 번지는 속도가 달라집니다. 0.02로 하면 훅 지나가고, 0.4로 하면 느릿합니다.clear()처럼 이름을 붙여 두면 나중에 「모두 끄기」를 고칠 일이 생겨도 한 곳만 고치면 됩니다.
해 보기 — 세 가지만 바꿔 보기
- 색을 바꿔 보세요. 세 숫자를 조금씩 바꾸면서 어떤 조합이 곱게 보이는지 찾습니다.
- 속도를 바꿔 보세요. 어느 정도가 「숨 쉬는 것 같다」고 느껴지나요?
- 켜진 알을 끄지 않고 그대로 두면 어떻게 보일까요? 예상해 보고 고쳐서 확인해 보세요.
셋 다 예상을 먼저 적고 실행하세요. 예상과 다르면 그 부분이 내가 아직 잘못 알고 있는 곳입니다.
strip.write()를 for 반복 안이 아니라 for 반복이 끝난 뒤에 한 번만
두면 띠에 무엇이 보일까요? 왜 그럴지 설명해 보세요.
핵심 정리
마이크로컨트롤러
- 계산 · 기억 · 바깥과 이어지는 핀을 한 칩에 모은 아주 작은 컴퓨터다.
- 운영 체제가 없어 넣어 둔 프로그램이 곧바로 돌고, 대개 하나만 돈다.
- 그래서 늘 거의 같은 빠르기로 답한다. 전기도 아주 적게 먹는다.
준비하기
- 펌웨어는 보드 쪽에, 편집기는 내 컴퓨터 쪽에 넣는다.
- 편집기에서 어느 보드에 연결할지 정하지 않으면 코드가 내 컴퓨터에서 돈다.
- 보드에
main.py로 저장하면 전원만 넣어도 혼자 돈다.
선 세 가닥
- 전원선 · 접지선 · 신호선. 많은 부품이 이 세 선으로 이어지고, 전원선의 전압만 부품에 맞춘다.
- 빠뜨리기 쉬운 것은 접지선이다. 반응이 없으면 여기부터 본다.
- 브레드보드는 바꿔 꽂기 쉬워서 만드는 동안에 쓴다.
첫 프로그램
- 색을 정하는 것과 실제로 보내는 것은 다른 일이다.
write()가 없으면 아무 일도 없다. - 세 숫자는 빨강 · 초록 · 파랑의 세기이고 0부터 255까지다.
- 작품에서는 낮은 밝기가 대체로 더 곱다.
확인 퀴즈
배운 내용을 확인해 봅시다.
마이크로컨트롤러가 늘 거의 같은 빠르기로 답하는 까닭은?
펌웨어는 어디에 넣는 것인가요?
부품이 전혀 반응하지 않을 때 빠뜨리기 쉬워 먼저 확인할 선은?
색을 정했는데 빛이 켜지지 않았습니다. 빠뜨린 것은?