본문 바로가기
로봇프로젝트

가정용 컴퓨터로 제어되는 로봇 자동차 만들기 - Build a Robot Car With an 80s Style Home Computer As Controller.

by 모빌리티키즈 2023. 11. 21.
728x90
반응형

80년대 스타일 가정용 컴퓨터로 제어되는 로봇 자동차 만들기

안녕하세요, 모빌리티키즈입니다. 오늘은 80년대 스타일의 가정용 컴퓨터로 제어되는 로봇 자동차를 만드는 방법에 대해 알려드리겠습니다. 이 프로젝트는 창의력과 열정이 필요하지만, 재미있고 독특한 결과물을 얻을 수 있습니다.

필요한 재료 준비하기:
80년대 스타일의 가정용 컴퓨터: 예를 들어, Commodore 64 또는 Apple II와 같은 모델을 구할 수 있습니다.
로봇 자동차 키트: Arduino 또는 Raspberry Pi와 같은 플랫폼을 사용하는 자동차 키트를 구입합니다.
모터, 센서, 배터리 등의 부품: 자동차 키트와 호환되는 부품을 구매하여 준비합니다.
컴퓨터와 자동차 키트 연결하기:
컴퓨터와 자동차 키트를 연결하기 위해 필요한 케이블과 어댑터를 사용합니다. 컴퓨터의 시리얼 포트나 USB 포트를 통해 통신할 수 있도록 설정합니다.
컴퓨터 제어 프로그램 작성하기:
컴퓨터에서 자동차를 제어하기 위한 프로그램을 작성합니다. 80년대 스타일의 컴퓨터에서 사용 가능한 프로그래밍 언어를 선택하여 프로그램을 개발합니다. 예를 들어, BASIC이나 Assembly 언어를 사용할 수 있습니다.
프로그램에서 자동차의 모터를 제어하고 센서로부터 데이터를 받아와서 처리할 수 있도록 코드를 작성합니다.
자동차 조립과 테스트:
자동차 키트의 조립 설명서를 따라가며 자동차를 조립합니다. 모터, 센서, 배터리 등의 부품을 올바르게 연결해야 합니다.
컴퓨터와 자동차를 연결하고 프로그램을 실행하여 자동차를 제어해보세요. 앞으로 전진, 뒤로 후진, 좌우로 회전하는 등의 기능을 테스트하며 필요한 조정을 수행합니다.

거의 모든 전자 제품 웹 쇼핑 사이트에는 298 또는 4륜 로봇용 키트가 있습니다. 이 키트의 내용물은 거의 동일합니다. 모터 및 휠, LM298 칩 및 Arduino UNO를 기반으로 하는 모터 컨트롤러. 또한 몇 가지 센서가 함께 제공됩니다. 초음파 거리 센서는 항상 포함되어 있습니다. 일부에는 리모컨과 몇 가지 다른 구성 요소가 있습니다. 프레임은 투명한 플렉시글라스입니다. 얼마 전에 Banggood에서 샀습니다. 조립을 시작했을 때 이 키트는 추가 구성 요소 없이는 로봇을 만드는 데 사용할 수 없다는 것을 알았습니다. 뭔가를 추가하고 개별적인 것을 만들어야 합니다. 이 Instructable은 그렇게하려는 나의 시도에 관한 것입니다.

저는 자동차가 자율 주행을 하고 자율적인 일을 하기를 원했습니다. 또한 IoTBASIC 인터프리터를 사용하고 BASIC 프로그램으로 자동차의 활동을 제어하고 싶었습니다. 이 인터프리터 언어를 사용하면 로봇에 로그온하고 프로그램을 수정하고 Arduino IDE 또는 다른 개발 시스템 없이도 다시 시작할 수 있습니다. 본질적으로 이것은 마치 80년대 스타일의 가정용 컴퓨터를 바퀴에 장착하는 것과 같습니다.

이 디자인은 키트와 함께 제공된 원래 구성 요소, UNO 및 모터 제어 보드로 구축할 수 있지만 저는 주로 Arduino R4 및 Arduino Motor Shield R3가 장착된 자동차에 대해 씁니다. R4에는 32kB의 메모리와 큰 플래시가 있습니다. 전체 BASIC 인터프리터를 실행할 수 있으며 BASIC 프로그램에 사용할 수 있는 26kB의 메모리가 있습니다. Arduino 모터 실드는 키트와 함께 제공되는 모터 보드보다 훨씬 우수한 품질입니다. 설치 및 제어가 더 쉽습니다. Uno R4의 대안으로 ESP32 Wemos R1 보드도 사용할 수 있습니다. 저렴한 가격에 강력한 보드입니다. Arduino Motor Shield와 호환됩니다.

 

공급

이 로봇을 만들려면 먼저 로봇 키트가 필요합니다. 나는 4 륜 키트를 사용했다. 거의 모든 곳에서 구입할 수 있습니다.

일반적으로 키트에 없는 추가 구성 요소는 다음과 같습니다.

  • Arduino R4 Minima, R4 Wifi 또는 ESP32 Wemos R1 보드.
  • 아두이노 모터 쉴드 R3.
  • HC05 Bluetooth-직렬 컨트롤러로 로봇에 원격으로 로그온합니다.
  • 32kB EEPROM 칩(옵션).
  • 일부 합판 보드, 고무 밴드 및 기타 작은 것들은 대부분의 작업장에서 볼 수 있습니다.

R4가 없는 경우 UNO, Mega 또는 ESP32 Wemos R1 보드만 있는 솔루션도 추가했습니다. 그들 모두는 작동합니다. 또한 원래 모터 컨트롤러 하드웨어에 대해 몇 마디 쓸 것입니다.

펌웨어로 Arduino BASIC 인터프리터의 2.0 버전이 필요합니다 : slviajero / tinybasic : IoT 및 마이크로 컨트롤러 기능이있는 Arduino, ESP, RP2040, STM32, Infineon XMC 및 POSIX 용 기본 인터프리터. (github.com)

대부분의 것들은 1.x 버전에서도 작동하지만 더 이상 버그를 수정하지 않습니다.

1단계: 자동차 섀시 구축

기본 차량은 매우 쉽게 제작할 수 있습니다. 플렉시글라스 베이스 플레이트에서 보호 호일을 제거합니다. 그들은 동일하지만 앞면과 뒷면이 다릅니다. 어떤 사람들은 접시에 호일을 남겨 두지만 이상하게 보인다는 것을 알았습니다. 내 키트에서 전선을 모터에 납땜해야 했습니다. 그런 다음 노란색 모터 홀더를 하부 플레이트에 장착하고 모터를 삽입합니다. 그런 다음 바퀴를 삽입 할 수 있습니다.

그런 다음 두 모터의 전선을 오른쪽과 왼쪽에 함께 납땜했습니다. 양쪽 왼쪽 모터는 나중에 모터 컨트롤러의 채널 A에 연결됩니다. 오른쪽 모터는 채널 B로 이동합니다.

아두이노 모터 쉴드로 자동차를 제작하면 이제 상판을 추가할 수 있습니다. 이 모든 것이 매우 간단하며 키트의 모든 구성 요소가 잘 맞습니다.

키트의 상단 부분은 만들기가 조금 더 어려웠습니다.

키트와 함께 제공되는 표준 모터 전자 장치를 사용하려면 나중에 더 많은 것이 있습니다.

2단계: 로봇의 윗부분을 만듭니다.

로봇의 상부에는 초음파 거리 센서가 있어야 합니다. 센서의 마운트 역할을 할 수 있는 일부 플라스틱 부품과 함께 서보가 있습니다. 이를 통해 로봇은 주변을 둘러보고 다른 방향의 장애물까지의 거리를 측정할 수 있습니다.

그러나 이 부품들은 내가 구입한 키트 모자에 전혀 맞지 않았습니다. 플레이트에 플렉시 글라스의 구멍이 맞지 않았고 센서 마운트도 맞지 않았습니다. 서보를 함께 제공된 홀더 플레이트에 제대로 삽입할 수 없습니다. 분명 누군가 서로 어울리지 않을 부품들을 조립해 놓았을 것이다.

로봇을 만들기 위해 저는 키트와 함께 제공되는 플렉시글라스 판에 장착할 합판 판에 활성 구성 요소를 장착하기로 결정했습니다. 합판은 꽤 신축성이 있습니다. 강한 힘이 가해지면 균열이 생길 수 있는 플렉시글라스보다 마찰을 훨씬 더 잘 흡수할 수 있습니다. 합판 모자는 자동차를 안정시키고 구성 요소를 쉽게 장착 할 수 있습니다. 합판 조각을 자르고, 뚫고, 붙이는 것은 간단한 도구로 할 수 있습니다.

기본으로 전면에 23cm 노즈가 있는 6cm 길이의 합판 플레이트를 사용합니다. 자동차의 상부가 하부에 나사로 고정되는 지점에 구멍이 정확히 뚫렸습니다. 이렇게 하면 모든 것을 조립하는 데 한 세트의 나사만 있으면 됩니다. 또한 모터 케이블용으로 두 개의 원을 잘라냅니다.

이 베이스 플레이트 위에 베이스 플레이트에 접착하고 아래에서 작은 나사로 고정한 두 개의 나무 스트립을 추가합니다. 나무 스트립에는 배터리 팩이 앞바퀴 가까이에 있습니다.

상단에 모터 실드가 있고 작은 브레드보드가 있는 Arduino는 작은 합판 위에 장착됩니다. 나는 보통 Arduino의 바닥과 브레드 보드를 양면 접착 스티커 또는 테이프로 나무에 붙입니다. 브레드보드의 전력선 중 하나를 제거하여 조금 더 좁게 만들었습니다. 이 수정을 통해 세 가지 구성 요소가 엔진 케이블의 두 구멍 사이에 정확히 맞습니다.

Arduino와 브레드보드를 두 번째 합판 플레이트에 장착하면 나중에 쉽게 제거하고 다른 구성 요소로 교체할 수 있습니다. 간단한 짧은 금속 나사를 사용하여 Arduino와 배터리 팩을 나무 스트립에 고정할 수 있습니다.

마지막으로 서보용 홀더 플레이트가 노즈에 나사로 고정됩니다. 센서의 팔이 내 키트에 맞지 않았습니다. 팔을 오른쪽으로 자른 다음 홀더 플레이트에 나사로 고정했습니다.

베이스 플레이트의 후면에는 엔진 케이블용 구멍에 가까운 목재 플레이트의 바닥에서 나사로 조여진 광택 단자 세트가 있습니다. 엔진 케이블을 구멍에 통과시킨 다음 광택 단자에 연결하면 나중에 케이블을 깨끗하게 유지하는 데 도움이 됩니다.

센서 홀더도 내 키트에 맞지 않았습니다. 나는 합판 조각과 고무 밴드로 즉석에서 첫 번째 빌드에서 그것을 고정했습니다.

이 모든 작업이 완료되면 로봇의 상부를 고정하고 전자 장치를 추가 할 수 있습니다.

 

3단계: 모터 전자 장치 추가

로봇의 뒤쪽부터 시작하겠습니다.

Arduino Motor Shield가 있는 Arduino R4가 있습니다. 모터 쉴드의 두 채널 A와 B는 광택 단자가 있는 모터 케이블에 연결됩니다. 여기에 설정된 <>개의 모터의 극성을 반대로 합니다. 모터 세트가 서로 반대 방향으로 장착되기 때문에 동일한 극성으로 케이블을 연결하면 하나는 뒤로 달리고 다른 하나는 앞으로 움직입니다.

내 디자인에서 나는 모터 쉴드를 통해 모든 것에 전원을 공급하고 작은 암 전원 플러그를 통해 배터리 팩을 쉴드의 Vin 단자에 연결합니다. 이렇게 하면 배터리를 만지작거리지 않고 전원에서 전자 장치를 간단히 분리할 수 있습니다.

아두이노 모터에는 두 개의 채널 A와 B가 있습니다. 각 채널에 대해 4개의 핀을 사용합니다. 하나는 방향을 제어하고, 하나는 모터의 속도를 제어하고, 다른 하나는 브레이크를 제어합니다. 아날로그 입력 핀을 사용하여 전류를 측정할 수 있습니다. 핀 핀 세트는 다음과 같습니다.

  • 채널 A: D12 방향, D3 속도, D9 브레이크, A0 전류.
  • 채널 B: D13 방향, D11 속도, D8 브레이크, A1 전류.

Arduino의 다른 모든 핀은 무료입니다.

핀이 세 개 더 필요합니다. 2개는 센서의 트리거 및 에코 신호용이고 1개는 서보를 제어하기 위한 것입니다. 나중에 TX 및 RX 핀과 SCL 및 SDA 핀도 필요합니다. Arduino의 전원 출력과 접지를 브레드보드의 남은 전원선 하나에 연결합니다. 또한 센서 핀을 브레드보드에 케이블로 연결합니다. 서보 핀은 Arduino Motor Shield에 직접 연결할 수 있습니다. 이에 대해서는 나중에 설명하겠습니다. 현재 우리는 모터만 취급합니다.

4단계: 펌웨어를 설치하고 모터를 테스트합니다.

 

로봇의 펌웨어로 Arduino IoT BASIC 인터프리터 버전 2 slviajero/tinybasic: IoT 및 마이크로 컨트롤러 기능이 있는 Arduino, ESP, RP2040, STM32, Infineon XMC 및 POSIX용 기본 인터프리터를 사용했습니다. (github.com).

Arduino IDE에서 프로젝트 IoTBasic으로 가져오려면 Basic2/IoTBasic의 파일이 필요합니다.

리포지토리에는 basic.h 헤더가 있는 인터프리터 IoTBasic.ino, 헤더 파일 runtime.cpp 및 runtime.h가 있는 런타임 환경 및 두 개의 추가 파일이 포함되어 있습니다. 하나는 language.h이고 다른 하나는 hardware.h입니다. 인터프리터의 특정 기능을 켜려면 이러한 파일을 편집해야 합니다.

아두이노 R4 보드 또는 아두이노 메가를 사용하는 경우 language.h 파일의 시작 부분에 가까운 정의 #define BASICFULL을 설정합니다.

#define BASICFULL
#undef  BASICINTEGER
#undef  BASICSIMPLE
#undef  BASICMINIMAL
#undef  BASICSIMPLEWITHFLOAT
#undef  BASICTINYWITHFLOAT

다른 모든 언어 버전이 #undef 있는지 확인하고 이 파일의 다른 설정을 변경하지 마십시오. 첫 번째 테스트의 경우 hardware.h를 변경할 필요가 없습니다. Arduino UNO가 있는 경우 지금은 BASICSIMPLE을 사용합니다.

#undef BASICFULL
#undef BASICINTEGER
#define BASICSIMPLE
#undef BASICMINIMAL
#undef BASICSIMPLEWITHFLOAT
#undef BASICTINYWITHFLOAT

포트와 올바른 보드 유형을 설정한 후 다른 Arduino 스케치와 마찬가지로 BASIC 인터프리터를 컴파일 업로드합니다.

업로드에 성공한 후 직렬 모니터를 엽니다. 속도는 9600 보드로 설정되어야 하며 생명 이송 옵션은 줄 바꿈 전용이어야 합니다. BASIC은 가져오기 프롬프트와 함께 보고해야 합니다.

인터프리터는 모든 Arduino I/O 기능을 완전히 제어할 수 있습니다. 하나의 모터 세트를 잠시 켠 다음 다시 꺼서 테스트할 수 있습니다.

프로그램을 입력하십시오.

10 PINM 13, 1
20 PINM 8, 1
30 DWRITE 13, 1
40 AWRITE 11, 120
50 DELAY 1000
60 AWRITE 11, 0

프로그램 다운로드 링크 : firsttest.bas

LIST를 입력하고 출력을 확인합니다. SAVE를 입력하여 EEPROM에 프로그램을 저장하십시오. 그런 다음 RUN을 입력합니다. 채널 B에 연결된 모터는 잠시 작동한 다음 다시 정지해야 합니다.

축하합니다, 이제 BASIC 프로그래밍 가능한 로봇이 생겼습니다.

프로그램의 처음 두 줄은 출력과 관련된 두 디지털 핀의 핀 모드를 설정합니다. 라인 30은 디지털 핀 13을 HIGH에 넣어 모터의 방향을 설정합니다. 그런 다음 스피드 핀에 맥파를 보냅니다. 120V 배터리 팩을 사용하는 경우 4V는 약 9V입니다. 잠시 후 맥파가 다시 꺼집니다.

프로그램을 EEPROM에 저장하고 EEPROM에서 다시 로드할 수 있습니다. Arduino의 전원을 껐다가 나중에 다시 켜면 언제든지 LOAD를 입력하여 프로그램을 다시 로드할 수 있습니다.

위의 프로그램은 UNO, R4 및 Mega에서 동일한 방식으로 작동합니다. 나중에 ESP32에 대해 몇 마디 쓰겠습니다. 거기에서 다른 핀 설정이 필요합니다

이 예제에서는 break를 사용하지 않았습니다. 그 기능은 다음 단계에서 설명하겠습니다.

5단계: BASIC을 사용하는 이유는 무엇입니까? 및 사용 방법.

왜 60세기에 70년대와 21년대의 프로그래밍 언어를 사용할까요? 이 언어에 대한 나의 사랑은 Arduino 키트를 가지고 놀기 시작한 후 다시 커졌습니다. 인터프리터 언어이기 때문에 모든 명령을 대화식으로 입력하고 실행할 수 있습니다. 프로그램은 대화식으로 수정할 수 있습니다.

RUN을 입력하여 프로그램을 다시 실행하십시오. 모터가 시작되고 멈춥니다.

타입

AWRITE 11, 150

명령줄에서. 모터는 저속으로 계속 작동합니다. 마지막 매개변수가 다른 ACENT는 모터를 다른 속도로 작동시킵니다.

입력

DWRITE 8, 1 

지금. 모터가 멈춥니다. 쉴드의 브레이크 핀은 모터를 끕니다.

DWRITE 8, 0 

다시 시작합니다.

이제 명령줄에서 두 모터를 서로 다른 속도로 다른 방향으로 회전시킬 수 있습니다.

언어에 익숙하지 않은 경우 설명서를 살펴보는 것이 좋습니다. 내 저장소에도 튜토리얼이 있습니다.

6단계: LM298 모터 구동기 보드로 로봇 구축

Arduino 모터 실드와 키트의 작은 모터 컨트롤러는 동일한 칩을 사용합니다. LM298 H 브릿지입니다. 이 칩과 모터 제어 보드에 대한 훌륭한 자습서가 많이 있습니다. 이 하드웨어를 사용하려면 회로도를 사용하십시오.

두 보드의 주요 차이점은 H 브리지가 트리거되는 방식입니다. Arduino Motor Shield와 마찬가지로 속도를 제어하는 맥파를 위한 두 개의 입력 라인이 있습니다. 이를 EA 및 EB라고 합니다. 방향과 브레이크 로직이 다릅니다. IN1 및 IN2는 하나의 모터를 제어합니다. IN3 및 IN4는 두 번째 모터를 제어합니다. IN1을 D13에, IN2를 D8에, EA를 D11에 연결하면 표준 H 브릿지로 위와 동일한 스케치를 사용할 수 있습니다.

다시 말하지만, 명령줄에서 이를 확인할 수 있습니다.

7단계: 초음파 센서 추가

 

센서를 사용하려면 센서의 트리거 핀을 Arduino의 핀 4에 연결하고 에코 핀을 핀 5에 연결합니다. 센서에 전원을 연결합니다.

NEW를 입력하여 기존 프로그램을 삭제합니다. 그런 다음 프로그램을 입력하십시오.

10 PINM 4, 1
20 PINM 5, 0
30 DWRITE 4, 0
40 PULSE 4, 10 
50 E=PULSE(5, 1, 100)
60 PRINT E/29*100/2
70 DELAY 500
80 GOTO 40

프로그램 다운로드 링크 : echo.bas

RUN을 사용하여 이 프로그램을 한 번 실행합니다. 센서가 연결되어 제대로 작동하면 프로그램은 센서 앞에 있는 다음 물체의 거리를 밀리미터 단위로 출력합니다.

줄 40의 PULSE 명령은 핀 10에 10 시간 4마이크로초의 펄스를 보냅니다. 50행의 PULSE 함수는 Arduino IDE의 잘 알려진 pulseIn()입니다. 핀 5의 펄스 길이를 측정하여 100 x 10마이크로초의 타임아웃으로 플랭크를 올립니다.

프로그램이 무한 루프로 실행됩니다. # 문자를 보내면 루프가 종료되고 입력 프롬프트가 반환됩니다.

여기 단위에 대한 한마디. Arduino IDE와 달리 BASIC은 PULSE 명령의 최소 단위로 10마이크로초를 사용합니다. 이는 인터프리터가 C 프로그램보다 느리게 실행되고 많은 플랫폼에서 4마이크로초당 하나의 명령을 처리하기 때문입니다. 더 빠른 반응 시간이 필요한 사용 사례의 경우 BASIC이 올바른 언어가 아닐 수 있습니다. PULSE의 기본 단위는 런타임에 SET 명령으로 설정할 수 있는 파라미터입니다. 이에 대한 자세한 내용은 설명서를 참조하십시오.

8단계: 서보 추가

 

서보는 하나의 핀으로만 구동됩니다. 서보를 전원과 접지에 연결한 다음 제어 핀을 Arduino의 핀 6에 연결합니다. 로봇 키트의 서보 플러그가 때때로 Arduino 모터 실드에 맞지 않습니다. 쉴드에는 전원과 접지 사이의 중간에 제어 핀이 있습니다. 표준 서보는 핀 순서가 다를 수 있습니다. 여기에는 약간의 땜질이 필요합니다. 서보의 플러그를 다시 배선하기만 하면 됩니다.

서보를 이동하기 위해 Arduino는 이 핀에 주기적인 펄스를 보내고 서보는 펄스 길이에 따라 작은 단계로 각도를 조정합니다. C에서이 작업을 수행 할 수있는 많은 라이브러리가 있습니다. 그들 중 일부는 정말 정교하고 인터럽트를 사용하며 백그라운드에서 모든 서보 제어 작업을 수행합니다. 이 프로젝트에서 저는 BASIC의 모든 서보 제어를 단순하게 유지하기로 결정했습니다.

NEW로 이전 프로그램을 삭제하고 다음을 입력하십시오.

10 PINM 6,1 
20 DWRITE 6, 0
30 INPUT A
40 P=40+A*200/180
50 FOR I=1 TO 40: DELAY 20: PULSE 6, P: NEXT
60 GOTO 30

프로그램 다운로드 링크: servo.bas

그런 다음 프로그램을 실행합니다. 각도 A를 입력하라는 메시지가 표시됩니다. 그런 다음 펄스 폭 P를 계산하고 40밀리초 간격으로 20개의 펄스를 보냅니다. 서보가 해당 각도로 이동합니다. 이것은 조잡한 방법이지만 작동합니다. 제어할 서보가 하나뿐이므로 위의 코드만 있으면 됩니다.

프로그램을 중단하려면 입력의 첫 번째 문자로 #을 입력합니다. #을 보내면 실행 중인 프로그램도 중단됩니다.

40행의 방정식에 있는 매개변수를 가지고 놀 수 있습니다. 첫 번째는 영점이고 두 번째는 각도를 올바른 펄스 길이에 매핑합니다. 약간의 조정이 필요할 수 있습니다.

이 단계를 통해 자동차 자체의 모든 구성 요소가 완성되었습니다.

9단계: HC05 블루투스 모듈로 원격 제어

지금까지 전체 시스템은 여전히 컴퓨터의 USB 커넥터에 연결되어 있습니다. 좀 더 독립적으로 만들려면 무선 연결이 필요합니다. 가장 쉽고 저렴한 방법은 고전적인 Bluetooth 연결입니다.

HC05에 대한 훌륭한 자습서가 많이 있습니다. 컴퓨터를 페어링하고 설정하는 방법을 살펴보십시오. 나는 추천한다

이 작업은 SoftwareSerial과 핀 10 및 11을 사용하여 모듈을 연결합니다. 여기서는 필요하지 않으며 모듈을 Arduino의 UART에 직접 연결합니다.

아두이노 UNO 또는 MEGA로 로봇을 제작한 경우 HC05 TX 라인을 아두이노 RZ 라인과 연결하거나 그 반대로 연결하기만 하면 됩니다.

전원선에서 Arduino를 분리하고 배터리를 연결한 다음 바닥에 놓습니다.

Arduino IDE를 다시 열고 컴퓨터의 포트를 HC05의 페어링된 Bluetooth 포트로 설정한 다음 직렬 모니터를 엽니다.

BASIC 입력 프롬프트가 다시 표시되어야 합니다. 이제 컴퓨터에서 명령을 입력하고 로봇을 원격 제어할 수 있습니다.

Arduino R4의 경우 상황이 조금 더 복잡합니다. 보드의 외부 직렬 포트는 개체 Serial1을 통해 액세스되므로 펌웨어를 변경해야 합니다.

Arduino IDE에서 hardware.h 파일을 열고 다음 줄을 추가합니다.

#define ALTSERIAL Serial1

그런 다음 BASIC 인터프리터를 다시 업로드합니다. BASIC은 이제 Serial1을 사용하며 HC05를 연결하고 페어링한 후 직렬 모니터에 명령 프롬프트가 나타나야 합니다.

10단계: 거북이 실행

 

이제 로봇에서 실제 프로그램을 실행할 차례입니다. 거북이라고 불렀는데, LOGO 프로그래밍 언어의 거북이 그래픽을 떠올리게 했기 때문입니다. 간단한 원격 제어 프로그램입니다. 명령은 문자열로 로봇에 전송된 다음 실행됩니다. 로봇은 4개의 명령을 알고 있으며 0-9에서 하나의 인수를 처리할 수 있습니다. 이러한 명령은 다음과 같습니다

  • F: 전진
  • b: 뒤로 주행
  • L: 좌회전
  • R: 우회전
  • 0-9: 모터의 런타임을 100+x*100밀리초로 설정

이를 수행하는 BASIC 프로그램은 다음과 같습니다

10 REM "engine code, the pins of the Arduino motor shield"
20 DA=12: SA=3: BA=9
30 DB=13: SB=11: BB=8
40 TP=4: EP=5
100 REM "set the pins, Dx is direction, Bx is break"
110 PINM DA,1: PINM BA,1
120 PINM DB,1: PINM BB,1
130 AWRITE SA,0: AWRITE SB,0
140 PINM TP, 1: PINM EP, 0
200 REM "some parameters, TT is step time, S is speed ie voltage"
210 TT=5
220 S=140
1000 REM "Test code"
1010 INPUT A$
1020 GOSUB 8000
1030 GOTO 1000
8000 REM "The turtle code: A$ has a set of commands"
8010 REM "Commands f,b,r,l and single digits for the distance"
8020 REM "Prepare, set the speed and directions and hit the break"
8030 DWRITE BA,1: DWRITE BB,1
8040 AWRITE SA,S: AWRITE SB,S
8050 DWRITE DA,0: DWRITE DB,0
8100 REM "every character in A$ is a command"
8110 WHILE LEN(A$)>0
8120 C=A$: A$=A$(2)
8130 IF C=>"0" AND C<="9" THEN TT=C-"0": CONT
8140 SWITCH C
8150 CASE "e": END
8160 CASE "f": DWRITE DA,0: DWRITE DB,0: GOSUB 9000
8170 CASE "b": DWRITE DA,1: DWRITE DB,1: GOSUB 9000
8180 CASE "l": DWRITE DA,0: DWRITE DB,1: GOSUB 9000
8190 CASE "r": DWRITE DA,1: DWRITE DB,0: GOSUB 9000
8200 SWEND
8400 REM "Report the distance after each command"
8410 DWRITE TP,0: PULSE TP,10
8420 E=PULSE(EP,1,100)/29*100/2
8430 PRINT "Distance:",E
8500 WEND
8900 RETURN
9000 REM "drive a bit, TT says how long"
9010 DWRITE BA,0: DWRITE BB,0
9020 DELAY 100+TT*100
9030 DWRITE BA,1: DWRITE BB,1
9040 RETURN

내 저장소에서 turtle.bas로 다운로드 할 수 있습니다.

이 프로그램은 다소 길고 입력하는 것이 지루할 것입니다. 이 시점에서 파일 업로드 기능이 있는 터미널 프로그램을 원할 것입니다. http://freeware.the-meiers.org 의 로저 마이어(Roger Meier)의 쿨텀(Coolterm)을 추천합니다. 이를 통해 "파일 보내기 명령"으로 파일을 업로드 할 수 있습니다.

이 프로그램은 BASIC의 구조화된 언어 기능 세트를 사용합니다. R4와 MEGA에서는 실행되지만 UNO에서는 실행되지 않습니다.

프로그램을 업로드하거나 입력한 후 RUN을 입력하여 시작합니다. 입력을 요청합니다. 명령 문자 중 몇 개를 입력하고 지금 바로 사용해 보세요. 명령이 처리될 때마다 거리가 측정되고 보고됩니다.

SAVE 명령은 프로그램을 EEPROM에 저장합니다. LOAD는 다시 로드합니다.

 

11단계: 외부 파일 저장소 추가

로봇을 위한 BASIC 프로그램이 커질수록 Arduino의 내부 EEPROM이 충분하지 않을 수 있습니다. 또한 내부 EEPROM은 한 번에 하나의 프로그램만 보유할 수 있습니다. Arduino에 여러 프로그램을 저장하려면 외부 대용량 저장 장치가 필요합니다.

BASIC은 이를 위해 여러 옵션을 지원합니다. 로봇의 경우 외부 EEPROM이 최선의 선택입니다. 로봇의 전원이 켜져 있는 동안에도 플러그를 꽂고 뺄 수 있으며 BASIC 프로그램과 데이터를 저장할 수 있습니다. 저는 32kB EEPROM 모듈을 사용합니다. 저렴하고 어디서나 사용할 수 있으며 I2C 연결과 함께 사용할 수 있습니다. 이렇게 하면 하드웨어 복잡성을 최소한으로 유지할 수 있습니다.

모듈을 브레드 보드에 놓고 전원, 접지 및 두 개의 I2C 신호 SDA 및 SCL에 연결합니다.

대용량 저장 장치를 통합하려면 펌웨어의 추가 설정이 필요합니다. 로봇을 컴퓨터에 연결하고 Arduino IDE를 열고 ARDUINOEFS 매크로를 찾습니다.

 #define ARDUINOEFS

EEPROM 모듈에는 2x0와 50x0 사이의 I57C 주소가 있습니다. BASIC의 기본값은 0x50입니다. EEPROM에 다른 주소가 있는 경우 매크로 EFSEEPROMADDR을 찾아 주소를 올바르게 설정합니다.

펌웨어를 컴파일하고 업로드했으면 BASIC 명령줄 프롬프트로 이동합니다.

FDISK 명령은 내부 디스크를 포맷합니다. 하나의 인수가 필요합니다. EEPROM이 분할되는 슬롯 수입니다. EFS는 매우 간단한 파일 저장소입니다. 고정 길이 슬롯이 있습니다. 다음을 사용하여 32kB EEPROM 포맷

FDISK 4

프로그램을 위해 4kB의 8 개의 슬롯을 만듭니다. 프로그램 저장 및 로드는 파일 이름 인수와 함께 SAVE 및 LOAD 명령을 사용하여 수행됩니다. 파일 이름은 12자여야 합니다.

내부 EEPROM에 저장된 프로그램은 LOAD "!" 및 SAVE "!" 명령을 사용하여 계속 액세스할 수 있습니다.

12단계: ESP32로 로봇 실행

Arduino R4는 BASIC 프로그래밍 가능 로봇을 제작하기에 좋은 보드입니다. 그러나 여기서 언급하고 싶은 또 다른 보드가 있습니다. 잠시 동안 WEMOS는 Arduino UNO 폼 팩터로 ESP32 보드를 만들었습니다. 아직 시장에 나와 있으며 다양한 쇼핑 사이트에서 10유로 미만으로 구입할 수 있습니다.

보드는 3.3V 보드이며 Arduino 실드와의 호환성은 보장되지 않습니다. 또한 핀아웃은 Arduino UNO와 완전히 다르며 보드 정의 파일의 호환성을 보장하려는 시도가 없습니다. 그렇기 때문에 보드는 그다지 인기를 얻지 못했습니다.

로봇에서 사용하려면 약간 다른 하드웨어 설정으로 BASIC을 업로드해야 합니다. hardware.h를 열고, 하드웨어 정의 섹션을 찾고, 다음 정의를 설정합니다.

#define ARDUINOEEPROM
#define ESPSPIFFS
#define ARDUINOWIRE

다른 모든 설정은 #undef해야 합니다. 이전 프로젝트에 대해 ARDUINOEFS 및 ALTSERIAL을 설정한 경우 다시 #undef로 설정하십시오.

보드에는 ESP32 보드 파일이 필요합니다. WEMOS D1 R32 보드 정의를 선택하여 인터프리터를 컴파일합니다. 또한 업로드하기 전에 블루투스 모듈을 분리하십시오. 그런 다음 인터프리터를 업로드하고 블루투스 모듈을 다시 연결합니다.

제거할 수 있는 외부 EEPROM을 제외하고는 모든 전자 장치가 동일합니다. 블루투스 모듈에 다시 연결하면 이전과 같이 명령을 입력할 수 있습니다.

ESP32를 사용하면 BASIC 인터프리터에 64kB의 메모리가 있고 프로그램 저장을 위한 1MB 내부 플래시 디스크가 있습니다. 보드를 처음 사용하는 경우 FDISK를 입력하여 내부 플래시를 포맷합니다.

이전과 같이 모든 테스트 프로그램을 사용할 수 있지만 핀을 매핑해야 합니다. turtle 프로그램의 처음 몇 줄은 다음과 같습니다.

10 REM "engine code, the pins of the Arduino motor shield"
20 DA=19: SA=25: BA=13
30 DB=18: SB=23: BB=12
40 TP=17: EP=16

다른 모든 것은 동일합니다. 이 핀 설정이 있는 전체 프로그램도 다운로드할 수 있습니다: turtleesp32.bas

이 보드에서 Arduino Motor Shield를 사용하면 눈썹이 올라갈 수 있습니다. 이 쉴드는 5V입니다. 보드는 3.3V입니다. 쉴드에 의한 출력은 보드를 손상시킬 수 있습니다. A0 및 A1의 전류 측정에서 입력이 보드를 손상시킬 위험이 있지만 문제가 발생한 적이 없습니다.

외부 EEPROM은 BASIC이 있는 보드 간에 호환됩니다. ESPSPIFF#undef 계속 사용하려면 ARDUINOEFS를 대신 사용하십시오. 그런 다음 EEPROM은 이전과 같이 작동합니다.

13단계: MQTT 실행 및 원격 제어로 사용

 

ESP32 보드의 가장 큰 장점은 네트워크 지원입니다. BASIC은 Wi-Fi 및 MQTT 지원을 통합합니다. 사용하려면 wifisettings.h 파일을 편집해야 합니다.

const char* ssid = "myssid";
const char* password = "mypasswd";
const char* mqtt_server = "test.mosquitto.org";
const short mqtt_port = 1883;

Wi-Fi SSID와 비밀번호를 입력합니다. 자체 MQTT 서버를 사용하려면 여기에 추가합니다. 현재 암호화되지 않고 인증되지 않은 MQTT만 지원됩니다. 설정은 코드에서 컴파일되며 런타임에 BASIC에서 변경하거나 액세스할 수 없습니다.

hardware.h 세트에서

#define ARDUINOMQTT

코드를 다시 컴파일하고 다시 업로드합니다. 업로드하기 전에 블루투스 모듈을 분리했다가 다시 연결하는 것을 잊지 마십시오.

로봇에 다시 연결할 때. 형

> NETSTAT 

네트워크 연결 상태를 확인해야 합니다. MQTT는 연결이 끊긴 상태 255여야 합니다.

Network connected 
MQTT state 255
MQTT out topic 
MQTT inp topic 
MQTT name iotbasicxxx

네트워크에 연결되면 BASIC 인터프리터는 특수 입력 및 출력 채널을 통해 MQTT 메시지를 처리할 수 있습니다. 수정된 거북이 프로그램은 이를 사용하여 로봇을 제어합니다.

10 REM "engine code, the pins of the Arduino motor shield"
20 DA=19: SA=25: BA=13
30 DB=18: SB=23: BB=12
40 TP=17: EP=16
100 REM "set the pins, Dx is direction, Bx is break"
110 PINM DA,1: PINM BA,1
120 PINM DB,1: PINM BB,1
130 AWRITE SA,0: AWRITE SB,0
140 PINM TP, 1: PINM EP, 0
200 REM "some parameters, TT is step time, S is speed ie voltage"
210 TT=5
220 S=140
300 REM "Open MQTT channel"
310 OPEN &9, "littlerobot/data", 1
320 OPEN &9, "littlerobot/command"
1000 REM "MQTT code"
1010 INPUT &9, A$
1020 IF A$<>"" THEN GOSUB 8000 ELSE DELAY 500
1030 GOTO 1000
8000 REM "The turtle code: A$ has a set of commands"
8010 REM "Commands f,b,r,l and single digits for the distance"
8020 REM "Prepare, set the speed and directions and hit the break"
8030 DWRITE BA,1: DWRITE BB,1
8040 AWRITE SA,S: AWRITE SB,S
8050 DWRITE DA,0: DWRITE DB,0
8100 REM "every character in A$ is a command"
8110 WHILE LEN(A$)>0
8120 C=A$: A$=A$(2)
8130 IF C=>"0" AND C<="9" THEN TT=C-"0": CONT
8140 SWITCH C
8150 CASE "e": END
8160 CASE "f": DWRITE DA,0: DWRITE DB,0: GOSUB 9000
8170 CASE "b": DWRITE DA,1: DWRITE DB,1: GOSUB 9000
8180 CASE "l": DWRITE DA,0: DWRITE DB,1: GOSUB 9000
8190 CASE "r": DWRITE DA,1: DWRITE DB,0: GOSUB 9000
8200 SWEND
8400 REM "Report the distance after each command"
8410 DWRITE TP,0: PULSE TP,10
8420 E=PULSE(EP,1,100)/29*100/2
8430 PRINT &9, "Distance:",E
8500 WEND
8900 RETURN
9000 REM "drive a bit, TT says how long"
9010 DWRITE BA,0: DWRITE BB,0
9020 DELAY 100+TT*100
9030 DWRITE BA,1: DWRITE BB,1
9040 RETURN

주요 변경 사항은 300행에서 320행입니다. 명령 및 데이터에 대한 MQTT 주제가 열립니다. 여기에 자신의 이름을 사용하는 것이 가장 좋습니다. INPUT 및 PRINT 명령은 &9를 사용하여 MQTT 채널이 사용됨을 표시합니다. turtlemqtt32.bas에서 프로그램을 다운로드합니다.

프로그램을 업로드하고 실행합니다.

MQTT 메시지를 전송하려면 MQTT 클라이언트를 사용할 수 있습니다. 내 iPhone에서는 무료 버전이 이미 필요한 모든 것을 제공하기 때문에 EasyMQTT(https://www.easymqtt.app)를 사용합니다.

실행 중인 프로그램은 직렬 회선에 #을 전송하여 중지할 수 있습니다. 프로그램이 실행된 후 NETSTAT를 다시 입력하면 다음과 같은 출력이 표시됩니다

Network connected 
MQTT state 0 
MQTT out topic littlerobot/data
MQTT inp topic littlerobot/command
MQTT name iotbasicD4T

MQTT 연결 상태, 입력 및 출력 주제의 이름, MQTT 브로커에서 임의로 생성된 로봇의 이름을 보여줍니다.

14단계: 다음은 뭘까요?

인터프리터를 가동하고 거북이 프로그램을 테스트한 후 다음 단계는 심각한 것을 실행하는 것입니다. 저는 현재 주변을 탐험하는 소형 자율주행차를 연구하고 있습니다. 거북이 코드는 그것의 핵심이 될 것이고 환경을 스캔하고 운전하는 논리가 될 것입니다. 곧 나침반이 차에 추가될 예정입니다.

BASIC을 실행하는 것의 가장 큰 장점은 모든 것을 즉시 수행하고 아이디어를 가지고 놀 수 있다는 것입니다.

로봇을 조립하고 옛말로 프로그래밍하는 재미를 느껴보세요!

15단계: 이것 저것 - 기술 리소스

핀 맵 ESP32 Wemos D1 및 Arduino UNO/R4/MEGA

Arduino / Wemos D1
13 / 18
12 / 19
11 / 23
10 / 5
9 / 13
8 / 12
7 / 14
6 / 27
5 / 16
4 / 17
3 / 25
2 / 26
1 / 1
0 / 3

출처: https://community.platformio.org/t/wemos-d1-r32-any-users/15304/4

 

모빌리티키즈 프로젝트!!

728x90
반응형