该项目的主要目的是设计一种智能类,通过检测水中的有害污染物以及检测水下管道的泄漏,可以有效对抗水污染。
本文引用地址:今天我们向您介绍一种能够游泳并识别缸边缘和障碍物的机器。我们将了解如何使用普通的绝缘材料和一些由 控制的伺服电机轻松创建它。
机械部分
对于鱼体,我们使用普通的聚苯乙烯作为墙壁的绝缘材料。价格低廉,非常坚固且重量轻:它易于漂浮且易于成型。大量。
为了使鱼的游泳更加逼真,我们需要在躯干和尾鳍之间建立三个关节。作为执行器,我们选择了常见的建模伺服系统:体积小,功能强大,易于微控制器控制。
舵机是理想的选择,因为有了它们,您可以管理连接鱼所有部分的小轴的运动,随意改变位置,甚至几度。
鱼体分为中央部分和三个部分,每个部分由伺服器移动。尾鳍由从超市商品包装中回收的塑料制成。
鳍片的灵活性使您可以为运动赋予更多真实感。为了获得谐波运动,每个零件都通过舵机连接到下一个零件:伺服机的主体应粘在体段上,而伺服臂(连接到轴)应粘在下一个体段上。
显然,Robofish 需要一个系统来检测障碍物,例如水箱边缘。为了实现这一点,我们使用了两个具有数字输出的夏普GP2Y0D805PCB红外传感器。这些组件可以检测最远 5 厘米的物体,并且非常易于管理。一旦装在塑料袋中,即可在水中操作。
将传感器放在前面,倾斜 45°,一个在左边,一个在右边。然后为控制、电池和传感器腾出空间。
鱼的轮廓由您选择。不要太担心重量,因为在我们的原型中,我们增加了 460 克的重量,以确保正确的浮动水平。
电气连接
作为控制,我们选择了 Seeedstudio 生产的兼容 的板,但任何 板都可以。四节简单的 AA 电池将提供与伺服馈电兼容的电压,而 Arduino 板则通过其内部 5 伏稳压器获得张力。
由于很难使用传统的开关(因为所有东西都被塑料覆盖,所以无法处理它),因此我们使用了一个小的磁接触,例如用于检测窗户打开的磁接触。它由一个由小磁铁激活的簧片触点组成。将触点放在的外边缘,这样通过接近磁铁,您就可以激活电路。这解释了视频中看到的头上的小凸起。
当然,机器鱼会一直工作,直到磁铁在他的头上。聪明又便宜。
固件
// ROBOFISH
// di Segatello Mirco
#include <Servo.h>
Servo Servo1, Servo2, Servo3; // create servo object to control a servo
int i, time, obstacle;
int pos1, pos2, pos3;
int pos1R, pos2R, pos3R;
int phase=45;
int velocity=2000;
int maxDeflexion=20;
int maxDefobs=20;
int actualTime;
float shift;
const int center1=98;
const int center2=90;
const int center3=105;
const int sens_SX=5;
const int sens_DX=6;
const int lostTime=3000;
void setup()
{
Servo1.attach(4);
Servo2.attach(3);
Servo3.attach(2);
pinMode(sens_SX, INPUT);
pinMode(sens_DX, INPUT);
pinMode(13, OUTPUT);
time=velocity/360;
shift=0;
}
void loop()
{
for (i=0; i<360; i++) {
pos1 = i+2*phase;
pos2 = i+phase;
pos3 = i;
if (pos1>359) pos1-=360;
if (pos2>359) pos2-=360;
if (pos3>359) pos3-=360;
if (pos1>179) pos1=360-pos1;
if (pos2>179) pos2=360-pos2;
if (pos3>179) pos3=360-pos3;
pos1R=map(pos1,0,180,center1-maxDeflexion-obstacle,center1+maxDeflexion-obstacle);
pos2R=map(pos2,0,180,center2-maxDeflexion-obstacle,center2+maxDeflexion-obstacle);
pos3R=map(pos3,0,180,center3-maxDeflexion-obstacle,center3+maxDeflexion-obstacle);
Servo1.write(pos1R);
Servo2.write(pos2R);
Servo3.write(pos3R);
delay(time);
obstacle=int(shift);
if (digitalRead(sens_DX)==0) {
if (obstacle<maxDefobs) shift=shift+0.05;
actualTime=millis();
}
if (digitalRead(sens_SX)==0) {
if (obstacle > (-maxDefobs)) shift=shift-0.05;
actualTime=millis();
}
if (digitalRead(sens_SX)==1 && digitalRead(sens_SX)==1 && obstacle!=0)
if (millis()>actualTime+lostTime) {
if (shift>0) shift=shift-0.05;
if (shift<0) shift=shift+0.05;
}
}
}
使用Arduino更容易,因为布线既简单又直接,草图的实现也非常简单。
伺服运动是重复的,并遵循精确的方案。我们提供了个性化几个变量的功能,以便您可以测试不同类型的游泳。游泳是通过同步移动三个舵机来进行的,根据类似于字母 s 的模式:每个部分相对于前一个部分略有异相变化。
对于伺服运动,我们使用了 servo.h 库,该库已在 Arduino IDE 上可用。您只需使用舵机声明舵机和多点触控对应的输出即可。连接(引脚)。servo.detach() 方法允许释放舵机的输出,最终将其用作 PWM 输出。管理舵机运动的命令有两个。
第一个是 ServoWriteMicroseconds,它允许您通过指定以微秒为单位的长度来设置伺服命令的位置。在这种情况下,该值应介于 1,000 和 2,000 μs 之间。1500 的中点对应于轴线的中立位置。第二个语句 Write 允许通过指定角度(以度为单位)进行定位:角度的值必须在 0 到 180° 之间,90° 中间值对应于舵机的中立位置。
两个sens_SX和sens_DX命名的传感器分别连接到引脚 5 和 6 上。在主循环中,它们是一个 for 循环,在由变量速度定义的总时间内,以固定的间隔从 0 循环到 360 递增 i 变量。
i 变量的值与相位变量的值一起决定了伺服电机的位置。该值是指一个完整的 360° 环路,然后必须进行偏移,同时牢记舵机的中立位置、潜在位移和您希望赋予运动的最大偏转。
后者由变量 maxDeflexion(十进制度)定义,并定义每个行程的最大偏转:该值越高,鱼的三个树干的运动就越宽。
当相位设置为 0 邮件时,所有舵机都将移动;增加该值会在伺服位置之间引入相移。结果,您将得到一个类似于字母 S 的运动,越明显,相位值越大。
当检测到障碍物时,舵机的中立位置在障碍物的另一侧逐渐移动。这样,鱼将描述远离障碍物的圆弧。
弧度可以通过 maxDefobs 变量进行控制:该值越高,游泳线曲率就越大。当不再检测到障碍物时(使用 lostTime 控制时间),伺服运动恢复正常。每个伺服 PIN 的范围介于 -maxDeflexion 和 + maxDeflexion 之间,而如果检测到障碍物,则介于 -maxDeflexion + maxDefobs 和 maxDeflexion + maxDefobs 的值之间。
测试:
在将机器人测试到水中之前,您必须仔细检查每个机械和电气连接。打开鱼并控制运动,并确保两个传感器都向Arduino提供信号。使用万用表测量其输出端的电压:在没有障碍物的情况下,信号应为高电平。检查电压供应不是一个坏主意:确保至少为 5.5 V。
在这一点上,我们准备对机器人进行防水:有很多解决方案,我们用塑料袋介绍了机器人(在里面呼吸,看看它是否有孔,并用胶带密封)。使用橡皮筋将袋子靠近机器人的身体,并确保舵机可以自由移动。
游泳将在地表水中进行:您可能需要用足够的赖特来压住机器人的重量,以使其保持在正确的高度。如上所述,在我们的原型中,我们添加了 460 克。一旦机器人以正确的方式漂浮,你就可以通过放置小磁铁来打开它,让他在数字自由中蜿蜒游泳。