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

DIY Arduino 로봇 팔 – 손 제스처로 제어

구성품 및 소모품

Arduino UNO
× 1
JLCPCB 맞춤형 PCB
× 1
서보 모터, MG996R
× 6
5V 배터리 팩
× 1
국가 제어 장치 PCA9685 8-채널 8W 12V FET 드라이버 비례 밸브 I2C 인터페이스가 있는 컨트롤러
× 1
HC-05 블루투스 모듈
× 2
SparkFun 스테퍼 모터 드라이버 보드 A4988
× 1
NEMA-17 스테퍼 모터
× 1
브레드보드(일반)
× 1
관성 측정 단위(IMU)(6도 자유도)
× 1
Arduino Nano R3
× 1
플렉스 센서
× 1

필요한 도구 및 기계

3D 프린터(일반)

이 프로젝트 정보

인간의 제스처로 제어되는 DIY 로봇 팔을 소개합니다.

퍼시픽 림(Pacific Rim), 아바타(Avatar) 및 기타 공상 과학 영화와 같은 블록버스터 영화는 로봇과 시너지 효과를 낼 수 있는 능력을 암시합니다. 로봇 지원으로 움직임이 향상될 수 있습니다.

동일한 산업용 로봇을 더 작은 규모로 만들 수 있다면 어떨까요?

이 프로젝트는 이를 달성하기 위한 시도입니다.

이것은 손 제스처로 프로그래밍하거나 제어할 수 있는 Arduino 로봇 암입니다.

Iron man의 슈트 컨벤션에 충실하면서 각 반복은 Mark로 알려질 것입니다. 이 프로토타입은 MARK 1으로 알려질 것입니다. 우리는 원래 로봇 팔을 개선하기 위해 더 많은 반복을 기대할 수 있습니다.

여기에서 전체 DIY 로봇 팔(손 제스처로 제어) 자습서 보기

개요

이 튜토리얼에서는 Robotic Glove를 사용하여 손 제스처로 제어되는 6축 로봇을 구축합니다. 그리고 손가락을 꼬집거나 손목을 왼쪽으로 돌리는 것과 같은 자연스러운 인간 제스처를 모방하여 로봇 팔을 각각 왼쪽과 오른쪽으로 열거나 닫거나 회전할 수 있습니다. 사실상 로봇 팔을 수동으로 제어하는 ​​것입니다.

원본 기사에 대한 자세한 내용 찾기

마크 1 기능:

<울>
  • 6축 회전
  • 휴대용
  • 인간의 제스처로 로봇 제어
  • 기본 기능을 수행하도록 사전 프로그래밍 가능
  • 원거리에서 무선으로 제어 가능
  • 하중 무게 600g(최대 하중 1kg)을 견딜 수 있습니다.
  • 부품 목록

    로봇 팔은 완전히 사용자화할 수 있습니다. 직접 구입하거나 직접 3d 프린트할 수 있습니다. 3D 프린팅을 선택하면 걱정할 필요가 없습니다. 서보 모터를 사용하는 다양한 로봇 목록이 있으므로 우리가 만들고 있는 이론이 여전히 적용됩니다.

    이 프로젝트의 경우 이 프로토타입(Mark 1)은 맞춤 부품을 만들 수 있는 더 많은 공간을 제공하므로 3D로 인쇄됩니다.

    로봇 팔: Thingiverse 3D 인쇄 로봇 팔(크레딧:Wonder Tiger):

    <울>
  • 1부:그리퍼 부품
  • 2부:베이스 및 턴테이블
  • 3부:로봇 코어 암
  • 위 부품의 나사 유형과 함께 이 빌드에 대한 자세한 정보를 찾을 수 있습니다. 인쇄에 걸리는 시간은 최대 40시간입니다. 그러나 이것은 로봇 팔 구입 비용을 절감합니다.

    로봇 장갑 : Robotic Glove.STL 파일(크레딧:Roman 13)

    Robotic Glove는 프로젝트에 미학적으로 추가되었지만, Robotic Arm을 구현하기 위해 빌더 장갑을 사용할 수도 있습니다.

    참고: 더 큰 손의 경우 105% 비율로 인쇄

    작동 방식

    전반적으로 우리는 Robotic Glove에서 서보 모터로 신호(Bluetooth를 통해)를 보내고 있습니다. 값이 수신되면 서보 드라이버는 로봇 팔을 움직이는 특정 서보 모터에 신호를 보냅니다.

    이제 여러 개의 서보와 더 많은 센서를 추가하면 각 모터를 제어할 수 있습니다. `

    로봇 팔을 서로 조정하여 기능을 수행하는 일련의 서보 모터로 생각하면 로봇 장갑으로 제어되는 로봇 팔을 만들 수 있습니다.

    Robotic Glove의 Arduino는 센서를 사용하여 Robotic Arm Arduino와 통신하고 데이터를 전송하여 Servo를 원하는 각도로 이동합니다.

    로봇 장갑은 어떤 센서를 사용하나요?

    MARK 1의 경우 Flex Sensor와 가속도계(MPU6050)를 사용합니다.

    <울>
  • 플렉스 센서 – 이 플라스틱 조각의 구부러진 정도에 따라 저항이 변경되어 전류에 영향을 줍니다. 이 측정값은 손의 움직임 변화를 감지하는 데 사용됩니다.
  • 가속도계 – 보다 자연스러운 제스처를 위해 가속도계가 팔과 손목 회전의 변화를 감지할 수 있습니다.
  • 우리는 이러한 센서를 사용하여 제스처의 변화를 감지하고 있습니다. 그런 다음 Bluetooth를 통해 서보 모터를 제어하기 위해 제스처에 매핑된 특정 값을 Robotic Arm에 보낼 수 있습니다. 그리고 충분한 제스처를 취하면 로봇 팔이 살아납니다!

    로봇 팔 매핑

    다음은 Glove가 Robotic Arm으로 보내는 값의 mapping table을 나타낸 것이다. 이것은 원본 기사에서 찾을 수 있습니다. 각각의 기능을 특성화하는 키가 있습니다. (P – 핑키, L – 오른쪽 등)

    참고: 대문자 "F"(손가락) 서보 모터 스핀의 반대 방향을 나타냅니다.

    부품 조립

    로봇 팔 – 조립

    로봇 팔을 구입하는 것은 꽤 비쌀 수 있습니다. 예산 내에서 이 로봇 팔을 유지하려면 로봇 팔을 3D 프린팅하는 것이 가장 좋은 선택이었습니다.

    이는 사용자 정의할 수 있는 3D 인쇄 로봇 팔의 예가 많기 때문에 장기적으로 도움이 됩니다. 예를 들어 LED 추가, 카메라 스탠드 클램프 만들기:

    앞서 언급했듯이 로봇 팔은 Thingyverse의 로봇 팔을 모델로 했습니다. 6축을 제공하고 문서화되어 있으며 강도/견고함을 제공하는 우수한 설계였기 때문에 이 예를 선택했습니다. 부품 목록에서 Wonder Tiger의 로봇 팔에 액세스할 수 있습니다.

    로봇 팔 카메라 스탠드에 대한 내 리믹스도 찾을 수 있습니다. 향후 릴리스에서 이에 대해 자세히 다룰 것입니다. 그러나 부품을 수집하는 데 모든 부품을 인쇄하는 데 최소 40시간이 걸릴 수 있습니다.

    다른 많은 Robotic Arm 3D Printed 대안도 찾을 수 있습니다.

    서보 모터 및 드라이버 소개

    로봇 팔이 이상적으로는 함께 조정하는 일련의 모터라는 점을 감안할 때 이론적으로 Arduino에서 전원을 공급할 수 있는 여러 모터를 연결할 수 있습니다. 이 프로젝트에서는 PCA9685 서보 드라이버를 사용하여 MG966R 서보에 전원을 공급할 것입니다.

    참고: 각 모터에 전원을 공급할 때는 외부 전원을 사용하십시오. Arduino는 모든 모터를 제어하기에 충분한 전력을 공급할 수 없습니다. 이 프로젝트에서는 5V, 2200mAh RC 배터리를 사용했습니다.

    Arduino 다이어그램 배선은 다음과 같아야 합니다.

    기본 회전용 NEMA-17

    Robotic이 약간의 무게를 늘리기 시작했고 MG966R 서보 모터가 로봇 팔을 베이스에서 회전시킬 만큼 강력하지 않았기 때문입니다. 로봇 팔을 회전시키려면 서보 모터보다 더 강력한 모터를 사용해야 합니다.

    정밀하고 높은 토크로 인해 스테퍼 모터(NEMA-17)를 사용할 수 있어 로봇 팔이 제스처 제어에 원활하게 회전할 수 있습니다.

    모터의 방향을 제어하는 ​​데 사용되는 NEMA-17 및 A4988 드라이버는 아래 다이어그램에서 확인할 수 있습니다.

    마지막으로 다음 다이어그램은 완전한 Robotic Arm의 최종 배선 다이어그램 어셈블리를 보여줍니다.

    회로 조립

    아래 배선도는 Bluetooth 모듈을 포함하여 Robotic arm을 만들기 위한 모든 전자 부품의 최종 조립을 보여줍니다. 아래에서 페어링 프로세스를 다룹니다.

    휴먼 플렉스 센서

    Robotic Arm의 미학에 충실하기 위해 3D Printed Exoskeleton Gauntlet을 인쇄하여 Robotic Glove로 사용할 수 있습니다.

    그러나 표준 건축가의 장갑을 사용할 수 있습니다. 로봇 장갑을 프로토타이핑하기 위해. 이 '로봇 장갑 외골격' 디자인은 로봇 팔의 디자인과 잘 어울렸습니다.

    로봇 장갑은 다음 구성요소로 구성됩니다.

    <울>
  • 플렉스 센서 – 손가락의 구부러짐에 따라 모터에 신호를 보내는 데 사용할 수 있는 전류 변경
  • 가속도계(MPU6050 ) – X, Y, Z 평면에서 인간의 제스처를 매핑하여 모터를 제어할 수 있습니다.
  • LED – 사람의 제스처 제어가 Arduino로 전송되면 LED가 켜집니다.
  • 블루투스(HC-05) 모듈 – Robotic Arm HC-05 수신기로 데이터 전송
  • 아두이노 나노 – 마이크로컨트롤러는 로봇 장갑의 두뇌 역할을 합니다.
  • 다음 다이어그램은 플렉스 센서와 가속도계를 테스트하는 데 유용합니다.

    중요: 로봇 팔은 로봇 장갑이 제어하는 ​​만큼만 정확하므로 이 작업을 제대로 수행할 가치가 있습니다.

    블루투스 구성(마스터 및 수신기)

    Arduino Robotic Arm은 HC-05 모듈을 사용하여 Bluetooth를 통해 통신합니다. 아래에서 중요한 정보를 강조 표시합니다.

    모듈

    구성

    로봇 장갑 HC-05 마스터 로봇 팔 HC-05 슬레이브

    참고:

    전송 속도는 4800으로 설정됩니다.

    Arduino 프로그래밍

    아래에서 다음 코드를 다운로드할 수 있습니다.

    참고: 다른 모든 테스트 코드와 최신 버전은 Arduino Robotic Arm Git Repo

    에서 찾을 수 있습니다.

    로봇 팔 프로그래밍

    로봇 팔 코드는 HCPCA9685 라이브러리(서보 드라이버용)를 사용합니다. 이런 식으로 우리는 Arduino에 의해 모두 제어되는 여러 서보 모터에 전원을 공급할 수 있습니다. 코드에서 이 라이브러리를 추가하고 서보 변수를 선언하는 것으로 시작할 수 있습니다.

    다음 변수는 이전/증분을 찾고 서보의 현재 위치를 가져오는 데 사용됩니다.

    * HCPCA9685 라이브러리 포함 */
    #include "HCPCA9685.h"
    /* 장치/모듈의 I2C 슬레이브 주소. HCMODU0097의 경우 기본 I2C 주소는
    0x40입니다. */
    #define I2CAdd 0x40
    /* 라이브러리 인스턴스 생성 */
    HCPCA9685 HCPCA9685(I2CAdd);
    //모터의 초기 주차 위치
    const int servo_joint_L_parking_pos =60;
    //로봇 서보 감도의 정도 - Intervals
    int servo_joint_L_pos_increment =20;
    //Keep track of 모터 위치의 현재 값
    int servo_joint_L_parking_pos_i =servo_joint_L_parking_pos;
    //서보 모터의 최소 및 최대 각도
    int servo_joint_L_min_pos =10;
    int servo_joint_L_max_pos =180;

    블루투스 통신을 시작하려면 직렬 포트를 Baud Rate 4800으로 초기화하십시오.

    Serial.begin(4800); // 블루투스 모듈의 기본 통신 속도 초기화 

    loop() 섹션에서 우리는 로봇 장갑에서 오는 데이터가 있는지 지속적으로 확인하고 있습니다. 참이면 들어오는 데이터를 '상태' 변수에 저장합니다. 그리고 주어진 캐릭터에 따라 이것을 사용하여 모터를 움직일 것입니다.

    다음 섹션에서는 코드를 간략하게 설명합니다.

    Robotic Arm 코드는 인간의 움직임을 시뮬레이션하기 위해 함께 작동하는 일련의 서보 모터로 볼 수 있습니다. 코드는 동일하며 Servo는 Bluetooth 값에 따라 Servo Driver에 의해 구동됩니다.

    //서보 드라이버를 정의합니다. 0x40 주소는 기본 I2C 주소입니다.
    #define I2CAdd 0x40
    int response_time =5; //Robotic Glove 간격에서 값 수신
    // 데이터가 직렬 포트에서 오는지 확인

    if (Serial.available()> 0) {
    state =Serial .읽다(); // 직렬 포트에서 데이터를 읽습니다.
    Serial.print(state); // 보낸 값을 출력합니다.
    //모터 기능 코드 블록
    }

    현재 '상태 값'을 기준으로 서보 드라이버는 해당 모터에 신호를 보냅니다.

    예를 들어 손가락을 구부리면. 값 'f'는 로봇 장갑(Bluetooth를 통해)에서 전송되어 로봇 팔이 이 데이터를 읽고 각 서보 모터를 회전시키는 기능을 트리거합니다. 이 과정을 무한 루프로 반복합니다.

    if (Serial.available()> 0) { // 시리얼 포트에서 데이터가 들어오는지 확인
    state =Serial.read(); // 직렬 포트에서 데이터를 읽습니다.
    Serial.print(state); // 보낸 값을 출력합니다.
    //모터의 이름은 / tutorial 참조
    //Move (Base Rotation) Stepper Motor Left
    if (state ==' S') {
    baseRotateLeft();
    지연(response_time);
    }
    }

    참고: 이 코드는 모터 기어가 벗겨질 수 있는 최대 각도를 초과하는 모터를 중지하기 위해 강제 정지를 구현합니다.

    <사전><코드>HCPCA9685.Servo(0,servo_joint_L_parking_pos_i); // 채널 0에서 서보 모터를 원하는 각도로 구동합니다.
    //클로 모터를 아래쪽으로 이동
    if (state =='f') {
    if (servo_joint_3_parking_pos_i }
    무효 baseRotateLeft() {
    digitalWrite(stepPin, LOW); //HIGH, LOW를 기준으로 방향 회전
    delayMicroseconds(stepDelay); //스테퍼 모터의 속도 변경
    }

    서보 모터의 값이 최대 회전보다 작으면 계속 회전합니다. 최대 회전 180도에 도달하면 중지합니다.

    servo_joint_3_parking_pos_i  

    여기서 servo_joint_3_max_pos는 모터의 최대 위치입니다.

    참고: 이 코드는 모터 기어가 벗겨질 수 있는 최대 각도를 초과하는 모터를 막기 위해 강제 정지를 구현합니다.

    플렉스 센서 프로그래밍

    Robotic Arm 코드는 GitHub에서 찾을 수 있습니다. 프로젝트에서 작업하는 경우 Git Repo에 자신의 버전을 제공합니다. 이것은 로봇 팔의 다양한 버전과 기능에 대한 색인을 구축하는 데 도움이 될 것입니다.

    코드는 이미 문서화되었습니다(Git에서도 사용 가능). 그러나 다음과 같은 핵심 사항을 다룰 것입니다.

    5개의 센서를 정의하겠습니다.

    //LED ON PIN 3
    int pinkie_Data =A1;
    int finger_Data =A2;
    int thumb_Data =A3;
    //const int MPU_addr =0x68;
    상수 정수 MPU2 =0x69, MPU1 =0x68;

    참고: 0x68 및 0x69는 2개의 MPU6050 가속도계의 I2C 주소를 나타냅니다.

    //로봇 암에 값을 보내는 빈도
    int response_time =1000;

    다음 코드는 센서 값을 읽는 Arduino를 간략하게 설명합니다.

    // Flex Sensor에서 Arduino로 값 읽기
    pinkie =analogRead(pinkie_Data);
    finger =analogRead(finger_Data);
    thumb =analogRead(thumb_Data);

    가속도계의 현재 위치 읽기:

    GetMpuValue1(MPU1);
    GetMpuValue2(MPU2);

    값 보정:

    다음 코드는 Flex 센서의 상한 및 하한을 찾기 위해 보정합니다. 플렉스 글러브를 다시 보정하려면 Arduino의 재설정 버튼을 누르십시오.

    if (bool_caliberate ==false ) {
    delay(1000);
    thumb_high =(thumb * 1.15);
    thumb_low =(thumb * 0.9);
    손가락 높이 =(손가락 * 1.03);
    손가락 낮은 =(손가락 * 0.8);
    핑키 높은 =(핑키 * 1.06);
    핑키 낮은 =(핑키 * 0.8);
    bool_caliberate =참;
    }

    현재 값이 보정을 기반으로 정의된 플렉스의 상한 또는 하한을 초과했는지 지속적으로 확인합니다. 플렉스 센서가 이 값보다 높거나 낮으면 데이터가 로봇 팔로 전송되어 특정 서보 모터를 특정 방향으로 이동시킵니다.

    // finger 1 - Claw Bend/Open
    if (finger>=finger_high) {
    Serial.print("F");
    delay(response_time);
    }
    if (손가락 <=finger_low) {
    Serial.print("f");
    delay(response_time);
    }

    로봇 암 프로그래밍

    결과 – 성과

    로봇 팔은 물체를 움직일 만큼 정확합니다. 그러나 복잡한 물체를 옮기거나 인간의 손재주에 대해 '백만 년 이상'과 경쟁하려면 약간의 작업이 필요합니다 ... 코드 작업에 더 많은 시간을 할애하더라도 로봇의 정밀도는 MARK 1i에서 의도한 대로 작동할 수 있습니다. . 팔은 개선될 수 있지만 크게 개선될 수 있습니다.

    코드를 개선하려면 Arduino Robot Arm Git 저장소 팔을 만드세요. 다른 사람들이 이를 기반으로 할 수 있도록 공개합시다!

    마지막으로 손짓을 통해 로봇을 제어하고 로봇을 프로그래밍하여 기본 작업을 자동화할 수도 있습니다.

    다음 단계

    그리고 그것이 MARK 1 여러분을 위한 것입니다! 이 프로젝트를 원하신다면 제 Patreon 페이지를 지원하는 것을 고려해 보세요.

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

    코드

    <울>
  • 코드 스니펫 #1
  • 코드 스니펫 #3
  • 코드 스니펫 #4
  • 코드 스니펫 #5
  • 코드 스니펫 #7
  • 코드 스니펫 #11
  • 코드 스니펫 #12
  • 코드 스니펫 #1일반 텍스트
    * HCPCA9685 라이브러리 포함 */#include "HCPCA9685.h"/* 장치/모듈에 대한 I2C 슬레이브 주소. HCMODU0097의 경우 기본 I2C 주소는 0x40입니다. */#define I2CAdd 0x40/* 라이브러리 인스턴스 만들기 */HCPCA9685 HCPCA9685(I2CAdd);//motorconst의 초기 주차 위치 int servo_joint_L_parking_pos/Degree of servo =60;/ 감도 - Intervalsint servo_joint_L_pos_increment =20;//모터 위치의 현재 값을 추적 int servo_joint_L_parking_pos_i =servo_joint_L_parking_pos;//서보 모터의 최소 및 최대 각도int servo_joint_L_min_pos =10;int servo_joint_1_8 
    코드 스니펫 #3일반 텍스트
    //서보 드라이버를 정의합니다. 0x40 주소는 기본 I2C 주소입니다.#define I2CAdd 0x40 int response_time =5; //Robotic Glove 간격에서 값 수신// 데이터가 직렬 포트에서 오는지 확인 if (Serial.available()> 0) { state =Serial.read(); // 직렬 포트에서 데이터를 읽습니다. Serial.print(state); // 전송된 값을 출력합니다. //모터 기능 코드 블록}
    코드 스니펫 #4일반 텍스트
    if (Serial.available()> 0) { // 시리얼 포트에서 데이터가 들어오는지 확인 state =Serial.read(); // 직렬 포트에서 데이터를 읽습니다. Serial.print(state); // 전송된 값을 출력합니다. //모터의 이름은 기사 / 튜토리얼을 참조하십시오. //Move (Base Rotation) Stepper Motor Left if (state =='S') { baseRotateLeft(); 지연(응답 시간); }}
    코드 스니펫 #5일반 텍스트
    HCPCA9685.Servo(0,servo_joint_L_parking_pos_i); // 채널 0에서 서보 모터를 원하는 각도로 구동합니다. // 클로 모터를 아래쪽으로 이동 if (state =='f') { if (servo_joint_3_parking_pos_i  
    코드 스니펫 #7일반 텍스트
    //LED ON PIN 3int pinkie_Data =A1;int finger_Data =A2;int thumb_Data =A3;//const int MPU_addr =0x68;const int MPU2 =0x69, MPU1 =0x68;
    코드 스니펫 #11일반 텍스트
    <사전> if (bool_caliberate ==false ) { delay(1000); thumb_high =(엄지손가락 * 1.15); thumb_low =(엄지손가락 * 0.9); finger_high =(손가락 * 1.03); finger_low =(손가락 * 0.8); pinkie_high =(핑키 * 1.06); pinkie_low =(핑키 * 0.8); bool_caliberate =참; }
    코드 스니펫 #12일반 텍스트
     // 손가락 1 - 클로 벤드/오픈 if (finger>=finger_high) { Serial.print("F"); 지연(응답 시간); } if (finger <=finger_low) { Serial.print("f"); 지연(응답 시간); }
    깃허브
    http://github.com/EbenKouao/arduino-robot-armhttp://github.com/EbenKouao/arduino-robot-arm
    깃허브
    https://github.com/EbenKouao/arduino-robotic-armhttps://github.com/EbenKouao/arduino-robotic-arm

    맞춤형 부품 및 인클로저

    싱기버스
    thingiverse.com 의 https://www.thingiverse.com/thing:1748596CAD 파일
    싱기버스
    thingiverse.com 의 https://www.thingiverse.com/thing:1750025CAD 파일
    싱기버스
    thingiverse.com 의 https://www.thingiverse.com/thing:1838120CAD 파일
    싱기버스
    thingiverse.com 의 https://www.thingiverse.com/thing:1982745CAD 파일

    회로도

    로봇 암 Git 저장소
    https://github.com/EbenKouao/arduino-robot-arm

    제조공정

    1. Bluetooth를 통해 제어되는 Raspberry Pi Robot
    2. 집에서 DIY 숙제 작성 기계 만들기
    3. Raspberry Motor Shield를 사용한 Android 제어 장난감
    4. 서보 모터로 로봇을 피하는 장애물
    5. 라인 팔로워 로봇
    6. Nunchuk 제어 로봇 팔(Arduino 포함)
    7. 음성 제어 로봇
    8. 이더넷을 통해 제어되는 로봇 암
    9. MobBob:Android 스마트폰으로 제어되는 DIY Arduino 로봇
    10. 멋진 실내 내비게이션용 로봇