返回首页

简介
本文给出了一个非常简单的介绍,到Arduino的平台上写的差差距控制器。我用这个例子Duemilanove。
该项目由两个输入轨道上的东/西光水平,然后用移动伺服电机,旋转东/西跟踪最强的光线水平。
在其所有的荣耀原油原型......剩余的MSDN光盘已经发现最后一个使用:
它如何工作
两个光传感器的基本光敏电阻,这些都是安装在90"给对方,想象这是你的眼睛,如果你看看墙上的直行,左眼45点左,和右眼45"的权利。这些传感器也屏蔽了,所以直接指向光源时,他们将看到最亮的水平。如果光源的动作,然后一个影子投射到传感器,改变其电阻。
跟踪阳光的照射下,例如当一个太阳能电池板,您希望阳光的强度最大,达到这个目标,两个传感器,因此需要看到同样的光强度。这就是我们如何确定的差距控制器输入。
读取输入传感器值,并做一比较,区别意味着他们在相同的光照水平,VE错误值意味着光线明亮的权利,并已经错误值意味着光线明亮到左边。
伺服然后发送一个位置值,和我们简单的递增或递减每次扫描输出的旋转平台,东部和西部,再次找到最佳的平衡点上的传感器的光水平。
在代码中,也上限和下限,以防止驾驶很难反对其最终损害伺服停止。死区值也是建立在代码中。这实际上意味着输出将不会改变,除非两个输入之间的误差大于一定值。死区防止抖动和不断抽搐的传感器。
我还增加了一个非常基本的平均2点在输入传感器,帮助理顺尖峰。在现实中,你可能要筛选了进一步的过滤掉不想要的噪音或尖峰。使用代码
在下载提供的草图文件可以上传到Arduino的。让我们采取了更加详细的看看代码。
代码的第一部分用于建立IO引脚分配,输入读数,错误和滚动平均误差的变量。死区范围也被定义,以及上限和下限,伺服,伺服最初的起点。
#include语句使得一个处理伺服阿尔杜伊诺的预建库的参考。它基本上允许一个简单的值写入伺服对象,然后用于设置伺服位置的脉冲宽度调制。

#include <servo.h>



//IO Pins

int pinL = 5;              //Left Sensor IO Pin

int pinR = 4;              //Right Sensor IO Pin

int pinServo = 11;         //Servo PWM pin



int leftValue = 0;         //The left Sensor Value

int rightValue = 0;        //The right Sensor Value

int error =0;              //The Deviation between the 2 sensors

int errorAVG = 0;          //Error Average - Rolling 2 Point



int deadband = 10;         //Range for which to do nothing with output 10 = -10 to +10  

//Servo Stuff

Servo hServo;              //The servo object

int Position = 45;         //Position to write out



int minPos = 5;            //Min Position

int maxPos = 150;          //Max Position



float output = (maxPos - minPos) /2;  //Initial output Position

该代码的下一部分是Arduino的安装方法。这一次,是有效地使用任何你想要的主代码循环执行前初始化。在这个例子中,我所做的一切是伺服输出设置到最小,最大和中点为5秒,我的办公桌上,以便用于测试任何硬件的定位。串行端口串行报表泵出的消息,并可以在PC机上监控。{C}
代码的最后部分是主要的循环体,这是循环将持续运行,直到关闭电​​源或新代码下载到Arduino。
的输入值先读,然后抽出一些调试信息到串行端口。误差值计算,并经修订的新的传感器位置加入getTravel()返回的值决定。检查,以确保我们不会超过这些限制。
void loop()

{

  //Input Reading

   leftValue = analogRead(pinL);

   rightValue = analogRead(pinR);



 Serial.print("L = "); Serial.print(leftValue); Serial.print(" | ");

 Serial.print("R = "); Serial.print(rightValue); Serial.print(" | ");

 Serial.print("E = "); Serial.print(error); Serial.print(" | ");

 Serial.print("Eavg = "); Serial.print(errorAVG); 

 Serial.println();



  //Calculate

 error = leftValue - rightValue;

 errorAVG = (errorAVG + error) / 2;

 

 float newOutput = output + getTravel();

 

 if (newOutput > maxPos)

 {

   Serial.println("At Upper Limit");

   newOutput = maxPos;

 }

 else

 { 

   if (newOutput < minPos)

   {

     Serial.println("At Lower Limit");

     newOutput = minPos;

   }

 }

    Serial.println("Writing output");

    

    //Output Writing

    hServo.write(newOutput);

    output = newOutput;

}

我也有一个辅助方法getTravel(),它是用来确定如果我需要左右旋转,旋转,或做什么(如内死区)每次扫描。它只是返回一个1,-1或0,然后添加到当前位置之前被写入到伺服。
int getTravel()

{

  // -1 = Left; +1 = Right

 

 if (errorAVG < (deadband * -1))

 {

   return 1;

 }

 else 

 {

   if (errorAVG > deadband)

   {

     return -1;

   }

   else

   {

     //Do not move within deadband

     return 0;

   }

 }

}
工作原型可以发现{A}
一个原型运行的视频。兴趣点
这是简单的,因为它得到。 ,你可以加强这方面的方法是:实施改善输入信号的噪声过滤加入某种形式的PID(比例/积分/微分)控制算法添加第二个垂直运动的伺服和额外的传感器 还有什么
参观我的其他文章或我的网站,为更多的Arduino的位和乙。 Arduino的CodeProject上搜索,也有由他人。 历史2010年9月22日 - 条第一版本| DaveAuld

回答

评论会员:游客 时间:2012/01/26
分享感谢伟大的想法-
DaveAuld
评论会员:游客 时间:2012/01/26
我很赞赏这个项目您使用胶带
sdkjfvn
评论会员:游客 时间:2012/01/26
感谢约翰,虽然有一种恐慌的时刻,当我有选择之间的银色或黑色的东西...............所以我用传统{S2}卡住找到我:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif折叠统计:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif
DaveAuld
评论会员:游客 时间:2012/01/26
向他表示感谢是愚蠢
sdkjfvn
评论会员:游客 时间:2012/01/26
感谢您的宝贵贡献我感到很荣幸。你能否给我发电子邮件你的照片,这样我就可以做一个小徽章我的电话号码1风扇吗?如果你想,你可以会员号码1{S2}戴夫找到我:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif折叠统计:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif
pjvonar
评论会员:我不会让你很容易 时间:2012/01/26
。sdkjfvn
评论会员:消息自动删除 时间:2012/01/26
pjvonar
评论会员:游客 时间:2012/01/26
然而你是一个发动战争对他的消耗。他做了什么你,你觉得需要不断地攻击他呢?原谅你的敌人-他们的头,它的餐厅{A6}-我最喜爱的效用
aronka
评论会员:游客 时间:2012/01/26
我自从我可以永远的帐户继续...
adfvzsdfasd
评论会员:邮件自动删除 时间:2012/01/26
solojana: |留言自动删除
评论会员:DaveAuld 时间:2012/01/26
留言自动删除
评论会员:吕克Pattyn 时间:2012/01/26
邮件自动删除
评论会员:solojana 时间:2012/01/26
感谢您的反馈,也许你应该解释为什么你认为这是是这样吗?

作为一个Arduino的接口显示的用途,并引入初学者的限制和死区的概念的基础上,我觉得你的评估进行没有价值或加权。

我也看到您刚才注册的帐号今天也许有替代的动机。我期待着阅读你的答复,或许它会提供一些​​建设性的,我吸收。

有一个愉快的一天。
戴夫
找到我:
折叠统计:

评论会员:DaveAuld 时间:2012/01/26
。戴夫,你实际上不能感谢他足够的,你的文章了另外5


吕克Pattyn {A9}无Volentibus Arduum
评论会员:基思巴罗 时间:2012/01/26
而另一家,和他的帐户已经报道 - 再次
。".45核心 - 因为拍摄两次只是傻" - JSOP,2010 {BR }-----{ BR}您可以从来没有太多的弹药 - 除非你游泳,或着火。 - JSOP,2010 {BR }-----{ BR}"为什么你不配合你的脚踝周围煤油浸泡过的抹布,让蚂蚁不会爬上,吃你的糖果屁股。" - 山谷Earnhardt,1997年
评论会员:游客 时间:2012/01/26
aasser:|没有阻止我说的是实话
。aasser
评论会员:游客 时间:2012/01/26
我仍然在等待你为什么你认为它是弱的建设性的反馈意见,你要立足意见反馈的消息,我给你。当你打算写一些文章,向我们展示它是如何做呢?戴夫找到我:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif折叠统计:imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif
ZeedijkMike
评论会员:游客 时间:2012/01/26
!5'd,我们需要更多这样的东西BR}{A12}
ZeedijkMike
评论会员:弱 时间:2012/01/26
Slavamix
评论会员:游客 时间:2012/01/26
我额定下来,但我希望你改善。好运
DaveAuld
评论会员:游客 时间:2012/01/26
清晰和易于理解{BR​​}