PicoRuby란 무엇인가?
PicoRuby는 RP2040과 같은 소형 마이크로컨트롤러를 위해 설계된 경량 Ruby 구현체입니다. 기존에 C 언어와 복잡한 툴체인을 요구했던 펌웨어 개발을 Ruby의 간결함으로 대체하여, 아래와 같이 LED를 제어하는 코드를 순수한 Ruby로 작성할 수 있습니다.
ruby
led = GPIO.new(25, :OUT)
loop do
led.on
sleep 0.5
led.off
sleep 0.5
end
PicoRuby는 GPIO 입출력, ADC(아날로그 센서), PWM(모터, LED, 버저), UART, SPI, I²C, 인터럽트 등 다양한 기능을 거의 설정 마찰 없이 제공하여, .uf2 파일을 플래시하고 시리얼 연결을 통해 Ruby 코드를 작성함으로써 하드웨어를 제어할 수 있게 합니다.
Ruby로 재발견하는 전자 공학
Kimura는 전자 공학에 대한 초기 호기심과 웹 개발로의 전환 후 PicoRuby를 통해 다시금 즐거움을 찾게 된 경험을 공유했습니다. 이는 전기 공학자가 아니더라도 Ruby만 있다면 하드웨어를 구축할 수 있다는 명확한 메시지를 전달합니다.
“킬러 앱”: 커스텀 키보드를 위한 Ruby
많은 개발자들이 PicoRuby를 처음 접하는 계기는 프로그래밍 가능한 키보드입니다. prk_firmware와 같은 펌웨어는 Ruby로 키맵을 정의할 수 있게 하여, 일상적으로 사용하는 키보드를 직접 프로그래밍하는 즉각적인 보람을 제공합니다. 이는 Ruby로 하드웨어를 제어할 수 있다는 가능성을 깨닫게 하며, 더 많은 것을 만들고자 하는 동기를 부여합니다.
실습 예제: Ruby 기반 RC카 제작
Kimura의 발표에서 가장 인상 깊었던 부분 중 하나는 PicoRuby로 완벽하게 작동하는 원격 제어 RC카였습니다. 이 프로젝트는 다음 구성 요소로 이루어졌습니다.
-
PicoRuby를 실행하는 RP2040 보드
-
모터 드라이버
-
두 개의 DC 모터
-
조이스틱 모듈
-
소량의 전선과 브레드보드
이 예제는 초보자에게도 충분히 간단하면서도 실제 하드웨어를 이해하는 데 강력한 인사이트를 제공합니다.
Ruby로 조이스틱 값 읽기
조이스틱은 아날로그 전압을 출력하며, PicoRuby를 사용하면 이러한 값을 자연스럽게 읽을 수 있습니다.
ruby
class JoyStick
def initialize(vertical_pin:, horizontal_pin:)
@adc_vertical = ADC.new(vertical_pin)
@adc_horizontal = ADC.new(horizontal_pin)
end
def vertical
@adc_vertical.read
end
def horizontal
@adc_horizontal.read
end
end
레지스터 조작이나 비트 시프트 없이 read 메서드가 차량 움직임 제어에 사용될 수 있는 숫자를 반환합니다.
PWM으로 모터 구동하기
DC 모터는 PWM 신호를 필요로 합니다. Kimura는 모터당 두 개의 PWM 설정을 사용하여 전진 및 후진을 제어했습니다.
ruby
class Motor
def initialize(positive_pin:, negative_pin:)
@pos = PWM.new(positive_pin, frequency: 100_000, duty: 0)
@neg = PWM.new(negative_pin, frequency: 100_000, duty: 0)
end
def update(duty)
if duty >= 0
@pos.duty(duty)
@neg.duty(0)
else
@pos.duty(0)
@neg.duty(-duty)
end
end
end
이 또한 우아하고 가독성이 높으며 명백히 Ruby다운 코드입니다.
모든 것을 통합하는 Car 클래스
Car 클래스는 조이스틱 값을 모터 속도로 변환하여 전체 시스템을 조율합니다.
ruby
class Car
NEUTRAL = 2000 # Example offset for joystick center
def initialize
@left = Motor.new(positive_pin: 19, negative_pin: 18)
@right = Motor.new(positive_pin: 17, negative_pin: 16)
@js = JoyStick.new(vertical_pin: 26, horizontal_pin: 27)
end
def start!
loop do
calculate_duty
@left.update(@left_duty)
@right.update(@right_duty)
end
end
private
def calculate_duty
vertical = @js.vertical - NEUTRAL
horizontal = @js.horizontal - NEUTRAL
# Convert analog values into motor speeds
@left_duty = vertical + horizontal
@right_duty = vertical - horizontal
end
end
이것이 바로 PicoRuby의 마법으로, Ruby로 작성된 완전한 로봇입니다.
펌웨어 개발이 쉬워지면 창의성이 폭발한다
Kimura는 PicoRuby를 통해 탄생한 추가 프로젝트들을 선보였습니다.
-
커스텀 키보드 모드
-
센서 실험
-
수제 FM 라디오
-
아름답게 디자인된 인클로저 및 물리적 구조물
펌웨어 개발이 쉬워지면 제작자들은 자연스럽게 3D 프린팅, 목공, 아날로그 회로, 인클로저 디자인 등 물리적인 세계로 나아가게 되며, PicoRuby는 이러한 창의성을 증폭시키는 역할을 합니다.
PicoRuby의 미래
발표는 PicoRuby의 로드맵으로 마무리되었습니다.
-
임베디드 장치에서 Ruby 컴포넌트를 직접 재사용할 수 있는 런타임 젬(Runtime Gems)
-
초보자를 위한 더 나은 문서화
-
PicoRuby의 내부 구조 및 실용적인 사용 사례에 대한 완벽한 서적 출간
-
mruby Girls Matsue 1st와 같은 교육 프로그램에 대한 지속적인 지원
이는 PicoRuby가 성장하고 있으며, 누구나 그 성장의 일부가 될 수 있다는 메시지를 전달합니다.