산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

XMOS startKIT:XMOS 및 Raspberry Pi 로봇 XMP-1 구축

소개

Farnell(또는 Newark)의 XMOS startKIT는 Raspberry Pi와 잘 작동하는 매우 저렴한(부가가치세 포함 12파운드) 프로세서 플랫폼입니다. 함께 납땜이 거의 필요하지 않은 로봇 애플리케이션을 구성하는 것이 가능합니다.

XMOS startKIT는 C로 프로그래밍할 수 있는 여러 'XMOS 코어'가 있는 XMOS 칩이 탑재된 신용카드에 가까운 크기의 보드입니다. XMOS 기술을 사용하면 낮은 지터로 고속으로 병렬로 실행할 수 있습니다. 이것이 바로 로봇 공학 애플리케이션에 이상적일 수 있는 특성입니다.

XMOS startKIT 보드와 Raspberry Pi(RPI)에서 실행할 몇 가지 코드와 함께 보드는 간단한 소형 모바일 플랫폼을 구성하는 데 사용됩니다. 모든 것 앞에 'X'가 붙는 XMOS 정신에 따라 켜짐).

XMP-1은 일부 센서와 더 많은 프로그래밍이 있기 전까지는 로봇이 아니지만 향후 로봇 공학 실험을 위해 확장될 수 있습니다. XMP-1은 저렴한 기성 표준 하드웨어를 사용하며 스크루드라이버, 와이어 커터 및 플라이어 외에는 다른 도구를 사용하지 않습니다.

이 게시물은 직렬 주변기기 인터페이스(SPI) 인터페이스를 사용하는 RPI와 XMOS 보드 간의 통신과 웹 브라우저에서 XMP-1을 구성하고 제어하는 ​​방법을 다룹니다.

여기 비디오는 XMP-1이 경로를 가르치는 것을 보여줍니다. 첫 사용 시도! 더 나은 사용자 인터페이스에서 이점을 얻을 수 있습니다. XMP-1은 꽤 빠르게 움직일 수 있지만 여기서는 저속으로 쉬었습니다. 오른쪽에는 브라우저 컨트롤이 있고 아래쪽에는 콘솔 출력이 있으며 어떤 일이 일어나고 있는지 보기 위해 연결 유지 및 상태 메시지를 생성합니다.

아래의 이 다음 비디오는 XMP-1이 경로를 재생하려고 시도하고 그 과정에서 고통과 고통을 일으키는 것을 보여줍니다. 내 저가의 연속 회전 서보(바퀴를 구동하는 데 사용됨)는 그다지 좋지 않았고 XMP-1에는 아직 센서가 없습니다.

좀 더 자세히

이 게시물은 실제로 일부 XMOS startKIT 실험의 2부입니다. 1부에는 XMOS 소개, 용어, 아키텍처 및 예제 프로그램이 포함된 빠른 시작 가이드가 포함되어 있습니다. 이 기술에 관심이 있다면 먼저 파트 1을 따르는 것이 도움이 될 수 있으므로 이 파트 2가 더 이해가 됩니다. 이 파트 2는 Raspberry Pi와 XMOS startKIT 보드 간의 고속 통신을 위한 간단한 프레임워크를 구성하기 위한 것입니다. 프레임워크는 많은 프로젝트에 사용할 수 있을 만큼 충분히 범용적이어야 합니다(로봇은 제 의도가 아니었습니다). XMP-1은 Raspberry Pi와 XMOS 보드 간 통신을 테스트하려는 목적에서 실제로는 부산물에 불과합니다. 유용한 경우를 대비하여 여기에 기록합니다. (참고로 XMOS startKIT:XMOS 및 Raspberry Pi Oscilloscope XAE 1000이라는 제목의 파트 3도 있습니다. 논의된 SPI 기능을 재사용하는 XAE 1000은 이 게시물이며 XMOS 칩에 있는 아날로그-디지털 변환기(ADC)를 사용하는 방법을 소개합니다. , 웹 브라우저에서 실시간 그래픽을 수행하는 방법).

XMP-1 구성 및 사용에만 관심이 있는 경우 게시물 맨 아래에 있는 코드를 가져와서 XMOS startKIT 보드 및 Raspberry Pi의 Flash(1부에서 설명한 대로)로 컴파일 및 저장할 수 있습니다. 여기에서 다른 모든 내용은 건너뛰고 XMP-1 하드웨어 어셈블리를 설명하는 섹션을 따르십시오. Raspberry Pi와 웹 브라우저를 사용하여 하드웨어를 제어하는 ​​데 관심이 있다면 여기에 있는 일부 코드를 재사용할 수 있습니다. 그러나 Raspberry Pi와 XMOS startKIT 조합을 최대한 활용하려면 startKIT를 처음 사용하는 경우 여기에 있는 나머지 정보가 유용할 수 있습니다.

솔루션 개요 – 하드웨어 및 소프트웨어

완성된 XMP-1이 충전되는 사진입니다. 실외에서는 802.11 핫스팟형 기기(MiFi)를 사용했고, 모바일에서는 브라우저를 실행했습니다.

아래 다이어그램은 XMP-1의 후면에서 볼 때 비트와 조각의 대략적인 레이아웃을 보여줍니다. 아주 기본적이라는 것을 알 수 있습니다. XMP-1은 단지 빠른 실험일 뿐입니다.

RPI(Raspberry Pi)는 모든 네트워크 활동을 처리하는 데 사용됩니다. 소규모 웹 서버를 실행하며 대부분의 코드는 Node.js 플랫폼에서 JavaScript로 작성됩니다. RPI는 직렬 인터페이스(SPI)를 통해 모터 제어 속도(실제로 XMP-1에는 연속 회전 서보가 사용됨)를 XMOS startKIT 보드에 전달합니다. XMOS startKIT는 펄스 폭 변조(PWM) 신호를 모터에 공급하는 역할을 합니다.

RPI는 802.11 WiFi USB 어댑터를 사용하여 네트워크에 연결됩니다.

전체 배선 다이어그램이 여기에 표시됩니다. 하드웨어 및 구성은 나중에 설명합니다.

아래 다이어그램은 RPI와 startKIT에서 구현될 소프트웨어를 보여줍니다. 많이 보이지만 그렇지 않으며 아래에서 자세히 설명할 작은 부분으로 나눌 수 있습니다. 언급했듯이 전체 소스 코드는 이 게시물의 맨 아래에 있으므로 원하는 경우 수정하지 않고 사용할 수 있습니다.

간단히 말해서 녹색 블록은 웹 상호 작용을 처리하고 사용자 입력을 기반으로 모터의 속도와 방향을 결정합니다. 녹색 블록은 사용자 인터페이스를 통합하는 웹 페이지(index.html)를 사용자에게 제공합니다. xmos_servo 프로그램은 원하는 속도/방향을 startKIT로 전송되는 데이터의 직렬 주변기기 인터페이스 바이트로 변환하는 C로 작성된 작은 소프트웨어입니다. startKIT 소프트웨어는 별도의 XMOS 코어에서 동시에 실행되는 세 부분으로 나뉩니다. spi_process는 SPI 신호를 배열에 저장된 데이터로 변환합니다. data_handler 코드는 어레이를 검사하여 무엇을 할지 결정합니다(오늘날 유일한 결론은 서보를 조작하는 것입니다). 서보 핸들러 프로세스는 펄스 스트림을 서보에 출력하여 원하는 속도로 회전할 수 있도록 합니다. 이 모든 블록은 아래에서 더 자세히 설명됩니다.

직렬 주변기기 인터페이스(SPI)

SPI는 SS, SCLK, MISO 및 MOSI로 알려진 4개의 와이어와 통신에 관련된 두 장치에 대한 마스터 및 슬레이브 할당에 의존합니다. RPI 및 XMOS 보드의 경우 RPI는 마스터 장치이며 클럭 신호를 생성하는 역할을 합니다. RPI는 MOSI 와이어로 데이터를 전송하고 MISO 와이어로 데이터를 수신합니다. 이것은 SPI 인터페이스가 동시에 양방향 방식으로 데이터를 전송할 수 있음을 의미합니다. 실제로 단방향 데이터가 필요한 경우 관심 방향에 따라 MOSI 또는 MISO 신호를 무시할 수 있습니다.

여기 오실로스코프 스크린샷(Tektronix MSO2024B 오실로스코프의 개별 신호 및 자동화된 SPI 디코딩)은 Raspberry Pi를 사용한 SPI 통신의 예를 보여줍니다. SPI는 몇 가지 방법으로 구성할 수 있습니다. 이 예에서 3바이트의 데이터가 마스터(RPI)에서 슬레이브(XMOS 보드)로 전송되었고 0x02, 0x00 및 0x10이었고 데이터가 없거나 0x00, 0x00, 0x00이 마스터에 동시에 슬레이브.

SS 와이어는 칩 선택 신호(액티브 로우)입니다. RPI에는 SS에 사용할 수 있는 26방향 커넥터에 2개의 핀이 있습니다. CE0 및 CE1로 표시된 아래 다이어그램에서 파란색 원으로 표시됩니다. 이는 원하는 경우 RPI가 두 개의 SPI 슬레이브 장치와 통신할 수 있음을 의미합니다. 이 경우 CE 핀 중 하나만 사용되었습니다. 저는 CE1을 선택했습니다.

취미 서보 모터 제어

취미 서보 모터는 입력 신호를 기반으로 움직임을 생성합니다. 일반적으로 1회전 미만으로 회전합니다. 일반적으로 취미 서보는 약 180도 범위 내에서 회전합니다. 출력 샤프트는 (말하자면) 연결 장치에 연결되어 입력 신호에 따라 바퀴가 완전히 왼쪽 또는 완전히 오른쪽으로(또는 그 사이의 모든 것) 회전하도록 할 수 있습니다.

아래 다이어그램은 일반적인 취미 서보(이 사이트에서 가져옴)의 내부를 보여줍니다. 왼쪽(파란색)은 기존 DC 모터입니다. 기어가 많이 줄어들었고 오른쪽에서 최종 샤프트가 예를 들어 휠 조향 장치에 연결할 수 있는 파란색 암에 연결된 것을 볼 수 있습니다. 최종 샤프트 아래에는 전위차계가 있으며 최종 샤프트의 정확한 위치에 대한 피드백을 제공합니다. 따라서 취미 서보는 폐쇄 루프 시스템이며 팔이 실수로 원하는 위치에서 떨어져 나가는 경우 자체 수정할 수 있습니다.

취미 서보에는 일반적으로 세 가지 연결이 있습니다. 0V, 5V 및 신호. 신호선은 서보에 대한 디지털 입력이며 PWM 신호가 필요합니다. 펄스 폭의 크기는 샤프트가 이동할 각도를 결정합니다. PWM 신호는 20msec마다 반복되어야 하며 펄스 폭이 1.5msec이면 샤프트가 중앙 위치로 이동합니다. 너비가 1msec이면 서보가 한 방향으로 완전히 이동하고 너비가 2msec이면 서보가 다른 방향으로 완전히 이동합니다(더 아래에는 서보 제어의 일부 오실로스코프 추적이 있음).

'연속 회전' 서보라고 하는 수정된 서보 유형이 있습니다. 전위차계가 엔드 스톱과 함께 제거되고 회로가 서보가 여전히 중앙 위치에 있다고 생각하도록 설득되는 수정된 서보입니다. 1.5msec 이외의 펄스 폭으로 PWM을 전송하면 메커니즘이 펄스 폭에 따라 달라지는 속도로 시계 방향 또는 반시계 방향으로 회전합니다. XMP-1은 각 바퀴에 하나씩 두 개의 연속 회전 취미 서보를 사용합니다. 원래 취미용 서보와는 다른 용도로 사용되기 때문에 제어된 모션을 얻는 최적의 방법(XMP-2는 DC 브러시 모터 사용)은 아니지만 디지털 장치로 제어할 수 있다는 장점이 있습니다. 로직 신호이며 외부 H-브리지 회로가 필요하지 않습니다.

취미 서보 와이어는 제조사에 따라 색상 구분이 다를 수 있습니다. 일반적으로 중앙선은 빨간색이며 +5V가 됩니다. 검은색 또는 갈색 전선은 0V입니다. 흰색 또는 노란색 선은 PWM 신호 입력입니다.

개발 시작 – 보드 연결

소프트웨어를 개발하기 위해 RPI와 startKIT는 리본 케이블과 IDC 커넥터 어셈블리를 사용하여 연결되었습니다. 이들은 바이스를 사용하여 조립하거나 기성품을 구입할 수 있습니다. 자체 조립 버전의 경우 케이블 중앙에서 디버그 커넥터로 사용할 추가 IDC 커넥터를 구입하여 멀티미터 또는 스코프로 신호를 프로빙할 때 더 쉽게 사용할 수 있습니다.

XMOS startKIT에서 SPI(spi_process) 구현

XMOS 개발 환경(xTIMEcomposer) 사용은 1부에서 다뤘습니다. 아래 스크린샷은 xTIMEcomposer의 Windows 버전을 보여주지만 Linux 버전은 동일해 보입니다(Mac 버전도 비슷할 수 있음).

이 시점에서 xSOFTip 랩에서 SPI 슬레이브 함수 라이브러리를 마우스 오른쪽 버튼으로 클릭하고 라이브러리를 작업 공간으로 가져올 수 있습니다. 저는 xTIMEcomposer에 대한 전문가가 아니므로 여기에서 잘못 사용하고 있을 수 있지만 라이브러리의 소스 코드와 헤더 파일은 프로젝트 탐색기의 별도 폴더에 나타납니다(아래 파란색 원으로 표시).

파일은 spi-test 폴더에 있어야 하므로(위의 녹색 원으로 표시된 것처럼 표시됨) spi_slave.h 및 spi_slave.xc 파일을 module_spi_slave/src 폴더에서 spi-test로 수동으로 복사했습니다. Windows 탐색기를 사용하여 /src 폴더.

소프트웨어는 포트 개념을 사용하여 출력을 제어하거나 입력을 읽습니다. 이러한 논리적 포트와 칩의 핀에 대한 물리적 매핑 사이에 매핑이 있습니다. 매핑은 특정 조합으로 변경할 수 있습니다(XS1 포트 소개 PDF 문서의 그림 3 참조).

XMOS 장치의 입력/출력 포트는 1, 4, 8, 16 또는 32비트 너비가 될 수 있습니다. 부품으로 설계할 때 특정 기능을 1비트 포트에 할당하거나 다른 기능을 다중 비트 포트에 할당할 수 있으므로 그림 3은 사용할 포트와 핀을 결정하는 데 매우 유용합니다.

이제 spi-test/src 필터에 있는 SPI 슬레이브 코드로 이 코드가 약간 수정되었습니다. 라이브러리 코드는 SPI 인터페이스에 사용되는 포트가 모두 1비트 포트인 반면 Raspberry Pi SPI SS 핀(CE1)은 XMOS 보드의 32비트 포트에 연결되어 있다고 가정합니다. startKIT 하드웨어 매뉴얼 PDF 문서의 그림 8은 아래와 같습니다. 초록색 중앙에는 XMOS 보드와 Raspberry Pi를 연결하는 2x13-way 헤더가 있습니다. 파란색의 왼쪽과 오른쪽에는 칩의 물리적 핀 이름(X0D0, X0D11 등)이 있습니다. 핀 강조 표시된 값은 논리적 포트 번호입니다. P1A, P1D 등은 단일 비트 포트입니다. P32A1은 32비트 포트의 첫 번째 2진수입니다.

SPI 라이브러리에 몇 가지 변경 사항이 있었고 전체 코드가 게시물에 첨부되었으므로 여기에서는 일부 코드 스니펫만 설명합니다. 복사/붙여넣기가 필요하지 않습니다. 전체 코드는 이 게시물 끝에 첨부되어 있습니다. 사용할 수 있습니다.

XMOS 장치의 SPI 인터페이스는 다음과 같이 초기화됩니다. 아래에서 자세히 설명합니다.

+ 소스 뷰 일반 확장
  1. void spi_slave_init(spi_slave_interface &spi_if)
  2. {
  3. int clk_start;
  4. set_clock_on(spi_if.blk);
  5. configure_clock_src(spi_if.blk, spi_if.sclk);
  6. configure_in_port(spi_if.msi, spi_if.blk);
  7. configure_out_port(spi_if.miso, spi_if.blk, 0);
  8. start_clock(spi_if.blk);
  9. 반환;
  10. }

1부 게시물에서 언급했듯이 I/O는 정확한 시간에 XMOS 장치에서 클럭 인 및 아웃될 수 있습니다. 위의 코드에서 set_clock_on 함수(XMOS xs1.h 헤더 파일에 정의됨)는 XMOS 칩에 내장된 클럭 메커니즘 중 하나를 켜는 데 사용됩니다. 아래 다이어그램(XS1 포트 소개 문서)은 이 메커니즘을 노란색으로 보여줍니다. configure_clock_src 함수는 외부 클록을 선택하는 데 사용됩니다(다이어그램에서 파란색으로 표시). Raspberry Pi의 SCLK 핀에 연결됩니다. configure_in_port 및 configure_out_port 기능은 포트를 클럭 메커니즘에 연결하는 데 사용됩니다. MOSI 및 MISO 신호(아래 녹색으로 표시)는 모두 클로킹 메커니즘에 연결되도록 구성됩니다.

직렬 데이터가 XMOS 장치에서 처리되는 방식은 정말 깔끔합니다. 여기의 코드는 아래에서 더 자세히 설명합니다. 첫째, 구조는 SPI 인터페이스로 사용하고자 하는 포트에 대한 세부 정보를 포함하는 데 사용됩니다.

+ 소스 뷰 일반 확장
  1. typedef 구조체 spi_slave_interface
  2. {
  3. 시계 blk;
  4. 포트 s에서
  5. 버퍼링된 포트:8 mosi에서,
  6. 아웃 버퍼링 포트:8 미소;
  7. 포트 sclk에서,
  8. } spi_slave_interface;

위의 흥미로운 라인은 포트 변수 mosi 및 miso를 참조하는 라인입니다. 포트:8 유형으로 선언되었습니다. 변수에 1비트 포트 주소가 할당되면 XMOS 장치는 1와이어 비트 스트림을 8비트 값으로 자동으로 역직렬화합니다.

나머지 SPI 코드를 정말 간단하게 만듭니다. 다음은 Raspberry Pi에서 입력되는 SPI 데이터를 관리하는 코드입니다.

+ 소스 뷰 일반 확장
  1. void spi_slave_in_buffer(spi_slave_interface &spi_if, unsigned char buffer[], int num_bytes)
  2. {
  3. 서명되지 않은 정수 데이터
  4. unsigned int vlen=0;
  5. clearbuf(spi_if.miso);
  6. clearbuf(spi_if.msi);
  7. for (int i =0; i
  8. {
  9. spi_if.msi :> 데이터,
  10. data=data<<24;
  11. buffer[i]=bitrev(data);
  12. 만약 (i==2)
  13. {
  14. vlen=(((unsigned int)buffer[1])<<8) | (unsigned int)buffer[2];
  15. if(vlen==0)
  16. 중단;
  17. }
  18. if (i>=vlen+2)
  19. {
  20. 중단;
  21. }
  22. }
  23. }

위의 코드에서 for 루프가 있고 루프 안에 spi_if.mosi :> data 라인이 있음을 알 수 있습니다. MOSI 라인의 8비트 정보를 데이터라는 변수로 읽어들이는 데 사용됩니다.

다음 두 줄은 바이트 내에서 비트를 뒤집는 데 사용되며 데이터는 버퍼 배열에 저장됩니다.

다음 몇 줄에는 설명이 필요합니다. 그들은 원하는 프로토콜과 관련이 있습니다. XMP-1뿐만 아니라 다양한 용도로 사용할 수 있는 범용 코드를 생성하기 위한 것이었습니다. Raspberry Pi가 XMOS startKIT 보드에 데이터를 보내는 경우 XMOS 보드는 예상되는 데이터 바이트 수를 알아야 합니다. 이것은 하드 코딩될 수 있지만 융통성이 없습니다.

매우 간단한 '태그(또는 유형), 길이, 값'(TLV) 프로토콜을 사용하기로 결정했습니다. Raspberry Pi가 전송해야 하는 첫 번째 바이트는 0-255(즉, 1바이트) 범위의 태그 또는 식별자입니다. 값이 무엇을 나타내는지 결정하는 것은 사용자의 몫입니다. 예를 들어 값 1은 "모터 속도 설정"을 의미할 수 있고 값 2는 "헤드라이트 밝기 강도 설정"을 의미할 수 있습니다. 두 번째 2바이트는 따라야 할 값(즉, 데이터) 바이트 수를 나타내는 16비트 값입니다. 많은 사용 사례를 충족해야 하지만 코드에서 BUFLEN 정의를 조정하여 실제 값을 변경할 수 있는 4kbyte(4096바이트)로 제한하기로 결정했습니다.

따라서 SPI 인터페이스에서 전송되는 최소 바이트 수는 3개(태그, 길이 0x0000)이고 최대 4099개(태그 및 길이 0x1000(16진수로 4096개)) 및 4096개 데이터 바이트입니다.

프로토콜이 약간 수정되어 홀수 태그 번호는 현재 TLV 스트림이 완료된 후 시작되는 다음 SPI 통신에서 Raspberry Pi가 응답을 기대한다는 의미이고 짝수 태그 번호는 Raspberry Pi가 응답을 기대하지 않음을 의미합니다. 뒤로.

이것은 매우 기본적인 프로토콜이지만 많은 일반적인 요구 사항을 충족해야 합니다. 파란색 숫자가 수신 4099바이트 버퍼에 대한 SPI 바이트 인덱스인 아래 표에도 설명되어 있습니다.

이전 코드 조각으로 돌아가서 다음 몇 줄은 SPI 데이터가 수신되는 동안 즉석에서 buffer[1] 및 buffer[2] 내용을 확인하는 것을 볼 수 있습니다. 내용은 위의 다이어그램에서 볼 수 있는 길이로 예상됩니다(파란색 버퍼 인덱스 참조). 코드가 나머지 길이를 결정하자마자 정확히 해당 데이터 바이트 수를 받아들인 다음 루틴이 종료됩니다.

여기에는 MOSI 라인의 XMOS 보드에 대한 SPI 입력이 포함됩니다. MISO 라인의 XMOS 장치에서 출력된 SPI는 유사한 방식으로 작동하여 다시 MOSI 라인에서 동시에 길이를 확인하므로 요청된 바이트 수가 전송되는 즉시 함수가 종료될 수 있습니다.

프로세스 간 통신

이제 SPI가 파악되고 최대 4096바이트 길이의 가변 길이 데이터를 양방향으로 교환하는 프로토콜이 구현되었으므로 프로그램의 본체에 대해 약간의 고려가 주어졌습니다. XMOS 코어가 SPI 작업을 처리하는 데 전념할 것이 분명했지만 나머지 코드는 하나 이상의 추가 XMO 점수에 상주해야 할 수도 있습니다.

1부에서는 다른 XMOS 코어에서 작업이 병렬로 실행되는 방법과 채널에 값을 푸시하여 작업이 서로 통신할 수 있는 방법에 대해 설명했습니다. 코어 간에 통신하는 또 다른 방법이 있으며 채널이 아닌 "인터페이스를 통한 트랜잭션" 개념을 사용합니다. 하나의 XMOS 코어에서 다른 유형의 여러 변수를 보낼 수 있기 때문에 더 유연합니다. 트랜잭션 유형은 C 함수 프로토타입과 매우 유사하게 정의됩니다. 예를 보면 이 모든 것이 훨씬 더 명확해집니다.

예를 들어 응용 프로그램에 디스플레이를 제어하는 ​​작업이 있는 경우 전송 작업은 디스플레이를 켜거나 끄거나 픽셀을 그릴 수 있습니다. 두 XMOS 코어 간의 통신을 위한 인터페이스 정의는 다음과 같을 수 있습니다.

+ 소스 뷰 일반 확장
  1. 인터페이스 프로그램_디스플레이
  2. {
  3. void backlight(int state, int color); // 거래 ​​유형 1
  4. 무효 플롯(int x, int y, int 색상); // 거래 ​​유형 2
  5. };

인터페이스 통신은 단방향이므로 디스플레이가 터치스크린 상태와 같은 정보를 보내려면 다른 방향으로 다른 인터페이스를 사용해야 합니다. 이로부터 인터페이스에는 클라이언트와 서버 쪽이 있다는 것이 분명합니다. 여기 다이어그램은 2개의 XMOS 코어(보라색), 2개의 인터페이스(회색), 첫 번째 인터페이스(program_display라고 함)를 통해 program_display 인터페이스에서 두 가지 다른 유형의 트랜잭션(파란색)이 발생할 수 있음을 보여줍니다.

인터페이스와 트랜잭션 유형을 사용할 때의 좋은 점은 C 함수 프로토타입과 마찬가지로 반환 값을 가질 수 있고 변수에 대한 참조를 전달할 수 있으므로 통신이 항상 인터페이스의 클라이언트 측에서 시작되더라도 데이터 전송이 양방향으로 발생할 수 있습니다. 다이어그램에 표시되지 않은 또 다른 매우 흥미로운 기능은 서버 측에서 클라이언트 측으로 '알림'을 보낼 수 있는 기능입니다. 이것은 클라이언트에게 일반적인 방식으로 트랜잭션을 발행하여 일부 데이터를 검색하라는 신호일 수 있습니다. 이 기능은 XMP-1 코드에서 사용됩니다. 따라서 인터페이스를 코딩하고 데이터 및 알림을 보내는 방법에 대한 자세한 내용은 아래에서 자세히 설명합니다.

SPI 콘텐츠를 처리하기 위한 IPC 아키텍처 설계

SPI 인터페이스 처리는 이미 설명되었습니다. 이제 SPI 메시지의 내용은 후속 처리를 위해 유용한 방식으로 작업에 표시되어야 합니다. 인터페이스와 트랜잭션에 대한 지식으로 무장하여 유용한 메시지 콘텐츠를 RPI에서 XMOS로 보낼 수 있는 범용 프레임워크에 도달하기 위해 별도의 XMOS 코어에 기능을 할당하고 프로세스 간 통신을 설계하는 것이 가능했습니다. 보드 및 그 반대의 경우도 마찬가지입니다.

여기 다이어그램은 개발된 내용을 보여줍니다(지금은 위에서 아래로 시간 순서가 있다는 점을 제외하고는 이전과 유사한 다이어그램).

Raspberry Pi가 XMOS 보드에 메시지를 보내려고 할 때 RPI는 앞서 설명한 TLV 형식으로 메시지를 구성합니다. 그런 다음 정보는 MOSI 신호 와이어에서 클럭아웃됩니다(위의 다이어그램 상단에 녹색으로 표시됨). 동시에 XMOS 장치는 무언가를 다시 보내야 하지만 아직 보낼 정보가 없기 때문에 MISO 라인에는 분홍색으로 표시된 것처럼 쓰레기 또는 모두 0 값이 포함될 수 있습니다. spi_process 함수는 메시지를 버퍼(서명되지 않은 char 배열)로 수집한 다음 별도의 data_handler XMOS 코어에 대한 트랜잭션을 시작합니다. data_handler는 메시지 내용을 처리하고 선택적으로 정보를 spi_process XMOS 코어로 다시 보내는 역할을 하므로 후속 SPI 교환에서 쓰레기 값 대신 Raspberry Pi로 유용한 데이터를 다시 보낼 수 있습니다.

버퍼의 복사본을 만들어 spi_process와 data_handler 간에 데이터를 보낼 수 있습니다. 그러나 대신 버퍼 메모리에 대한 포인터를 전달할 수 있습니다. 이를 수행할 수 있는 한 가지 방법은 포인터 및 버퍼 메모리 위치의 제어를 spi_process에서 data_handler로 '이동'하는 것입니다. data_handler가 메시지 검사를 마치면 트랜잭션에서 사용할 수 있는 반환 변수를 사용하여 제어를 spi_process로 다시 이동할 수 있습니다. 이것이 위의 다이어그램에 이동 가능한 포인터로 정의된 매개변수와 이동 가능한 포인터로 정의된 반환 값이 있는 array_data라는 트랜잭션이 있는 이유입니다. 이런 식으로 한 번에 하나의 XMOS 코어만 버퍼 메모리에 액세스할 수 있습니다.

사용되는 인터페이스는 다음과 같습니다.

+ 소스 뷰 일반 확장
  1. 인터페이스 to_rpi
  2. {
  3. 무효 코드(unsigned char c),
  4. };
  5. from_rpi 인터페이스
  6. {
  7. unsigned char* movable array_data(unsigned char* movable bufp),
  8. };

spi_handler 코드는 버퍼에 공간을 할당한 다음 여기 코드에 표시된 buf=c.array_data(move(buf)) 행을 사용하여 버퍼 제어를 data_handler 코드에 전달합니다.

+ 소스 뷰 일반 확장
  1. 무효
  2. spi_process(interface to_rpi server , interface from_rpi client c)
  3. {
  4. 서명되지 않은 char 저장소[4099];
  5. unsigned char* movable buf=storage;
  6. ...
  7. buf=c.array_data(move(buf));
  8. ...
  9. 선택
  10. {
  11. case s.code(unsigned char c):
  12. if (c==SEND)
  13. {
  14. spi_slave_out_buffer(spi_sif, buf, 4099);
  15. }
  16. 중단;
  17. }
  18. }

data_handler 코드는 버퍼의 제어를 얻은 다음 후속 SPI 트랜잭션에서 RPI로 응답을 보내려는 경우 버퍼에 응답이 채워집니다. 마지막으로 버퍼의 제어는 spi_handler 프로세스로 다시 전달됩니다.

+ 소스 뷰 일반 확장
  1. 무효
  2. data_handler(인터페이스 to_rpi 클라이언트 c, 인터페이스 from_rpi 서버)
  3. {
  4. 선택
  5. {
  6. case s.array_data(unsigned char* movable vp) -> unsigned char* movable vq:
  7. // vq는 SPI의 데이터를 포함합니다. 여기에서 원하는 것은 무엇이든 할 수 있습니다.
  8. // 모든 응답은 여기에서도 구성됩니다.
  9. vq[0]=0x22; // 태그
  10. vq[1]=0x00; // 길이
  11. vq[2]=0x00; // 길이
  12. vq=move(vp); // 포인터 컨트롤을 spi_process로 다시 전달
  13. tosend=1;
  14. 중단;
  15. }
  16. if(tosend)
  17. {
  18. c.code(SEND); // spi_process에 코드를 전송하여 RPI에 보낼 데이터가 있음을 인지하도록 합니다.
  19. }
  20. }

이전에 RPI에서 홀수 태그 값을 보낸 경우 이는 RPI가 후속 SPI 교환에서 XMOS startKIT 보드의 응답 메시지를 예상했다는 표시라고 언급했습니다. 이것은 수신된 첫 번째 바이트가 홀수 값이면 반환 메시지가 예상된다는 점을 메모하는 spi_process 및 data_handler에 의해 구현됩니다. data_handler가 버퍼 메모리에서 반환 메시지 구성을 마치면 버퍼 포인터를 spi_process XMOS 코어로 다시 이동하고 "전송 준비 완료"와 같은 메시지를 포함할 수 있는 코드 트랜잭션도 보냅니다. spi_process XMOS 코어는 이제 후속 SPI 교환을 위한 준비가 되었습니다. data_process가 메시지를 Raspberry Pi로 다시 보내지 않으려는 경우(예:태그 값이 짝수인 경우) 코드 트랜잭션이 전송되지 않습니다(또는 "전송할 준비가 되지 않음"과 같은 다른 코드가 전송될 수 있음) .

앞의 그래픽 다이어그램에서 후속 SPI 교환이 MISO 와이어를 통해 Raspberry Pi로 데이터를 다시 전송했음을 알 수 있습니다.

요약하자면 spi_process 및 data_process는 RPI와 XMOS 보드 간에 양방향으로 데이터를 교환할 수 있는 상당히 범용적인 기능을 제공합니다.

startKIT에서 PWM(servo_handler) 구현

범용 아키텍처를 테스트하기 위해 많은 장치를 제어하는 ​​데 사용하기로 결정했습니다. 장치는 전기적 인터페이스 노력이 거의 필요하지 않고(H-브리지 또는 트랜지스터 드라이버가 필요하지 않음) 취미용 서보가 되었고 서보 입력 와이어를 XMOS 출력 핀에 직접 연결할 수 있습니다. 저는 서보가 많지 않아서 8개의 서보 제어를 구현한 코드이지만 XMP-1에는 2개만 사용했습니다.

DC 모터 제어도 제공하도록 코드를 수정할 수 있습니다(적절한 외부 H 브리지 회로 사용).

단일 XMOS 코어를 사용하여 8개의 서보를 처리하기로 결정했습니다. 아래 다이어그램은 솔루션에 사용된 총 3개의 XMOS 프로세스를 보여줍니다. 새로 추가된 것은 오른쪽에 표시된 servo_handler 작업입니다. 이 작업에는 현재 서보 값을 저장하는 배열이 있습니다. 작업이 시작되자마자 값은 중앙 값으로 초기화되고(또는 연속 회전 서보의 경우 정지) 마이크로초마다 작업이 깨어나서 서보 PWM 신호 조정이 필요한지 확인합니다. 그렇다면 서보 포트 출력이 토글됩니다. 20msec 후에 프로세스가 반복됩니다.

자세한 내용:XMOS startKIT XMOS 및 Raspberry Pi Robot XMP-1 구축


제조공정

  1. NodeMCU와 Raspberry Pi 3 B+ 간의 MQTT 통신
  2. Python 및 Raspberry Pi 온도 센서
  3. Raspberry Pi의 간편한 온도 및 습도
  4. Raspberry Pi 온도 및 광 센서
  5. Raspberry Pi 센서 및 액추에이터 제어
  6. Raspberry Pi 및 습도 센서를 사용한 수경재배
  7. 새로운 RASPBERRY PI 3 모델 B + 기능 및 구매
  8. Raspberry Pi 및 Bridge Shield를 사용하는 로봇
  9. BeagleBone 및 Raspberry Pi, FPGA 추가 기능 추가
  10. MonkMakes Raspberry Pi 로봇 키트 제작