分享

DIY 电动滑轨

 云深无际 2022-02-08

众所周知。。。我又块坏飞控,老哥拿去修了,然后老哥想做个这。发来个链接过来,我看完以后觉得很有搞头!完全可以卖给拍静物那帮人!

这里就对方案来个解析,等狗舔完了面山,鸡啄完了米山,蜡烛烧断了铁🔒,我就做。

我的头像真好看

https://www.bilibili.com/video/BV15T4y1g7gt?p=1&share_medium=iphone&share_plat=ios&share_source=GENERIC&share_tag=s_i&timestamp=1640536319&unique_k=c1FRrKK

B站位置

电路,核心就是步进电机,赋予了不同的自由度,A4988是驱动芯片。

安装好的样子

夹着手机拍摄

运行一景

https://www.youtube.com/watch?v=qub5chyIQ0s

这个链接是YouTube的位置

使用了三个步进电机

芯片的调方向

以前做小打印机的时候老用

推荐的接线

使用时候的正反转

需要用到的轴承

记住名称然后去买

   const int interruptA = 0; / / Interrupt 0 (pin 2)
const int interruptB = 1; / / Interrupt 1 (pin 3)
int CLK = 2; / / PIN2
int DAT = 3; / / PIN3
int BUTTON = 4; / / PIN4
int LED1 = 5; / / PIN5
int LED2 = 6; / / PIN6
int COUNT = 0;
void setup ()
{
attachInterrupt (interruptA, RoteStateChanged, FALLING);
/ / AttachInterrupt (interruptB, buttonState, FALLING);
pinMode (CLK, INPUT);
digitalWrite (2, HIGH); / / Pull High Restance
pinMode (DAT, INPUT);
digitalWrite (3, HIGH); / / Pull High Restance
pinMode (BUTTON, INPUT);
digitalWrite (4, HIGH); / / Pull High Restance
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
Serial.begin (9600);
}
void loop ()
{
if (! (digitalRead (BUTTON)))
{
COUNT = 0;
Serial.println ("STOP COUNT = 0");
digitalWrite (LED1, LOW);
digitalWrite (LED2, LOW);
delay (2000);
}
Serial.println (COUNT);
}
/ / -------------------------------------------
void RoteStateChanged () / / When CLK FALLING READ DAT
{
if (digitalRead (DAT)) / / When DAT = HIGH IS FORWARD
{
COUNT;
digitalWrite (LED1, HIGH);
digitalWrite (LED2, LOW);
delay (20);
}
else / / When DAT = LOW IS BackRote
{
COUNT -;
digitalWrite (LED2, HIGH);
digitalWrite (LED1, LOW);
delay (20);
   } }

因为文章写的时间太久远了。。。我也不知道我这些代码是干嘛用的

大概是读取一个旋钮的值去控制啥

限位开关,就是机器到边缘的时候会触发这个,断电

这叫同步皮带轮组

这叫同步带

同步轮

线性导轨

这个叫什么机械装配图?

迷你球形云台

德林轮

读到这里的时候,专业的摄影制作人有了一些新的要求:

  1. 加入加速控制输入。

  2.  第三个电机的选项对于倾斜功能非常有用。

  3.  一个带有可选功能的菜单,可以在 A 点和 B 点之间连续跳动以循环拍摄

    4. 作为升级,带有磁铁标记位置的 AS5600 编码器模块会很棒。手动定位摄像机始终是摄影师的更好选择。

    5. 最后,还可以扩展相机镜头对焦电机的代码。

https://www.airspayce.com/mikem/arduino/AccelStepper/index.html

这里是项目使用的电机库,相对于以前的库,加入了很多的有趣功能。

一些功能

这个库中计算的是:每秒步数而不是每秒弧度(因为我们不知道电机的步距角)根据所需加速度计算第一步的初始步距间隔 在后续步长中,根据前一步计算更短的步距间隔步直到达到最大速度。

这个库里面有两个类,一个是控制带有加速功能的步进电机,一个是控制多个步进电机。

单一的加速步进电机

https://www.embedded.com/generate-stepper-motor-speed-profiles-in-real-time/

本文的步进电机控制算法其实不是随便得来的:

而是有一套完整的理论基础

因为比赛的原因,我需要使用使用步进电机,所以这块的源码要分析一下。

设置使用了4个引脚

其实使用的是5个脚

电机的接口类型

基本上对应

旋转方向 

    AccelStepper    (    uint8_t interface = AccelStepper::FULL4WIRE,     uint8_t pin1 = 2,     uint8_t pin2 = 3,     uint8_t pin3 = 4,     uint8_t pin4 = 5,     bool enable = true);

构造函数:可以同时拥有多个步进器,它们都以不同的速度和加速度移动,前提是您以足够频繁的间隔调用它们的run()函数。

就是这个run函数,注意!这个库是开环的控制器,所以哪个位置是大约的

http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

这些就是对象的建立

相关的变量定义

功能切换

屏幕的启动,步进电机的启动,显示

home函数,这里就是起始的位置,代码简单

剩下逻辑简单,我就不写了,关键就是这个库的使用:

http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

在我目前做的一个项目中也是有电机,不过也是开环的,我想为了这个控制的精准,应该使用闭环控制。

这是我们库中使用的算法。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多