ESPway | 로봇 제어 세그웨이 스타일 와이파이 ESP8266 구축

내가 아두 이노와 임베디드 시스템 땜질 시작 이후로, 나는 자기 밸런싱, 세그웨이 같은 로봇을 구축하는 방법에 대해 매우 흥분했습니다. 인터넷의 주위에 유사한 프로젝트 및 리소스는 매우 풍부하다.

첫 번째 프로토 타입은 플라스틱 도시락 상자 안에 지어졌습니다. 그것은 아두 이노 나노 사용 원격 제어를 적외선. 그것은 사용 MPU6050 로봇의 방향을 검출하기위한 관성 측정 유닛. 균형은 매우 잘 작동하지만, 적외선 원격 제어는 매우 비실용적이고 신뢰할 수 있었다.

내가 대해 알게되었을 때이 프로젝트는 부활 ESP8266 , 매우 강력한 코어의 저렴한, 와이파이 활성화 마이크로 컨트롤러. 웹 개발에 대한 배경을 갖는, 와이파이 연결이 나에게 가능성의 세계처럼 보였다.

전통적 아두 이노 커뮤니티 원격 제어 로봇은 블루투스 통신을 이용하여 구현되어왔다. 그러나, 이것은 실질적으로 컨트롤러 소프트웨어를 각 플랫폼에 개별적으로 구현되어야한다는 것을 의미한다 (안드로이드, 아이폰 OS, PC 등)

HTML과 자바 스크립트로 구현 웹 애플리케이션은 점점 더 인기를 끌고있다. 이유 중 하나는 휴대 성이다. 웹 응용 프로그램을 한 번 작성되면, 그것은 충분히 좋은 웹 브라우저가있는 모든 플랫폼에서 실행할 수 있습니다.

ESP8266은 WiFi 액세스 포인트로 구성 될 수있다. 하나는 웹 응용 프로그램 서비스를 제공하기 ESP8266이 가능하고, 정적 페이지를 제공하는 HTTP 서버를 설정할 수 있습니다. 로봇 제어 소프트웨어는 웹 응용 프로그램으로 구현 된 경우 이제 상상! 그건 내 프로젝트 ESPway 뒤에 키 생각이다.

이 작은 로봇에 대한 코드와 회로도를 찾을 수 있습니다 GitHub의에 . 구축 개발 및 소프트웨어 사용에 대한 사전 설명이 있습니다. 또한이 사용자 설명서의 어떤 종류를 짓고 있어요. 이 프로젝트는 또한 한 레딧에 논의 나는 비디오를 게시 할 때 얼마 전에.

안전 제일

깊은 기술적 인 세부 사항에 다이빙하기 전에, 그래도 난 당신이 스스로를 구축하려고하는 경우 안전에 대해 경고한다.

전자 및 소프트웨어는이 글을 쓰는 현재의 (저전압 차단 제외) 안전 기능이 포함되어 있지 않습니다. ESP8266의 펌웨어 (이것은 아마도 수 / 노점을 충돌하는 경우  일), 회전에서 모터를 중지 아무것도 없다. 이 로봇은 작은 및 그 주변을 손상하지 충분히 빛이 내 경우에는 특별한 문제가되지 않습니다. 그러나,이 로봇의 크고 무거운 버전을 제작하기 전에 안전을 고려하시기 바랍니다. 하나는 아마도 소프트웨어 오류의 경우에 모터를 차단 할 몇 가지 안전 장치 시스템을 구현할 수 있습니다.

전자 및 기계

이 로봇 부품의 대부분은 이베이 나 AliExpress에서 공급된다. 전체 회로도는 GitHub의에서 찾을 수 있습니다. 이 프로젝트의 목표 중 하나는 가능한 한 간단하고 저렴한 전자를 유지했다.

로봇의 핵심은 ESP8266 마이크로 컨트롤러가있다. 그것은 독립 구성 요소로 사용되지하지만 거기 WEMOS D1 미니보드. 그것은 USB 커넥터와 펌웨어를 업로드하기위한 USB-에-UART 컨버터를 가지고있다.

MPU6050는 방위 센서로서 사용된다. 그것은 I2C를 통해 통신, 사용 가능한 저렴한 브레이크 아웃 보드의 많음이있다. 나는 GY-521라는 하나를 데 사용합니다.

모터는 통합 금속 기어 박스와 평범한 오래된 DC 모터입니다. 공칭 회전 속도는 300 rpm으로, 그리고 그들은 6V에 대한 평가된다. 하나는 “N20의 300RPM”또는 “12ga의 300RPM”를 검색하여 이러한 모터를 찾을 수 있습니다.

모터가 구동되어 L293D 듀얼 H 브리지 모터 드라이버 IC. 그 로봇을 구축 할 때 내가 손에 가지고 무엇 때문에이 IC는 주로 선택되었다. 바이폴라 트랜지스터의 출력은 다리를 건너 큰 전압 강하를 생산 이제 나는 배웠다. 결국 내가 가진 드라이버 교체 할 수 있습니다 DRV8833 MOSFET 출력을 가지고있다.

나는 로봇에 전력을 공급하기 위해 2 셀 리튬 폴리머 배터리를 사용하고 있습니다. 완전히 충전 된 때 ~ 8.4 볼트를 제공합니다. 전지 전압은 ESP8266의 아날로그 입력을 통해 모니터되고, 배터리 전압이 소정의 임계 값 아래로 떨어질 때, 모터를 차단하는 선택적인 특징이있다. 즉 리튬 폴리머 배터리를 사용하는 것이 일반적이다. 아날로그 입력 범위는 0-1 볼트이다. 3.3 다음 D1 미니 보드, 이미 1의 비율로 분압기있다. 따라서 I은 아날로그 입력 범위에 적합하도록 배터리 전압 스케일링 1:10 비율로 수정 한 저항을 추가했다.

마지막으로,이 WS2812B의 NeoPixels은 로봇의 “눈”으로 추가됩니다. 그들은 (OTA 업데이트 등을 진행있을 경우이 떨어진 경우) 로봇의 현재 상태를보고 매우 유용 증명

크기와 무게의 최적화를 설계 목표로 설정 한 것을 다른 역학에 대해 말을 많이가 아니다. 프로토 타입 몸은 4mm 합판의 일부 조각의 내장 및 에폭시와 함께 붙어있다.

로봇의 일반보기

소프트웨어 플랫폼

현재 자원과 ESP8266에 소프트웨어를 개발하기위한 지원의 재산이있다. 제조업체 Espressif하는 RTOS없이 운영 체제와 다른 하나 하나가 제공하는 두 개의 SDK가 있습니다. 도있다 아두 이노 코어 의 심바 크로스 플랫폼 RTOS 프레임 워크와 MicroPython은 . 새로운 언어와 프레임 워크가 큰 인 지금 가끔씩 튀어 나올 것 같다!

이 로봇에 대한 몇 가지 프로토 타입을 사용하여 아두 이노 코어에서 수행 된 PlatformIO를 빌드 시스템으로. 프로토 타입 작업은에서 찾을 수 있습니다 해당 지점 GitHub의의 REPO의.

그러나 최대의 유연성과 제어를 위해, 나는 제조업체의 “비 OS”SDK로 전환. 하나는이 마이크로 컨트롤러와 함께 얻을 수있는 즉 약으로 기본입니다. 나는 특히,이 SDK에 사용할 멋진 도서관이 있었다 찾을 수 기쁘게 생각 libesphttpd 간단한 HTTP 서버와 파일 시스템을 구현한다. 그것은 또한 웹 소켓 통신 시설을 갖추고으로이 프로젝트를위한 안성맞춤이었다.

모바일 웹 UI

로봇에 전원을 공급하고, WiFi 액세스 포인트에 클라이언트 장치를 연결 한 후, 하나는 기본 IP 주소에서 웹 브라우저 사용자 인터페이스를 열 수 있습니다 192.168.4.1.

나는 가능한 한 간단하게 UI를 유지하기 위해 노력했다. 그것은 본질적으로 HTML5 캔버스에 그려진 가상 “조이스틱”로 구성되어 있습니다. 터치 디바이스에서 휴대 전화 등, 꽤 직관적 인 느낌.

조정에 사용되는 사용자 인터페이스.

의 URL에서 로봇의 PID 매개 변수의 온라인 튜닝을위한 UI도 있습니다 /pid. 그것은 진행중인 작품이지만, 반 사용 가능한 상태에서 이미. 그것은 본질적으로 펌웨어를 매개 변수가 변경 될 때마다 다시 깜박하지 않고 한 번에 로봇을 조정 할 수 있습니다. 하나는 UI를 통해 플래시 메모리에 조정 매개 변수를 저장할 수 있습니다.

초기 PID 튜닝 사용자 인터페이스를 제공합니다.

웹 소켓을 통해 대기 시간이 짧은 통신

아마이 프로젝트의 가장 흥미로운 부분은 낮은 지연 시간 원격 제어를 달성하는 방법이다.

전통적으로 사람들은 ESP8266에 HTTP API가 어떤 종류의를 구현하고있다. 그것은 각 명령에 대해 별도의 URL가 있다는 것을 의미한다. 예는 로봇 차, 같은 URL이있을 것 /forward/backward/stop/turn-left/turn-right등 다음 만들 것 클라이언트 응용 프로그램 AJAX의 로봇을 제어하는 요청을. 그러나, TCP 연결을 열고 모든 명령에 구문 분석 HTTP 헤더가있을 것입니다 의미합니다. 즉, 불필요한 오버 헤드 및 지연을 도입한다. 이 컨트롤은 그런 식으로 매우 부드러운 없을 것이다.

더 나은 대안은 열려있는 TCP 소켓을 유지하고 두 방향으로 그것을 통해 정보를 전송하는 것입니다. ESP8266 원시 TCP 통신을위한 일류 지원을하고 있지만, 자바 스크립트 하나는 원시 TCP 소켓을 열 수 없습니다. 대신있다 WebSockets를 정의 된 핸드 쉐이킹 프로토콜 및 데이터 프레임 포맷 첨가 TCP 소켓이다. 때문에 libesphttpd웹 소켓 구현을 가지고, 나는이 세부 사항에 대해 걱정하지 않았지만, 단지 데이터 패킷을 교환한다.

데이터 패킷의 첫 번째 바이트에 해당되는 명령을 표시하고, 이후의 추가 바이트 데이터이다 : 거기 로봇와 UI 사이에 통신하는 매우 단순한 프로토콜이다. 부가 데이터의 길이는 각각의 명령에 대한 알려진 고정된다. 예를 들어, 클라이언트에 의해 전송 된 “스티어링”데이터 패킷은 3 바이트로 구성 첫 번째 바이트 (즉, 같은 코드로 정의되어 제로 STEERING). 두번째 바이트는 원하는 속도를 나타내고, 세 번째는 회전 속도를 나타내는 (네거티브 = 좌, 포지티브 = 우측). 이 경우, 두 번째 및 세 번째 바이트는 8 비트 부호있는 정수로 해석된다. 데이터 바이트의 해석은 문제의 명령에 따라 달라집니다.

부드러운 양방향 통신을 감안할 때, 하나는 멋진 모든 종류의 것들을 구현할 수 있습니다. 예를 들어, 로봇은 클라이언트 웹 응용 프로그램에서 배터리 모니터링을 허용, 연결된 모든 클라이언트에 현재 배터리 독서를 보낼 수 있습니다. 또한, 가장 실용적인 것들 중 하나는 PID 컨트롤러 매개 변수의 온라인 튜닝이다.

데이터 바이트의 C 코드, 조작 및 천연 재 해석된다. 자바 스크립트에서는, 이진 데이터는로 표현되는 ArrayBuffer원시 이진 데이터의 블록의 표현은 본질적이다. 액세스 및 수정하려면, 하나는 사용할 수 있습니다 DataView기본 바이너리 버퍼에 바이트 수준의 액세스를 제공한다. 하나는 예를 들어 “바이트의 16 비트 부호없는 정수 (리틀 엔디안)로 13 쓰기 버퍼의 처음부터 오프셋 2″라고 할 수있다. 나는 자바 스크립트 API를 제공 낮은 수준의 제어가 찾을 수 놀랐다.

고정 소수점 센서 퓨전

I2C를 통해 MPU6050와 통신하는 것은 쉽다. 하나는 1 kHz에서 업데이트되는 세 축의 가속도와 자이로 측정치를 포함하는 하드웨어 레지스터를 판독 할 수있다. 배향으로이 값을 변환하는 과정은 “센서 퓨전”라고한다. 거기를 수행하는데 사용될 수 센서 자체로 신호 처리 코어이고,이 우수한 I2Cdevlib것을 구현한다. 그러나, 내가하고 싶지 않은 무언가 센서에 바이너리 펌웨어 덩어리를 업로드해야합니다. 또한, 그 알고리즘은 미가공 데이터는 1 kHz에서 사용할 경우에도 200 Hz의 샘플링 레이트만을 할 수있다.

주어진 ESP8266가 가진 32 비트 코어를 가지고 16 * 16 -> 32 비트 곱셈 확대, I 센서 융합하는 대신에 구현 될 수 있다고 생각. 가장 특히, 선택할 수있는 많은 알고리즘이 있습니다 보완 필터 , 칼만 필터 와 Madgwick 필터 . 후자는 독창적으로 작동 최첨단 신규 알고리즘 쿼터니온 방향의 표현. 또한이 시작하는 데 사용할 수 몇 가지 예제 코드이었다, 그래서 Madgwick 알고리즘이 선택되었다.

ESP8266는 부동 소수점 유닛이 골대를 벗어났습니다하고, 부동 소수점 연산은 소프트웨어로 구현해야합니다. 즉, 복잡한 비즈니스 컴파일러 지원 라이브러리에서 수행되었지만, 그것은 아주 느리다. 따라서, 나는 완전히 알고리즘의 부동 소수점 숫자의 사용을 방지하기 위해 원했다. 따라서 나는 Q16.16에 샘플 코드를 번역하기로 결정했습니다 고정 소수점 숫자 표현을 . 고정 점은 우리가 기본적으로 정수를 위해 노력하고 있지만, 16 최하위 바이트가 소수 부분으로 촬영 한 것을 의미한다.

구현에 대한 하나 개의 좋은 실용적인 세부 다음 Madgwick 알고리즘에, 하나는 어떤 경우에 벡터와 사원 수를 정상화해야한다. 이 경우 정규화는 제곱근으로 나눈 것을 의미한다. ESP8266의 핵심은 하드웨어 부문을 가지고 있지 않기 때문에이 소프트웨어에서 구현 될 필요가 있습니다. 동일은 제곱근에 적용됩니다. 우리는 어떻게 든 그것을 피할 수있는 경우에 따라서는 개별적으로 두 작업을 수행하는 것이 훨씬 이해가되지 않습니다. 반면에, 곱셈 연산의 측면에서 상대적으로 저렴합니다. 제곱근 나누면 제곱근의 역수를 곱한 것과 같다. 즉 여기에서 이루어졌다 무슨 – 상호 제곱근 함수의 라인을 따라 구현 이 StackOverflow의 대답 .

캐스케이드 PID 제어

어떻게 로봇이 실제로 균형을 유지합니까? 지금까지 우리는 로봇의 방향의 좋은 평가가 있습니다. 어떻게 든 적합한 모터 출력 신호로 변환되어야한다.

대답 할 두 가지 질문이 있습니다 :

  1. 로봇의 기울기 각도는 균형을 유지하기 위해 무엇을해야 하는가?
  2. 어떤 모터 출력 전력은 소정 경사각을 달성해야 하는가?

캐스 캐 이드 :이 자연스럽게 종종 자기 밸런싱 로봇에 구현 된 제어 전략에 이르게 PID 컨트롤러 . PID 제어에 대한 소개, 나는 기사 추천 박사 학위없이 PID를 팀 웨스콧에 의해. 본질적으로, 제 제어부는 입력으로서 원하는 속도를 취득하는 속도를 달성하기 위해 경사 각도를 제어한다. 바람직한 경사각은 그 각도를 달성하기 위해 모터 출력을 조정하는 제 제어기에 공급된다.

물론, 상기 제 2 제어부는 MPU6050 관성 측정 유닛을 통해 피드백을 얻는다. 한편, 현재 속도의 피드백을 얻는 것은 사소한 일이 아니다. 하나는 모터 샤프트에 회전 인코더를 설치하여 그것을 달성 할 수있다. 비용을 최소화하고 회로를 단순화하기 위해, 나는 그것을 밖으로 떠났다. 대신에, 내 코드에 사용되는 조 근사있다 : 속도 피드백이 단기 변동을 취소하기 위해 평활화 모터 구동 신호로부터 취해진 다. 이 사실은 놀라 울 정도로 잘 작동합니다!

또한, 단순한 형태의 게인 스케줄링은 로봇이 낙하하려고하는 상황에서 사용된다. 높은 비례 이득 PID 계수들의 상이한 세트는 다시 안정성을 달성하기 위해로드된다. 아래의 비디오 (일부 fallovers와 함께) 당신은 행동에서 볼 수 있습니다.

여기에 설명 된 제어 방식은 자기 밸런싱 로봇을 구현하는 유일한 방법은 아니다. 참고 이 문서 로봇의 동적 모델을 기반으로 제어 방식과 비교합니다.

소프트웨어 드라이버

마지막으로을의이 ESP8266 프로그래밍의 일부 실용성을 논의하자.

이 마이크로 컨트롤러에 하나의 문제는 하드웨어 주변의 부족이다. 특히, 칩상의 I2C 또는 PWM 어떠한 하드웨어 구현은 없다. 그들은 소프트웨어로 구현되어야한다. 문제는 매우 동일한 프로세서 코어 끊임없이 무선 통신을 처리하는 것으로한다. 그래서, 다른 소프트웨어 루틴은 와이파이 인터럽트에 의해 중단 얻을 수 있습니다. I2C 및 PWM 모두 타이밍에 대한 중요하기 때문에 그것은 약간의 문제입니다.

PWM 및 I2C의 소프트웨어 구현은 Espressif SDK와 함께 번들로 제공됩니다. 그러나 글을 쓰는, 그들은 어떤 식 으로든하거나 비효율적에 결함이 있습니다. 다행히, 지역 사회에서 어떤 똑똑한 사람들은 자신의 드라이버를 출시했다. I 사용하여 결국 ESP8266_new_pwm정확한 타이밍 안정된 PWM 신호를 실현할 NMI 인터럽트를 사용 스테판 브루엔스 의해. 모터는 2 kHz에서 PWM으로 공급된다.

I2C를 들어,라는 빠른 조립 구현 brzo_i2c파스칼 커턴스키으로 사용 하였다. 나는 I2C 거래 중에 완전히 비활성화 인터럽트 때문에 처음에는 I2C 드라이버에 약간의 문제가 있었다. 이는 결국 일부 WiFi를 발사 할 수없는 방해 아마도에, 펌웨어 충돌로했다. 즉, 쉽게 인터럽트를 비활성화 명령을 주석에 의해 수정되었습니다. 즉, I2C 타이밍을 타협하지만, 실제로는 모든 것이 매우 잘 작동하고있다.

피드백

이 문서에서 설명하는 무언가의 더 정교한 설명을 좋아하거나 해결하기 위해 발견 뭔가를했을 경우,이 사이트에 문제를 제기하십시오 GitHub의의의 repo . 당신은 또한에 연락처 찾을 수 있습니다 이 페이지를 . 모든 의견은 매우 환영하고 감사합니다.

Leave a Reply