Rust 기반 졸업 학사모 제작하기
졸업식은 행진의 엄숙함부터 술(tassel)을 오른쪽에서 왼쪽으로 옮기는 특정한 의식에 이르기까지 전통이 깊게 배어 있습니다. 대부분의 사람들에게 졸업식은 성찰과 축하의 날입니다. 하지만 Eric Park에게는 임베디드 시스템과 Rust 프로그래밍 언어를 실험해 볼 수 있는 기회였습니다.
매력적인 블로그 제목을 만들고 싶다는 욕구와 센서 트리거 조명에 대한 호기심에서 시작된 이 프로젝트에서, Park은 술의 움직임을 감지하고 동기화된 LED 라이트 쇼를 트리거할 수 있는 졸업 학사모를 제작했습니다. 최종 결과물은 실제 졸업식에 쓰기에는 너무 "tacky"하다고 판단되었지만, 기술적인 여정은 Rust와 같은 현대적인 언어를 제약이 많은 AVR 하드웨어로 가져오는 과정에서의 어려움을 보여줍니다.
하드웨어 스택
학사모의 프로필을 슬림하게 유지하고 ESP32와 같은 더 강력한 마이크로컨트롤러의 부피를 피하기 위해, Park은 Digispark ATtiny85를 선택했습니다. 이 선택은 개발의 용이성보다 크기와 비용을 우선시했습니다. 전체 부품 목록(BOM)은 다음과 같습니다:
- Microcontroller: Digispark ATtiny85
- Lighting: 48 WS2812B LEDs
- Sensors: 리드 스위치(reed switch)와 자석 (술의 물리적 움직임을 감지하는 데 사용됨)
- Power: USB-C Power Delivery 트리거 보드와 보조 배터리 조합
- Wiring: 고장 난 Apple USB-C 케이블에서 벗겨낸 재활용 와이어
소프트웨어 과제: AVR에서의 Rust
Rust는 임베디드 시스템에서 점점 더 인기를 얻고 있지만, 오래되거나 매우 특정한 하드웨어에서는 항상 "plug-and-play" 경험을 제공하지는 않습니다. Park은 코드를 작성하는 데 약 2시간이 걸렸지만, 그 시간의 상당 부분은 호환성 문제를 극복하는 데 소비되었습니다.
구체적으로, avr-hal과 ws2812-avr 크레이트(crates)는 ATtiny85를 기본적으로 지원하지 않았습니다. 프로젝트를 실행 가능하게 만들기 위해 Park은 라이브러리를 포크(fork)하고, 타이밍에 민감한 WS2812B LED가 올바르게 작동하도록 기본 클록 속도를 수동으로 16 MHz로 설정하는 것을 포함한 "dirty-patches"를 적용해야 했습니다.
이는 임베디드 Rust 생태계의 공통적인 주제를 강조합니다. 핵심 언어는 엄청난 안전성과 강력한 기능을 제공하지만, 더 작은 비-ARM 칩을 위한 하드웨어 추상화 계층(HALs)은 여전히 수동 개입과 소스 코드에 대한 심층적인 분석을 필요로 할 수 있습니다.
"제목 중심 개발" 철학
이 프로젝트의 가장 솔직한 측면 중 하나는 동기였습니다. Park은 표준 Arduino C++ 라이브러리와 비교했을 때 추가적인 마찰이 있음에도 불구하고 Rust를 사용하기로 한 결정은, 원하는 블로그 포스트 제목인 *"My graduation cap runs Rust."*를 얻기 위함이었다고 인정했습니다.
이러한 접근 방식은 유머러스하지만, 많은 개발자 커뮤니티 구성원들의 공식을 공감합니다. 한 댓글 작성자는 이것이 왜 많은 사람들이 이 분야에 입문하게 되는지에 대한 신선한 상기시켜 줌을 제공한다고 언급했습니다. 즉, 기업의 EBITDA나 제품 이니셔티브와 같은 기업적 지표와는 거리가 먼, 순수하게 호기심와 똑똑똑한 언어유희를 위해 무언가를 만드는 즐거움 말입니다.
커뮤니티의 관점
Hacker News에 공유된 다른 프로젝트와 마찬가지로, 커뮤니티는 기술적인 세밀함과 진심 어린 감탄이 뒤섞인 반응을 임베디드 Rust, ATtiny85 하드웨어, 그리고 졸업식 날의 기발한 상상력 한 스푼을 결합한 창의적인 프로젝트에 대한 심층 분석입니다.
"Rust를 실행하는 것"의 기술적 의미
일부 사용자들은 언어와 그것이 생성하는 머신 코드를 구분하는 의미론적 차리를를 포인트로 짚었습니다. 한 비평가는 다음과 같이 언급했습니다:
"아니, 그건 머신 코드를 실행하는 거야."
다른 이들은 소스 코드를 작성하는 데 사용된 고수준 언어와 관계없이, 하드웨어는 기술적으로 AVR-RISC 명령어 세트를 실행한다고 지정했습니다.