소프트웨어와 생활

피코와 마이크로파이썬

손톱만 한 컴퓨터에
내 명령을 심습니다

학습 목표

  1. 마이크로컨트롤러가 우리가 쓰는 컴퓨터와 어떻게 다른지 설명할 수 있다.
  2. 펌웨어와 편집기를 왜 따로 준비하는지 알고 실습 환경을 갖출 수 있다.
  3. 전원선 · 접지선 · 신호선을 구별하고 첫 프로그램을 올려 빛을 켤 수 있다.

마이크로컨트롤러

센서가 읽은 값을 보고 무엇을 할지 정하려면 판단을 맡을 컴퓨터가 필요합니다. 그 일을 노트북에 맡길 수도 있지만, 액자 뒤나 옷 안에 노트북을 넣을 수는 없습니다. 그래서 쓰는 것이 손톱만 한 컴퓨터입니다.

마이크로컨트롤러(microcontroller)

계산 장치와 기억 장치, 그리고 바깥과 신호를 주고받는 다리(핀)를 한 칩에 모아 놓은 아주 작은 컴퓨터입니다. 화면도 자판도 없고, 대신 센서와 구동기(액추에이터)를 바로 꽂을 수 있습니다.

노트북과 마이크로컨트롤러의 비교
비교할 점 노트북 마이크로컨트롤러
켜면 운영 체제가 먼저 뜨고, 그 위에서 프로그램을 고른다 운영 체제가 없다. 넣어 둔 프로그램이 곧바로 돈다
동시에 여러 프로그램이 번갈아 돈다 대개 하나만 돈다. 그래서 반응 시간이 거의 일정하다
바깥과 화면 · 자판 · 통신으로 이어진다 핀에 선을 꽂아 센서와 구동기에 직접 이어진다
전기 많이 먹는다. 배터리로는 몇 시간 아주 적게 먹는다. 작은 전지로도 오래 간다

이 과목에서는 라즈베리파이 피코(Raspberry Pi Pico)라는 보드를 쓰겠습니다. 손가락 두 마디쯤 되는 크기에 파이썬으로 프로그램을 쓸 수 있어서 처음 배우기에 알맞습니다.

「하나만 돈다」가 왜 장점인가

노트북은 여러 일을 번갈아 하므로, 같은 명령이라도 어떤 때는 조금 늦게 실행됩니다. 평소에는 티가 안 나지만 0.01초를 다투는 일에서는 문제가 됩니다. 마이크로컨트롤러는 다른 일을 하지 않으므로 늘 거의 같은 빠르기로 답합니다.

스스로 확인

「운영 체제가 없다」는 것은 편리하기만 할까요? 운영 체제가 해 주던 일 가운데 여기서는 누가 해야 하는 일이 하나 생깁니다. 무엇일까요?

준비하기

실습을 하려면 두 가지를 준비해야 합니다. 하나는 보드 쪽에, 다른 하나는 내 컴퓨터 쪽에 넣습니다. 이 둘을 헷갈리면 「깔았는데 안 된다」는 말이 나옵니다.

무엇을 어디에 넣는가 내 컴퓨터 편집기 코드를 쓰고 보낸다 한 번만 설치한다 USB 피코 보드 펌웨어 내가 쓴 프로그램

펌웨어(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()처럼 이름을 붙여 두면 나중에 「모두 끄기」를 고칠 일이 생겨도 한 곳만 고치면 됩니다.

해 보기 — 세 가지만 바꿔 보기

  1. 색을 바꿔 보세요. 세 숫자를 조금씩 바꾸면서 어떤 조합이 곱게 보이는지 찾습니다.
  2. 속도를 바꿔 보세요. 어느 정도가 「숨 쉬는 것 같다」고 느껴지나요?
  3. 켜진 알을 끄지 않고 그대로 두면 어떻게 보일까요? 예상해 보고 고쳐서 확인해 보세요.

셋 다 예상을 먼저 적고 실행하세요. 예상과 다르면 그 부분이 내가 아직 잘못 알고 있는 곳입니다.

스스로 확인

strip.write()를 for 반복 안이 아니라 for 반복이 끝난 뒤에 한 번만 두면 띠에 무엇이 보일까요? 왜 그럴지 설명해 보세요.

핵심 정리

마이크로컨트롤러

  • 계산 · 기억 · 바깥과 이어지는 핀을 한 칩에 모은 아주 작은 컴퓨터다.
  • 운영 체제가 없어 넣어 둔 프로그램이 곧바로 돌고, 대개 하나만 돈다.
  • 그래서 늘 거의 같은 빠르기로 답한다. 전기도 아주 적게 먹는다.

준비하기

  • 펌웨어는 보드 쪽에, 편집기는 내 컴퓨터 쪽에 넣는다.
  • 편집기에서 어느 보드에 연결할지 정하지 않으면 코드가 내 컴퓨터에서 돈다.
  • 보드에 main.py로 저장하면 전원만 넣어도 혼자 돈다.

선 세 가닥

  • 전원선 · 접지선 · 신호선. 많은 부품이 이 세 선으로 이어지고, 전원선의 전압만 부품에 맞춘다.
  • 빠뜨리기 쉬운 것은 접지선이다. 반응이 없으면 여기부터 본다.
  • 브레드보드는 바꿔 꽂기 쉬워서 만드는 동안에 쓴다.

첫 프로그램

  • 색을 정하는 것과 실제로 보내는 것은 다른 일이다. write()가 없으면 아무 일도 없다.
  • 세 숫자는 빨강 · 초록 · 파랑의 세기이고 0부터 255까지다.
  • 작품에서는 낮은 밝기가 대체로 더 곱다.

확인 퀴즈

배운 내용을 확인해 봅시다.

Q1

마이크로컨트롤러가 늘 거의 같은 빠르기로 답하는 까닭은?

Q2

펌웨어는 어디에 넣는 것인가요?

Q3

부품이 전혀 반응하지 않을 때 빠뜨리기 쉬워 먼저 확인할 선은?

Q4

색을 정했는데 빛이 켜지지 않았습니다. 빠뜨린 것은?