We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
手头上没有arduino,只有一块已经陪伴了5年的32开发板,就索性从头移植一遍Plotclock,同时为了再熟练熟练(装逼),这个项目将会不辞辛苦地跑在freertos上....
程序在这: https://github.com/MregXN/PlotClock
9g舵机 * 3 DS1032 时钟模块 小贱钟亚克力机架 STM32F103RC 杜邦线若干
首先到手的器件是DS1302,用于给小贱钟获取当前时间。这一模块并非必须,同样有许多其他的方法获取当前时间,如连接wifi获取网络时间or设置RTC让板子自己数秒等等,具体方案还是按照各自的情况自己挑选吧。
DS1302除了复位外有两根通信线,但它的通信协议并非传统的I2C,好在网上的参考资料和手册还是比较充分,一顿砍瓜切菜就先把时间打印出来了。
之后到手的是SG90舵机,这是一款学生党们应该都再熟悉不过的舵机,操作简易价格不高,常用于小车上挥挥旗子or机械臂上动动手指。红、褐、橙三根线分别接5V、GND以及PWM信号。小贱钟需要左臂、右臂、抬臂三个舵机,学习板上的供电口不够用,所以就焊了一块转接板用于统一供电。。
焊工实在是惭愧..还另外搞坏了一块洞洞板才弄出来。
驱动舵机时需要注意:plotclock并不是只有抬和放两个动作,一笔一划都需要精确到角度,这就要求你对你自己所提供的PWM信号的占空比有充分的心里B数。
舵机所需要的PWM信号周期需要在20ms左右,当高电平在0.5ms时转0度,1ms时转45度,1.5ms时转90度,2ms时转135度。2.5ms时转180度。当然以上只是网上查到的理论值,不同的舵机所需要给的信号不尽相同,这就是需要我们这些调参员的地方啦。
TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
要输出连续周期为20ms(频率为50hz)的信号,就需要用到定时器初始化里的arr和psc了。 arr为计数值,psc为分频值。将所挂时钟分频psc倍以后开始计数,计数到arr时为一个周期,因此要产生一个50hz的信号就几乎有无数种组合方式。
我使用的TIM8,挂载的是72M的高速时钟(具体的值还需要自己去翻阅手册 。因此我决定将72M分频2K倍获得36K的时钟,计数装载值为720,那么记满720时所用时间恰好就是20ms。
TIM8_PWM_Init(719,1999);
利用TIM_SetCompareX更改每个通道的占空比,当然以下的也只是算出来的理论值,具体的还是得微调一下。
TIM_SetCompare1(TIM8,702); //0 TIM_SetCompare1(TIM8,684); //45 TIM_SetCompare1(TIM8,666); //90 TIM_SetCompare1(TIM8,648); //135 TIM_SetCompare1(TIM8,630); //180
在驯服了舵机之后就可以尝试组装机架,把舵机装上去上机调试啦。全部机架在淘宝上卖30~40吧,具体链接我就不发了,有条件的plotclock也有公布PDF,3D打印一下应该会便宜更多。
注意装好舵机之后先别急着所有装上手臂和马克笔,不然很有可能因为相互碰撞or代码bug把器件撞断,所以先装一节,等把所有参数都调稳了再继续装吧。
然后就要开始调舵机了。
在PlotClock的demo中使用arduino自带的库来驱动舵机,具体的使用方法我没去细究。但是我知道直接使用占空比作为参数来调舵机绝壁不行,想要能够让demo其他的部分具有参考性,必须将舵机驱动封装成以移动角度为参数。
在write.h 中用以下三个参数来表示每个舵机在0度时,90度时和180度时所需要的占空比数值。
#define LEFTHAND_0 655 #define LEFTHAND_90 692 //#define LEFTHAND_180 720 //#define RIGHTHAND_0 630 #define RIGHTHAND_90 658.5 #define RIGHTHAND_180 695 //#define LIFTHAND_0 630 #define LIFTHAND_90 670 #define LIFTHAND_135 688
#define LEFTHAND_0 655 #define LEFTHAND_90 692 //#define LEFTHAND_180 720
//#define RIGHTHAND_0 630 #define RIGHTHAND_90 658.5 #define RIGHTHAND_180 695
//#define LIFTHAND_0 630 #define LIFTHAND_90 670 #define LIFTHAND_135 688
这几个参数需要各位小伙伴利用TIM_SetCompareX()函数自己去调整,左臂平行面板时为0度,垂直面板时为90度。右臂平行面板时为180度,垂直面板时为90度。
注意!!
9g舵机是180度舵机, 但是左臂在书写过程中是需要转到负角度的!!右臂也是需要转到180度以上的!! 所以安装的时候一定要各预留空间!!(这也是我为什么注释掉了左臂的180度和右臂的0度,因为压根转不到!!)
在校准完成以后,就可以利用以下三个函数,以角度为参数去控制舵机啦
void leftHand_Rotate(float angle); void rightHand_Rotate(float angle); void liftHand_Rotate(float angle);
PlotClock源码中关于写字、擦除等动作都是建立在坐标轴的基础之上的,面板左下角为原点,横轴为X轴,纵轴为Y轴。 这就需要我们将左右臂的旋转角度转换成笔尖的坐标。代码中已经将需要测量的值(如左右臂的长度、面板长宽、舵机轴心位置等)define好了,不需要再改动。
然而问题是PlotClock源码中是用时间驱动舵机(???),时间跟坐标的转换我也看不太懂。就索性做了一下午的三角函数题并把它变成了代码....
剩下的部分按照PlotClock里的操作照猫画虎就好啦。最后画出来大致是这个吊样:
其实还有一些问题么得解决:
舵机的旋转角度和占空比好像并不线性...我取了两个点,其余都是按照这两个点数值算出来的 - -导致横和竖画出来都是歪的
面板左侧比面板右侧写得难看得多,左臂的舵机可能在某些角度旋转比较不灵敏..所以我就手动把时的字体放大了勉强和右侧的分保持对称...
FreeRTOS真的是吃力不讨好,以后这种就几个函数的小系统就老老实实的while(1)里面就好了,移植了有几次FreeRTOS了发现小系统完全没有必要,任务运转的不流畅就体现的十分明显了。
OK,大致就是这样啦
工程参考了大量的开源代码,是你们的开源精神给了我们装逼的机会!在此感谢:
The text was updated successfully, but these errors were encountered:
No branches or pull requests
小贱钟实现过程
前言
手头上没有arduino,只有一块已经陪伴了5年的32开发板,就索性从头移植一遍Plotclock,同时为了再熟练熟练(装逼),这个项目将会不辞辛苦地跑在freertos上....
程序在这: https://github.com/MregXN/PlotClock
材料准备
正文
首先到手的器件是DS1302,用于给小贱钟获取当前时间。这一模块并非必须,同样有许多其他的方法获取当前时间,如连接wifi获取网络时间or设置RTC让板子自己数秒等等,具体方案还是按照各自的情况自己挑选吧。
DS1302除了复位外有两根通信线,但它的通信协议并非传统的I2C,好在网上的参考资料和手册还是比较充分,一顿砍瓜切菜就先把时间打印出来了。
之后到手的是SG90舵机,这是一款学生党们应该都再熟悉不过的舵机,操作简易价格不高,常用于小车上挥挥旗子or机械臂上动动手指。红、褐、橙三根线分别接5V、GND以及PWM信号。小贱钟需要左臂、右臂、抬臂三个舵机,学习板上的供电口不够用,所以就焊了一块转接板用于统一供电。。
焊工实在是惭愧..还另外搞坏了一块洞洞板才弄出来。
驱动舵机时需要注意:plotclock并不是只有抬和放两个动作,一笔一划都需要精确到角度,这就要求你对你自己所提供的PWM信号的占空比有充分的心里B数。
舵机所需要的PWM信号周期需要在20ms左右,当高电平在0.5ms时转0度,1ms时转45度,1.5ms时转90度,2ms时转135度。2.5ms时转180度。当然以上只是网上查到的理论值,不同的舵机所需要给的信号不尽相同,这就是需要我们这些调参员的地方啦。
要输出连续周期为20ms(频率为50hz)的信号,就需要用到定时器初始化里的arr和psc了。
arr为计数值,psc为分频值。将所挂时钟分频psc倍以后开始计数,计数到arr时为一个周期,因此要产生一个50hz的信号就几乎有无数种组合方式。
我使用的TIM8,挂载的是72M的高速时钟(具体的值还需要自己去翻阅手册 。因此我决定将72M分频2K倍获得36K的时钟,计数装载值为720,那么记满720时所用时间恰好就是20ms。
利用TIM_SetCompareX更改每个通道的占空比,当然以下的也只是算出来的理论值,具体的还是得微调一下。
在驯服了舵机之后就可以尝试组装机架,把舵机装上去上机调试啦。全部机架在淘宝上卖30~40吧,具体链接我就不发了,有条件的plotclock也有公布PDF,3D打印一下应该会便宜更多。
注意装好舵机之后先别急着所有装上手臂和马克笔,不然很有可能因为相互碰撞or代码bug把器件撞断,所以先装一节,等把所有参数都调稳了再继续装吧。
然后就要开始调舵机了。
在PlotClock的demo中使用arduino自带的库来驱动舵机,具体的使用方法我没去细究。但是我知道直接使用占空比作为参数来调舵机绝壁不行,想要能够让demo其他的部分具有参考性,必须将舵机驱动封装成以移动角度为参数。
在write.h 中用以下三个参数来表示每个舵机在0度时,90度时和180度时所需要的占空比数值。
这几个参数需要各位小伙伴利用TIM_SetCompareX()函数自己去调整,左臂平行面板时为0度,垂直面板时为90度。右臂平行面板时为180度,垂直面板时为90度。
注意!!
9g舵机是180度舵机, 但是左臂在书写过程中是需要转到负角度的!!右臂也是需要转到180度以上的!! 所以安装的时候一定要各预留空间!!(这也是我为什么注释掉了左臂的180度和右臂的0度,因为压根转不到!!)
在校准完成以后,就可以利用以下三个函数,以角度为参数去控制舵机啦
PlotClock源码中关于写字、擦除等动作都是建立在坐标轴的基础之上的,面板左下角为原点,横轴为X轴,纵轴为Y轴。 这就需要我们将左右臂的旋转角度转换成笔尖的坐标。代码中已经将需要测量的值(如左右臂的长度、面板长宽、舵机轴心位置等)define好了,不需要再改动。
然而问题是PlotClock源码中是用时间驱动舵机(???),时间跟坐标的转换我也看不太懂。就索性做了一下午的三角函数题并把它变成了代码....
剩下的部分按照PlotClock里的操作照猫画虎就好啦。最后画出来大致是这个吊样:
其实还有一些问题么得解决:
舵机的旋转角度和占空比好像并不线性...我取了两个点,其余都是按照这两个点数值算出来的 - -导致横和竖画出来都是歪的
面板左侧比面板右侧写得难看得多,左臂的舵机可能在某些角度旋转比较不灵敏..所以我就手动把时的字体放大了勉强和右侧的分保持对称...
FreeRTOS真的是吃力不讨好,以后这种就几个函数的小系统就老老实实的while(1)里面就好了,移植了有几次FreeRTOS了发现小系统完全没有必要,任务运转的不流畅就体现的十分明显了。
OK,大致就是这样啦
致谢
工程参考了大量的开源代码,是你们的开源精神给了我们装逼的机会!在此感谢:
The text was updated successfully, but these errors were encountered: