레고 Mindstorms NXT 초음파 센서를 Raspberry Pi에 연결하는 방법
추상
Lego Mindstorms NXT 초음파 센서를 Raspberry Pi에 직접 연결합니다. TCA9517 I2C 버스 버퍼와 SCL용 추가 GPIO 핀이 필요합니다. 측정된 거리를 읽을 수 있는 짧은 C++ 프로그램이 제공됩니다.
소개
몇 가지 단점에도 불구하고 Raspberry Pi(Pi)는 확실히 내가 가장 좋아하는 SBC입니다. 지금까지 가장 큰 커뮤니티와 각각의 모든 세부 사항이 잘 문서화되어 있습니다. 반면에 레고 마인드스톰은 제가 가장 좋아하는 로봇 구성 키트입니다. 다른 로봇 키트와 달리 로봇을 만들 수 있는 무한한 가능성을 제공합니다. 오늘은 자동차 봇, 내일은 추적 봇, 다음 날에는 6축 로봇 팔 - 모든 것이 가능합니다. NXT 버전의 키트에는 강력한 ARM 기반 마이크로컨트롤러가 포함되어 있어 대부분의 간단한 로봇 애플리케이션에는 충분하지만 컴퓨터 비전과 같은 고급 프로젝트에는 충분하지 않습니다. 최근 Lego는 Linux로 구동되는 Raspberry Pi와 같이 훨씬 더 강력한 두뇌를 가진 새로운 키트인 EV3를 출시했습니다. 그러나 여전히 이 뇌는 고해상도 이미지를 합리적인 속도로 계산할 수 없습니다. 그러므로 나는 여전히 라즈베리 파이의 힘과 레고의 무한한 가능성을 결합하고 싶습니다. 내가 아는 한 이를 달성하는 프로젝트가 하나 있는데, 바로 BrickPi입니다. 꽤 성공적이기는 하지만 몇 가지 단점이 있다고 생각합니다. 이 기사와 다음 기사에서 해결하고 싶습니다. 우선 이전 I2C 기반 NXT 센서와만 호환되며 새로운 UART 기반 EV3 센서와는 호환되지 않습니다. 또한 센서를 파이에 직접 연결하지 않고 두 개의 Atmega 마이크로컨트롤러(Arduino 호환)를 사용하여 센서와 통신합니다. 새 센서를 추가하거나 다른 변경 사항이 있으면 새 펌웨어가 필요합니다. 또한 BrickPi는 약 0.6A의 전류만 전달할 수 있는 L293D 모터 드라이버를 사용하는 반면 레고 NXT 모터는 스톨 시 최대 2A를 소비합니다[NXT 모터 특성]. 이 기사에서는 레고 마인드스톰을 직접 연결하는 방법을 보여드리고자 합니다. 추가 마이크로 컨트롤러를 사용하지 않고 Pi에 초음파 센서(US 센서).
도전
미국 센서를 Pi에 연결하려는 첫 번째 시도는 간단했습니다. 두 개의 n-FET[AppNote]가 있는 간단한 레벨 시프터를 사용하여 두 I2C 신호 라인을 연결하기만 하면 됩니다. US 센서는 5V 로직 레벨을 사용하고 파이는 3.3V만 사용하기 때문에 레벨 시프터가 필요합니다. 그런 다음 5V와 9V를 센서에 연결하고 간단한 테스트 프로그램을 시작했지만 아무 것도 얻지 못했습니다. 전선과 소프트웨어를 두 번 확인한 후 로직 분석기를 연결하고 미국 센서가 요청에 응답할 수 없고 자체 주소도 확인하지 못한다는 것을 깨달았습니다. 첫 번째이자 주요 문제는 Pi와 센서 간의 하드웨어 연결입니다. 하드웨어 및 소프트웨어 프로토콜은 회로도 [Lego HDK]를 포함하여 레고에 잘 설명되어 있으며 I2C를 사용하지만 센서를 파이에 직접 연결할 수 없습니다. 스킴 1에서 볼 수 있듯이 센서에는 매우 약한 풀업 저항(82 k) I2C 라인의 매우 강력한 직렬 저항(4.7k). 두 번째 저항은 우리의 주요 문제입니다. 아시다시피 Pi는 I2C 라인에 강력한 1.8k 풀업 저항을 사용합니다. 직렬 저항으로 인해 센서는 I2C 라인을 풀다운할 수 없으므로 I2C 마스터의 요청에 응답할 수 없습니다. 그림 1은 이 상황의 대략적인 시뮬레이션을 보여줍니다. 파란색 선은 센서가 보내려고 시도하는 데이터를 나타내고 녹색 선은 Pi에서 수신한 데이터를 나타냅니다. 보시다시피 센서는 시뮬레이션된 데이터 라인을 낮출 수 없습니다. 또한 3.3V까지의 강력한 풀업 저항이 하이 레벨에서도 라인을 지배하기 때문에 이 상태에서는 레벨 시프팅 회로가 필요하지 않습니다. 내가 지금까지 찾은 이 문제에 대한 유일한 해결책은 I2C용 2채널 양방향 버퍼인 TCA9517을 사용하는 것입니다. 게다가 이 칩은 레벨 시프팅을 담당합니다. 두 번째 문제는 미국 센서의 펌웨어 버그에서 비롯됩니다. 예를 들어 여기 mbed 포럼에 설명되어 있습니다. 논리 분석기(독일어)를 사용하여 Lego Mindstorms NXT와 미국 센서 간의 통신을 분석하는 방법을 설명하는 기사도 있습니다. 요약하자면, 레지스터를 센서에 쓰는 것과 실제로 센서에서 데이터를 읽는 사이에 추가적인 클록 주기(SCL 라인에서 토글)가 필요합니다. 이것은 물론 표준 I2C 하드웨어 또는 소프트웨어 구현과 호환되지 않습니다. GPIO 쌍을 사용하여 특수 소프트웨어 I2C 구현을 작성할 수 있지만 Pi에서 SCL 라인으로 다른 GPIO를 연결하고 레지스터를 센서에 쓰는 것과 레지스터 내용을 읽는 것 사이에서 전환하는 것이 더 간단합니다.
하드웨어
간단한 프로토타입에 필요한 하드웨어:
- Lego Mindstorms NXT 초음파 센서
- Mindstorms 케이블 + 소켓/마인드스톰 케이블 절단
- TCA9517 및 DIP 8 소켓 또는 기타 SO8 → DIP8 어댑터 및 일부 기본 SMD 납땜 기술
- 라즈베리 파이(저는 라즈베리 파이 A를 사용하고 있었습니다)와 일반적인 액세서리
- 빵판 및 케이블
이 프로토타입을 위해 작은 맞춤형 Lego Mindstorms 센서 브레이크아웃 보드가 있는 빵 보드를 사용했습니다. 이 보드는 Lego Mindstorms NXT [Lego HDK]의 9V 제어 및 센서 포트 보호를 모방합니다. 간단한 프로토타입의 경우 I2C 라인에 9V 스위칭 회로(2개의 FET) 또는 추가 직렬 저항과 다이오드가 필요하지 않습니다. 케이블의 핀 1에 9V, 핀 2와 3에 GND, 핀 4에 5V(다이오드 D1 생략), SCL_5V를 핀 5에, SDA_5V를 핀 6에 연결하면 됩니다. 자세한 내용은 레고 마인드스톰 NXT를 연결하는 방법입니다. Raspberry Pi에 대한 초음파 센서