2011年05月 文档列表

最近入手的几样小东西

最近没干啥大事,主要是在加班之余买点东西。虽说激光二极管很危险,但还是忍不住出手了。没敢买1000mw的(不仅危险,而且还很贵),最后弄了两个200mw的红光二极管激光头。

激光二极管

激光二极管

其实已经买了好几天了,因为圈妈不让带回家,只好在公司放着。做过简单的测试,得到以下几个小结果:
1,激光二极管不是我想象的那样,直接发射的就是直线光束,它其实跟手电一样,需要一个聚焦透镜才能工作,可能优点是光源的点非常小,这样聚焦以后的能量才可能集中;
2,在50cm左右的距离对焦,可以在2秒左右点燃红色的火柴头,这是在前几天北京的大风天气时测试的;
3,烧黑色的纸,瞬间就可以冒烟,白色的反应很慢;短时间照在手上,有微微的灼烧感;
4,如果用来做激光炮打蚊子,完全不可行,一方面是距离远时光斑太大,另一方面是能量不够大,无法做到秒杀;
5,用眼睛看光斑(注意,是照着东西上的光斑,直视光源的话必瞎无疑!)会很难受,最好弄个墨镜带着;

发一个关灯版的:

红色激光

红色激光

总体说来,打蚊子的激光炮已经判定不可行,已经零七八碎的买了好多相关的东西,看来只能收起来等待发掘创意了。

这是一对儿45°的天顶镜,我企图用它们来折射光线,转到瞄准镜上:

一对天顶镜

一对天顶镜

这是一个小型的望远镜,可以用来做瞄准镜:

小望远镜

小望远镜

下面是我设想的原理图,有兴趣的同学可以试试是否可行。BTW,虽然我想的时候是激光炮,但是图画出来越看越像个激光枪。这个带瞄准镜的激光枪,好处是“所见即所得”,因为激光枪不会像子弹一样有抛物线弹道,也不会受风速影响。经过调校以后,你瞄准一个点的时候,就可以准确命中它。天顶镜2的中心可以打一个很小的孔,仅供光束通过,应该不影响观察。
(以上歪理纯属在意念中完成,未经验证)

激光枪的光路构想图

激光枪的光路构想图

最后是一个可以用在Arduino上的蓝牙小电路,这个倒是可以做别的用途,有空的时候准备试试和手机的蓝牙通信。

这个小板子比一般的蓝牙模块多2个脚,其中一个是用来做状态指示,未连接时输出方波,连接成功后输出高电平,在Arduino板子上可以监控状态;另一个是使能开关,默认挂空时是使能,输入高电平时蓝牙模块被中断,这样就可以在程序里开关蓝牙了。

蓝牙小电路

蓝牙小电路

集中回复关于下推式磁悬浮的一些问题

wlreg 等同学在PID平衡算法问了好多问题,那个页面的评论太长,已经找不到组织了,所以重开一个页面回答一些问题。

Q1、看了攻略和上面的评论,整个装置通上电后通过电位器先将接运放的传感器的输出调节为2.5V,然后再放浮子上去。霍尔传感器感应的气势是浮子的磁通吗?然后通过传感器的输出变化反应浮子的倾斜程度?(错了请指正呀,感谢的说。)
今天在图书馆居然被我找到一本关于PID控制器的书,对照了一下上面的符号和程序上的符号,大概理解了一些之前不懂的变量的意义,但是程序上还是有地方不懂,希望老男孩筒子指导一下吧。

A:气势这个词用的相当诡异,可能是因为wlreg同学刚喝了藿香正气水吧 :)
首先,电位器把输出调节到2V附近而不是2.5V附近,印象中那个东东输出的电压上限是3.7V,从读数上看最大值到750左右,我大概取了个中间值,对应的读数是400左右。
传感器感应的是浮子的磁通量的“变化量”,因为传感器垂直安装在线圈的中心高度,所以线圈中通电时对传感器基本没影响。而底座大磁环是不动的,所以传感器的读数变化基本都是由于浮子引起的。请注意这里浮子不会倾斜,只会水平移动!通过读数变化就可以知道浮子移动的方向。

—————————————————————

Q2:一开始的端口设置里,int rotatePin=3,rotatePin这个变量貌似一直都没有用过吧(只在上面程序注释里看见出现过)……

A:介位童鞋,你算是说对了,这个变量没有用。那它为啥会出现在代码里呢?其实在我的博客的某个角落里,写过企图给线圈加上旋转磁场,最后没有成功。所以这是一段没有删除干净的代码……嘿嘿,这个角落实在太角落了,以至于我也没有找到,汗

—————————————————————

Q3:Kp是比例系数,Kd是微分系数,这个程序采用的是增进式PID?那么setKd,和setKp这些系数都是实验慢慢调试出来的吗?如果我做的有些部件(磁铁的大小之类的)的和老男孩筒子列表里的有出入,那么这些值都要自己找了?

A: 没错,这些值都要自己找,但是也并非没有经验可循,建议先记录一段log到电脑上,然后把power值和传感器读数列出来对比,就可以估算出这些值了。推荐一个叫Origin的画图软件,可以画出图表对比。据说用excel也可以 :)

—————————————————————

Q4: 程序第82行,if(debug) tick=0;
这里debug不是设定为false吗?后面也貌似没有看见有更改过这个值,那么这一句实质上是永远不会运行的吧?

A: 当你需要调试的时候,把它改为true然后重新烧入板子。debug模式下不是为了悬浮的,而是为了拧那个电位器。
这个说来话长了:那两个电位器的螺丝孔很小,我需要两只手配合才能拧它。这样就不方便用万用表读数,我那个乱七八糟的洞洞板已经焊不下新的线头用来测量。所以你看到下面的几句:
    Serial.println(adjustValue1);   
    Serial.println(adjustValue2);   
    Serial.println(readValue1);   
    Serial.println(readValue2);  

这几行代码把读数打印到屏幕上,这样我就可以两只手调电阻,抬头看读数鸟。
另外顺便加了几行代码,用来判断线圈通电的方向是不是正确。

—————————————————————

Q5:程序第87行,if(tick2>=2;
这个是右移两位的意思吗?就是相当于除以4了,这个的意义何在呢?

A:读4次然后求平均嘛

—————————————————————

Q7、程序144行,if(debug)下面的括起来的真的会运行吗?

A:这个问题其实在Q4解释过了

—————————————————————

Q8: 程序第162行,delay(32000)
32000这个其实不用纠结的吧?但是总觉得很特殊的样子,为什么是这个设置……

A: 在PWM的秘密的两篇文章里,提到了改变PWM频率后,delay(n)的周期会产生变化,这里32000大约是0.5秒左右。对于我们这种老眼昏花的同志,再快就看不清了。

—————————————————————

Q9:程序第131行,Pid1.target = min(755, min(adjustValue1 + offset, Pid1.target));
755这个值是什么样来的呢?不是很明白的样子……

A:参见Q1,这个755应该是我调节时曾经见过的最大值。

————————————————————–

Q10: 额,之前那个问题也问错了,程序的PID应该是位置型的……
不过按照那个位置型PID的公式,貌似下面的这段就有点不解了
——————————————————
error = readValue1 – Pid1.target;
v = error – Pid1.preError;
Pid1.v = (Pid1.v * 6 + v) / 7;
Pid1.power = (int)error * Pid1.Kd + Pid1.v * Pid1.Kp;
——————————————————
按照公式,这里应该是
Pid1.power =Pid1.Kd*v+Pid1.Kp*(int)error
不是吗?

A: 这次真的满头大汗了,仔细看了一下,我好像确实是把kd和kp两个参数的含义搞错了。今天忙了一天,现在大脑还是一团浆糊,明天早上再看一眼确认。不过参数虽然含义弄错了,那些参数值是可用的,你把代码里所有的kd和kp互换一下吧 :)
另外,(int) 要放在最前面,是把结果取整用的。

——————————————————————————

Q11: 又有了一个新问题。仔细看了一下程序
第87行
———————————————–
if(tick2<50) {tick = 0;return;}
————————————————
按照我学的C语言的理解(只是入门级别,可能有错),这里有一个return语句,就是执行到这个return的话就会跳出函数体了,而这里正在执行的函数式loop函数,也就是说执行到这里,就跳出loop函数不往下执行了,按照开发板的运作,loop这个函数又会被从头开始执行。而程序的113行和119行也有一个return语句……
其实我想问的是,按我的理解这段if(tick==500)这段程序是用来检测端口的值用的……其实特意弄tick和tick2这两个变量以及return语句这样来检测端口的用途是什么呢……这段有些弄不懂意图……

A:你看这一段中间有一句:if(writeLog)。所以总体来说,tick1和tick2都是用来记录log用的,所以你不用太纠结于这段代码是什么意思。说实话我刚才看了一会儿也有点头昏眼花,恨不得把作者揪出来打一顿。仔细回想了一下,最早只有tick1,当循环500次以后,集中发送一次log(因为串口发数据很慢,会影响采样频率)。后来发现500次还不到1秒钟,这时候可能刚刚放上去还没平稳呢。所以加上了一个tick2,这个500次的循环执行50次以后,大概是30秒,这时候再发送最后的500个数据。
然后再看一下真正运行时的情况,这时候writeLog=false,这些代码基本都属于没有用的了,另外还有一些莫名其妙的tick2 = 0;  tick>500之类的,应该都是进化过程中的垃圾产物。

—————————————————————–

第一回遇到这么认真的读者。其实看代码重在领会精神,没必要理解每一行代码的作用。但是认真的同学也有认真的好处,钻研精神值得赞赏!尤其是那个kp和kd的参数,

其他页面的问题就回答到相应的留言下面了,那里评论没有那么长 :)