分类目录派-就酱

树莓派烧录系统

由于最近实验需要,又入手一个树莓派3B+;因此今天开始记录一下烧录系统过程以及所用的资源。
系统镜像我们采用的官网提供的资源,其中见下图可见有三个选择模式:
  • Raspberry Pi OS with desktop and recommended software 版本就是系统自带桌面以及推荐的软件;由于自带软件因此对于后续使用会有帮助,缺点就是系统会比较大,如图可见有将近3G,如果TF卡容量较小则不适合。
  • Raspberry Pi OS with desktop 版本就是系统自带桌面但是不带推荐的软件,如果后续有用到的软件需要自己手工安装;有点在于系统比较精简,大小在1G多。
  • Raspberry Pi OS Lite 版本是轻量版,不带桌面以及推荐软件,比较适合喜欢命令行操作的行家,对桌面操作不是很友好,好处就是体积小不到1G。
  • 此处我们采用的是中间自带桌面版本,点击Download直接下载即可。
系统列表
烧录工具此处采用的是Etcher,网上有很多下载资源,可直接某度搜索。
接下来是将TF插入读卡器,然后将读卡器连接电脑。点击Etcher然后选择已下载的系统镜像,然后可见下图,第一个选项是选择的系统镜像,中间是连接的要烧录的TF卡,此处我们用的是一张32G的卡,然后点击Flash开始烧录。
当出现提示Flash complete!表示烧录成功。见下图:(忽略下面的更新提示 我用的版本比较旧)
烧录成功
接下来将烧录好的TF卡插入树莓派中,然后接上电源,连接上鼠标和键盘;
显示器显示一些启动信息后可见如下界面,表示系统烧录成功;
烧录成功
后续将开始切换清华源以及设置静态IP等操作。

命令行下I2C读写操作

#实验目的:了解命令行下I2C的操作方法。
1、查看已挂在设备:

i2cdetect -y 1
(其中-y表示命令行执行 1表示/dev/i2c-1)
可见0x27地址已挂载设备
2、打印出指定设备的所有数据

i2cdump -y 1  0x27
0x00到0xff的所有值
3、读取指定设备指定寄存器地址数据

i2cget -y 1  0x27  0x10
(0x27设备地址 0x10寄存器地址)
执行效果
4、设置指定设备指定寄存器地址

i2cset -y 1  0x27  0x10 0x11
(0x27设备地址 0x10寄存器地址 0x11要设置的值)
#其他
1、安装I2C可执行命令

apt-get install i2c-tools
2、打开I2C可参考文章:http://www.shumeijiang.com/2019/12/08/基于命令行打开i2c协议支持

GPIO之初始化高电平或低电平

#实验背景:当我们做传感器实验时,经常会有个疑虑,当传感器被触发或者被获取之前,那么程序的电压状态是高电平还是低电平呢;这块其实程序处于一个float状态,也就是悬浮可变状态,它会很容易受到其他因素的干扰,从而导致出现获取到意外的数值。因此就需要在程序开始之时,初始化对应的针脚的电压状态。

【GPIO.IN】


设置示例
可见通过:
1、GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP) #拉高电压
2、GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)#拉低电压

        执行代码可见,当pull_up_down=GPIO.PUD_UP时,输出高电平1;当GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)时,输出低电平0。


#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一

#GPIO.setup(detectPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)  ##拉高电压
GPIO.setup(detectPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) ##拉点电压

print GPIO.input(detectPin)

GPIO.cleanup()

【GPIO.OUT】


设置示例
可见通过:
1、GPIO.output(detectPin, GPIO.LOW) ##初始化低电平
2、GPIO.output(detectPin, GPIO.HIGH) ##初始化高电平

        执行代码可见,当GPIO.LOW时输出低电平0;当GPIO.HIGH时输出高电平1;


#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.suhmeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

detectPin = 18

GPIO.setmode(GPIO.BCM)   ##此处采用的BCM编码 因为T型扩展板也是BCM编码 方便统一
GPIO.setup(detectPin, GPIO.OUT) ##设置为输出模式

GPIO.output(detectPin, GPIO.LOW)  ##设置默认输出低电平
#GPIO.output(detectPin, GPIO.HIGH)  ##设置默认输出高电平

print GPIO.input(detectPin)

GPIO.cleanup()

GPIO之event_detected()系列函数

#函数列表

函数参数含义函数含义
add_event_detect( channel, status, bouncetime=300)传感器引脚,要检测的状态注册一个事件用于检测status是否发现
event_detected( channel)要检测的引脚检测引脚是否检测到status状态
add_event_callback( channel, callback)传感器引脚,回调函数发现指定status然后回调执行自定义方法
remove_event_detect( channel)要检测的引脚停止边缘检测
#注:status可选值 GPIO.RISING(电压升高), GPIO.FALLING(电压变低), GPIO.BOTH(电压升高或降低);bouncetime为抖动时间用于软件防抖,单位毫秒。
其中防抖时间可以理解为设置的单位时间内检测一次事件,从而实现单位时间内是否有一次事件触发的效果。
#实验参考:http://www.shumeijiang.com/2020/03/15/gpio之边沿检测/
#实验代码:
实验代码
#实验效果
  • 执行程序可见屏幕输出“开始检测”;
  • 因为设置挂起时间为4秒,如果在4秒内手指放在传感器触摸板上,可见回调自定义函数并输出“获取到响应1”;
  • 然后伴随挂起4秒结束,屏幕会输出“接下来的动作”;
  • 然后输出“检测到事件”

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库

touchPin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(touchPin, GPIO.IN)


def getRespose(self):
    print "获取到响应1"


GPIO.add_event_detect(touchPin, GPIO.RISING)  ##注册一个检测电压由低变高事件
GPIO.add_event_callback(touchPin, getRespose)  ##检测到事件触发回调getRespose 函数

print '开始检测'

while True:
    if GPIO.event_detected(touchPin):
        print "检测到事件"

    time.sleep(4)  ##进行挂起4秒
    print "接下来的动作"
#官方函数定义见如下截图:
#具体应用见文章:
1、https://www.shumeijiang.com/2021/09/02/四路红外避障传感器实验/
2、https://www.shumeijiang.com/2021/07/25/步进电机定位问题解决尝试

GPIO之wait_for_edge()函数

#函数:wait_for_edge(channel, status) 
#参数说明:
参数说明可选项
channel传感器引脚
status要检测的状态GPIO.RISING, GPIO.FALLING, GPIO.BOTH
其中GPIO.RISING表示电压由低变高;GPIO.FALLING表示电压由高变低;GPIO.BOTH表示两者都检测。
#实验案例参考:http://www.shumeijiang.com/2020/03/15/gpio之边沿检测/
#实验代码:
实验代码
执行代码可见效果:
1、代码执行可见屏幕输出“准备开始接收”,然后主线程进入阻塞状态,由于没有其他线程所以进程进入阻塞状态;
2、当用手指放置在传感器触摸板上,并持续放置时,可见屏幕输出“发现低电压变化高电压”,即检测到触摸动作;
3、当手指从传感器触摸板离开时,可见屏幕输出“发现高电压变化低电压”,即传感器感知到触摸结束。
#结论
  • 函数是阻塞形式;
  • 函数不需while循环检测,检测到即可触发进程继续进行;
  • 函数可检测电压由低变高,可检测电压由高变低,也可检测发现变压变化即触发。

!/usr/bin/env python
coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO  ##引入GPIO模块
import time              ##引入time库
touchPin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(touchPin, GPIO.IN)
print '准备开始接收'

GPIO.wait_for_edge(touchPin, GPIO.RISING)
print '发现低电压变化高电压'

GPIO.wait_for_edge(touchPin, GPIO.FALLING)
print '发现高电压变化低电压'
#官方函数定义见如下截图:

GPIO之边缘检测

实验目的:应用一种新的电压检测方式,更精准更灵活的检测到传感器电压变化,从而获得传感器被触发或者被释放的状态。
边缘检测也是一种传感器状态检测的方式,不同的是通过内置的函数进行;比如wait_for_edge()或者event_detected(),它们和平常我们用的while循环有相同之处,都是用来检测传感器状态,不同的地方在与前者更精准,不会由于while内的time.sleep时无法获得CPU而导致状态获取失败,具体可见如下实验。
#接线效果如图
触摸开关传感器(默认低电压,触摸触发高电压)
#传统while获取方式(以触摸开关传感器为例):
while方式检测
while方式检测
#传统while检测会存在丢失现象,如果time.sleep(2)的时候主线程阻塞从而导致进程挂起,此时正好触发传感器,由于没有其他线程所以导致进程检测不到,出现结果丢失现象。
#wait_for_edge()函数,会在检测到指定的升高或者降低或者两者的状态时阻塞进程,直到检测到状态。

具体可见文章:http://www.shumeijiang.com/2020/03/15/gpio之wait_for_edge函数/
#event_detected()函数,不会阻塞进程,在while循环中检测到状态变化,不会影响主线程继续执行,而是通过其他线程同步检测到的状态,同时还能触发回调多个函数,同步触发其他任务。

具体可见文章:http://www.shumeijiang.com/2020/03/15/gpio之event_detected系列函数/

基于命令行打开I2C协议支持

实验目的:通过命令行命令执行,打开树莓派对于I2C协议的支持;或者查看当前自己的树莓派支持的协议情况。因为有些协议默认是关闭的。
#操作流程:
1、ssh登录树莓派,可以写成一个shell脚本;例如下图,我这边有三个树莓派板子登录脚本,分别是car、dog和master。
2、实验用的是dog-login.sh,less可见脚本内容:
3、执行sh ./dog-login.sh登录dog树莓派;因为pi没有设置密,所以可直接登录。
4、接下来查看树莓派配置,执行命令 sudo raspi-config,可见效果如图:
5、上图可见很多选项,有关于用户密码,网络设置,开机设置等等,我们这边选择5 Interfacing Options(关于外接设备的接口设置);通过键盘上下键移动选择选项,左右键选择Select还是Finish,按Enter键选择,可见效果如下图:
6、可见选项列表,有P1 Camera(外接摄像头需要打开),P2 SSH (ssh登录需要打开,我们这次就是采用ssh登录因此需要先执行这个配置的打开),P3 VNC(允许远程控制,比如QQ的允许其他人控制电脑),P4 SPI(SPI协议),P5 I2C(I2C协议)等,我们这次要打开I2C协议,因此通过上下键选择,然后Enter执行,可见如下效果:
7、上图提示是否开启I2C协议支持(即使当前已经开启),默认选中”是“,Enter键执行即可。
8、提示上图表示已开启成功,然后会跳转到步骤4的选项列表,左右光标移动选择Finish即可退出选项;至此,开启配置完成。