的Xbox 360无线控制器控制的Arduino机械臂

这是Sergei Dines的客人贡献
人们常说机器人有一天可以统治世界。而且,由于如今在我们的私人住宅中制造机器人的便利性和便捷性,我们可能相距不远。从本质上讲,每个机器人项目都会为机电一体化世界带来新的见解。因此,以下文章介绍了一种使用XBOX 360无线控制器控制机械臂的简单方法。这个项目的灵感来自 Barrett Anderies的遥控车由PS3控制器控制.

要求

要构建此项目,您将需要:

  • Arduino Uno($23.25)
  • Arduino Uno的USB主机屏蔽($15.99)
  • XBOX 360控制器($16.00)
  • XBOX 360无线适配器($17.49)

如果您还没有机械臂:

软件:

  • 欧特克 Inventor 2014
  • Arduino IDE
  • USB Host Shield库
  • 最终代码使用XBOXRECV

可选软件: Fritzing:电路图软件

机械:

  • 面包板[400磅]
  • 标准伺服

电气:

  • 跳线
  • 电源:3000 mAh或更高,7伏特或更高:最好是镍氢毒液电池,如照片所示
  • 跳线
  • 电工胶带

步骤1:重要零件先购买

带适配器的Xbox控制器,Arduino UNO(带电缆),Arduino UNO的USB主机护罩,伺服器和电线是您应立即订购的核心部件。推理;您要确保Xbox控制器,适配器,USB主机护罩和Arduino彼此之间都能很好地通信。

重要零件先买

重要零件先买

步骤2:将所有内容放在一起

购买核心材料。其中一些零件的到达日期可能会有所不同。在工程设计社区中有一个玩笑,您首先要购买所需的东西,然后再进行设计。

1.将Arduino USB 主机板连接到Arduino UNO

将Arduino  USB 主机板连接到Arduino UNO

将Arduino USB 主机板连接到Arduino UNO

2. 的Xbox 360适配器到屏蔽板上的USB插孔

 的Xbox  360适配器到屏蔽板上的USB插孔

的Xbox 360适配器到屏蔽板上的USB插孔

警告 :确保不要强行压下引脚,轻轻摆动USB主机护盖,直到引脚完全覆盖
注意 :确保它是Microsoft适配器

3.伺服到数字引脚2的黄/白线
注意 :屏蔽罩上的引脚与直接在下面的Arduino引脚相同

4.伺服到地的黑/棕线

5.伺服至5V的红色/橙色线

6.从Arduino到GND轨的GND

7. V_in从Arduino到Red rail

您的接线应如下所示:

您的接线应如下所示

您的接线应如下所示

8. Connect 出 + [ of Regulator] to Red Rail

9. Connect 出 – [of Regulator] to GND rail

Connect 出

Connect 出

10.剥去鳄鱼夹(电池充电器随附)的另一端,如下所示:

剥去鳄鱼夹的另一端

剥去鳄鱼夹的另一端

警告 :确保如图所示在端子中时电线不会接触(我用胶带)。

很重要:
调节器会降低电压,以便Arduino板和伺服器可以工作。“Out”调节器一侧应读取4.8 – 6伏特(取决于您的伺服器)。我的矿山电压设置为5.5 V,它运作良好。 –不要仅在未将金色电位器(金色圆圈上带有箭头的箭头)旋转至该电压的情况下连接调节器。

不要只在不转动金色电位器的情况下连接调节器

不要只在不转动金色电位器的情况下连接调节器

一种。将红色鳄鱼夹连接到电池
b。将另一端连接到In +
C。将黑色鳄鱼夹连接到黑色电池
d。将另一端连接到–

连接鳄鱼皮

连接鳄鱼皮

如果接线正确,您将看到以下内容:

如果接线正确,您将看到以下内容

如果接线正确,您将看到以下内容

步骤3:程式码

为了使Xbox控制器和适配器与USB防护板和Arduino通讯,您需要下载在以下位置找到的USB主机防护库: //github.com/felis/USB_Host_Shield_2.0 只需点击“download zip” on right hand side.
注意:您可能可以找到带有类似示例的其他网站,只需确保获得XBOXRECV,因为这是所需的Xbox 360无线库。

不知道如何在Arduino IDE中放置新库?到这里: 图书馆
我包含了许多版本的代码以及最终代码。 Barrett Anderies帮助开发了PS3代码,该代码的控件比以前的尝试要平滑得多。先前的尝试是为了说明完成相同任务的其他可能途径。建议您仔细阅读评论和方法,以扩大视野。

六个伺服控制器(Xbox360无线)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
//六个伺服控制器(Xbox360无线)
// Barrett Anderies
// 2014年5月25日
//由Sergei Dines修改
// 2014年8月3日
 
#包括
#包括
//满足IDE,仅需在ino中查看include语句。
#ifdef dobogusinclude
#包括
#万一
 
#define LOOPTIME 25 //定义定时循环周期之间的延迟。
 
//定义每个伺服器的连接位置//
 
#define SERVO1 2 //  左/右扳机:基础关节
 
#define SERVO2 3 //  RightHat Y         : Elbow Joint
 
#define SERVO3 4 //  LeftHat Y          : CLAW 1
#define SERVO4 5 //  LeftHat Y          : 爪子2
#define SERVO5 6 //  LeftHat X          : Swivel
 
#define SERVO6 7 //  RightHatX          : Spin Claw
 
#define SERVO1_INIT 90 //定义初始伺服位置(初始条件)& (在按下“开始”按钮时启动)。
#定义SERVO2_INIT 90
#定义SERVO3_INIT 90
#定义SERVO4_INIT 90
#定义SERVO5_INIT 90
#定义SERVO6_INIT 90
 
#定义SERVO1_STEP 8      // L / R Tripper [基本关节]的步长值
                            //定义由D-pad控制的伺服的步长(越大越快)。
 
#定义SERVO2_RATE 4/32000
 
      //注:组织SERVO2_STEP 10
      //通过摇杆为伺服控制器定义速率(越大速度越快)。
#定义SERVO3_RATE 5/32000
#定义SERVO4_RATE 5/32000
#定义SERVO5_RATE 2/32000
#定义SERVO6_RATE 4/32000    
 
#define SERVO1_DIRECTION 1 //设置为-1以反转伺服方向。
#define SERVO2_DIRECTION 1 //设置为-1以反转伺服方向。
#define SERVO3_DIRECTION -1 //设置为-1以反转伺服方向。爪子1
#define SERVO4_DIRECTION 1 //设置为-1以反转伺服方向。  CLAW 2
#define SERVO5_DIRECTION 1 //设置为-1以反转伺服方向。
#define SERVO6_DIRECTION 1 //设置为-1以反转伺服方向。
 
#define SERVO1_MIN 2 //定义最小伺服角度
#定义SERVO2_MIN 2
#define SERVO3_MIN 2 // EDIT ***:爪-更改值以避免碰撞
#define SERVO4_MIN 2 // EDIT ***:爪-更改值以避免碰撞
#定义SERVO5_MIN 2
#定义SERVO6_MIN 2
 
#define SERVO1_MAX 178 //定义最大伺服角度。
#定义SERVO2_MAX 178
#define SERVO3_MAX 178 //编辑***:爪-更改值以避免碰撞
#define SERVO4_MAX 178 //编辑***:爪-更改值以避免碰撞
#定义SERVO5_MAX 178
#定义SERVO6_MAX 178
 
#define STICK_CENTER 0 //当操纵杆居中时来自控制器的值(对于PS3控制器为127,对于xbox控制器为0)
#定义DEADZONE 7500  //死区以防止不必要的移动。为Xbox360控制器定义为7500
 
 
// == =============================全局变量=============== == ================ //
 
USB USB ;               // USB Hub Hub1(& USB ); //有些加密狗内部有一个集线器。试试看,这是因为您的加密狗无法正常工作。
XBOXRECV 的Xbox (& 安培 ; USB );
 
伺服 servo1; //实例化伺服变量
伺服 servo2;
伺服 servo3;
伺服 servo4;
伺服 servo5;
伺服 servo6;
 
未签名 PreviousTime = 0; //用于循环计时
 
整型 s1 = SERVO1_INIT; //定义变量以存储伺服位置并设置为初始位置
整型 s2 = SERVO2_INIT;
整型 s3 = SERVO3_INIT;
整型 s4 = SERVO4_INIT;
整型 s5 = SERVO5_INIT;
整型 s6 = SERVO6_INIT;
// == =============================设置=============== == =============== //
 
虚空 设定 ()            //设置循环
{
   序列号 . 开始 (115200);
   (! 序列号 ); //等待串行端口连接-在Leonardo,Teensy和其他带有内置USB CDC串行连接的板上使用
   如果 ( USB . 在里面 () == -1) {
     序列号 . 打印 (F(“ \ r \ nOSC没有启动”));
     (1); //停
  }
   序列号 . 打印 (F(“ \ r \ nXbox无线接收器已启动”));
  
  servo1. 分离 ();     //最初禁用所有Servos //等待按钮初始化[MAKE课程的要求]
  servo2. 分离 ();
  servo3. 分离 ();
  servo4. 分离 ();
  servo5. 分离 ();
  servo6. 分离 ();
}
 
// == =============================循环================ == =============== //
 
虚空 循环 () { //主运行时循环
  
   USB . 任务 (); //任务USB
 
   如果 ( 的Xbox . 的Xbox Receiver已连接 || 的Xbox . 的Xbox 360已连接) {
   对于 (uint8_t i=0;i& lt ;4;i ++ ) {       如果 ( 的Xbox . 的Xbox 360已连接[i]) {   //仅在连接Xbox 360控制器时执行此循环            if(millis()-previousTime> LOOPTIME) {
 
        //定时开始
如果 ( 的Xbox .getButtonClick(i,L2)) {                                                                                                               //基础联合伺服PIN2
             s1 = s1 + SERVO1_STEP *SERVO1_DIRECTION;
            
          }
          
           其他 如果 ( 的Xbox .getButtonClick(i,R2)) {
            s1 = s1 - SERVO1_STEP *SERVO1_DIRECTION;
            
    
 
          }
           如果 (s1 & gt ; SERVO1_MAX) s1 = SERVO1_MAX;
           如果 (s1 & lt ; SERVO1_MIN) s1 = SERVO1_MIN;             如果 ( 的Xbox .getAnalogHat(i,权利) & gt ; STICK_CENTER + 盲区 || 的Xbox .getAnalogHat(i,权利) & lt ; STICK_CENTER - 盲区) {                  //  Elbow Joint PIN3                  // s2 = s2 +(Xbox.getAnalogHat(i,RightHatY)-STICK_CENTER)* SERVO2_RATE * SERVO2_DIRECTION;           }           如果(s2> SERVO2_MAX)s2 = SERVO2_MAX;
           如果 (s2 & lt ; SERVO2_MIN) s2 = SERVO2_MIN; 如果 ( 的Xbox .getAnalogHat(i,左帽子) & gt ; STICK_CENTER + 盲区 || 的Xbox .getAnalogHat(i,左帽子) & lt ; STICK_CENTER - 盲区) {                    // 伺服 3 CLAW 1 PIN4            s3 = s3 +(Xbox.getAnalogHat(i,LeftHatY)-  STICK_CENTER)* SERVO3_RATE * SERVO3_DIRECTION;           }           如果(s3> SERVO3_MAX)s3 = SERVO3_MAX;
           如果 (s3 & lt ; SERVO3_MIN) s3 = SERVO3_MIN;                           如果 ( 的Xbox .getAnalogHat(i,左帽子) & gt ; STICK_CENTER + 盲区 || 的Xbox .getAnalogHat(i,左帽子) & lt ; STICK_CENTER - 盲区) {                    // 伺服 4 爪子2 Pin5            s4 = s4 +(Xbox.getAnalogHat(i,LeftHatY)-  STICK_CENTER)* SERVO4_RATE * SERVO4_DIRECTION;           }           如果(s4> SERVO4_MAX)s4 = SERVO4_MAX;
           如果 (s4 & lt ; SERVO4_MIN) s4 = SERVO4_MIN;                                             如果 ( 的Xbox .getAnalogHat(i,左帽子X ) & gt ; STICK_CENTER + 盲区 || 的Xbox .getAnalogHat(i,左帽子X ) & lt ; STICK_CENTER - 盲区) {          // 伺服 5旋转Pin6            s5 = s5 +(Xbox.getAnalogHat(i,LeftHatX)-STICK_CENTER)* SERVO5_RATE * SERVO5_DIRECTION;           }           如果(s5> SERVO5_MAX)s5 = SERVO5_MAX;
           如果 (s5 & lt ; SERVO3_MIN) s5 = SERVO5_MIN;                       如果 ( 的Xbox .getAnalogHat(i,RightHatX) & gt ; STICK_CENTER + 盲区 || 的Xbox .getAnalogHat(i,RightHatX) & lt ; STICK_CENTER - 盲区) {         // 伺服 6旋转爪Pin7            s6 = s6 +(Xbox.getAnalogHat(i,RightHatX)-STICK_CENTER)* SERVO6_RATE * SERVO6_DIRECTION;           }           如果(s6> s6 = SERVO6_MAX;
           如果 (s6 & lt ; SERVO6_MIN) s6 = SERVO6_MIN;
          
           序列号 . 打印 ("  s1 = ");  //调试有关伺服位置的信息。确定伺服极限时,请取消注释。
           序列号 . 打印 (s1);
           序列号 . 打印 ("  s2 = ");
           序列号 . 打印 (s2);
           序列号 . 打印 ("  s3 = ");
           序列号 . 打印 (s3);
           序列号 . 打印 ("  s4 = ");
           序列号 . 打印 (s4);
           序列号 . 打印 ("  s5 = ");
           序列号 . 打印 (s5);
           序列号 . 打印 ("  s6 = ");
           序列号 . 打印 (s6);
          
          
           如果 ( 的Xbox .getButtonClick(i,B))   {           //安全发布
                                                     //分离所有伺服器-等待按钮重新接合
              servo1. 分离 ();
              servo2. 分离 ();
              servo3. 分离 ();
              servo4. 分离 ();
              servo5. 分离 ();
              servo6. 分离 ();
                                          }
                                          
                                                    //安全还原
                                                    //还:初始化按钮:启动机器人的创新方式
           如果 ( 的Xbox .getButtonClick(i,A))  {
            servo1. 连接 (2);
            servo2. 连接 (3);
            servo3. 连接 (4);
            servo4. 连接 (5);
            servo5. 连接 (6);
            servo6. 连接 (7);
          
           如果 ( 的Xbox .getButtonClick(i, 开始 )) {       //按下“开始”按钮时,将所有伺服系统重置到初始位置
            s1 = SERVO1_INIT;
            s2 = SERVO2_INIT;
            s3 = SERVO3_INIT;
            s4 = SERVO4_INIT;
            s5 = SERVO5_INIT;
            s6 = SERVO6_INIT;  
                                             }
                                      
                                       //以下是用于其他应用程序的可重新编程分离按钮
                                       //注意:不必仅限于伺服器
                                       //I.e. could 连接 , 分离 led when servo is 连接 ed, 分离 ed
                                      
        
         如果 ( 的Xbox .getButtonClick(i,X))               //分离底座
                                       {
        
         servo1. 分离 ();
        
                                       }
                                      
           如果 ( 的Xbox .getButtonClick(i,Y)) {            //分离肘关节
            
          servo2. 分离 ();
                                        }
                                        
         如果 ( 的Xbox .getButtonClick(i, 向上 ))  {          //分离爪1
           servo3. 分离 ();
         }
        
         如果 ( 的Xbox .getButtonClick(i,)) {         //分离爪2
           servo4. 分离 ();
          
         }
         如果 ( 的Xbox .getButtonClick(i,)) {        //分离旋转
          
           servo5. 分离 ();
          
         }
        
         如果 ( 的Xbox .getButtonClick(i, 剩下 )) {         //分离旋转爪
          
           servo6. 分离 ();
          
         }
 
PreviousTime = (); //在循环结束时保存时间
        } //定时循环  
      
        servo1.(s1); //写入伺服器。
        servo2.(s2);
        servo3.(s3);
        servo4.(s4);
        servo5.(s5);
        servo6.(s6);
                            }
}
          
    }
 
  }
}

使用Xbox 360控制器的伺服增量控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//名称:Sergei Dines
//日期:2014年8月6日
//目的:使用Xbox 360 Controller增量控制伺服
 
 
#包括
#ifdef dobogusinclude
#包括<
#万一
#包括
 
//来自org的5行以上
 
USB USB ;
XBOXRECV 的Xbox (& 安培 ; USB );
伺服 servo1;
整型 var1; //正确获取xbox模拟值
整型 var2; //将xbox模拟量映射到伺服值
整型 var3; //增量控制
 
 
虚空 设定 ()
{
  
   序列号 . 开始 (115200);
  (! 序列号 ); //等待串口连接
   如果 ( USB . 在里面 () == -1) {
     序列号 . 打印 (F(“ \ r \ n0SC没有启动”));
     (1); //停
  }
   序列号 . 打印 (F(“ \ r \ nXbox无线接收器库已启动”));
   pinMode (9, 输出值 );
  servo1. 连接 (9);
}
 
虚空 循环 ()
{
  
   USB . 任务 ();
     对于 (uint8_t i = 0; i & lt ; 4; i ++ ) {
       如果 ( 的Xbox . 的Xbox 360已连接[i]) {
        
     //根据原始代码的定义
         如果 ( 的Xbox .getAnalogHat(i,左帽子X )){              //原始定义
              var1 = 的Xbox .getAnalogHat(i,左帽子X );       // Var1获取组织。定义
              var2 = 地图 (var1, 0, 255, 0, 79);            // Var2将此代码转换为可用的伺服控制
              
              servo1.(var2);
        }
                                  
             序列号 . 打印 (F(“ 左帽子X :”));
             序列号 . 打印 ( 的Xbox .getAnalogHat(i,左帽子X ));
             序列号 . 打印 ( “ \ t” );
            
            
            / *此代码完成了将伺服器移至特定位置并将其固定在那里的目标
            但是这里有问题:
 
1]控制太敏感
2]发生抖动
3]无速度控制
4]必须缓慢移动操纵杆才能输出准确的动作
 
* /
          }
 
          
    }
}

默认情况下,该代码将输出:
注意:必须按A才能通过默认代码启动机器人

起停功能
A启动机器人
B安全停止
纽扣 数字针
LT,RT 2
右帽子Y3
左帽Y4
左帽Y5
左帽子X6
右帽子X7
控制捕获决赛

控制捕获决赛

控制表

控制表

步骤4 [可选]:构建完整的AXIOM ARM或您自己的机械臂

如果要从头到尾设计机械臂,则以下机械零件可能是有用的机械零件: 下载机械零件

1.下载Autodesk Inventor 2014

  • 去: 欧特克 创建一个免费的个人资料
  • 注意:出现提示时,材料内容库很有用,但不是必需的

2.下载AXIOM ARM Inventor零件
3.爪准备好按原样进行3D打印

但是:伺服支架可能需要调整。亚马逊有一个很棒的伺服支架套件 $90,如果您不打算设计和修改支架零件;

部分:

  • 多写
  • 带蓝灯的拨动开关
  • 3D打印零件
    • 购买SainSmart 17DOF Biped黑色教育机器人套件
    • 或:3D打印部件(以下提供部件)
  • 橡皮筋

一切保持不变,唯一的区别是您的电路看起来像这样:

电路制造

电路制造

公理臂

公理臂

 的Xbox  360无线控制器控制的Arduino机械臂

的Xbox 360无线控制器控制的Arduino机械臂

由Xbox 360控制的Arduino机械臂

关于塞尔吉美食:
谢尔盖·狄恩斯 是佛罗里达州USF的机械工程师高级。他的兴趣包括产品设计和机器人技术。他说,“从头开始进行设计过程是非常有益的;它使您思考一切之间的联系,并迫使您寻求帮助并与志趣相投的机器人爱好者联系”.
他要亲自感谢Barrett Anderies,Schlaf博士[USF]和Anthony Rose [USF]的专业知识。

蓝牙控制的Arduino机器人手臂

这是Timothy Ndung的嘉宾贡献’u.

我们都说,机器人可能会在未来取代人类,或者有一天他们可能统治我们。好吧,那句话中的一两件事可能是正确的。但是,为什么不生活在害怕未知的世界中,为什么不体验现在控制机器人的乐趣呢?本着这种精神,我决定组建一个 蓝牙控制的Arduino机器人手臂 相信我,没有什么比看着机器人移动感觉更好了。

要求

该项目需要的是:

  • Arduino板(最好是UNO或Due)
  • SSC-32伺服电机驱动器
  • HC-06蓝牙模块
  • 电源(可以使用电池或5V电源)
  • 6自由度机械臂(您可以在www.bizoner.com上获得一个)
通过Arduino和蓝牙控制的6自由度机械手

通过Arduino和蓝牙控制的6自由度机械手

设定

SSC-32 / Arduino到期
设置SSC-32伺服驱动器和Arduino板时,需要了解四件事。

它们包括:

  • 供电选项
  • 设定波特率
  • 使用SSC-32控制伺服器
  • 使用Lynx终端

理想情况下,伺服器应使用6V,SSC-32逻辑6V和Arduino 5V驱动。

机械臂
机器人手臂关节由伺服电机自动执行。因此,伺服电机应连接到SSC-32伺服电机驱动器上的通道。 SSC-32板具有32个伺服通道,可让您使用Arduino控制32个伺服。因此,应将伺服器连接到所选的通道,并确保记住哪个通道代表哪个伺服器,因为在编程时将需要该信息。

HC-06
要在Arduino机械臂上增加蓝牙功能,您将使用HC-06蓝牙模块。它在您的设置中添加了蓝牙串行终端功能,使您可以从计算机或电话上的串行终端与机械手进行通信。

供电
在我的设置中,我通过5V锂电池为伺服电机供电,并通过USB为SSC-32和Arduino供电。如果您有更大的电源,则可以从中为整个设置供电。查看电源选项,并查看操作方法。

命令设定
由于机械臂会移动不同的运动模式,因此我决定将运动分为几类。这样,可以通过单个命令描述每个类别,从而使控制机械臂变得更加容易。

  命令 套动作
1将机器人手臂置于要举起的物体上方
2将机器人手臂降低到目标物体
3握把对象
4升起物体
5向右转半圈
6将物体提升到平台高度
7将对象放到平台上
8回到起始位置

您可以更改命令以适合您的需求或机器人的运动方式。

视频

除了我刚才所做的以外,您还可以使用蓝牙控制的机械手做更多的事情。例如,您可以创建一个小型手机应用程序,以控制机器人手臂的运动。因此,从我离开的地方接起,或从头开始项目,然后做一些很棒的事情。您的想象力是极限。有关更多教程,您可以访问我的网站 http://www.arduino-hacks.com.

数码相机传感器:教程和资源

机器人使用多种技术(例如激光和声纳传感器或以数码相机传感器为代表的传统视觉系统)识别环境或感知其路径中的物体。这些为机器人应用程序提供图像的小型设备是本文的主题,您可以在其中找到机器人技术中最常用的视觉相机传感器,以及与之配合使用的教程和资源。

数码相机传感器代表视觉系统,该视觉系统允许任何机器人识别,检查和分析大量信息。甚至我也谈论过使用摄像头检测潜在障碍物的无人机,旨在识别环境并找到通往电源插头的方式的移动机器人,或者识别面部的类人机器人,所有这些机器人都使用专门的传感器和高度先进的视觉系统。

机器视觉正变得越来越重要,以彻底改变包括服务或工业应用在内的机器人行业。如果您计划构建下一代能够像人一样看的机器人,则可以从本文开始,学习如何对视觉传感器进行接口和编程。

带NTSC视频的TTL串行JPEG相机

带NTSC视频的TTL串行JPEG相机

带NTSC视频的TTL串行JPEG相机

与Arduino单板计算机兼容,TTL JPEG相机允许多种捕获模式,包括VGA(640×480), QVGA (320×240), or QQVGA (160×120)。该图像视觉传感器具有60度的可视角度和30M的CMOS传感器,其开发目的是向假定具有各种光照条件且设计用于导航,安全或娱乐的任何机器人添加清晰的图像。 阅读更多→

47个可编程机器人套件

本文的最后修改时间为2016年11月29日。

我总是尽力挑战您的工程能力,并生产出一些有趣,创新和有用的机器人。作为设计师,我们通常转向不同的灵感来源。实际上,我发现了最好的可编程机器人套件,它比普通人群更具特色。

如果您选择在尝试进行电子和硬件设计之前学习如何对机器人进行编程,则最快的解决方案是可编程机器人套件。此外,在没有其他人可以指导您从何开始时,使用可编程机器人套件是最佳实践。

下面,我探索了由全球设计师设计的47个可编程机器人套件。

轮式机器人套件

  1. Elegoo UNO Project智能机器人车载套件
  2. ie7eht7reytuhr-8788788754trytryrt_001_opt

  3. 拉链小矮人
  4. ie7eht7reytuhr-8788788754trytryrt_002_opt

  5. Elecfreaks FreaksCar Arduino机器人入门套件
  6. ie7eht7reytuhr-8788788754trytryrt_003_opt

  7. InstaBots立式流动站套件专业版
  8. ie7eht7reytuhr-8788788754trytryrt_004_opt

  9. Ralph自平衡网真机器人
  10. ie7eht7reytuhr-8788788754trytryrt_005_opt

  11. 耐捷TJ0001-1
  12. ie7eht7reytuhr-8788788754trytryrt_006_opt

  13. Makeblock DIY mBot套件
  14. ie7eht7reytuhr-8788788754trytryrt_007_opt

  15. ArcBotics Sparki机器人
  16. ie7eht7reytuhr-8788788754trytryrt_008_opt

  17. 视差Boe-Bot机器人套件
  18. ie7eht7reytuhr-8788788754trytryrt_009_opt

  19. 爱迪生
  20. ie7eht7reytuhr-8788788754trytryrt_010_opt

  21. Multiplo– Robot Building Kit
  22. ie7eht7reytuhr-8788788754trytryrt_011_opt

  23. PICAXE Microbot可编程机器人
  24. ie7eht7reytuhr-8788788754trytryrt_012_opt

  25. 2WD机器人
  26. ie7eht7reytuhr-8788788754trytryrt_013_opt

  27. Raspberry Pi的智能视频车载套件
  28. ie7eht7reytuhr-8788788754trytryrt_014_opt

  29. GoPiGo
  30. ie7eht7reytuhr-8788788754trytryrt_015_opt

  31. 迪迪伯格
  32. ie7eht7reytuhr-8788788754trytryrt_016_opt

  33. iRobot Create 2
  34. ie7eht7reytuhr-8788788754trytryrt_017_opt

  35. Turtlebot 2
  36. ie7eht7reytuhr-8788788754trytryrt_018_opt

  37. DFRobotShop麦克纳姆漫游者2.0
  38. ie7eht7reytuhr-8788788754trytryrt_019_opt

  39. 4WD 60mm Mecanum轮Arduino机器人套件
  40. ie7eht7reytuhr-8788788754trytryrt_020_opt

    轨道套件

  41. Keyestudio TS
  42. ie7eht7reytuhr-8788788754trytryrt_021_opt

  43. Kuman无线Wifi机械手机器人车载套件
  44. ie7eht7reytuhr-8788788754trytryrt_022_opt

  45. TH Robot WiFi机器人套件
  46. ie7eht7reytuhr-8788788754trytryrt_023_opt

  47. BrickPi入门套件
  48. ie7eht7reytuhr-8788788754trytryrt_024_opt

  49. 毁灭者机器人套件
  50. ie7eht7reytuhr-8788788754trytryrt_025_opt

  51. Arduino的Zumo机器人
  52. ie7eht7reytuhr-8788788754trytryrt_026_opt

    步行机器人

  53. Hexbug可编程机器人蜘蛛套件
  54. ie7eht7reytuhr-8788788754trytryrt_030_opt

  55. 林戈机器人
  56. ie7eht7reytuhr-8788788754trytryrt_031_opt

  57. 六驱虫
  58. ie7eht7reytuhr-8788788754trytryrt_027_opt

  59. 爬行四足机器人DIY套件
  60. ie7eht7reytuhr-8788788754trytryrt_028_opt

  61. 凤凰3DOF六足动物
  62. ie7eht7reytuhr-8788788754trytryrt_029_opt

  63. Velleman四足Allbot玩具
  64. ie7eht7reytuhr-8788788754trytryrt_032_opt

  65. len
  66. ie7eht7reytuhr-8788788754trytryrt_033_opt

  67. Alpha 1S智能
  68. ie7eht7reytuhr-8788788754trytryrt_034_opt

  69. Meccanoid G15个人机器人
  70. ie7eht7reytuhr-8788788754trytryrt_035_opt

    机器人手臂套件

  71. 武器
  72. ie7eht7reytuhr-8788788754trytryrt_036_opt

  73. SainSmart DIY控制码垛机器人手臂
  74. ie7eht7reytuhr-8788788754trytryrt_037_opt

  75. PhantomX反应堆
  76. ie7eht7reytuhr-8788788754trytryrt_038_opt

  77. 小叮当
  78. ie7eht7reytuhr-8788788754trytryrt_039_opt

  79. 带串行接口的大沽机器人手臂套件
  80. ie7eht7reytuhr-8788788754trytryrt_040_opt

    飞行机器人

  81. DIY Quadcopter组装套件
  82. ie7eht7reytuhr-8788788754trytryrt_041_opt

  83. Crazepony MINI Quadcopter
  84. ie7eht7reytuhr-8788788754trytryrt_042_opt

    模块化套件

  85. 11合1可编程机器人套件
  86. ie7eht7reytuhr-8788788754trytryrt_043_opt

  87. KIBO 18套件
  88. ie7eht7reytuhr-8788788754trytryrt_044_opt

  89. 乐高头脑风暴EV3 31313
  90. ie7eht7reytuhr-8788788754trytryrt_045_opt

  91. 怪物套件v1.0
  92. ie7eht7reytuhr-8788788754trytryrt_046_opt

  93. 集木
  94. ie7eht7reytuhr-8788788754trytryrt_048_opt

9个检测和识别手势的OpenCV教程

人与机器人之间的交互不断发展,并采用不同的工具和软件来提高人的舒适度。

在本文中,我探索了九个教程,向您展示了检测和识别手势的不同方法。

OpenCV的 的 库不足以启动您的项目。该库为您提供软件方面的功能,但您还需要硬件组件。在硬件类别中,输入能够运行OpenCV库,网络摄像头和3D传感器(例如Kinect 3D)的开发平台。

OpenCV的 的 是一个免费的开源库,专注于实时图像处理。它可以检测和识别各种各样的对象,但是我们现在的重点是应用技术和方法来检测和识别人手的手势。

检测手部姿势的方法

正如您在以下教程中所看到的,有几种检测手势的方法。肤色检测是最受欢迎的方法之一。此方法很简单,取决于皮肤颜色(可以是白色,黑色或其他颜色),环境光线条件以及背景。

包围手部区域的凸包

包围手部区域的凸包

另一种方法不使用彩色手。它使用OpenCV的凸度检测。这两种方法在制造者和黑客社区中最受欢迎,并且代表检测和识别人类控制机器人手势的最简单方法。

  • 使用OpenCV的手势 –使用OpenCV 2.4,在本教程中,您可以逐行找到用C语言编写的手势识别程序的代码和说明。
  • OpenCV的 的 Python手势识别 –基于OpenCV软件和Python语言的教程,旨在识别手势。在本教程中,您可以找到从输入帧中提取感兴趣区域(ROI),如何查找轮廓,如何绘制凸包,以及最后如何查找手势为空时出现的凸缺陷的程序行。检测到
  • 手部追踪和手势检测(OpenCV) –本指南将逐步向您展示实时检测和跟踪手部的方法,并演示如何进行手势识别。所有图像都是使用便携式计算机通过简单的网络摄像头捕获的,并且不利的是,如果更改了背景,则程序可能会产生不同的结果。
  • 一种使用openCV检测和识别手势的方法 –从本教程中,您可以学习如何基于OpenCV的凸度检测应用有效的方法来检测和识别手势。与基于手轮廓检测的众所周知的方法相比,该方法具有较高的识别手势的准确度;
  • 使用OpenCV 2进行手势检测和识别 –在本文中,您可以找到基于肤色模型的手和手势检测代码。这种新方法试图克服手色的依赖性,手色可以是白色,黑色或任何其他颜色。
  • 使用kinect + opencv进行简单的手部跟踪 –在本教程中,您可以找到使用OpenCV和Kinect 3D传感器进行手部跟踪的代码;
  • 形状模型引导的主动轮廓(蛇形)

    形状模型引导的主动轮廓(蛇形)

    用蛇和优化功能扩展手跟踪器[w /代码,OpenCV] –本教程是一种方法,该方法基于分层点分布模型来跟踪手势,该方法已应用于众所周知的主动轮廓法;

  • 通过模型拟合在OpenCV中实现能量最小化的手势识别 –在本文中,可以找到一种基于适合手部的骨架模型的2D手部姿势估计器的简单好解决方案;
  • 使用OpenCV进行手部检测 –在本教程中,您可以找到高级检测方法的代码,该方法不受距离和背景的影响。该方法通过过滤手部彩色像素来工作。

本文的最新修改时间为2015年4月1日。

用于目标检测和跟踪的传感器类型

制造机器人的最终目的是要进行优化并使其符合所有规格。为了满足要求,有时您可能要花费很多时间,只是对传感器进行分类和识别,而这些传感器最适合像检测和跟踪物体之类的应用。在本文中,我们探讨了可用于目标检测和跟踪的所有传感器类型,以及可以使用它们的功能和应用程序类型。

选择正确的传感器不是一个严格的过程。这是根据一系列问题消除所有错误的选择,旨在首先消除传感器基础的技术,然后消除不符合机器人要求的产品。

当使用“目标”一词时,我们同时指的是小球,椅子等物体,甚至是机器人前面的人。

要从各种产品和制造商中选择最佳的传感器是一项艰巨的工作,尤其是当您是初学者并尝试构建一个简单的机器人时。简而言之,必须根据目标尺寸,形状和范围选择传感器。所有这三个功能必须与机器人的规格在同一条线上。但是即使这样,也很难定义最佳的传感器,因为这种传感器的性能和精度取决于许多因素。

有源声纳的原理(图片来源Wikipedia.org)

有源声纳的原理(图片来源Wikipedia.org)

传感器是一种复杂的设备,可以测量速度或压力等物理量并将其转换为可以电测量的信号。传感器基于几种工作原理和测量类型。在我们的案例中,几乎所有类型的传感器都会发出信号并测量反射率以进行测量。

有许多传感器可用于简单的应用,例如线路跟踪(IR LED和光电二极管,LED和LDR等),但这是可以选择简单传感器的简单情况。一个复杂的情况是,当您必须跟踪对象并且预算仅限于购买像Raspberry Pi这样的小型计算机时。在这种情况下,可以使用超声波传感器从一侧到另一侧扫描,直到传感器检测到距离下降为止(在此阶段,它检测到对象的边缘,并且从现在开始仅在传感器上看到背景)。扫描过程继续进行到左右扫描对象所在的位置。
这是可以用便宜的传感器代替昂贵的产品的情况之一。 阅读更多→

开始使用Kinect和Arduino的7个教程

有时很难找到所需的东西,尤其是当您有兴趣基于Kinect传感器构建机器人时。在本文中,我们探索了七个最佳教程,您可以从中学习如何将Arduino开发板与Kinect 3D传感器接口,以控制汽车,直升机或执行器。

Microsoft Kinect 传感器的价格可承受,这对于DIY机器人而言是至关重要的标准。可能会使用更昂贵的传感器来获取更好的数据,但在某种程度上,Kinect可以发挥出色的作用。

将Kinect与Arduino结合使用可能是使用手势控制机器人或扫描环境的最佳选择。下面提供的教程详细说明了如何将Kinect与Arduino交互以响应从3D传感器获取的信息。

推动机器人技术的革命,Kinect传感器不仅是游戏玩家用来通过手的动作进行交互的简单设备,而且是机器人技术中用于扫描和控制的工具。用户的手势是使用标准摄像机,深度摄像机并通过将红外激光栅格投射到表面上并通过扫描数字网格中的变形来创建信息来进行解释的。同一3D传感器用于语音命令识别,该功能可以与手势解释一起使用,也可以仅用于语音控制。

自2010年Kinect发布以来,该传感器已广泛用于各种服务和工业应用中。

 Kinect 控制Arduino(照片来源Insibleables.com)

Kinect 控制Arduino(照片来源Insibleables.com)

3D传感器供业余爱好者,学生甚至研究人员使用,使用户能够控制机器人并扫描环境。

从简单到复杂的应用程序,Kinect传感器都可用于诸如自动飞行的飞行机器人,连接到aquadcopter上进行3D映射的应用程序,控制臂等应用程序,作为控制机器人进行绘图,遥控车辆,生物识别,3D建模的工具接口,或控制快速准确的并行机器人。

您可以在下面找到一系列教程,以学习如何通过Microsoft Kinect 传感器控制Arduino板。

车轮与连续轨道:优点和缺点

在构建机器人时,有时很难在轮子和履带之间进行选择,因为每个系统都具有某些功能和性能。不仅如此,每个系统都有其优点和缺点。

在本文中,您可以找到一系列有关车轮和连续轨道的优点和缺点的列表。考虑到所有这些位置,您必须为您的机器人选择最佳的系统。

选择最佳系统取决于几个因素,包括牵引力,地面压力,悬架和转向。

如果使用轨道而不是车轮,则牵引力会更大,但要获得最佳效果,这取决于地形。

如果您希望减小地面压力,则必须选择轨道。履带的地面压力低于车轮,更适合于柔软的表面。对于柔软的表面,可以使用较大的轮胎,但这有其局限性,并且不能在所有条件下(例如在雪地上)工作。

履带式机器人的建筑悬挂比轮式机器人更复杂。悬架系统通过将履带或车轮保持在地形上而在牵引方面具有重要作用。

与履带相比,车轮在转向方面具有显着的优势,并且可以转化为车轮的良好可操纵性。

车轮与连续轨道

车轮与连续轨道(图片来源)

轮式机器人与履带式机器人在很长一段时间内一直是一个著名的话题。在下文中,您将发现两种车辆推进的优缺点:车轮和连续履带。

使用车轮的优缺点

车轮在机器人技术中无处不在,并且是通过减少摩擦来促进运动的主要部件之一。大多数机器人设计有3个轮子,2个电动机和2个速度控制器。对于结构简单的机器人来说,这是最常见的结构,它可以快速移动,易于控制,当场旋转或在小地方转弯。

通常,轮子用于:

  • 生产成本低 –如果我们比较车轮和履带的价格,就是这种情况;
  • 速度 –与履带相比,车轮从静止状态需要较小的扭矩;
  • 可操作性 –与连续履带相比,车轮具有较高的机动性。履带的机动性非常困难。
  • 轻巧的 –连续的轨道比轮子重得多,这就是为什么使用轮子的主要原因,尤其是在机器人的质量至关重要的情况下,例如太空探索任务;
  • 简单 –车轮的运动部件更少,这意味着更少的部件容易损坏;
  • 材料 –可以使用几种材料制造符合环境条件的车轮;

使用车轮的缺点

使用轮子并不总是最好的情况。在某些情况下,车轮不是最佳选择。
通常,在以下情况下不使用车轮:

  • 越过障碍 –根据地形,机器人需要通过较小或较大的障碍物。要使车轮越过垂直障碍物,车轮的高度至少必须是垂直障碍物的两倍。

使用连续轨道的优缺点

当无法使用车轮时,将使用由一系列车轮驱动的连续胎面带。在该区域可以添加各种方案,包括在崎uneven不平的地形上行驶或需要高牵引力时。
通常,连续轨道用于:

  • 电源效率 –与车轮相比,连续履带具有高性能和优化的牵引系统,这在动力传递效率方面具有优势;
  • 牵引力 –即使在雪或湿混凝土等光滑表面上,牵引力也很高;
  • 在崎terrain的地形上移动 –使用连续的轨道,机器人可以在崎terrain的地形上操作,而车轮可能会卡住。同样,连续的胎面带可以上升和下降楼梯,越过障碍物或穿越沟渠;
  • 美学 –轨道看起来比车轮更具侵略性;
  • 地面影响 –在橡胶履带上移动的机器人的地面PSI较低。这意味着对地面的影响较小,尤其是当机器人很重时;
  • 体重增长潜力 –具有连续轨道的机器人的重量分布在轨道的整个表面上。这是带有橡胶履带的机器人支撑重物的原因之一。

使用连续轨道的缺点

通常,在以下情况下不使用连续轨道:

  • 较低的速度 –由于摩擦力更大和机械系统复杂,与带轮的机器人相比,具有连续轨迹的机器人的速度较低;
  • 机动性较差 –轨道上的机器人操纵性较差,转弯时需要更多动力;
  • 容易打破 –连续的轨道比轮子容易断裂或移位;
  • 寿命短 –橡胶履带的行驶时间比车轮小得多。
  • 难以修复 –连续的履带比车轮难于修理或更换;


资源:
车轮与连续轨道(胎面踏步);
履带机器人;
履带与车轮;

本文的最新修改时间为2015年5月14日。

相机和Android设备之间实时视频流的3种可能方式

在物联网世界中,一个有趣的自制机器人应用程序是构建一个能够在Android设备上发送实时视频图像的机器人。在本文中,我探讨了在机器人上安装的相机和Android设备之间进行视频流传输的可能性。

根据您的预算,您可以使用两个智能手机,一个IP摄像机和一个智能手机,或者使用带有Arduino微控制器和其他配件的Raspberry Pi板构建一个实时视频流机器人。无论选择哪种选项,任何实时视频流式传输机器人都可在各种应用程序中使用,包括安全性,间谍活动,甚至当该机器人在您的花园中工作时甚至具有实时信息。

您可以在下面找到说明的所有三种可能的方式,这些方式可以用来构建能够在Android设备上发送实时视频的机器人。

1.使用Android智能手机摄像头捕获图像

在我们的技术世界中,几乎所有智能手机都配备了能够捕捉逼真的图像的强大相机。在这种情况下,对于现实生活中的应用程序,您需要两部配备Android操作系统的智能手机和两台设备上均安装的实时流式传输应用程序。应该将一个智能手机连接到机器人,另一个将留在您的手中,以查看机器人的运行情况。两款Android设备均需要Internet连接。

应用范围:
以下是两个专为Android设备之间的实时流传输而设计的Android应用程序。

  • 相机WiFi LiveStream –一个适用于Android设备的简单而强大的应用程序,允许用户查看使用Android设备摄像头捕获的实时视频图像。该应用程序旨在在网络浏览器或其他Android设备上运行;
  • IP网络摄像头 –允许您在网络浏览器或VLC播放器中查看Android相机的应用程序。此应用程序无需互联网即可使用,可以在您的WiFi网络中使用。另外,‘IP Webcam’用于从智能手机到智能手机的实时视频流传输;

2.使用网络摄像机

使用Internet协议摄像机是构建实时流应用程序的第二个解决方案。但是,此解决方案需要与Android设备兼容的IP摄像机。 IP摄像机旨在将视频图像发送到路由器或Raspberry Pi等单板计算机。必须将另一台Android设备或计算机连接到路由器并显示视频图像。

下面,我探索了一系列可以与机器人集成的IP摄像机和教程,这些教程向您展示了如何连接IP摄像机以显示图像。

IP摄像机

PlugnView IC-3115W网络摄像机– Color

PlugnView IC-3115W网络摄像机- Color

PlugnView IC-3115W网络摄像机– Color

具有机器人视觉系统的BIPnet单板计算机

BIPnet单板计算机

BIPnet单板计算机

iViewHD 2MP IP摄像机

iViewHD 2MP IP摄像机

iViewHD 2MP IP摄像机

佳能网络摄像机VB-C300 PTZ

佳能网络摄像机VB-C300 PTZ

佳能网络摄像机VB-C300 PTZ

教程:

3.树莓派

使用Raspberry Pi是在Android设备上显示实时视频图像的第三个选项。在我们的案例中,Raspberry Pi开发板是处理视频图像的最佳选择。

Raspberry Pi具有足够的功能来处理高清视频流,并且可以连接到Arduino板。连接到Raspberry Pi, Arduino微控制器就像控制器一样 Raspberry Pi,而Pi处理视频图像。通过添加附件,Raspberry Pi可以具有蓝牙和Wi-Fi连接,这是直接在Android设备上显示图像的快捷方式。

教程:
以下是一系列教程,向您展示如何使用Raspberry Pi和Raspberry Pi Camera在Android设备上显示视频图像。

资源:
1. 如何将Arduino相机模块视频中的视频发送到Android屏幕?,stackexchange.com;
2. 两个的力量:使用PC将视频流式传输到手机,arstechnica.com;

如何使用Matlab检测和跟踪对象

Matlab是一种流行的高级工具,用于技术计算语言和交互式环境,包括计算机视觉和图像处理。即使它具有像OpenCV这样的免费且功能强大的替代方案,它也具有一系列功能,使用户可以快速开发和调试应用程序。通过一系列教程,您可以学习如何在计算机视觉和图像处理中使用Matlab,以及Matlab的优势成为本文的主题。

OpenCV的 的 是免费的替代品 Matlab并具有较高的性能。 OpenCV的 专为使用C / C ++ 编程语言而构建,具有高度可定制性,旨在在短时间内快速处理大量图像。

使用Matlab检测和跟踪对象

使用Matlab检测和跟踪对象

为什么要使用MATLAB?

1.快速发展

  • 与OpenCV相比,快速和良好的编程具有更少的错误,因为它具有广泛的功能,并且支持显示和操作数据。快速编码是Matlab的积极方面,它允许您开发快速视觉应用程序,但在执行时速度较慢,这是一个缺点。

阅读更多→