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

Arduino 로봇 암 및 메카넘 휠 플랫폼 자동 작동

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 이전 비디오에서 Mecanum Wheels 로봇 플랫폼을 만든 방법을 보여주고 이전 비디오 중 하나의 Arduino 프로젝트이기도 한 3D 인쇄 로봇 팔과 함께 작동하고 자동으로 작동합니다.

다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다.

개요

따라서 이전 비디오에서 설명한 것과 같은 방식으로 맞춤형 Android 애플리케이션을 사용하여 Mecanum 바퀴 로봇을 제어할 수 있습니다. 그 외에도 이제 앱에는 로봇 팔을 제어하기 위한 버튼도 있습니다.

원래 로봇 팔 제어 앱에는 실제로 로봇 관절을 제어하는 ​​슬라이더가 있었지만 팔 안정성에 몇 가지 문제가 있었습니다. 이런 식으로 팔이 훨씬 더 잘 작동하므로 이 업데이트된 버전의 로봇 팔 제어 앱과 Arduino 코드를 원래 로봇 팔 프로젝트에도 제공하겠습니다.

그럼에도 불구하고 이 로봇의 가장 멋진 기능은 움직임을 저장한 다음 자동으로 반복하는 기능입니다.

저장 버튼을 사용하여 각 단계에 대한 모터의 위치를 ​​간단히 저장할 수 있습니다. 그런 다음 실행 버튼을 클릭하기만 하면 로봇이 자동으로 저장된 움직임을 계속해서 반복합니다.

Arduino 로봇 만들기

자, 여기 메카넘 휠 플랫폼이 이미 조립되어 있으며 이전 비디오에서 이에 대한 모든 세부 정보를 찾을 수 있습니다.

또한 여기에 로봇 팔과 서보 모터의 3D 인쇄 부품이 있으며 이제 조립 방법을 보여 드리겠습니다. 다음은 이 프로젝트의 3D 모델입니다.

이 3D 모델을 찾아 다운로드할 수 있을 뿐만 아니라 Thangs의 브라우저에서 탐색할 수도 있습니다.

Thangs에서 3D 모델을 다운로드하세요.

3D 인쇄용 STL 파일:

로봇 팔의 첫 번째 서보는 메카넘 휠 플랫폼의 상단 덮개에 직접 장착됩니다.

위치를 표시하고 10mm 드릴을 사용하여 구멍을 여러 개 만들었습니다.

그런 다음 줄을 사용하여 구멍을 뚫고 서보의 구멍을 미세 조정했습니다. 4개의 M3 볼트와 너트를 사용하여 서보를 상판에 고정했습니다.

그런 다음 이 서보의 출력 샤프트에 서보와 함께 액세서리로 제공되는 둥근 혼을 사용하여 로봇 팔의 다음 부품 또는 허리를 부착해야 합니다. 그러나 이러한 방식으로 부품이 플레이트에서 약 8mm 위에 유지된다는 것을 알 수 있습니다. 그래서 8mm MDF 보드 2장을 붙여서 허리 부분이 미끄러질 수 있도록 하여 접합부가 더 안정적입니다.

둥근 뿔은 서보와 함께 액세서리로 제공되는 셀프 태핑 나사를 사용하여 허리 부분에 고정되고 둥근 뿔은 서보와 함께 제공되는 적절한 볼트를 사용하여 서보 샤프트에 고정됩니다.

다음은 숄더 서보입니다. 제자리에 놓고 셀프 태핑 나사를 사용하여 3D 인쇄 부품에 고정하기만 하면 됩니다.

둥근 혼이 다음 부품에 연결되고 두 부품이 서보의 출력 샤프트에 있는 볼트를 사용하여 서로 고정됩니다.

부품을 고정하기 전에 부품의 전체 가동 범위를 확인해야 합니다. 여기에서 또한 서보에 약간의 도움을 주기 위해 어깨 관절에 고무 밴드를 추가했습니다. 이 서보는 페이로드와 팔의 나머지 부분의 무게를 지탱하기 때문입니다.

비슷한 방법으로 나머지 로봇팔도 조립했습니다.

다음으로 그리퍼 메커니즘에 조립해야 합니다. 그리퍼는 SG90 서보 모터로 제어되며, 먼저 맞춤 설계된 기어 링크를 부착합니다. 우리는 이 링크를 M4 볼트와 너트를 사용하여 고정된 다른 쪽의 다른 기어드 링크와 짝을 짓습니다. 실제로 다른 모든 링크는 M4 볼트와 너트를 사용하여 연결됩니다.

그리퍼의 3D 모델은 원래 3mm 구멍이 있지만 M3 볼트가 충분하지 않아 4mm 드릴로 구멍을 확장하고 대신 M4 볼트를 사용했습니다.

그리퍼 기구를 조립한 후 마지막 서보에 고정하여 로봇팔을 완성했습니다.

다음으로 나는 약간의 케이블 관리를 했다. 로봇 팔의 특별히 설계된 구멍을 통해 서보 와이어를 통과시켰습니다. 10mm 드릴을 사용하여 전선이 통과할 수 있도록 상판에 구멍을 뚫었습니다.

집타이로 전선을 모두 묶고 아두이노 보드에 연결하는 일만 남았습니다.

Arduino 로봇 회로도

다음은 이 프로젝트의 회로도와 모든 것이 연결되어야 하는 방법입니다.

아래 링크에서 이 프로젝트에 필요한 구성 요소를 얻을 수 있습니다.

이전 튜토리얼에서 메카넘 바퀴 로봇 부품이 어떻게 작동하는지 설명하고 맞춤형 PCB를 만드는 방법도 보여주었습니다.

이 PCB에 5V 전압 조정기를 포함하여 이 프로젝트를 만들거나 5V에서 작동하는 서보 모터를 연결할 수 있습니다. 전압 조정기는 최대 3A의 전류를 처리할 수 있는 LM350입니다. 로봇 팔의 6개 서보는 모두 약 2A에서 3A의 전류를 끌어올 수 있습니다. 즉, 로봇 팔을 처리할 수는 있지만 조정기가 매우 뜨거워집니다.

그래서 방열판 자체로는 레귤레이터를 식히기에 충분하지 않았기 때문에 방열판과 작은 12V DC 팬을 연결하여 공기를 불어넣었습니다.

서보 신호선을 5번에서 10번까지 Arduino 디지털 핀에 연결하고 전원을 공급하기 위해 PCB의 5V 핀 헤더를 사용했습니다. 마지막으로 플랫폼 내부의 모든 와이어를 밀어넣고 두 개의 너트를 사용하여 상단 플레이트를 고정했습니다.

이제 이 프로젝트는 완료되었습니다.

Arduino 코드

남은 것은 Arduino 코드와 Android 애플리케이션이 어떻게 작동하는지 살펴보는 것입니다. 코드가 조금 더 길기 때문에 이해를 돕기 위해 프로그램의 소스 코드를 섹션별로 설명과 함께 게시하겠습니다. 그리고 이 기사의 끝에 완전한 소스 코드를 게시할 것입니다.

따라서 먼저 6개의 서보, 4개의 스테퍼 모터 및 Bluetooth 통신을 정의하고 아래 프로그램에 필요한 몇 가지 변수를 정의해야 합니다. 설정 섹션에서 스테퍼의 최대 속도를 설정하고, 서보가 연결된 핀을 정의하고, 블루투스 통신을 시작하고, 로봇 팔을 초기 위치로 설정합니다.

#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(1, 44, 45);  // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4

#define led 14

int wheelSpeed = 1500;

int lbw[50], lfw[50], rbw[50], rfw[50]; // arrays for storing positions/steps

int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
int dataIn;
int m = 0;

void setup() {
  // Set initial seed values for the steppers
  LeftFrontWheel.setMaxSpeed(3000);
  LeftBackWheel.setMaxSpeed(3000);
  RightFrontWheel.setMaxSpeed(3000);
  RightBackWheel.setMaxSpeed(3000);
  pinMode(led, OUTPUT);
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  servo04.attach(8);
  servo05.attach(9);
  servo06.attach(10);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(5);
  delay(20);
  Serial.begin(38400);
  // Move robot arm to initial position
  servo1PPos = 90;
  servo01.write(servo1PPos);
  servo2PPos = 100;
  servo02.write(servo2PPos);
  servo3PPos = 120;
  servo03.write(servo3PPos);
  servo4PPos = 95;
  servo04.write(servo4PPos);
  servo5PPos = 60;
  servo05.write(servo5PPos);
  servo6PPos = 110;
  servo06.write(servo6PPos);
}Code language: Arduino (arduino)

그런 다음 루프 섹션에서 들어오는 데이터가 있는지 확인하는 것으로 시작합니다.

// Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.read();  // Read the dataCode language: Arduino (arduino)

이 데이터는 스마트폰이나 안드로이드 앱에서 가져오므로 실제로 어떤 데이터를 보내고 있는지 살펴보자. Android 앱은 MIT App Inventor 온라인 애플리케이션을 사용하여 제작되었습니다. 적절한 이미지를 배경으로 하는 심플한 버튼으로 구성되어 있습니다.

앱의 블록을 살펴보면 버튼을 클릭할 때 1바이트 숫자만 전송한다는 것을 알 수 있습니다.

따라서 클릭한 버튼에 따라 Arduino에게 무엇을 해야 하는지 알려줍니다. 예를 들어 숫자 '2'를 받으면 메카넘 휠 플랫폼이 moveForward 사용자 정의 기능을 사용하여 앞으로 이동합니다.

if (dataIn == 2) {
      m = 2;
    }
//
if (m == 2) {
      moveForward();
    }Code language: Arduino (arduino)

이 사용자 정의 기능은 4개의 스테퍼 모터가 모두 앞으로 회전하도록 설정합니다.

void moveForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}Code language: Arduino (arduino)

다른 방향으로 이동하려면 적절한 방향으로 바퀴를 돌리기만 하면 됩니다.

로봇 팔을 제어하기 위해 동일한 방법을 사용합니다. 다시 말하지만 앱에는 버튼이 있으며 버튼을 누르고 있으면 로봇 팔 관절이 특정 방향으로 움직입니다.

<그림 클래스="aligncenter">

앞서 언급했듯이 원래 Robot Arm 제어 앱에서는 서보의 위치를 ​​제어하기 위해 슬라이더를 사용했지만 이러한 방식으로 1바이트 숫자 대신 Arduino에 텍스트를 보내야 했기 때문에 몇 가지 문제가 발생했습니다. 문제는 가끔 아두이노가 앱에서 오는 텍스트를 놓치고 오류가 발생하거나 로봇팔이 흔들려서 비정상적으로 동작한다는 것입니다.

이러한 방식으로 특정 버튼을 눌렀을 때 단일 1바이트 숫자를 전송합니다.

Arduino 코드는 해당 숫자의 while 루프에 들어가 버튼을 터치할 때까지 거기에 머뭅니다. 그 순간에 로봇이 아무것도 하지 않아야 함을 의미하는 숫자 0을 보내기 때문입니다.

// Move servo 1 in positive direction
    while (m == 16) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo01.write(servo1PPos);
      servo1PPos++;
      delay(speedDelay);
    }
    // Move servo 1 in negative direction
    while (m == 17) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo01.write(servo1PPos);
      servo1PPos--;
      delay(speedDelay);
    }Code language: Arduino (arduino)

따라서 터치한 버튼에 따라 서보가 양의 방향 또는 음의 방향으로 움직입니다. 모든 서보 모터에 동일한 작동 원리가 적용됩니다. 이동 속도를 변경하기 위해 100에서 250 사이의 슬라이더에서 오는 값을 사용합니다.

// If arm speed slider is changed
    if (dataIn > 101 & dataIn < 250) {
      speedDelay = dataIn / 10; // Change servo speed (delay time)
    }Code language: Arduino (arduino)

그것들을 10으로 나누면 10에서 25 사이의 값을 얻을 수 있으며 이는 서보를 구동하기 위한 while 루프에서 마이크로초 단위의 지연으로 사용됩니다.

로봇 움직임을 저장하기 위해 저장 버튼을 클릭할 때마다 서보와 스테퍼의 현재 위치를 어레이에 저장하기만 하면 됩니다.

// If button "SAVE" is pressed
    if (m == 12) {
      //if it's initial save, set the steppers position to 0
      if (index == 0) {
        LeftBackWheel.setCurrentPosition(0);
        LeftFrontWheel.setCurrentPosition(0);
        RightBackWheel.setCurrentPosition(0);
        RightFrontWheel.setCurrentPosition(0);
      }
      lbw[index] = LeftBackWheel.currentPosition();  // save position into the array
      lfw[index] = LeftFrontWheel.currentPosition();
      rbw[index] = RightBackWheel.currentPosition();
      rfw[index] = RightFrontWheel.currentPosition();

      servo01SP[index] = servo1PPos;  // save position into the array
      servo02SP[index] = servo2PPos;
      servo03SP[index] = servo3PPos;
      servo04SP[index] = servo4PPos;
      servo05SP[index] = servo5PPos;
      servo06SP[index] = servo6PPos;
      index++;                        // Increase the array index
      m = 0;
    }Code language: Arduino (arduino)

그런 다음 실행 버튼을 누르면 runSteps() 사용자 정의 함수를 호출합니다. 이 사용자 정의 함수는 일부 for 및 while 루프를 사용하여 저장된 모든 단계를 실행합니다.

if (m == 14) {
      runSteps();

      // If button "RESET" is pressed
      if (dataIn != 14) {
        stopMoving();
        memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0
        memset(lfw, 0, sizeof(lfw));
        memset(rbw, 0, sizeof(rbw));
        memset(rfw, 0, sizeof(rfw));
        memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
        memset(servo02SP, 0, sizeof(servo02SP));
        memset(servo03SP, 0, sizeof(servo03SP));
        memset(servo04SP, 0, sizeof(servo04SP));
        memset(servo05SP, 0, sizeof(servo05SP));
        memset(servo06SP, 0, sizeof(servo06SP));
        index = 0;  // Index to 0
      }
    }Code language: Arduino (arduino)

첫 번째 위치에서 시작하여 마지막 위치로 이동하고 이를 계속 반복한다는 점에 유의해야 합니다. 따라서 단계를 저장할 때 실제로 첫 번째 단계가 마지막 단계와 동일한 위치에 있도록 로봇을 배치해야 합니다. 단계를 실행하는 동안 플랫폼과 로봇 팔의 속도를 변경하고 모든 단계를 일시 중지 및 재설정할 수도 있습니다.

여기에서 이 앱과 편집 가능한 프로젝트 파일을 다운로드할 수 있습니다.

이 Arduino 로봇 프로젝트에 대한 전체 Arduino 코드는 다음과 같습니다.

/*
       Arduino Robot Arm and Mecanum Wheels Robot
          Smartphone Control via Bluetooth
       by Dejan, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>
#include <AccelStepper.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;

SoftwareSerial Bluetooth(A8, 38); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

// Define the stepper motors and the pins the will use
AccelStepper LeftBackWheel(1, 42, 43);   // (Type:driver, STEP, DIR) - Stepper1
AccelStepper LeftFrontWheel(1, 40, 41);  // Stepper2
AccelStepper RightBackWheel(1, 44, 45);  // Stepper3
AccelStepper RightFrontWheel(1, 46, 47); // Stepper4

#define led 14

int wheelSpeed = 1500;

int lbw[50], lfw[50], rbw[50], rfw[50]; // arrays for storing positions/steps

int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
int dataIn;
int m = 0;

void setup() {
  // Set initial seed values for the steppers
  LeftFrontWheel.setMaxSpeed(3000);
  LeftBackWheel.setMaxSpeed(3000);
  RightFrontWheel.setMaxSpeed(3000);
  RightBackWheel.setMaxSpeed(3000);
  pinMode(led, OUTPUT);
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  servo04.attach(8);
  servo05.attach(9);
  servo06.attach(10);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(5);
  delay(20);
  Serial.begin(38400);
  // Move robot arm to initial position
  servo1PPos = 90;
  servo01.write(servo1PPos);
  servo2PPos = 100;
  servo02.write(servo2PPos);
  servo3PPos = 120;
  servo03.write(servo3PPos);
  servo4PPos = 95;
  servo04.write(servo4PPos);
  servo5PPos = 60;
  servo05.write(servo5PPos);
  servo6PPos = 110;
  servo06.write(servo6PPos);
}

void loop() {
  // Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.read();  // Read the data

    if (dataIn == 0) {
      m = 0;
    }
    if (dataIn == 1) {
      m = 1;
    }
    if (dataIn == 2) {
      m = 2;
    }
    if (dataIn == 3) {
      m = 3;
    }
    if (dataIn == 4) {
      m = 4;
    }
    if (dataIn == 5) {
      m = 5;
    }
    if (dataIn == 6) {
      m = 6;
    }
    if (dataIn == 7) {
      m = 7;
    }
    if (dataIn == 8) {
      m = 8;
    }
    if (dataIn == 9) {
      m = 9;
    }
    if (dataIn == 10) {
      m = 10;
    }
    if (dataIn == 11) {
      m = 11;
    }
    if (dataIn == 12) {
      m = 12;
    }
    if (dataIn == 14) {
      m = 14;
    }
    if (dataIn == 16) {
      m = 16;
    }
    if (dataIn == 17) {
      m = 17;
    }
    if (dataIn == 18) {
      m = 18;
    }
    if (dataIn == 19) {
      m = 19;
    }
    if (dataIn == 20) {
      m = 20;
    }
    if (dataIn == 21) {
      m = 21;
    }
    if (dataIn == 22) {
      m = 22;
    }
    if (dataIn == 23) {
      m = 23;
    }
    if (dataIn == 24) {
      m = 24;
    }
    if (dataIn == 25) {
      m = 25;
    }
    if (dataIn == 26) {
      m = 26;
    }
    if (dataIn == 27) {
      m = 27;
    }

    // Move the Mecanum wheels platform
    if (m == 4) {
      moveSidewaysLeft();
    }
    if (m == 5) {
      moveSidewaysRight();
    }
    if (m == 2) {
      moveForward();
    }
    if (m == 7) {
      moveBackward();
    }
    if (m == 3) {
      moveRightForward();
    }
    if (m == 1) {
      moveLeftForward();
    }
    if (m == 8) {
      moveRightBackward();
    }
    if (m == 6) {
      moveLeftBackward();
    }
    if (m == 9) {
      rotateLeft();
    }
    if (m == 10) {
      rotateRight();
    }

    if (m == 0) {
      stopMoving();
    }

    // Mecanum wheels speed
    if (dataIn > 30 & dataIn < 100) {
      wheelSpeed = dataIn * 20;
    }

    // Move robot arm
    // Move servo 1 in positive direction
    while (m == 16) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo01.write(servo1PPos);
      servo1PPos++;
      delay(speedDelay);
    }
    // Move servo 1 in negative direction
    while (m == 17) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo01.write(servo1PPos);
      servo1PPos--;
      delay(speedDelay);
    }
    // Move servo 2
    while (m == 19) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo02.write(servo2PPos);
      servo2PPos++;
      delay(speedDelay);
    }
    while (m == 18) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo02.write(servo2PPos);
      servo2PPos--;
      delay(speedDelay);
    }
    // Move servo 3
    while (m == 20) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo03.write(servo3PPos);
      servo3PPos++;
      delay(speedDelay);
    }
    while (m == 21) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo03.write(servo3PPos);
      servo3PPos--;
      delay(speedDelay);
    }
    // Move servo 4
    while (m == 23) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo04.write(servo4PPos);
      servo4PPos++;
      delay(speedDelay);
    }
    while (m == 22) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo04.write(servo4PPos);
      servo4PPos--;
      delay(speedDelay);
    }
    // Move servo 5
    while (m == 25) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo05.write(servo5PPos);
      servo5PPos++;
      delay(speedDelay);
    }
    while (m == 24) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo05.write(servo5PPos);
      servo5PPos--;
      delay(speedDelay);
    }
    // Move servo 6
    while (m == 26) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo06.write(servo6PPos);
      servo6PPos++;
      delay(speedDelay);
    }
    while (m == 27) {
      if (Bluetooth.available() > 0) {
        m = Bluetooth.read();
      }
      servo06.write(servo6PPos);
      servo6PPos--;
      delay(speedDelay);
    }

    // If arm speed slider is changed
    if (dataIn > 101 & dataIn < 250) {
      speedDelay = dataIn / 10; // Change servo speed (delay time)
    }

    // If button "SAVE" is pressed
    if (m == 12) {
      //if it's initial save, set the steppers position to 0
      if (index == 0) {
        LeftBackWheel.setCurrentPosition(0);
        LeftFrontWheel.setCurrentPosition(0);
        RightBackWheel.setCurrentPosition(0);
        RightFrontWheel.setCurrentPosition(0);
      }
      lbw[index] = LeftBackWheel.currentPosition();  // save position into the array
      lfw[index] = LeftFrontWheel.currentPosition();
      rbw[index] = RightBackWheel.currentPosition();
      rfw[index] = RightFrontWheel.currentPosition();

      servo01SP[index] = servo1PPos;  // save position into the array
      servo02SP[index] = servo2PPos;
      servo03SP[index] = servo3PPos;
      servo04SP[index] = servo4PPos;
      servo05SP[index] = servo5PPos;
      servo06SP[index] = servo6PPos;
      index++;                        // Increase the array index
      m = 0;
    }

    // If button "RUN" is pressed
    if (m == 14) {
      runSteps();

      // If button "RESET" is pressed
      if (dataIn != 14) {
        stopMoving();
        memset(lbw, 0, sizeof(lbw)); // Clear the array data to 0
        memset(lfw, 0, sizeof(lfw));
        memset(rbw, 0, sizeof(rbw));
        memset(rfw, 0, sizeof(rfw));
        memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
        memset(servo02SP, 0, sizeof(servo02SP));
        memset(servo03SP, 0, sizeof(servo03SP));
        memset(servo04SP, 0, sizeof(servo04SP));
        memset(servo05SP, 0, sizeof(servo05SP));
        memset(servo06SP, 0, sizeof(servo06SP));
        index = 0;  // Index to 0
      }
    }
  }
  LeftFrontWheel.runSpeed();
  LeftBackWheel.runSpeed();
  RightFrontWheel.runSpeed();
  RightBackWheel.runSpeed();

  // Monitor the battery voltage
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
  //Serial.println(voltage);
  // If voltage is below 11V turn on the LED
  if (voltage < 11) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}
void moveForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveBackward() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void moveSidewaysRight() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveSidewaysLeft() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void rotateLeft() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(wheelSpeed);
}
void rotateRight() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void moveRightForward() {
  LeftFrontWheel.setSpeed(wheelSpeed);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(wheelSpeed);
}
void moveRightBackward() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(-wheelSpeed);
  RightFrontWheel.setSpeed(-wheelSpeed);
  RightBackWheel.setSpeed(0);
}
void moveLeftForward() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(wheelSpeed);
  RightFrontWheel.setSpeed(wheelSpeed);
  RightBackWheel.setSpeed(0);
}
void moveLeftBackward() {
  LeftFrontWheel.setSpeed(-wheelSpeed);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(-wheelSpeed);
}
void stopMoving() {
  LeftFrontWheel.setSpeed(0);
  LeftBackWheel.setSpeed(0);
  RightFrontWheel.setSpeed(0);
  RightBackWheel.setSpeed(0);
}

// Automatic mode custom function - run the saved steps
void runSteps() {
  while (dataIn != 13) {   // Run the steps over and over again until "RESET" button is pressed
    for (int i = 0; i <= index - 2; i++) {  // Run through all steps(index)
      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.read();
        if ( dataIn == 15) {           // If button "PAUSE" is pressed
          while (dataIn != 14) {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.read();
              if ( dataIn == 13) {
                break;
              }
            }
          }
        }
        // If speed slider is changed
        if (dataIn > 100 & dataIn < 150) {
          speedDelay = dataIn / 10; // Change servo speed (delay time)
        }
        // Mecanum wheels speed
        if (dataIn > 30 & dataIn < 100) {
          wheelSpeed = dataIn * 10;
          dataIn = 14;
        }
      }
      LeftFrontWheel.moveTo(lfw[i]);
      LeftFrontWheel.setSpeed(wheelSpeed);
      LeftBackWheel.moveTo(lbw[i]);
      LeftBackWheel.setSpeed(wheelSpeed);
      RightFrontWheel.moveTo(rfw[i]);
      RightFrontWheel.setSpeed(wheelSpeed);
      RightBackWheel.moveTo(rbw[i]);
      RightBackWheel.setSpeed(wheelSpeed);

      while (LeftBackWheel.currentPosition() != lbw[i] & LeftFrontWheel.currentPosition() != lfw[i] & RightFrontWheel.currentPosition() != rfw[i] & RightBackWheel.currentPosition() != rbw[i]) {
        LeftFrontWheel.runSpeedToPosition();
        LeftBackWheel.runSpeedToPosition();
        RightFrontWheel.runSpeedToPosition();
        RightBackWheel.runSpeedToPosition();
      }
      // Servo 1
      if (servo01SP[i] == servo01SP[i + 1]) {
      }
      if (servo01SP[i] > servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      if (servo01SP[i] < servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
          servo01.write(j);
          delay(speedDelay);
        }
      }

      // Servo 2
      if (servo02SP[i] == servo02SP[i + 1]) {
      }
      if (servo02SP[i] > servo02SP[i + 1]) {
        for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) {
          servo02.write(j);
          delay(speedDelay);
        }
      }
      if (servo02SP[i] < servo02SP[i + 1]) {
        for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) {
          servo02.write(j);
          delay(speedDelay);
        }
      }

      // Servo 3
      if (servo03SP[i] == servo03SP[i + 1]) {
      }
      if (servo03SP[i] > servo03SP[i + 1]) {
        for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) {
          servo03.write(j);
          delay(speedDelay);
        }
      }
      if (servo03SP[i] < servo03SP[i + 1]) {
        for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) {
          servo03.write(j);
          delay(speedDelay);
        }
      }

      // Servo 4
      if (servo04SP[i] == servo04SP[i + 1]) {
      }
      if (servo04SP[i] > servo04SP[i + 1]) {
        for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) {
          servo04.write(j);
          delay(speedDelay);
        }
      }
      if (servo04SP[i] < servo04SP[i + 1]) {
        for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) {
          servo04.write(j);
          delay(speedDelay);
        }
      }

      // Servo 5
      if (servo05SP[i] == servo05SP[i + 1]) {
      }
      if (servo05SP[i] > servo05SP[i + 1]) {
        for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) {
          servo05.write(j);
          delay(speedDelay);
        }
      }
      if (servo05SP[i] < servo05SP[i + 1]) {
        for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) {
          servo05.write(j);
          delay(speedDelay);
        }
      }

      // Servo 6
      if (servo06SP[i] == servo06SP[i + 1]) {
      }
      if (servo06SP[i] > servo06SP[i + 1]) {
        for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) {
          servo06.write(j);
          delay(speedDelay);
        }
      }
      if (servo06SP[i] < servo06SP[i + 1]) {
        for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) {
          servo06.write(j);
          delay(speedDelay);
        }
      }
    }
  }
}Code language: Arduino (arduino)

이것이 이 튜토리얼의 거의 모든 것입니다. 프로젝트는 잘 작동하지만 완벽하지는 않습니다. 자동 동작은 메카넘 휠의 미끄러짐과 서보 모터의 성능 저하로 인해 정확하지 않을 수 있습니다. 이 저렴한 서보 모터는 3D 인쇄 부품의 무게를 지탱할 수 있는 힘이 충분하지 않기 때문에 움직이지 않을 때도 흔들리거나 떨릴 수 있습니다.

이 튜토리얼을 즐기고 새로운 것을 배웠기를 바랍니다. 언제든지 아래 댓글 섹션에 질문하고 내 Arduino 프로젝트 컬렉션을 확인하세요.


제조공정

  1. Arduino 및 Raspberry Pi로 인터넷 제어 비디오 스트리밍 로봇 구축
  2. 간단한 파이 로봇
  3. 서보 모터로 로봇을 피하는 장애물
  4. Arduino 및 Android 기기로 Roomba 로봇 제어
  5. Arduino 및 MPU6050으로 서보 모터 제어
  6. Arduino를 사용한 간단하고 스마트한 로봇 팔
  7. Littlearm 2C:3D 인쇄 Arduino 로봇 팔 제작
  8. DIY Arduino 로봇 팔 – 손 제스처로 제어
  9. 로컬 및 원격 프로그래밍 가능 로봇 팔
  10. 로봇, 협업 로봇 암과 모바일 플랫폼 결합