Arduino机械臂

构建您自己的机械臂,只需 3 个舵机和一个 Arduino UNO 即可抓取物体!

应用和平台

Arduino IDE

项目介绍

如何使用Arduino UNO让您拥有自己的机械臂!

想想工厂,他们是如何制造产品的?而且超快?问题解决了,他们使用机器来完成他们的工作。许多工厂使用机器人抓取臂,因为它们可以轻松抓取物体并快速移动。今天,我将向您展示如何在短短几个小时内使用正确的材料制作自己的机械臂。

家居用品

  1. 冰棒棒
  2. 热胶/热胶枪
  3. 锡罐盖
  4. 瓶盖

本项目所需的电气元件如上所述 ⬆️

好了,现在我们准备开始这个项目了。首先拿一个舵机并将其粘在锡罐盖上(任何都可以) 确保舵机的底部粘在锡罐盖的顶部。

一旦比赛,它应该看起来像这样。

至于顶部,我用了一个瓶盖。然后将另一个舵机侧向粘在瓶盖上。

如果你看,我用了一根连接到舵机的冰棒棒,然后在冰棒棒的末端,我为机械臂做了一个抓手。

正如你所看到的,我使用了另一个伺服器和更多的冰棒棒。抓取器的一侧移动,而另一侧静止。我想让双方都动起来,但这很复杂。如果你有一台3D打印机,你也许可以制造出一种机构,使两侧只用一个伺服器移动。您的选择。

完成机器人手臂的构建后,您现在可以连接电子设备。首先根据原理图进行接线。确保没有明显的错误,然后测试电路。现在确保电位器的值一直打开,这样机械臂就不会移动,因为它会根据电位器的值进行调整。如果它移动得足够快,它可能会折断手臂。

现在我将向您展示如何正确使用它。有 2 个按钮、5 个 LED 和 3 个舵机。要确定位置,请按右键,然后绿色 LED 将亮起。那是 Pos 1,你会看到一个连续的印刷品,上面写着:

“Pos 1 Saved”

让我们让手臂移动,通过转动其中一个电位器来做到这一点,然后手臂应该移动。再次按下按钮,然后第二个 LED 将亮起,还给我们一个序列打印:

“Pos 2 Saved”

再执行此步骤 5 次,直到所有 LED 都亮起,并且连续打印应显示:

“Pos 1 Saved”

“Pos 2 Saved”

“Pos 3 Saved”

“Pos 4 Saved”

“Pos 5 Saved”

只有 5 个位置。但它足以对机械臂进行编程以抓取物体!现在,按左键。并等待大约 1 秒钟。然后机械臂应该移动到每个位置。它循环的原因是因为那部分代码在void循环中,所以它会永远一遍又一遍地重复!

void 循环()

当一个位置在串行监视器中播放时,它会告诉您每个舵机的位置。因此,如果伺服器移动 90 度,它应该如下所示:

potentiometer Angles: 90

现在您已经知道如何编程和使用机械臂,让我们尝试让它捡起一个物体!首先将一个物体放在桌子上,确保该物体具有良好的抓地力,足够小,可以抓取,并且不要太重。像乐高积木或积木一样的东西。对我来说,我使用了乐高积木,因为它重量轻、体积小且抓地力好。请看下面的视频。

代码

机械臂代码

这是机械臂代码!复制并放入Arduino IDE软件中,并将其上传到Arduino UNO。

//Original code by Ryan Chan. Updated code by MilesPeterson101 Thanks  to Ryan Chan for the concept!

#include <Servo.h>

Servo servo1; //Servos
Servo servo2;
Servo servo3;

const int LED1 = 2; //LEDs
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 7;
const int LED5 = 8;

const int button1 = 12; //Buttons
const int button2 = 13;

int button1Presses = 0; //Button values
boolean button2Pressed = false;

const int pot1 = A0; //Potentimeters
const int pot2 = A1;
const int pot3 = A2;

int pot1Val; //Potentimeter values
int pot2Val;
int pot3Val;
int pot1Angle;
int pot2Angle;
int pot3Angle;

int servo1PosSaves[] = {1,1,1,1,1}; //position saves
int servo2PosSaves[] = {1,1,1,1,1};
int servo3PosSaves[] = {1,1,1,1,1};

void setup() {
servo1.attach(5); // Set up everything and will run once; attach servos and define the pin modes
servo2.attach(6);
servo3.attach(9);

pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);

Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
pot1Val = analogRead(pot1); // This will read the values from the potentimeters and store it...
pot1Angle = map(pot1Val, 0, 1023, 0, 179); // ... and this will map the values from the potentiometers to values the servos can use and store it for later use
pot2Val = analogRead(pot2);
pot2Angle = map(pot2Val, 0, 1023, 0, 179);
pot3Val = analogRead(pot3);
pot3Angle = map(pot3Val, 0, 1023, 0, 179);

servo1.write(pot1Angle); // These will make the servos move to the mapped angles
servo2.write(pot2Angle);
servo3.write(pot3Angle);

if(digitalRead(button1) == HIGH){ // This will check how many times button1 is pressed and save the positions to an array depending on how many times it is pressed; switch/case works like a if statement
button1Presses++;
switch(button1Presses){
case 1:
servo1PosSaves[0] = pot1Angle;
servo2PosSaves[0] = pot2Angle;
servo3PosSaves[0] = pot3Angle;
digitalWrite(LED1, HIGH);
Serial.println("Pos 1 Saved");
break;
case 2:
servo1PosSaves[1] = pot1Angle;
servo2PosSaves[1] = pot2Angle;
servo3PosSaves[1] = pot3Angle;
digitalWrite(LED2, HIGH);
Serial.println("Pos 2 Saved");
break;
case 3:
servo1PosSaves[2] = pot1Angle;
servo2PosSaves[2] = pot2Angle;
servo3PosSaves[2] = pot3Angle;
digitalWrite(LED3, HIGH);
Serial.println("Pos 3 Saved");
break;
case 4:
servo1PosSaves[3] = pot1Angle;
servo2PosSaves[3] = pot2Angle;
servo3PosSaves[3] = pot3Angle;
digitalWrite(LED4, HIGH);
Serial.println("Pos 4 Saved");
break;
case 5:
servo1PosSaves[4] = pot1Angle;
servo2PosSaves[4] = pot2Angle;
servo3PosSaves[4] = pot3Angle;
digitalWrite(LED5, HIGH);
Serial.println("Pos 5 Saved");
break;
}
}

if(digitalRead(button2) == HIGH){ // Pretty self-explnatory here
button2Pressed = true;
}

if(button2Pressed){ // if the boolean button2Press is true, then the servos will run though all their saved positions
for(int i = 0; i < 5; i++){
servo1.write(servo1PosSaves[i]);
servo2.write(servo2PosSaves[i]);
servo3.write(servo3PosSaves[i]);
Serial.println(" potentimeter Angles: ");
Serial.println(servo1PosSaves[i]);
Serial.println(servo2PosSaves[i]);
Serial.println(servo3PosSaves[i]);
delay(1050);
}
}
delay(300);
}

接线图

Similar Posts

Leave a Reply