回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Arduino 动手做】Arduino 无用且无聊的盒子2 简单

头像 驴友花雕 2025.06.20 5 0

盒子里有啥???

它在做什么吗???

这会伤害我吗???

伙计们,按下开关吧!!!也许没什么会伤害到你……

说真的,这个项目其实就是一个装着 Arduino 的盒子。它什么也不做,真的。它心情不好,只想一个人待着。你能让它开心起来吗?试试开关吧!

## 步骤1:工作原理

开关连接到Arduino并由Arduino监控。按下开关时,开关状态会发生变化,并设置为“开启”位置。然后,Arduino会激活两个伺服器,一个用于盖子,一个用于手指。手指伸出并触碰到开关,使开关回到“关闭”位置。之后,手指回到盒子里,盖子关闭。

## 步骤2:组件和工具列表

Arduino 板(我使用了 Arduino Nano 3 5V,您可以使用任何您喜欢的)
面包板
2 x 微型通用伺服器
2 x 100μF电解电容器
1 x 10kΩ电阻
1 个小型 SPDT 开关
1 x 简单的开/关开关
连接电线
9V电池
轻木(或任何其他你喜欢的盒子材料)
木胶和钉子
小铰链
喷上你喜欢的任何颜色的油漆(可选)

工具
螺丝刀
剪线钳
管道胶带或电工胶带
烙铁
Dremel工具或分切刀

砂纸

## 步骤3:构建盒子

为了制作这个盒子,我使用了6毫米厚的轻木。尺寸为23 x 11 x 11(宽、深、高)。顶盖由4毫米厚的轻木制成。你可以用电磨或简单的切割机/分切机切割木材,轻木质地柔软。我把所有部件粘在一起,并用钉子钉好了框架部分。

铰链是用螺丝固定在盖子和盒子内侧的,所以会比较隐蔽。拧紧它比较麻烦,而且必须小心,以免损坏盒子。

接下来,你必须在顶盖(固定不动的那个)上为开关打孔。然后用螺丝将开关固定到位。此外,你还需要在这个盖子里放置手指舵机的外壳。制作外壳时,需要将木质部件粘合在一起。确保外壳坚固耐用。我的微型舵机非常结实,我做的第一个外壳就坏了!我加固了外壳,并用钉子和胶水固定,以便更好地承受舵机的功率。

现在该做手指了。关于设计、角度、尺寸和曲线,我有很多想法。我尝试了好几种设计,但唯一合适的是经典的L形设计。它是唯一一个在接触开关时不会断裂的设计。你必须把它做得又黄又厚,否则它碰到开关时会侧弯。不用担心重量,轻木非常轻。我用五块3毫米厚的L形木块粘在一起。它可能不太好看,但效果很好。我还把舵机连接器粘在了手指上。发挥你的创造力,按照你喜欢的方式制作吧!

接下来要做的是制作一根棍子,它要连接到门伺服器上,用来将盖子向上推,这样手指就可以出来了。只需将两块尺寸合适的轻木粘在伺服器上即可。小菜一碟。你唯一需要考虑的是伺服器的高度,以便打开盖子。你可以将轻木块放在伺服器下面,为它做一个底座,这样伺服器的高度就合适了。这里不用花太多时间,只需将剩下的一些木块粘在一起即可。

最后一步是安装一个外部开关,为Arduino供电并节省电池电量。小心地在盒子侧面开一个孔,然后粘上开关。焊接好电缆后,开关就做好了。

盒子做好了!如果你想给它上色,现在就涂,在把电子设备放进去之前。

在制作过程中,尤其是在制作手指的时候,我觉得3D打印机会让整个过程变得简单很多。处理轻木很有趣,但3D打印出你想要的部件,按照你想要的方式制作,效率更高,而且部件也更漂亮。缺点是成本……你自己选择吧……

## 步骤4:接线

如您所见,电路接线非常简单。手指伺服电机连接到引脚 10,门伺服电机连接到引脚 9。SPDT 开关的一个引脚接地,另一个引脚连接到 5V,第三个引脚通过一个 10kΩ 电阻连接到 Arduino 的引脚 2。别忘了连接电容,并注意极性!

## 步骤5:最终组装

最终组装
现在你可以把所有东西都放进盒子里,并将电池连接到 Arduino 板。阳极连接到 Vin 引脚,地连接到 GND 引脚。在放入电子设备时,请小心不要损坏盒子。我的盒子比较窄,所以很难把它们组装起来。

## 步骤6:Arduino代码

无用盒子的代码非常简单。首先,你必须包含伺服器库,然后创建两个伺服器对象(一个用于门,一个用于手指),并在 void setup 函数中将它们连接到 Arduino 的引脚上。void 循环只是一个 if 语句,用于检查开关是否处于开启状态。如果开关处于开启状态,伺服器必须移动并关闭开关。为了增加趣味性,我为伺服器设计了一些不同的动作。你也可以随意添加你的动作!!非常简单,只需查看代码并遵循模式即可!

这是 GitHub 上的代码链接,您可以轻松复制/粘贴并使用它。

## 第七步:问题与思考

在制作盒子的过程中,我遇到了一些问题,想与大家分享。

最烦人的问题是关于电池和电路供电的。不知何故,电路无论如何都无法使用9V碱性电池工作。舵机没有按照预期工作,有时甚至完全不动。因此,我开始排除故障,分别为舵机和Arduino供电。我尝试用9V电压给舵机供电,用6V电压(4节AA电池)给Arduino供电。没有任何变化。我又试了试Arduino UNO,还是不行。几次尝试之后,我发现如果将9V电池与连接Arduino的USB线组合使用,问题就能解决。是不是有点疯狂?不过,这种方法确实有效。问题是,我不想每次玩的时候都把带USB线的盒子挂在外面,然后插到电脑上。在与一些在电子和Arduino方面比我更有经验的人讨论后,我们得出结论,我应该使用锂聚合物电池,因为它们放电速度快,而且电流能力强。最后,在我所在城镇举办的 Arduino Day 15 活动期间,我试用了一款 6600 mAh 的移动电源(用于给智能手机充电),效果非常好!所以,如果你也遇到同样的问题,不妨试试!

我想说的第二件事是关于盒子的材质。轻木是一种非常好的材料,很轻,厚的话也很耐用,但当你需要用它来做非常精细的工作时,就会很麻烦。你甚至可能会毁掉你的整个项目。如果盒子是3D打印的就完美了。至少是用来关开关的那根手指。想想看。

00.jpg
01.jpg
01-.jpg
01-1.jpg
01-2.jpg
04.jpg
05.jpg
06.jpg
07.jpg

项目代码

代码
#include <Servo.h> 

Servo doorServo;
Servo fingerServo;

int swPin = 2;               //switch on pin 2

int pos = 0;
int selectedMove = 0;             //move selector

void setup()
{
  pinMode(swPin, INPUT);
  doorServo.attach(9);           //set door servo on Pin 9 pwm
  fingerServo.attach(10);          //set finger servo on Pin 10 pwm
  doorServo.write(80);           //set door to hiding position 
  fingerServo.write(0);            //set finger to hiding position
}


void loop(){

  //if the switch is on, move door and finger to switch it off
  if(digitalRead(swPin) == HIGH)
  {
    
    if (selectedMove > 9) { 
    selectedMove = 0; 
    } //when all moves are played, repeat the moves from beginning 
    
    if (selectedMove == 0) { 
    simpleClose(); 
    }
    else if (selectedMove == 1) { 
    simpleClose(); 
    }   
    else if (selectedMove == 2) { 
    simpleClose2(); 
    }
    else if (selectedMove == 3) { 
    crazydoor(); 
    }
    else if (selectedMove == 4) { 
    slow(); 
    }
    else if (selectedMove == 5) { 
    serious(); 
    }
    else if (selectedMove == 6) { 
    trollClose(); 
    }
    else if (selectedMove == 7) { 
    simpleClose(); 
    }
    else if (selectedMove == 8) { 
    matrix(); 
    }
    else if (selectedMove == 9) { 
    sneak(); 
    }
     
   selectedMove += 1;         //swith to next move 
   
  }
}



// Moves

   // basic move 
   void simpleClose() 
   {    
   //Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 129; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }  
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
   } 
     
   // open and wait, then move finger and wait, then switch of and hide  
    void simpleClose2()
   {
  //Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(800); 
    //Moving hand
    for(pos = 0; pos < 100; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }
    delay(1000); 
    for(pos = 100; pos < 129; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }    
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=5)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
     
     
   } 
     
   }
  
   //open door then close it many times, wait, then quickly reopen, switch off and hide.
  
   void crazydoor()
  {
    
   //Moving door
    for(pos = 80; pos < 125; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
  
    //hiding door
    for(pos = 125; pos>=80; pos-=5)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
   //Moving door
    for(pos = 80; pos < 110; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
  
    //hiding door
    for(pos = 110; pos>=80; pos-=15)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
    delay(700);
   //Moving door
    for(pos = 80; pos < 125; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(700);
    //hiding door
    for(pos = 125; pos>=80; pos-=5)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 

  //Moving door
    for(pos = 80; pos < 155; pos += 8)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 129; pos += 3)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }  
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=3)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=15)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    }    
    
  }   


 //open door,move finger very slowly forward and back to hiding very slowly, then quickly close door
 void slow()
 {
 
//Moving door
    for(pos = 80; pos < 155; pos += 1)   
    {                                   
    doorServo.write(pos);              
    delay(30);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 129; pos += 1)  
    {                                   
    fingerServo.write(pos);               
    delay(30);                       
    }  
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=1)      
    {                                
    fingerServo.write(pos);               
    delay(30);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=125; pos-=1)     
    {                                
    doorServo.write(pos);              
    delay(30);                      
    }
    delay(100);
    for(pos = 125; pos>=80; pos-=4)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    }     
    
 
 }
 
 //serious
 
 void serious() {
 
//Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
     
    //Moving hand
    for(pos = 0; pos < 70; pos += 1)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }
    delay(800);
    
    
    //hiding door
    for(pos = 155; pos>=130; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15); 
    }
    
    //hiding door
    for(pos = 130; pos < 155; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15); 
    } 
     //hiding door
    for(pos = 155; pos>=130; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15); 
    }   
    //hiding door
    for(pos = 130; pos < 155; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15); 
    } 
     
    fingerServo.write(40);
    delay(1000);
      
    //Moving hand
    for(pos = 40; pos < 129; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    } 
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    } 
    
      
    for(pos = 120; pos>=80; pos -= 1)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
   
     
} 

void trollClose(){
//Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 127; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }
    //hiding door
    for(pos = 155; pos>=130; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    }   
    delay(2000);
    
    for(pos = 130; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    
    for(pos = 155; pos>=140; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);
    }
    for(pos = 140; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(500);
    //hiding hand
    for(pos = 127; pos>=0; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 

}
   
void matrix()
{

 //Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 80; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }
    
    for(pos = 80; pos < 129; pos += 1)  
    {                                   
    fingerServo.write(pos);               
    delay(30);                       
    }  
    delay(300);
    
    for(pos = 129; pos>=0; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(10);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
  
}

void sneak() 
   {    
   //Moving door
    for(pos = 80; pos < 130; pos += 1)   
    {                                   
    doorServo.write(pos);              
    delay(30);                       
    }
    delay(2000);
    
    //Moving hand
    for(pos = 0; pos < 40; pos += 1)  
    {                                   
    fingerServo.write(pos);               
    delay(30);                       
    }  
        
    delay(500);
    
    for(pos = 130; pos < 155; pos += 4)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(100);
    
    for(pos = 40; pos < 90; pos += 4)  
    {                                   
    fingerServo.write(pos);               
    delay(15);                       
    }  
    delay(500);
    //hiding hand
    for(pos = 90; pos>=70; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    }
    delay(100);
    for(pos = 70; pos < 90; pos += 4)  
    {                                   

    fingerServo.write(pos);               
    delay(15);                       
    }
    delay(100);
    for(pos = 90; pos>=70; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    }
    delay(100);
       
    for(pos = 70; pos < 129; pos += 4)  
    {                                   

    fingerServo.write(pos);               
    delay(15);                       
    }
    
    for(pos = 129; pos>=0; pos-=4)      
    {                                
    fingerServo.write(pos);               
    delay(15);                        
    }    
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
   } 

【Arduino 动手做】Arduino 无用且无聊的盒子2
项目链接:https://www.instructables.com/Arduino-Useless-Box/
项目作者:Vagelis Chantzis

项目视频 :https://www.youtube.com/watch?v=H3Y0pF5AOKA
https://www.youtube.com/watch?v=B5SkeB26bc4
项目代码:https://github.com/vagelis-chantzis/UselessBox/blob/master/UselessBox.ino

00165---=.gif

评论

user-avatar
icon 他的勋章
    展开更多