多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
```[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