如何使用Arduino构建激光炮塔

电子说

1.2w人已加入

描述

您无聊吗?还可以建造一个激光炮塔。您知道吗?一个会 pew pew 发射,向许多不同方向发射红光的光束,甚至可能会扔进烟雾机吗?是的,其中之一。

您需要什么

Arduino

2个伺服器

激光模块,例如该传感器套件

压电蜂鸣器或其他小型输出设备

用于固定

长母-公跳线以及常规跳线的金属电缆扎带

可选地,需要一台烟雾机–激光的功率非常低,因此即使在黑暗的房间中也无法看到无烟的光束。

Arduino

构建计划

转塔的基本思想是将激光模块放在一个伺服器的顶部以提供水平旋转。然后将该封装安装到另一个呈90度角放置的伺服器上,以提供垂直移动。我们有一个压电扬声器来提供 pew pew 声音效果,我正在扔烟机以达到良好的效果。

伺服测试

视您的伺服器而定,导线的颜色可能会有所不同,但是通常:

红色是正极线,在我的两个伺服器上,它都是三芯线的中心-连接到+ 5v

棕色或黑色是负极,要连接到Arduino的GND。

白色或橙色是信号线,要连接到具有PWM功能的数字I/O针(在下面的演示中为9和10)。

连接好两个伺服器后,请上传以下示例代码。我已经命名了一个伺服“ hori”来控制水平运动,另一个命名为“ vert”。每个人都应执行全方位的运动扫描(在我的情况下约为60度)。

#include

Servo vert,hori; // create servo object to control a servo

// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()

{

hori.attach(9);

vert.attach(10); // attaches the servo on pin 9,10 to the servo objects

vert.write(0);

hori.write(0);

}

void loop()

{

for(pos = 0; pos 《 180; pos += 10) // goes from 0 degrees to 180 degrees

{ // in steps of 10 degrees

vert.write(pos);

hori.write(pos); // tell servo to go to position in variable ‘pos’

delay(100); // waits 100ms for the servo to reach the position

}

for(pos = 180; pos》=1; pos-=10) // goes back from 180 degrees to 0 degrees

{

vert.write(pos); // tell servo to go to position in variable ‘pos’

hori.write(pos);

delay(100); // waits 100ms for the servo to reach the position

}

}

一切都好吗?然后继续前进。

测试激光和 Pew Pew 声音

激光模块就像一个LED,但是模块中内置了一个电阻器。因此我们可以将其直接连接到数字I/O-非常简单。如果您使用的激光模块与我相同,则“ – ”将进入 GND , S 将进入引脚12。上面的示例代码使第12针成为输出:

int laser = 12;

pinMode(laser,OUTPUT);

然后使用标准的 digitalWrite()方法在每个循环中使该引脚闪烁,每次循环闪烁。

我们将仅使用PWM以舒适的声音水平驱动压电蜂鸣器-如果需要,您可以尝试使用音调库,但是我只需要一个简单的噪音即可。将黑线接地,将红线连接到引脚11。在相关引脚上定义您的蜂鸣器,设置为输出模式,然后使用 analogWrite(buzzer,100)进行激活(或您想要的最多254个数字);和 analogWrite(buzzer,0)(关闭模拟音频)。

完整的示例代码已修改为扫描两个伺服,激活激光并播放令人讨厌的声音。

您的所有组件都应该正常工作-现在我们需要将所有组件绑在一起。

创建转塔

使用电缆扎带,将一个伺服器连接到另一个;哪一个都没关系,只需确保其中一个在水平方向上移动而另一个在垂直方向上移动即可。如果角度不正确,您可以在测试期间拔下转子叶片并重新安装。

使用一些坚固的造型线来固定激光器

最后,我将整个设备连接到带有更多电缆扎带的桌腿上一点废木头。

对炮塔编程

我不认识你,但是我的想法是激光炮塔来自无数的科幻电影和《星际迷航》剧集。总是有人会飞越炮塔,而 pew-pew 的小射门会以扫掠的模式飞出,总是太慢了几毫秒,所以我们的主角实际上并没有受到打击。这就是我要复制的内容,尽管可以随意调整主例程以适合您对转塔应该做什么的想法。

这是我最终在主循环中使用的伪代码:

随机化脉冲之间的时间,以及每次射击之间的时间。

随机化每个伺服,垂直和水平方向的开始和结束位置。

随机化拍摄数量。

计算出每次拍摄后的变化程度,以开始和结束位置之间的差除以拍摄数量。

将伺服器移至开始位置,并稍等一会儿到达目的地(100毫秒)

循环,直到拍摄完所有镜头为止,每次按先前计算的方式稍微移动伺服器;

重复。

我还添加了一个单独的 fire()方法来稍微构建代码更好。调整所有 random()函数的范围,以加快或减慢每个参数;或增加镜头数量以增加舞蹈俱乐部的氛围。向下滚动以查看操作中的代码的视频!

#include

Servo vert,hori; // create servo object to control a servo

int pos = 0; // variable to store the servo position

int laser = 12;

int buzzer = 11;

void setup()

{

hori.attach(9);

vert.attach(10); // attaches the servo on pin 9 to the servo object

pinMode(laser,OUTPUT);

pinMode(buzzer,OUTPUT);

}

void loop()

{

int timeBetweenBursts = random(200,1000);

int timeBetweenShots = random(50,200);

int vertStart = random(1,180);

int vertEnd = random(1,180);

int horiStart = random(1,180);

int horiEnd = random(1,180);

int numShots = random(5,20);

int vertChange = (vertEnd - vertStart) / numShots; //how much to move vertical axis by each shot

int horiChange = (horiEnd - horiStart) / numShots;

vert.write(vertStart);//let it get to start position first, wait a little

hori.write(horiStart);

delay(100);

for(int shot = 0; shot vert.write(vertStart);

hori.write(horiStart);

vertStart += vertChange;//increment the vert value for next time

horiStart += horiChange;

fire();

delay(timeBetweenShots); //add a bit of variety to the speed of shots

}

delay(timeBetweenBursts);

}

void fire(){

digitalWrite(laser,HIGH);

analogWrite(buzzer,100);

delay(20);//adjust this to change length of turret shot

digitalWrite(laser,LOW);

analogWrite(buzzer, 0);

}

操作中

我认为这个小玩具没有实际用途,但这确实很有趣,而且您可以调整很多变量以获得理想的效果。也许对于自制乐高电影会派上用场吗?
        责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分