树莓派+motion安装摄像头实现远程监控

下面我们介绍如何来给树莓派装个USB摄像头,然后远程访问摄像头拍摄的即时画面。

首先你需要一个树莓派能兼容的USB摄像头,笔者用的是罗技(Logitech)C270 高清网络摄像头,插上即可。软件方面非常简单只需要一个软件:motion。

假设你的树莓派已经装好了 Raspbian 的系统,你只需要:

sudo apt-get install motion

然后打开 motion daemon 守护进程,让他可以一直在后台运行:

sudo nano /etc/default/motion #no修改成yes: start_motion_daemon=yes

修改motion的配置文件:

sudo vim /etc/motion/motion.conf #deamon off 改成 on deamon on #设置分辨率 width 800 height 600 #关闭 localhost 的限制 webcam_localhost off

然后运行 motion:

sudo motion

现在我们的摄像头已经变成了一台网络摄像头。在chrome浏览器下访问 http://[your.domain]:8081 即可看到摄像头当前拍摄的画面。

树莓派 Raspberry Pi 设置无线上网

一、查看网卡状态是否正常

把无线网卡插到树莓派上,输入命令ifconfig -a查看是否有wlan0的信息,如果有说明网卡状态正常,可以跳过第二步,直接配置无线网络。如果查不到wlan0的信息,则需要安装无线网卡的驱动。

二、查看无线网卡的信息

输入命令dmesg | grep usb查看无线网卡的信息,主要是看制造厂家(Manufacturer)。比如,我的网卡信息是

usb 1-1.3: Manufacturer: Realtek

以Realtek为例,安装无线网卡驱动。

如果现在你的树莓派能联网,输入安装命令就可以安装Realtek的驱动了。

首先搜索Realtek驱动:

apt-cache search realtek

看到下面信息:

firmware-realtek – Binary firmware for Realtek wired and wireless network adapters

安装Realtek驱动:

sudo apt-get install firmware-realtek

如果你的树莓派现在不能上网,那么你可以去镜像站点中下载相关驱动。我推荐阿里云的镜像站点,速度比较快。http://mirrors.aliyun.com/raspbian/raspbian/pool/non-free/f/firmware-nonfree

下载firmware-realtek_0.43_all.deb,用winscp上传到树莓派的/tmp目录中。输入命令安装:

sudo dpkg -i /tmp/firmware-realtek_0.43_all.deb

三、配置无线网络

用编辑器nano打开interfaces文件

sudo nano /etc/network/interfaces

我的interfaces文件是这样的:

auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp

我们把无线网卡部分全部用#注释掉,然后添加自己的配置信息,最终结果如下:

auto lo iface lo inet loopback iface eth0 inet dhcp auto wlan0 #allow-hotplug wlan0 #iface wlan0 inet manual iface wlan0 inet dhcp wpa-conf /etc/wpa.conf #wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp

使用nano编辑器,ctrl+o保存,ctrl+x退出。

用编辑器nano创建 /etc/wpa.conf 文件:

sudo nano /etc/wpa.conf

如果你的wifi没有密码

network={ [Tab] ssid=”你的无线网络名称(ssid)” [Tab] key_mgmt=NONE }

如果你的wifi使用WEP加密

network={ [Tab] ssid=”你的无线网络名称(ssid)” [Tab] key_mgmt=NONE [Tab] wep_key0=”你的wifi密码” }

如果你的wifi使用WPA/WPA2加密

network={ [Tab] ssid=”你的无线网络名称(ssid)” [Tab] key_mgmt=WPA-PSK [Tab] psk=”你的wifi密码” }

注1:所有符号都是半角符号(英文状态下的符号),“[Tab]”表示按一次Tab键

注2:如果你不清楚wifi的加密模式,可以在安卓手机上用root explorer打开 /data/misc/wifi/wpa/wpa_supplicant.conf,查看wifi的信息。

比如,我的wpa.conf文件是这样的:

network={ ssid=”1234″ key_mgmt=WPA-PSK psk=”MTIzNA1234″ }

最后输入命令启用无线网卡:

sudo ifup wlan0

可以连无线网了。

原文链接:http://www.jianshu.com/p/b42e8d3df449

树莓派销量突破千万!

树莓派已经成为计算机领域一个相当突出的现象。这种简易电脑连机箱都没有,就更不用说软件了。但实际情况证明,这款成本只有35美元的产品备受孩子们和动手爱好者青睐。

实际上,由于非常热门,设在英国的树莓派基金会现已售出了1000万台树莓派电脑。

正如树莓派之父埃本·阿普顿上周四在博客中所说,他们最初的打算只是想让更多人申请到剑桥大学的计算机专业读书。

阿普顿写道:“当时我们觉得,如果运气好,这款产品的总销量也许能达到1万台。我们根本没指望成年人来使用它,也没期望在商业上取得成功,当然更不会想到四年后树莓派在英国的日产量会达到数万台,而且销往世界各地。”

当然,当时也许没有明确迹象显示树莓派的崛起会和嵌入式计算的爆发性增长同步,甚至对后者起了推动作用。

接入互联网的不光是各种各样的常规物品,众多新型设备也实现了联网,比如无人机和可穿戴设备。和Arduino以及Adafruit等平台一样,实践证明树莓派计算机非常有用,对初创型企业来说是这样,对想以微成本把这些领域的新点子变成原型产品的业余爱好者来说同样如此。

对许多普通人来说,树莓派的作用也非常之大。今年早些时候,第三个版本的树莓派终于集成了Wi-Fi和蓝牙功能,从而不再需要为了无线通信而额外购买硬件,也让它成为更可行的家庭个人电脑取代品。

这款产品的成功不仅有利于树莓派基金会。它还占树莓派约一半产量的英国制造商Premier Farnell成为诱人的收购目标。电子元件经销企业安富利上周四表示,美国监管部门已经同意它斥资9.07亿美元收购Premier Farnell。

同时,树莓派基金会将部分销售款用于资助为儿童和教师开设的编程课程。

阿普顿写道:“大家可以想象得到,能够宣布树莓派电脑在过去四年半里的销量高达1000万台是一种多么奇怪的感觉。感谢各位,我们的成果比我们最狂野的想象高了三个数量级,而这还仅仅是个开始。”

为庆祝1000万台销量这个里程碑,该基金会宣布推出一款价格99英镑(132美元)的初学者套餐,其中包括了一些人们往往会添加在核心部件之上的东西,比如HDMI连接线、鼠标、键盘、电源、一张SD卡(用于存储免费下载的Linux操作系统)以及一个机箱。噢,对了,还有一本旨在帮助较年轻用户上手的指导书。

使用 RPi.GPIO 模块的输入(Input)功能

这篇日志的内容应该算是《RPi.GPIO 模块使用基础》Input 部分的扩展讲解,详细讲解了 Input 部分的一些高级应用技巧。

目前有几种途径可以在您的程序中获得 GPIO 的输入信息。第一种也是最简易的一种为在某个时间点检查输入值。这即是所谓的“轮询(polling)”,而且如果您的程序在错误的时间里进行了读取,可能会错过某个输入值。在循环中运用轮询,有可能使处理器资源紧张。另一种对 GPIO 输入进行响应的方式可以使用“中断(interruots)”(边缘检测(edge detection))。边缘可以是从 HIGH 到 LOW 的过度(下降临界值(falling edge))或从 LOW 到 HIGH 的过度(上升临界值(rising edge))。

上拉/下拉电阻

如果您在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为您没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化。

为了解决这个问题,我们需要使用上拉/下拉电阻。这样,我们就可设定输入的默认值了。在这里,可以使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻连接在输入通道与 3.3V(上拉)或 0V(下拉)之间是常用的做法。而 RPi.GPIO 也允许您通过软件的方式对配置 Broadcom SOC 来达到目的:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)

或者

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)

输入测试(轮询(polling))

您可以在某个时间点获得一次输入的快照:

if GPIO.input(channel): print(‘Input was HIGH’) else: print(‘Input was LOW’)

在循环中等待按钮被按下后进行轮询:

while GPIO.input(channel) == GPIO.LOW: time.sleep(0.01) # 为 CPU 留出 10 毫秒,供其处理其它事物

(这里假设为当按下按钮时,输入状态从 LOW 到 HIGH)

中断和边检检测

边缘的定义为电信号从 LOW 到 HIGH(上升临界值)或从 HIGH 到 LOW(下降临界值)状态的改变。正常情况下,对于输入的值来说,我们更关心的是输入的状态是否发生了改变。这种状态上的改变是很重要的。

为了避免您的程序在忙于处理其它的事物时而错过了您按下按钮的操作,这里有两种方法可以解决:

wait_for_edge() 函数

event_detected() 函数

在检测到边缘时执行线程回调函数

wait_for_edge() 函数

wait_for_edge() 函数被设计用于在检测到边缘之前阻止程序的运行。换句话说,上面的示例中,等待按钮被按下的语句可以改写为:

GPIO.wait_for_edge(channel, GPIO.RISING)

注意,您可以输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。这种方式的优点是占用 CPU 资源很少,因此系统可以有充裕的资源处理其它事物。

event_detected() 函数 event_detected() 函数被设计用于循环中有其它东西时使用,但不同于轮询的是,它不会错过当 CPU 忙于处理其它事物时输入状态的改变。这在类似使用 Pygame 或 PyQt 时主循环实时监听和响应 GUI 的事件是很有用的。

GPIO.add_event_detect(channel, GPIO.RISING) # 在通道上添加上升临界值检测 do_something() if GPIO.event_detected(channel): print(‘Button pressed’)

注意,您可以输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。

线程回调

RPi.GPIO 在第二条线程中执行回调函数。这意味着回调函数可以同您的主程序同时运行,并且可以立即对边缘进行响应。例如:

def my_callback(channel): print(‘这是一个边缘事件回调函数!’) print(‘在通道 %s 上进行边缘检测’%channel) print(‘该程序与您的主程序运行在不同的进程中’) GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback) # 在通道上添加上升临界值检测 … 其它程序代码 …

如果您需要多个回调函数:

def my_callback_one(channel): print(‘回调 1’) def my_callback_two(channel): print(‘回调 2’) GPIO.add_event_detect(channel, GPIO.RISING) GPIO.add_event_callback(channel, my_callback_one) GPIO.add_event_callback(channel, my_callback_two)

注意,在该示例中,回调函数为顺序运行而不是同时运行。这是因为当前只有一个进程供回调使用,而回调的运行顺序是依据它们被定义的顺序。

开关防抖

您可能会注意到,每次按钮按下时,回调操作被调用不止一次。这种现象被称作“开关抖动(switch bounce)”。这里有两种方法解决开关抖动问题:

将一个 0.1uF 的电容连接到开关上。

软件防止抖动

两种方式一起用

使用软件方式抖动,可以在您指定的回调函数中添加 bouncetime= 参数。

抖动时间需要使用毫秒为单位进行书写。例如:

# 在通道上添加上升临界值检测,忽略由于开关抖动引起的小于 200ms 的边缘操作 GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback, bouncetime=200)

或者

GPIO.add_event_callback(channel, my_callback, bouncetime=200) remove_event_detect()

由于某种原因,您不希望您的程序检测边缘事件,您可以将它停止:

GPIO.remove_event_detect(channel)

相关网站

原文地址:RPi.GPIO module Inputs

项目地址:RPi.GPIO

原文翻译:dreamcolor.net

RPi.GPIO 模块使用基础

RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。

注意,该模块不适合应用到追求实时性或计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。如果您一定要追求实时操作的性能,可以考虑购买一块 Arduino 主板http://www.arduino.cc!

还需要注意一点,目前的版本还不支持 Raspberry Pi 的 SPI、I2C、1-wire、串口等功能。计划在不久的将来会实现的!

本文是 RPi.GPIO 模块文档系列文章的第一篇,除本文外还包括以下几篇:

使用 RPi.GPIO 模块的输入(Input)功能

使用 RPi.GPIO 模块的输出(Output)功能

使用 RPi.GPIO 模块的脉宽调制(PWM)功能

导入模块

导入 RPi.GPIO 模块:

import RPi.GPIO as GPIO

通过该操作,您可以将模块名称映射为 GPIO,以便接下来您其它脚本进行使用。

导入模块并检查它是否导入成功,可以尝试:

try: import RPi.GPIO as GPIO except RuntimeError: print(“导入 RPi.GPIO 时出现错误!这可能由于没有超级用户权限造成的。您可以使用 ‘sudo’ 来运行您的脚本。”)

针脚编号

目前有两种方式可以通过 RPi.GPIO 对 Raspberry Pi 上的 IO 针脚进行编号。

第一种方式是使用 BOARD 编号系统。该方式参考 Raspberry Pi 主板上 P1 接线柱的针脚编号。使用该方式的优点是无需考虑主板的修订版本,您硬件始终都是可用的状态。您将无需从新连接线路和更改您的代码。

第二种方式是使用 BCM 编号。这是一种较低层的工作方式 – 该方式参考 Broadcom SOC 的通道编号。使用过程中,您始终要保证主板上的针脚与图表上标注的通道编号相对应。您的脚本可能在 Raspberry Pi 主板进行修订版本更新时无法工作。

指定您所使用的方式(必须指定):

GPIO.setmode(GPIO.BOARD)

或者

GPIO.setmode(GPIO.BCM)

警告

可能您的 Raspberry Pi 的 GPIO 上同时有多个脚本/循环。因此,如果 RPi.GPIO 检测到某个针脚被设置为其它用途而非默认的状态(默认为输入),您会在尝试配置某脚本时得到警告消息。

禁用该警告消息:

GPIO.setwarnings(False)

配置通道

您需要为每个用于输入或输出的针脚配置通道。

配置为输入的通道:

GPIO.setup(channel, GPIO.IN)

(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)

更多关于输入通道的进阶信息可以在这里找到。

配置为输出的通道:

GPIO.setup(channel, GPIO.OUT)

(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)

您还可以指定输出通道的初始值:

GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)

输入

读取 GPIO 针脚的值:

GPIO.input(channel)

(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)这将返回 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。

输出

设置 GPIO 针脚的输出状态:

GPIO.output(channel, state)

(通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)。)

状态可以为 0 / GPIO.LOW / False 或者 1 / GPIO.HIGH / True。

清理

在任何程序结束后,请养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,您可以避免由于短路意外损坏您的 Raspberry Pi 针脚。注意,该操作仅会清理您的脚本使用过的 GPIO 通道。

在您的脚本结束后进行清理:

GPIO.cleanup()

Raspberry Pi 修订版本和 RPi.GPIO 版本

检测 Raspberry Pi 主板的修订版本:

GPIO.RPI_REVISION

检测 RPi.GPIO 的版本:

GPIO.VERSION

相关网站

原文地址:RPi.GPIO module basics

项目地址:RPi.GPIO

原文翻译:dreamcolor.net

Raspbian系统迎来全新桌面环境:PIXEL

树莓派基金会Simon Long非常开心的宣布,面向树莓派设备基于Debian的Raspbian GNU/Linux操作系统的全新桌面环境。Raspbian系统此前搭载很高知名度的轻量级LXDE桌面环境,但该桌面环境并非针对树莓派设备而是面向诸多Linux发行版本。为此树莓派基金会在几年前招募了Simon Long,致力于为用户打造更适用的桌面环境。

经过长达2年的研发和测试,在他的带领下构建了树莓派设备主打系统————Raspbian系统的全新完整桌面环境并通过树莓派基金会发行。新桌面环境称之为PIXEL,全新的Raspbian桌面环境提供了更为养眼的界面设计、全新的图标、全新的应用菜单和全新的主题。

令人感到遗憾的是,PIXEL桌面环境并不默认搭载Epiphany网页浏览器,而是替换使用Chromium。如果你是树莓派用户且并不是十分喜欢LXDE桌面环境,那么你现在可以免费下载PIXEL桌面。现有用户可以通过以下命令进行安装:

sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install -y rpi-chromium-mods sudo apt-get install -y python-sense-emu python3-sense-emu sudo apt-get install -y python-sense-emu-doc realvnc-vnc-viewer

树莓派 SAKS 扩展板实用应用 之 DS1307 RTC 时钟模块

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本节以 SAKS 扩展板为硬件基础,实现让树莓派掉电后系统时间能继续保持的功能。在这个扩展板上已经有一个DS1307 RTC实时时钟模块,它是I2C类的设备,首先我们需要修改树莓派的配置文件使能I2C,通过nano编辑器修改raspi-blacklist.conf 文件内容。

sudo nano /etc/modprobe.d/raspi-blacklist.conf

修改为如下,开启I2C功能

# blacklist spi and i2c by default (many users don’t need them) blacklist spi-bcm2708 blacklist i2c-bcm2708

打开/etc/modules ,在文件结尾加上 i2c-dev

sudo nano /etc/modules

# /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with “#” are ignored. # Parameters can be specified after the module name. snd-bcm2835 i2c-bcm2708 i2c-dev

运行配置工具

sudo raspi-config

选择Advanced Options -> I2C,依次选择Yes、OK、Finish。完成。下次启动系统时,I2C模块将被自动加载。

更新一次包列表,并安装 i2c-tools工具与python-smbus,重启树莓派。

sudo apt-get update sudo apt-get install i2c-tools python-smbus sudo reboot

重启后通过刚才安装的i2c-tools对i2c设备进行探测,输入以下命令,得到如下结果,说明检测到一个地址为0x68的I2C设备就是板上的DS1307。

sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: — — — — — — — — — — — — — 10: — — — — — — — — — — — — — — — — 20: — — — — — — — — — — — — — — — — 30: — — — — — — — — — — — — — — — — 40: — — — — — — — — — — — — — — — — 50: — — — — — — — — — — — — — — — — 60: — — — — — — — — 68 — — — — — — — 70: — — — — — — — —

检看 DS1307的数据手册,发现DS1307的7位地址的确是0x68。注意,如果忘了为时钟模块安装纽扣电池这里可能读取不到。

下面我们通过i2c-tools来测试下DS1307的功能,并将DS1307这个掉电不丢失的时钟用于树莓派系统的时钟。

下面的测试必须在root权限下测试。

=== 如何启用 root 账户的分割线 开始===

debian里root账户默认没有密码,但账户锁定。

当需要root权限时,由默认账户经由sudo执行,Raspberry pi 系统中的Raspbian

默认用户是pi 密码为raspberry

重新开启root账号,可由pi用户登录后,在命令行下执行

sudo passwd root

执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后执行

sudo passwd –unlock root

这样就可以解锁root账户了。

现在就有两个账户 pi@raspberrypi 和 root@raspberrypi 两个账户可以来回切换:

在pi@raspberrypi 输入 su 然后输入刚才设置的密码进入 root 账户

在root@raspberrypi 输入su pi 进入 pi账户

=== 如何启用 root 账户的分割线 结束===

su Password: modprobe i2c-dev echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device hwclock -r Sat Jan 1 00:00:12 2000 -0.120717 seconds

将系统时钟设定为当前时间,然后将系统时钟写入到DS1307硬件时钟里面

date 062120352014.00 备注:6月21日 20点35分 2014年 Sat Jun 21 20:35:00 UTC 2014 hwclock -w date Sat Jun 21 20:35:21 UTC 2014

编辑启动文件

sudo nano /etc/rc.local

将以下内容加入“exit 0”行之前

modprobe i2c-dev echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device hwclock -r hwclock -s

ctrl+x退出

过几分钟拔掉网线,重启树莓派,输入“date”看看时间是否正确。

date Sat Jun 21 20:55:00 UTC 2014 root@raspberrypi:/home/pi# hwclock -r Sat Jun 21 20:56:30 2014 -0.181549 seconds

以上将系统时钟和DS1307硬件时钟读出来发现 系统时钟比DS1307时钟慢了1分多。可能是在重启后DS1307写入系统后,系统需要等待1分多才开始计时。

至此,以后要用到实时时间就可以简单的使用 date 这个命令来获取。

在python编程中可以使用以下代码读取实时时间。

import datetime #导入系统时钟 now = datetime.datetime.now() #读取当前时间并保存到now变量 timeString = now.strftime(“%Y-%m-%d%H:%M”) #把now中的时间按指定格式转换成字符串

后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!

本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials

树莓派GPIO入门08-使用74HC595芯片驱动数码管(一)

本文转自 mangolovecarrot ,是学习74HC595芯片很棒的文章。之前我们学习了如何驱动数码管显示数字。

但是这种做法有两个缺点。

需要占用大量IO口,在那篇文章里,我们为了驱动4位数码管一共使用了12个IO口。如果需要驱动8位数码管则至少需要16个IO口。 系统资源占用过多。还是在那篇文章里,为了实现数码管的动态扫描显示,需要不停地高速操作IO口,这对单任务的单片机比如51单片机来说问题并不太大,因为单任务的单片机的执行时序是由晶振来决定的,动态扫描的时间间隔可以控制地非常精确,数码管的显示会很稳定,不会出现闪烁的现象。但对于运行着多任务的Linux操作系统的树莓派来说,对IO口的大量反复操作以及大量使用sleep语句会导致CPU占用过多,最后导致动态扫描的间隔时间不均匀,体现为数码管显示不稳定,有明显闪烁的现象。为了改善这个问题我在那篇文章的最后还尝试用c语言来代替python语言,可实际效果有限。

使用GPIO直接驱动数码管时,上面这两个问题是不可避免的。想解决这两个问题,我们需要借助外部芯片的帮助。

接下来我将用几个篇幅来介绍如何使用显示驱动芯片74HC595来驱动数码管的方法。同时我们也可以学习到串行数据传输的方法以及一些数字芯片通用的一些概念,比如时钟引脚,上升沿,锁存,移位寄存等。理解了这些通用的概念对学习使用其他芯片是很有帮助的。

本文最终效果

在一块74HC595芯片的配合下,只需要3个GPIO就能驱动一只8段数码管。(直接用GPIO驱动需要至少8个GPIO口)

视频演示

硬件

74HC595显示芯片一只(0.5元一只)

共阳(或共阴)数码管一只

限流电阻一只,330欧就够了。

原理说明

先转一段百度百科上74HC595芯片的简介。

74HC595具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器有相互独立的时钟。数据在SH_cp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_cp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。

看不懂吧,没关系,我们先看一下芯片的引脚图:

分别解释一下:

GND接地,VCC接5V电源,这个就不用说了。

Q0-Q7这8根引脚是芯片的输出引脚,直接跟数码管的8段引脚相连。对应关系要看你怎么接线和写代码时传送数据的顺序了。

DS是串行输入引脚,所谓串行就是使数据在一根信号线上按顺序一位一位地传输,就像一串糖葫芦。这个引脚我们接到树莓派任意一个GPIO口上(输出模式)。

SHCP是移位寄存器的时钟引脚。听上去有点复杂,其实很简单。74HC595内部有一个8位的移位寄存器用来保存从DS引脚输入的数据。那么74HC595怎么知道什么时候该从DS引脚上取数据了呢?正是通过SHCP这个时钟引脚来实现的。只有在SHCP发生一次上升沿的时候,74HC595才会从DS引脚上取得当前的数据(高/低电平)并把取到的这一位数据保存到移位寄存器里。同样的,这个引脚也接到树莓派任意一个GPIO口上。当我们向芯片发送数据时,要先在DS引脚上准备好要传送的数据,然后制造一次SHCP引脚的上升沿(先拉低电平再拉高电平),74HC595会在这个上升沿将DS引脚上的数据存入移位寄存器D0,同时D0原来的数据会顺移到D1,D1的数据位移到D2。。。D6的数据位移到D7。而原先D7的数据已经没有地方储存了,这一位数据会被输出到引脚Q7S上。这个引脚的作用我们下一篇再说,本文暂时用不到这个引脚。(注意这里说的不是输出引脚Q0-Q7,而是指内部的8位移位寄存器里每一个“小房间”,芯片手册上并没有给这些小房间编号,这里为了说明方便进行了编号)

STCP是芯片内部另外一个8位锁存寄存器的时钟引脚。当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)。74HC595会在这个上升沿将移位寄存器里的8位数据复制到锁存器中(锁存器里原来的数据将被替换)。注意,到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。这个引脚同样连接到树莓派任意一个GPIO口上即可。

OE是输出使能引脚,在其他芯片里也很常见。作用是控制锁存器里的数据是否最终输出到Q0-Q7输出引脚上。低电平时输出,高电平时不输出(既不是高电平,也不是低电平而是高阻态,不通电)。本例为了方便直接接在GND上使其一直保持低电平输出数据。

MR是用来重置内部寄存器的引脚。低电平时重置内部寄存器(MemoryReset?)。本例为了方便直接连接在Vcc上一直保持高电平。

Q7S引脚,串行输出引脚,本文不使用,下一篇再解释它的作用。

关于锁存器。顾名思义就是将数据保存并锁定。一旦进入了锁存器,除非断电或重置数据(MR口设置为低电平),锁存器的数据不会再改变。好处是,当你需要更新数据时,将数据串行输入移位寄存器的过程中,锁存器里的数据不会有任何影响,也就不会有闪烁了。一直到移位寄存器8位数据准备完毕,再制造一次STCP的上升沿一次性更新锁存器的数据,更新输出。

另外,我做了一个动画帮助你理解整个过程。

硬件连接

模块1 引脚 模块2 引脚 74HC595 Q0 数码管 DP 74HC595 Q1 数码管 G 74HC595 Q2 数码管 F 74HC595 Q3 数码管 E 74HC595 Q4 数码管 D 74HC595 Q5 数码管 C 74HC595 Q6 数码管 B 74HC595 Q7 数码管 A 74HC595 DS 树莓派 GPIO13 74HC595 SHCP 树莓派 GPIO19 74HC595 SHTP 树莓派 GPIO26 74HC595 VCC,MR 树莓派 VCC 74HC595 GND,OE 树莓派 GND 数码管 1位共阳极 树莓派 VCC

注意,共阳数码管的共阳极连接5V电源时要串联一只限流电阻防止数码管电流过大损坏电阻。

如果你用的是共阴极数码管就没关系了,74HC595输出的电流是控制好的可以直接连到阳极上。

我手头上没有单独的1位数码管,就用4位数码管代替了,本文只接通数码管DIG1的共阳极做演示。

#!/usr/bin/env python # encoding: utf-8 import RPi.GPIO import time # 串行数据输入引脚连接的GPIO口 DS = 13 # 移位寄存器时钟控制引脚连接的GPIO口——上升沿有效 SHCP = 19 # 数据锁存器时钟控制引脚连接的GPIO口——上升沿有效 STCP = 26 RPi.GPIO.setmode(RPi.GPIO.BCM) RPi.GPIO.setup(DS, RPi.GPIO.OUT) RPi.GPIO.setup(STCP, RPi.GPIO.OUT) RPi.GPIO.setup(SHCP, RPi.GPIO.OUT) RPi.GPIO.output(STCP, False) RPi.GPIO.output(SHCP, False) # 通过串行数据引脚向74HC595的传送一位数据 def setBitData(data): # 准备好要传送的数据 RPi.GPIO.output(DS, data) # 制造一次移位寄存器时钟引脚的上升沿(先拉低电平再拉高电平) # 74HC595会在这个上升沿将DS引脚上的数据存入移位寄存器D0 # 同时D0原来的数据会顺移到D1,D1的数据位移到D2。。。D6的数据位移到D7 # 而D7的数据已经没有地方储存了,这一位数据会被输出到引脚Q7S上 RPi.GPIO.output(SHCP, False) RPi.GPIO.output(SHCP, True) # 指定数码管显示数字num(0-9),第2个参数是显示不显示小数点(true/false) # 由于我使用的数码管是共阳数码管,所以设置为低电平的段才会被点亮 # 如果你用的是共阴数码管,那么要将下面的True和False全部颠倒过来,或者统一在前面加上not def showDigit(num, showDotPoint): if (num == 0) : setBitData(not showDotPoint) # DP setBitData(True) # G setBitData(False) # F setBitData(False) # E setBitData(False) # D setBitData(False) # C setBitData(False) # B setBitData(False) # A elif (num == 1) : setBitData(not showDotPoint) setBitData(True) setBitData(True) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(True) elif (num == 2) : setBitData(not showDotPoint) setBitData(False) setBitData(True) setBitData(False) setBitData(False) setBitData(True) setBitData(False) setBitData(False) elif (num == 3) : setBitData(not showDotPoint) setBitData(False) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(False) setBitData(False) elif (num == 4) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(True) elif (num == 5) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(True) setBitData(False) setBitData(False) setBitData(True) setBitData(False) elif (num == 6) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(True) setBitData(False) elif (num == 7) : setBitData(not showDotPoint) setBitData(True) setBitData(True) setBitData(True) setBitData(True) setBitData(False) setBitData(False) setBitData(False) elif (num == 8) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) setBitData(False) elif (num == 9) : setBitData(not showDotPoint) setBitData(False) setBitData(False) setBitData(True) setBitData(False) setBitData(False) setBitData(False) setBitData(False) # 移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平) # 74HC595会在这个上升沿将移位寄存器里的8位数据复制到8位的锁存器中(锁存器里原来的数据将被替换) # 到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。 # 决定锁存器里的数据是否输出是由“输出使能端口”OE决定的。当OE设置为低电平时,锁存器里数据才会被输出到Q0-Q7这8个输出引脚上。 # 在我的硬件连接里,OE直接连接在了GND上,总是保持低电平,所以移位寄存器的数据一旦通过时钟上升沿进入锁存器,也就相当于输出到LED上了。 RPi.GPIO.output(STCP, True) RPi.GPIO.output(STCP, False) try: # 测试代码 # 从0显示到9,不显示小数点 for x in range(0,10): showDigit(x, False) time.sleep(0.2) # 再从0显示到9,显示小数点 for y in range(0,10): showDigit(y, True) time.sleep(0.2) except KeyboardInterrupt: pass # 最后清理GPIO口 # 清理了IO是将所有使用中的IO口释放,并全部设置为输入模式 # 你会发现最后设置的数据在清理了IO口以后还会继续正常显示 # 这是因为数据一旦存入锁存器,除非断电或重置数据(MR口设置为低电平), # 否则最后设置的数据会一直保留在74HC595芯片中。也就是被“锁存”了。 RPi.GPIO.cleanup()

树莓派瑞士军刀扩展板 SAKS SDK 升级

过去的一周我们发布了瑞士军刀扩展板硬件的升级版本,现在我们完成了瑞士军刀扩展板 SAKS SDK 的适应性升级,并提交到 Github 上,通过以下命令获取。

git clone https://github.com/spoonysonny/SAKS-SDK.git

本次 SDK 的升级作了如下改动:

加入了两种IC的支持——IC_74HC595类和IC_TM1637类,以及依赖这两个IC的LED排灯(Led74HC595类)和数码管(DigitalDisplayTM1637类)。

重新定义了适用于瑞士军刀V2.0的模板——SAKSPins、SAKSHAT。

适用于瑞士军刀V1.X的模板被移动到了 v1.x 目录下,如果您在使用旧版本的 SAKS,请注意使用该目录下的源文件覆盖根目录相应的文件。

原有的蜂鸣器、开关按键、温度传感器通过修改GPIO映射的配置已经被无缝移植过来,使用方法同之前的SDK教程所述。

下面结合示例先简要地说明下新特性的用法,该部分示例亦可在 examples 目录下的 main.py 文件找到。

#批量设置LED排灯的状态,从左到右依次为:亮,灭,亮,灭,亮,灭,亮,灭 SAKS.ledrow.set_row([True, False, True, False, True, False, True, False]) #批量设置LED排灯的状态,从左到右依次为:不变,亮,灭,不变,不变,不变,不变,亮 SAKS.ledrow.set_row([None, True, False, None, None, None, None, True]) #点亮LED排灯的第8个灯,0代表第1个灯,依次类推 SAKS.ledrow.on_for_index(7) #灭掉LED排灯的第1个灯 SAKS.ledrow.off_for_index(0) #LED排灯全亮 SAKS.ledrow.on() #LED排灯全灭 SAKS.ledrow.off() #注意,新的SDK不再支持 SAKS.ledrow.items[3].on() 这种用法了。 #数码管的用法完全兼容之前的 SDK,由于硬件层使用了专用芯片,数码管的显示不再闪烁,效果更稳定了! # 将显示“1234”4位数字,并且每一位右下角的小点点亮 SAKS.digital_display.show(“1.2.3.4.”) # 将显示“1234”4位数字,并且数字2后面的小点点亮 SAKS.digital_display.show(“12.34”) # 在第4位数码管显示“1”,其他3位数码管不显示 SAKS.digital_display.show(“###1”)

其他元件,如开关按键、蜂鸣器、温度传感器用法未做变更,请参考之前的相关例程

树莓派“瑞士军刀”扩展板(SAKS)DIY 教程(V1.X)

测试和学习SDK时,请进入到SDK所在目录,将 examples 下的 main.py 文件复制到SDK根目录(和sakshat.py放在一起),然后通过终端进入到SDK目录运行以下命令即可看到效果,随时可修改 main.py 文件再运行方便验证尝试的改动。

sudo python main.py

有一部分老教程,或许可以通过你的简单修改就能在新的瑞士军刀扩展板上正确运行起来哦!当然我们后面也会跟进陆续发布SAKS的教程,敬请期待!

(树莓派瑞士军刀扩展板购买请移步此处)

树莓派实验室 QQ 群号 62335986

Lakka 让树莓派变身全能游戏模拟器

Lakka 是 RetroArch 官方的 Linux 发行版,以多机种游戏模拟器 libretro 为核心。它能玩的游戏很多,街机游戏,红白机游戏,PS游戏等,算是集大成者:强大,易用,开源!

官网有非常简单的上手指南,一清二楚。我来概括说明下步骤:

1.选择你的硬件平台

因为这个Lakka只是移植到了部分硬件上,如下图所示,支持树莓派平台的1-3代产品。下面的图是各个硬件平台对各个游戏模拟器的支持情况。

2.烧录lakka包到SD卡中

在官网下载好对应硬件平台的Lakka包,官网分别介绍了在Linux,Windows,mac平台下烧录的方式,我这里是windows平台,烧录很简单,直接用 win32diskimager 就OK啦。

3.启动游戏机

接下来更简单了,看官网说明:

插入烧录好系统的SD卡

接好HDMI显示器

接好网线(可选,更新系统或通过网络安装ROM需要用到)

接好游戏手柄(键盘也可以操作)

接上树莓派的电源开机即可

手柄连接,支持XBOX和PS手柄,我这里是以前买的一个北通的,验证发现完美支持,根本不用修改映射。

4.开始玩游戏

上电后,进入开机界面:

第一次因为要进行文件系统扩展,所以花的时间稍微长点,以后就不会了。进入下面的界面表示你成功啦!马上可以开始畅玩游戏咯!

5.添加自己想玩的游戏

如果只是上面的步骤后不继续的话,恭喜你,你只能玩到自带的2048游戏(之前很风靡的一款游戏,我表示根本停不下来,容易上瘾)。

怎么才能让自己能玩到想玩的游戏呢?前提是之前提到将树莓派通过网线链接到同一个局域网内,然后打开网络,发现有个叫做 Lakka 的(没有的话直接输入 \\LAKKA 访问看看,如果还是没有,可能是你的电脑和树莓派不在同一个网段),打开它,会发现有很多共享文件夹,其中ROMS文件夹就是用来存放我们想玩的游戏的,如下图所示:

至于ROM怎么来,可以谷歌下,或者加我们的Q群 62335986 获得帮助。把ROM放到ROMs文件夹,推荐使用干净的“no-intro”合集ROM,这样的文件经过了测试,易于被扫描识别。

6.扫描游戏

用键盘或手柄将进入“+”图标的菜单,进入到ROMs文件夹后选择Scan This Directory(扫描目录下的游戏)。Lakka 会自动辨别出是哪种模拟器支持的游戏,等待扫描结束之后就可以返回到开始游戏的菜单运行游戏了。

有时候你需要做的就是重启下。在第一菜单下选中 Reboot,几秒后就重启完毕,很快。然后你就可以在相应的模拟器下选择自己想玩的游戏了。

7.FAQ

怎么超频树莓派获得更好的性能?

把SD卡插到PC上,找到 config.txt 修改其中超频(overclock)配置部分的注释。

为毛游戏看得到图像听不到声音?

把SD卡插到PC上,找到 config.txt 确认 hdmi_drive=2 这行配置没有被注释。

为毛很多ROM无法被识别出来,有些ROM无法运行?

目前我知道确实会出现这种情况,我们只能尝试寻找更多可以被支持的游戏,如果你找的了好玩的ROM欢迎分享给其他人。当然有时候没有配置游戏模拟器的BIOS也是无法启动的原因之一,详见 http://www.lakka.tv/doc/ROMs-and-BIOSes/

如何配置时区?

参考:http://www.lakka.tv/doc/Timezone-settings/

完整的FAQ:http://www.lakka.tv/doc/FAQ/

Lakka 官网:http://www.lakka.tv/

树莓派安装OpenWRT做路由器图文详解

来自树莓派实验室创客群 Archer 的投稿,在此表示感谢!

在玩OP之前,你需要一个靠谱的以太网卡,一个型号为RTL8192CU,AR9271的无线网卡(官方芯片的无线网卡都可以),随便大小的SD卡或者TF卡,都是可以的

由于没有高手指导,我算是走了不少弯路,废话不多说。首先,下载OpenWRT的系统镜像:

树莓派B,B+、树莓派2B、百度网盘(2708适用于1代,2709适用于2代)

然后就好像刷Raspbian一样,刷进内存卡。

在Ubuntu虚拟机之下,用Gparted进行内存卡EXT4分区扩容。

先Unmount EXT分区,然后再扩容。

组装好,然后启动树莓派,

网线直连Lan口,在浏览器输入192.168.1.1,密码admin

会提示重设密码和SSH链接,点进去设置。

设好密码,把SSH Access的接口设置为Lan,点击保存应用即可。

然后点进Network-interface选项,设置Lan接口详情,用于安装固件。

大概这样就可以了,不会的照搬即可,点击保存应用。

然后把树莓路由接到家里的局域网里面安装固件。

点进System—Software,继续安装软件包。

点击Update Lists

成功!

按照需求,安装以下软件包:

基础使用:openssh-sftp-server git zip usbutils luci-i18n-base-zh-cn luci-i18n-commands-zh-cn

无线网卡: kmod-rt2500-usb kmod-rt2800-lib kmod-rt2800-usb kmod-rt2x00-lib kmod-rt2x00-usb kmod-rt73-usb kmod-rtl8187 kmod-rtl8192c-common kmod-rtl8192cu kmod-rtlwifi-usb kmod-rtlwifi wireless-tools kmod-lib80211 kmod-net-rtl8188eu kmod-net-rtl8192su kmod-mac80211 kmod-ath9k-htc kmod-ath9k-common hostapd-utils hostapd fstools wpa-supplicant-p2p wpa-supplicant wpa-cli wpad-mesh wpad-mini wpad wpan-tools

以太网卡: kmod-usb-core kmod-usb-net-asix-ax88179 kmod-usb-net-asix kmod-usb-net-cdc-eem kmod-usb-net-cdc-ether kmod-usb-net-cdc-mbim kmod-usb-net-cdc-ncm kmod-usb-net-cdc-subset kmod-usb-net-dm9601-ether kmod-usb-net-hso kmod-usb-net-huawei-cdc-ncm kmod-usb-net-ipheth kmod-usb-net-kalmia kmod-usb-net-kaweth kmod-usb-net-mcs7830 kmod-usb-net-pegasus kmod-usb-net-qmi-wwan kmod-usb-net-rndis

kmod-usb-net-sierrawireless kmod-usb-net-smsc95xx kmod-usb-net

在SSH之下执行opkg install 指令之下能批量安装。

在这里换成中文。

好了。。。。。

然后进去 网络-无线 里面,设置无线,然后就能当AP用了,

新建Wan口(这里以下我没有办法从零写起,你们理解吧!)

进去 网络-接口 里面 ,然后点击下面的”添加新接口“按钮

把新建的Wan接口配置成以下选项

提交应用之后,然后点进去”防火墙配置“选项里面,把防火墙按下面配置 ,

然后点击提交就可以了。

然后修改Lan接口的信息,成为路由器

需要拨号的话,可以新建Wan0接口,配置如下

宽带账号密码自行填写

以后要是研究其他的话,我的教程会继续更新的,先写到这里,也希望各位玩家能提供其他固件服务的经验。

写在最后:

我在路由器模式之所以被折磨的这么痛苦,全TM是在实体店买的垃圾网卡害的,DM9601的芯片,每一次只要有数据传输,这个网卡就会害得树莓派的整个SMSC9514(树莓派自带的USB和网口芯片)停止工作,所以,光顾天猫京东,远离坑爹硬件。

我也懒得避嫌了,无线网卡我还没试过山寨牌子是怎样的,有线网卡我就推荐这一个

有钱的壕们可以买ax88179和AX88772A(asix牌子)的网卡,试用一下,反馈一下效果。成功的话,上购买链接吧

其他服务软件包:

ahcp服务: ahcp luci-app-ahcp luci-i18n-ahcp-zh-cn

QOS管理器 : luci-app-qos luci-i18n-qos-zh-cn qos-scripts

DDNS : luci-app-ddns luci-i18n-ddns-zh-cn ddns-scripts

网络共享: samba36-server luci-app-samba luci-i18n-base-zh-cn aria2 mount-utils

kmod-usb-storage-extras kmod-usb-storage

Asterisk : luci-app-asterisk luci-i18n-asterisk-zh-cn miax asterisk11 asterisk11-app-alarmreceiver asterisk11-app-authenticate asterisk11-app-chanisavail asterisk11-app-chanspy asterisk11-app-confbridge asterisk11-app-dahdiras asterisk11-app-directed_pickup asterisk11-app-disa

asterisk11-app-exec asterisk11-app-minivm asterisk11-app-mixmonitor asterisk11-app-originate asterisk11-app-playtones

asterisk11-app-read asterisk11-app-readexten asterisk11-app-record asterisk11-app-sayunixtime

asterisk11-app-senddtmf asterisk11-app-senddtmf asterisk11-app-sms asterisk11-app-system asterisk11-app-talkdetect asterisk11-app-verbose asterisk11-app-waituntil

asterisk11-app-while asterisk11-cdr asterisk11-cdr-csv asterisk11-cdr-sqlite3 asterisk11-chan-agent asterisk11-chan-dahdi asterisk11-chan-dongle asterisk11-chan-iax2 asterisk11-chan-mgcp asterisk11-chan-ooh323 asterisk11-chan-sccp-b asterisk11-chan-skinny asterisk11-chan-unistim asterisk11-codec-a-mu asterisk11-codec-adpcm asterisk11-codec-alaw asterisk11-codec-dahdi

asterisk11-codec-g722 asterisk11-codec-g726 asterisk11-codec-g729 asterisk11-codec-gsm asterisk11-codec-ilbc asterisk11-codec-lpc10 asterisk11-codec-resample

asterisk11-curl asterisk11-format-g726 asterisk11-format-g729 asterisk11-format-gsm asterisk11-format-h263 asterisk11-format-h264 asterisk11-format-ilbc asterisk11-format-sln asterisk11-format-vox asterisk11-format-wav asterisk11-format-wav-gsm

asterisk11-func-base64 asterisk11-func-blacklist asterisk11-func-channel asterisk11-func-cut asterisk11-func-db asterisk11-func-devstate asterisk11-func-enum asterisk11-func-env asterisk11-func-extstate asterisk11-func-global

asterisk11-func-groupcountasterisk11-func-module asterisk11-func-math

asterisk11-func-module asterisk11-func-shell asterisk11-func-uri asterisk11-func-vmcount asterisk11-mysql asterisk11-odbc asterisk11-pbx-ael asterisk11-pbx-dundi asterisk11-pbx-lua

asterisk11-pbx-spool asterisk11-pgsql asterisk11-res-ael-share asterisk11-res-agi

asterisk11-res-clioriginate asterisk11-res-fax asterisk11-res-fax-spandsp asterisk11-res-monitor asterisk11-res-musiconhold asterisk11-res-phoneprov asterisk11-res-pktccops asterisk11-res-smdi asterisk11-res-srtp asterisk11-res-timing-dahdi asterisk11-res-timing-pthread

asterisk11-res-timing-timerfd asterisk11-sounds asterisk11-voicemail

用树莓派DIY一个智能家居服务器

来自树莓派实验室老司机群 Pokebox 的投稿~

高考结束啦~来用树莓派DIY一下自己的智能家居吧~

其实这东西我自己已经用了一年了~现在就来写个教程~嘿嘿……

先上个图

有点乱23333

这是我的房间书柜,也是我的工作台……书柜的侧边是树莓派搭建的物联网服务器~

来一只近图~

这就是服务器的近照啦~

我用的是树莓派A+作为服务器的主控,所有的工作都由它完成。

树莓派A+是单核的处理器,RAM仅256MB,不过如果不是作为复杂工作的话……也足够了~

这里,它的主要工作就是收集房间和室外的环境数据并上传至yeellink,同时获取yeellink上的开关数据控制房间里的灯,门,音响等设备的开关。

以及,在晚上下晚修我回到家的时候,自动打开灯~睡着了后自动关灯~

先来简单介绍一下,这里需要用到一些什么东西。如上面那张图,树莓派是肯定要有的~当然,什么版本都可以……因为实际上这里也没用多少GPIO,以前的A,B版本都可以……

然后,树莓派左下角那个蓝色的是声卡和音响的集成驱动,用来推动喇叭的~使用5V的电源,当然大家可以直接找个小音箱来代替~~

然后下面那一堆线是面包板,用来分配电源和继电器控制,以及……比较方便接线吧23333.各种传感器可以直接插面包板上,这样就省去了焊线的麻烦。

另外,由于我用的是树莓派A+,没有网络接口,所以用了一个8口的带电源HUB连接无线网卡和其他的比如USB串口等设备。HUB贴在树莓派上面点,没拍到。

再下面是电源盒,这里我用的是台式机电脑的电源~为什么用台式机电源呢?这有很大的好处。

台式机电源有12V,5V和3.3V,并带有一路5V VSB电源,以及还可以用GPIO控制电源整体开关。这就非常适合用来做服务器了,因为我的LED灯条是12V的,电磁锁也是12V的,而树莓派和USB设备都需要5V,一些传感器则需要3.3V,正好一个电源全部搞定它。同时在一些需要耗电的东西不需要用的时候,比如LED灯条,那我还可以把整个电源系统关掉省电~而在关掉总电源的时候,5V VSB是一直保持输出的,就可以用这一路电源给树莓派持续供电~ 是不是觉得很方便?

简单介绍完整个系统了,来看看接线

这是整个系统的接线图~面包板左边那一坨就是台式机电源的ATX接口。

最下面的电机是电磁锁。

音响接的是驱动板。

以及这里用了个arduino mini,这是后来加上的,用来进行AD转换一些传感器数据然后通过串口发给树莓派。

下面那些继电器我用洞洞板制作成了一个模块,方便接线用。

正面和背面。和我最终做出来的成品稍微有点点出入,因为我在制作时根据实际优化了一下布局。但是大致电路是没什么变化的,大家可以参考制作。

这个继电器模块主要是用来控制12V设备的, 比如打开LED灯条,开锁等,都是用树莓派GPIO驱动三极管让继电器吸合导通12V的电源让设备工作。

这里我要特别强调!继电器和电磁锁都为磁感设备,在吸合和释放时因为磁生电效应会产生很强的反向电动势,这个电动势如果不采取措施很容易造成三极管甚至树莓派软击穿!导致树莓派停止工作甚至损坏!所以在每个继电器和电磁锁的线圈两端我都接有一个反向安装的二极管,用来吸收线圈在释放时产生的反向电动势,以保护设备。

好了~硬件大概就介绍到这。剩下的是软件……

先是介绍一下,通过yeellink控制LED灯和门锁等设备的控制方案,这个程序还包含了指定时间内检测我是否在家,比如在晚上,如果我回来了则自动开灯。这个是通过ping我手机的IP地址是否有回应来完成判断的。毕竟……出门肯定带手机吧……所以,当ping手机不通的时候,说明我不在家了,就关掉房间里的设备省电。当我回到家时,手机自动连接wifi后,ping通,说明我回来了,然后自动打开灯~

这一切都是通过bash脚本写的~

#!/bin/bash ##2015年9月29日 23:32:22 echo “##VI 2016年4月8日 22:56:12 ## V2.2″ TDIR=/tmp mkdir -p $TDIR export PATH=$PATH:/usr/local/bin gpio -g write 21 1 gpio -g mode 21 out ##电源开关 拉低开 gpio -g write 26 1 gpio -g mode 26 out ##桌面灯条 拉低开 gpio -g write 19 1 gpio -g mode 19 out ##桌面灯条 拉低开 gpio -g write 13 1 gpio -g mode 13 out ##柜子锁 拉低开 gpio -g write 6 1 gpio -g mode 6 out ##门锁 拉低开 FI35=0 CLE_TIME=0 ##检测计数器 ##你API的设备号 DEV= ##你传感器的编号 SW_POWER= SW_DSKLED= SW_DOOR= SW_FORCER= SW_CHANGE= getdev(){ DEVS=$1 wget http://api.yeelink.net/v1.0/device/${DEV}/sensor/${DEVS}/datapoints -O $TDIR/sa${DEVS} -T 5 &> /dev/null FTIME=`cat $TDIR/sa${DEVS} | sed ‘s/.*\”\:\”//g;s/\”\,\”.*$//g’` FYMD=`echo $FTIME | sed ‘s/T.*$//g’` FHMS=`echo $FTIME | sed ‘s/^.*T//g’` VAL=`cat $TDIR/sa${DEVS} | sed ‘s/^.*value\”\://g;s/\}//g’` if [ ! -e $TDIR/savetime${DEVS} ];then echo “” > $TDIR/savetime${DEVS} if [ “$DEVS” == “$SW_POWER” ];then if [ “$VAL” == “1” ];then gpio -g write 21 0 else gpio -g write 21 1 fi fi if [ “$DEVS” == “$SW_DSKLED” ];then if [ “$VAL” == “1” ];then gpio -g write 19 0 else gpio -g write 19 1 fi fi fi echo -e “\e[31;1m$FTIME \e[34;1m# $FYMD ## $FHMS\e[32;1m $DEVS \e[33;1m $VAL\e[0m” if [ “$FYMD” == “`date +%Y-%m-%d`” ];then echo ##操作日期为当天才进行下面的操作 if [ “$FHMS” != “`cat $TDIR/savetime${DEVS}`” ];then echo ##操作时间不和上次的记录相同才进行下面的操作 if [ “`echo $FHMS | awk -F ‘:’ ‘{printf $1}’`” == “`date +%H`” ];then A=`echo $FHMS | awk -F ‘:’ ‘{printf $1}’` echo -e “\e[31;1m$A\e[0m” ##if [ “$VAL” == “1” ];then if [ “$DEVS” == “$SW_DOOR” ];then #门锁 gpio -g write 6 0 sleep 2 gpio -g write 6 1 elif [ “$DEVS” == “$SW_FORCER” ];then #柜子锁 gpio -g write 13 0 sleep 2 gpio -g write 13 1 elif [ “$DEVS” == “$SW_POWER” ];then #电源开关 if [ “$VAL” == “1” ];then gpio -g write 21 0 else gpio -g write 21 1 fi elif [ “$DEVS” == “$SW_DSKLED” ];then #桌面灯条 if [ “$VAL” == “1” ];then gpio -g write 19 0 else gpio -g write 19 1 fi elif [ “$DEVS” == “$SW_CHANGE” ];then #充电座 if [ “$VAL” == “1” ];then gpio -g write 26 0 else gpio -g write 26 1 fi fi echo “$FHMS” > $TDIR/savetime${DEVS} ##fi fi fi fi } ##给LED点阵模块发送时间数据 ledtime(){ if [ -e /dev/ttyUSB0 ];then echo “\`wr`date +%H%M`” | microcom -p /dev/ttyUSB0 -s 115200 fi } ##先初始化锁和充电开关 getdev $SW_DOOR getdev $SW_FORCER getdev $SW_CHANGE getdev $SW_DSKLED while : do getdev $SW_POWER getdev $SW_DSKLED getdev $SW_DOOR getdev $SW_FORCER getdev $SW_CHANGE if [ “`date +%H%M`” -ge “1900” ];then ##时间在下午5点20后 if [ “$FI35” == “0” ];then ##是否查找过设备233)0否不在线 1是在线 if [ “`ping 192.168.1.233 -c 1 -S 1 &> /dev/null;echo $?`” == “0” ];then ##查找手机是否在线 gpio -g write 21 0 gpio -g write 19 0 FI35=1 fi elif [ “`date +%H%M`” -ge “1905” ];then ##如果手机不在线则判断时间是否在晚上7点以后 if [ “$CLE_TIME” -le “5” ];then ((CLE_TIME++)) echo “CLE_TIME $CLE_TIME” else CLE_TIME=0 if [ “`ping 192.168.1.233 -c 1 -S 1 &> /dev/null;echo $?`” == “1” ];then ##如果不在线则清除标记 if [ “$CLOSE_LED” == “0” ];then CLOSE_LED=1 else CLOSE_LED=0 gpio -g write 21 1 ##关灯关电源 gpio -g write 19 1 FI35=0 fi fi fi fi elif [ “`date +%H%M`” -le “0230” ];then ##时间是否在凌晨2点半以内 if [ “$FI35” == “0” ];then ##如果是,则判断手机是否在线 if [ “`ping 192.168.1.233 -c 1 -S 1 &> /dev/null;echo $?`” == “0” ];then ##如果手机在线则开灯 gpio -g write 21 0 gpio -g write 19 0 FI35=1 fi fi elif [ “$FI35” != “0” ];then ##否则关灯 FI35=0 gpio -g write 19 1 gpio -g write 21 1 fi sleep 1 ledtime gpio -g write 6 1 done

然后,是数据上传的程序。通过检测环境数据然后上传到yeellink上,然后yeellink可以自动记录并绘制图表,可以很直观的看到最近的气象温度变化以及树莓派的状态。

额……好像光敏传感器有点问题……不管啦…然后可能由于室外18B20被太阳直接照射的原因……最近温度一直很高……

然后晚上的温度还是比较正常的……(广西真的好热!)

#!/bin/bash ##连接物联网发送CPU温度 ##BY PokeBox ##创建于:2014年9月27日 ##最后修改:2014年9月30日 02:04:38 echo ” ##Start YeeLink_Temp……” APIKEY=” ##APIKEY TMPDIR=/tmp/my ##临时数据目录 TTYFIFO=/run/ttyAMA0.fifo ##/tmp/ttyAMA0.fifo sudo modprobe w1-gpio sudo modprobe w1-therm gettime(){ YY=`date +%Y`;MO=`date +%m`;DD=`date +%d` HH=`date +%H`;MM=`date +%M`;SS=`date +%S` } getCPUMHZ(){ deviceid=你的设备号 sensorid=你的传感器号 VAL=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq | awk ‘{print $1/1000}’` echo -e “\e[36;1mCPU_MHz : ${VAL}\e[0m” } getCPUdata(){ ##获取CPU数据 deviceid=你的设备号 ##设备号 sensorid= ##传感器号 VAL=`cat /sys/class/thermal/thermal_zone0/temp | awk ‘{print $1/1000}’` } getCPULoad(){ ##获取CPU使用率 deviceid=你的设备号 sensorid= VAL=$(top -b -n 2 | grep ^%Cpu | sed -n “2p” | sed -e ‘s/^.*://g;s/..,//g;s/st//g’ | awk ‘{print “scale=1; 100-” $4 }’ | bc) echo -e “\e[36;1mCPU_USER : ${VAL}\e[0m” } ## 删除数据点 http://api.yeelink.net/v1.0/device/你的设备号/sensor/传感器号/datapoint/时间点 getbdata(){ ##获取18b20温度数据室内 deviceid=你的设备号 ##设备号 sensorid= ##传感器号 VAL=`cat /sys/bus/w1/devices/28-000005823549/w1_slave | grep ‘t=’ | sed ‘s/^.*t=//g’ | awk ‘{print $1/1000}’` echo -e “\e[36;1m18B20_IN : ${VAL}\e[0m” } getboutdata(){ ##获取18b20温度数据室外 deviceid=你的设备号 ##设备号 sensorid= ##传感器号 VAL=`cat /sys/bus/w1/devices/28-00000581ea9e/w1_slave | grep ‘t=’ | sed ‘s/^.*t=//g’ | awk ‘{print $1/1000}’` echo -e “\e[36;1m18B20_Out : ${VAL}\e[0m” } GetPowerTempData(){ sensorid= VAL=`cat /sys/bus/w1/devices/28-031604d2d0ff/w1_slave | grep ‘t=’ | sed ‘s/^.*t=//g’ | awk ‘{print $1/1000}’` echo -e “\e[36;1m18B20_Power : ${VAL}\e[0m” } getlight(){ sensorid= VALa=`tac ${TTYFIFO} | grep -a ‘AD0’ | sed -n ‘2p’ | awk ‘{print $3}’ | sed ‘s/\r//’` VAL=`echo “1024 – ${VALa}” | bc` echo -e “\e[36;1mLux : ${VAL}\e[0m” } senddata(){ ##发送数据 gettime echo “{ \”timestamp\”:\”${YY}-${MO}-${DD}T${HH}:${MM}:${SS}\”, \”value\”:${VAL} }” > $TMPDIR/datafile.txt URL=”http://api.yeelink.net/v1.0/device/${deviceid}/sensor/${sensorid}/datapoints” ##物联网地址 curl –request POST –header “U-ApiKey: ${APIKEY}” –data-binary @$TMPDIR/datafile.txt ${URL} } oraynewph status & while : do getCPUMHZ;senddata ##CPU频率 getCPUdata;senddata ##CPU温度 getCPULoad;senddata ##CPU使用率 getlight; senddata ##室外亮度 getbdata TMPVAL=$(echo ${VAL%.*}) if [ “$TMPVAL” -le “0” ];then echo 1 &> /dev/null else senddata ##室内温度 fi getboutdata TMPVAL=$(echo ${VAL%.*}) if [ “$TMPVAL” -le “0” ];then echo 1 &> /dev/null else senddata ##室外温度 fi GetPowerTempData TMPVAL=$(echo ${VAL%.*}) if [ “$TMPVAL” -le “0” ];then echo 1 &> /dev/null else senddata ##电源温度 fi sleep 2m ##间隔2分钟发送一次 done

上面是发送传感器数据到yeellink的bash代码,大家如果需要的话……自己去yeellink注册然后创建设备和传感器,然后把你的APIKEY和设备传感器号填到那些对应的变量上就可以用了……然后,上面那三个18B20的设备号是我的18B20的设备号,每一个18B20都有唯一的设备号,大家自己去修改。

除此之外,大家还可以通过树莓派上的crontab来创建任务,比如在指定时间打开音响播放音乐来做闹钟~

这是我用饮料罐自己DIY的音响,配合那个驱动板使用,这样的低音炮,妈妈再也不用担心我起不来床了~

然后,仔细看的话,大家也许发现第一段代码里有一条发送时间给LED点阵的函数,是的,那个函数是用来驱动这货的……

因为我房间里没有钟,甚至……我家里都没有钟!所以就自己DIY吧……下面是其他时间段的效果

有没有觉得很6?!赶紧拿起你手中的树莓派DIY一个吧!更多创意,等你来创造!大家记得把自己的作品跟帖哦!

树莓派3如何使用蓝牙

MCC 172是一个两通道DAQ HAT,用于通过IEPE传感器(如加速度计和麦克风)进行声音和振动测量。它的每个通道具有24位A/D,最大采样率为51.2 kS/s/Ch。

树莓派3串口(UART)使用问题的解决方法

最新64位树莓派3已经发布快两周了,玩家们陆陆续续也开始使用上树莓派3了,随着玩家的增多,虽然拥有强大硬件配置的树莓派3也出现了各种各样的BUG,官方也在对这些BUG进行修复中。今天要说说树莓派3的UART串口的使用问题,该串口问题的官方反馈及回复请参考这两篇官方博文

https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=137932

https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=138223

根据官方的反馈和回复,我们了解到树莓派3上用户目前无法正常是使用GPIO中的UART串口(GPIO14&GPIO15),也就是说用户无论是想用串口来调试树莓派,还是想用GPIO中的串口来连接GPS,蓝牙,XBEE等等串口外设目前都是有问题的。

原因是树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011 UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。

目前解决方法就是,关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用,也就意味着树莓派3的板载蓝牙和串口,现在成了鱼和熊掌,两者无法兼得。

下面我就讲讲如何 恢复硬件串口的方法 :

1.下载 pi3-miniuart-bt-overlay 文件,解压出pi3-miniuart-bt-overlay.dtb文件,并将dtb文件拷贝到/boot/overlays/目录下

2.编辑/boot目录下的config.txt文件

sudo nano /boot/config.txt

添加下面两行:

dtoverlay=pi3-miniuart-bt-overlay force_turbo=1

3.编辑/boot目录下的cmdline.txt文件

sudo nano /boot/cmdline.txt

参考下面内容修改:

dwc_otg.lpm_enable=0 console=serial1,115200 console=tty1 root=/dev/mmcblk0p2 kgdboc=serial1,115200 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

保存退出

关闭板载蓝牙的方法:

1.SSH登录树莓派3后,输入下面命令关闭hciuart使用uart0.

sudo systemctl disable hciuart

2.编辑/lib/systemd/system/hciuart.server 将 “ttyAMA0”修改为“ttyS0”

sudo nano /lib/systemd/system/hciuart.service

将 “ttyAMA0”修改为“ttyS0”

保存退出

3.更新并重启

sudo apt-get update sudo apt-get upgrade sudo reboot

via