<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>树莓派 :: 标签 :: yafeng 的博客</title>
    <link>https://yafengabc.github.io/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/index.html</link>
    <description></description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 19 Sep 2026 16:30:07 +0800</lastBuildDate>
    <atom:link href="https://yafengabc.github.io/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>intel Z8300 2G 32G小主机跟树莓派3B的功耗/性能对比</title>
      <link>https://yafengabc.github.io/cnblogs/p11562232/index.html</link>
      <pubDate>Sat, 21 Sep 2019 11:52:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p11562232/index.html</guid>
      <description>具体硬件平台就不详细说了，浪费时间码字，贴一个淘宝上的配置：&#xA;有点广告的既视感，哈哈，不过我200块咸鱼收的2手，配置比这个稍低，比如CPU是Z8300，网卡是百兆的，WIFI可能也不是双频的（这个不确定，因为linux下这玩意没驱动起来）不过我买回来不是做NAS，只是想搞个7*24在线的小服务器，映射到外网做一点小服务。所以配置差点也无所谓的样子&#xA;先来个待机功耗图：&#xA;待机2.0瓦。不过这个是算上这个220V/5V 3A的效率的，因为电源的总功率是15W(5V/3A)而目标功率小于3W，所以也算是低负载运行，所以实际功耗应该是小于2瓦的，不像直测USB电流，测出来就是实际功耗，所以在接下来的对比中，我树莓派也用一个5V 3A的充电头来带，尽量做到情景一致&#xA;（不过考虑到不同的充电头，效率也不一样，所以还是不算严谨对比）先来个screenfetch。&#xA;-` .o+` yafeng@archlinux `ooo/ OS: Arch Linux `+oooo: Kernel: x86_64 Linux 5.3.0-arch1-1-ARCH `+oooooo: Uptime: 1h 5m -+oooooo+: Packages: 188 `/:-:++oooo+: Shell: bash 5.0.9 `/++++/+++++++: CPU: Intel Atom x5-Z8300 @ 4x 1.84GHz [40.2°C] `/++++++++++++++: GPU: `/+++ooooooooooooo/` RAM: 88MiB / 1862MiB ./ooosssso++osssssso+` .oossssso-````/ossssss+` -osssssso. :ssssssso. :osssssss/ osssso+++. /ossssssss/ +ssssooo/- `/ossssso+/:- -:/+osssso+- `+sso+:-` `.-/+oso: `++:. `-/+/ .` `/ 算了，不说废话了，先记下现在测试过的结果：</description>
    </item>
    <item>
      <title>让普通用户可以控制树莓派的GPIO(Archlinuxarm)</title>
      <link>https://yafengabc.github.io/cnblogs/p8873397/index.html</link>
      <pubDate>Wed, 18 Apr 2018 11:52:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p8873397/index.html</guid>
      <description>Raspbian上的Rpi.GPIO库是可以在普通用户下控制树莓派的GPIO的，然而在ArchlinuxARM下，却需要root用户才行，这无疑会引起安全问题，好在RPi.GPIO提供了一个获取权限的脚本：create_gpio_user_permissions.py&#xA;然而这个脚本是没法在ArchlinuxARM上直接运行的，因为Archlinux缺少adduser命令。&#xA;这个脚本是这样的：&#xA;import grp import subprocess def ensure_gpiogroup(): try: grp.getgrnam(&#39;gpio&#39;) except KeyError: print(&#39;GPIO group does not exist - creating...&#39;) subprocess.call([&#39;groupadd&#39;, &#39;-f&#39;, &#39;-r&#39;, &#39;gpio&#39;]) subprocess.call([&#39;adduser&#39;, &#39;pi&#39;, &#39;gpio&#39;]) # in future, also for groups: # spi # i2c add_udev_rules() def add_udev_rules(): with open(&#39;/etc/udev/rules.d/99-gpio.rules&#39;,&#39;w&#39;) as f: f.write(&#34;&#34;&#34;SUBSYSTEM==&#34;bcm2835-gpiomem&#34;, KERNEL==&#34;gpiomem&#34;, GROUP=&#34;gpio&#34;, MODE=&#34;0660&#34; SUBSYSTEM==&#34;gpio&#34;, KERNEL==&#34;gpiochip*&#34;, ACTION==&#34;add&#34;, PROGRAM=&#34;/bin/sh -c &#39;chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport&#39;&#34; SUBSYSTEM==&#34;gpio&#34;, KERNEL==&#34;gpio*&#34;, ACTION==&#34;add&#34;, PROGRAM=&#34;/bin/sh -c &#39;chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value&#39;&#34; &#34;&#34;&#34;) if __name__ == &#39;__main__&#39;: ensure_gpiogroup() 反正很简单，手动搞进去就行了</description>
    </item>
    <item>
      <title>MicroPython入坑记(四)利用MQTT实现0编程远程控制（上）（用安卓手机）</title>
      <link>https://yafengabc.github.io/cnblogs/p8684755/index.html</link>
      <pubDate>Sat, 31 Mar 2018 23:33:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p8684755/index.html</guid>
      <description>其实你被标题党骗了，0编程那是不可能的(￣▽￣)&#34;&#xA;不过也算近似零编程了哈哈&#xA;MQTT我就不详细介绍了，毕竟看到这个标题进来的一般也就有些基础知识了。简单说说：&#xA;MQTT是IBM发布的一个物联网协议，怎么说呢，微信大家都知道，微信是大家互相联系用的，MQTT其实就类似一个物联网的微信，各个设备间可以通过MQTT来沟通信息。&#xA;其实设备间联系的协议有很多，比如TCP/UDP，HTTP等。MQTT作为很晚才出现的后辈，当然是解决以前协议的痛点的。&#xA;1.TCP/UDP（SOCKET通讯）这个是物联网甚至是互联网的基础。在应用层面，这算底层了，优点当然是灵活，其实灵活，往往就意味着难用（比如C++就很灵活）你如果想开发一个基于TCP通讯，你需要考虑通讯的方方面面，比如断线重连，比如心跳包，比如加密传输，这些都得自己来实现，可能会占用你大量的调优时间。&#xA;2.HTTP，HTTP协议大家都知道是网页传输协议，其实网页传输是HTTP的一种应用而已，HTTP属于对TCP的高层封装，是一种短链接协议，可用于设备间连接。基于HTTP协议的连接方式又有个名字叫RESTful，这个编程就简单了，因为短链接么，就不用考虑啥断线重连之类的了，并且python有urllib，requsets等库，通讯就是一句代码的事，简单至极，但也有缺点:包头太长，每次通讯都要重新连接一次。如果几秒或者几分钟以上通讯一次还差不多，如果太过频繁，不但浪费资源，也太占带宽。&#xA;MQTT完美解决了上边这些协议的痛点，并且由于是个标准，现在各种语言，乃至安卓、IOS上都有现成的客户端，特别适合我这种懒得开发JAVA APP的懒人。这里介绍一个好用的安卓APP：ioT MQTT Panel，装了这个APP，设置一下，就能通过MQTT控制设备了，下边是我随便做了个界面：&#xA;怎么样？是不是有点意思，值得说的是: 这是完全不需要编写代码的装上这个APP，设置一下就可以了，嗯这是跟我的树莓派连接的：&#xA;树莓派上我接了一个继电器，一个超声波测距仪，手机客户端则是实时显示树莓派CPU温度、超声波测距的距离，以及控制继电器吸合、断开。&#xA;下一篇，我会实战介绍下用这个APP控制ESP8266（nodemcu）来实现无线控制LED灯的亮灭。</description>
    </item>
    <item>
      <title>树莓派提高实时性的新思路[原创]</title>
      <link>https://yafengabc.github.io/cnblogs/p6292265/index.html</link>
      <pubDate>Tue, 17 Jan 2017 11:15:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p6292265/index.html</guid>
      <description>树莓派提高实时性的新思路&#xA;by yafeng 转载请注明&#xA;树莓派是一台应用linux系统的ARM电脑，由于linux是非实时性系统，所以各个任务之间会不停的切换，时间片20ms-100ms不等，所以很难获得实时的输出，这里先贴个小例子，内容很简单，把一个IO点置为高电平，等待1000us（1ms）然后置为低电平，并记录需要的时间，记录10000次（2ms*10000=20秒）。&#xA;#include &#34;stdio.h&#34; #include &#34;wiringPi.h&#34; #define rec_num 10000 int main(){ int time_arry[rec_num]; int current_time=0; wiringPiSetup(); pinMode(0,OUTPUT); for(int i=0;i&lt;rec_num;i++){ current_time=micros(); digitalWrite(0,HIGH); delayMicroseconds(1000); digitalWrite(0,LOW); delayMicroseconds(1000); time_arry[i]=micros()-current_time; } for(int j=0;j&lt;rec_num;j++){ printf(&#34;%d &#34;,time_arry[j]); } } 代码很简单，最后打印10000次时间结果，单位为微秒,部分结果如下：&#xA;$ gcc set_io_pluse_nort.c -lwiringPi $ sudo ./a.out 2189 2127 2127 2128 2127 2126 2125 2125 2128 2126 2125 2126 2126 2128 2126 2126 2125 2133 2134 2133 2132 2132 2134 2132 2132 2133 2132 2134 2133 2132 2132 2133 2132 2133 2132 2132 2135 2132 2132 2132 2132 2133 2131 2132 2133 2137 2133 2132 2132 2131 2133 2132 2132 2132 2132 2133 2132 2132 2132 2137 2126 2126 2125 2126 2132 2133 2132 2132 2132 2133 2134 2133 2132 2132 2133 2132 2132 2132 2133 2132 2132 2132 2132 2133 2132 2132 2131 2132 2135 2126 2126 2125 2130 2132 2131 2131 2131 2133 2131 2131 2131 2132 2138 2131 2132 2131 2132 2132 2131 2131 2131 2132 2131 2133 2132 2131 2128 2126 2125 2125 2129 2128 2127 2126 2131 2129 2126 2125 2125 2126 2129 2126 2126 2126 2125 2128 2126 2126 2126 2128 2127 2126 2126 2125 2134 2155 2140 2139 2138 2138 2138 2138 2137 2137 2139 2137 2136 2136 21 由于数据太多，不容易看出结果，所以我用Python写了个统计结果的程序，分析均值以及偏差。代码很简单，我就不贴出来了，只贴结果：&#xA;平均时间: 2132 &lt;10us: 9621 &gt;10us: 282 &gt;20us: 49 &gt;30us: 19 &gt;40us: 7 &gt;50us: 4 &gt;60us: 2 &gt;70us: 2 &gt;80us: 2 &gt;90us: 2 &gt;100us: 2 &gt;110us: 2 &gt;120us: [2488, 2346] 可以看出，现在结果还是不错的，只有2个结果误差超过均值60us，但是平均时间是2.132ms，跟预计时间有132us的误差。&#xA;下边是该程序在CPU满载的情况下的测试结果（我写了个多进程程序，把所有CPU撑到100%）：&#xA;平均时间: 2128 &lt;10us: 73 &gt;10us: 9902 &gt;20us: 175 &gt;30us: 153 &gt;40us: 71 &gt;50us: 24 &gt;60us: 15 &gt;70us: 15 &gt;80us: 15 &gt;90us: 15 &gt;100us: 15 &gt;110us: 15 &gt;120us: [12448, 5813, 9480, 13708, 7936, 11588, 14554, 10433, 13771, 14565, 12347, 5887, 9486, 13725, 2955] 这时，出现了非常差的情况，15次误差大于120us，并且有多次10-15ms误差的！</description>
    </item>
    <item>
      <title>简单的实现树莓派的WEB控制</title>
      <link>https://yafengabc.github.io/cnblogs/p5197844/index.html</link>
      <pubDate>Thu, 18 Feb 2016 12:55:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5197844/index.html</guid>
      <description>最终效果如图：&#xA;用到的知识：Python Bottle HTML Javascript JQuery Bootstrap AJAX 当然还有 linux&#xA;我去，这么多……我还是一点一点说起吧……&#xA;先贴最终的源代码：&#xA;#!/usr/bin/env python3 from bottle import get,post,run,request,template @get(&#34;/&#34;) def index(): return template(&#34;index&#34;) @post(&#34;/cmd&#34;) def cmd(): print(&#34;按下了按钮: &#34;+request.body.read().decode()) return &#34;OK&#34; run(host=&#34;0.0.0.0&#34;) 没错，就10句，我一句一句解释：&#xA;1.#!/usr/bin/env python3 ，告诉shell这个文件是Python源代码，让bash调用python3来解释这段代码&#xA;2.from bottle import get,post,run,request,template ，从bottle框架导入了我用到的方法、对象&#xA;下边几句是定义了2个路由，一个是“/”一个是“/cmd”,前者是get类型（用@get装饰），后者是POST类型（用的@post装饰）&#xA;第一个路由很简单，就是读取index模版（模版就是个html啦）并发送到客户端（浏览器），因为路径是“/”也就是比如树莓派的IP地址是：192.168.0.10&#xA;那用http://192.168.0.10:8080就访问到了我们的&#34;/”路由（bottle默认端口是8080）&#xA;同理，第二个路由的路径是“/cmd”也就是访问http://192.168.0.10:8080/cmd就访问到了第二个路由&#xA;最后一句：run(host=“0.0.0.0”)就是调用bottle的run方法，建立一个http服务器，让我们能通过浏览器访问我们的界面。&#xA;下边我详细的解释一下这些代码的作用：&#xA;第一个路由的作用就是扔给浏览器一个HTML（index.tpl）文档，显示这个界面：&#xA;这个文件的源代码如下：&#xA;&lt;!DOCTYPE html&gt; &lt;html lang=&#34;en&#34;&gt; &lt;head&gt; &lt;meta charset=&#34;UTF-8&#34;&gt; &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt; &lt;title&gt;遥控树莓派&lt;/title&gt; &lt;link href=&#34;//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css&#34; rel=&#34;stylesheet&#34; media=&#34;screen&#34;&gt; &lt;script src=&#34;http://code.jquery.com/jquery.js&#34;&gt;&lt;/script&gt; &lt;style type=&#34;text/css&#34;&gt; #up { margin-left: 55px; margin-bottom: 3px; } #down { margin-top: 3px; margin-left: 55px; } &lt;/style&gt; &lt;script&gt; $(function(){ $(&#34;button&#34;).click(function(){ $.post(&#34;/cmd&#34;,this.id,function(data,status){}); }); }); &lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;div id=&#34;container&#34; class=&#34;container&#34;&gt; &lt;div&gt; &lt;button id=&#34;up&#34; class=&#34;btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-up&#34;&gt;&lt;/button&gt; &lt;/div&gt; &lt;div&gt; &lt;button id=&#39;left&#39; class=&#34;btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-left&#34;&gt;&lt;/button&gt; &lt;button id=&#39;stop&#39; class=&#34;btn btn-lg btn-primary glyphicon glyphicon-stop&#34;&gt;&lt;/button&gt; &lt;button id=&#39;right&#39; class=&#34;btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-right&#34;&gt;&lt;/button&gt; &lt;/div&gt; &lt;div&gt; &lt;button id=&#39;down&#39; class=&#34;btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-down&#34;&gt;&lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;script src=&#34;//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js&#34;&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt; 这个内容有点多，不过很简单，就是引用了jquery bootstrap这两个前端框架，加了5个按钮(之间的代码)。当然我用了bootstrap内置的上下左右停止这几个图标，这5个按钮的id分辨定义成up，down，left，right，stop，然后写了如下的关键代码：</description>
    </item>
    <item>
      <title>树莓派高级GPIO库，wiringpi2 for python使用笔记（五）i2c读取测试</title>
      <link>https://yafengabc.github.io/cnblogs/p5107768/index.html</link>
      <pubDate>Wed, 06 Jan 2016 22:52:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5107768/index.html</guid>
      <description>wiringpi2显然也把i2c驱动带给了Python，手头上正巧有一个DS3231的模块，上边带了一个DS3231 RTC（实时时钟），与一片24C32，两个芯片均为iic总线设备，与树莓派接线如下：&#xA;也就是VCC GND SDA SCL四个脚分别接到树莓派的1（3.3v）、9（0v）、3（SDA.1）、5（SCL.1）上，因为树莓派的I2C接口默认是关闭的，需要先编辑一下/boot/config.txt,去掉 device_tree_param=i2c_arm=on上的注释（ArchlinuxARM RasperryPi2），然后重启（注：Raspbian可以用raspi-config打开）&#xA;然后重启，重启完成后，运行&#xA;modprobe i2c-dev 若想这个模块自动装载，请把它写到 /etc/modules-load.d/raspberrypi.conf&#xA;安装i2c-tools，Archlinux下为：&#xA;pacman –S i2c-tools 安装后，运行i2cdetect –y 1结果如下：&#xA;嗯，发现了57，68两个设备，哪个是DS3231，哪个又是24C32呢，我们把里边的数据dump出来看看：&#xA;可以看到0x57设备里边是空的，应该就是24C32了，0x68里边读出来20个字节，就是DS3231了。&#xA;我先解释下这几个命令：&#xA;i2cdetect顾名思义就是搜索i2c总线的设备，树莓派有2条i2c总线，咱们接的SDA.1,SCL.1，当然就是搜索1这条总线了（另外一条是SDA.0 SCL.0）&#xA;-y参数没啥意义，就是自己帮你按下y(yes).&#xA;i2cdump也很容易理解，就是dump出指定总线，指定设备的数据这里是1总线0x57 0x68两个设备。-y参数跟上个命令是一样的。&#xA;这样，我们的i2c设备就都通讯上了，下边就是用wiringpi2库读写之。&#xA;wringpi中操作i2c设备的函数主要有一下几个：</description>
    </item>
    <item>
      <title>树莓派高级GPIO库，wiringpi2 for python使用笔记（四）实战DHT11解码</title>
      <link>https://yafengabc.github.io/cnblogs/p5100741/index.html</link>
      <pubDate>Tue, 05 Jan 2016 00:12:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5100741/index.html</guid>
      <description>DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH， 温度+-2℃，量程湿度20-90%RH， 温度0~50℃。&#xA;我买的封装好的模块，上边自带了上拉电阻，直接查到树莓派上即可灰、紫、蓝分别代表数据、3.3V、0V,接到树莓派的3，1，10脚，分别对应PIN8，3.3V，0V。&#xA;DHT11与单片机通讯协议为单线协议（1-wire），其实单线协议蛮厉害的，一个GPIO就能实现数据的读取，但是这个协议没有同步脉冲，所以对时序要求比较高，比如DHT11对高低电平定义如下：&#xA;低电平50us，然后一个26-28us的高电平，代表0&#xA;低电平50us，然后一个70us的高电平，代表1&#xA;也就是说，需要能分辨出40us以下的时间才能准确的测出，下边看看具体的时序：&#xA;总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。&#xA;数字0表示如下图：&#xA;数字1表示如下图：&#xA;可以看出，每一位包括一开始的响应信号，都是由一个低电平跟一个高电平组成，其中响应信号为80us+80us=160us&#xA;数字0为50+26=76us&#xA;数字1为50+70=120us&#xA;为读到DHT11的状态，我编写了以下的程序：&#xA;import wiringpi2 as gpio owpin=8 #第8脚为1-wire脚 tl=[] #存放每个数据位的时间 gpio.wiringPiSetup() #初始化wiringpi库 gpio.pinMode(owpin,1) #设置针脚为输出状态 gpio.digitalWrite(owpin,1) #输出高电平 gpio.delay(1) ###发开始指令，要求DHT11传输数据 gpio.digitalWrite(owpin,0) #拉低25ms开始指令 gpio.delay(25) gpio.digitalWrite(owpin,1) #输出高电平，开始指令结束 gpio.pinMode(owpin,0) #设针脚为输入状态 ###开始指令发送完毕，把管脚设置为高电平，并等待DHT11拉低管脚。传输数据 while(gpio.digitalRead(owpin)==1): pass #如果管脚一直是1，则一直等待。 ###若被拉低，说明传输开始，应答信号+40位数据+结束标志共42位 ###下边共循环45次，故意多循环几次看结果。 for i in range(45): #测试每个数据周期的时间（包括40bit数据加一个发送开始标志 tc=gpio.micros() #记下当前us数（从初始化开始算起，必要时重新初始化） &#39;&#39;&#39; 一个数据周期，包括一个低电平，一个高电平，从DHT11第一次拉低信号线开始 到DHT11发送最后一个50us的低电平结束（然后被拉高，一直维持高电平，所以 最后的完成标志是一直为高，超过500ms） &#39;&#39;&#39; while(gpio.digitalRead(owpin)==0):pass #一位数据由一个低电平 while(gpio.digitalRead(owpin)==1): #加一个高电平组成 if gpio.micros()-tc&gt;500: #如果超过500us就结束了本次循环,传输结束后 break #会被上拉电阻拉成高电平，防止进入死循环 tl.append(gpio.micros()-tc) #记录每个周期时间的us数，存到tl这个列表 print(tl) #打印结果 程序里有详细的解释，我就不再赘述，这里贴出我这里的执行结果：</description>
    </item>
    <item>
      <title>树莓派高级GPIO库，wiringpi2 for python使用笔记（三）GPIO操作</title>
      <link>https://yafengabc.github.io/cnblogs/p5096720/index.html</link>
      <pubDate>Sun, 03 Jan 2016 16:57:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5096720/index.html</guid>
      <description>GPIO库的核心功能，当然就是操作GPIO了，GPIO就是“通用输入/输出”接口，比如点亮一个LED、继电器等，或者通过iic spi 1-wire等协议，读取、写入数据，这都是GPIO的用处，可以说没有GPIO，树莓派只能当小电脑用，有了GPIO，就升级成一个控制器了。先来说说怎么操作一个数字量（高低电平）。&#xA;先看代码：&#xA;import wiringpi2 as gpio from wiringpi2 import GPIO gpio.wiringPiSetup() #初始化 gpio.pinMode(25,GPIO.OUTPUT) # 把pin25设置为输出模式 gpio.digitalWrite(25,GPIO.HIGH) #pin25输出为高电平 print(gpio.digitalRead(25)) #打印pin25的状态 值的注意的是，GPIO在输出模式时，也可以读取GPIO状态。&#xA;wiringpi对树莓派2的GPIO定义如下：&#xA;[root@RasPi ~/testcode]# gpio readall +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+ 我们看到，wringpi对针脚有三种定义方式，BCM代表GPIO模式，wPi代表pin模式，Physical代表物理针脚模式。</description>
    </item>
    <item>
      <title>树莓派高级GPIO库，wiringpi2 for python使用笔记（二）高精度计时、延时函数</title>
      <link>https://yafengabc.github.io/cnblogs/p5096445/index.html</link>
      <pubDate>Sun, 03 Jan 2016 15:11:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5096445/index.html</guid>
      <description>学过单片机的同学应该清楚，我们在编写传感器驱动时，需要用到高精度的定时器、延时等功能，wiringpi提供了一组函数来实现这些功能，这些函数分别是：&#xA;micros() #返回当前的微秒数，这个数在调用wiringPiSetup()后被清零并重新计时&#xA;millis() #返回当前的毫秒数，同上，这个数在调用wiringPiSetup()后被清零并重新计时&#xA;delayMicroseconds() #高精度微秒延时&#xA;delay() #毫秒延时。&#xA;python相对于C，一个很大的问题就是执行速度慢，所以指令执行速度不可忽视，我们可以用micos函数来检测指令执行时间，用来避免实际使用中遇到的坑，请看以下代码：&#xA;import wiringpi2 as gpio for i in range(5): t1=gpio.micros() t2=gpio.micros() print(t2-t1) 连续调用两次micros，然后打印出差值，运行结果如下：&#xA;[root@RasPi ~/testcode]# python testus.py 12 4 4 5 5 我们看到第一次的结果明显比以后的结果要大，多了接近10微秒，一般的程序来说，这无关紧要，要是要求更高，可以把代码改成这个样子:&#xA;import wiringpi2 as gpio for i in range(5): t1=gpio.micros() t1=gpio.micros() t2=gpio.micros() print(t2-t1) 运行结果如下：&#xA;[root@RasPi ~/testcode]# python testus.py 3 3 3 3 2 基本一致了再看以下代码：&#xA;import wiringpi2 as gpio for i in range(5): t1=gpio.micros() t1=gpio.micros() gpio.delayMicroseconds(10) t2=gpio.micros() print(t2-t1) 延时10us，结果如下：&#xA;[root@RasPi ~/testcode]# python testus.py 21 21 18 18 18 减去两次调用micros()之间的5us左右的延时，实际延时10us会有5us左右的延时。</description>
    </item>
    <item>
      <title>树莓派高级GPIO库，wiringpi2 for python使用笔记（一）安装</title>
      <link>https://yafengabc.github.io/cnblogs/p5096300/index.html</link>
      <pubDate>Sun, 03 Jan 2016 14:06:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5096300/index.html</guid>
      <description>网上的教程，一般Python用RPi.GPIO来控制树莓派的GPIO，而C/C++一般用wringpi库来操作GPIO，RPi.GPIO过于简单，很多高级功能不支持，比如i2c/SPI库等，也缺乏高精度定时等高级特性。相比之下，wiringpi则功能丰富的多，其实wringpi已经有了python绑定，可以非常简单的在python中使用这个库。鉴于网上基本没有这个库的中文说明，我一边学习，一边以做笔记的形式，写几篇关于这个库的基本使用的文章。&#xA;安装：首先安装python-pip：&#xA;我用的Archlinux，python3，安装命令为：&#xA;pacman -S python-pip 如果用python2，安装命令为：&#xA;pacman -S python2-pip Raspbian下则为：&#xA;apt-get install python3-pip apt-get install python-pip 安装完后，就可以用pip install来安装python库了。为避免繁琐，我下边的命令都以pip命令安装，Archlinux下默认为python3的pip3，如果使用个python2则用pip2来代替pip，debian下pip默认为pip2，若使用python3，则使用pip3来代替。&#xA;pip install wiringpi2 pip库里除了wiringpi2外，还有老版本的wiringpi库，大家按需安装。&#xA;安装完后，运行pip list，可以看到列表中包含了新装的wringpi2库了：&#xA;在终端中敲入python，进入python控制台，导入一下，如果不报错，说明安装成功：</description>
    </item>
    <item>
      <title>树莓派读取DHT11传感器的源代码</title>
      <link>https://yafengabc.github.io/cnblogs/p5096184/index.html</link>
      <pubDate>Sun, 03 Jan 2016 13:27:00 +0800</pubDate>
      <guid>https://yafengabc.github.io/cnblogs/p5096184/index.html</guid>
      <description>import wiringpi2 as gpio owpin=8 #第8脚为1-wire脚 def getval(owpin): tl=[] #存放每个数据位的时间 tb=[] #存放数据位 gpio.wiringPiSetup() #初始化wiringpi库 gpio.pinMode(owpin,1) #设置针脚为输出状态 gpio.digitalWrite(owpin,1) #输出高电平 gpio.delay(1) gpio.digitalWrite(owpin,0) #拉低20ms开始指令 gpio.delay(25) gpio.digitalWrite(owpin,1) #抬高20-40us gpio.delayMicroseconds(20) gpio.pinMode(owpin,0) #设针脚为输入状态 while(gpio.digitalRead(owpin)==1): pass #等待DHT11拉低管脚 for i in range(45): #测试每个数据周期的时间（包括40bit数据加一个发送开始标志 tc=gpio.micros() #记下当前us数（从初始化开始算起，必要时重新初始化） &#39;&#39;&#39; 一个数据周期，包括一个低电平，一个高电平，从DHT11第一次拉低信号线开始 到DHT11发送最后一个50us的低电平结束（然后被拉高，一直维持高电平，所以 最后的完成标志是一直为高，超过500ms） &#39;&#39;&#39; while(gpio.digitalRead(owpin)==0):pass while(gpio.digitalRead(owpin)==1): if gpio.micros()-tc&gt;500: #如果超过500ms就结束了 break if gpio.micros()-tc&gt;500: #跳出整个循环 break tl.append(gpio.micros()-tc) #记录每个周期时间的us数，存到tl这个列表 # print(tl) #反注释后可打印时间列表 tl=tl[1:] #去掉第一项，剩下40个数据位 for i in tl: if i&gt;100: #若数据位为1，时间为50us低电平+70us高电平=120us tb.append(1) else: tb.append(0) #若数据位为0，时间为50us低电平+25us高电平=75us #这里取大于100us就为1 # print(tb) #反注释可查看每一位状态 return tb def GetResult(owpin): for i in range(10): SH=0;SL=0;TH=0;TL=0;C=0 result=getval(owpin) # print(len(result)) if len(result)==40: for i in range(8): #计算每一位的状态，每个字8位，以此为湿度整数，湿度小数，温度整数，温度小数，校验和 SH*=2;SH+=result[i] SL*=2;SL+=result[i+8] TH*=2;TH+=result[i+16] TL*=2;TL+=result[i+24] C*=2;C+=result[i+32] if ((SH+SL+TH+TL)%256)==C and C!=0: break else: print(&#34;Read Sucess,But checksum error! retrying&#34;) else: print(&#34;Read failer! Retrying&#34;) gpio.delay(200) return SH,SL,TH,TL SH,SL,TH,TL=GetResult(owpin) print(&#34;湿度:&#34;,SH,SL,&#34;温度:&#34;,TH,TL)</description>
    </item>
  </channel>
</rss>