树莓派4B 更新wiringPi库到2.52的方法

最新发布的树莓派4B在烧录了官方系统buster以后,如果直接使用gpio readall去查看GPIO会出现错误。无法识别的情况,需要根据以下步骤进行wiringPi的更新:

登陆后打开一个终端输入:

cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb

然后再使用

gpio -v

检查版本信息,确保版本为:2.52即可。

然后再执行:gpio readall

这时候就可以继续像往常那样使用GPIO的引脚进行编程了。

我们尝试一下使用gpio 引脚点亮一个LED灯。LED灯接在物理引脚12号,名称GPIO.1 针对WPi 引脚为1, BCM引脚为18号。

编写一个C源码:led.c

调用gcc编译:

gcc -o led -lwiringPi led.c

执行:

./led

终端显示:

由于手头的电阻阻值比较大,效果不明显,所以去掉了电阻,实际上大家应该加个220欧姆的电阻来保护LED。

使用树莓派构建一个婴儿监视器

香港很湿热,即便是晚上,许多人为了更舒适,在家里也使用空调。当我的大儿子还是一个小婴儿的时候,他卧室的空调还是需要手动控制的,没有温度自动调节的功能。它的控制器只有开或者关,让空调整个晚上持续运行会导致房间过冷,并且也浪费能源和钱。

我决定使用一个基于树莓派的物联网解决方案去修复这个问题。后来我进一步为它添加了一个婴儿监视器插件。在这篇文章中,我将解释我是如何做的,它的代码在 我的 GitHub 页面上。

设计空调控制器

解决我的问题的第一个部分是使用了一个 Orvibo S20 可通过 WiFi 连接的智能插头和智能手机应用程序。虽然这样可以让我通过远程来控制空调,但是它还是手动处理的,而我希望尝试让它自动化。我在 Instructables 上找到了一个满足我的需求的项目:他使用树莓派从一个AM2302 传感器上测量附近的温度和湿度,并将它们记录到一个 MySQL 数据库中。

使用压接头将温度/湿度传感器连接到树莓派的相应 GPIO 针脚上。幸运的是,AM2302 传感器有一个用于读取的 开源软件,并且同时提供了 Python 示例。

与我的项目放在一起的用于 AM2302 传感器 接口的软件已经更新了,并且我使用的原始代码现在应该已经过时了,停止维护了。这个代码是由一个小的二进制组成,用于连接到传感器以及解释读取并返回正确值的 Python 脚本。

将传感器连接到树莓派,这些 Python 代码能够正确地返回温度和湿度读数。将 Python 连接到 MySQL 数据库很简单,并且也有大量的使用 python-mysql 绑定的代码示例。因为我需要持续地监视温度和湿度,所以我写软件来实现这些。

事实上,最终我用了两个解决方案,一是作为一个持续运行的进程,周期性(一般是间隔一分钟)地获取传感器数据,另一种是让 Python 脚本运行一次然后退出。我决定使用第二种方法,并使用 cron 去每分钟调用一次这个脚本。之所以选择这种方法的主要原因是,(通过循环实现的)持续的脚本偶尔会不返回读数,这将导致尝试读取传感器的进程出现堆积,最终可能会导致系统挂起而缺乏可用资源。

我也找到了可以用程序来控制我的智能插头的一个 Perl 脚本。它是解决这种问题所需的一部分,因此当某些温度/湿度达到触发条件,将触发这个 Perl 脚本。在做了一些测试之后,我决定去设计一个独立的 checking 脚本,从 MySQL 去拉取最新的数据,然后根据返回的值去设置智能开关为开或关。将插头控制逻辑与传感器读取脚本分开,意味着它们是各自独立运行的,就算是传感器读取脚本写的有问题也没事。

配置一个打开/关闭空调的温度值是很有意义的,因此,我将这些值转移到控制脚本读取的配置文件中。我也发现,虽然传感器的值一般都很准确,但是,偶尔也会出现返回不正确读数的情况。这个传感器脚本被修改为不向 MySQL 数据库中写入与前值差异非常大的值。同样也在配置文件中写入了连续读取的温度/湿度之间允许的最大差异值,如果读取的值处于这些限制值以外,这些值写不会提交到数据库中。

虽然,做这个自动调节器似乎花费了很多努力,但是,这意味着,记录到 MySQL 数据库的数据是有效的、可用于进一步去分析识别用户使用模式的有用数据。可以用多种图形方式去展示来自 MySQL 数据库中的数据,而我决定使用 Google Chart 在一个 Web 页面上显示数据。

添加一个婴儿监视摄像头

树莓派开放的性能意味着我可以不断地为它增加功能 —— 并且我有大量的未使用的可用 GPIO 针脚。我的下一个创意是去添加一个摄像头模块,将它放在孩子的卧室中,配置它去监视婴儿。

我需要一个能够在黑暗环境中工作的摄像头,而 Pi Noir 摄像头模块是非常适合这种条件的。Pi Noir 除了没有红外过滤之外,同样也是树莓派常用的摄像头模块。这意味着它在白天时的图像可能有点偏紫色,但是它可以在黑暗中借助红外灯来显示图像。

现在我需要一个红外光源。由于树莓派非常流行,并且进入门槛很低,因此它有大量的外围配件和插件。也有适合它的各种红外光源,我注意到的其中一个是 Bright Pi。它可以从树莓派上供电,并且它很适合为树莓派的摄像头模块提供红外光和普通光。它唯一的缺点是太考验我的焊接技能了。

我的焊接技能还是不错的,但是可能花费的时间比其他人更长。我成功地连接了外壳上所有的红外 LEDs,并将它们连接到树莓派的 GPIO 针脚上。这意味着树莓派能够编程控制红外 LED 是否点亮,以及它的亮度。

通过一个 Web 流去公开捕获的视频也很有意义,因为这样我就可以从 Web 页面上查看温度和湿度的读数图表。进一步研究之后,我选择了一个使用 M-JPEG 捕获器的 流软件。通过 Web 页面公开 JPG 源,我可以在我的智能手机上去连接摄像头查看程序,去查看摄像头的输出。

做最后的修饰

没有哪个树莓派项目都已经完成了还没有为它选择一个合适的外壳,并且它有各种零件。在大量搜索和比较之后,有了一个显然的 赢家:SmartPi 的乐高积木式外壳。乐高的兼容性可以让我去安装温度/湿度传感器和摄像头。下面是最终的成果图:

在这以后,我对我的这个作品作了一些改变和更新:

  • 我将它从树莓派 2 Model B 升级到了树莓派 3,这意味着我可以使用 USB WiFi 模块。
  • 我用一个 TP-Link HS110 智能插头替换了 Orvibo S20。
  • 我也将树莓派插到了一个智能插头上,这样我就可以远程重启/重置它了。
  • 我从树莓派上将 MySQL 数据库移走了,它现在运行在一个 NAS 设备上的容器中。
  • 我增加了一个非常 灵活的三角夹,这样我就可以调整到最佳角度。
  • 我重新编译了 USB WiFi 模块,禁用了板载 LED 指示灯,这就是升级到树莓派 3 的其中一个好处。
  • 我因此为我的第二个孩子设计了另外一个监视器。
  • 因为没有时间去折腾,我为我的第三个孩子购买了夜用摄像头。

想学习更多的东西吗?所有的代码都在 我的 GitHub 页面上。

想分享你的树莓派项目吗?将你的故事和创意发送给我们。

via: https://opensource.com/article/18/3/build-baby-monitor-raspberry-pi
作者:Jonathan Ervine 译者:qhwdw 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出

树莓派 VNC Viewer 远程桌面配置教程

树莓派实验室在之前介绍过《直接用Windows远程桌面连接树莓派的方法》,使用的是微软的“远程桌面(Remote Desktop Connection)”作为客户端登录树莓派。下面我们介绍使用树莓派官方认证的 RealVNC 客户端登录树莓派的方法。

在开始之前,你需要已经登录树莓派,进入到树莓派命令窗口,通过接上显示器和键鼠直接操作或通过 SSH 登录都可以。

启用树莓派 VNC 服务

在终端输入以下命令进入配置界面。

sudo raspi-config

依次操作:Interfacing Options -> VNC -> Yes。之后系统会提示你是否要安装 VNC 服务,输入 y 之后回车,等待系统自动下载安装完成,一切顺利的话 VNC 服务就启动了!

 

 

 

安装 VNC 客户端

下面去 RealVNC 官网下载 RealVNC Viewer,它是 RealVNC 的客户端,跨平台。下载你需要的平台的客户端版本即可。

https://www.realvnc.com/en/connect/download/viewer/

登录远程桌面

运行 RealVNC Viewer 之后输入树莓派的 IP 地址,通过 ifconfig 命令可以查看。选择连接之后输入树莓派的登录用户名密码,初始用户名 pi,密码为 raspberry。确认之后即可进入树莓派的远程桌面!

 

 

 

 

本文转载自 树莓派实验室

 

树莓派使用 Nokia 5110 屏幕显示网速温度

Nokia 5110
长上图这样。

驱动
PCD8544

资料
Google 一搜各种博客都有介绍,毕竟我不是学硬件的,底层什么的就不说了。好玩就行。

引脚

rst:外部复位引脚
ce:显示屏使能引脚
dc:数据/命令引脚
din:串行数据输入端
clk:串行时钟输入端
vcc:电源引脚
bl: 亮度调节
gnd:接地

先看看驱动代码

修改自(Adafruit),这里用的是 BCM 编码。

# coding:utf-8
import time
import Adafruit_GPIO as GPIO
import Adafruit_GPIO.SPI as SPI
 
LCDWIDTH = 84
LCDHEIGHT = 48
ROWPIXELS = LCDHEIGHT//6
PCD8544_POWERDOWN = 0x04
PCD8544_ENTRYMODE = 0x02
PCD8544_EXTENDEDINSTRUCTION = 0x01
PCD8544_DISPLAYBLANK = 0x0
PCD8544_DISPLAYNORMAL = 0x4
PCD8544_DISPLAYALLON = 0x1
PCD8544_DISPLAYINVERTED = 0x5
PCD8544_FUNCTIONSET = 0x20
PCD8544_DISPLAYCONTROL = 0x08
PCD8544_SETYADDR = 0x40
PCD8544_SETXADDR = 0x80
PCD8544_SETTEMP = 0x04
PCD8544_SETBIAS = 0x10
PCD8544_SETVOP = 0x80
FONT = {
  ' ': [0x00, 0x00, 0x00, 0x00, 0x00],
  '!': [0x00, 0x00, 0x5f, 0x00, 0x00],
  '"': [0x00, 0x07, 0x00, 0x07, 0x00],
  '#': [0x14, 0x7f, 0x14, 0x7f, 0x14],
  '$': [0x24, 0x2a, 0x7f, 0x2a, 0x12],
  '%': [0x23, 0x13, 0x08, 0x64, 0x62],
  '&': [0x36, 0x49, 0x55, 0x22, 0x50],
  "'": [0x00, 0x05, 0x03, 0x00, 0x00],
  '(': [0x00, 0x1c, 0x22, 0x41, 0x00],
  ')': [0x00, 0x41, 0x22, 0x1c, 0x00],
  '*': [0x14, 0x08, 0x3e, 0x08, 0x14],
  '+': [0x08, 0x08, 0x3e, 0x08, 0x08],
  ',': [0x00, 0x50, 0x30, 0x00, 0x00],
  '-': [0x08, 0x08, 0x08, 0x08, 0x08],
  '.': [0x00, 0x60, 0x60, 0x00, 0x00],
  '/': [0x20, 0x10, 0x08, 0x04, 0x02],
  '0': [0x3e, 0x51, 0x49, 0x45, 0x3e],
  '1': [0x00, 0x42, 0x7f, 0x40, 0x00],
  '2': [0x42, 0x61, 0x51, 0x49, 0x46],
  '3': [0x21, 0x41, 0x45, 0x4b, 0x31],
  '4': [0x18, 0x14, 0x12, 0x7f, 0x10],
  '5': [0x27, 0x45, 0x45, 0x45, 0x39],
  '6': [0x3c, 0x4a, 0x49, 0x49, 0x30],
  '7': [0x01, 0x71, 0x09, 0x05, 0x03],
  '8': [0x36, 0x49, 0x49, 0x49, 0x36],
  '9': [0x06, 0x49, 0x49, 0x29, 0x1e],
  ':': [0x00, 0x36, 0x36, 0x00, 0x00],
  ';': [0x00, 0x56, 0x36, 0x00, 0x00],
  '<': [0x08, 0x14, 0x22, 0x41, 0x00], '=': [0x14, 0x14, 0x14, 0x14, 0x14], '>': [0x00, 0x41, 0x22, 0x14, 0x08],
  '?': [0x02, 0x01, 0x51, 0x09, 0x06],
  '@': [0x32, 0x49, 0x79, 0x41, 0x3e],
  'A': [0x7e, 0x11, 0x11, 0x11, 0x7e],
  'B': [0x7f, 0x49, 0x49, 0x49, 0x36],
  'C': [0x3e, 0x41, 0x41, 0x41, 0x22],
  'D': [0x7f, 0x41, 0x41, 0x22, 0x1c],
  'E': [0x7f, 0x49, 0x49, 0x49, 0x41],
  'F': [0x7f, 0x09, 0x09, 0x09, 0x01],
  'G': [0x3e, 0x41, 0x49, 0x49, 0x7a],
  'H': [0x7f, 0x08, 0x08, 0x08, 0x7f],
  'I': [0x00, 0x41, 0x7f, 0x41, 0x00],
  'J': [0x20, 0x40, 0x41, 0x3f, 0x01],
  'K': [0x7f, 0x08, 0x14, 0x22, 0x41],
  'L': [0x7f, 0x40, 0x40, 0x40, 0x40],
  'M': [0x7f, 0x02, 0x0c, 0x02, 0x7f],
  'N': [0x7f, 0x04, 0x08, 0x10, 0x7f],
  'O': [0x3e, 0x41, 0x41, 0x41, 0x3e],
  'P': [0x7f, 0x09, 0x09, 0x09, 0x06],
  'Q': [0x3e, 0x41, 0x51, 0x21, 0x5e],
  'R': [0x7f, 0x09, 0x19, 0x29, 0x46],
  'S': [0x46, 0x49, 0x49, 0x49, 0x31],
  'T': [0x01, 0x01, 0x7f, 0x01, 0x01],
  'U': [0x3f, 0x40, 0x40, 0x40, 0x3f],
  'V': [0x1f, 0x20, 0x40, 0x20, 0x1f],
  'W': [0x3f, 0x40, 0x38, 0x40, 0x3f],
  'X': [0x63, 0x14, 0x08, 0x14, 0x63],
  'Y': [0x07, 0x08, 0x70, 0x08, 0x07],
  'Z': [0x61, 0x51, 0x49, 0x45, 0x43],
  '[': [0x00, 0x7f, 0x41, 0x41, 0x00],
  '\\': [0x02, 0x04, 0x08, 0x10, 0x20],
  ']': [0x00, 0x41, 0x41, 0x7f, 0x00],
  '^': [0x04, 0x02, 0x01, 0x02, 0x04],
  '_': [0x40, 0x40, 0x40, 0x40, 0x40],
  '`': [0x00, 0x01, 0x02, 0x04, 0x00],
  'a': [0x20, 0x54, 0x54, 0x54, 0x78],
  'b': [0x7f, 0x48, 0x44, 0x44, 0x38],
  'c': [0x38, 0x44, 0x44, 0x44, 0x20],
  'd': [0x38, 0x44, 0x44, 0x48, 0x7f],
  'e': [0x38, 0x54, 0x54, 0x54, 0x18],
  'f': [0x08, 0x7e, 0x09, 0x01, 0x02],
  'g': [0x0c, 0x52, 0x52, 0x52, 0x3e],
  'h': [0x7f, 0x08, 0x04, 0x04, 0x78],
  'i': [0x00, 0x44, 0x7d, 0x40, 0x00],
  'j': [0x20, 0x40, 0x44, 0x3d, 0x00],
  'k': [0x7f, 0x10, 0x28, 0x44, 0x00],
  'l': [0x00, 0x41, 0x7f, 0x40, 0x00],
  'm': [0x7c, 0x04, 0x18, 0x04, 0x78],
  'n': [0x7c, 0x08, 0x04, 0x04, 0x78],
  'o': [0x38, 0x44, 0x44, 0x44, 0x38],
  'p': [0x7c, 0x14, 0x14, 0x14, 0x08],
  'q': [0x08, 0x14, 0x14, 0x18, 0x7c],
  'r': [0x7c, 0x08, 0x04, 0x04, 0x08],
  's': [0x48, 0x54, 0x54, 0x54, 0x20],
  't': [0x04, 0x3f, 0x44, 0x40, 0x20],
  'u': [0x3c, 0x40, 0x40, 0x20, 0x7c],
  'v': [0x1c, 0x20, 0x40, 0x20, 0x1c],
  'w': [0x3c, 0x40, 0x30, 0x40, 0x3c],
  'x': [0x44, 0x28, 0x10, 0x28, 0x44],
  'y': [0x0c, 0x50, 0x50, 0x50, 0x3c],
  'z': [0x44, 0x64, 0x54, 0x4c, 0x44],
  '{': [0x00, 0x08, 0x36, 0x41, 0x00],
  '|': [0x00, 0x00, 0x7f, 0x00, 0x00],
  '}': [0x00, 0x41, 0x36, 0x08, 0x00],
  '~': [0x10, 0x08, 0x08, 0x10, 0x08],
  '\x7f': [0x00, 0x7e, 0x42, 0x42, 0x7e],
}
X = 13
Y = 5
 
class PCD8544(object):
    """Nokia 5110/3310 PCD8544-based LCD display."""
 
    def __init__(self, dc, rst, sclk=None, din=None, cs=None, gpio=None, spi=None, vcc=None, bl=None):
        self._sclk = sclk
        self._din = din
        self._dc = dc
        self._cs = cs
        self._rst = rst
        self._gpio = gpio
        self._spi = spi
        self._buffer = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFF, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x87, 0x8F, 0x9F, 0x9F, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0, 0xE0, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xE0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF1, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x0F, 0x87, 0xE7, 0xFF, 0xFF, 0xFF, 0x1F, 0x1F, 0x3F, 0xF9, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7E, 0x3F, 0x3F, 0x0F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0xE0, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x1F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
        if self._gpio is None:
            self._gpio = GPIO.get_platform_gpio()
            self._gpio.setup(vcc, GPIO.OUT)
            self._gpio.setup(bl, GPIO.OUT)
            self._gpio.output(vcc, 1)
            self._gpio.output(bl, 1)
        if self._rst is not None:
            self._gpio.setup(self._rst, GPIO.OUT)
        # Default to bit bang SPI.
        if self._spi is None:
            self._spi = SPI.BitBang(self._gpio, self._sclk, self._din, None, self._cs)
        # Set pin outputs.
        self._gpio.setup(self._dc, GPIO.OUT)
        # Initialize buffer to Adafruit logo.
 
    def command(self, c):
        """Send command byte to display."""
        # DC pin low signals command byte.
        self._gpio.set_low(self._dc)
        self._spi.write()
 
    def extended_command(self, c):
        """Send a command in extended mode"""
        # Set extended command mode
        self.command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION)
        self.command(c)
        # Set normal display mode.
        self.command(PCD8544_FUNCTIONSET)
        self.command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL)
 
    def begin(self, contrast=40, bias=4):
        """Initialize display."""
        self.reset()
        # Set LCD bias.
        self.set_bias(bias)
        self.set_contrast(contrast)
 
    def reset(self):
        """Reset the display"""
        if self._rst is not None:
            # Toggle RST low to reset.
            self._gpio.set_low(self._rst)
            time.sleep(0.1)
            self._gpio.set_high(self._rst)
 
    def display(self):
        """Write display buffer to physical display."""
        # TODO: Consider support for partial updates like Arduino library.
        # Reset to position zero.
        self.command(PCD8544_SETYADDR)
        self.command(PCD8544_SETXADDR)
        # Write the buffer.
        self._gpio.set_high(self._dc)
        self._spi.write(self._buffer)
 
    def clear(self):
        """Clear contents of image buffer."""
        self._buffer = [0] * (LCDWIDTH * LCDHEIGHT // 8)
 
    def set_contrast(self, contrast):
        """Set contrast to specified value (should be 0-127)."""
        contrast = max(0, min(contrast, 0x7f)) # Clamp to values 0-0x7f
        self.extended_command(PCD8544_SETVOP | contrast)
 
    def set_bias(self, bias):
        """Set bias"""
        self.extended_command(PCD8544_SETBIAS | bias)
 
    def draw_str(self, y, s):
        """修改显示数据,y 为第几行,s 为要显示的数据"""
        if (y >= Y ) or (y < 0):
            return False
        x = 0
        for c in s[0:14]:
            try:
                self._buffer[y*84+x*6: y*84+x*6 + 6] = FONT + [0]
            except KeyError:
                pass
            x += 1
 
    def draw_char(self, x, y):
        pass
 
    def quit(self):
        self._gpio.cleanup()

接线(BCM)

dc 13
rst 5
sclk 26
din 19
cs 6
vcc 20
bl 21
gnd 0v

显示信息

网速
显示路由器的网速,电脑网速就没必要了。
我用的是老毛子固件,所以用这个固件的可以参考我的代码。

代码量不大,我就没写注释了。

# coding:utf-8
import requests
import time
from math import fabs
from base64 import b64encode
# from demjson import decode
 
class RaspberryMonitorNetSpeed:
    url = 'http://192.168.123.1/update.cgi?output=netdev'
    headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
            'Cache-Control': 'max-age=0',
            # 'Connection':'keep-alive',
            'Connection': 'close',
            'Cookie': 'n56u_cookie_bw_rt_tab=WAN',
            'Host': '192.168.123.1',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
        }
    # 最近一次请求时间
    last_time = 0
    # 最近一次请求的下行数据总量
    last_rbytes = 0
    # 最近一次请求的上行数据总量
    last_tbytes = 0
 
    def __init__(self, username, passwd):
        self.headers['Authorization'] = 'Basic '+b64encode((username+':'+passwd).encode()).decode()
        data = self.__get_wan_rx_and_tx()
        self.last_rbytes = data[0]
        self.last_tbytes = data[1]
        self.last_time = data[2]
 
    def set_auth(self, username, passwd):
        self.headers['Authorization'] = 'Basic '+b64encode((username+':'+passwd).encode()).decode()
 
    def __get_wan_rx_and_tx(self):
        text = requests.get(self.url, headers=self.headers).text
        try:
            rx = int(text.split(',')[25].lstrip('rx:').strip(), 16)
            tx = int(text.split(',')[26].lstrip('tx:').rstrip('}\n').strip(), 16)
            new_time = time.time()
        except (IndexError, ValueError, TypeError):
            return False
        return [rx, tx, new_time]
 
    def get_human_speed(self):
        """这里返回的是 M/s 这种网速,[下载,上传]"""
        data = self.__get_wan_rx_and_tx()
        if data:
            down_speed = 0
            up_speed = 0
            try:
                down_speed = self.__bytes_to_humanspeed((data[0] - self.last_rbytes) / (data[2] - self.last_time))
                up_speed = self.__bytes_to_humanspeed((data[1] - self.last_tbytes) / (data[2] - self.last_time))
            except ZeroDivisionError:
                pass
            self.last_rbytes = data[0]
            self.last_tbytes = data[1]
            self.last_time = data[2]
            return down_speed, up_speed
 
    def __bytes_to_humanspeed(self, B):
        absval = fabs(B) / 1024
        megabyte = 1024
        gigabyte = megabyte * 1024
        terabyte = gigabyte * 1024
        # petabyte = terabyte * 1024
        if absval < megabyte:
            return str(round(absval, 2)) + ' KB/s'
        elif absval < gigabyte:
            return str(round(absval / megabyte, 2)) + ' M/s'
        else:
            return str(round(absval / gigabyte, 2)) + ' G/s'
 
    def get_bits_speed(self):
        """这里返回的是 Mbps 这种网速,[下载,上传]"""
        data = self.__get_wan_rx_and_tx()
        if data:
            down_speed = self.__bytes_to_bitrate((data[0] - self.last_rbytes) / (data[2] - self.last_time))
            up_speed = self.__bytes_to_bitrate((data[1] - self.last_tbytes) / (data[2] - self.last_time))
            self.last_rbytes = data[0]
            self.last_tbytes = data[1]
            self.last_time = data[2]
            return down_speed, up_speed
 
    def __bytes_to_bitrate(self, B):
        bits = B * 8
        absval = fabs(bits)
        kilobit = 1000
        megabit = kilobit * 1000
        gigabit = megabit * 1000
        if absval < megabit:
            return str(round(bits / kilobit, 2)) + ' Kbps'
        elif absval < gigabit:
            return str(round(bits / megabit, 2)) + ' Mbps'
        else:
            return str(round(bits / gigabit, 2)) + ' Gbps'
 
if __name__ == '__main__':
    from lcd1602 import LCD1602
    a = RaspberryMonitorNetSpeed('username', 'password')
    lcd = LCD1602()
    while True:
        tmp = a.get_human_speed()
        lcd.lcd_string('u:' + tmp[1], lcd.LCD_LINE_1)
        lcd.lcd_string('d:' + tmp[0], lcd.LCD_LINE_2)
        time.sleep(2)

温度
这里用的是 DTH11,驱动同样参考这个(Adafruit)。

开始显示
代码量同样不大,没写注释。

import time
import datetime
from PCD8544 import PCD8544 as lcd
import threading
import Adafruit_DHT
from speed import RaspberryMonitorNetSpeed as rmn
 
ns = [-1, -1]
th = [-2, -2]
 
def main():
    a = lcd(dc=13, rst=5, sclk=26, din=19, cs=6, vcc=20, bl=21)
    a.begin(contrast=60)
    tmp = threading.Thread(target=network_speed)
    tmp.setDaemon(True)
    tmp.start()
    tmp = threading.Thread(target=temperature_humidity)
    tmp.setDaemon(True)
    tmp.start()
    while True:
        try:
            a.clear()
            # 上传速度
            a.draw_str(0, 'U: ' + str(ns[1]))
            # 下载速度
            a.draw_str(1, 'D: ' + str(ns[0]))
            # 温度
            a.draw_str(2, 'T: ' + str(th[1]) + ' C')
            # 湿度
            a.draw_str(3, 'H: ' + str(th[0]) + '%')
            # 时间
            a.draw_str(4, datetime.datetime.now().__str__()[5:].lstrip('0').split('.')[0])
            a.display()
            time.sleep(1)
        except KeyboardInterrupt:
            a.quit()
            exit(0)
 
def network_speed():
    global ns
    b = rmn('bankroft', '123456')
    while True:
        time.sleep(1)
        ns = b.get_human_speed()
 
def temperature_humidity():
    global th
    pin = 25
    while True:
        time.sleep(10)
        th = Adafruit_DHT.read_retry(11, 25)
 
if __name__ == '__main__':
    main()

运行

依赖
python3

安装 Python 库
Adafruit_GPIO
Adafruit_DHT
requests

运行

python main.py
成果

树莓派上搭建自己的 python 开发环境

一般情况下,在烧录完镜像以后就可以直接在树莓派上通过 thony idle 去进行 python 的开发了.

但是用惯了 pycharm 和习惯了 vim 编程的我怎么可以直接用文本编辑器写代码呢?

效率完全没有了啊!

安装完镜像环境后,就可以在树莓派上开发了,为了开发opencv for python,我在树莓派上搭建了vim的python开发环境,除了配置.vimrc以外还要给各位小伙伴安利一款VIM python 自动补全插件:pydiction。

这是在纯shell环境下进行python编程的一款利器, 全屏编辑器结合这款利器各种 python 补全不再是问题。
pydiction可以实现下面python代码的自动补全:

简单python关键词补全
python 函数补全带括号
python 模块补全
python 模块内函数,变量补全
from module import sub-module 补全


  1. 安装 vim

sudo apt-get  update

sudo apt-get -y install vim git

2. 下载插件

mkdir -p ~/.vim/bundle

cd ~/.vim/bundle

git clone https://github.com/rkulla/pydiction.git

3. 配置~/.vimrc

vim ~/.vimrc

4. 在配置文件最下面填写

#载入文件类型插件

filetype plugin on

#配置插件路径

let g:pydiction_location = ‘~/.vim/bundle/pydiction/complete-dict’

#设置补全菜单的高度

let g:pydiction_menu_height = 3

然后就可以通过 vim 进行代码编写了.这时候就有了自动补全的功能.

#配色方案(可用 :highlight 查看配色方案细节)

colorscheme murphy

#打开语法高亮

syntax on

#侦测文件类型

filetype on

#载入文件类型插件

filetype plugin on

#为不同文件类型使用不用缩进

filetype indent on

#显示行号

set number

#打开自动缩进

set autoindent

#使用 C/C++ 的缩进方式

set cindent

#为 C 程序提供自动缩进

set smartindent

#设置自动缩进长度为四个空格

set shiftwidth=4

#按退格键时可以一次删掉 4 个空格

set softtabstop=4

#设定 tab 键长度为 4

set tabstop=4

#将 tab 展开为空格

set expandtab

#去掉输入错误时的提示声音

set noerrorbells

#右下角显示光标位置

set ruler

#总是显示状态行

set laststatus=2

#自定义状态行
set statusline=%F%m%r%h%w[%L][%{&ff}]%y[%p%%][%04l,%04v]

#当前列数+当前行数+当前光标位置百分比+使用的语法高亮器+文件格式+文件总行数+预览标志+帮助文件标志+只读标志+已修改标志+当前文件绝对路径

#强调匹配的括号

set showmatch

#光标短暂跳转到匹配括号的时间, 单位是十分之一秒

set matchtime=2

#显示当前正在键入的命令

set showcmd

# 设置自动切换目录为当前文件所在目录,用 :sh 时候会很方便

set autochdir

# 搜索时忽略大小写

set ignorecase

#随着键入即时搜索

set incsearch

#有一个或以上大写字母时仍大小写敏感

set smartcase

#代码折叠

set foldenable

set foldmethod=indent

#在左侧显示折叠的层次

set foldcolumn=4

#针对 Python 文件的设定

if has(“autocmd”)

autocmd FileType python set tabstop=4 shiftwidth=4 expandtab

endif

#配置pydiction插件路径

let g:pydiction_location = ‘/home/pi/.vim/bundle/pydiction/complete-dict’

#设置pydiction补全菜单的高度

let g:pydiction_menu_height = 3

希望对大家有用,谢谢!

Pi Zero Enc28j60网络适配器模块使用说明 SKU:EP-0088

Pi Zero Enc28j60网络适配器模块使用说明

说明

对于Pi Zero来说, 如果没有网卡是非常不方便的,因为它的核心系统是Linux,
大多数操作都是基于linux的命令行通过ssh服务来完成的.所以它其实需要一个网络适配器,也就是我们常说的网卡, Pi zero enc28j60是简单网络适配器模块,它非常易于组装和配置。
它允许您的Raspberry Pi zero 顺利访问网络,这样就可以很容易进行系统更新和软件安装操作。

兼容性列表

  • 兼容性
平台 版本1.01(HW V1.01) 备注
Raspberry Pi 3 Model B Plus
树莓派零
Raspberry Pi零W
Raspberry Pi 3型号B.
树莓派2型号B
树莓派模型B +

功能

  • 易于组装
  • 易于设置
  • 官方OS覆盖支持
  • 稳定而快速
  • 重量:0.015Kg
  • 尺寸:65.14mm x 29.93mm x 23.34mm

装配展示:

如何配置:

  • 1.将NIC模块安装到raspberry Pi中。
  • 2.连接好网线以确保您的路由器支持DHCP并且运行良好。

  • 3.将Raspbian镜像文件烧录到TF卡。
  • 4.使用您喜欢的编辑器(如“nano”或“vim.tiny”)编辑/boot/config.txt文件,并添加以下参数:
dtoverlay=enc28j60

然后保存退出并重新启动raspberry Pi。
注意:该模块仅在raspbian操作系统环境中进行测试。

如何检查网络适配器是否正常工作

打开终端并输入以下命令:

ifconfig

您将看到Pi zero Enc28j60网络适配器模块的详细信息.这时候说明网卡可以正常使用了.

同时你会看到屏幕右上方的网络连接图标已经呈现出一上一下一对箭头.

套件组件包括:

  • Pi零点Enc28j60网络适配器模块x 1
  • 说明x 1

更多内容请关注www.52pi.net,您将获得更多好玩儿有趣的资讯!

 

使用 Adafruit 读取 DHT11 温湿度传感器

DHT11 温湿度传感器尽管不是使用效率最高的温湿度传感器,但价格便宜被广泛应用。之前我们介绍了用树莓派从 DHT11 温度湿度传感器读取数据的教程,其原理理解起来较为复杂,下面我们介绍另一种基于Adafruit DHT 库读取 DHT11 数据的方法。

DHT11 规格

DHT11 有四个引脚,但是其中一个没有被使用到。所有有的模块会简化成3个引脚。

  • 湿度检测范围 : 20-80% (5% 精度)
  • 温度检测范围 : 0-50°C (±2°C 精度)

该厂商不建议读取频率小于2秒,如果这么做数据可能会有误。

硬件连接

需要在电源和数据脚之间串联一个上拉电阻(4.7K-10K),通常情况下,购买DHT11模块的话都自带了这个电阻。不同的模块型号引脚位置略有不同,下面以图上模块为说明:

DHT Pin Signal Pi Pin
1 3.3V 1
2 Data/Out 11 (GPIO17)
3 not used
4 Ground 6 or 9

数据引脚可以根据你的需要自行修改。

Python 库

DHT11 的读取需要遵循特定的信号协议完成,为了方便我们使用Adafruit DHT 库。

软件安装

开始之前需要更新软件包:

sudo apt-get update
sudo apt-get install build-essential python-dev

从 GitHub 获取 Adafruit 库:

sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT

给 Python 2 和 Python 3 安装该库:

sudo python setup.py install
sudo python3 setup.py install

示例程序

Adafruit 提供了示例程序,运行下面的命令测试。

cd ~
cd Adafruit_Python_DHT
cd examples
python AdafruitDHT.py 11 17

这两个参数分别表示 DHT11 和数据引脚所接的树莓派 GPIO 编号。成功的话会输出:

Temp=22.0* Humidity=68.0%

如何在其他 Python 程序中使用这个库

参照下面的方法引入 Adafruit 库,然后就可以使用 “read_retry” 方法来读取 DHT11 的数据了:

import Adafruit_DHT
  
# Set sensor type : Options are DHT11,DHT22 or AM2302
sensor=Adafruit_DHT.DHT11
  
# Set GPIO sensor is connected to
gpio=17
  
# Use read_retry method. This will retry up to 15 times to
# get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
  
# Reading the DHT11 is very sensitive to timings and occasionally
# the Pi might fail to get a valid reading. So check if readings are valid.
if humidity is not None and temperature is not None:
  print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
  print('Failed to get reading. Try again!')

另外,温度传感器还有 DS18B20,这个传感器虽然没有湿度数据,但是其易用且稳定。

本文来自:树莓派实验室

树莓派使用 USB 麦克风录音

前几天,有朋友从我们淘宝店买了USB 接口的麦克风, 说是无法识别, 没办法录音, 经过交流发现, 实际上是咩有开启麦克风的音量.

这篇帖子简单介绍一下怎么去利用 usb 麦克风录音,更多应用在后面给大家拓展一下.

首先这个麦克风,超级小巧和物美价廉.哈哈10元你买不了吃亏买不了上当…

 

接驳的方式很简单, 麦克风接入树莓派的 USB 口,然后启动树莓派, 这里我说的直接启动是在假设你已经通过烧录工具烧录好了操作系统.目前操作环境使用的是 Raspbian 系统.

可以去官方下载: http://www.raspberrypi.org/downloads

我这里测试环境是树莓派3B+, 8GBTF 卡.

然后登陆系统,打开终端, 输入如下命令检查是否识别出了 USB 设备.

第一个是我的2.4Ghz 的无线键鼠, 第二个就是麦克风的设备了.

也可以通过 dmesg 看看:

可以看到已经检测到 PnP Sound Device.

接下来,我们看看使用什么方式去录音.你可以安装 ALSA 的录音应用软件:

安装软件前先升级或者说更新一下软件仓库的索引信息: sudo apt-get update

然后执行安装:

sudo apt-get -y  install  alsa-utils   pulseseaudio

然后直接输入:

arecord  -L

就列出目前你机器上可以用的声卡了.

然后可以通过:

arecord –device=hw:1,0 –format S16_LE –rate 44100 -c1 test.wav

说明一下: –device=hw:1,0 是定义录音的设备. –format S16_LE 是定义 signed 16-bit (S16_LE) 音频. 码率是: 44100 Hz (--rate 44100) 后面的参数是定义为mono 格式 (-c1) , 文件名为: test.wav

这里的录音设备1,0 是因为系统设别出来的状态决定的, subdevices 是1, subdevice是0.

来吼一曲一人我饮酒醉, 然后录音录下来,播放看看效果如何.

可以按下 ctrl+C 终止.

如果想播放看看效果:

aplay –device=plughw:1,0 test.wav

之前我们提到了,如果麦克风音量没有开,可能会录出来的内容是无声的.

因此可以通过 alsamixer 去调整, 这里- c 1 是设置输入输出都在一个设置层面上,就是可以在一个终端中通过面板操作所有的音频设备:

alsamixer -c 1

默认为00,按F5的上就可以看到这样的画面:

Mic 就是麦克风了,现在音量很低,你需要按上调试合适的音量.

按 Tab 键可以切换调试的设备.

按 ESC 退出.

再执行录音就可以了.

后面和语音相关的应用介绍:

可以通过命令录音,然后上传给百度语音识别的 API 接口,通过百度语音识别后, 生成 Text 文本,然后将 text 文本提交到图灵机器人后台的 API, 可以得到图灵机器人的反馈,也应该是文本,然后再将文本转语音,就是传说中的 TTS, 那样,你的树莓派就可以和天猫精灵,小米智能音响一样和你交互了.

快去试试看吧!

 

Raspberry Pi 7英寸1280×800显示套件(无触摸屏)说明SKU:Z-0112

Raspberry Pi 7英寸HDMI高清液晶显示屏1280×800显示模块套件

说明

7寸高清 HDMI 液晶显示屏,采用标准分辨率,适合各位 DIY 爱好者进行 DIY 项目使用.

在树莓派上测试效果非常好, 配置也简单容易实现.

  • 注意:不带HDMI或VGA电缆的LCD屏幕,非触摸屏版本不需要驱动程序。

特点:

  • 工作电压:9V(电流要求1A-2A),推荐使用12V电源。
  • 额定功率:10-12Wat
  • 信号输入:AV + VGA + HDMI(HDMI 1.2)
  • 分辨率:1280×800
  • 即插即用:支持
  • OSD语言支持:简体中文,繁体中文,英文,日文,韩文,西班牙文,法文,德文,意大利文,葡萄牙文
  • 控制:多功能OSD操作或电位器调节亮度和颜色
  • 特点:使用成熟的程序,清晰的显示
  • 支持图像上下翻转,图像可以转换4:3/16:9显示格式
  • 基于IPS技术

LCD屏幕参数:

  • 显示尺寸:7英寸
  • 触摸屏:不支持
  • 尺寸:161(W)×106(H)×5(D)mm
  • 观看面积:152mm(H)×96mm(V)
  • 分辨率:1280×3(RGB)×800
  • 点距离:0.05(W)×0.15(H)mm
  • 视角:所有角度
  • 面板类型:IPS
  • 显示颜色:262K,50%(CIE1931)
  • 对比度:800:1(Typ。)
  • 亮度:400 cd /m²(典型值)
  • 接口类型:数字
  • 连接类型:FPC电缆
  • 背光:LED
  • 响应时间:25(Typ。)(Tr + Td)ms
  • 工作频率:60Hz
  • 信号接口:LVDS(1个通道,6位),30个引脚
  • 电压:3.3V(典型值)
  • 工作温度:-20〜70°C
  • 储存温度:-30〜80°C
  • 应用:移动DVD,数码相框,汽车系统,多媒体应用和其他视听系统

套件包含:

  • 1 x 7英寸的液晶屏幕
  • 1个LCD驱动板
  • 1个白色电缆(连接到键盘)
  • 1个长绿色键盘

如何设置分辨率:

  • 需要修改树莓派配置文件/boot/config.txt 文件:
  • 您可以使用vim.tiny或nano编辑器修改/boot/config.txt文件,并更改参数,如下图所示:
解析度 配置文件
1280×800 disable_overscan = 1
hdmi_drive = 1
hdmi_group = 2
hdmi_mode = 28
hdmi_force_hotplug = 1

修改/boot/config.txt后请重新启动树莓派


视频驱动板机械制图


如何自动设置分辨率

有一种简单的方法可以通过shell脚本来设置屏幕的分辨率,您可以通过git工具下载脚本并使用它来改变屏幕的分辨率,步骤如下: 然后按照步骤选择您拥有的屏幕类型,它会自动为您设置分辨率。
git clone https://github.com/yoyojacky/52Pi.git
cd ~/52Pi
chmod +x restool.sh
./restool.sh


常见问题

  • 问题:如何在汽车中使用此屏幕?
    • 答:对不起,我们不建议你把这个屏幕放在你的车里,当你开车时它可能会分散注意力。
  • 问题:我可以使用哪根电线?
    • 答:此屏幕的驱动板可提供VGA和HDMI电缆输出。

7英寸 1024×600显示套件(无触摸屏)使用说明 产品SKU:Z-0051

7英寸HDMI高清液晶屏幕1024 * 600显示模块套件(无触摸屏)

说明:

该产品是没有触摸屏幕的独立显示套件, 主要针对的对象是使用树莓派的用户DIY 使用,由于没有外壳和支架的保护,因此需要比较小心排线.

注意:不带HDMI或VGA电缆的LCD屏幕,非触摸屏版本不需要驱动程序。

注意:下图显示了最新版本的7英寸-1024×600显示器套件,它具有新的蓝色阻焊油.


特点:

  • 工作电压:5V(电流要求1A-2A),例如汽车电源需要加5V稳压器
  • 额定功率:6-7W
  • 信号输入:AV + VGA + HDMI(HDMI 1.2)
  • 支持5V直流电压输入,可以使用USB或移动电源,但正负极不能颠倒,避免损坏电路板
  • 分辨率:1024 * 600,
  • 即插即用:支持
  • OSD语言支持:简体中文,繁体中文,英文,日文,韩文,西班牙文,法文,德文,意大利文,葡萄牙文
  • 控制:多功能OSD操作或电位器调节亮度和颜色
  • 特点:使用成熟的程序,清晰的显示
  • 支持图像上下翻转,图像可以转换4:3/16:9显示格式

LCD屏幕参数:

  • 显示尺寸:7英寸
  • 触摸屏:不支持
  • 尺寸:165(W)×100(H)×5(D)mm
  • 观看区域:154.08(H)×85.92(V)
  • 分辨率:1024×3(RGB)×600
  • 点距离:0.05(W)×0.15(H)mm
  • 视角:L70°R70°U50°D60
  • 面板类型:TFT
  • 显示颜色:262K
  • 对比度:500:1
  • 亮度:220cd / m2
  • 接口类型:数字
  • 连接数量:50 PIN数字(TTL)TCON
  • 背光:LED
  • 应用:移动DVD,数码相框,汽车系统,多媒体应用和其他视听系统

套件包含:

  • 1 x 7英寸的液晶屏幕
  • 1个LCD驱动板
  • 1个白色电缆(连接到键盘)
  • 1个长绿色键盘
  • 1个USB转DC5.5电源线

接线方式:


树莓派配置

  • 如何设置屏幕分辨率:
  • 您可以使用vim.tiny或nano编辑器修改/boot/config.txt文件,并更改参数,如下图所示:
解析度 配置文件
1024×600 hdmi_group = 2
hdmi_mode = 87
hdmi_cvt 1024 600 60 3 0 0 0
hdmi_force_hotplug = 1

修改/boot/config.txt后请重新启动树莓派


如何自动设置分辨率

有一种简单的方法可以通过shell脚本来设置屏幕的分辨率,您可以通过git工具下载脚本并使用它来改变屏幕的分辨率,步骤如下: 然后按照步骤选择您拥有的屏幕类型,它会自动为您设置分辨率。
git clone https://github.com/yoyojacky/52Pi.git
cd ~/52Pi
chmod +x restool.sh
./restool.sh


视频驱动板机械制图


常见问题

  • 问题:如何在汽车中使用此屏幕?
  • 答:对不起,我们不建议你把这个屏幕放在你的车里,当你开车时它可能会分散注意力。
  • 问题:我可以使用哪根电线?
  • 答:此屏幕的驱动板可提供VGA和HDMI电缆输出。