牧夫天文网

 找回密码
 加入牧夫(请注明天文爱好者,否则无法通过审核)

QQ登录

只需一步,快速开始

[自制DIY] 自制单轴电跟的基础

  [复制链接]
tianyuan08 发表于 2020-3-3 17:36 | 显示全部楼层 |阅读模式 来自: 甘肃省兰州市 联通

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?加入牧夫(请注明天文爱好者,否则无法通过审核)

x
本帖最后由 tianyuan08 于 2020-3-16 23:36 编辑

天文爱好初学者一枚,有一个晶华的JE100A赤道仪,102普消,某夜观测猎户座星云用相机曝光2秒排到了M42,无奈没有电跟系统,无法长时曝光,某宝看了看一个JE100A电跟竟然要680,性价比极低,于是萌生了自制电跟的想法。看了好多帖子关于如何制作电跟,但是细节比较少,打算把制作电跟的基础讲一下,大神轻拍!

1. 器材
从某宝购置4件:(1)42步进电机,扭矩0.25NM,电流1A,步距角1.8度;(2)Arduino开发板,国产的UNO R3;(3)TB6600升级版步进电机驱动器;(4)12V锂电池,18650电芯,公母双出D头;(5)0.5模45不锈钢20齿,0.5模铝合金80齿,齿比1:4;

2. 计算
(1)力矩问题,电机扭矩最大0.28NM,0.5模20齿的齿轮半径大约0.005m,则在齿轮圆周上的最大受力为0.28/0.005=56N,电机齿轮与赤经蜗杆上装的齿轮齿比是1比4,赤经蜗杆齿轮半径大约0.02m,也就是说赤经蜗杆扭矩1.12NM以下,电机还能转得动。现在需要算一下,装上主镜后,转动赤经时赤经蜗杆扭矩是多少,例如我的主镜为3kg,重力是30N,主镜的重心到与赤经蜗杆连接的极轴齿轮距离假设0.3m,那么转动主镜所需扭矩就是9NM。赤经蜗杆的传动比是多少我不清楚,猜测难道是1比144?因为蜗杆转144圈,赤经才能转1圈,如果是1比144,那赤经蜗杆所需扭矩就小的不能再小了,才0.0625NM,再通过赤经蜗杆齿轮传递到电机,电机轴扭矩只要达到0.016NM,就转起来了,哪怕考虑到各种连接的传动效率,实际电机所需输出扭矩也远小于0.28NM,所以42步进电机的力量绝对够用。
(2)电机脉冲数,JE100A的赤经齿数为144,赤经刻度盘刻度数为24*6=144个刻度,简单的测试了一下,当我转动赤经微调一周时,刻度盘上刚好转过一个刻度,也就是说144齿无误。地球一天24小时,1440分钟,分解到刻度盘上,就是10分钟一个刻度,地球每小时15度,则每个刻度是2.5度,也就是说赤经轴转360度,刚好能抵消地球自转10分钟。现在就知道了,我们需要让赤经轴以每10分钟转360度运行。在齿比是1:4的情况下,赤经轴转1周,电机上的齿轮需要转4周,也就是说每10分钟电机转4周即可。步距角1.8度情况下,42步进电机需要200步转360度,600秒(10分钟)转4周需要800步,则每秒1.33333333步,也就是频率为1.333333HZ,周期为0.75s。这种转法行不行?行,问题就是震动有点点大,如果要减小电机的震动,则必须细分。我目前选择的是8倍细分,也就是步进电机1600步才能转一周,此时600秒走过6400步,频率为10.666666666HZ,周期为0.09375s,这时候步进电机的转动会平稳很多,没有突突突的感觉了!

3. 调试
(1)接线,将步进电机的A+ A- B+ B-四根线接入TB6600(TB6600上有标注),此时电机的控制将由驱动器完成,我们不需要写程序分别控制电流输出到电机,所以只需要负责脉冲信号即可。在Arduino开发板上,选择可输出脉冲信号的口,比如我的UNO R3上3、5、6、9、10、11是可以输出脉冲信号的端口(开发板上可以看出来,端口号旁边有个~符号),随便选一个端口,将线接入TB6600驱动器的PUL+,再将TB6600驱动器上的PUL-接入Arduino板上的GND。TB6600的细分在外壳上也有说明,根据说明将上面的开关调整合适即可!另外注意电流的设置!
(2)程序控制
Arduino开发板的开发非常简单,步进电机的控制程序用几行代码也就搞出来了,Arduino怎么配置我就不多说了,网上资料很多,无非就是先装个CH340 USB转串口驱动,再把开发板连到电脑上,下载一个Arduino的IDE(集成开发环境),就能用了!Arduino的IDE进去以后,大家会看到两个函数:setup和loop。setup是开发板通电后,只会运行一次,一般用来设置一些环境和变量,而loop其实就是程序的一个死循环,我们需要在setup里设置端口输入输出,在loop里写脉冲发送,一个简单的程序如下:

//在setup里设置脉冲输出为开发板的D9
void setup() {
  // put your setup code here, to run once:
pinMode(9, OUTPUT); //在这里指定开发板上的D9为输出信号端口
}

//将电机控制写loop函数里,loop函数里的内容会一直执行下去
void loop() {
  // put your main code here, to run repeatedly:
  for(int i=0; i<6400; i++)
  {
    digitalWrite(9, HIGH); //给D9一个高电平
    delay(46); //延迟46ms
    delayMicroseconds(875); //延迟0.875ms,delayMicroseconds是以微妙为单位,875微妙刚好0.875ms
    digitalWrite(9, LOW); //给D9一个低电平
    delay(46); //延迟46ms
    delayMicroseconds(875); //延迟0.875ms
  }
}


当arduino执行上面的程序时,会不断的执行loop里面的循环,每次loop的时候,都要循环6400次(前面讲过了),每次循环先给D9一个高电平,持续46.875ms,再给一个低电平,持续46.875ms,相当于6400个周期的方波信号,一个周期为93.75ms(和前面讲的一致),6400个周期总共需要6400*0.09375s=600s。此时,电机将以10分钟4周的方式工作(我在电机上做了标记测算过,基本准确)。
(3)扩展
前面只用到了TB6600的PUL,另外两个也很重要,ENA使能和DIR方向,ENA是是否为电机上电,DIR是控制电机转动的方向。我将ENA+和DIR+分别接入了D11和D10,ENA-和DIR-也接入了GND。DIR+给高电平时,电机将正向旋转,低电平为逆向旋转。特别注意这个ENA+,ENA+给高电平时电机不通电,此时可以随意转动电机轴,ENA+给低电平时电机通电,电机轴转不动。此时如何控制ENA和DIR呢?这就需要用外部触发了,也就是Arduino的外部中断,UNO R3只有两个外部中断输入口,D2和D3,当使用外部中断的时候,需要把D2和D3设置成上拉电阻模式(D2,D3持续高电平),然后在arduino里设置两个中断函数,分别在下降沿触发,一个用于控制ENA,一个用于控制DIR。随便写了个示例程序如下:


//宏定义,学过编程都知道,没学过你只要知道后面看到ENA,全部被11替换
#define ENA 11
#define DIR 10
#define PUL 9
#define ENA_INT 2
#define DIR_INT 3

//定义了两个全局变量,用于保存ENA和DIR状态,HIGH=1,LOW=0
char ENA_STATE = HIGH;
char DIR_STATE = LOW;

void setup() {
  // put your setup code here, to run once:
  pinMode(ENA, OUTPUT); //设置D11为ENA控制信号输出
  pinMode(DIR, OUTPUT); //设置D10为DIR控制信号输出
  pinMode(PUL, OUTPUT);
  pinMode(ENA_INT, INPUT_PULLUP); //设置D2为上拉电阻状态,持续等于1
  pinMode(DIR_INT, INPUT_PULLUP); //设置D3为上拉电阻状态,持续等于1
  attachInterrupt(0, ena_blink, FALLING); //注册中断0(对应D2)为下降沿触发,参数2为中断服务函数,参数参说明为下降沿触发
  attachInterrupt(1, dir_blink, FALLING); //注册中断1(对应D3)为下降沿触发,参数2为中断服务函数,参数参说明为下降沿触发

  digitalWrite(ENA, ENA_STATE); //给ENA一个HIGH信号,进入LOOP函数时电机不上电
  digitalWrite(DIR, DIR_STATE); //指定一个方向
}

//ENA的中断服务函数,当D2出现一个下降沿时,将触发此函数
//函数里判断了ENA状态,如果时HIGH则转LOW同时改变信号,如果时LOW则转HIGH
void ena_blink()
{
  if(ENA_STATE==HIGH)
  {
    ENA_STATE = LOW;
    digitalWrite(ENA, ENA_STATE);  
  }
  else
  {
    ENA_STATE = HIGH;
    digitalWrite(ENA, ENA_STATE);  
  }
}

//方向控制的中断服务函数,同理ENA中断服务

void dir_blink()


{
  if(DIR_STATE==HIGH)
  {
    DIR_STATE = LOW;
    digitalWrite(DIR, DIR_STATE);  
  }
  else
  {
    DIR_STATE = HIGH;
    digitalWrite(DIR, DIR_STATE);
  }
}

//LOOP还是以前的电机控制部分
void loop() {
  // put your main code here, to run repeatedly:
  for(int i=0; i<200; i++)
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(1000);
    //delay(150);
    digitalWrite(PUL, LOW);
    //delay(150);
    delayMicroseconds(1000);
  }
}
当讲上面的程序烧入arduino开发板后,电机开始是不会转动的,此时需要用我图中预留出来的那根绿色的线,去桶一下D2口,由于绿色线接地,所以D2马上会从高电平转低电平,此时出现一个下降沿,D2对应的ENA中断就会启动,改变了ENA信号


(4) 补充:
听取专家的建议,用时间中断代替了delay函数,重新写的代码如下:

char toggle = LOW; //用来作为标志

void setup() {
  // put your setup code here, to run once:
  pinMode(9, OUTPUT);
  cli();
  TCCR1A = 0; //使用TIMER1
  TCCR1B = 0;
  TCNT1 = 0; //计数器清0
  OCR1A = 1464; //比较寄存器的值1464=16000000HZ/256/42.67HZ-1
  TCCR1B |= (1 << WGM12); //CTC模式,比较计数器和比较寄存器的值相等则产生中断
  TCCR1B |= (1 << CS12); //预分频256
  TIMSK1 |= (1 << OCIE1A); //中断
  sei();

}

ISR(TIMER1_COMPA_vect)
{
  toggle = !toggle;  digitalWrite(9, toggle);
}

void loop() {
  // put your main code here, to run repeatedly:

}


最后:
上架还没搞完,先发点基础的内容,欢迎大家共同交流!

更新
上架了,测量孔位真是麻烦,不在同一个平面,最后发现齿轮装上去,大的齿轮根本不平,咬合问题很大,最后换成同步带轮,毕竟同步带轮的容错率高啊


TB6600驱动器,需要接电机的是A+ A- B+ B-,上面的ENA是电机使能信号,DIR是电机方向信号,PUL是电机的脉冲 ...

TB6600驱动器,需要接电机的是A+ A- B+ B-,上面的ENA是电机使能信号,DIR是电机方向信号,PUL是电机的脉冲 ...

ENA+接D11,DIR+接D10,END-和DIR-分别接地,绿色那根单出来的线也是接地的,可以当开关用 ... ... ... ... ...

ENA+接D11,DIR+接D10,END-和DIR-分别接地,绿色那根单出来的线也是接地的,可以当开关用 ... ... ... ... ...
接线.jpg

ENA+, DIR+和PUL+,分别接在板上的D11,D10和D9,PUL-接在GND

ENA+, DIR+和PUL+,分别接在板上的D11,D10和D9,PUL-接在GND

ENA-和DIR-接GND,绿色的是引出来的接地线,中断服务程序状态捅一下D2就是ENA状态转换,捅D3改电机方向 ... ...

ENA-和DIR-接GND,绿色的是引出来的接地线,中断服务程序状态捅一下D2就是ENA状态转换,捅D3改电机方向 ... ...
IMG20200316204707.jpg
IMG20200316204717.jpg

最终的测试,曝光30秒跟踪了一下m42,天气不好外加隔着玻璃的阳台党,效果很差,极轴随便对的,似乎没太怎 ...

最终的测试,曝光30秒跟踪了一下m42,天气不好外加隔着玻璃的阳台党,效果很差,极轴随便对的,似乎没太怎  ...

简单增强一下...

简单增强一下...
npg 发表于 2020-3-3 17:41 | 显示全部楼层 来自: 河北省廊坊市 联通
现在的初学者一个个怎么强的吗?太厉害了!
回复 支持 反对

使用道具 举报

jia2shuo 发表于 2020-3-3 18:33 | 显示全部楼层 来自: 河南省安阳市 联通
好文章。
回复 支持 反对

使用道具 举报

 楼主| tianyuan08 发表于 2020-3-3 19:34 来自手机 | 显示全部楼层 来自: 甘肃省兰州市 电信
npg 发表于 2020-3-3 17:41
现在的初学者一个个怎么强的吗?太厉害了!

只不过刚好对步进电机控制比较了解,天文方面还是初学者,还得大家多多指教
回复 支持 反对

使用道具 举报

 楼主| tianyuan08 发表于 2020-3-3 19:34 来自手机 | 显示全部楼层 来自: 甘肃省兰州市 电信
jia2shuo 发表于 2020-3-3 18:33
好文章。

谢谢谢谢
回复 支持 反对

使用道具 举报

tcjsjxx 发表于 2020-3-3 20:13 | 显示全部楼层 来自: 陕西省渭南市 电信
本帖最后由 tcjsjxx 于 2020-3-3 21:27 编辑

谢谢分享,真是好文!期待实测效果。
回复 支持 反对

使用道具 举报

SpaceTraveler 发表于 2020-3-3 21:35 | 显示全部楼层 来自: 宁夏银川市 电信
好文,收藏了
回复 支持 反对

使用道具 举报

vvv64 发表于 2020-3-4 07:19 | 显示全部楼层 来自: 青海省 移动(全省通用)
谢谢分享,真是好文!期待实测效果。
回复 支持 反对

使用道具 举报

maasai 发表于 2020-3-4 09:27 | 显示全部楼层 来自: 江苏省苏州市 电信
做的不错。
如果要用来跟踪拍摄,用DELAYS产生脉冲,精度不够。42步进扭矩足够,但计算不对。
回复 支持 反对

使用道具 举报

 楼主| tianyuan08 发表于 2020-3-4 10:23 | 显示全部楼层 来自: 甘肃省兰州市 联通
本帖最后由 tianyuan08 于 2020-3-4 10:37 编辑
maasai 发表于 2020-3-4 09:27
做的不错。
如果要用来跟踪拍摄,用DELAYS产生脉冲,精度不够。42步进扭矩足够,但计算不对。 ...

嗯,用delay产生的脉冲精度肯定不如脉冲发生器,不过一个开发板就30块钱,成本低很多,不知道能跟住多久。另外力矩计算哪里错了?还请指教

点评

arduino你可以用时间中断函数呀,精确多了。 函数里不要放太多代码,只翻转脉冲。 如果要用来拍摄跟踪,不能简单用一天24小时,应该用恒星时。 既然拍摄了,导星是必要的,加2个变量,接收导星信号,论坛似乎有帖子  详情 回复 发表于 2020-3-4 11:50
0.28NM是指步进电机的保持扭矩,实际应用时一般取1/3较稳妥。 赤道仪静态时是平衡的,静态加在电机上的扭矩是零,应该考虑加速赤道仪的动态需要的扭矩和摩擦扭矩。 不过42电机驱动你的赤道仪足够了。  详情 回复 发表于 2020-3-4 11:42
回复 支持 反对

使用道具 举报

maasai 发表于 2020-3-4 11:42 | 显示全部楼层 来自: 江苏省苏州市 电信
tianyuan08 发表于 2020-3-4 10:23
嗯,用delay产生的脉冲精度肯定不如脉冲发生器,不过一个开发板就30块钱,成本低很多,不知道能跟住多久{: ...

0.28NM是指步进电机的保持扭矩,实际应用时一般取1/3较稳妥。
赤道仪静态时是平衡的,静态加在电机上的扭矩是零,应该考虑加速赤道仪的动态需要的扭矩和摩擦扭矩。
不过42电机驱动你的赤道仪足够了。


回复 支持 反对

使用道具 举报

maasai 发表于 2020-3-4 11:50 | 显示全部楼层 来自: 江苏省苏州市 电信
tianyuan08 发表于 2020-3-4 10:23
嗯,用delay产生的脉冲精度肯定不如脉冲发生器,不过一个开发板就30块钱,成本低很多,不知道能跟住多久{: ...

arduino你可以用时间中断函数呀,精确多了。
函数里不要放太多代码,只翻转脉冲。
如果要用来拍摄跟踪,不能简单用一天24小时,应该用恒星时。
既然拍摄了,导星是必要的,加2个变量,接收导星信号,论坛似乎有帖子,你搜搜看。

回复 支持 反对

使用道具 举报

 楼主| tianyuan08 发表于 2020-3-4 14:39 | 显示全部楼层 来自: 甘肃省兰州市 联通
maasai 发表于 2020-3-4 11:42
0.28NM是指步进电机的保持扭矩,实际应用时一般取1/3较稳妥。
赤道仪静态时是平衡的,静态加在电机上的扭 ...

对,这个2.8NM是保持扭矩,实际不应该这么算。这个克服摩擦力要多少N这个真不知道咋算,我只简单的考虑极轴平行地面时,转动赤经轴所需扭矩传递到电机后所需输出理论扭矩是多少,当然克服摩擦以及传动效率算进去的话,实际所需扭矩应该更大一些,不过这个值仍然很小啊,再考虑到这个转速如此低,所以实际所需扭矩42步进电机是能满足了~。
顺便去改一下步进电机脉冲发生,用时间中断试试,多谢指正!
回复 支持 反对

使用道具 举报

KKKVVV 发表于 2020-3-4 15:55 | 显示全部楼层 来自: 广东省深圳市 天威视讯
做得不错,好像有现成的开源
回复 支持 反对

使用道具 举报

yutianbb 发表于 2020-3-9 11:30 | 显示全部楼层 来自: 江西省宜春市 电信
好文!最合适象我这样对编程一知半解的。
回复 支持 反对

使用道具 举报

venn 发表于 2020-3-9 15:09 | 显示全部楼层 来自: 北京市 中联云港
不懂硬件的人请教一下:网上看到有些电机驱动套件成品可以拿来用做导星电跟吗?下面就是找到的一个。如果功能选P3: 给信号1;正转一定角度停;  给信号2;反转一定角度停。用导星ST4的线连上:赤经加 连信号1, 赤经减连信号2, 调整步进角度到一个比较小的数字。这样成吗?

这是产品说明:
1:产品型号:YF—20;步进电机驱动及控制一体;可以直接接步进电机;无需外接驱动器;提供详细演示视频;可调速;可设定角度;可实时显示速度;内置加减速等算法保证精准度;厂家直销;支持定做。
2:电压电流范围:开可以控制电压:7~30V 电流:2A以内;常见42,57两相四线五线六线步进电机;
3:速度说明:可实时调速:0.1~999转/分钟;(大部分42,57步进电机最高转速约350转/分钟)
4:角度说明:角度:1~9999度可设定; 360度为一圈;用户可换算成自己的需要的运行距离
5:功能列表:
P--1:点动;按住就转,松开停;
P--2:自锁:按正转保持正转;按反转保持反转;松开不停;
P--3:给信号1;正转一定角度停;  给信号2;反转一定角度停;
P--4:给信号1;正转一定角度停;  给信号2;反转回到原点停;
P--5:给信号1;正转一定角度停;再给信号1;反转回到原点停;
P--6:给信号1;正转一定角度停;信号消失; 反转回到原点停;
P--7:通电后,在两个限位(信号1,信号2)之间来回循环运行
6:按键及信号说明:
功能键: 长按2秒进入功能选择;短按调节功能;调好2秒之后;自动保存并退出设置模式
复位键: 长按2秒电机反转找起点限位(信号3) 此功能用户需要在信号3接限位传感器
正转键: 同信号1
反转键: 同信号2
停止键: 同信号3
7:电路板预留外接驱动器接口;注意外接驱动器细分请调至32细分可与本电路板各个参数配套
h电机驱动.jpg

点评

不知道这个驱动器要求什么信号,步进电机是脉冲信号,比如方波,如果这个驱动器不能产生脉冲信号,那导星必须能发送脉冲信号到这个接口,如果驱动器不需要脉冲信号输入,只要简单的高电平,那就简单了,设置好方向和  详情 回复 发表于 2020-3-16 21:07
回复 支持 反对

使用道具 举报

Bryan_SH 发表于 2020-3-16 08:57 来自手机 | 显示全部楼层 来自: 江苏省 移动数据上网公共出口
步进电机细分最大的作用是运行平滑,本身细分精度并不是很准确。一个步距脚1.8度或者0.9度 细分128。也就是里面的参考电源细分了128等分。DAC输出噪音就有可能飘移了,再加上步进电机里面的齿型硅钢片加工精度误差。我一直很怀疑用高细分在这里有多大意义
回复 支持 反对

使用道具 举报

 楼主| tianyuan08 发表于 2020-3-16 21:07 | 显示全部楼层 来自: 甘肃省兰州市 电信
venn 发表于 2020-3-9 15:09
不懂硬件的人请教一下:网上看到有些电机驱动套件成品可以拿来用做导星电跟吗?下面就是找到的一个。如果功 ...

不知道这个驱动器要求什么信号,步进电机是脉冲信号,比如方波,如果这个驱动器不能产生脉冲信号,那导星必须能发送脉冲信号到这个接口,如果驱动器不需要脉冲信号输入,只要简单的高电平,那就简单了,设置好方向和角度,想转多久给多久高电平

点评

这个是电平触发的。我的想法是把它设置在功能P--3上:给信号1;正转一定角度停; 给信号2;反转一定角度停;把ST4导星信号的赤经进接信号,赤经退接信号2。据我的理解,ST4信号是由电脑解算导星CCD的影像信息,转换  详情 回复 发表于 2020-3-18 10:00
回复 支持 反对

使用道具 举报

KKKVVV 发表于 2020-3-17 14:12 | 显示全部楼层 来自: 广东省深圳市 电信
TB6600驱动器太大了,可以找个小一些的驱动器
回复 支持 反对

使用道具 举报

venn 发表于 2020-3-18 10:00 | 显示全部楼层 来自: 北京市 中联云港
tianyuan08 发表于 2020-3-16 21:07
不知道这个驱动器要求什么信号,步进电机是脉冲信号,比如方波,如果这个驱动器不能产生脉冲信号,那导星 ...

这个是电平触发的。我的想法是把它设置在功能P--3上:给信号1;正转一定角度停;  给信号2;反转一定角度停;把ST4导星信号的赤经进接信号,赤经退接信号2。据我的理解,ST4信号是由电脑解算导星CCD的影像信息,转换成ST4信号输出, ST4是一个6针的RJ11电话线插头,有一个公共脚和四个方向脚,公共脚为地,而方向脚在不作用状态是对地高阻抗态,而方向脚在作用时是对地低阻抗态。这样接起来应该就成。
回复 支持 反对

使用道具 举报

本版积分规则

快速回复 返回顶部 返回列表