作为一个创客,我们所做的东西不仅仅是为了科技创新、改变世界之类的宏伟目的,还有一方面的原因是要完成一些我们脑中徘徊已久的那些中二的想法,今天的教程我们就来做一个中二无比的东西——自动追踪岗哨炮塔枪(别嫌长,临时取的名字)。
这种枪可以自动追踪移动的目标,然后朝目标发动进攻。好,我们开始今天的武器制作教程!(P.S.纯玩具,不是教你做武器!)
[attach]6115[/attach]
第一步:准备材料
气枪或彩弹枪×1(这玩意在我国确实不太好搞,大家可以联系一下真人CS场地的人,问一下他们所使用玩具枪的货源,或者直接买一个电动软弹玩具枪,某宝一搜便知,子弹软绵绵的,打在身上也不会很痛)。
第四步:调试软件
整个岗哨枪的核心就在于软件了。
[attach]6120[/attach]
首先,把Arduino插入电脑,下载Arduino IDE,并且下载相关处理软件如果你的Arduino是 Diecimila以上的版本,则需要连接电源跳线。
然后需要在库中下载 JMyron, blobDetection和 controlP5 libraries ,点击连接进入下载,解压,然后按照其中的README.txt文件的说明进行操作即可。
打开 Arduino IDE中的代码,确保电路板和串行端口在工具栏中的正确选择,然后单击确定,等待编译,然后点击上传,Arduino的代码调试就结束了。
P.S.
Win 7用户有可能会遇到一些问题,在这里给大家一些解决方法:
当你遇到这个运行错误时: processing.app.debug. RunnerException: UnsatisfiedLinkError: D:\Software\processing-1.2.1\libraries\JMyron\library\JMyron. dll: Can't find dependent libraries:
"Reason : Windows 7 doesn't come with MicroSoft C libraries, which were normally include in the other (older) Windoes system.
意味着有两个Windows 7文件丢失,分别为:MSVCP71.dll和Msvcr71.dll
点击如下链接,下载这两个文件:
http://www.addictivetips.com/?attachment_id=38105
下载完成后,将文件放到相应位置。
32位操作系统放到Windows/System32文件夹中。
64位操作系统放到Windows/SysWOW64 文件夹中。
当你运行代码时,屏幕上会有两个窗口弹出,一是摄像头的监控画面,另一个是控制面板。
在这个系统下,有两个模式。
[attach]6121[/attach]
手动模式:手动指向目标,并向其开火。
自动模式:系统会用一段时间去适应背景,过后如果有与背景颜色相违背的物体冲入画面,系统就会给枪下达攻击命令,自动射击物体。
当这些都完成后,枪械并不能准确地完成射击,所以需要一些校准,先通过软件中的 xMin, xMax, yMin和 yMax轴进行校准,然后还需要调整Arduino中的代码,具体参考代码如下:
if(digitalRead(7) == HIGH) {
xPosition = 110 ;
yPosition = 135 ;
fire = 0;
}
To set the home position (no USB communication), change these lines :
if(idle) {
idleCounter++;
if(idleCounter > 10000) {
analogWrite(5, 50);
delay(250);
digitalWrite(5, LOW);
idleCounter = 0;
}
else{
digitalWrite(5, LOW);
}
xPosition = 110 ;
yPosition = 100 ;
fire = 0;
}
To set the 'squeezed' and 'not squeezed' positions for the trigger servo, changethese lines :
void Fire(int selector) {
if(selector == 1) {
fireTimer++;
if(fireTimer >=0 && fireTimer <= triggerTravelMillis) {
trigger.write( 90 );
digitalWrite(2, HIGH);
}
if(fireTimer > triggerTravelMillis && fireTimer < 1.5*triggerTravelMillis) {
trigger.write( 140 );
digitalWrite(2, LOW);
}
if(fireTimer >= 1.5*triggerTravelMillis) {
fireTimer = 0;
}
}
if(selector == 3) {
trigger.write( 90 );
digitalWrite(2, HIGH);
}
}
void ceaseFire(int selector) {
if(selector == 1) {
fireTimer = 0;
trigger.write( 140 );
digitalWrite(2, LOW);
}
if(selector == 3) {
trigger.write( 140 );
digitalWrite(2, LOW);
}
}
好了,让我们来看一看成品效果的视频吧:
视频连接:http://v.youku.com/v_show/id_XMTM2OTc4ODI5Ng==.html