树莓派嘛,玩ROS的接触还是很深的!

没啥别的原因,便宜!相比其他的,树莓派的性价比算是相当高的!

记得前几年玩树莓派的时候,第一个接触到的树莓派系统是Ubuntu Mate,那时候还是树莓派3B,古月老师的课程刚出。

我的Linux系统学习,就是从玩树莓派开始。很多初学者觉得ROS难,至少30%的人是因为不熟悉Linux系统造成的,所以别着急,玩玩树莓派,用树莓派编程点个灯,等熟悉了树莓派,熟悉了Linux,再来学习ROS也不迟~

这里也就是我的一些学习树莓派的一些经验心得,向大家分享一下~


先说一下基础Linux命令:

ls:(list)显示当前目录下文档名称。可跟参数。

cd  <文件夹名称>:进入指定目录下。没有文件夹名称则直接返回根目录。

cd .. :返回上一级目录。

cat  <文档名>:显示文档内容。

touch  <文档名>:可新建一个名字为<文档名>的空白文档。

chmod :(Change Mode),更改当前文档权限。

rm  <文档名>:删除指定文档。

mkdir  <文件夹名>:可新建一个名字为<文件夹命>的空白文件夹。

rmdir  <空白文件夹名>:删除指定“空白文件夹”。

 

ifconfig:查看当前网络状态。

raspi-config:树莓派设置。

shutdown:关机。sudo shutdown -h now(参数now为时间,单位秒)。

reboot:重启。sudo reboot。

 

sudo apt-get update:升级软件仓库(源列表)。

sudo apt-get upgrade:升级软件(电脑软件更新以及残缺项环境自动补全)。

sudo apt-get install  <软件名>:安装指定软件。

sudo apt-get remove  <软件名>:卸载指定软件。(缓存数据不会清除)。

sudo apt-get autoremove:清除已卸载软件的缓存数据。

 

Ctrl+Alt+T:打开终端。

clear:清除终端内容。

exit:退出终端。


目前文档先进行相关环境配置,也就是安装一些基本软件。

打开终端。按下Ctrl+Alt+T即可出现一个黑窗口界面,这个就是我们所说的终端环境。在终端环境下,我们可以执行以上的命令进行操作。(命令有很多,以上的是我认为常用的)。

更新软件源列表和软件数据。

执行以下两条语句即可。

sudo spt-get update

sudo apt-get upgrade

或者,执行以下一条语句。

sudo apt-get update && sudo apt-get upgrade


安装中文输入法fcitx。

执行以下命令即可安装。

sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin


安装Arduino编译器。用于Arduino开发。

执行以下命令即可安装。

sudo apt-get install arduino

Arduino的开发依赖于Java环境,树莓派自身带有Java,不需要安装Java。


安装Putty软件。用于MicroPython和K210开发。

执行以下命令即可安装。

sudo apt-get install putty

putty是开发者经常要用到的一个调试软件。对于MicroPython或者K210系列的开发来说,我们选择在串口模式,指定串口和波特率,即可编程。


配置Python环境。安装Python要用到的包。

树莓派自身带有两个版本的python,分别是python2.7和python3.6(不知道最近有没有更新)。我们直接在终端下输入python即可使用。但是它的依赖包情况较差,需要我们来安装相关的依赖包。具体介绍以及安装方式如下。(针对python3)

Pip3:pip是python安装包需要的插件。输入以下指令即可安装。

sudo apt-get install python3-pip

Dev:dev是python的辅助插件,实际用途很少,主要用来配置各个包和python的版本。输入以下指令即可安装。

sudo apt-get install python3-dev

Easygui:easygui是python的一个桌面开发,内置很多桌面控件。输入以下指令即可安装。

pip3 install easygui

Pygame:python的游戏开发模块。对音乐插入、图片插入支持较好,内置游戏引擎较好。输入以下指令即可安装。

pip3 install pygame

Serial:python的串口模块。用于处理串口数据。输入以下指令即可安装。

pip3 install serial


安装新的脚本编译器gedit。

Linux系统内置编辑器是Vim编辑器,对初学者使用不是很友善。在此我推荐gedit编辑器,该编辑器类似于Windows下的notepad++,对多语种执行性较好。输入以下指令即可安装。

sudo apt-get install gedit


我们这会来看看树莓派引脚,图片网上截的。

树莓派的各个版本的引脚顺序是一样的。树莓派的IO由常规IO(普通的IO口,很多)、串口IO(08,10)、IIC通讯IO(03,05)、SPI通讯IO(19,21,23,24,25),以及ID_SD和ID_SC,这两个属于特殊IO,在此不会介绍。

很遗憾,树莓派并没有像Arduino那样的模拟值功能,所以,我们在进行模拟输出的时候,我们可以采用PWM脉冲调频、PCA高速脉冲释放灯方式实现(树莓派的时钟频率在1.5GHz左右,和Arduino的16MHz以及STM32的几百MHz比起来,这个完全不是问题),在进行模拟值读取的时候,我们需要借助于模拟值转换芯片读取模拟值,(在此我推荐ADS1117四通道转换IC,不是打广告,是真的好用)。当然进行模拟输出的时候,也可以使用IC(推荐PCA9685).

如果由小伙伴看不懂我上面写的什么意思,那么就没有看下去的必要。我建议你可以买一块Arduino加一套传感器,也就60元RMB绝对可以搞定。

对于通讯接口,这个也是大家比较关心的一个问题。


聊聊通讯

对于通讯来说,我把它分为两种,第一种就是标准通讯,比如大家熟悉的串口(UART/USART)、IIC()、SPI()等,这些也是支持的,也比如一些的协议,比如Modbus、IIS、RS232、RS485、CAN等,这些协议我给大家的建议是——转换!!!没有转换不了的通讯协议,别太死,软件不够硬的来凑!硬件加个IC的事情,没必要来花几个星期的时间研究(还不一定能研究出来)。

第二种就是私有协议,比如单总线类,以及时钟数据类。好比DS18B20、Dht*等,这写属于常见的单总线类型,时钟数据类的类似于IIC,但是没有地址协议,有的只是两个IO口,一个口做时钟,一个口抓数据,比如HX711(用来做电子秤的)。

不管是标准协议还是私有协议,他们的实现都离不开底层时钟分频的支持。树莓派对于标准协议有着很好的库支持,可减少我们的工作难度。但是对于私有协议,我还是更倾向于讲通时钟线序图来进行设计。

为了避免大家对于通讯协议认知了解较少,以下是我个人对于通讯的一个认知。

通讯说白了就是两台设备之间数据的一个传输,我们日常生活中经常性的使用WIFI、4G等,这些就是数据的传输。对于开发者来说,通讯,就是高低电平的解读,就像是发送电报一样。


我先来说串口通讯

串口通讯由四条线Vcc(供电正极)、Gnd(供电负极)、TxD(数据发送)、RxD(数据接收)。两个设备之间的串口通讯示意图如下所示。

这个概念图杜宇任何系列的单片机都是通用的。串口通讯的数据标准格式为

数据头 数据长度 数据 数据校验 数据尾

我们在平时使用的时候,并没有这么细,所以偶尔会出现数据丢失的一个问题,属于正常现象。在上面的这张图,我提到了一个通讯时钟要求,这个也就是我们常说的——“波特率”,也就是通讯频率。当然还有其他的数据位、停止位、奇偶校验等等,我们常规默认则位8位数据位、1位停止位、无校验,也是我们常说的8N1模式。


接下来我们来说IIC通讯

IIC通讯也是由四条线Vcc(供电正极)、Gnd(供电负极)、SDA(Sign Data,数据信号线)、SCL(Sign Clock,时钟信号线)。通讯示意如下图所示。

IIC的通讯过程解释较为麻烦,需要配合相关的时序图,在接下来的HX711的使用中,会详细讲解该功能,在下面的内容,也会有IIC的库函数支持的详细介绍。

IIC的通讯通过SCL产生一个通讯频率,数据通SDA的拉高拉低进行传输。但是为了确保数据的准确性,所以在数据校验、信号应答、指令写入等三个方面有较为复杂的学习。


最后就是SPI通讯

SPI通讯由6条线组成Vcc(供电正极)、Gnd(供电负极)、MOSI(Master Output Slave Input,主机输出,从机输入)、MISO(Master Input Slave Output主机输入,从机输出)、SS(Sign Select,信号选择)、SCLK(Sign Clock,时钟信号线)。通讯示意图如下所示。

SS(Sign Select)信号选择线的存在,更类似于一个IO口作为使能端的一个存在。

有的地方,MOSI也叫做SDO(Sign Data Output,数据输出信号),MISO也叫做SDI(Sign Data Input,数据输入信号),

SPI数据的通讯和串口十分相似,都是“接收”对“发送”,“发送”对“接收”,而不同的地方,第一是在时钟方面,串口是自身的通讯频率来作为时钟,而SPI则有一条专门的时钟线(SCLK)来作为时钟,第二则是设备选择,通过SS线,可有效选择从机设备进行通信。

由于我们平常使用SPI的时候只有一台从机设备,所以SS也就省略掉。


理论知识的补充到此结束,接下来细说树莓派如何使用这些IO。

树莓派自身对于Python有一个名为RPi.GPIO的一个模块,在此,我们详细来学习这个模块。

对于大家做单片机开发的时候,写单片机程序,上去的时候,肯定是选择IO口、初始化、设置时钟什么的等等一系列步骤。而在Python里面的使用也是如此。

import RPi.GPIO as GPIO

通过上面的语句,我们讲RPi.GPIO模块(也可以理解为库函数)导入当前Python环境,并将其重命名为GPIO。紧接着我们要设置当前IO编码规则。

GPIO.setmode(mode)

这个语句是设置IO口编码规则的,因为树莓派的开发者太多了,目前主流的编码格式有三种,分别为WiringPi、BCM、Borard。三种模式的线序如下图。mode的值右个,分别为GPIO.BCM和GPIO.BOARD(我推荐BOARD,容易找)。

至于WiringPi的编码,这个是C语言开发IO使用的编码格式,在此不做说明。

接下来我们要说明IO的模式了,IO模式分为输入和输出。通过下面的语句可进行设置。

GPIO.setup(Pin,Value)

当中Pin就是引脚编号,Value为这个IO的模式,分为GPIO.OUT和GPIO.IN。

环境导入、板子编码声明、IO模式声明,接下来就是使用IO口。

GPIO.output(Pin,Value)

当中Pin是我们已经声明过模式为输出模式的IO,Value为这个IO的输出值,分为GPIO.HIGH和GPIO.LOW。

如果我们设置IO为输入模式的话,则使用下面语句即可进行IO读取。

GPIO.input(Pin)

当中Pin是我们已经声明过模式为输入模式的IO。

在终端下输入gpio readall有惊喜!!!

可能有的会问到上拉、下拉、推挽、开漏等内容,我可以告诉大家,树莓派是支持的!但是我觉得对于嵌入式软件开发者来说,没必要去追究这些,这些的设置和寄存器息息相关,一旦操作出现问题,可能会造成板子毁掉。在硬件的层次加个电阻、加个三极管、加个电容等等,都可以解决的,没必要冒这个风险。

接下来做个参考程序。

其中电容是104电容,用于消除按键抖动。

对于PWM脉冲调频,Python的GPIO模块也有着支持。电路图不变,直接贴代码,有着Python基础和我理解我上面内容的一看就懂。


树莓派与Arduino搞个联动

对于大家来说,最熟悉的就是串口,在我们平时上传烧录单片机程序的时候,使用的就是串口。常见的串口转USB芯片有CH340、CP210X、FAT232等。

为了方便演示,我们使用Arduino作为下位机,实现Arduino和树莓派的串口通讯。

由于Arduino自身带有串口转USB的芯片,有的是CH340,有的是CP210X,也有的是Atmel 16U2等等。对于CH340系列,它的默认串口名为ttyUSB*。对于CP210X系列,如果你没有写入新的名称的话,依旧是ttyUSB*,否则以你写入的为准。而对于Atmel 16U2系列,这一类型的识别则是ttyACM0或者直接就是Arduino。

我们通过下面的指令在树莓派上安装Arduino IDE。

sudo apt-get install arduino

安装成功后,在任务栏或者在终端内输入arduino均可打开Arduino。安装成功之后先关闭,我们需要来设置串口权限问题,否则依旧无法使用。

先将Arduino用USB线接好插入Arduino,在终端下输入ls /dev/tty*,这个指令可以查看树莓派的device设备。再将Arduino拔掉,再次输入ls /dev/tty*,找到第一次出现,第二次没出现的,这个就是当前Arduino所连接的端口号。

确定好端口号之后,我们需要赋予这个端口最高权限。假设当前识别的端口号是ttyUSB0,则输入以下指令即可赋予端口最高权限。

sudo chmod +777 /dev/ttyUSB0

通过上面的操作,我们已经确定了当前Arduino所占用的端口号为ttyUSB0。我们打开Arduino IDE,写一个串口接收数据控制13口LED点亮的程序,以及Arduino给树莓派发送“Hello World!”。树莓派上Arduino IDE的使用和Windows下一样,写好程序,验证,上传即可。

Arduino的D13口自带LED,以上的程序段则使用D13口进行测试。

在树莓派端的Python开发,Serial库在Windows下依旧可以使用。我们需要安装对应的串口模块。由于树莓派有两个python版本,在此我们使用的是Python 3.X版本。我们需要安装pip3、dev、serial三个Python库文件。在终端执行以下三条指令即可,第一节讲过。

sudo apt-get install python3-pip

sudo apt-get install python3-dev

pip3 install serial

在Python里面使用串口也是一样,导入库文件、初始化串口,然后进行读写操作。

Python的Serial库的详细内容很多。很多开发者都对其进行了补充开发,如果哪一天碰到了一个没有见过的,不必震惊!

Serial的使用流程:

第一,导入serial库;第二,实例化串口对象对象,设置串口号,波特率,等等;第三,那就是收发数据;第四,串口使用完记得一定要关闭,这个很关键!!!


以上就是此次分享的所有内容了~

唔~其实有后续,只不过我还没整理好,这个是之前指导学弟学妹们玩树莓派的心得,从尘封的文件夹当中找到,迫不及待的给大家分享出来~

搞机器人,玩嵌入式,从点亮一个LED做起,从一句Hello World做起!

大家一起加油!