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

Arduino를 사용한 간단하고 스마트한 로봇 팔

구성품 및 소모품

Arduino UNO
× 1
마이크로 서보
× 5
전위차계
× 5
브레드보드(일반)
× 1

이 프로젝트 정보

이 튜토리얼에서는 마스터 팔을 사용하여 제어할 간단한 로봇 팔을 만들 것입니다. 팔은 움직임을 기억하고 순서대로 재생합니다. 개념은 새롭지 않습니다. "Stoerpeak의 미니 로봇 팔"에서 아이디어를 얻었습니다. 오래전부터 만들고 싶었지만 당시 저는 완전히 멍청했고 프로그래밍에 대한 지식이 없었습니다. 이제 마침내 하나를 만들고 간단하고 저렴하게 유지하며 여러분 모두와 공유합니다.

그럼 시작하겠습니다....

1단계:필요한 것

다음은 필요한 것들의 목록입니다 :-

1. 서보 모터 x 5(Amazon Link)

2. 전위차계 x 5(Amazon Link)

3. 아두이노 우노. (아마존 링크)

4. 배터리. (저는 5v 어댑터를 사용하고 있습니다)

5. 브레드보드. (아마존 링크)

6. 판지/목재/썬보드/아크릴 구할 수 있거나 찾기 쉬운 것

그리고 Arduino IDE도 설치해야 합니다.

2단계:팔 만들기

여기에서 나는 팔을 만들기 위해 아이스 캔디 스틱을 사용했습니다. 사용 가능한 모든 재료를 사용할 수 있습니다. 그리고 더 나은 팔을 만들기 위해 다양한 기계적 디자인을 시도할 수 있습니다. 내 디자인은 그다지 안정적이지 않습니다.

나는 서보를 아이스 캔디 스틱에 붙이고 나사로 고정하기 위해 양면 테이프를 사용했습니다.

마스터 암의 경우 Popsicle 스틱에 전위차계를 붙이고 암을 만들었습니다.

사진을 참조하면 더 나은 아이디어를 얻을 수 있습니다.

베이스로 사용하는 A4 사이즈 캔버스 보드에 모든 것을 장착했습니다.

3단계:연결하기

이 단계에서 우리는 필요한 모든 연결을 만들 것입니다. 위의 그림을 참조하십시오.

<울>
  • 먼저 모든 서보를 전원 공급 장치에 병렬로 연결합니다(빨간색 와이어는 +ve로, 검은색 또는 갈색 와이어는 Gnd로)
  • 다음으로 신호선(예:노란색 또는 주황색)을 arduino의 PWM 핀에 연결합니다.
  • 이제 전위차계를 arduino의 +5v와 Gnd에 병렬로 연결합니다.
  • 가운데 단자를 ardunio의 Analog 핀에 연결합니다.
  • 여기에서 디지털 핀 3, 5, 6, 9 및 10은 서보 제어에 사용됩니다.

    아날로그 핀 A0 ~ A4는 전위차계의 입력에 사용됩니다.

    핀 3에 연결된 서보는 A0에 연결된 전위차계에 의해 제어됩니다.

    핀 5에 연결된 서보는 A1의 포트에 의해 제어되는 식입니다....

    참고:- Servo가 arduino로 구동되지 않더라도 서보의 Gnd를 arduino에 연결해야 합니다. 그렇지 않으면 arm이 작동하지 않습니다.

    4단계:코딩

    이 코드의 논리는 매우 간단합니다. 전위차계의 값은 배열에 저장되고 레코드는 for 루프를 사용하여 순회되며 서보는 값에 따라 단계를 수행합니다. "Arduino Potentiometer Servo Control &Memory" 참조용으로 사용한 이 튜토리얼을 확인하실 수 있습니다.

    코드 :- (다운로드 가능한 파일은 아래 첨부)

    <울>
  • 먼저 프로그램 전체에서 사용할 수 있도록 필요한 모든 변수를 전역적으로 선언합니다. 이에 대해서는 특별한 설명이 필요하지 않습니다.
  • #include 
    //서보 개체
    서보 서보_0;
    서보 서보_1;
    서보 서보_2;
    서보 서보_3;
    서보 서보_4;
    //전위차계 개체
    int Pot_0;
    int Pot_1;
    int Pot_2;
    int Pot_3;
    int Pot_4;
    //서보 위치를 저장할 변수
    int Servo_0_Pos;
    int Servo_1_Pos;
    int Servo_2_Pos;
    int Servo_3_Pos;
    int Servo_4_Pos;
    //이전 위치 값을 저장할 변수
    int Prev_0_Pos;
    int Prev_1_Pos;
    int Prev_2_Pos;
    int Prev_3_Pos;
    int Prev_4_Pos;
    //현재 위치 값을 저장할 변수
    int Current_0_Pos;
    int Current_1_Pos;
    int Current_2_Pos;
    int Current_3_Pos;
    int Current_4_Pos;
    int Servo_Position; //각도를 저장합니다.
    int Servo_Number; //서보를 저장하지 않음
    int Storage[600]; //데이터를 저장할 배열(배열 크기를 늘리면 더 많은 메모리를 소모함)
    int Index =0; // 배열 인덱스는 0번째 위치부터 시작합니다.
    char data =0; //직렬 입력의 데이터를 저장할 변수입니다.
    <울>
  • 이제 우리는 핀과 그 기능을 설정하는 설정 함수를 작성할 것입니다. 가장 먼저 실행되는 주요 기능입니다.
  • setup() 무효 
    {
    Serial.begin(9600); //arduino와 IDE 간의 직렬 통신용.
    //서보 개체는 PWM 핀에 연결됩니다.
    Servo_0.attach(3);
    Servo_1.attach(5);
    Servo_2.attach(6);
    Servo_3.attach(9);
    Servo_4.attach(10);
    //초기화 시 서보는 100 위치로 설정됩니다.
    Servo_0.write(100);
    Servo_1.write(100);
    Servo_2.write(100);
    Servo_3.write(100);
    Servo_4. write(100);
    Serial.println("녹음하려면 'R'을, 재생하려면 'P'를 누르십시오.");
    }

    이제 아날로그 입력 핀을 사용하여 전위차계의 값을 읽고 서보를 제어하도록 매핑해야 합니다. 이를 위해 함수를 정의하고 이름을 Map_Pot();, 사용자 정의 함수이므로 원하는 대로 이름을 지정할 수 있습니다.

    void Map_Pot()
    {
    /* 서보는 180도 회전하지만
    한계까지 사용하는 것은 좋지 않습니다. 서보가 계속 윙윙거립니다.
    짜증나므로 서보가 이동하도록 제한합니다.
    1-179 */
    Pot_0 =analogRead(A0); // pot에서 입력을 읽고 변수 Pot_0에 저장합니다.
    Servo_0_Pos =map(Pot_0, 0, 1023, 1, 179); //0에서 1023 사이의 값에 따라 서보를 매핑합니다.
    Servo_0.write(Servo_0_Pos); //서보를 해당 위치로 이동합니다.

    Pot_1 =analogRead(A1);
    Servo_1_Pos =map(Pot_1, 0, 1023, 1, 179);
    Servo_1.write (서보_1_포지션);

    Pot_2 =analogRead(A2);
    Servo_2_Pos =map(Pot_2, 0, 1023, 1, 179);
    Servo_2.write(Servo_2_Pos);

    Pot_3 =analogRead(A3);
    Servo_3_Pos =map(Pot_3, 0, 1023, 1, 179);
    Servo_3.write(Servo_3_Pos);

    Pot_4 =analogRead(A4);
    Servo_4_Pos =map(Pot_4, 0, 1023, 1, 179);
    Servo_4.write(Servo_4_Pos);
    }
    <울>
  • 이제 루프 함수를 작성할 것입니다.
  • 무효 루프() 
    {
    Map_Pot(); //pot 값을 읽는 함수 호출

    while (Serial.available()> 0)
    {
    data =Serial.read();
    if (data =='R')
    Serial.println("무브 기록 중...");
    if (data =='P')
    Serial.println("기록된 동작 재생 중.. .");
    }
    if (data =='R') //'R'이 입력되면 녹음을 시작합니다.
    {
    //값을 a에 저장
    Prev_0_Pos =Servo_0_Pos;
    Prev_1_Pos =Servo_1_Pos;
    Prev_2_Pos =Servo_2_Pos;
    Prev_3_Pos =Servo_3_Pos;
    Prev_4_Pos =Servo_4 (); // 비교를 위해 호출된 맵 함수

    if (abs(Prev_0_Pos ==Servo_0_Pos)) // 절대값은 비교하여 구함
    {
    Servo_0.write(Servo_0_Pos); // 값이 일치하면 서보가 재배치됩니다.
    if (Current_0_Pos !=Servo_0_Pos) // 값이 일치하지 않으면
    {
    Storage[Index] =Servo_0_Pos + 0; // 배열에 값 추가
    Index++; // 인덱스 값이 1 증가
    }
    Current_0_Pos =Servo_0_Pos;
    }
    /* 마찬가지로 모든 서보에 대해 값 비교가 수행되고, 차등 값으로 항목
    마다 +100이 추가됩니다. */
    if (abs(Prev_1_Pos ==Servo_1_Pos))
    {
    Servo_1.write(Servo_1_Pos);
    if (Current_1_Pos !=Servo_1_Pos)
    {
    저장소[색인] =Servo_1_Pos + 100;
    Index++;
    }
    Current_1_Pos =Servo_1_Pos;
    }

    if (abs(Prev_2_Pos ==Servo_2_Pos))
    {
    Servo_2.write(Servo_2_Pos);
    if (Current_2_Pos !=Servo_2_Pos)
    {
    스토리지[색인] =Servo_2_Pos + 200;
    Index++;
    }
    Current_2_Pos =Servo_2_Pos;
    }

    if (abs(Prev_3_Pos ==Servo_3_Pos))
    {
    Servo_3.write(Servo_3_Pos);
    if (Current_3_Pos !=Servo_3_Pos)
    {
    스토리지[색인] =Servo_3_Pos + 300;
    인덱스++;
    }
    Current_3_Pos =Servo_3_Pos;
    }
    if (abs(Prev_4_Pos ==Servo_4_Pos))
    {
    Servo_4.write(Servo_4_Pos);
    if (Current_4_Pos !=Servo_4_Pos)
    {
    스토리지[색인] =Servo_4_Pos + 400;
    Index++;
    }
    Current_4_Pos =Servo_4_Pos;
    }
    /* 값은 직렬 모니터에 인쇄됩니다. '\t'는 값을 표 형식으로 표시하기 위한 것입니다. */
    Serial.print(Servo_0_Pos);
    Serial.print(" \t ");
    Serial.print(Servo_1_Pos);
    Serial.print(" \t ");
    Serial.print(Servo_2_Pos);
    Serial.print(" \t ");
    Serial.print(Servo_3_Pos);
    Serial.print(" \t ");
    Serial.println(Servo_4_Pos);
    Serial.print("색인 =");
    Serial.println(색인);
    지연(50);
    }
    if (data =='P') // 'P'가 입력되면 기록된 움직임 재생을 시작합니다.
    {
    for (int i =0; i {
    Servo_Number =Storage[i] / 100; // 서보의 번호를 찾습니다.
    Servo_Position =Storage[i] % 100; // 서보 위치 찾기
    switch(Servo_Number)
    {
    case 0:
    Servo_0.write(Servo_Position);
    break;
    case 1:
    Servo_1.write(Servo_Position);
    break;
    사례 2:
    Servo_2.write(Servo_Position);
    break;
    경우 3:
    Servo_3.write(Servo_Position);
    break;
    경우 4:
    Servo_4.write(Servo_Position);
    break;
    }
    지연(50);
    }
    }
    }
    <울>
  • 코드가 준비되면 이제 arduino 보드에 업로드하세요.
  • 스마트 암이 작동할 준비가 되었습니다. 아직 기능이 스토어피크만큼 매끄럽지는 않습니다.

    더 나은 코드를 만들 수 있거나 나에게 제안할 사항이 있으면 댓글 섹션에 알려주십시오.

    그런 다음 테스트를 진행해 보겠습니다....

    Record-Play.ino

    5단계:테스트

    보드에 코드를 성공적으로 업로드한 후 '시리얼 모니터'를 열면 도구 옵션에서 찾을 수 있습니다. 직렬 모니터가 시작되면 arduino가 재설정됩니다. 이제 마스터 암을 사용하여 로봇 팔을 제어할 수 있습니다. 하지만 아무 것도 녹음되지 않습니다.

    녹음을 시작하려면 모니터에 'R'을 입력하면 녹음하려는 동작을 수행할 수 있습니다.

    움직임이 완료된 후 기록된 움직임을 재생하려면 'P'를 입력해야 합니다. 보드가 재설정되지 않는 한 서보는 계속해서 이동을 수행합니다.

    프로젝트가 마음에 드셨으면 합니다.

    감사합니다...

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

    코드

    <울>
  • Record-Play.ino
  • 코드 스니펫 #1
  • 코드 스니펫 #2
  • 코드 스니펫 #3
  • 코드 스니펫 #4
  • Record-Play.inoArduino
    파일을 여는 동안 오류가 발생했습니다.
    코드 스니펫 #1일반 텍스트
    #include //서보 개체서보 서보_0;서보 서보_1;서보 서보_2;서보 서보_3;서보 서보_4;//포텐셔미터 개체int Pot_0;int Pot_1;int Pot_2; int Pot_3;int Pot_4;//서보 위치를 저장할 변수int Servo_0_Pos;int Servo_1_Pos;int Servo_2_Pos;int Servo_3_Pos;int Servo_4_Pos;//이전 위치 값을 저장할 변수int Prev_0_Pos; int Prev_1_Pos; int Prev_2_Pos;int Prev_3_Pos; int Prev_4_Pos;//현재 위치 값을 저장할 변수int Current_0_Pos; int Current_1_Pos; int Current_2_Pos; int Current_3_Pos;int Current_4_Pos;int Servo_Position; //각도를 저장합니다. int Servo_Number; //servoint를 저장하지 않음 Storage[600]; //데이터를 저장할 배열(배열 크기를 늘리면 더 많은 메모리를 소모함) int Index =0; // 배열 인덱스는 0번째 position부터 시작합니다.char data =0; //시리얼 입력의 데이터를 저장할 변수
    코드 스니펫 #2일반 텍스트
    <사전> 무효 설정() { Serial.begin(9600); //arduino와 IDE 간의 직렬 통신용. //서보 개체는 PWM 핀에 연결됩니다. Servo_0.attach(3); Servo_1.attach(5); Servo_2.attach(6); Servo_3.attach(9); Servo_4.attach(10); //초기화 시 서보는 100 위치로 설정됩니다. Servo_0.write(100); Servo_1.write(100); Servo_2.write(100); Servo_3.write(100); Servo_4.write(100); Serial.println("녹음하려면 'R'을 누르고 재생하려면 'P'를 누르십시오."); }
    코드 스니펫 #3일반 텍스트
    void Map_Pot(){ /* 서보는 180도 회전하지만, 서보를 계속해서 윙윙거리게 만들어 짜증나게 하므로 서보를 1-179 사이로 이동하도록 제한하기 때문에 이를 제한하는 것은 좋은 생각이 아닙니다. / Pot_0 =analogRead(A0); // pot에서 입력을 읽고 변수 Pot_0에 저장합니다. Servo_0_Pos =맵(Pot_0, 0, 1023, 1, 179); //0에서 1023 사이의 값에 따라 서보를 매핑합니다. Servo_0.write(Servo_0_Pos); //서보를 해당 위치로 이동합니다. Pot_1 =analogRead(A1); Servo_1_Pos =맵(Pot_1, 0, 1023, 1, 179); Servo_1.write(Servo_1_Pos); Pot_2 =analogRead(A2); Servo_2_Pos =맵(Pot_2, 0, 1023, 1, 179); Servo_2.write(Servo_2_Pos); Pot_3 =analogRead(A3); Servo_3_Pos =맵(Pot_3, 0, 1023, 1, 179); Servo_3.write(Servo_3_Pos); Pot_4 =analogRead(A4); Servo_4_Pos =map(Pot_4, 0, 1023, 1, 179); Servo_4.write(Servo_4_Pos);}
    코드 스니펫 #4일반 텍스트
    <사전>무효 루프() { Map_Pot(); // 포트 값을 읽는 함수 호출 while (Serial.available()> 0) { data =Serial.read(); if (data =='R') Serial.println("움직임 기록 중..."); if (data =='P') Serial.println("기록된 움직임을 재생하는 중..."); } if (data =='R') //'R'이 입력되면 녹화를 시작합니다. { //변수에 값 저장 Prev_0_Pos =Servo_0_Pos; Prev_1_Pos =서보_1_Pos; Prev_2_Pos =서보_2_Pos; Prev_3_Pos =Servo_3_Pos; Prev_4_Pos =Servo_4_Pos; Map_Pot(); // 비교를 위해 호출된 맵 함수 if (abs(Prev_0_Pos ==Servo_0_Pos)) // 비교를 통해 절대값을 구함 { Servo_0.write(Servo_0_Pos); // 값이 일치하면 서보가 재배치됩니다. if (Current_0_Pos !=Servo_0_Pos) // 값이 일치하지 않으면 { Storage[Index] =Servo_0_Pos + 0; // 배열에 값이 추가됨 Index++; // 인덱스 값이 1씩 증가 } Current_0_Pos =Servo_0_Pos; } /* 마찬가지로 모든 서보에 대해 값 비교가 수행되고 차동 값으로 입력할 때마다 +100이 추가됩니다. */ if (abs(Prev_1_Pos ==Servo_1_Pos)) { Servo_1.write(Servo_1_Pos); if (Current_1_Pos !=Servo_1_Pos) { 스토리지[색인] =Servo_1_Pos + 100; 색인++; } Current_1_Pos =서보_1_Pos; } if (abs(Prev_2_Pos ==Servo_2_Pos)) { Servo_2.write(Servo_2_Pos); if (Current_2_Pos !=Servo_2_Pos) { 스토리지[색인] =Servo_2_Pos + 200; 색인++; } Current_2_Pos =서보_2_Pos; } if (abs(Prev_3_Pos ==Servo_3_Pos)) { Servo_3.write(Servo_3_Pos); if (Current_3_Pos !=Servo_3_Pos) { 스토리지[색인] =Servo_3_Pos + 300; 색인++; } Current_3_Pos =서보_3_Pos; } if (abs(Prev_4_Pos ==Servo_4_Pos)) { Servo_4.write(Servo_4_Pos); if (Current_4_Pos !=Servo_4_Pos) { 스토리지[색인] =Servo_4_Pos + 400; 색인++; } Current_4_Pos =서보_4_Pos; } /* 값은 시리얼 모니터에 출력되며, '\t'는 표 형식으로 값을 표시하기 위한 것입니다. */ Serial.print(Servo_0_Pos); Serial.print(" \t "); Serial.print(Servo_1_Pos); Serial.print(" \t "); Serial.print(Servo_2_Pos); Serial.print(" \t "); Serial.print(Servo_3_Pos); Serial.print(" \t "); Serial.println(Servo_4_Pos); Serial.print("색인 ="); Serial.println(인덱스); 지연(50); } if (data =='P') //IF 'P'가 입력되면 녹음된 움직임을 재생합니다. { for (int i =0; i

    회로도


    제조공정

    1. Python과 함께 Arduino 및 RFID를 사용한 출석 시스템
    2. Arduino, 1Sheeld 및 Android를 사용한 범용 원격 제어
    3. Arduino와 스마트폰을 사용한 DIY 전압계
    4. IoT를 사용하여 로봇 팔 원격 제어
    5. IOT - ESP8266, Arduino 및 초음파 센서를 사용하는 스마트 항아리
    6. Arduino를 사용한 주파수 및 듀티 사이클 측정
    7. Arduino 3D 인쇄 로봇 팔
    8. 스마트 신발(자동 끈 및 전기 생성)
    9. Nunchuk 제어 로봇 팔(Arduino 포함)
    10. WiFi 로그인 페이지를 사용하는 스마트 도어록 by Arduino &ESP8266