懒人逗猫激光笔

2018-08-281.5万
AI 快速预览详细 收起
这个项目介绍了一种使用DFRduino UNO R3制作的自动化逗猫激光笔。通过两个9g舵机和激光笔,实现了多种晃动模式,增加了猫咪的互动乐趣。项目详细介绍了所需硬件清单,包括DFRduino UNO R3、IO传感器扩展板V7.1、数字白色LED发光模块、DMS-MG90金属9g舵机等。还分享了组装过程中的经验,如固定舵机的方法和激光头的选择。代码部分提供了五种不同的晃动模式,包括直线移动、对角线移动和随机模式。这个项目不仅解决了手动逗猫的烦恼,还能让猫咪保持活跃,适合家庭宠物互动。


猫猫们越来越胖啦,为了这几只毛孩纸老夫我操碎了心。离前回帖子的发布已经沉寂好几年了,乘此机会,做个懒人逗猫激光笔,也为地府罗卜头筑个楼。老夫爱来此晃悠,看看新鲜东西,激发灵感。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]
试运行一下。


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


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(4)
kevinzhang19701
kevinzhang19701
作者
看上去,他们对神器本身,比红点更感兴趣。
[media=mov,500,375]http://116.236.162.186/a04.mp4[/media]
[media=mov,500,375]http://116.236.162.186/a05.mp4[/media]
kevinzhang19701
kevinzhang19701
作者
回复20060606
啊呀呀。。。视频文件误删了
20060606
20060606回复kevinzhang19701
哈哈哈,可以把神器藏起来
kevinzhang19701
kevinzhang19701
作者
效果真是有点尴尬。晃动的角度看来还要缩小,延迟也可以再加大点。现在这个样,摆动太大,猫猫们根本跟不上。
[media=mov,500,375]http://116.236.162.186/a03.mp4[/media]
seaten
seaten
这个厉害了哈
gada888
gada888
不错,顶起来
- 没有更多了 -