7173浏览
查看: 7173|回复: 6

[项目] 懒人逗猫激光笔

[复制链接]
本帖最后由 kevinzhang19701 于 2019-3-15 15:21 编辑

猫猫们越来越胖啦,为了这几只毛孩纸老夫我操碎了心。离前回帖子的发布已经沉寂好几年了,乘此机会,做个懒人逗猫激光笔,也为地府罗卜头筑个楼。老夫爱来此晃悠,看看新鲜东西,激发灵感。YouTube直接搜Arduino也能找到一些不错的创意。

一般某宝逗猫激光笔是酱紫滴:
懒人逗猫激光笔图1
更科技感一点,是酱紫滴:
懒人逗猫激光笔图2
前一种需要人不停逗弄,后一种只有一种兜圈模式。比较乏味,大约一二分钟后,会停下来。所以,老夫就动手做一个,把那几个毛孩纸累趴下,半夜就不会乱叫唤了。

先准备零部件(均来自地府商城,非广告帖):

1. DFRduino UNO R3,78元。
懒人逗猫激光笔图3

2. IO 传感器扩展板 V7.1, 55元。
懒人逗猫激光笔图4

3. 数字白色LED发光模块,10元。
懒人逗猫激光笔图5

4. DMS-MG90 金属9g舵机 (1.8Kg) x2, 56元。
懒人逗猫激光笔图6

5. 多孔原型钣金板(圆形), 60元
懒人逗猫激光笔图7

6. L型支架, 10元。
懒人逗猫激光笔图9

老夫买错了两件东西。一件是6节5号电池盒,本以为6节电池足够两个舵机运转了,事实上通电后,舵机只会稍微动一动就重启了。没弄明白什么原因,求大神答疑解难。后来也不想拆了,安装在钣金板上,插了6节电池权当是配重。
懒人逗猫激光笔图8

还有一件是25mW 激光头,这东西好贵,48元。当个宝似地买回来,接了5V后发现光点细小得几乎看不见。以后想想做个什么项目用掉她。
懒人逗猫激光笔图10

后来在淘宝上发现,原来应该买这个:
懒人逗猫激光笔图23
在淘宝买了一个5块钱的激光笔,还真不错,有红点,有手电白光,还带验钞的紫光,真正是物美价廉,关键还包邮。
懒人逗猫激光笔图11

把东西一件件都组装起来......
懒人逗猫激光笔图12

懒人逗猫激光笔图13

懒人逗猫激光笔图14

懒人逗猫激光笔图15
懒人逗猫激光笔图16

懒人逗猫激光笔图17

比较麻烦的是固定舵机,用上了热熔胶枪,不过好像不太牢,所以又用绝缘胶布绷了几道。
懒人逗猫激光笔图18

懒人逗猫激光笔图19

硬件安装,基本完成。两个舵机90度粘在一起,等于一个简易云台,分别连在Uno的pin9和pin6。LED灯连在pin2。
懒人逗猫激光笔图20
测试一下舵机活动情况。


装上激光笔(直接将舵机配的扭臂缠在激光笔上),大功一半告成。
懒人逗猫激光笔图21

懒人逗猫激光笔图22

接下来上代码,一共搞了四种晃动模式,外加一个随机模式。五个function随机调用。
[mw_shl_code=c,true]#include <Servo.h>
Servo myservo9;
Servo myservo6;
int pos9 = 0;
int pos6 = 0;
long randNumber;
void setup()
{
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(400);
  digitalWrite(2, HIGH);
  delay(25);
  myservo9.attach(9);
  myservo6.attach(6);
  myservo9.write(90);
  myservo6.write(90);
  delay(2000);
}
void loop()
{
  int x;
  randNumber = random(1,6);
  switch (randNumber)
  {
    case 1:
      for(x=0; x<3; x++)
      {my01();}
    break;
    case 2:
      for(x=0; x<3; x++)
      {my02();}
    break;
    case 3:
      for(x=0; x<3; x++)
      {my03();}
    break;
    case 4:
      for(x=0; x<3; x++)
      {my04();}
    break;
    case 5:
      for(x=0; x<5; x++)
      {my05();}
    break;
  }
}
void my01()
{
  for (pos9 = 135; pos9 >= 45; pos9 -= 8)
  {
    myservo9.write(pos9);
    delay(25);
  }
  for (pos9 = 45; pos9 <= 135; pos9 += 8)
  {
    myservo9.write(pos9);
    delay(25);
  }  
}
void my02()
{
  for (pos9 = 135, pos6 = 135; pos9 >= 45; pos9 -= 8, pos6 -= 8)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(30);
  }
  for (pos9 = 45, pos6 = 45; pos9 <= 135; pos9 += 8, pos6 += 8)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(30);
  }
}
void my03()
{
  for (pos9 = 135, pos6 = 45; pos9 >= 45; pos9 -= 8)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(30);
  }
  for (pos9 = 45, pos6 = 45; pos6 <= 135; pos6 += 8)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(30);
  }
  for (pos9 = 45, pos6 = 135; pos9 <= 135; pos9 += 8)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(30);
  }
  for (pos9 = 135, pos6 = 135; pos6 >= 45; pos6 -= 8)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(30);
  }  
}
void my04()
{
  for (pos9 = 180, pos6 = 135; pos9 >= 45; pos9 -= 5)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(35);
    //pos6 = 45;
  }
  for (pos9 = 45, pos6 = 45; pos9 <= 180; pos9 += 5)
  {
    myservo9.write(pos9);
    myservo6.write(pos6);
    delay(35);
    //pos6 = 135;
  }
}
void my05()
{
  long randNumber9 = random(45, 135);
  long randNumber6 = random(45, 135);
  int ca9 = myservo9.read();
  int ca6 = myservo6.read();
  if(randNumber9 <= ca9)
  {
    for(pos9 = ca9; pos9 > randNumber9; pos9 -= 5)
    {
      if(randNumber6 <= ca6)
      {
        for(pos6 = ca6; pos6 > randNumber6; pos6 -= 5)
        {
          myservo9.write(pos9);
          myservo6.write(pos6);
          delay(40);
        }
      }
      else
      {
        for(pos6 = ca6; pos6 < randNumber6; pos6 += 5)
        {
          myservo9.write(pos9);
          myservo6.write(pos6);
          delay(40);
        }
      }
    }
  }
  else
  {
    for(pos9 = ca9; pos9 < randNumber9; pos9 += 5)
    {
      if(randNumber6 <= ca6)
      {
        for(pos6 = ca6; pos6 > randNumber6; pos6 -= 5)
        {
          myservo9.write(pos9);
          myservo6.write(pos6);
          delay(40);
        }
      }
      else
      {
        for(pos6 = ca6; pos6 < randNumber6; pos6 += 5)
        {
          myservo9.write(pos9);
          myservo6.write(pos6);
          delay(40);
        }
      }
    }
  }
}[/mw_shl_code]
试运行一下。


明天拿给猫猫们试一下,希望他们都喜欢。哈哈哈。


gada888  版主

发表于 2018-8-29 10:36:09

不错,顶起来
回复

使用道具 举报

seaten  学徒

发表于 2018-8-31 11:37:18

这个厉害了哈
回复

使用道具 举报

kevinzhang19701  高级技匠
 楼主|

发表于 2018-8-31 16:29:29

本帖最后由 kevinzhang19701 于 2019-3-15 15:24 编辑

效果真是有点尴尬。晃动的角度看来还要缩小,延迟也可以再加大点。现在这个样,摆动太大,猫猫们根本跟不上。

回复

使用道具 举报

kevinzhang19701  高级技匠
 楼主|

发表于 2018-8-31 16:33:17

本帖最后由 kevinzhang19701 于 2019-3-15 15:26 编辑

看上去,他们对神器本身,比红点更感兴趣。



回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-10 05:28:48

kevinzhang19701 发表于 2018-8-31 16:33
看上去,他们对神器本身,比红点更感兴趣。

哈哈哈,可以把神器藏起来
回复

使用道具 举报

kevinzhang19701  高级技匠
 楼主|

发表于 2020-8-14 08:45:49

20060606 发表于 2020-8-10 05:28
哈哈哈,可以把神器藏起来

啊呀呀。。。视频文件误删了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail