动手学arduino智能小车(6)循迹小车

自动循迹小车是比较热门地电子竞赛,它是自动引导机器人系统的基本应用。
寻迹采用的主要原理就是红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点
Arduino智能循线车就是以是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。
 

小车底盘前部有一对红外循迹探头(集成在底盘电路板上)。

动手学arduino智能小车(6)循迹小车

红外循迹探头与红外避障探头一样,也是一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测白色时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号),调节循迹探头可调电阻可调节灵敏度。

跑道可用宽2.5黑电工胶带粘在白色物体(纸板 地板 KT板)上

动手学arduino智能小车(6)循迹小车

接线:

arduino A2 A3端口接底盘P4的OUT1 OUT2两个引脚

看模块是否正常工作:

小车通电,模块上的电流指示灯亮。把寻迹模块放在白色纸上,模块上的的开关指导灯也亮。把模块放在黑线上,模块上的的开关指导灯熄灭。

循迹原理:

两个循迹模块检测到白纸(都是低电平)————前进

左循迹模块检测到白纸,右边检测到黑线——右转

左循迹模块检测到黑线,右边检测到白纸——左转

两个循迹模块检测到黑线(都是高电平)——停车

编写主函数(把下面引脚6与引脚7改成引脚A2和引脚A3):

动手学arduino智能小车(6)循迹小车


动手学arduino智能车(7)蓝牙遥控小车

动手学arduino智能车(7)蓝牙遥控小车

无线蓝牙串口透传模块无线通讯HC-06从机蓝牙

动手学arduino智能车(7)蓝牙遥控小车

接线:

一、蓝牙模块插在面包板上,再用杜邦线与arduino的连接:

TX:接Arduino UNO开发板”RX”引脚 
RX:接Arduino UNO开发板”TX”引脚 
GND:接Arduino UNO开发板”GND”引脚 
VCC:接Arduino UNO开发板”5V”或”3.3V”引脚 


二、手机上下载安装手机蓝牙助手

想实现手机蓝牙遥控小车,手机APP是必不可少的,网上有很多蓝牙串口助手,推荐大家用这款手机蓝牙助手(蓝牙串口助手)

动手学arduino智能车(7)蓝牙遥控小车

 

进入主界面,左上角会提示”蓝牙未连接”,这个时候先对蓝牙助手的界面进行自定义设置。选择“模式切换”。 

动手学arduino智能车(7)蓝牙遥控小车

然后选择“地面站设置”进入自定义界面,往下拖动,找到“自定义按键[x]”,在此我们对按键[1][2][3][4][6]进行自定义设置。

动手学arduino智能车(7)蓝牙遥控小车

对应按键之后,蓝牙串口助手自动通过蓝牙发送的数据,Arduino在接收到蓝牙模块的数据后对小车的状态进行控制。

 

接下来我们将连接蓝牙,点击“连接” 

动手学arduino智能车(7)蓝牙遥控小车

一般没有连接过蓝牙模块的时候“已配对的设备”下面没有可选择的设备名称,因此我们要点击“扫描新设备”来检测我们的蓝牙模块,扫描成功后蓝牙模块的名称将显示在“已配对的设备”一栏中 

动手学arduino智能车(7)蓝牙遥控小车

  点击我们的蓝牙模块的名称,输入密码进行配对。配对成功后在蓝牙串口助手的左上角会显示“蓝牙已连接”字样,恭喜你,这时候你已经连接成功。

 

小知识:蓝牙模块上电(只简单连接”VCC”和”GND”引脚)之后,其他蓝牙设备即可与其连接,一般蓝牙模块默认初始连接密码为”0000”或”1234”。蓝牙模块上电后LED指示灯不断闪亮,当有设备连接预期连接之后会隔一段闪两下,蓝牙串口助手也会有相应已连接的提示。

 

代码(抄此前文章的代码,各引脚接线要与代码相对应,所以代码引脚2、3、4、5分别要改成5、6、9、10,Nanon改成uno):

将代码上传到arduino上。

动手学arduino智能车(7)蓝牙遥控小车

动手学arduino智能车(7)蓝牙遥控小车

动手学arduino智能车(7)蓝牙遥控小车


动手学arduino智能车(4)红外避障小车

有一些基本物理知识的童鞋都知到,除了用超声波,还能用光线探测物体的距。

常用的采用光探测物体的模块有红外测距与激光测距,红外测距模块价格低廉,科技小制作中被广泛使用。

动手学arduino智能车(4)红外避障小车

从小车底盘上可以发现,小车前部左右两侧各有一个红外避障探头(集成在底盘电路板上),用于探测左前或右前方在一定范围内是否有障碍物。

红外避障探头具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号),可通过红外避障可调电阻调节检测距离,有效距离范围 2~30cm。

动手学arduino智能车(4)红外避障小车

接线:

arduino A4 A5端口接底盘P4的OUT3 OUT4两个引脚,把arduino 5V与GND与底盘上的vcc GND相连。

动手学arduino智能车(4)红外避障小车

测试探头:
将避障模块的红外探头对准墙壁或其他障碍物,距离为3 – 30cm厘米以内,此时指示灯亮,输出低电平。
通过读取arduino A4 A5电平状态,判断哪个方向有障碍物,以此改变小车的运行方向。
算法如下:

两个红外探头模块检测到物体(都是低电平)————停车

只有左探头模块检测到物体——右转

只有右探头模块检测到物体——左转

两个红外探头模块都没检测到物体(都是高电平)——前进

主程序代码如下:

动手学arduino智能车(4)红外避障小车

在“ 动手学arduino(3)两款智能灯”中有介绍分支结构,引用如下:

程序的分支结构:

分支结构就是做选择。例如:如果天气好,那么我就出门和朋友一起玩;如果下雨,那么我就在家里写作业。

下面两个命令都是分支命令。

动手学arduino智能车(4)红外避障小车

分支命令要与关系运算和逻辑运算配合使用:关系运算就是比较两个量的关系,有大于,小于,等于

逻辑运算是“与”“或”“非”的运算。

动手学arduino智能车(4)红外避障小车

主程序中的代码:

动手学arduino智能车(4)红外避障小车

表示:A4 A5都是高电平(两个红外探头没有探测到障碍物),

结果应该是执行:小车前进。

另一句代码:

动手学arduino智能车(4)红外避障小车

表示:A4是高电平(为1),并且A5低电平(A5低电平为0,取“非”后为1)

则执行右转向。

复合分支结果逻辑分析难度大,有编程基础的学生容易理解。

上传代码到小车,观察小车运行情况,不断调整代码,让小车正常运行。


动手学arduino智能车(5)pwm调速

曾经有写一篇文章,介绍pwm技术。

PWM(脉冲宽度调制)是利微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术

简单说来,arduino各引脚通常只有0(0伏)和1(5伏)两个状态,要让引脚输出0.4(2伏),怎么办?pwm就有办到。

在arduino中,常用PWM来调整LED的暗亮,电机的转速等。

首先在tinkercad的circuits中进行仿真:

在仿真电路中,在10脚接一个LED电路,并联一个电压表,给一段让10脚电压从0-5V来回变化(LED呼吸灯)效果的代码。

代码:

动手学arduino智能车(5)pwm调速

仿真效果:

仿真截图一:

动手学arduino智能车(5)pwm调速

仿真截图二:

动手学arduino智能车(5)pwm调速

用pwm控制小车电机转速:

arduino板上画有“~”的引脚中的两个引脚相连。Arduino UNO 控制器的数字引脚中,3,5,6,9,10,11六个可以输出PWM信号。动手学arduino智能车(5)pwm调速
小车电机驱动模块四个引脚接口(p7的IN1 IN2 IN3 IN4)与arduino的5 6 9 10四个端口相连,这四个端口都是可能输出pwm信号的。

使用设置pwm命令给arduino相应的引脚输出pwm信号。

动手学arduino智能车(5)pwm调速

 

修改forward turnleft turnright stop四个自定义函数,如图:

动手学arduino智能车(5)pwm调速

(turnright stop函数略)

主函数不变(红外避障):

动手学arduino智能车(5)pwm调速


动手学arduino智能车(1)一些准备

通过15篇的文章,如果逐个实验都动手练习,恭喜你,你已经可以学习更高级的arduino课程了。

从本文开始,我陆续介绍如果用mind+编程,做一款智能arduino小车。

关于小车实体:

此前,我有介绍一款arduino智能小车。小车所有部件从淘宝上购得,一部小车成本价约80元。可谓相应的便宜。若你是一个动手能力不太强的初学者,在制作过程中发现,把所有部件装配在一起是一件非常棘手的事情,各部件之间的物理连接也非常麻烦。

解决方案:

淘宝上有一款智能小车,这种小车各部件集成在底盘上,只要把arduino安装在小车上就可以,大大简化了装配过程,使用者可以专注于程序的设计。强烈推荐此款小车。

https://item.taobao.com/item.htm?spm=a1z0d.6639537.1997196601.26.4c917484ErM4Tu&

id=43671770126

动手学arduino智能车(1)一些准备

动手学arduino智能车(1)一些准备

小车还配了实验套件,可进行arduino扩展实验,初高中学生适用。

动手学arduino智能车(1)一些准备

动手学arduino智能车(1)一些准备

编程软件:

为了与tinkercad仿真平台相衔接,小车的编程软件仍采用图形化。满足此条件的软件有多种方案,本文中采用mind+

Mind+是一款基于Scratch3.0开发的青少年编程软件,支持arduino、micro:bit等各种开源硬件,只需要拖动图形化程序块即可完成编程,还可以使用python/c/c++等高级编程语言,让大家轻松体验创造的乐趣。

1.安装mindPlus:进入http://mindplus.dfrobot.com.cn/

下载安装mind+

动手学arduino智能车(1)一些准备

 

2. 把arduino UNO用usb线与电脑连接,运行mind+

3. 选择设备arduino UNO

4. Mind+窗口的上方第一行选择连接设备,软件会自动烧写固件。选择实时模式。

 

动手学arduino智能车(1)一些准备

5. 在第二行选择‘模块’。这是纯scratch模式。(scatch是小学信息课学习内容)

动手学arduino智能车(1)一些准备

 

6. 左边工具栏内最后一个是arduino Uno工具,对arduino各引脚进行控制和读取引脚信息。

动手学arduino智能车(1)一些准备

mind+与tinkercad的circuits的使用方法几乎一样。

以光控路灯为例,代码如下:

动手学arduino智能车(1)一些准备

如果你一切准备就绪,下一次就开始“闭门造车”了。

动手学arduino智能车(2)测试小车

把小车按商家提供的说明书安装好。

小车底盘

动手学arduino智能车(2)测试小车

前视图

动手学arduino智能车(2)测试小车

小车全身肖像

测试小车:
将底盘上电机驱动模块四个引脚接口(p7的IN1 IN2 IN3 IN4)与arduino的5 6 9 10四个端口相连。动手学arduino智能车(2)测试小车
 

动手学arduino智能车(2)测试小车

动手学arduino智能车(2)测试小车

把小车与电脑相连,打开小车电源,在mind+上选择arduino Uno,点击“连接设备”。
选择“实时模式”

动手学arduino智能车(2)测试小车

 在mind+上编写下面代码,运行代码,观察小车轮子转动情况。

动手学arduino智能车(2)测试小车

果小车两个轮子转动,说明小车工作正常。

再观察轮子转动的方向,通过调换P7 IN1、IN2或IN3、IN4两组引线,可以变换轮子的转向。

试一试:写一段代码,让小车走“之”字形路线。


动手学arduino智能车(3)超声波避障

任务一:自定义函数

在“动手学arduino智能车(2)测试小车”一文中,介绍了小车前进功能的实现,若让小车左转,就是让小车左轮不动。

为了让程序更有简洁,可以把小车的四种运行状态(前进 左转 右转 后退)用自定义函数。

编写小车的四种运行状态:前进 左转 右转 后退

在mind+函数 模块选中“自定义函数”

修改函数名称分别为:“forward” “stop” “turnleft” “turnright”

动手学arduino智能车(3)超声波避障

编写每个自定义函数,内容如下:

动手学arduino智能车(3)超声波避障

把小车动作定义为函数后,直接调用定义后的函数,就能完成相应的动作,增加代码的可读性。

任务二:超声波模块

小学语文课本上一篇文章说,蝙蝠是用超声波躲避障碍物和捕捉食物的。
这款智能小车也利用超声波避开障碍物。
在小车上加装下图所示的超声波传感器。
动手学arduino智能车(3)超声波避障
通过配套云台,超声波模块可固定在小车的前部。

超声波模块的trig echo引脚分别接arduino的8  12脚。

装超声波传感器的小车,样子有些威武。

动手学arduino智能车(3)超声波避障

 

 

mind+中,只用一句就能得到障碍物的距离:

动手学arduino智能车(3)超声波避障

而在arduino ide中至少要用五句:


digitalWrite(8,LOW);

               //产生一个10US的高脉冲去触发Trigpin

delayMicroseconds(2);

delayMicroseconds(10);


digitalWrite(8,LOW);

distance=pluseIn(12,HIGH)/58.00;

    //检测脉冲宽度,并计算出距离

如果障碍物在50厘米外,小车直行,如果前方50厘米内有障碍物,小车左转。用一个判断语句实现上面的功能:

动手学arduino智能车(3)超声波避障

把mind+切换成“上传模式”,上传代码到小车上。

动手学arduino智能车(3)超声波避障

接通电源,小车就有了蝙蝠特性:利用超声波躲避障碍物。


低成本多功能机械手DIY

近年来我国人力成本的不断提高,用工荒越来越严重,制造业的生存和发展遇到不小的困难。发展智能制造技术,尤其是工业机器人技术,显得更加重要。2014年中国新增机器人5.6万台,成为世界上最大的机器人市场。

作为电子爱好者,制作低成本的多功能机械手,不仅能够培养自己的专业兴趣,提高自己的专业知识,而且为迎接今后的自动化改造和机器人应用浪潮早做准备。

基于上述背景,本文介绍了“低成本多功能机械手”的制作方法,用百元成本,实现了机械手的“绘图”、“搬运”、“激光雕刻”功能,适合电子爱好者进行学习。

 
功能介绍

1.绘图功能

应用范畴:三维立体绘图、铣加工等。

绘图功能的整体外观如下图所示。

低成本多功能机械手DIY

绘图的功能整体外观

用旧的电脑光驱进行改造,作为该项目的X、Y 轴,另用一个微型步进电动机作为Z 轴,使其实现空间移动。画笔固定在Z 轴电机滑块上。如下图所示。

低成本多功能机械手DIY

Z轴画笔

2.搬运功能

应用范畴:搬运、装配、仓储等。

搬运功能的整体外观如下图所示。

低成本多功能机械手DIY

搬运功能整体外观

电磁铁、机械爪及电机如下图所示。

低成本多功能机械手DIY

电磁铁、机械爪及电机

机械爪的固定轴安装在托盘上,同时作为机械爪的杠杆支点。机械爪的运动轴安装在开合电机的滑块上。滑块上下运动带动机械爪闭合、张开。开合电机固定在托盘上。托盘可以被电磁铁带动,整体上下运动。

3.激光雕刻

应用范畴:激光雕刻、电火花加工、线切割加工等。

搬运功能的整体外观如下图所示。

低成本多功能机械手DIY

激光雕刻功能的整体外观

 

具体方案

1.电路部分

我们采用运行grbl固件的单片机,arduino pro atmega328p最小系统。CPU板和下载板的价格很便宜,都是十几元。选用以A3967为核心的电机驱动板。

CPU板、电机驱动板,以及X、Y、Z三轴电机的接线原理图,如下图所示。
 

低成本多功能机械手DIY

CPU板、电机驱动板,以及X、Y、Z三轴电机的接线原理图

 

2.硬件搭建

将两块旧的电脑光驱分别固定在两个塑料外壳上,并垂直安装,并用金属杆加固。如图1所示。利用光驱的步进电机作为该项目的X、Y轴。根据需要,安装Z轴微型步进电动机、电磁铁、机械爪、激光笔。电路板安装在塑料外壳背面。

3.软件使用

用Arduino Builder软件将grbl固件下载到arduino pro atmega328p。软件的具体使用方法,很简单,网上有详细介绍,这里就不多说了。

用ArtCAM软件来设计运动路径,并进行保存。如下图所示。
 

低成本多功能机械手DIY

ArtCAM设计运动路径

grbl controller上位机软件与嵌入了grbl软件的arduino单片机系统通信,解析数控代码。通过grbl controller打开已经保存好的刀路文件,并实时与单片机通讯和监控。如下图所示。

 

低成本多功能机械手DIY

grbl controller监控

我的人工智能车(一)系统安装

折腾arduino智能小车近两年了,发现arduino只能自动控制,没有学习的功能。为了弥补这一不足,我接触了raspberryPi。这是个不错的微电脑,价低,功能强大,竟能用于人工智能(AI)。去年我就动手做一台raspberryPi小车,配上摄像头,用于自动行驶。由于在车体的选择及程序的编写方面的限制,效果不是很好。


为此,今年阅读大量关于人工智能的文章和python,花大量的时间不断实验,总结了一些经验。


在此基础上,对人工智能小车重新设计,计划用半年时间打造一台真正的人工智能小车。在创作的过程中,我把自己的经历用微信的方式记录下来,供有兴趣者分享。 

我的人工智能车(一)系统安装

本次的车体(一部遥控玩具车)

我的人工智能车(一)系统安装

树莓派3B+


一、材料准备

硬件:树莓派3  

class1016Gsd5V2.0A电源 电脑 网线 路由

软件:SD Formatter 4.0Win32 DiskImagerRaspbian系统镜像、PuTTYipscanner

二、安装过程

1.SDFormatter格式化SD

2.下载树莓派系统镜像文件Raspbianhttps://www.raspberrypi.org/downloads/raspbian/

 

我的人工智能车(一)系统安装

3.Win32 DiskImagerhttp://sourceforge.net/projects/win32diskimager/或用etcher工具把Raspbian系统镜像写入SD卡:

我的人工智能车(一)系统安装

点击Write,写入系统。 


 

boot分区创建一个名为‘ ssh ’的文件来开启SSH服务。点击进入bootH:),创建空白ssh文件,注意ssh文件不要有任何后缀。

 

4. 

SD卡放入树莓派中,用网线和路由器连接,树莓派的网口就会亮,路由器也会为树莓派分配IP 

若有单独的显示器给raspberryPi用,以下5-8步可以省略。或用电脑操作树莓派,再继续:
5.ipscanner扫描,找到树莓派的ip地址
(用ping raspberry.localarp -a命令也可获取ip

我的人工智能车(一)系统安装

 

用命令arp -a得到树莓派IP地址。

我的人工智能车(一)系统安装

6. 

PuTTY登录到树莓派,Raspbian默认的用户名:pi,密码:raspberry。登录后可用命令操作树莓派。(在制作过程中,我没有截图,这些图来自网络,因此各图的ip地址不统一。)

我的人工智能车(一)系统安装

同样使用用户名pi、密码raspberry登录(输入密码时,屏幕上无*或其他符号显示),OK

7.电脑端下载并安装 

VNChttp://www.realvnc.com/download/viewer/

通过PuTTY登录树莓派后,输入:sudo raspi-config

选择 

5.Interfacing Options

找到VNC(远程桌面)  

选择 Yes(是)enable

然后sudo reboot 重启

若没有打开这个服务,用VNC登录会提示连接被拒绝 


 


8.VNC登录树莓派,会要求输入密码。 

 


我的人工智能车(一)系统安装

9.进入树莓派桌面:

我的人工智能车(一)系统安装

安装人工智能平台tensorflow 、keras:

1.安装tensorflow: 把前先下载好的tensorflow包发送到树莓派上,在树莓派的此目录下输入:

sudo pip3 install v tensorflow-1.1.0-cp35-cp35m-linux_armv71.whl

我的人工智能车(一)系统安装


2.安装Keras:

sudo pip3 install –v numpy

sudo apt-get install python3-scipy

sudo pip3 install –v scikit-learn

sudo pip3 install –v pillow

sudo apt-get install python3-h5py

sudo pip3 install –v keras

我的人工智能车(一)系统安装

测试是否成为:

python3

import keras

keras.__version__

应出现上图。


说明:

apt-get程序带上install参数是用于下载软件包,apt-get会自动下载安装你想要的软件所必须依赖的其他软件包,免除了人工寻找依赖包。安装软件需要系统管理员权限,所以运行apt-get时总是需要带上sudo前缀。


备选安装内容:

安装输入法: sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin

安装中文字体: sudo apt-get -y install ttf-wqy-zenhei


重要:用win32 disk imager做备份

我的人工智能车(一)系统安装

顺利的话,要1-2小时才能大功告成,

我的人工智能车(一)系统安装

喝杯清明茶,休息一下。

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

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

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

六足步行者概念

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

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

图片由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