ew!如何使用Arduino构建激光转塔

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

您需要什么

  • Arduino
  • 2个伺服器
  • 激光模块,例如来自此传感器的一个套件
  • 压电蜂鸣器或其他小型输出设备
  • 用于固定
  • 长母-公跳线的金属线和扎带,加上常规跳线
  • (可选)需要一台烟雾机–激光的功率非常低,因此即使在黑暗的房间中也无法看到无烟的光束。

    构建计划< /

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

    伺服测试

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

  • 红色是正极线,在我的两个伺服器上,它都是三芯的中心-连接到+ 5v导轨。
  • 棕色或黑色是负极,连接到Arduino的GND。
  • 白色或橙色是信号线,连接到具有PWM功能的数字I / O引脚(在下面的演示中的9和10)。
  • 连接好两个伺服器后,请上传以下示例代码。我已经命名了一个伺服“ hori"来控制水平运动,另一个命名为“ vert"。每个人都应该执行全方位的运动扫描(在我的情况下约为60度)。

    #include <servo.h>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 positionvoid 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.h>Servo vert,hori;  // create servo object to control a servoint pos = 0;    // variable to store the servo positionint 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<numShots; 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); } 

    在操作中

    标签: