```[youku]
XNDYwNTE0MjY4MA
```
# <div align=center>**简易版抓娃娃机的制作**
</div>
----------
## STEP1 准备材料
#### ardunio uno \*1
#### A4988驱动模块\*1
#### ardunio CNC电机拓展板\*1
#### 杜邦线若干
#### 2020钢材:X\*2,Y\*2,Z\*2
#### T8形丝杆\*3
#### T8光轴\*2
#### 光轴约束\*4
#### 丝杆约束\*3
#### 42形步进电机\*3
#### 舵机\*1
#### 鱼线\*1
#### PVC透明隔板\*6
#### 灯带
#### 抓手\*1
#### 电源\*1
![](
https://2-im.guokr.com/gkimage/sg/xl/5e/sgxl5e.png)
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1585118945252&di=a5a67a8afcdc010286fc8397334b1bbb&imgtype=0&src=http%3A%2F%2Fimage.sonhoo.com%2Fserver10%2Fphotos%2Fphoto%2Fparceldooms%2Fd6c0b4f9e746876e4fff440fdf45d2f9.jpg
)
## STEP2 了解步进电机的工作原理及控制方法
### 步进电机的工作原理
- 通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转一个角度。每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。更多资料,大家可以参考[百度百科(可点开链接)](https://baike.baidu.com/item/步进电机/276803?fr=kg_qa "步进电机")
### 步进电机的控制
- 本次项目我们采用的是42步进电机,这种电机是比较常见的一种电机,该电机有成本低,易操控,精度相对较高等优点,当然,大家也可以根据需求在项目中使用不同的电机。电路连接部分 ,大家可以参考太极创客中的相关内容,里面对电路连接有详细地介绍说明。
-
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1583165448738&di=0f9fd56f409fca3e2496c62a97cc681b&imgtype=0&src=http%3A%2F%2Fimg006.hc360.cn%2Fy3%2FM00%2F75%2F74%2FwKhQh1WKV0iEA1KgAAAAAD47K28848.jpg)
- 在控制电机过程中,我们使用了AccelStepper步进电机库,这是ardunio的第三方库,可同时控制多台步进电机。
- 下面我将简单介绍一下AccelStepper库中的常用的语句
1.AccelStepper 电机名(步进方式,引脚1,引脚2,引脚3,引脚4)
该语句对我们使用的电机进行了一个基本的定义过程,其中,电机名是可以自定义的,我们可以根据自己的习惯进行标注,另外,步进方式可选择全步进和半步进。
2.setSpeed
该语句可对步进电机的速度进行设置,我们根据需要来调试数据最终得到一个较为满意的数值
3.setAcceleration
该语句可对步进电机的加速度进行设置,如果我们希望在较短时间内达到我们的速度预期值,可将该值设置大一点。
4.move
通过move语句,可设置电机运动的一个相对位置,通过设定数值的大小、正负,可控制电机旋转的角度、方向(正转或反转)
5.run
在对电机进行了一个基本设置后,我们需要加一个run命令,使电机开始转动。例如,stepper1.run();此条语句就是命令stepper按照我们设定的速度,步进方式进行转动。
![拓展板图片](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584632602026&di=ec68ae60e4128efb133d3cfc71434090&imgtype=0&src=http%3A%2F%2Fcbu01.alicdn.com%2Fimg%2Fibank%2F2017%2F976%2F701%2F4104107679_1460403377.jpg "拓展板图片")
## STEP2 机械立体框架部分
本抓娃娃机采用笛卡尔坐标系,有x,y,z三向抓手可移动坐标,以娃娃机左上角为工作原点,其中x轴行程0.29m,y轴行程0.425m,z轴行程0.6m,外框架采用的是2020型槽钢,在槽钢外,我们使用了0.8mmPVC透明板作为格板,娃娃机x,y,z轴使用的动力系统主要是42型步进电机,电机相数为两相,步距角为1.8度。在x,y轴步进电机上我们通过弹性联轴器连接T8型丝杆,带动丝杆旋转。其中y轴丝杆上装载了30*34*30的方形螺母转换座,方便连接挂载x轴系统的钢板,为了提高钢板稳定性,我们在y轴丝杆两边架设了两根T8光轴,以竖向直线轴承滑块将光轴与钢板相连,极大地减小了x轴系统运行时的系统震动。在x轴上我们同样使用了30*34*30螺母转向块来连接控制抓手z轴高度的42型步进电机,由于找不到合适的定制件来固定步进电机,我们使用了高强度电工胶带将电机与转向滑块连接。娃娃机使用的抓手是吊试三爪抓手,因此我们z轴步进电机是通过我们购买的0.2透明鱼线来与抓手连接。步进电机通过将连接的鱼线放出与卷入来控制其长短,进而使抓手改变z轴坐标。
娃娃机的组装过程较为简单,首先需要使用2020形槽钢架好外框架然后使用角件进行加固,加固完成后先将3D打印好的固定件与42型步进电机,轴承,丝杆相连,将其固定到框架上,然后再在挂好的X轴上加装预制的不锈钢板材,将板材与y轴电机和约束用螺丝接好.最后再将连接有钩爪的轴电机安装到位
## STEP3 代码部分
```
#include <AccelStepper.h>
#include <Servo.h>
Servo myservo;
#define PIN_X1 A8
#define PIN_Y1 A9
#define PIN_Z1 A10
#define PIN_X2 A11
#define PIN_Y2 A12
#define PIN_Z2 A13
const int moveSteps = 200;
const int enablePin = 8; // 使能控制引脚
const int xdirPin = 5; // x方向控制引脚
const int xstepPin = 2; // x步进控制引脚
const int ydirPin = 6; // y方向控制引脚
const int ystepPin = 3; // y步进控制引脚
const int zdirPin = 7; // z方向控制引脚
const int zstepPin = 4; // z步进控制引脚
const int cdirPin = 13; // c控制引脚
const int cstepPin = 12; // c控制引脚
int x1,y1,z1,x2,y2,z2;
AccelStepper stepper1(1,xstepPin,xdirPin);//建立步进电机对象1
AccelStepper stepper2(1,ystepPin,ydirPin);//建立步进电机对象2
AccelStepper stepper3(1,zstepPin,zdirPin);//建立步进电机对象3
void setup() {
myservo.attach(24);
pinMode(PIN_X1, INPUT);
pinMode(PIN_Y1, INPUT);
pinMode(PIN_X2, INPUT);
pinMode(PIN_Y2, INPUT);
pinMode(xstepPin,OUTPUT); // Arduino控制A4988x步进引脚为输出模式
pinMode(xdirPin,OUTPUT); // Arduino控制A4988x方向引脚为输出模式
pinMode(ystepPin,OUTPUT); // Arduino控制A4988y步进引脚为输出模式
pinMode(ydirPin,OUTPUT); // Arduino控制A4988y方向引脚为输出模式
pinMode(zstepPin,OUTPUT); // Arduino控制A4988z步进引脚为输出模式
pinMode(zdirPin,OUTPUT); // Arduino控制A4988z方向引脚为输出模式
pinMode(cstepPin,OUTPUT);
pinMode(cdirPin,OUTPUT);
pinMode(enablePin,OUTPUT); // Arduino控制A4988使能引脚为输出模式
digitalWrite(enablePin,LOW); // 将使能控制引脚设置为低电平从而让
// 电机驱动板进入工作状态
stepper1.setMaxSpeed(9000000.0); // 设置电机最大速度
stepper1.setAcceleration(900000.0); // 设置电机加速度
stepper2.setMaxSpeed(900000.0); // 设置电机最大速度
stepper2.setAcceleration(90000.0); // 设置电机加速度
stepper3.setMaxSpeed(90000.0); // 设置电机最大速度
stepper3.setAcceleration(9000.0); // 设置电机加速度
Serial.begin(9600);
// put your setup code here, to run once:
}
void loop() {
x1=analogRead(PIN_X1);
y1=analogRead(PIN_Y1);
z1=analogRead(PIN_Z1);
x2=analogRead(PIN_X2);
y2=analogRead(PIN_Y2);
z2=analogRead(PIN_Z2);
xsteppermove();
ysteppermove();
zsteppermove();
csteppermove();
stepper1.run();
stepper2.run();
stepper3.run();
}
void xsteppermove()
{
if (x1>600){
stepper1.move(10);
}
if (x1<400){
stepper1.move(-10);
// 1号电机运行
}
}
void ysteppermove()
{
if (y1>600){
stepper2.move(5);
}
if (y1<300){
stepper2.move(-5);
// 2号电机运行
}
}
void zsteppermove()
{
if (x2>600){
stepper3.move(5);
}
if (x2<300){
stepper3.move(-5);
// 1号电机运行
}
}
void csteppermove()
{
if (y2>600){
myservo.write(120);
delay(15);
}
if (y2<300){
myservo.write(10);
delay(15);
// 2号电机运行
}
}
```
视频素材源自:
https://www.bilibili.com/video/BV1Qb411n7rp?from=search&seid=381760315868220378 https://www.bilibili.com/video/BV1ft411R72Q?from=search&seid=18418769433002936140