这个项目是一个光梯度敏感的机器人太阳能充电能力,换句话说,它会寻找光线来给自己充电。它通过一套四光敏器件来实现这一特性光敏电阻在分压器电路中Arduino单元通过其模拟读管脚读取与传感器接收到的光强度相对应的四个值。然后在a上施加高电压舌簧开关它完成了一个9伏电池和两个玩具马达之间的电路,导致转向或朝着灯移动。
图1:基于Arduino的太阳能光控机器人坦克原型
这些电机无法通过Arduino直接激活,如果电机足够小,这个项目的开关部分可能会被省略而不丢失功能。如果这四个中的任何一个光敏二极管是登记比其他高得多,它检测哪一个光电二极管正在接收增高的信号和转动或移动在那个方向,只要增高的信号正在被接收。这种光跟踪算法可以用来编程太阳能电池板跟踪太阳,或通过手电筒控制机器人,如这里演示。对于这个项目,读者需要了解让我们从arduino开始.
在这种情况下,整个电路板的图片和图表会有点混乱,所以我将实际项目中重复4次和2次的主要部件装箱。第一个电路子系统是基于光敏电阻的分压器,这个分压器重复四次,每个光敏电阻被放置在机器人的不同一侧。光电阻根据通过接收半导体材料的光电导率接收到的光信号来改变电阻。可变电阻根据欧姆定律在电路中产生可变电流V=iR,其中电压V是恒定的(5V)。小心不要使电线导致任何一个光电二极管过长,因为你可以失去信号,由于内部电阻的电线和焊接连接。电压直接由Arduino UNO的5V / Gnd引脚提供给电路的这部分。5V线通过10k欧姆电阻器,通过光电二极管,并返回到地面。通过引脚上的Arduino模拟,从电阻器和光电二极管之间读取模拟信号。一个可选的加法是指示器领导显示从电阻的另一侧(正)到地(负),LED将根据光电二极管接收到的信号改变强度。如果这些LED离其中一个光电二极管太近,你的机器就会在那个方向进入一种模拟反馈环路,在那里它会朝着自己的LED的方向旋转。我相信我已经针对这种可能性编写了代码,但如果您看到这种行为,请尝试将led取出,因为它们只有在调试电路的这部分时才有用。四个引脚模拟应该连接到这个电路块的四个迭代。原则上,您可以增加迭代次数以增加方向敏感性,但这对于本应用程序不是必需的。这个项目的草图对接收到的光强度的不同是敏感的,如果所有接收到的信号都非常相似,机器人将继续采样它的环境,但保持静止。只要任何一个信号比其他信号大一个阈值,程序就进入它的运动循环。它确定哪个光敏电阻接收到最大的信号,然后将电流施加到电机上,使机器人沿着正确的相应方向移动。只要光敏电阻接收到最大强度,并且读取值之间有足够大的差异,这个动作就会继续。
图2:显示探测手电筒的机器人水箱上光敏电阻的电路连接
电路的第二个阻塞部分是必要的,如果你需要更多的电力给电机,然后Arduino可以直接从其PWM输出引脚供应。我的底盘/轨道/电机来自一个中国玩具,Arduino在有轨道的情况下无法驱动电机,所以我在电路中安装了一个开关块,允许脉宽调制输出翻转簧片继电器,完成一个电路到9V电池。簧片继电器通过电磁铁工作,当电磁铁被低电流(Arduino)激活时,会使开关内的接触点磁化并关闭电路。原则上,通过选择正确的簧片继电器,你可以用这个概念驱动非常大的电动机。我不需要更多的电力,所以一个9V电池就足够了,我使用的开关是在零件的最小部分。由于这个组件是通过电磁场来工作的,因此需要一个瞬态保护二极管,因为崩溃的磁场(当开关关闭时)会导致电流尖波返回到Arduino,正如麦克斯韦方程组所预测的那样。一个很好的讨论如何实现这个特殊的簧片继电器开关而不造成损坏,你可以找到你的板在这里.
图3:图片显示的电路连接的电池线在机器人坦克
这部分电路重复两次,对应两个电机,如前所述,如果您能够直接使用Arduino为电机供电,您可以省略项目的这部分而不会失去功能。
使用的电路图和元件
线路图
分压器
图4:手电筒检测用分压器网络电路图
开关电路
图5:机器人车光导航用直流电机控制器电路图
请参考电路图选项卡了解项目中使用的完整电路
组件使用
4 x电阻器, 10k欧姆
4x感光电阻器照片电阻器,光电电阻5mm GL5516 5516
4 x领导
RadioShack®1.5W太阳能电池板9V
玩具轨道/平台/马达(2)
2 x簧片开关(有机磁共振- c - 105 h)
项目源代码
###
针的长度=A0;Ftpin=A1;concentrightpin=A2;背面插脚=A3;一个电机=9;康斯特莱特电机=10;intthreshold=170;int方向;int方向1;int方向2;int延迟=25;int Delay2=25;无效设置(){pinMode(前插脚,输入);pinMode(左插脚,输入);pinMode(右插脚,输入);pinMode(左马达,输出);pinMode(右马达,输出);digitalWrite(左马达,高);digitalWrite(右马达,高);delay(100);digitalWrite(左马达,低);digitalWrite(右马达,低);delay(100);digitalWrite(左马达,高);digitalWrite(rightMotor,高);delay(100);digitalWrite(leftMotor,低);digitalWrite(rightMotor,低);delay(1500);Serial.begin(9600);}void loop(){int Direction;int direction1;int direction2;intfrontSignal=1023-模拟读取(frontPin);intleftSignal=1023-模拟读取(leftPin);intrightSignal=1023-模拟读取(rightPin);intbackSignal=1023-模拟读取(backPin);Serial.println(frontSignal);Serial.println(leftSignal);Serial.println(rightSignal);Serial.println(backSignal);//frontSignal+leftSignal+rightSignal+backSignal<=threshold如果(abs(frontSignal leftSignal)+abs(frontSignal rightSignal)++abs(frontSignal backSignal)>=threshold){(“运动循环”);方向1=最大值(前信号,左信号);方向2=最大值(右信号,后信号);方向=最大值(方向1,方向2);//仅当接收到的光分布不均匀时才在此处输入循环。如果(前信号==方向){do{digitalWrite(左电机,高);digitalWrite(右电机,高);延迟(Delay2);digitalWrite(leftMotor,低);数字写入(rightMotor,低);延迟(delay);frontSignal=1023-模拟读取(frontPin);leftSignal=1023-模拟读取(leftPin);rightSignal=1023-模拟读取(rightPin);方向1=max(frontSignal,leftSignal);方向2=max(rightSignal,backSignal);方向=max(direction1,direction2);Serial.println(“Forward”);}while(frontSignal==方向和abs(frontSignal leftSignal)+abs(frontSignal rightSignal)+abs(frontSignal backSignal)+abs(frontSignal backSignal)>=threshold);digitalWrite(leftMotor,LOW);digitalWrite(rightMotor,LOW);}否则if(leftSignal==方向)//信号在左侧最大{do{;数字写入(右电机,高);延迟(延迟2);数字写入(右电机,低);延迟(延迟);前信号=1023-模拟读取(前引脚);左信号=1023-模拟读取(左引脚);右信号=1023-模拟读取(右引脚);后信号=1023-模拟读取(后引脚);方向1=最大值(前信号,左信号);方向2=最大值(右信号,后信号);方向=最大(方向1,方向2);}而(左信号==方向和abs(前信号左信号)+abs(前信号右信号)+abs(前信号后信号)>=阈值);数字写入(右电机,低);}否则如果(右信号==方向)//信号在右侧最大。{do{Serial.println(“右”);数字写入(左电机,高);延迟(Delay2);数字写入(leftMotor,低);延迟(delay);前信号=1023-模拟读取(frontPin);左信号=1023-模拟读取(leftPin);右信号=1023-模拟读取(rightPin);后信号=1023-模拟读取(backPin);方向1=最大值(frontSignal,leftSignal);方向2=最大值(rightSignal,backSignal);方向=最大值(方向1,方向2);}而(右信号==方向和abs(前信号左信号)+abs(前信号右信号)+abs(前信号后信号)>=阈值);数字写入(左电机,低);}否则如果(后信号==方向)//信号最大。{do{Serial.println(“后”);数字写入(左电机,高);延迟(延迟2);数字写入(左电机,低电平);延迟(延迟);前信号=1023-模拟读取(前引脚);左信号=1023-模拟读取(左引脚);右信号=1023-模拟读取(右引脚);后信号=1023-模拟读取(后引脚);方向1=最大值(前信号,左信号);方向2=最大值(右信号,后信号);方向=最大值(方向1,方向2);}(倒车信号==方向和防抱死制动系统(前信号左信号)+防抱死制动系统(前信号右信号)+防抱死制动系统(前信号左信号)+防抱死制动系统(前信号左信号)+防抱死制动系统(前信号右信号)+防抱死制动系统(前信号右信号)<=阈值){点差=防抱死制动系统(前信号左信号)+防抱死制动系统(前信号右信号)+abs(前信号反向信号);Serial.println(“信号差分等于”);Serial.println(差分);digitalWrite(左马达,低);digitalWrite(右马达,低);digitalWrite(右马达,低);延迟(1000);//频率为10 hz的Else样本环境}Else{digitalWrite(左马达,低);digitalWrite(右马达,低);}
###