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

집에서 제스처 제어 로봇을 만드는 방법

구성품 및 소모품

Arduino UNO
× 1
Arduino Nano R3
× 1
HC-05 블루투스 모듈
× 2
SparkFun 3축 가속도계 및 자이로 브레이크아웃 - MPU-6050
× 1
DC 모터, 12V
× 2
고무 바퀴
× 1
Texas Instruments 듀얼 H-Bridge 모터 드라이버 L293D
× 1
9V 배터리(일반)
× 2

필요한 도구 및 기계

납땜 인두(일반)
납땜 와이어, 무연
테이프, 폼
멀티툴, 스크루드라이버

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보


제스처 제어 자동차를 직접 만드는 방법에 대한 것입니다. 기본적으로 이것은 MPU-6050 3축 자이로스코프, 가속도계의 간단한 응용 프로그램입니다. 더 많은 일을 할 수 있습니다. 사용 방법, Arduino와 인터페이스하는 방법 및 Bluetooth 모듈을 통해 데이터를 전송하는 방법을 이해합니다. 이 글에서는 2개의 HC-05 블루투스 모듈 사이에서 블루투스에서 블루투스로의 통신에 중점을 둘 것입니다.

비디오를 따라 이 프로젝트를 위한 로봇 본체와 연결부를 만드세요.

로봇과 트랜스미터 유닛의 결선도는 아래와 같으니 참고하시면 됩니다.

PCBway에서 이 프로젝트에 사용된 직접 주문 PCB:https://www.pcbway.com/project/shareproject/How_to_Make_Arduino_Based_Edge_Avoiding_Robot.html

이제 Bluetooth 모듈 구성에 대해 이야기해 보겠습니다. 기본적으로 HC-05 Bluetooth 모듈은 슬레이브 모듈 공장 설정으로 제공됩니다. 즉, 플러그를 꽂으면 모듈로 데이터를 보낼 수 있습니다. 모바일 장치에서 HC-05 모듈로 데이터를 보내기 위해 다른 설정을 할 필요가 없습니다. 연결하려면 기본 비밀번호(1234/0000)를 입력하기만 하면 됩니다. 그러나 이 모듈을 사용하여 다른 동일한 모듈이나 모바일 장치로 데이터를 보내려면 어떻게 해야 할까요?

이 프로젝트에서는 Bluetooth 모듈을 통해 데이터를 보내는 것과 동일한 작업을 수행합니다. mpu-6050 자이로 센서에서 다른 블루투스 모듈로 수집합니다.

이렇게 하려면 먼저 이 두 Bluetooth 모듈을 구성해야 합니다. 전원을 켠 후 자동으로 서로 바인딩할 수 있도록 합니다. 여기서 첫 번째 모듈은 원격 장치에서 신호를 수신하고 자동차에 장착되는 슬레이브 장치로 작동합니다. 그리고 두 번째 장치를 송신기 장치로 작동하고 슬레이브 장치로 데이터를 보낼 마스터 장치로 구성합니다.

따라서 먼저 첫 번째 블루투스 모듈을 슬레이브 장치로 구성하십시오. 이렇게 하려면 이 배선도에 따라 Arduino와 연결하십시오.

그리고 configure라는 이름으로 코드를 업로드합니다.

#include 
SoftwareSerial BTSerial(10, 11); // 수신 | TX
무효 설정()
{
Serial.begin(9600);
Serial.println("AT 명령을 입력하세요:");
BTSerial.begin(38400 ); // AT 명령의 HC-05 기본 속도 more
}
void loop()
{
// HC-05에서 계속 읽고 Arduino 직렬 모니터로 전송
if (BTSerial.available())
Serial.write(BTSerial.read());
// Arduino 직렬 모니터에서 계속 읽고 HC-05로 전송
if (Serial.write() 사용 가능()
BTSerial.write(Serial.read());
}

모듈을 분리합니다. 모듈의 ky를 누른 상태에서 다시 연결하십시오. 모듈의 LED가 느리게 깜박이는 것을 볼 수 있습니다. 2초에 한 번. 이것은 HC-05가 AT 명령 모드에 있음을 의미합니다. 이제 직렬 모니터를 열고 전송 속도를 9600으로 변경하고 출력 유형을 NL 및 CR로 변경합니다. 이제 보내기 상자에 AT를 입력하고 보냅니다. ok로 응답하면 모든 것이 잘됨을 의미합니다. 그러나 그렇지 않고 약간의 오류로 응답하면 AT를 다시 보냅니다. ok 또는 check 연결로 응답하고 다시 AT를 보낼 때까지 ...

모듈에서 OK 응답을 받은 후 다음 명령을 하나씩 입력하십시오.

AT+ORGL을 입력하고 보냅니다. 이 명령은 모듈을 공장 설정으로 설정합니다.

AT+RMAAD 이 명령은 이전 페어링에서 모듈을 해제합니다.

AT+UART? 모듈의 현재 전송 속도 확인

AT+UART=38400, 0, 0 전송 속도를 38400으로 설정

AT+역할? 슬레이브인지 마스터인지 역할을 확인하십시오. 0 또는 1로 응답합니다. 모듈이 슬레이브이면 0으로 응답하고 마스터 장치이면 1로 응답합니다.

역할을 슬레이브 장치로 설정합니다. AT+ROLE=0 입력

AT+ADDR? 모듈 주소를 확인하십시오.

이 주소를 기록해 두십시오. 모듈로 응답했습니다. 이 주소를 얻은 후 슬레이브 모듈에 대한 구성이 완료됩니다.

이제 두 번째 Bluetooth 모듈을 마스터 장치로 구성할 시간입니다. 이 모듈을 Arduino 보드와 연결하고 AT 모드로 들어갑니다. 이전에 했던 것처럼.

주어진 순서대로 AT 명령어를 입력하세요.

AT+ORGL

AT+RMAAD

AT+UART?

AT+UART=38400, 0, 0

AT+역할?

이 모듈의 역할을 마스터 장치로 설정합니다. AT+역할=1

모듈이 단일 장치만 연결하도록 AT+CMODE=0입니다. 기본 설정은 0입니다.

이제 이 모듈을 슬레이브 장치와 바인딩하여 이 입력을 수행합니다.

AT+BIND=" 슬레이브 모듈의 주소" 및 모든 완료

이제 MPU-6050 센서 및 I2C 통신용 라이브러리를 설치합니다. MPU-6050 자이로 센서에는 I2C 인터페이스가 있습니다. 여기에서 라이브러리 및 소스 코드를 다운로드하십시오:http://www.mediafire.com/file/l8mru5emulb8x93/gesture_control_robot.rar/file

이러한 라이브러리를 사전 설치한 경우 건너뛰십시오.

이제 USB 케이블을 사용하여 PC와 자동차 유닛을 연결합니다. 올바른 COM 포트와 보드 유형을 선택하십시오. 그리고 "Gesture_controled_Robot__car_unit_"이라는 이름으로 프로그램을 업로드합니다. 프로그램을 업로드하는 동안 배터리와 블루투스 모듈이 차량에 연결되어 있지 않은지 확인하세요.

//2019년 3월 10일에 Shubham Shinganapure의 프로그램
//
//제스처 제어 로봇 자동차용
int lm1=8; //왼쪽 모터 출력 1
int lm2=9; //왼쪽 모터 출력 2
int rm1=10; //오른쪽 모터 출력 1
int rm2=11; //오른쪽 모터 출력 2
char d=0;
void setup()
{
pinMode(lm1,OUTPUT);
pinMode(lm2,OUTPUT);
pinMode(rm1,OUTPUT);
pinMode(rm2,OUTPUT);
Serial.begin(38400);
sTOP();
}
무효 루프()
{
if(Serial.available()>0)
{
d=Serial.read();
if(d==' F')
{
ForWard();
}
if(d=='B')
{
BackWard();
}
if(d=='L')
{
왼쪽();
}
if(d=='R')
{
오른쪽();
}
if(d=='S')
{
sTOP();
}
}
}
ForWard() 무효
{
digitalWrite(lm1,HIGH);
digitalWrite(lm2,LOW);
digitalWrite(rm1,HIGH);
digitalWrite(rm2,LOW);
}
BackWard() 무효
{
digitalWrite(lm1,LOW);
digitalWrite(lm2,HIGH );
digitalWrite(rm1,LOW);
digitalWrite(rm2,HIGH);
}
왼쪽() 무효
{
digitalWrite(lm1, LOW);
digitalWrite(lm2,HIGH);
digitalWrite(rm1,HIGH);
digitalWrite(rm2,LOW);
}
오른쪽() 무효<브 />{
digitalWrite(lm1,HIGH);
digitalWrite(lm2,LOW);
digitalWrite(rm1,LOW);
digitalWrite(rm2,HIGH);
}
무효 sTOP()
{
digitalWrite(lm1,LOW);
digitalWrite(lm2,LOW);
digitalWrite(rm1,LOW);
digitalWrite( rm2,LOW);
}

원격 장치와 동일한 작업을 수행합니다. 원격이라는 이름으로 프로그램을 엽니다. 원격 장치에 업로드합니다.

//Shubham Shinganapure에 의해 //에 의해 3/10/19에 수정된 프로그램.
//
//제스처 제어 로봇 자동차(원격)
#include " I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // MotionApps 포함 파일을 사용하는 경우 필요하지 않음
// I2Cdev의 경우 Arduino Wire 라이브러리가 필요합니다. I2CDEV_ARDUINO_WIRE 구현
//은 I2Cdev.h에서 사용됩니다.
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
// 클래스 기본 I2C 주소는 0x68
// 여기에서 매개변수로 특정 I2C 주소를 전달할 수 있습니다.
// AD0 low =0x68(SparkFun 브레이크아웃 및 InvenSense 평가 보드의 기본값)
// AD0 high =0x69
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
// MPU 제어/상태 변수
bool dmpReady =false; // DMP 초기화가 성공하면 true로 설정
uint8_t mpuIntStatus; // MPU의 실제 인터럽트 상태 바이트를 보유합니다.
uint8_t devStatus; // 각 장치 작업 후 상태 반환(0 =성공, !0 =오류)
uint16_t packetSize; // 예상 DMP 패킷 크기(기본값은 42바이트)
uint16_t fifoCount; // 현재 FIFO에 있는 모든 바이트 수
uint8_t fifoBuffer[64]; // FIFO 저장 버퍼
VectorFloat 중력;
Quaternion q;
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll 컨테이너 및 중력 벡터
uint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0 , 0x00, 0x00, '\r', '\n' };
휘발성 부울 mpuInterrupt =false; // MPU 인터럽트 핀이 하이인지 여부를 나타냅니다.
void dmpDataReady() {
mpuInterrupt =true;
}
#include
SoftwareSerial BTSerial( 10, 11); // 수신 | TX
int bt=8;
int x =1;
setup() 무효 {
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR =24; // 400kHz I2C 클럭(CPU가 8MHz인 경우 200kHz)
#elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
// 직렬 초기화 communication
// (115200은 Teapot Demo 출력에 필요하기 때문에 선택되지만
// 프로젝트에 따라 정말 다릅니다.)
Serial.begin(115200);
BTSerial.begin(38400);
// while (!Serial); // Leonardo 열거를 기다리면 나머지는 즉시 계속됩니다.
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();
// 연결 확인
Serial.println(F("장치 연결 테스트 중..."));
Serial.println(mpu.testConnection() ? F("MPU6050 연결 성공") :F("MPU6050 연결 실패" ));
// 준비 대기
// DMP 로드 및 구성
Serial.println(F("Initializing DMP..."));
devStatus =mpu .dmpInitialize();
// 여기에 최소 감도에 맞게 조정된 자체 자이로 오프셋을 제공합니다.
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu. setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
// 작동하는지 확인합니다(그렇다면 0을 반환)
if (devStatus ==0) {
/ / 준비가 되었으므로 DMP를 켭니다.
Serial.println(F("DMP 활성화..."));
mpu.setDMPEnabled(true);
// Arduino 인터럽트 활성화 detection
Serial.println(F("인터럽트 감지 활성화(Arduino 외부 인터럽트 0)..."));
a ttachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus =mpu.getIntStatus();
// DMP Ready 플래그를 설정하여 main loop() 함수가 그것을 사용해도 괜찮다는 것을 알도록 합니다.
Serial .println(F("DMP 준비 완료! 첫 번째 인터럽트를 기다리는 중..."));
dmpReady =true;
// 나중에 비교할 예상 DMP 패킷 크기 가져오기
packetSize =mpu.dmpGetFIFOPacketSize();
} else {
// ERROR!
// 1 =초기 메모리 로드 실패
// 2 =DMP 구성 업데이트 실패
// (중단될 경우 일반적으로 코드 1)
Serial.print(F("DMP 초기화 실패(코드 "));
Serial.print(devStatus);
Serial.println(F(")"));
}
// 출력용 LED 구성
pinMode(bt,INPUT);
}
// ==================================================================
// ===메인 프로그램 루프 ===
// ===========================================================================================
void 루프() {
if(digitalRead(bt)==HIGH)
{
x++;
delay(150);
}
if((x%2)==0) {
// 프로그래밍이 실패하면 아무 것도 시도하지 마십시오.
if (!dmpReady) return;
// MPU 인터럽트 또는 사용 가능한 추가 패킷을 기다립니다.
동안(!mpuInterrupt &&fifoCount // 기타 프로그램 동작 항목은 여기
// .
// .
// .
// 편집증이 심한 경우 자주 테스트할 수 있습니다. other
// 사이에 mpuInterrupt가 true인지 확인하고, 그렇다면 "break;"
// while() 루프에서 MPU 데이터
//를 즉시 처리합니다.
// .
// .
}
// 인터럽트 플래그를 재설정하고 INT_STATUS 바이트 가져오기
mpuInterrupt =false;
mpuIntStatus =mpu.getIntStatus( );
// 현재 FIFO 카운트 가져오기
fifoCount =mpu.getFIFOCount();
// 오버플로 확인(코드가 너무 비효율적이지 않는 한 발생해서는 안 됨)
if ((mpuIntStatus &0x10) || fifoCount ==1024) {
// 깔끔하게 계속할 수 있도록 재설정
mpu.resetFIFO();
Serial.println(F("FIFO overflow!"));
// 그렇지 않으면 DMP 데이터 준비 인터럽트를 확인합니다(자주 발생해야 함)
} else if (mpuIntStatus &0x02) {
// 사용 가능한 올바른 데이터 길이를 기다리며 매우 짧게 기다려야 합니다.
while (fifoCount // FIFO에서 패킷 읽기
mpu.getFIFOBytes(fifoBuffer, packetSize);
// 여기에서 FIFO 카운트 추적 사용 가능한 패킷이 1개 이상인 경우
//(인터럽트를 기다리지 않고 즉시 더 많은 것을 읽을 수 있음)
fifoCount -=packetSize;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
// display 오일러 각도(도)
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
직렬 .print("ypr\t");
Serial.print(ypr[0] * 180/M_PI);
Serial.print("\t");
Serial.print( ypr[1] * 180/M_PI);
시리얼 .print("\t");
Serial.println(ypr[2] * 180/M_PI);
if((ypr[1] * 180/M_PI)<=-25)
{BTSerial.write('F');
}
else if((ypr[1] * 180/M_PI)>=25)
{BTSerial.write('B' );
}
else if((ypr[2] * 180/M_PI)<=-25)
{BTSerial.write('L');
}
else if((ypr[2] * 180/M_PI)>=20)
{BTSerial.write('R');
}
else{
BTSerial. write('S');
}
#endif
}
}
else{
BTSerial.write('S');
}
}

차량 유닛에 슬레이브 블루투스 모듈을 삽입하고 원격 유닛에 블루투스 모듈을 마스터합니다. 모든 작업이 완료되었습니다.

전원을 켜면 재생할 준비가 됩니다........



이 정보가 유용하기를 바랍니다. 예, 좋아하고 공유하고 의심을 댓글로 남겨주세요. 더 많은 프로젝트를 원하시면 저를 팔로우하세요! 내 작업을 지원하고 YouTube에서 내 채널을 구독하세요.

감사합니다!

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

코드

<울>
  • 제스처 제어 로봇(원격 장치)
  • 제스쳐 제어 로봇(원격 장치)Arduino
    //Shubham Shinganapure에 의해 // 3/10/19에 수정된 프로그램. ////제스쳐 제어 로봇 자동차용(원격)#include "I2Cdev.h#include "MPU6050_6Axis_MotionApps20.h"//#include "MPU6050.h" // MotionApps 포함 파일을 사용하는 경우 필요하지 않음// Arduino Wire 라이브러리는 I2Cdev I2CDEV_ARDUINO_WIRE 구현//이 I2Cdev.h에서 사용되는 경우 필요 AD0 low =0x68(SparkFun 브레이크아웃 및 InvenSense 평가 보드의 기본값)// AD0 high =0x69MPU6050 mpu;#define OUTPUT_READABLE_YAWPITCHROLL// MPU 제어/상태 varsbool dmpReady =false; // DMP 초기화가 성공한 경우 true로 설정uint8_t mpuIntStatus; // MPUuint8_t의 실제 인터럽트 상태 바이트를 보유합니다. devStatus; // 각 장치 작업 후 상태 반환 (0 =성공, !0 =오류)uint16_t packetSize; // 예상 DMP 패킷 크기(기본값은 42바이트) uint16_t fifoCount; // 현재 FIFOuint8_t에 있는 모든 바이트 수 fifoBuffer[64]; // FIFO 저장 bufferVectorFloat 중력; 쿼터니언 q; 부동 ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll 컨테이너 및 중력 vectoruint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };휘발성 부울 mpuInterrupt =false; // MPU 인터럽트 핀이 highvoid인지 여부를 나타냅니다. dmpDataReady() { mpuInterrupt =true;}#include  SoftwareSerial BTSerial(10, 11); // 수신 | TXint bt=8;int x =1;void setup() { #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24; // 400kHz I2C 클럭(CPU가 8MHz인 경우 200kHz) #elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // 직렬 통신 초기화 // (115200은 Teapot Demo 출력에 필요하기 때문에 선택되지만 // 실제로는 프로젝트에 따라 다릅니다.) Serial.begin(115200); BTSerial.begin(38400); // 동안(!직렬); // Leonardo 열거를 기다립니다. 나머지는 즉시 계속됩니다.Serial.println(F("Initializing I2C devices...")); mpu.initialize(); // 연결 확인 Serial.println(F("장치 연결 테스트 중...")); Serial.println(mpu.testConnection() ? F("MPU6050 연결 성공") :F("MPU6050 연결 실패")); // 준비가 될 때까지 기다립니다. // DMP를 로드하고 구성합니다. Serial.println(F("Initializing DMP...")); devStatus =mpu.dmpInitialize(); // 여기에 최소 감도에 맞게 조정된 자체 자이로 오프셋을 제공합니다. mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 작동하는지 확인합니다(그렇다면 0 반환) if ​​(devStatus ==0) { // 준비가 되었기 때문에 DMP를 켭니다. Serial.println(F("DMP 활성화...")); mpu.setDMPEnabled(참); // 아두이노 인터럽트 감지 활성화 Serial.println(F("인터럽트 감지 활성화 (Arduino 외부 인터럽트 0)...")); attachInterrupt(0, dmpDataReady, 상승); mpuIntStatus =mpu.getIntStatus(); // 메인 loop() 함수가 그것을 사용해도 괜찮다는 것을 알 수 있도록 DMP Ready 플래그를 설정합니다. Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady =참; // 나중의 비교를 위해 예상 DMP 패킷 크기를 얻습니다. packetSize =mpu.dmpGetFIFOPacketSize(); } else { // 오류! // 1 =초기 메모리 로드 실패 // 2 =DMP 구성 업데이트 실패 // (중단될 경우 일반적으로 코드는 1이 됩니다.) Serial.print(F("DMP Initialization failed (code ")); Serial. print(devStatus); Serial.println(F(")")); } // 출력용 LED 구성 pinMode(bt,INPUT); }// ==================================================================// ===메인 프로그램 루프 ===// =====================================================================무효 루프() { 경우 (디지털 읽기(bt)==높음) { x++; 지연(150); } if((x%2)==0){ // 프로그래밍이 실패하면 아무 것도 시도하지 마십시오. if (!dmpReady) return; // MPU 인터럽트 또는 사용 가능한 추가 패킷을 기다립니다. while (!mpuInterrupt &&fifoCount =25) {BTSerial.write('B'); } else if((ypr[2] * 180/M_PI)<=-25) {BTSerial.write('L'); } else if((ypr[2] * 180/M_PI)>=20) {BTSerial.write('R'); } else{ BTSerial.write('S'); } #endif } } else{ BTSerial.write('S'); }}

    회로도


    제조공정

    1. Arduino+Raspberry Pi 로봇 플랫폼을 만드는 방법
    2. 집에서 DIY 숙제 작성 기계 만들기
    3. 서보 모터로 로봇을 피하는 장애물
    4. 라인 팔로워 로봇
    5. 사용자 정의 가능한 펀치 키보드 버튼을 만드는 방법
    6. 자율 홈 어시스턴트 로봇
    7. Arduino로 음악을 만드는 방법
    8. Arduino 기반 자동 문 열림을 만드는 방법
    9. Android 앱으로 Arduino 로봇 팔 제어
    10. 멋진 실내 내비게이션용 로봇