XMP-1 구축: 저비용 XMOS-라즈베리 파이 모바일 플랫폼
소개
파넬(또는 뉴어크)에서 £12(VAT 포함)에 구매 가능한 XMOS startKIT은 신용카드 크기의 콤팩트 플랫폼으로 라즈베리 파이와 완벽 조합됩니다. 드라이버, 와이어 커터, 플라이어만으로 최소한의 납땜만으로 XMOS의 멀티코어, 저지터 병렬 처리를 활용한 기능적 로보틱스 프로토타입 조립 가능.
본 기사에서는 XMP-1(XMOS Mobile Platform) 구축 과정을 다룹니다. 라즈베리 파이와 XMOS startKIT 간 직렬 주변기기 인터페이스(SPI)를 통한 고속 양방향 통신, XMOS 보드에서 직접 생성한 PWM으로 하비 서보 제어, 실시간으로 로봇을 구동하는 웹 기반 사용자 인터페이스 노출을 시연하는 간단한 모바일 플랫폼입니다.
원문 포스트에 비디오 데모 포함: 첫 번째는 XMP-1이 경로 학습, 두 번째는 연속 회전 서보로 경로 재현 시도. 이 영상들은 현재 하드웨어와 펌웨어의 잠재력과 한계를 모두 보여줍니다.
더 자세한 내용
이 포스트는 XMOS startKIT 실험 시리즈 두 번째입니다. 1부는 XMOS 용어, 아키텍처, 샘플 프로그램 퀵스타트 가이드 소개. XMOS 입문자는 1부 검토로 여기 개념 이해 도움. 3부("XMOS startKIT: XMOS and Raspberry Pi Oscilloscope XAE 1000")는 SPI 프레임워크 재방문, ADC 사용법, 실시간 브라우저 그래픽 소개.
XMP-1 빌드와 운용에만 집중하려면 확장 토론 건너뛰고 기사 하단 코드 섹션으로 바로 이동하세요. 펌웨어는 1부 설명대로 컴파일·플래싱, 라즈베리 파이 코드는 Node.js로 실행.
솔루션 개요 - 하드웨어와 소프트웨어
Figure 1(미표시)은 완성된 XMP-1을 보여줍니다. 5V 레귤레이터로 전원 공급, 두 연속 회전 하비 서보로 구동. 라즈베리 파이가 모든 네트워킹 담당, index.html 서비스하고 사용자 명령을 모터 속도/방향 메시지로 변환하는 경량 웹 서버 구동.
통신 흐름은 Figure 2(미표시)에 도시. 파이가 서보용 PWM 신호를 SPI 패킷으로 전송해 startKIT에 보냄. SPI 슬레이브인 startKIT이 패킷 디코딩해 서보에 적절한 PWM 펄스로 구동.
직렬 주변기기 인터페이스 (SPI)
SPI는 SS, SCLK, MOSI, MISO 4선 의존. 이 설정에서 라즈베리 파이가 마스터로 클럭 제공, MOSI로 데이터 전송. XMOS 보드는 MOSI로 데이터 수신, MISO로 상태나 확인 응답 반환. SS 라인은 액티브 로우, 파이의 CE1 핀으로 startKIT 선택.
오실로스코프 트레이스(Tektronix MSO2024B로 캡처)가 SPI 전송 무결성 확인. 파이에서 startKIT으로 3바이트 데이터 0x02, 0x00, 0x10 전송, 선택적 영길이 응답.
하비 서보 모터 제어
하비 서보는 1-2msec PWM 펄스 폭을 0-180° 기계적 회전으로 변환, 1.5msec 펄스로 샤프트 중앙 정렬. 연속 회전 서보는 포텐셔미터와 엔드스톱 제거한 변형으로 펄스 폭을 속도 명령으로 해석: 1.5ms 중립, 1ms 최대 후진, 2ms 최대 전진.
XMP-1 각 바퀴는 연속 회전 서보로 구동. 외부 H-브리지 불필요해 배선 단순화되나 DC 모터 대비 정밀 속도 제어는 제한적.
개발 시작 - 보드 연결
펌웨어 개발용으로 라즈베리 파이와 startKIT을 IDC 커넥터 달린 26핀 리본 케이블로 연결. 여분 IDC 커넥터로 멀티미터나 오실로스코프로 신호 프로빙용 디버깅 인터페이스 겸용.
XMOS startKIT에서 SPI (spi_process) 구현
xTIMEcomposer IDE에서 내장 SPI 슬레이브 라이브러리 임포트, 소스 파일을 spi-test/src 디렉토리에 배치. 다음 초기화 루틴으로 클럭 소스, MOSI/MISO 포트, SPI 슬레이브 인터페이스 구성:
void spi_slave_init(spi_slave_interface &spi_if) {
int clk_start;
set_clock_on(spi_if.blk);
configure_clock_src(spi_if.blk, spi_if.sclk);
configure_in_port(spi_if.mosi, spi_if.blk);
configure_out_port(spi_if.miso, spi_if.blk, 0);
start_clock(spi_if.blk);
return;
}
spi_slave_interface 구조체가 SPI 핀을 XMOS 포트에 매핑:
typedef struct spi_slave_interface {
clock blk;
in port ss;
in buffered port:8 mosi;
out buffered port:8 miso;
in port sclk;
} spi_slave_interface;
수신 SPI 데이터를 버퍼에 읽는 루틴, 가변 길이 메시지 허용 위한 단순 태그-길이-값(TLV) 프로토콜 구현:
void spi_slave_in_buffer(spi_slave_interface &spi_if, unsigned char buffer[], int num_bytes) {
unsigned int data;
unsigned int vlen=0;
clearbuf(spi_if.miso);
clearbuf(spi_if.mosi);
for (int i = 0; i < num_bytes; i++) {
spi_if.mosi :> data;
data=data<<24;
buffer[i]=bitrev(data);
if (i==2) {
vlen=((unsigned int)buffer[1])<<8 | (unsigned int)buffer[2];
if (vlen==0) break;
}
if (i >= vlen+2) {
break;
}
}
}
패킷 첫 바이트는 태그(0-255). 다음 두 바이트가 페이로드 길이 인코딩(최대 4096바이트). 홀수 태그는 파이 응답 기대, 짝수 태그는 응답 불필요 표시.
프로세스 간 통신 (IPC)
XMOS 코어들은 단순 채널이 아닌 트랜잭션 기반 인터페이스로 통신. 단일 인터페이스 호출로 다중 데이터 타입과 반환 값 허용, SPI 처리 코어, 데이터 처리 코어, PWM 생성 코어 조율에 이상적.
인터페이스 정의 예시:
interface program_display {
void backlight(int state, int color);
void plot(int x, int y, int color);
}
SPI 콘텐츠 처리 위한 IPC 아키텍처 설계
spi_process 코어가 수신 SPI 데이터를 4099바이트 버퍼에 캡처, 이동 가능 배열 트랜잭션으로 data_handler 코어에 포인터 전달. 처리 후 data_handler가 버퍼에 응답 채우고 다음 SPI 교환 때 전송 준비됐음 spi_process에 신호.
interface to_rpi { void code(unsigned char c); };
interface from_rpi { unsigned char* movable array_data(unsigned char* movable bufp); };
코어 로직 스니펫:
void spi_process(interface to_rpi server s, interface from_rpi client c) {
unsigned char storage[4099];
unsigned char* movable buf=storage;
buf=c.array_data(move(buf));
select {
case s.code(unsigned char c):
if (c==SEND) {
spi_slave_out_buffer(spi_sif, buf, 4099);
}
break;
}
}
void data_handler(interface to_rpi client c, interface from_rpi server s) {
select {
case s.array_data(unsigned char* movable vp) -> unsigned char* movable vq:
vq[0]=0x22; // 태그
vq[1]=0x00; // 길이
vq[2]=0x00;
vq=move(vp);
tosend=1;
break;
}
if (tosend) {
c.code(SEND);
}
}
이 아키텍처로 라즈베리 파이와 XMOS startKIT 간 범용 양방향 통신 채널 구현, 다양한 로보틱스나 IoT 프로젝트에 적용 가능.
startKIT에서 PWM (servo_handler) 구현
서보 제어 루틴이 전용 XMOS 코어에서 실행, 최대 8개 서보 관리. 각 서보 PWM 신호는 20ms마다 적절한 듀티사이클로 출력 핀 토글, 마이크로초 해상도로 미세 속도 조정. 초기값은 중앙(연속 회전 서보면 정지), IPC 프레임워크로 수신된 최신 명령 기반으로 매 사이클 신호 업데이트.
현재 XMP-1은 연속 회전 서보 2개만 사용하지만 펌웨어는 추가 모터나 H-브리지 인터페이스로 DC 모터 제어 확장 지원.
전체 소스 코드와 컴파일 지침은 기사 끝부분 참조.