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

제스쳐 컨트롤 로봇

구성품 및 소모품

Arduino UNO
× 1
Arduino Nano R3
× 1
RF-433 송신기 수신기
× 1
HT12 인코더 및 디코더
× 1
Adafruit 아날로그 가속도계:ADXL335
× 1
Uno용 모터 실드
× 1
DC 모터(일반)
× 1

필요한 도구 및 기계

납땜 인두(일반)

이 프로젝트 정보

제스처 제어 로봇은 취미 생활자와 학생들이 물리적이고 실용적인 프로젝트에서 마이크로 컨트롤러 지식을 이해하고 구현하기 위해 만든 가장 일반적인 유형의 프로젝트 중 하나입니다. 그 이면의 개념은 간단합니다. 손바닥의 방향이 로봇 자동차의 움직임을 제어합니다. 어떻게 그렇게 합니까? 분해해 봅시다.

이해를 돕기 위해 각 구성 요소의 역할과 기능을 이해하고 결합하여 원하는 성능을 달성하도록 하겠습니다.

1. ADXL335(가속도계)

가속도계의 기능은 간단합니다. 손목의 방향을 감지하는 것입니다. 가속도계는 중력 'g'로 인한 가속도를 포함한 가속도를 측정합니다. 따라서 아래 그림과 같이 ADXL335의 특정 축에서 'g'의 구성 요소를 측정하여 가속도계를 사용하여 손목의 방향을 감지할 수 있습니다.

손의 기울기로 인해 수직 변화에 따른 X 및/또는 Y 축' 각도와 그에 따른 'g' 가속도의 구성 요소도 이에 작용하여 측정할 수 있으므로 손의 방향을 나타냅니다.

ADXL335는 최대 3g의 가속도를 측정할 수 있으며 축 핀을 Arduino의 아날로그 핀에 연결하여 Arduino와 인터페이스합니다. 가속도계는 가속도에 비례하는 전압 값을 출력합니다.

이 프로젝트에서 가속도계는 Arduino Nano에 연결되어 손바닥에 부착됩니다. ADXL335는 0 ~ Vcc(인가 전압 일반적으로 3.3V) 범위의 전압을 출력하며 Arduino의 아날로그 핀으로 읽습니다. 따라서 사용자의 경우 0에서 1024(10비트 ADC) 범위의 값을 얻습니다. 다른 방향은 각 축에 대해 다른 아날로그 값을 생성한 다음 다른 로봇 움직임에 매핑됩니다.

가속도계의 회로도는 다음과 같습니다.

ADXL335의 동작을 이해하기 위한 테스트 코드는 다음과 같습니다.

<사전><코드> 무효 설정(){ pinMode(A0,INPUT); //x축은 A0에 연결되어 있음 pinMode(A1,INPUT); //y축은 A1에 연결되어 있음 pinMode(A2,INPUT); //z축은 A2Serial.begin(9600)에 연결됨; //시리얼 모니터에 데이터를 출력하려면}void loop(){ Serial.print(" X="); Serial.println(analogRead(A0)); Serial.print(" Y="); Serial.println(analogRead(A1)); Serial.print(" Z="); Serial.println(analogRead(A2)); 지연(1000);}

이 프로그램을 실행하여 최종적으로 로봇을 제어하는 ​​데 사용할 손바닥과 손목의 앞, 뒤, 왼쪽 및 오른쪽 기울기에 대해 어떤 값을 얻었는지 확인할 수 있습니다.

2. RF-433 송신기 및 수신기

RF 모듈의 기능은 간단합니다. 손목 Arduino Nano에서 Arduino Uno를 제어하는 ​​모터로 명령 데이터를 전송하는 것입니다. RF 모듈은 433hz 주파수의 전파를 사용하므로 이름이 RF-433입니다. 그들은 데이터를 보내기 위해 진폭 변조를 사용하지만 많은 기술을 다루지 않고 일을 단순하게 유지하면서 로봇에 명령을 전송하는 데 사용됩니다. 즉, 앞으로, 뒤로, 오른쪽 또는 왼쪽으로 이동합니다. 그리고 데이터가 없는 경우에는 가만히 있으십시오. 그들은 최대 10미터 범위에서 잘 작동합니다.

이제 우리 프로젝트에서 RF 모듈을 구현하는 방법을 이해하기 위해 송신기 및 수신기 회로를 순차적으로 작업해 보겠습니다.

송신기 회로

송신기 회로는 송신기 RF와 인코더 HT12E의 두 부분으로 구성됩니다. 송신기는 1개의 데이터 핀, 1개의 안테나, 1개의 접지 및 전원으로 구성됩니다. 송신기에 데이터를 제공하는 것은 HT12E 인코더의 작업입니다. 인코더는 데이터를 보낼 수 있는 4개의 데이터 핀으로 구성됩니다. 이 4개의 데이터 핀을 사용하여 4개의 동작을 나타내며 이 핀의 HIGH는 4개의 동작 중 하나를 나타내고 모두의 LOW는 정지 상태를 나타냅니다.

회로도는 다음과 같습니다.

왼쪽 핀(A0-A7)은 주소 핀이며 데이터를 교환할 쌍을 정의합니다(동일한 주소를 가진 송신기와 수신기는 데이터만 공유합니다). A0-A7을 LOW(접지)로 설정합니다.

데이터 입력 핀은 Arduino 디지털 핀(이 프로젝트에서는 6~9)에 연결되며 다음과 같이 명령 데이터를 출력합니다.

디지털 핀 명령(HIGH일 때)

9 앞으로

10 반전

11 왼쪽

12 오른쪽

필요한 동작을 수행하기 위해 ADXL335의 입력을 기반으로 디지털 핀을 HIGH로 digitalWrite합니다.

수신기 회로

수신기 회로는 표시된 것과 같이 송신기 회로와 완전히 유사하지만 Arduino에서 출력으로 가는 데이터 핀 대신 이 경우 Arduino Uno에 대한 명령을 받아들이고 필요에 따라 모터를 실행하기 위해 입력으로 읽힙니다.

단순화하기 위해, 송신기와의 적절한 연결을 나타내기 위해 표시된 것과 같이 복잡한 회로 대신 1K 저항을 사용하여 핀 17에서 LED를 직렬로 연결할 수 있습니다.

3. 모터 쉴드

모터 실드는 Adafruit 라이브러리 AFMotor의 가용성으로 인해 처리하기 가장 쉬운 부분입니다. 링크:- https://github.com/adafruit/Adafruit-Motor-Shield-library

프로그램 스케치에 포함할 수 있도록 Arduino 라이브러리 폴더에 라이브러리를 다운로드하고 복사합니다.

AFMotor 라이브러리의 예는 다음과 같습니다.

#include AF_DCMotor motor(4);//shieldvoid setup() { Serial.begin(9600); // 9600bps로 직렬 라이브러리를 설정합니다. Serial.println("모터 테스트!"); // 모터를 켭니다. motor.setSpeed(200); motor.run(RELEASE);} 무효 루프() { uint8_t i; Serial.print("틱"); motor.run(앞으로); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10);} for (i=255; i!=0; i--) { motor.setSpeed(i); 지연(10);} Serial.print("토크"); motor.run(뒤로); for (i=0; i<255; i++) { motor.setSpeed(i); delay(10);} for (i=255; i!=0; i--) { motor.setSpeed(i); 지연(10);} Serial.print("기술"); 모터.런(릴리스); 지연(1000); 

4. 모든 것을 결합하기

마지막이자 마지막 부분은 위의 모든 부분을 함께 결합하여 손의 명령을 따르는 완전한 로봇을 형성하는 것을 포함합니다!

모터 실드는 거의 모든 디지털 핀을 사용하므로 Arduino Uno의 아날로그 핀을 사용하여 수신기 데이터를 읽습니다. 최종 회로도는 다음과 같습니다.

모터 실드는 모터 연결을 처리합니다. 9V 배터리를 쉴드의 전원 입력에 연결합니다.

참고:저는 개인적으로 2개 또는 심지어 3,9V 배터리를 쉴드 전원 입력에 병렬로 연결하여 4개의 모터를 모두 실행하기에 충분한 전력을 제공하는 것을 선호합니다. 2개의 그룹으로 4개의 모터를 연결했습니다(같은 면의 모터는 병렬로 연결되어 있으므로 모터 지점 3과 4만 실행하면 됨).

최종 코드

Arduino Nano의 경우:

int x_axis =0;int y_axis =0;int 앞으로 =9;int 뒤로 =10;int 오른쪽 =11;int 왼쪽 =12;void setup(){ pinMode(A0, INPUT); //X축 pinMode(A3, OUTPUT); //Y축 pinMode(정방향, OUTPUT); // 앞으로 이동하려면 HIGH pinMode(backward, OUTPUT); //HIGH로 뒤로 이동 pinMode(right, OUTPUT); //오른쪽으로 이동하려면 HIGH pinMode(left, OUTPUT); // 왼쪽으로 이동하려면 HIGH Serial.begin(9600);}void loop(){ x_axis =analogRead(A0); y_axis =analogRead(A3); Serial.print(" X ="); Serial.println(x_축); Serial.print(" Y ="); Serial.println(y_axis); if (y_axis>=390) { Serial.println("앞으로"); 디지털 쓰기(앞으로, 높음); } else { if (y_axis <=310) { Serial.println("BACK"); 디지털 쓰기(뒤로, 높음); } else { if (x_axis>=380) { Serial.println("오른쪽"); digitalWrite(오른쪽, 높음); } else { if (x_axis <=320) { Serial.println("LEFT"); 디지털 쓰기(왼쪽, 높음); } 직렬.println(" "); } } } 지연(200); if (x_축> 320 &&x_axis <380 &&y_axis> 310 &&y_axis <390) { digitalWrite(앞으로, 낮음); 디지털 쓰기(뒤로, 낮음); digitalWrite(오른쪽, 낮음); 디지털 쓰기(왼쪽, 낮음); }} 

Arduino Uno의 경우:

#includeAF_DCMotor motor_right(3);AF_DCMotor motor_left(4);int forward=0;int 후방=0;int right=0;int left=0;void setup() { 핀모드(A2,입력); 핀모드(A3,입력); 핀모드(A4,입력); 핀모드(A5,입력); Serial.begin(9600); motor_right.setSpeed(255); motor_left.setSpeed(255); motor_right.run(릴리즈); motor_left.run(RELEASE);} 무효 루프() { forward=digitalRead(A0); 뒤로=디지털읽기(A1); 오른쪽=디지털읽기(A2); 왼쪽=디지털읽기(A3); if(forward==HIGH) { motor_right.run(FORWARD); motor_left.run(FORWARD); Serial.println("앞으로"); } if(backward==HIGH) { motor_right.run(BACKWARD); motor_left.run(뒤로); Serial.println("역방향"); } if(right==HIGH) { motor_right.run(FORWARD); motor_left.run(RELEASE); Serial.println("오른쪽"); } if(left==HIGH) { motor_right.run(RELEASE); motor_left.run(FORWARD); Serial.println("왼쪽"); } if(left==LOW&&right==LOW&&forward==LOW&&backward==LOW) { motor_right.run(RELEASE); motor_left.run(RELEASE); } 지연(100);} 

사진과 동영상은 여기:


제조공정

  1. Arduino로 코인 억셉터 제어
  2. Arduino 제어 센터
  3. Bluetooth가 탑재된 Arduino로 LED 제어!
  4. 라인 팔로워 로봇
  5. 간단한 UNO 계산기
  6. Arduino 가습기 제어
  7. 음성 제어 로봇
  8. 시력의 지속성
  9. Arduino Uno 및 Bluetooth로 차량 제어
  10. Arduino Uno를 사용한 25kHz 4핀 PWM 팬 제어