본문 바로가기
모빌리티 프로젝트

변신 가능한 호버카를 조립하세요! | 리모콘! | 1부(방법)

by 모빌리티키즈 2023. 12. 27.
728x90
반응형

호버카 만들기! | 리모컨 제어! | 파트 1 (만드는 법)

이 프로젝트의 첫 번째 파트에서는 멋진 리모컨 제어 자동차를 만드는 방법을 보여드릴 것입니다. 이 자동차는 자신의 날개를 재지향할 수 있는 능력을 가지고 있습니다.

최고의 품질로 읽으려면 여기에서 제 홈페이지의 이 기사를 확인해보세요. 팝업이 나타나면 하단의 dismiss를 클릭하면 됩니다. 또한, 내 작업을 지원하기 위해 무료로 구독하는 것도 잊지 마세요! :)


단계 1:

이것은 제 호버카 프로젝트의 첫 번째 파트입니다! 이는 네 개의 BLDC (브러시리스 직류) 모터를 사용하여 네 개의 프로펠러를 매우 높은 각속도로 회전시키며, 두 개의 서보 모터와 결합하여 이동하면서 프로펠러의 추력을 재지향합니다. 이를 통해 차량을 바닥을 따라 운전하거나 하늘로 띄울 수 있게 해줍니다 (파트 2에서!). 이것은 차량에 3차원 이동 능력을 부여한다고도 말할 수 있습니다. 저는 2D는 정사각형에게 맞다고 결정했나 봅니다 (이해하셨나요)?
이것이 파트 1이기 때문에 아직 안정적인 비행은 작동하지 않습니다. 하드웨어는 완성되었고 비행에 사용될 수 있지만, 비행 제어 소프트웨어를 작성하는 데는 눈에 보이는 것보다 훨씬 더 많은 것들이 필요하다는 것이 드러났습니다. 확실히 상업용 모듈을 사다 쓸 수 있지만, 그것은 속임수입니다! 이미 이 프로젝트에 많은 시간을 투자했고, 다른 멋진 것들을 만들기 시작하고 싶습니다! 그렇게 말하고, 나는 이 프로젝트로 돌아와서 더 나은 비행 제어 소프트웨어를 개발하기로 결정했습니다 (항상 물건들을 망가뜨리지 않는). 

나는 그것이 지상에서 운전될 때 자동차 자체가 실제로 "호버링"하지 않는다는 것을 알고 있지만, 그것을 호버카라고 부르는 것이 "변형 가능한 육상 비행선"이라고 부르는 것보다 훨씬 더 멋지므로 그렇게 할 것입니다.

실제로 컨트롤도 꽤 좋습니다! 조이스틱을 움직일 때 조이스틱에 어떻게 반응하는지 확인하십시오.

2 단계 :

 

보시다시피 매우 불안정합니다! "오, 간단해. 거꾸로 치우쳐 있을 뿐이야!" 불행히도 그렇게 간단하지 않습니다. 프로그래밍에 관한 한 모두 같은 속도입니다! 가장 가능성이 높은 가능성은 모터 중 하나가 약간 느릴 수 있다는 것입니다. 교체하면 다른 모터에서도 동일한 문제가 발생합니다. 이러한 추세는 한동안 계속되어 원래 교체한 모터/ESC까지 거슬러 올라갑니다. 각 모터의 속도에는 항상 약간의 결함이 있으며, 이는 실시간 피드백과 조정이 중요하다는 것을 의미합니다.

작업 개념

주요 아이디어는 3GHz의 ESP2.4-S3 마이크로 컨트롤러를 사용하여 범용 컨트롤러 프로젝트와 무선으로 통신하고 MPU6050 자이로스코프 장치를 사용하여 우주에서 드론의 위치에 대한 실시간 피드백을 제공한다는 것입니다. (돌아와서 비행 제어 소프트웨어를 다시 작성할 때 필요합니다. 지상에서만 사용하고 싶다면 전혀 필요하지 않습니다.)

BLDC 모터를 움직이기 위해 ESP32-S3의 서보 모터 PWM(펄스 폭 변조) 신호로 구동되는 4개의 ESC(전자 속도 컨트롤러)를 사용하여 원하는 회전 속도를 전달합니다. 이것은 또한 서보 모터에 동일한 서보 신호를 사용할 수 있기 때문에 편리합니다 (PWM 서보 모터 신호이기 때문에).

다양한 펄스 길이의 모양은 다음과 같습니다.

모든 서보는 50Hz 또는 20ms 펄스 길이에서 작동합니다.

이 프로젝트를 위해 선택한 서보는 MG996R 서보 모터인데, 그 이유는 상당히 강력하고 돈으로 살 수 있을 만큼 저렴하기 때문입니다.

또한 차량의 상태를 나타내고 멋지게 보이도록 멋진 RGB LED를 추가했습니다. 이 프로젝트에 사용하는 것은 세 가지 RGB 색상을 모두 변경하는 데 하나의 신호 만 필요하기 때문에 실제로 매우 깔끔합니다.

하드웨어 이해

이제 이 장치의 모든 회로가 어떻게 작동하는지 자세히 살펴보겠습니다.

고품질 이미지는 내 GitHub에서 찾을 수 있습니다. 부품 목록에서 10uF 캡의 정격은 25V가 아닌 16V입니다. 이 회로에 대해 5V를 훨씬 초과하지 않으므로 둘 다 훌륭하게 작동합니다. 편집 가능한 보드 파일은 BOM에서 찾을 수 있습니다.

전자 장치에 대한 주요 아이디어는 다음을 수행할 수 있는 회로를 구축해야 한다는 것입니다.

  • 무선 데이터를 수신합니다.
  • 수신된 데이터를 다양한 신호로 변환합니다.
  • 이러한 신호를 외부 장치(ESC 및 서보)로 보냅니다.
  • 비행 컨트롤러를 설정할 때마다 실시간 피드백을 위해 온보드 자이로스코프 IC(집적 회로)와 통신합니다.

즉, 무선 기능이 있는 마이크로 컨트롤러가 작업에 적합할 것입니다. 물론 다른 모든 프로젝트와 마찬가지로 ESP32-S3 또는 더 구체적으로 ESP32-S3-WROOM-1(안테나와 함께 제공됨)을 사용했습니다. 이것은 Arduino IDE와 잘 인터페이스하는 매우 강력하고 저렴하며 간단한 마이크로 컨트롤러입니다. 또한 잘 알려진 ESP32의 후속 제품이기도 합니다.

마이크로 컨트롤러를 구축하는 데 필요한 모든 것은 회로도의 "ESP32-S3"이라고 표시된 큰 상자에 있습니다. ESP32-S3 데이터시트 회로도에서 직접 회로도의 대부분의 배치 값을 얻었지만 이전 프로젝트와 마찬가지로 USB를 통해서만 마이크로 컨트롤러와 통신하기 때문에 UART의 일부 구성 요소를 제거했습니다. 또한 RGB LED를 추가하여 PCB에서 대칭이 될 수 있도록 했습니다. 첫 번째 RGB LED(SK6812MINI)의 출력을 두 번째 RGB LED()의 입력에 연결하면 두 LED를 동시에 제어할 수 있어 매우 깔끔합니다.

(더 밝게 보이려면 설치 공간을 변경하고 미니 버전 대신 풀 사이즈 SK6812 RGB LED로 교체할 수 있습니다.)

각 구성 요소의 작동 방식과 저항과 커패시터를 배치한 이유에 대해 자세히 알아보려면 BOM(Bill of Materials)에 링크된 해당 데이터시트에서 각 구성 요소를 자유롭게 확인하십시오. 때때로, 전자 공학에 대해 배우기 위해 정말로 해야 할 일은 좋은 데이터시트 시간뿐입니다!

마이크로 컨트롤러 회로가 완료되면 모든 출력을 ESC, 서보, MPU6050 자이로 등과 같은 외부 구성 요소에 공급하기만 하면 됩니다.

위에서 볼 수 있듯이 핀 헤더(커넥터)를 사용하여 외부 구성 요소를 PCB에 납땜/연결할 위치를 나타낼 수 있습니다.

배터리 양단의 전압은 낮아질수록 떨어지기 때문에 배터리 충전량의 대략적인 값을 모니터링할 수 있도록 "PWR" 아래에 전압 분배기를 추가했습니다. ADC(아날로그-디지털 변환)를 사용하여 전압을 측정하는 방법에 대해 자세히 알아보려면 범용 컨트롤러 게시물을 확인하십시오.

이제 남은 것은 MPU6050 자이로스코프 IC입니다. 마이크로 컨트롤러를 사용하여 클록(SCL)과 데이터 라인(SDA)의 두 와이어로만 구성된 널리 사용되는 통신 프로토콜인 I2C(Inter-Integrated Circuit)를 사용하여 이 IC와 통신할 수 있습니다. 실제로 I2C는 i-제곱-C(I^2C)이기 때문에 일반적으로 IIC로 작성됩니다.

보드 구축

고백 시간: 원래는 잘 알려진 MPU6050 대신 L2G2ISTR 자이로스코프 IC를 사용하려고 했는데, 제대로 작동할 수 있는지 확인하기 위한 도전이었습니다. 그러나 불행히도 나는 그것을 해킹 할 수 없었다.

길이가 2.3mm에 불과하고 모든 핀이 바닥에 있는 IC를 손으로 잘 납땜하고 문제를 해결하는 것은 매우 어렵습니다.

 

PCB 테스트 보드를 사용하더라도 구성 요소를 납땜 해제했을 때 많은 핀에 납땜 잔여물이 없다는 것을 발견했습니다. 몇 번 다시 시도했지만 마침내 효과가 있다고 생각한 것을 얻었을 때 IC를 과도하게 납땜하여 어딘가에 단락시켰을 수 있다고 생각합니다. 물론 모든 핀이 바닥에 있기 때문에 검사할 방법도 없었습니다. 몇 번은 IC와 통신하여 칩 ID를 얻을 수 있었지만 그 이상은 아니었습니다. 또한 칩과 SPI(직렬 주변 장치 인터페이스) 통신을 처음부터 설정하는 것도 상당히 어려웠으며 이는 기여 요인이 될 수 있습니다.

어쨌든, 여덟 개의 IC, 2 주, 그리고 $ 39.12 + 배송 나중에 나는 양보하고 잘 알려진 MPU6050 자이로 하하와 함께 가기로 결정했습니다. 내 실수가 당신에게 교훈이 되도록하십시오, 당신이 볼 수없는 핀이있는 초소형 IC를 구입하지 말고 손으로 납땜하려고하십시오!

이것이 내가 MPU6050 연결을 즉흥적으로 만들어야했던 이유이기도합니다.

운 좋게도 보드를 처음 설계했을 때 선택적 디버깅을 위해 OLED 디스플레이와 인터페이스하기 위해 I2C 연결을 끊었기 때문에 해결하기가 그리 어렵지 않았습니다. 하지만 걱정하지 마세요! MPU6050 플러그 앤 플레이 할 수 있도록 다운로드 할 보드를 수정했습니다. 운이 좋으시군요!

 

즉, 나는 또한 그것을 시도 할만큼 용감한 사람들을 위해 L2G2ISTR 인터페이스하려고 시도한 곳을 떠났습니다. 연결을 끊은 상태로 두거나 실패하더라도 모든 것이 MPU6050에서 계속 작동합니다(실수로 접지 전원을 단락시키지 않는 한). 챌린지를 시도하고 싶다면 여기 데이터 시트, 위치 및 회로도가 있습니다.

이제 나머지 PCB 어셈블리로 이동합니다.

전체 PCB 및 라우팅은 다음과 같습니다.

  • 보드의 Gerber / 제작 파일은 여기 내 GitHub에서 찾을 수 있습니다.
  • 보드의 편집 가능한 KiCad 파일은 여기에서 찾을 수 있습니다.
  • 이 회로에 필요한 모든 구성 요소의 부품 목록은 여기에서 찾을 수 있습니다.
  • 부품을 주문해야 하는 것이 고통스러워 보일 수 있다는 것을 알고 있지만 그렇지 않은 이유를 설명하겠습니다! 동일한 마이크로 컨트롤러(전능한 ESP32-S3)를 사용할 때마다 거의 모든 것이 정확히 동일하기 때문에 한 프로젝트에서 주문한 거의 모든 부품이 재사용됩니다! (물론 프로젝트에 필요한 만큼 마이크로 컨트롤러와 인터페이스하기 위한 부품을 주문해야 하지만 이는 최소한입니다!) 즉, 부품을 한 번만 주문하면 앞으로 많은 프로젝트를 수행할 수 있습니다. 그러니 대량으로 구매하고 겁먹지 마십시오. 실습 경험을 통해 얼마나 많은 것을 배울 수 있을지 생각해 보세요!
  • 5 단계 :

    갓 구운 PCB의 냄새만큼 좋은 것은 없습니다.

    MPU6050용 브레이크아웃 핀이 있고 OLED용 핀은 없습니다.

    참고: 코드를 업로드하기 전에 보드를 부트로더 모드로 전환해야 합니다. 부팅 버튼을 누른 상태에서 재설정 버튼(RST)을 누른 상태에서 > 누른 상태에서 > 누른 다음 부팅 버튼에서 손을 떼면 됩니다.

    내 PCB 어셈블리 비디오 품질이 크게 향상되었음을 눈치채셨을 것입니다. LinkMicro의 친절한 사람들 덕분입니다! 방금 그들로부터 새로운 LM249MS 디지털 현미경을 받았는데 정말 놀라웠습니다! PCB를 조립할 때 지금 내가 무엇을 하고 있는지 실제로 볼 수 있을 것 같고, 당신도 마침내 내가 하는 일을 볼 수 있다고 느낄 것이라고 확신합니다 하하.

    이 PCB 레이아웃의 또 다른 흥미로운 점은 USB D+/D- 트레이스 라우팅입니다. 나는 과거에 그들과 함께 몇 가지 실수를 저질렀기 때문에 이것이 만지는 것이 좋을 것이라고 생각했습니다. 이러한 데이터 라인은 컴퓨터에서 ESP32-S3 SoC(시스템 온 칩)로 마이크로 컨트롤러를 프로그래밍하는 데 사용하는 모든 정보를 전달하기 때문에 매우 중요합니다. 이러한 트랙을 라우팅할 때는 차등 쌍으로 라우팅하는 것이 중요합니다. 즉, 서로 다른 신호에 의해 생성된 전자기장이 서로 상쇄되어 다른 주변 구성 요소/인접 트레이스를 방해하지 않도록 서로 나란히 있어야 합니다. USB 프로토콜에 대해 자세히 알아보려면 여기 좋은 비디오가 있습니다.

  • 그러나 D+/D- 트레이스를 라우팅할 때 수행해야 할 또 다른 중요한 사항은 가능한 한 다른 아날로그 신호와 전기적으로 절연된 상태를 유지하는 것입니다. 이 사진의 파란색 트레이스는 USB 데이터 라인으로, 데이터를 가능한 한 순수하게 유지하기 위해 PCB의 노이즈 영역에서 멀리 라우팅되는 것을 볼 수 있습니다.

    집회

    이 프로젝트가 완전히 완료되지는 않았지만 만들고 싶은 사람을 위해 어셈블리 부분을 추가하고 싶었습니다. 그럼에도 불구하고 운전하고 엉망으로 만드는 것은 여전히 꽤 굉장합니다! 확실히 평범한 RC 자동차는 아니지만 꽤 눈길을 끄는 하하. 비행 컨트롤러 부분도 자유롭게 작동시키십시오! 당신이 뭔가를 알아낼 수 있다면 당신의 의견을 듣고 싶습니다.

    어셈블리 섹션을 지나치기 위해 영원히 스크롤하고 싶지 않으신가요? 여기를 클릭하여 건너 뛰십시오!

    먼저 모든 부품을 인쇄해야 합니다. 이에 대한 파일은 여기 내 Thingiverse에서 찾을 수 있습니다.

    (참고: 플랩, 타이어 익스텐더 등과 같은 많은 부품이 동일하므로 여러 개를 인쇄해야 합니다.)

    다음으로 해야 할 일은 베이스 피스를 잡고 인쇄물에 새겨진 모든 육각형을 M4 너트로 채우는 것입니다. 꽤 있습니다. 계속해서 측면에 있는 두 개의 지지 베어링을 누를 수도 있습니다.

    주: 모든 정확한 부품과 해당 부품에 대한 링크는 BOM에서 찾을 수 있습니다.

    그런 다음 타이어 익스텐더를 잡고 베어링에 끼워 넣으십시오. M4x14 볼트도 필요합니다.

    그런 다음 베이스 바닥에 나사로 고정할 수 있습니다.

    그런 다음 두 개의 MG996R 서보를 가져와 장착 패드에 끼웁니다. 당신은 계속해서 그들을 조이고 싶을 것입니다. 이 볼트는 M4x14 이상일 수 있습니다.

    그런 다음 두 개의 플랩을 잡고 서보 혼을 장착합니다. 긴 M3 볼트를 중간에 가이드로 사용하여 나사를 조이는 동안 미끄러지지 않도록 할 수 있습니다.

    그런 다음 베어링을 플랩의 제자리에 누르고 서보 혼 끝에 끼웁니다. 이렇게하는 동안 조금 구부러져도 괜찮습니다.

    참고 : 서보를 장착하기 전에 전원을 켜고 전자적으로 위쪽 위치로 이동하여 서보를 보정하는 것이 좋습니다. 제한적인 180도 모션이 다른 방향으로 향하는 것을 원하지 않을 것입니다!

    그런 다음 추가 지원을 위해 M4x20 볼트로 반대쪽을 조일 수 있습니다.

    반대쪽을 다시 방문하면 프로펠러가 켜져 있는 동안 너무 많은 힘이 서보를 손상시키지 않도록 베어링 지지대를 추가하고 싶을 것입니다. 이를 위해 다른 M4x20 볼트를 사용할 수 있습니다.

    프로펠러 플랩 부분에 M4 너트가 삽입되어 있는지 확인하십시오., 그렇지 않으면, 베어링에 들어가는 볼트는 나사산을 꿰 수 없습니다.

    그런 다음 배선 작업을 시작할 차례입니다. 계속해서 모든 BLDC에 프로펠러를 장착하는 것이 좋습니다(프로펠러의 너트를 단단히 조이기만 하면 됩니다).

    그런 다음 M3x10 볼트를 사용하여 모든 BLDC를 플랩에 나사로 고정합니다.

    그렇게함으로써 ESC로 각각을 개별적으로 테스트하여 방향으로 회전하는지 확인합니다. 그렇지 않은 경우 외부 전선 중 하나를 중간 전선으로 전환하여 극성을 변경할 수 있습니다. ESC의 3극에서 모터의 3극으로 직접 연결하여 모터와 연결할 수 있습니다. 먼저 탈착식 악어 클립으로 이러한 테스트를 수행한 다음 각각에 대한 구성을 기록합니다.

    올바르게 회전하도록 각각을 연결하는 방법에 확신이 들면 약간의 땜납으로 더 영구적으로 만들 수 있습니다. 서보 모터가 움직일 때 편안하게 구부러질 수 있도록 각 와이어를 약 140mm로 하는 것이 좋습니다. 나는 그것이 그들을 연결하는 이상적인 방법이 아니라는 것을 알고 있지만 저렴한 ESC에 대해 우리가 지불하는 가격입니다. 게다가 이 전선은 아무데도 가지 않습니다.

    백그라운드에서 PCB를 무시할 수 있습니다., 그것이 다음 단계입니다.

    이제 LiPo 배터리를 넣은 다음 그 위에 PCB를 장착할 수 있습니다. PCB에는 금속 나사산이 없으므로 면적을 늘리기 위해 M3x30과 같은 긴 볼트를 사용하고 너무 세게 조이지 않는 것이 좋습니다. 플라스틱이 벗겨지는 것을 원하지 않습니다!

    우리가 그것을하는 동안 우리는 계속해서 ESC 전선을 연결할 수 있습니다. 어느 것이 어디로 가는지는 중요하지 않지만 번호 매기기 시스템을 만드는 것이 좋습니다. 나는 아래와 같이 한 다음 하나는 J2, 두 개는 J3, 세 개는 J4 등에 연결했습니다. 시각화가 더 쉬워집니다.

     

    서보에 관한 한, 그것은 정말로 중요하지 않습니다. 그들은 동기화되어 움직입니다! (서보의 접지 핀에 전원을 연결하여 실수로 단락되지 않도록 하십시오!)

    다음으로, 우리는 집타이 인 웅장한 창조물을 깨고 그냥 마을로 이동합니다. ᄏ

    비슷한 방식으로 ESC를 보호할 수 있습니다.

    그래도 코드를 업로드 할 때까지 USB 포트를 차단하는 것을 보류합니다!

    라우팅 전원에 관한 한 두꺼운 전선을 가져와 두 단자를 납땜하는 것이 좋습니다.

    더 두꺼운 전선이 없었기 때문에 두 개의 작은 전선을 사용했습니다. (지금은 바퀴를 무시하십시오.)

    그런 다음 각각을 반대쪽의 터미널로 라우팅하고 납땜해야 합니다. 베이스 안팎으로 끼워 넣어 더 안전하게 만들 수 있습니다.

    (바퀴는 다음 단계입니다.)

    이제 거의 끝났습니다!

    바퀴를 부착하려면 3D 프린팅된 바퀴 걸림돌을 잡고 바퀴 바깥쪽의 육각형에 밀어 넣습니다. 그런 다음 M4 너트를 누릅니다.

    그런 다음 일부 스페이서를 사용하여 베어링을 통해 M4x30 볼트를 밀어 다른 쪽 끝의 스페이서를 빼냅니다.

    그런 다음 바퀴를 조이십시오.

    모든 전선이 엉키지 않고 프로펠러를 방해하지 않도록 나중에 지퍼를 더 묶어야 할 수도 있습니다.

    그게 전부에요! 저와 함께 해주셔서 감사합니다.

    프로그래밍

    이 프로젝트의 프로그래밍은 그리 나쁘지 않습니다 (아직 비행 컨트롤러 소프트웨어가 없기 때문에). 작동 방식에 대한 요약은 다음과 같습니다 : 기본적으로 범용 컨트롤러에서받은 데이터를 기반으로 6 개의 서보 모터를 개별적으로 제어하면됩니다 (ESC와 서보는 동일한 신호를 사용함). 뛰어 들자.

    전체 프로젝트 코드는 여기 내 GitHub에서 찾을 수 있습니다.

    이 프로젝트에 설치해야 하는 라이브러리는 다음과 같습니다.

    #include "ESP32_New_ISR_Servo.h"
    #include <WiFi.h>
    #include <esp_now.h>
    #include "ESP32_New_ISR_Servo.h"
    #include <FastLED.h>
    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>
    #include <Wire.h>
    

    표준 ESP32Servo가 ESP32-S3에서 동일한 방식으로 작동하지 않기 때문에 ESP32_New_ISR_Servo 라이브러리를 사용하고 있습니다.

    먼저 서보 신호에 대한 몇 가지 핀과 켜짐 시간을 마이크로초 단위로 정의합니다. (일반적으로 1000-2000μs이지만 서보가 여전히 180도 완전히 움직일 수 없는 경우 더 높거나 낮게 조정할 수 있습니다.)

    #define MIN_MICROS 1000  
    #define MAX_MICROS 2000 
    
    const int I2C_SDA = 47;
    const int I2C_SCL = 48;
    const int LED_PIN = 38;
    const int NUM_LEDS = 2;
    const int LOW_LED = 9;
    

    servoIndex를 할당하여 각 서보 모터의 개별 상태를 결정할 수 있습니다.

    int servoIndex1 = -1;
    int servoIndex2 = -1;
    int servoIndex3 = -1;
    int servoIndex4 = -1;
    int servoIndex5 = -1;
    int servoIndex6 = -1;
    

    나머지 변수의 경우 데이터 유형을 할당하고 0으로 설정할 수 있습니다.

    컨트롤러에서 데이터를 수신하려면 데이터를 보유할 데이터 구조를 정의해야 합니다. 나중에 콜백을 사용하여 메모리에서 정보를 복사할 수 있습니다. ESP-NOW(무선에 사용하는 프로토콜)에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

    typedef struct struct_message {
      int a; // Pot1
      int b; // Pot2
      int c; // J1X
      int d; // J1Y
      int e; // J2X
      int f; // J2Y
      int g; // Button number
    } struct_message;
    
    struct_message dataRecieved;
    
    esp_now_register_recv_cb(callData);
    

    그런 다음 FastLED 라이브러리의 일부 기능을 통해 RGB LED를 추가하고 밝기를 설정할 수 있습니다. 풀 사이즈 SK6812 LED용이기 때문에 60/255로 밝기를 낮춰 타지 않도록 했습니다.

    FastLED.addLeds<SK6812, LED_PIN, GRB>(leds, NUM_LEDS);
    FastLED.setBrightness(60);
    

    그런 다음 while 루프를 사용하여 MPU6050 응답하지 않는 경우 프로그램을 중지할 수 있습니다. 그렇다면 기본값을 설정할 수 있습니다.

      if (!mpu.begin()) // Initialize MPU6050
      {
        while (1) 
        {
          fill_solid(leds, NUM_LEDS, CHSV(0, 255, 255));
          FastLED.show();
          delay(20);
        }
      }
    
      mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
      mpu.setGyroRange(MPU6050_RANGE_500_DEG);
      mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
    

    서보를 해당 핀에 부착하기 위해 setupServo() 함수를 사용할 수 있습니다. 또한 PWM 신호에 사용할 ESP32-S3에 타이머를 할당해야 합니다.

      ESP32_ISR_Servos.useTimer(USE_ESP32_TIMER_NO);
      servoIndex1 = ESP32_ISR_Servos.setupServo(4, MIN_MICROS, MAX_MICROS);
      servoIndex2 = ESP32_ISR_Servos.setupServo(5, MIN_MICROS, MAX_MICROS);
      servoIndex3 = ESP32_ISR_Servos.setupServo(6, MIN_MICROS, MAX_MICROS);
      servoIndex4 = ESP32_ISR_Servos.setupServo(7, MIN_MICROS, MAX_MICROS);
      servoIndex5 = ESP32_ISR_Servos.setupServo(14, 544, 2450);
      servoIndex6 = ESP32_ISR_Servos.setupServo(15, 544, 2450);
    

    BLDC 모터에는 일반적으로 시동 중에 꺼야 하는 안전 기능이 있으므로 속도를 0으로 설정하고 준비될 때까지 몇 초 동안 기다려야 합니다. 서보를 120으로 설정했는데 그 이유는 서보가 아무 것도 움직이지 않는 편안한 위치이기 때문입니다.

    중요 사항: 서보 모터는 내 모터와 정확히 동일한 시작 위치에 있지 않을 수 있습니다. 즉, 서보 모터(인덱스 5 및 6)로 전송된 값을 자신에게 맞는 값으로 조정해야 합니다. 그렇지 않으면 물리적으로 이동할 수 없는 곳으로 이동하여 무언가를 부수려고 할 수 있습니다.

      ESP32_ISR_Servos.setPosition(servoIndex1, 0);
      ESP32_ISR_Servos.setPosition(servoIndex2, 0);
      ESP32_ISR_Servos.setPosition(servoIndex3, 0);
      ESP32_ISR_Servos.setPosition(servoIndex4, 0);
      ESP32_ISR_Servos.setPosition(servoIndex5, 120);
      ESP32_ISR_Servos.setPosition(servoIndex6, 120);
      delay(3000);
    

    슈퍼 루프에서는 MPU6050에서 데이터를 가져오고 지연 없는 깜박임 개념을 사용하여 20ms마다 색상만 업데이트할 수 있습니다. 이렇게 하면 부드러운 색상 전환이 가능합니다.

      unsigned long currentMillis = millis();
    
      sensors_event_t a, g, temp;
      mpu.getEvent(&a, &g, &temp);
    
      if (currentMillis - previousMillis >= interval) 
      {
        previousMillis = currentMillis;  
        static int i = 0;
        fill_solid(leds, NUM_LEDS, CHSV(i, 255, 255)); 
        i++;
        if (i >= 256)
          i = 0; 
      }
      FastLED.show();
    

    이제 버튼 체인을 시작합니다. 이것은 컨트롤러에서 누르는 다른 버튼에 따라 다른 작업을 수행하는 긴 if-else 체인으로 구성됩니다. 원하는 모든 것을 구성할 수 있습니다! 이것들은 내가 선택한 것입니다.

    시간을 줄이기 위해 한 가지 예만 들어 보겠습니다. dataRecieved.g(일명 버튼 중 하나를 눌렀음)가 핀 35에 있는 버튼의 속도인 경우 모든 프로펠러의 속도를 0-180의 dataRecieved.a(왼쪽 상단 전위차계라고도 함)의 속도로 설정합니다.

    if (dataRecieved.g == 35) // Normal control
      {
        prop1 = dataRecieved.a;
        prop2 = dataRecieved.a;
        prop3 = dataRecieved.a;
        prop4 = dataRecieved.a;
      }
    

    조이스틱으로 비슷한 작업을 수행할 수 있습니다.

    dataRecieved.e(오른쪽 조이스틱의 x축이라고도 함)가 1(켜짐)이면 모든 오른쪽 프로펠러의 속도를 dataRecieved.a(다시 왼쪽 상단 전위차계)의 속도로 설정합니다. 올바른 프로펠러만 선택했는데, 그렇게 하면 힘이 취소되어 우회전을 할 수 있기 때문입니다.

      if (dataRecieved.e == 1) // J2X
      {
        prop4 = dataRecieved.a;
        prop2 = dataRecieved.a;
      }
    

    이것은 잠시 동안 계속됩니다.

    그런 다음 constrain() 함수를 사용하여 프로펠러에 쓰는 데이터 값이 최대값인 180도 또는 2000μs를 초과하지 않도록 할 수 있습니다. 이것은 매우 필요하지는 않지만 잘못된 컨트롤러 값 등을 보낼 경우를 대비하여 여전히 좋은 안전 예방 조치입니다.

      prop1 = constrain(prop1, 0, 180);
      prop2 = constrain(prop2, 0, 180);
      prop3 = constrain(prop3, 0, 180);
      prop4 = constrain(prop4, 0, 180);
    

    그런 다음 setPosition() 함수를 사용하여 BLDC에 연결된 핀에 프로펠러 값을 PWM으로 보낼 수 있습니다.

      ESP32_ISR_Servos.setPosition(servoIndex1, prop1);
      ESP32_ISR_Servos.setPosition(servoIndex2, prop2);
      ESP32_ISR_Servos.setPosition(servoIndex3, prop3);
      ESP32_ISR_Servos.setPosition(servoIndex4, prop4);
    

    그거에요! 다시 말하지만, 전체 코드를 탐색하려면 여기에서 확인할 수 있습니다!

    알림: 사용자 지정 ESP32-S3에 코드를 업로드하기 전에 먼저 보드를 부트로더 모드로 전환해야 합니다. 그렇지 않으면 컴퓨터가 장치를 제대로 인식할 수 없습니다. 부팅 버튼을 누른 상태에서 재설정 버튼(RST)을 누른 상태에서 > 누른 상태에서 부팅 버튼에서 손을 떼면 > 됩니다.

    BOM (영문)

    이것은 내 Hovercar 프로젝트의 BOM입니다.

    기사 전체에 뿌린 링크를 찾기 위해 스크롤할 필요가 없도록 여기에 필요한 모든 것을 여기에 넣겠습니다.

    공개: 제휴 링크입니다. 추가 비용 없이 제품 판매의 일부를 받습니다.

     

    읽어 주셔서 감사합니다! 이 글이 도움이 되고 유익한 글이 되었기를 바랍니다. 빌드를 하기로 결정했다면 아래 의견에 질문을 남겨주세요. 그렇지 않다면 여전히 독서를 즐기고 새로운 것을 배울 수 있기를 바랍니다!

728x90
반응형