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

WiDC:Wi-Fi 제어 FPV 로봇

구성품 및 소모품

Arduino UNO
× 1
Espressif ESP8266 ESP-01
× 1
Arduino Proto Shield
× 1
바퀴가 있는 DC 모터
× 1
H-브리지
× 1

앱 및 온라인 서비스

오토데스크 퓨전 360
Arduino IDE

이 프로젝트 정보

원격 제어 로봇을 사용하여 주변을 탐색하고, 접근할 수 없는 장소에 도달하고, 염탐하고, 사진을 찍고, 영화를 찍거나, 비디오를 방송하는 것은 어떻습니까? 이 튜토리얼은 이러한 모든 목적을 위해 비용을 절감하는 방법을 보여줄 것입니다!

이 튜토리얼은 더 빠른 홈- 로봇을 만들었다. 두 개의 DC 모터, Arduino Uno 및 ESP8266 Wi-fi 모듈을 사용하여 Wi-Fi 네트워크를 통해 원격 제어되는 이륜 로봇을 설계하는 방법을 보여줍니다.

로봇은 HTML로 설계된 인터페이스를 사용하여 일반 인터넷 브라우저에서 제어할 수 있습니다. Android 스마트폰은 로봇에서 제어 인터페이스로 비디오 및 오디오를 브로드캐스트하는 데 사용될 수 있습니다.

이전 튜토리얼에서처럼 일반 도구(3D 프린터, 레이저 커터 또는 CNC 라우터가 필요 없음)만 사용하여 로봇 프로젝트를 위한 저비용 프레임을 설계하고 제작하는 방법을 보여줍니다.

여기에 사용된 구성 요소가 목적에 맞게 최적화되지 않았을 수 있습니다. 예를 들어 Arduino + ESP8266 조합 대신 NodeMCU를 사용할 수 있습니다. 카메라가 있는 랩스베리 파이는 스마트폰을 대체하고 모터도 제어합니다. 안드로이드 스마트폰을 로봇의 "두뇌"로 사용하는 것도 가능합니다. 그렇군요...

이 튜토리얼은 제가 속한 다른 프로젝트에서 파생되었습니다:Joy Robot (https://hackaday.io/project/12873-rob-da-alegria-joy-robot 또는 https://www.hackster.io/igorF2/ robo-da-alegria-joy-robot-85e178), 여기에서는 단순성을 위해 동일한 하드웨어를 사용했습니다. 누구나 쉽게 접근할 수 있고 사용하기 쉽기 때문에 Arduino Uno를 선택했으며 이를 위한 간단한 실드를 설계하고 싶었습니다. 우리의 원래 프로젝트에서 그는 또한 일부 서보 및 LED 매트릭스를 제어하고 ESP와 인터페이스합니다. 스마트폰은 실제로 다른 응용 프로그램도 실행하는 태블릿으로 대체되었습니다. 아래 링크에서 해당 로봇과 관련된 다른 자습서를 찾을 수 있습니다.

Arduino Uno로 LED 매트릭스 어레이 제어:

https://www.instructables.com/id/Controlling-a-LED-Matrix-Array-With-Arduino-Uno/

Wi-Fi 브라우저 제어 서보 모터:

https://www.instructables.com/id/Wi-Servo-Wi-fi-Browser-Controlled-Servomotors-with/

이 가이드는 필요에 맞게 조정될 수 있으며 모양이나 제어 인터페이스가 변경될 수 있습니다.

이 다른 튜토리얼에서는 Blynk 앱을 사용하여 스마트폰에서 로봇을 제어하는 ​​방법을 제시합니다! 확인하십시오:

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

1단계:도구

이 프로토타입을 만드는 데 사용된 도구는 다음과 같습니다.

도구:

<울>
  • 손톱(아크릴 시트 절단용)
  • <울>
  • 스크류드라이버(볼트 및 너트 고정용)
  • <울>
  • 자(모델 치수 측정용)
  • <울>
  • 다용도 칼(구조물 절단 및 구멍 뚫기용)
  • <울>
  • 드릴링 머신(나사 설치용 아크릴 드릴링에 사용)
  • <울>
  • 사포(거친 가장자리를 부드럽게 하기 위해)
  • <울>
  • 납땜 인두(모터 단자 납땜용)
  • <울>
  • 컴퓨터(Arduino 코드 컴파일 및 업로드용)
  • 이러한 도구는 로봇의 기계적 구조 생산, 로봇 조립 및 전자 부품 연결에 사용되었습니다. 직접 건물을 짓는 대신 건물을 구입하기로 선택한 경우 일부 도구는 필요하지 않습니다.

    메이커스페이스에서 사용할 수 있는 도구에 따라 다른 장비(예:3D 프린터 또는 레이저 절단기)를 사용할 수도 있습니다.

    2단계:기계적 구조 및 재료

    기계적 구조에 사용된 재료는 다음과 같습니다.

    기계 재료:

    <울>
  • 2mm 아크릴 시트
  • <울>
  • 휠이 있는 DC 기어 모터(x2)
  • <울>
  • 30mm 캐스터 휠(x1)
  • <울>
  • M2 x 10mm 나사(x5)
  • <울>
  • M2 x 1,5mm 너트(x5)
  • <울>
  • M3 x 10mm 나사(x9)
  • <울>
  • M3 x 10mm 나사(x9)
  • <울>
  • M3 x 40mm 나사(x4)
  • <울>
  • M3 x 1,5mm 너트(x12)
  • <울>
  • 5/32" x 1" 나사(x4)
  • <울>
  • 5/32" 너트(x12)
  • <울>
  • 범용 휴대폰 거치대
  • <울>
  • 강철 앵글 "L"자형 브래킷(30 x 30mm)(x4)
  • 3단계:전자 부품

    이 로봇에 사용되는 다음 전자 부품:

    • Arduino Uno(구매/구매)

    • ESP8266(구매)

    • Protoshield(더 컴팩트한 버전용) 또는 일반 브레드보드(구매)

    • 1kohm 저항(x2)

    • 10kohm 저항(x1)

    • 휠이 있는 DC 기어 모터(x2)(구매)

    • H-브리지 모듈(구매)

    • 일부 점퍼 와이어

    • 5V USB 보조 배터리

    좋아하는 전자 상거래 상점에서 온라인으로 모든 구성 요소를 쉽게 찾을 수 있습니다.

    이 튜토리얼의 도입부에서 강조했듯이 구성요소의 선택은 내가 디자인한 다른 프로젝트에서 파생되었으며 예를 들어 다른 마이크로컨트롤러를 사용하여 최적화할 수 있습니다.

    4단계:구조 설계

    먼저 로봇의 기계적 구조를 설계해야 했습니다. 자신만의 맞춤형 구조물을 만들고 싶지 않다면 전체 구조물을 온라인으로 구입할 수도 있습니다(온라인에서 사용할 수 있는 로봇 키트가 많이 있음). 이 경우 6단계로 이동할 수 있습니다. 이 자습서에서는 모터 및 기타 구성 요소를 부착하기 위해 저렴한 아크릴 프레임을 설계했습니다. 이 튜토리얼에서 제시된 구조는 Fusion 360 CAD 소프트웨어를 사용하여 3D로 설계되었으며 일반 도구(3D 프린터, 레이저 커터 또는 CNC 라우터가 필요 없음)로 구성되었습니다. 아래에 설명된 것과 동일한 원칙을 사용하여 필요에 맞는 맞춤형 구조를 디자인할 수 있습니다.

    먼저 구조의 배열을 결정하기 위해 주요 구성 요소의 3D 모델을 만들어야 했습니다. 그 중 일부는 GrabCAD 커뮤니티 라이브러리(https://grabcad.com/library)에서 다운로드했습니다. ):

    <울>
  • 아두이노 우노(https://grabcad.com/library/arduino-uno-13)
  • <울>
  • 기어 모터(https://grabcad.com/library/bomotor-1)
  • <울>
  • H-브릿지(https://grabcad.com/library/motor-driver-l9110-1)
  • <울>
  • 파워 뱅크(https://grabcad.com/library/power-bank-7)
  • <울>
  • 범용 전화 홀더(https://grabcad.com/library/universal-phone-holder-for-the-gopro-accessories-1)
  • 전자 부품이 평면에 배치되어 로봇에 필요한 발자국을 파악할 수 있었습니다. 그 후 안정적인 구조를 만들기 위해 모터와 바퀴의 위치를 ​​선택해야 했습니다.

    그 위치를 바탕으로 3개의 플레이트(베이스 플레이트 및 2개의 측면 플레이트)로 구성되는 주요 구조가 설계되었으며, 이 플레이트는 일부 브래킷을 사용하여 연결됩니다.

    base.pdf base.svg

    5단계:구조 구축 및 조립

    기초 구조의 구성은 다음 단계로 나뉩니다.1. 2D 도면의 치수에 따라 아크릴 베이스를 자릅니다. 이것은 레이저 절단기(접근할 수 있는 경우)를 사용하거나 제 경우와 같이 일반 도구를 사용하여 수행할 수 있습니다.

    먼저 모델의 치수를 아크릴 시트로 전송해야 합니다. 일반 프린터를 사용하여 접착 종이에 2D 도면을 인쇄한 다음 적절한 치수로 종이를 자르고 해당 마스크를 아크릴 표면에 적용합니다. 만능 칼과 자 또는 저울을 사용하여 아크릴을 자릅니다. 직선. 시트를 완전히 자를 필요는 없습니다. 나중에 조각을 자를 트랙을 만들기 위해 점수를 매기기만 하면 됩니다. 아크릴을 평평한 표면에 놓고 클램프로 제자리에 고정한 다음 시트가 두 개로 나눌 때까지 약간의 압력을 가합니다. 모든 컷이 완료될 때까지 이 과정을 반복합니다. 그런 다음 사포를 사용하여 거친 가장자리를 부드럽게 할 수 있습니다. 아크릴을 자르기 위해 손톱을 사용할 수도 있습니다.2. 2D 도면에 표시된 위치에 구멍을 뚫습니다. 드릴링 머신으로 2D 도면(마스크에 표시됨)에 표시된 위치에 구멍을 뚫습니다. 아크릴은 드릴링이 비교적 쉽습니다. 따라서 드릴링 머신을 버리지 않으면 만능칼과 같은 날카로운 도구로 수동으로 구멍을 뚫을 수 있습니다. 나사 크기에 맞게 작은 구멍을 확대하는 데 사용할 수도 있습니다. 마스크를 제거하면 베이스가 준비됩니다.

    3. 3D 도면에 따라 나사와 너트로 구성요소를 장착합니다. 비디오에 따라 나사와 너트로 구성 요소를 장착하면 구조가 준비됩니다. 브래킷과 DC 모터의 설치에는 M3 나사가 사용됩니다. M2 나사는 전자 부품 설치에 사용되었고 5/32" 나사는 앞바퀴와 스마트폰 클립 설치에 사용되었습니다. 이제 잠시 휴식을 취하고 다음 단계에서 회로 조립을 시작합니다... 기본.pdf

    6단계:전자 제품 조립

    여기서 제안하는 회로는 Wi-Fi 통신을 위해 ESP8266과 인터페이스하는 Arduino Uno를 메인 컨트롤러로 사용합니다. Arduino는 최대 2개의 모터를 제어할 수 있는 H-brige 구동 회로를 사용하여 DC 모터를 제어하고 회전합니다. 양방향으로 독립적입니다.

    전원 은행은 Arduino의 USB 포트에 직접 연결된 전자 제품에 전원을 공급하는 데 사용되었습니다. 이것은 Arduino에 전원을 공급하는 쉬운 방법입니다. 충전이 쉽고 교체가 간편하며 안전한 5V 전압을 제공합니다.

    회로도에 따라 모든 구성 요소를 연결합니다. 프로토보드 친화적이지 않은 h-브리지 및 DC 모터인 ESP8266 모듈을 연결하려면 점퍼 와이어가 필요합니다. protoshield(보다 컴팩트한 회로용), 일반 브레드보드를 ​​사용하거나 자신만의 Arduino 실드를 설계할 수 있습니다.

    ESP8266-1은 브레드보드 친화적이지 않습니다. 일부 점퍼 와이어를 사용하여 연결되지만 구조물에는 연결되지 않습니다.

    USB 케이블을 Arduino 보드에 연결하고 다음 단계로 진행합니다.

    wiDC_Esquem_C3_A1tico.pdf wiDC.fzz wiDC_bb.pdf

    7단계:Arduino 코드

    최신 Arduino IDE를 설치합니다. ESP-8266 모듈과 통신하거나 모터를 제어하는 ​​데 라이브러리가 필요하지 않습니다. ESP8266의 전송 속도를 확인하고 코드에서 올바르게 설정하십시오. Arduino 코드(WiDC.ino)를 다운로드하고 XXXXX를 Wi-Fi 라우터 SSID로 교체하고 라우터 비밀번호로 YYYYY. Arduino 보드를 컴퓨터 USB 포트에 연결하고 코드를 업로드합니다.

    USB 케이블을 Arduino 보드에 연결하고 다음 단계로 진행합니다.

    //라이브러리 포함#include SoftwareSerial esp8266(3, 2); //RX 핀 =3, TX 핀 =2//변수 정의#define DEBUG true // 직렬 포트 상태에서 ESP8266과 Arduino 사이의 메시지 표시 =5; //로봇의 초기 상태 정의(5 =대기)//모터 핀 정의 const int motor1Pin1 =5;const int motor1Pin2 =6;const int motor2Pin1 =9;const int motor2Pin2 =10;//모터 속도 정의int motorSpeed ​​=150; //모터 속도(PWM)//*****//SETUP//*****void setup(){ //핀 모드 설정 pinMode(motor1Pin1, OUTPUT); 핀모드(모터1핀2, 출력); 핀모드(모터2핀1, 출력); 핀모드(모터2핀2, 출력); //통신 시작 Serial.begin(9600); esp8266.begin(9600); sendData("AT+RST\r\n", 2000, 디버그); // 모듈 재설정 sendData("AT+CWMODE=1\r\n", 1000, DEBUG); // 스테이션 모드 설정 sendData("AT+CWJAP=\"XXXXX\",\"YYYYY\"\r\n", 2000, DEBUG); //Wi-Fi 네트워크 연결(XXXXX는 Wi-Fi 라우터 SSID로, YYYYY는 비밀번호 delay(5000)으로 대체); //연결 대기 sendData("AT+CIFSR\r\n", 1000, DEBUG); / /show IP 주소 sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); //여러 연결 허용 sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); / / 포트 80에서 웹 서버 시작}//*********//MAIN LOOP//*********void loop(){ if (esp8266.available()) //확인 수신 데이터 { if (esp8266.find("+IPD,")) //메시지가 있는 경우 { String msg; esp8266.find("?"); //메시지 찾기 msg =esp8266.readStringUntil(' ' ); //전체 메시지 읽기 String command =msg.substring(0, 3); //처음 3개 문자 =command Serial.println(command); //앞으로 이동 if(command =="cm1") { state =1; } //뒤로 이동 if(command =="cm2") { state =2; } //우회전 if(command =="cm3") { state =3; } //좌회전 if(command ==" cm4") { state =4; } //아무것도 하지 않음 if(command =="cm5") { state =5; } } } //STATE 1:앞으로 이동 if (state ==1) { analogWrite(m otor1Pin1, motorSpeed); 디지털 쓰기(모터1핀2, 낮음); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 2:뒤로 이동 if (state ==2) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); digitalWrite(모터2핀1, 낮음); analogWrite(motor2Pin2, motorSpeed); } //STATE 3:오른쪽으로 이동 if (state ==3) { analogWrite(motor1Pin1, motorSpeed); 디지털 쓰기(모터1핀2, 낮음); digitalWrite(모터2핀1, 낮음); analogWrite(motor2Pin2, motorSpeed); } //STATE 4:왼쪽으로 이동 if (state ==4) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 5:아무것도 하지 않음 if (state ==5) { digitalWrite(motor1Pin1, LOW); 디지털 쓰기(모터1핀2, 낮음); digitalWrite(모터2핀1, 낮음); digitalWrite(motor2Pin2, LOW); } }//*******************//보조 기능//**********************문자열 sendData (문자열 명령, const int 시간 초과, 부울 디버그){ 문자열 응답 =""; esp8266.print(명령어); 긴 int 시간 =millis(); while ( (시간 + 시간 초과)> millis()) { while (esp8266.available()) { char c =esp8266.read(); 응답 +=c; } } if(디버그) { Serial.print(응답); } 반환 응답;}  

    설명된 코드:

    이 코드는 Arduino와 ESP8266 간의 통신을 위해 하나의 직렬 포트를 사용하고 Arduino와 컴퓨터 간의 통신을 위해 다른 직렬 포트를 사용합니다. Arduino Uno에 직렬 포트가 하나만 있으면 SoftwareSeial 라이브러리를 사용하여 디지털 핀 2와 3을 사용하여 보조 포트를 생성했습니다.

    //라이브러리 포함#include SoftwareSerial esp8266(3, 2); //RX 핀 =3, TX 핀 =2 

    설정하는 동안 두 직렬 통신이 시작되고 전송 속도가 정의되어야 합니다(하나는 Arduino와 직렬 모니터 사이에, 다른 하나는 ESP8266 속도와 일치). 내 ESP8266은 9600kbps로 설정되어 있습니다. 기본적으로 이러한 모듈의 대부분은 115200kbps로 제공되지만 SoftwareSerial 라이브러리는 해당 속도로 작동하지 않으므로 전송 속도를 변경해야 합니다. 저에게는 9600kbps가 제대로 작동했습니다.

    이 프로젝트에서는 Wi-Fi 모듈과의 통신을 위해 특정 라이브러리를 사용하지 않았습니다. 대신 다음과 같은 일반 AT 명령(ESP8266 기본 펌웨어에 정의된 명령 집합)만 사용되었습니다.

    <울>
  • AT+RST:ESP8266 모듈 재설정
  • <울>
  • AT+CWMODE:모듈을 스테이션 모드 또는 액세스 포인트로 설정
  • <울>
  • AT+CWJAP:SSID 및 비밀번호로 제공된 Wi-Fi 네트워크 연결
  • <울>
  • AT+CIPMUX:다중 연결 또는 단일 연결에 대한 모듈 설정
  • <울>
  • AT+CIPSERVER:주어진 포트에서 웹 서버 시작 //통신 시작
  • <사전><코드> Serial.begin(9600); esp8266.begin(9600); sendData("AT+RST\r\n", 2000, 디버그); // 모듈 재설정 sendData("AT+CWMODE=1\r\n", 1000, DEBUG); // 스테이션 모드 설정 sendData("AT+CWJAP=\"XXXXX\",\"YYYYY\"\r\n", 2000, DEBUG); //Wi-Fi 네트워크 연결(XXXXX는 Wi-Fi 라우터 SSID로, YYYYY는 비밀번호 delay(5000)으로 대체); //연결 대기 sendData("AT+CIFSR\r\n", 1000, DEBUG); / /show IP 주소 sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); //여러 연결 허용 sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); / / 포트 80에서 웹 서버 시작

    보조 기능(sendData)은 데이터를 보내고(Arduino에서 ESP8266으로) 직렬 모니터에서 응답을 읽고 표시하는 데 사용됩니다.

    String sendData(문자열 명령, const int timeout, 부울 디버그){ 문자열 응답 =""; esp8266.print(명령어); 긴 int 시간 =millis(); while ( (시간 + 시간 초과)> millis()) { while (esp8266.available()) { char c =esp8266.read(); 응답 +=c; } } if(디버그) { Serial.print(응답); } 반환 응답;} 

    위의 코드를 사용하면 Arduino가 모듈을 재설정하고 네트워크에 연결하고 연결을 기다린 다음 IP 주소를 표시하고 웹 서버를 시작합니다. 그 후 메인 루프가 시작되고 마이크로 컨트롤러가 명령을 기다립니다.

    void loop(){ if (esp8266.available()) // 들어오는 데이터 확인 { if (esp8266.find("+IPD,")) //메시지가 있는 경우 { String msg; esp8266.find("?"); //메시지 찾기 msg =esp8266.readStringUntil(' '); //전체 메시지 읽기 String command =msg.substring(0, 3); //처음 3자 =명령 Serial.println(command); //앞으로 이동 if(command =="cm1") { state =1; } // 뒤로 이동 if(command =="cm2") { state =2; } //우회전 if(command =="cm3") { state =3; } //좌회전 if(command =="cm4") { state =4; } //아무것도 하지 않음 if(command =="cm5") { state =5; } } } 

    5개의 가능한 명령이 정의되었습니다(cm1 ~ cm5). Arduino는 이러한 명령 중 하나를 수신할 때마다 5가지 가능한 상태(앞으로 이동, 뒤로 이동, 오른쪽으로 이동, 왼쪽으로 이동 및 대기) 중 하나에 들어가고 다른 명령을 수신할 때까지 해당 상태를 계속합니다.

    각 상태는 모터 핀에 대한 신호를 정의합니다. 핀을 0V로 설정하고 싶을 때 digitalWrite(pin, LOW)를 사용하고 핀을 켜고 싶을 때 analogWrite(pin, motoSpeed)를 사용했습니다. analogWrite를 사용하여 모터의 속도를 변경하고 로봇을 느리게 움직일 수 있었습니다.

    //STATE 1:앞으로 이동 if (state ==1) { analogWrite(motor1Pin1, motorSpeed); 디지털 쓰기(모터1핀2, 낮음); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 2:뒤로 이동 if (state ==2) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); digitalWrite(모터2핀1, 낮음); analogWrite(motor2Pin2, motorSpeed); } //STATE 3:오른쪽으로 이동 if (state ==3) { analogWrite(motor1Pin1, motorSpeed); 디지털 쓰기(모터1핀2, 낮음); digitalWrite(모터2핀1, 낮음); analogWrite(motor2Pin2, motorSpeed); } //STATE 4:왼쪽으로 이동 if (state ==4) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 5:아무것도 하지 않음 if (state ==5) { digitalWrite(motor1Pin1, LOW); 디지털 쓰기(모터1핀2, 낮음); digitalWrite(모터2핀1, 낮음); digitalWrite(motor2Pin2, LOW); } 

    모터는 3V와 6V 사이에서 작동합니다. 5V 전원이 사용되면 모터의 평균 전압(PWM 사용)을 3~5V로 변조하여 속도를 변경할 수 있습니다. 로봇의 속도를 미세하게 제어할 수 없습니다.

    WiDC.이노

    8단계:웹 기반 제어 인터페이스

    html 인터페이스는 로봇의 제어를 위해 설계되었습니다. interface.rar를 다운로드하고 모든 파일을 주어진 폴더에 추출합니다. 그런 다음 Firefox에서 엽니다. 해당 인터페이스에서 텍스트 상자 형식을 사용하여 ESP 모듈 및 비디오/오디오 서버(Android IP 웹캠 앱에서)의 IP 주소를 입력합니다. 테스트가 있지만 다른 명령이 수신될 때까지 로봇이 회전합니다. 키보드 화살표 키는 로봇을 앞뒤로 움직이고 왼쪽 또는 오른쪽으로 회전하는 데 사용됩니다. Android 스마트폰은 로봇에서 제어 인터페이스로 비디오 및 오디오를 브로드캐스트하는 데 사용되었습니다. Google Play 스토어(https://play.google.com/store/apps/details?id=com.pas.webcam)에서 앱을 찾을 수 있습니다. 설치하고 다음 단계로 이동하세요.

    HTML 코드 설명:

    html 인터페이스에는 오디오 및 비디오(Android IP 웹캠 서버에서)와 명령에 대한 두 부분이 있습니다.

    오디오 및 비디오 부문에는 버튼이 있는 텍스트 상자가 있는 형식이 있습니다. 웹캠 서버 IP 주소를 지정하고 불러오기 위한 입력으로 사용됩니다. 표준 IP 주소(192.168.0.5)가 함께 제공되지만 사용 시 다른 IP를 입력할 수 있습니다. 비디오 및 오디오는 텍스트 상자 아래 개체에 로드됩니다.

    IP 웹캠( IP):
    <객체 ID="비디오" 유형="텍스트/html" 데이터="http://192.168.0.5:8080/video" 스타일="위치:절대, 너비:100%, 높이:480픽셀, ">

    다른 부서에는 사용자가 ESP8266 IP 주소를 알릴 수 있도록 텍스트 상자가 있는 다른 형식이 있습니다.

    아두이노 IP 주소:

    키보드 화살표 키를 길게 눌러 로봇을 이동

    JavaScript는 인터페이스를 처리하고 Arduino에 데이터를 보내는 데 사용됩니다. 이러한 스크립트는 다른 파일에 코딩되고 html 헤더에 추가됩니다.

       제어 인터페이스   

    자바스크립트 설명:

    함수(readUrlAV)는 html 형식에서 IP 주소를 읽고 "비디오" 및 "오디오" 개체에 로드하는 데 사용됩니다.

    <사전><코드>기능 readUrlAV(양식) { TextVar =form.inputbox.value; VideoVar ="http://"+TextVar+":8080/video"; AudioVar ="http://"+TextVar+":8080/audio.opus"; document.getElementById("비디오").setAttribute('데이터', VideoVar); document.getElementById("오디오").setAttribute('데이터', AudioVar);}

    스크립트는 사용자가 아무 키나 누르기를 기다리면서 주기적으로 키보드를 읽습니다. 사용자가 화살표 키(왼쪽 ='37', 위쪽 ='38', 오른쪽 ='39' 또는 '아래쪽' =40)를 누르면 지정된 IP에 대한 명령("cm1"에서 "cm4")을 보냅니다. 주소. 동일한 명령이 계속해서 반복되는 것을 방지하는 래치 기능이 있습니다. 키를 눌러야 데이터가 전송됩니다.

    var 래치 =false;document.onkeydown =checkKeyDown;function checkKeyDown(e) { e =e || 창.이벤트; if (e.keyCode =='38') { // 위쪽 화살표 if (latch ==false) { TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $.get( ArduinoVar, { "cm1":1000 }); {연결:닫기}; 래치 =참; } } else if (e.keyCode =='40') { // 아래쪽 화살표 if (latch ==false) { TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $.get( ArduinoVar, { "cm2":1000 }); {연결:닫기}; 래치 =참; } } else if (e.keyCode =='37') { // 왼쪽 화살표 if (latch ==false) { TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $.get( ArduinoVar, { "cm3":1000 }); {Connection:close}; latch =true; } } else if (e.keyCode =='39') { // right arrow if (latch ==false) { TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $.get( ArduinoVar, { "cm4":1000 }); {Connection:close}; latch =true; } }} 

    When any arrow key is released, doNothing function is executed, which sends command "cm5" (stop the motors), and resets the latch, allowing interface to send differente commands.

    document.onkeyup =checkKeyUp;function checkKeyUp(e) { e =e || window.event; if ((e.keyCode =='38')||(e.keyCode =='40')||(e.keyCode =='37')||(e.keyCode =='39')) { setTimeout(doNothing, 200); }}function doNothing(){ TextVar =myform2.inputbox.value; ArduinoVar ="http://" + TextVar + ":80"; $.get( ArduinoVar, { "cm5":1000 }); {Connection:close}; latch =false;}  
    interface.rar

    Step 9:Usage

    When the Arduino is restarted, it will try to connect your wi-fi network automatically. Use the Serial Monitor to check if the connection was successfull, and to obtain which IP was assigned to your ESP-8266 by your router. Open the html file in an internet browser (Firefox) and inform this IP address in the textbox.You might also user other means to find out which IP address you router assigned to your device. Disconnect the the Arduino Uno from your computer and connect it to the power bank. Wait for it to connect again. Launch IP Webcam app in the smartphone attached to the robot. Type the video/audio IP on your control interface and connect to the server and you'll be ready to go. You might need to reduce the resolution of the video in the app to reduce the delay between during the transmission. Click and hold the arrow buttons of your keyboar to rotate the robot or move it forward/backward and have fun exploring your environment.

    Notice that robot runs on open loop. This way, it's quite difficult to make it move straight forward. Small difference between the motors, aligment, etc. will cause cumulative deviations.

    The robot start moving when it receives a given command ("cm1" to "cm4"), and keep that state until a different command is received ("cm1" to "cm5"). Sometimes the ESP8266 loses some messages, and that might cause some trouble. If, for instance, a "cm5" command is lost, the robot will keed moving even after any arrow key was released. I'm still dealing with this problem. Feel free to change the way the commands are interpreted to avoid this kind of problem.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Arduino 코드
  • Interface
  • Arduino 코드Arduino
    //include libraries#include SoftwareSerial esp8266(3, 2); //RX pin =3, TX pin =2//definition of variables#define DEBUG true //show messages between ESP8266 and Arduino in serial portint state =5; //define initial state of the robot (5 =stand-by)//define motor pinsconst int motor1Pin1 =5;const int motor1Pin2 =6;const int motor2Pin1 =9;const int motor2Pin2 =10;//define motor speedint motorSpeed =150; //motor speed (PWM)//*****//SETUP//*****void setup(){ //set pin modes pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor2Pin1, OUTPUT); pinMode(motor2Pin2, OUTPUT); //start communication Serial.begin(9600); esp8266.begin(9600); sendData("AT+RST\r\n", 2000, DEBUG); //reset module sendData("AT+CWMODE=1\r\n", 1000, DEBUG); //set station mode sendData("AT+CWJAP=\"XXXXX\",\"YYYYY\"\r\n", 2000, DEBUG); //connect wi-fi network (replace XXXXX by your Wi-Fi router SSID and YYYYY by its password delay(5000); //wait for connection sendData("AT+CIFSR\r\n", 1000, DEBUG); //show IP address sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); //allow multiple connections sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // start web server on port 80}//*********//MAIN LOOP//*********void loop(){ if (esp8266.available()) //verify incoming data { if (esp8266.find("+IPD,")) //if there is a message { String msg; esp8266.find("?"); //look for the message msg =esp8266.readStringUntil(' '); //read whole message String command =msg.substring(0, 3); //first 3 characters =command Serial.println(command); //move forward if(command =="cm1") { state =1; } //move backward if(command =="cm2") { state =2; } //turn right if(command =="cm3") { state =3; } //turn left if(command =="cm4") { state =4; } //do nothing if(command =="cm5") { state =5; } } } //STATE 1:move forward if (state ==1) { analogWrite(motor1Pin1, motorSpeed); digitalWrite(motor1Pin2, LOW); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 2:move backward if (state ==2) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); digitalWrite(motor2Pin1, LOW); analogWrite(motor2Pin2, motorSpeed); } //STATE 3:move right if (state ==3) { analogWrite(motor1Pin1, motorSpeed); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); analogWrite(motor2Pin2, motorSpeed); } //STATE 4:move left if (state ==4) { digitalWrite(motor1Pin1, LOW); analogWrite(motor1Pin2, motorSpeed); analogWrite(motor2Pin1, motorSpeed); digitalWrite(motor2Pin2, LOW); } //STATE 5:do nothing if (state ==5) { digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); } }//*******************//Auxiliary functions//*******************String sendData(String command, const int timeout, boolean debug){ String response =""; esp8266.print(command); long int time =millis(); while ( (time + timeout)> millis()) { while (esp8266.available()) { char c =esp8266.read(); response +=c; } } if (debug) { Serial.print(response); } return response;}
    InterfaceHTML
    미리보기 없음(다운로드만 가능).

    맞춤형 부품 및 인클로저

    base_7JLgOpcox6.svg

    회로도


    제조공정

    1. Bluetooth를 통해 제어되는 Raspberry Pi Robot
    2. Arduino 디지털 주사위
    3. Arduino 게임 컨트롤러
    4. 라인 팔로워 로봇
    5. 음성 제어 로봇
    6. MobBob:Android 스마트폰으로 제어되는 DIY Arduino 로봇
    7. 픽셀 체이서 게임
    8. Arduino 반발 전자기 부상
    9. Arduino 제어 피아노 로봇:PiBot
    10. 자율 홈 어시스턴트 로봇