分类目录派-就酱

树莓派安装OpenCV-Python

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上,包含树莓派基于Linux为内核的Debian系统。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
    其中OpenCV-Python是用于OpenCV的Python API,它是解决计算机视觉问题的Python专用库;接下来就尝试如何安装这个库。
    其中这次采用apt-get安装预构建安装包安装;首先确定要安装的Python版本,如果是Python2,则执行:

sudo apt-get install python-opencv
如果是Python3,则执行:

sudo apt-get install python3-opencv
执行过程如下图,可见会自动安装一系列依赖包,以及升级和建议安装:
执行成功后,执行:

import cv2
print(cv2.__version__)
如果没有报错,则表示安装成功:

树莓派Zero系统烧录实验

    前面曾经实验过给树莓派3B+烧录系统,文章地址: https://www.shumeijiang.com/2021/04/17/树莓派烧录系统/;由于3B+有正常的USB接口,所以可以正常外接鼠标,键盘以及正常的尺寸的HDMI接口外接显示器;但是zero由于尺寸不一,加之手里面没有对应的转换接口,所以这次尝试一下烧录系统以及配置网络信息。
    首先准备好树莓派Zero(已焊好针脚),适配的电源,以及一个TF卡(最好大于等于16G),TF卡读卡器;一台Windows电脑。
实验一:
1、TF卡按上面的文章烧录系统;
2、如果手里面有非zero其他树莓派版本,将卡插入,用正常版本进行设置;
3、外接鼠标、键盘、显示器然后开机登录,设置网络以及下载相关软件;
4、网络设置好后,将TF卡插入到树莓派zero上,启动zero;
5、启动后,正常ssh连接即可;
6、这个方法依赖其他硬件,所以不做重点,有条件的可以尝试。
实验二:
采用串口模式,通过一个USB转串口模块,连接Zero和电脑,然后进行系统设置;
1、首先按前面文章烧录系统,烧录完成后,打开TF卡并寻找config.txt文件;
2、在config.txt文件的尾部添加打开串口命令,如下图:
 3、 将TF卡插入Zero,用杜邦线连接树莓派Zero和USB转串口模块,效果如下图: 
4、将上图的USB插入Windows电脑,然后树莓派Zero开机;
5、登录Windows电脑,下载串口通信软件Putty,也可以用其他软件,下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html;
6、软件下载并安装,安装好后打开软件,并设置如下图:
参数设置
6、如上图设置好端口COM3以及波特率115200,连接方式选择Serial,然后点击右下方的Open按钮;
7、页面打开后,回车,按提示输入账号pi和初始密码raspberry,然后进入系统命令行交互页面,如下图:
8、设置静态IP地址,后面就可以通过固定IP地址登录;参考文章:https://www.shumeijiang.com/2021/04/17/树莓派设置静态ip/;
 9、静态IP地址设置好后,需要打开ssh支持,可参考文章:https://www.shumeijiang.com/2019/12/08/基于命令行打开i2c协议支持; 
10、设置好静态IP地址和打开ssh后,重启Zero,然后断开USB串口模块,就可以通过正常ssh登录了;
11、其他参考文章:
(1)切换清华源:https://www.shumeijiang.com/2021/04/17/树莓派切换清华镜像源/;
(2)安装可视化工具VNC:https://www.shumeijiang.com/2021/05/06/树莓派安装vnc/

树莓派间通信-socket通信

    上篇文章已经尝试过使用mongo作为介质,来实现消息的传递;今天这篇文章将尝试socket,来实现消息传递;具体scoket的详细信息,可以网上搜索查看,这篇文章主要是讲解两个树莓派之间如何使用socket通信。
    使用mongo文章:https://www.shumeijiang.com/2021/01/24/多个树莓派之间实现通信对话/
两个树莓派,一个3b+,一个zero
#上图可见,实验用到一个树莓派zero(上),一个树莓派3b+(下);
#server服务端代码

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

import socket
import time

host = '192.168.0.118'  #本机(主机)ip
port = 1026   # 自定义端口

server = socket.socket() #默认AF_INET、SOCK_STREAM
server.bind((host, port)) #连接主机
server.listen(5) #连接最多5个设备

while True:
    connect, address = server.accept() #开始接收客户端连接请求

    #处理连接交互信息
    while True:
        data = connect.recv(1024) #接收客户端发送的信息
        if not len(data):
            print('链接已断开')
            break
        else:
            print('收到信息:%s'%data)

        #信息回复
        connect.send('ok')

server.close()
#client客户端

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

import socket
import time

host = '192.168.0.118' #主机地址
port = 1026

client = socket.socket()
client.connect((host, port)) #连接主机

while True:
    s = raw_input(">>")   #接收输入
    client.send(s)   #发送给主机信息
    data = client.recv(1024)  #接收主机回复信息

    #主机回复信息处理
    if data=='ok':
        print('命令传输完成')

client.close()
    从上面代码可知,客户端接收用户输入,然后发送给服务端,服务端将信息处理,然后发送给客户端处理状态。
#实验过程:
1、首先启动server端,执行Python server.py;
2、接着启动client端,执行Python client.py;
3、client端,提示">>",输入指令,然后回车发送给服务端;
4、服务端接收到数据,然后处理后将处理状态发送给客户端;
#效果如下图:
客户端发送命令
服务端接收处理

舵机的新驱动方式

    去年曾经写过舵机的驱动方式,文件见链接:https://www.shumeijiang.com/2020/05/06/舵机(伺服电机)驱动实验/;在那篇文章内我们采用的是外置的驱动文件,其原理还是利用的led的驱动方式;今天我们将切换另一种驱动方式,无需再每次使用时额外引入驱动程序,而是直接调用即可。
    调用之前,我们先认识一下今天的主角CircuitPythonCircuitPython初学者友好的Python开源版本,适用于称为微控制器的小型廉价计算机。微控制器是许多电子产品的大脑,包括用于构建业余项目和原型的各种开发板。

    CircuitPython是正在快速发展一种兼容标准Python的嵌入式系统编程语言,目前已支持树莓派(Raspberry Pi)、ARM Cortex-M0/M0+、 ARM Cortex-M4/M4F等;它具有统一的 Python核心API和收纳了越来越多的150多个与之配合使用的设备库和驱动程序;因此我们在驱动硬件设备时,可以直接通过命令调用它的内置驱动,从而不用再每次引入其他驱动程序。

    CircuitPython是由著名开源软件硬件商--Adafruit发起,得到全球开源社区的支持与维护,作为支持嵌入式计算机系统Python解释器的后起之秀,CircuitPython具备很多适合小体积、低功耗、有限资源系统的特征,尤其是在开放性和安全性方面。

    CircuitPython的大部分内建库完全兼容标准的Python3,因此这次调用我们也使用的是Python3。
#实验准备,开始之前需要安装依赖包,命令如下(直接执行即可):

pip3 install --upgrade throttle  adafruit-circuitpython-motor adafruit-circuitpython-pca9685 inputs smbus RPi.GPIO pick board
#实验代码如下:

#coding:utf-8

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

import time
from board import SCL, SDA
import busio

from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#实例化 此处是0x41 驱动板地址修改过导致
pca = PCA9685(i2c, address=0x41)  #地址可以修改  默认0x40
pca.frequency = 50

for i in [0,1,2]:

    servo = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo.angle = 0
    time.sleep(1)

    #再执行90度
    servo.angle = 90
    time.sleep(1)

    #再执行180度
    servo.angle = 180
    time.sleep(1)

    #再恢复90度
    servo.angle = 90
    time.sleep(1)

pca.deinit()
#注意:如果报错board模块的 SCL或者SDA找不到,可以将board文件替换一下,见下面的下载文件; 文件替换地址/home/pi/.local/lib/python3.7/site-packages;地址仅做参考,楼主是这个地址。
#其中关于脉冲宽度部分不同的舵机有不同的设置,具体可参考下图:
#实验效果:
执行效果
#参考文章:https://circuitpython.readthedocs.io/projects/motor/en/latest/index.html#

树莓派安装VNC

VNC是一款远程桌面软件(Virtual Network Console),学名虚拟网络控制台;树莓派安装这个软件,目的是通过该软件直接桌面化访问和操作,省去了命令行操作带来的烦恼;当然也可以通过树莓派外接鼠标、键盘和显示器实现,只是成本会高一些。
登录显示效果
#下载VNC软件,这边我们通过官网下载:VNC官网,见下图根据自己的系统选择下载;
根据自己系统选择
#下载后安装,安装成功后打开软件,然后右键选择 New connection,出现新加配置页面,其中VNC server添加我们配置好的树莓派静态IP地址;Name填写我们容易区分的别名即可;然后点击OK;
双击安装后的图标,如果出现报错 “cannot currently show the desktop”,可能意味着默认分辨率需要调整,当前VNC不支持默认分辨率;可如下修改:
命令行下执行:sudo raspi-config,效果见下图,然后选择选项7 Advanced Options(高级选项)
回车确认后见下图,选择A5 Resolution (分辨率)
然后继续回车,可见下图多个分辨率列表,选择其中 1280x720 分辨率然后回车选择;
确认完之后记得最后选择 <Finish> ,完成设置。

树莓派之传感器防抖

传感器抖动,比如我们经常会用U型光电传感器计算速度,用轻触开关检测按压,用人体红外检测有无人活动等;通常中间会面临一个问题就是在while的检测周期内如何设定sleep时间,如何界定一次事件的触发以及由于手抖等其他因素导致的单位时间内多次触发事件的问题。这次实验就是通过边缘检测函数更好的解决抖动问题。
这次通过轻触开关传感器实验来验证解决问题。具体实验可参考先前文章:轻触开关传感器实验
其中下图红框内sleep时间设定通常会比较不好把握,设定时间长了容易错过事件的检测,设定时间过小表示检测的更频繁容易出现单次触发的时候 被多次检测,从而出现抖动的现象。
如下图可见单次按压出现多次提示预警:
抖动
接下来我们通过软件方式来解决这个抖动问题(硬件方式暂不讨论):
通过上图可见,首先拉高电压,然后我们使用边缘检测函数,设置一个电压下降检测事件(FALLING),然后在while内检测,当status为1时表示事件检测成功。其中bouncetime为防抖时间(单位毫秒),也可以理解为检测间隔时间,即在设定的时间内只检测一个边缘事件,从而达到单位时间内只有一个事件被触发。
防抖效果如下图,可见单次按压只会有一个检测触发预警:
参考资料:

树莓派设置静态IP

由于用ssh访问树莓派更方便coding和做实验,所以动态IP对于ssh连接不很不方便,所以在局域网内设置静态IP更便于连接和操作。
编辑文件 sudo vim /etc/network/interfaces   由于此文件是只读文件所以需要有sudo权限;如果当前没有vim,需要先执行 sudo apt-get install vim 安装vim。
打开文件后可见下图,然后输入红框内部分(设置ip地址为192.168.0.118),其中address部分是自定义的静态ip地址,需要结合已有的静态ip考虑防止重复和冲突。
设置完成后,执行sudo reboot 重启树莓派。
然后在电脑端执行ssh pi@192.168.0.118 (自己定义的静态IP地址),如果执行发现报错Connection refused,则有可能是树莓派ssh模块没有打开。可通过界面打开 树莓派->首选项 -> Raspberry Pi Configuration -> Interfaces 可见各种选项,其中Enable是打开,很多默认都是Disable关闭的。我们选中打开,系统会提示是否重启,重启即可。
打开ssh支持后,再次执行ssh pi@192.168.0.118  可见登录成功;至此配置成功。

树莓派切换清华镜像源

    由于树莓派系统默认的是官网的镜像源(国外),所以网络访问存在很多不确定性;可能会出现访问慢甚至无法访问的情况,所以镜像烧录成功后,需要切换一下清华的镜像源,因为是国内的地址所以访问会更快和更稳定一些。
由于默认没有安装vim 因此我们使用nano进行文件编辑:

sudo nano /etc/apt/sources.list
然后用#注释掉红框内数据,或者直接删除掉已有三行数据并在下面写入:

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
如上图编辑完成后,执行Ctrl+O,然后提示是否写入当前文件,直接回车即可,然后执行Ctrl+X 退出文件。
其中buster为当前Debian系统的版本,录入的时候需要适配当前系统,Debian系统版本列表如下:
查看当前系统的版本:

lsb_release -a
当前系统为buster
编辑上面文件后继续执行:

sudo nano /etc/apt/sources.list.d/raspi.list
编辑效果
注释掉第一行或者直接删除掉已有数据,然后在最下面输入:

deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
然后重复上面的编辑保存步骤,保存退出文件。
执行 sudo apt update 可见下图请求源已更新为清华源。
切换后效果