如何构建一个树莓派六足机器人?

这个树莓派六足动力机器人将有一个独立运行的自主模式,避免障碍物和手动模式,还可以通过智能手机进行控制。有兴趣搞起来么?

如何构建一个树莓派六足机器人?

六足步行者概念

这个六足步行者将遵循大多数动物和昆虫使用三脚架步态三脚架的步态如下图所示:

如何构建一个树莓派六足机器人?

图片由NC州立大学提供

六足步行者有很多方法来使用这种步态。我选择了建立一个三个舵机的版本,我得找性价比高的, 某宝上随便搜9g 舵机。然后,我添加了另一个舵机,安装机器人的“眼睛”。

机器人将有三个动作:向前,向后,向右转,然后向左转。任何动作总是涉及将机器人向左或向右倾斜,然后移动通过倾斜举起的腿。下面是运动的图表(腿上的灰色意味着机器人的重量在该腿上)。

如何构建一个树莓派六足机器人?如何构建一个树莓派六足机器人?

如何构建一个树莓派六足机器人?

右转运动基本上是左转运动。

为了能够实现三个舵机设计,需要将前部和相应的后腿连接起来,而第三台舵机倾斜辅助行走。

这个六足步行者可以在两种模式下操作。在第一种模式(自主)中,步行者可以自由漫游。如果检测到障碍物,则向后两步,然后向右转。第二种模式将允许用户使用连接到与机器人相同的网络的任何智能手机来控制六足步行者的移动。

根据我的设计要求,我需要一个控制器,可以

1)同时控制四个舵机

2)从障碍探测传感器读取输入

3)连接到无线控制网络。

实际上,感觉这个东西用Arduino会更容易, 但是, 但是我就是想在树莓派上完成….

这是我设计的框架:

如何构建一个树莓派六足机器人?

所需材料

在决定使用哪个控制器之后,我选择其余的组件。他们来了:

  • 3台Tower Pro SG-5010舵机(用于腿和倾斜)
  • 1台Tower Pro SG-90微型舵机(头部)
  • 1个Raspberry Pi 2(带有USB无线网卡)或Raspberry Pi 3
  • HC-SR04超声波传感器 – 这是检测障碍物的传感器。
  • 9“x 3”亚克力板
  • 1/2“×1/8”铝棒
  • 螺丝和螺母
  • 电池, 舵机应该要独立供电。
  • 我的RPi运行主要靠一个充电宝供电。

构建指令

六足步行者有三个主要部分:身体/平台,腿和头。

建立身体

下面是一个可用于构建Walker主体的示例布局。我用亚克力板作为我的平台。腿的细节如下。

如何构建一个树莓派六足机器人?

建立腿

这是一个腿的布局。我使用了1/2“x 1/8”的铝棒。腿应该足够坚硬,以保持六足步行者的重量。比塑料的轻感觉, 如果你要用3D 打印机打印的话,也可以

如何构建一个树莓派六足机器人?

这是倾斜的腿:

如何构建一个树莓派六足机器人?

安装RPi和头

我在亚克力板上加了一些孔,然后用螺丝和螺母固定好了树莓派。头部由超声波传感器和贴在电路板上的微型舵机组成。我用热胶粘贴超声波传感器到小舵机上:

如何构建一个树莓派六足机器人?

更好的观察腿部动作:

如何构建一个树莓派六足机器人?

连线

以下是我如何连接组件:

倾斜舵机 - > GPIO4右腿 - > GPIO21左腿 - > GPIO6头 - > GPIO26HC-SR04传感器 - > GPIO23HC-SR04 Echo pin - > GPIO24

如何构建一个树莓派六足机器人?

接线切忌不要短路~!!! 

另外,我还添加了一个带有公头和母头的电路板,使接线看起来更清爽一些…(见下文)。

这里是全装配的六足步行者:

如何构建一个树莓派六足机器人?

软件

Pigpio舵机控制

我使用了预装在RPi上的Python来编码walker。您将需要一个名为pigpio的外部库来控制伺服电机。

使用SSH访问您的RPi并发出以下命令来安装pigpio库:

wget abyz.co.uk/rpi/pigpio/pigpio.zip unzip pigpio.zip cd pigpio  sudo make install

Pigpio使用一个称为pigpiod的守护进程,这意味着舵机控制会成为后台进程。在使用pigpio python库之前,您只需发出以下命令即可运行此守护程序:

pigpiod

不这样做会导致在我下面提出的Python代码中的错误。

为了让pigpiod每次运行Raspberry Pi 后自动启动,在终端下可以通过计划任务进行,也可以直接写入/etc/rc.local 开机启动:

sudo crontab -e

然后在结尾处添加以下行:

@reboot /usr/local/bin/pigpiod

用于Raspberry Pi服务器的Apache

接下来,你需要为Raspberry Pi安装Apache的WiFi控制功能:

sudo apt-get install apache2 -y

这将创建一个文件夹/var/www /html /它将包含我们刚刚设置的apache服务器上的所有页面。如果安装成功,您现在可以通过网络浏览器访问您的RPi的IP地址。

有两种方法来实现对WiFi的控制。一种更简单的方法是使用无线路由器,并使用与RPi连接在同一网络上的设备。第二种方法是使RPi成为接入点,就像我的RPi漫游者机器人一样

第一种方法有明显的延迟,特别是如果机器人远离了路由器。第二种方法不需要你有无线路由器,但会消耗你树莓派电源的很多电量。

我在这个项目中使用了第一种方法。

Python程序

下面是hexapod walker的python代码:

#!/usr/bin/python  import RPi.GPIO as GPIO import pigpio import time import sys import os import signal GPIO.setmode(GPIO.BCM') GPIO.setwarnings(False)  tilt = 4 br = 21 bl = 6 trig = 23 echo = 24 head = 26  GPIO.setup(trig, GPIO.OUT) GPIO.setup(echo, GPIO.IN)  pi = pigpio.pi() 
  def backward(): 	pi.set_servo_pulsewidth(tilt, 800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(bl, 800)   	 	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 2000) 	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 1800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 1500)  	time.sleep(0.15)  	pi.set_servo_pulsewidth(bl, 1500)    	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 1500)    	time.sleep(0.15) 	return;

 def forward(): 	pi.set_servo_pulsewidth(tilt, 800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(bl, 1800)   	 	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 2000) 	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 1500)  	time.sleep(0.15)  	pi.set_servo_pulsewidth(bl, 1500)    	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 1500)    	time.sleep(0.15) 	return;

 def left(): 	pi.set_servo_pulsewidth(tilt, 800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(bl, 1800)   	 	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 2000) 	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 1800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 1500)  	time.sleep(0.15)  	pi.set_servo_pulsewidth(bl, 1500)    	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 1500)    	time.sleep(0.15) 	return;

 def right(): 	pi.set_servo_pulsewidth(tilt, 800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(bl, 800)   	 	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 2000) 	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 800)  	time.sleep(0.15) 	pi.set_servo_pulsewidth(tilt, 1500)  	time.sleep(0.15)  	pi.set_servo_pulsewidth(bl, 1500)    	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 1500)    	time.sleep(0.15) 	return;

	 def stop(): 	pi.set_servo_pulsewidth(tilt, 0)  	time.sleep(0.15)  	pi.set_servo_pulsewidth(bl, 0)    	time.sleep(0.15) 	pi.set_servo_pulsewidth(br, 0)    	time.sleep(0.15) 	 	return
  def obstacleDetected(): 	backward() 	backward() 	backward() 	backward() 	backward() 	right() 	right() 	right() 	 	return
  def turnHead(): 	pi.set_servo_pulsewidth(head, 700) 	time.sleep(0.5) 	pi.set_servo_pulsewidth(head, 2100) 	time.sleep(0.5) 	pi.set_servo_pulsewidth(head, 1500) 	time.sleep(0.5)  	return 
  def autoMode(): 	print ('Running in auto mode!')  	turnHead() 	 	time.sleep(0.5) 	GPIO.output(trig, 0) 	time.sleep(0.5) 	 	GPIO.output(trig,1) 	time.sleep(0.00001) 	GPIO.output(trig,0) 	 	while GPIO.input(echo) == 0: 		pulse_start = time.time() 	 	while GPIO.input(echo) == 1: 		pulse_end = time.time()  	pulse_duration = pulse_end - pulse_start 	 	distance = pulse_duration * 17150 	 	distance = round(distance, 2) 	 	if distance > 1 and distance