Category Archives: Raspberry Pi

【RPi树莓派使用指南】树莓派官方7寸屏入门指南

1. 引子

在树莓派官方触摸屏发布之前,市场上可用的屏幕有以下三种:

  • 直接和GPIO插口对接的屏幕,使用SPI与CPU进行通信。需要特殊的驱动程序将framebuffer的内容发送到LCD控制器上,一般带有触屏功能,大小以3.5寸为主流。受限于SPI通信速度,刷新速率不高;
  • 专用USB接口的屏幕,如RoboPeak Mini USB Display。这类屏幕通过USB连接,需要本地运行驱动程序;
  • 通用LCD屏幕,通过HDMI和树莓派连接。因其通用性不需要特殊的驱动程序,但是很多都不支持触屏功能,而且都需要额外的转接板,体积较大;

rpilcd-front-with-base
▲ 图.  树莓派官方7寸屏实拍

我自己的需求是将树莓派作为信息显示中心,在屏幕上显示我的HP服务器的运行信息,另外提供一些快捷的传感器监控和控制操作接口。最初一直在官方屏幕和HDMI屏幕之间犹豫,最后还是选择了官方触摸屏。归结起来主要有几个原因:

  • 官方屏的LCD模组最有保证,淘宝上的HDMI LCD一般成像质量不高;
  • 官方屏的触摸功能在所有方案中是支持的最好的,有十点电容触摸(目前Raspbian还只支持单点,以后会升级),且不需要额外驱动。而HDMI接口的LCD如果有触摸功能,都需要额外接一根USB用于提供触摸控制;
  • 官方触屏和树莓派3可以直接通过铜柱物理连接,无需额外的驱动电路板。连线也非常少,只需要一根DSI软排线和供电接口即可。

总体上来说,虽然官方屏的价格高了一些,但是却是所有方案中最可靠、简洁的,所以最后也没有多犹豫就从网上下单了。rpilcd-front-without-base
▲ 图. 树莓派官方LCD屏实拍 – 正面

Read more »

【RPi树莓派使用指南】树莓派3代介绍及历代树莓派比较

树莓派自从12年02月最初发布之后,目前已突破800万的总销量。作为树莓派的早期支持者,云飞实验室也一直在关注着它的发展。如今在经历了4年的设计迭代之后,树莓派于16年02月推出了最新一代的树莓派3。树莓派3的本次发布与之前的2代只相差了整整一年时间,但是得益于目前芯片行业的快速发展,树莓派3的性能将会有很大的提升。这主要表现在以下几点:

  • 更高的处理速度。树莓派3首次采用了64位处理器:基于Cortex-A53的博通BCM2837。BCM2837为四处理器核心,主频也由树莓派2的900MHz提高到了1.2GHz。根据官方提供的数据,这将使树莓派3的处理速度较2代提高50%。如果和1代的700MHz单核相比,提升大约在3 – 4倍。更高的CPU速度使得树莓派可以胜任更大负荷的运算工作:如科学计算,机器人路径规划等。
  • 更高的互联性。树莓派3使用了集成蓝牙4.0和WiFi的设计。集成通信的设计的意义是多方面的。首先,使用者无需再购买额外的USB设备,从一定程度上来说,鼓励了用户在自己的设计中使用这些通信功能;其次,集成的通信模块可以进行更好的功耗管理,同时IO吞吐的性能也会得到提高;最后,可以更进一步的优化内核,只针对板载的芯片专门进行优化。避免可能出现的兼容性或者未优化的驱动导致通信性能下降问题。

rasp-pi-3-board
图1. 树莓派3外观

rasp-3_Model_B
图2. 树莓派3外观 (设计渲染图) 

从这两点来看,树莓派3代将很有可能再次扩展自己的使用领域,同时在物联网和机器人中得到应用。同类产品如果还是单从硬件角度进行提升,已经无法再与之竞争。因为性能的显著提升且维持原价,在树莓派2代出来时没有入手的玩家,这一次也难免蠢蠢欲动。同时因其性价比的纯粹提升,树莓派1代与2代的销量会大幅下降。因为2代只发布了1年,所以很可能成为绝版,如果出于收藏的目的可以尽早买之。总体上来说,这次树莓派3已经具备了IoT所需要的基本条件(性价比,互联性,体积与功耗)。今后的方向可能是增加更多的IO功能,如PWM和ADC等,是被大多数玩家需要却还没有被支持的。

以下是我对历代树莓派版本的整理与对比:

表1. 发布时间及主要特点

型号 发布时间 主要特点
PI 1 Model B 2012年02月 第一代树莓派。Model A不含以太网。
PI Compute Module 2014年04月 模块化设计,使用SODIMM大小的金手指接口。
PI 1 Model B+ 2014年07月 增加了2个USB接口,增加了9个GPIO:26脚->40脚。
使用MicroSD卡。
PI 2 Model B 2015年02月 升级处理器:四核900MHz Cortex-A9。升级为1GB RAM。
PI Zero 2015年11月 无网络通信功能,廉价,小尺寸。
PI 3 2016年02月 升级处理器:64bit四核1.2GHz Cortex-A53。
内置蓝牙4.0和WiFi。

 

表2. 树莓派历代版本硬件比较

型号 处理器 主频 内存 GPIO 互联性 功耗级别
PI 1 Model B BCM2835
(ARM11)
700MHz 512MB 26 2 USB
HDMI
10/100M Ethernet
700mA (3.5W)
PI Compute Module BCM2835
(ARM11)
700MHz 512MB 0 无。需要配合扩展板使用。 200mA (1W)
PI 1 Model B+ BCM2835
(ARM11)
700MHz 512MB 40 4 USB
HDMI
10/100M Ethernet
600mA (3W)
PI 2 Model B BCM2836
(Cortex-A9 四核)
900 MHz 1GB 40 4 USB
HDMI
10/100M Ethernet
800mA (4W)
PI Zero BCM2835
(ARM11)
1 GHz 512MB 40 (无排针) 1 Micro-USB
Mini HDMI
无板载网卡
160mA (0.8W)
PI 3 BCM2837
(Cortex-A53 64位四核)
1.2 GHz 1GB 40 4 USB
HDMI
Bluetooth 4.1
WiFi 802.11n
10/100M Ethernet
800mA (4W)

 

Read more »

【RPi树莓派使用指南】在树莓派上安装MySQL数据库

在嵌入式Linux平台下如果需要使用数据库功能,一般会选择SQLite或MySQL。SQLite是轻量级、基于文件的关系数据库,系统资源占用较少;但是SQLite的缺点是不支持远程部署和访问。对于大多数应用,SQLite是很易用的数据库,我之前就使用过它开发过一套生产管理系统;但是当需要远程访问数据并提供数据库安全时,MySQL则是更好的选择。考虑到树莓派的性能局限,其本身并不适合集成数据展示功能(无论是基于GUI的还是基于web的)。于是可以将其只作为数据记录平台,而将数据的整理、展示在PC端完成。这种模式下,树莓派可以作为数据采集主机,将有线 / 无线节点的数据进行集中采集记录,再通过PC进行分析和展示。在这样的初衷驱使下,我研究并整理了如何在树莓派上安装和使用MySQL。

1. 安装MySQL
使用管理员权限运行apt-get获取最新的MySQL及Python编程接口(之后用于数据库编程):

<br />
$ sudo apt-get install mysql-server python-mysqldb<br />

安装过程中需要输入root管理员的密码,该密码之后用于访问数据库系统。

2. 测试MySQL
通过以下命令运行MySQL的命令提示系统,并输入在安装过程中设置的密码:

<br />
mysql -u root -p</p>
<p>Enter password:<br />
Welcome to the MySQL monitor.  Commands end with ; or \g.<br />
Your MySQL connection id is 47<br />
Server version: 5.5.41-0+wheezy1 (Debian)</p>
<p>Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its<br />
affiliates. Other names may be trademarks of their respective<br />
owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.<br />

查看当前已建立的数据库:

<br />
mysql&gt; SHOW DATABASES;<br />
+--------------------+<br />
| Database           |<br />
+--------------------+<br />
| information_schema |<br />
| mysql              |<br />
| performance_schema |<br />
+--------------------+<br />
3 rows in set (0.00 sec)<br />

3. 创建一个新的数据库和表单
以上数据库都是系统建立的数据库,要想开始插入数据,首先需要建立新的数据库和表单。这里假设要实现一个CPU温度记录的功能,存放在名为”sensordb”的数据库中。使用以下命令建立数据库:

<br />
mysql&gt; CREATE DATABASE sensordb;<br />
Query OK, 1 row affected (0.00 sec)<br />

查看数据库是否建立成功:

<br />
mysql&gt; SHOW databases;<br />
+--------------------+<br />
| Database           |<br />
+--------------------+<br />
| information_schema |<br />
| mysql              |<br />
| performance_schema |<br />
| sensordb           |<br />
+--------------------+<br />
4 rows in set (0.01 sec)<br />

在sensordb数据库下创建一个表单(table),该表单包含两个域(fields):日期和当天平均CPU温度。时间域使用的数据格式为DATE;而温度使用DECIMAL(4,1),即最大三位整数加一位小数。

<br />
mysql&gt; USE sensordb;<br />
Database changed</p>
<p>mysql&gt; CREATE TABLE cputemptable(recordtime DATE, temp DECIMAL(4,1));<br />
Query OK, 0 rows affected (0.03 sec)<br />

查看表单是否建立成功:

<br />
mysql&gt; SHOW TABLES;<br />
+--------------------+<br />
| Tables_in_sensordb |<br />
+--------------------+<br />
| cputemptable       |<br />
+--------------------+<br />
1 row in set (0.00 sec)<br />

查看表单的域名称与类型:

<br />
mysql&gt; DESCRIBE cputemptable;<br />
+------------+--------------+------+-----+---------+-------+<br />
| Field      | Type         | Null | Key | Default | Extra |<br />
+------------+--------------+------+-----+---------+-------+<br />
| recordtime | date         | YES  |     | NULL    |       |<br />
| temp       | decimal(4,1) | YES  |     | NULL    |       |<br />
+------------+--------------+------+-----+---------+-------+<br />
2 rows in set (0.01 sec)<br />

4. 向数据库中插入测试数据
在上一步中已经成功建立了用于CPU温度采集的数据库和表单,但是因为没有任何数据,所以该表单中没有任何内容。现在通过手动插入的方式向该表单中插入若干数据,测试是否可以正常运行。

<br />
mysql&gt; INSERT INTO cputemptable<br />
    -&gt; values('2015-03-25', 36.5);</p>
<p>mysql&gt; INSERT INTO cputemptable<br />
    -&gt; values('2015-03-26', 39.5);<br />

以上每条如果操作成功,都回返回提示:

<br />
Query OK, 1 row affected (0.00 sec)<br />

5. 查看数据库操作的结果
为了验证以上数据是否成功插入,可以通过select语句检索数据库:

<br />
mysql&gt; SELECT * FROM cputemptable;<br />
+------------+------+<br />
| recordtime | temp |<br />
+------------+------+<br />
| 2015-03-25 | 36.5 |<br />
| 2015-03-26 | 39.5 |<br />
+------------+------+<br />
2 rows in set (0.00 sec)<br />

可以看到之前的两条数据已经成功插入到cputemptable数据表中。

最后使用quit退出交互系统:

<br />
mysql&gt; quit<br />
Bye<br />

整个过程下来,发现MySQL在树莓派上的部署与操作与在桌面Linux平台上几乎没有差别。这里唯一需要注意的是,因为树莓派的硬件资源有限,所以在配置MySQL的优化选项时,需要降低其对系统资源的使用。具体配置细节在我亲自研究试验之后再进行补充。

下篇预告:在树莓派上使用Python进行MySQL数据库编程

【RPi树莓派使用指南】树莓派常见问题整理与解答

这篇博文整理了在使用树莓派的过程中常见的问题和解答,以及我自己在使用时遇到的问题与总结,供树莓派爱好者快速查阅。本文根据需要不断更新,也欢迎读者留言提问与补充。

一、基本操作与管理

Q: 树莓派的默认登录密码是什么?
A: 用户名: pi,密码: raspberry

Q: 树莓派如何解锁root?
A: 解锁方法如下:

<br />
#设置root密码<br />
$sudo passwd root</p>
<p>#解锁root用户<br />
$sudo passwd --unlock root</p>
<p>#切换当前用户到root<br />
$su root<br />

Q: 如何启动树莓派的图形界面?
A: 命令行中输入startx。如果要设置开机启动默认为图形模式,可使用 raspi-config 命令进行配置。

Q: 如何格式化输出当前系统时间?
A: 使用 date -d today +“格式化参数” 。如下例所示,引号内为格式化字符串,可自行修改为需要的格式:

<br />
date -d today +&quot;%Y-%m-%d %H:%M:%S&quot;<br />

Q: 如何读取树莓派CPU和GPU的温度?
A: 查看CPU温度(读数除以1000):

<br />
$cat /sys/class/thermal/thermal_zone0/temp<br />

查看GPU温度:

<br />
$/opt/vc/bin/vcgencmd measure_temp<br />

Q: 如何修改树莓派HDMI显示的分辨率?

A: 修改SD卡中的 config.txt  配置文件,配置方法见此处

Q: 树莓派如何设置静态IP地址?
A: 修改 /etc/network/interfaces  配置文件,配置方法为:

<br />
iface eth0 inet static<br />
address 192.168.1.100  # Static IP Address<br />
netmask 255.255.255.0  # Netmask<br />
gateway 192.168.1.1    # Gateway<br />

Q: 如何查看树莓派当前进程与CPU使用情况?
A: 查看所有进程:ps -a ,查看CPU当前使用情况:top

Q: 如何查看树莓派当前内存及硬盘使用情况?
A: 使用 free 命令查看内存使用情况,也可以使用 free -m 以MB为单位显示。对应的可以使用 df 或者 df -m 查看硬盘使用情况。

Q: 如何查看树莓派已载入的模块和已加载的USB设备?
A: 分别使用 lsmod lsusb 命令。如果要查看所有加载的设备,直接输入 ls /dev 查看设备虚拟文件夹。

Q: 树莓派支持哪些USB摄像头?
A: 见 RPi USB Webcameras。支持的较好的还是罗技和微软的低分辨率型号。有些摄像头功耗较大,需要外部供电。

Q: 树莓派支持哪些USB无线网卡?
A: 见 RPi USB Wi-Fi Adaptors。推荐EDUP的迷你WiFi网卡以及树莓派官方销售的配套网卡。

Q: 树莓派如何配置无线网络?

A: 分为两步:1、设置wlan0接口,2、设置WiFi配置文件。

第一步,在树莓派命令行中输入:sudo vim /etc/network/interfaces

在打开的文件中添加:

<br />
auto wlan0<br />
allow-hotplug wlan0<br />
iface wlan0 inet dhcp<br />
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf<br />

第二步,在树莓派命令行中输入:sudo vim /etc/wpa_supplicant/wpa_supplicant.conf

在打开的文件中末尾添加WiFi ssid和密码:

<br />
network={<br />
ssid=&quot;无线网络ssid&quot;<br />
psk=&quot;无线网络密码&quot;<br />
proto=RSN<br />
key_mgmt=WPA-PSK<br />
pairwise=CCMP<br />
auth_alg=OPEN<br />
}<br />

插入无线网卡,重启树莓派即可。

Q: 树莓派如何和电脑之间传输数据?
A: 树莓派默认打开了SFTP服务,只需要使用专用的FTP软件(如 FlashFXP),并在登陆时选择SFTP方式登陆即可,连接URL填写树莓派的IP地址,而登陆的账号密码和开机密码相同。

Q: 树莓派兼容的SD卡?
A: 该页面给出了所有树莓派可以使用的SD卡型号和大小:RPi_SD_cards

二、多媒体

Q: 树莓派如何播放MP3音乐?
A: 因为树莓派没有音频输出,首先需要配一个USB声卡或者专用的Walfson扩展板。之后安装 mplayer 音乐播放器 sudo apt-get install mplayer。使用以下命令将当前目录下的所有MP3文件创建为一个Playlist:

<br />
find ./ -type f -iname &quot;*.mp3&quot; &amp;gt; playlist.m3u<br />

Q: 树莓派如何播放视频?
A: 安装 omxplayer,支持 1080P 的 AVI 和 MP4 硬解码。

三、应用开发

Q: 树莓派支持哪些编程语言?
A: 树莓派自身包含了gcc / g++ 4.6 编译器,所以支持C和C++的开发;不过我推荐使用的语言还是Python,树莓派内置两个版本的Python,分别为 Python 2.7 和 Python 3.2。Python对于网络和串口的开发也有对应支持,而且也有支持Python的GPIO库 (RPi.GPIO)。

Q: 树莓派如何连接Arduino?
A: 三种方法,第一种为直接使用USB线缆进行连接,对于使用独立USB串口芯片的型号,在Linux中的显示名称为 /dev/ttyUSB0, 而对于使用另一片Arduino进行USB通信的型号显示为 /dev/ttyACM0;第二种为使用树莓派的IO串口进行通信,此方法的相关配置见此处;第三种方法还可以使用无线模块进行远程通信。

Q: 树莓派如何使用TTS功能?
A: 首先需要树莓派具有音频输出设备(如USB声卡)。下载festival程序库,sudo apt-get install festival。使用方法为:

<br />
$echo &quot;Do not touch me. I am dangerous!&quot; | festival --tts<br />
$festival --tts Simple_Test.txt<br />

Q: 如何操作树莓派的GPIO?
A: 可以使用RPi.GPIO, WiringPI或bcm2835 c库三种方法。我在另一篇博文”【RPi树莓派使用指南】树莓派接口定义及GPIO驱动方法“里详细介绍了这三种方法。

Q: 树莓派如何支持模拟量采集?
A: 目前还没有标准方案,不过可以通过与Arduino的通信实现模拟量采集及PWM输出功能。

Q: 树莓派如何安装OpenCV?
A: 执行以下命令安装OpenCV及Python支持库。

<br />
$sudo apt-get install libopencv-dev python-opencv<br />

Q: 树莓派如何编译Kernel?
A: 见官方的“树莓派编译指南”及Argu的“树莓派 Kernel 编译笔记”。

【RPi树莓派使用指南】Raspberry PI网络配置与SSH远程登录

树莓派虽然支持鼠标、键盘和显示屏等交互外设,但是每次使用时都要连接很多线缆,很不方便。而使用远程登陆就不会有这些不便。之前在 【RPi树莓派使用指南】使用VNC远程查看桌面 一文中介绍了远程查看桌面的方法,但是远程查看桌面会占用大量网络带宽,影响操作速度。对于不需要查看图形桌面,只需要使用terminal的情况,这里再介绍一下使用SSH远程使用树莓派控制台的方法。

在配置远程登陆之前,最好将树莓派的IP地址由 DHCP 改为 静态IP 地址,这样可以保证树莓派每一次上电后在路由器上注册的地址是一致的,从而在远程登陆时不需要再去确认树莓派的当前IP。配置的方法是修改网络配置文件:

<br />
sudo nano /etc/network/interfaces<br />

将eth0的相关配置由 dhcp 修改为 static,并增加要设置的静态IP地址、子网掩码和网关地址:

<br />
iface eth0 inet static<br />
address 192.168.1.100  # Static IP Address<br />
netmask 255.255.255.0  # Netmask<br />
gateway 192.168.1.1    # Gateway<br />

重新启动树莓派使配置生效。

远程登陆的软件推荐使用轻量级的PuTTY,该软件是绿色、单个文件的程序,其下载地址为:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

下载完成后运行PuTTY,输入树莓派的地址,并将连接模式选择为SSH(默认):

140910_puTTY
Figure 1.1  PuTTY的设置界面

点击 Open 建立连接,如果弹出警告窗口直接按确认即可。如果连接无误,将会看到输入用户和密码的提示,此时输入用户名 pi,密码 raspberry,即可完成远程连接的建立:

140910_puTTY2Figure 1.2  PuTTY登陆成功界面

连接成功之后,就可以像在本地操作树莓派一样通过 terminal 来操作树莓派了。

【RPi树莓派使用指南】树莓派连接HDMI显示器及配置方法

之前在”【RPi树莓派使用指南】使用VNC远程查看桌面“一文中介绍了在没有LCD的情况下,如何访问树莓派的图形桌面。不过有些时候还是外接显示屏比较方便,尤其是像用IDLE调试Python程序的时候。

因为树莓派只有AV和HDMI接口,而目前大多数电脑显示器都没有这两种接口,接电视上又不方便。淘宝上虽然有一些支持树莓派的显示模组,不过不仅价格贵,而且大多数尺寸都很小。

其实有一个很简单的方法,就是找一个迷你的液晶电视,因为现在的电视一般都会含有HDMI接口。我在ebay上就买到一个15.6寸的迷你液晶电视,可以直接用HDMI – HDMI线缆连接树莓派。其15.6寸的大小和有些笔记本一样大,携带也很便捷。对于基于pygame和Arduino的应用,有了显示屏确实会方便许多。

目前对普通电脑显示器增加HDMI接口也是趋势,相信不久也会有更多支持HDMI接口的液晶显示器了。当然对于普通的VGA显示器还可以使用VGA – HDMI转换器,不过这种方法不是很稳定,据说有些质量不好的转换器还会损坏树莓派的HDMI芯片,所以并不推荐。

DSC01302

不过在实际使用时,发现有时会出现屏幕显示不完全或字体过小的情况,此时就需要手动配置HDMI的显示分辨率。树莓派HDMI分辨率的配置方法如下:

Read more »

【RPi树莓派使用指南】树莓派电源系统解析

闲来无事,画了一张树莓派的电源系统结构:PI Power Tree

【RPi树莓派使用指南】树莓派串口通信介绍

树莓派的外部接口中含一路UART串行接口,利用该接口可以实现树莓派与Arduino、GPRS模块、GPS等其他外部系统的对接。

由于这一路串口兼做Linux的控制台输出口,所以在使用前必须先将调试输出功能关闭,方法如下:

1. 去除Kernel的启动信息

/boot/cmdline.txt 中,去除 parameterconsole=ttyAMA0,115200,并保存;

2. 去除Kernel的调试信息

同样在 /boot/cmdline.txt 中,去除 kgdboc=ttyAMA0,115200,并保存;

3. 关闭登陆提示

在 /etc/inittab 中去除 T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100,保存。

经过以上三步,就可以正常使用串行口了 (对于树莓派3,因为原生串口与蓝牙模块共用一组UART,还需要禁用蓝牙)。

(*)注意,因为树莓派与Arduino的串口电平不一致,必须使用电平转换芯片,或串联电阻限流,否则有可能损坏树莓派IO口!

编程时可以使用C语言以文件形式操作串口,也可以利用python的 python-serial 库进行编程。

这里以C语言为例,贴出示例代码:

<br />
#include &lt;unistd.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;sys/stat.h&gt;<br />
#include &lt;fcntl.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;</p>
<p>int main(int argc, char *argv[])  {<br />
	int fd, len;<br />
	fd = open(&quot;/dev/ttyAMA0&quot;, O_RDWR, S_IRUSR | S_IWUSR);<br />
	char temp;</p>
<p>	while(1)  {</p>
<p>		len = read(fd, &amp;temp, 1);</p>
<p>		if (len &gt; 0)  {<br />
			write(fd, &amp;temp, 1);<br />
			printf(&quot;%c&quot;, temp);<br />
		}<br />
		else  {<br />
			usleep(10);<br />
		}<br />
	}</p>
<p>	close(fd);</p>
<p>	return 0;</p>
<p>}<br />

该代码从串口中接收一个字符,接收成功后将该字符打印在控制台上并通过串口回发。

【修订历史】

v1.2   09/12/2014   调整了文字版式,增加了串口电平不一致的说明。
v1.1   09/11/2014   调整了代码的结构,增加了对代码的说明。

【RPi树莓派使用指南】树莓派接口定义及GPIO驱动方法

• 树莓派GPIO介绍

树莓派包含8个通用IO (GPIO) 用于开关控制 (switch control),配合扩展版可以进行继电器、电机、LED等外设的驱动。该扩展IO的位置如下所示:

1330870446_80fd3de
Figure 1. 树莓派1扩展IO在板上的位置

树莓派的各引脚功能定义如下,其中横线下方为RPi B+,2,3新增加的GPIO:

<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| BCM   | WIRING  | FUNCTION    | PIN | PIN | FUNCTION   | WIRING   | BCM    |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
|       |         | 3v3         | 1   | 2   | 5v         |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 2     | 8       | SDA1        | 3   | 4   | 5v         |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 3     | 9       | SCL1        | 5   | 6   | GND        |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 4     | 7       | GPCLK0      | 7   | 8   | TXD0       | 15       | 14     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
|       |         | GND         | 9   | 10  | RXD0       | 16       | 15     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 17    | 0       |             | 11  | 12  | PWM0       | 1        | 18     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 27    | 2       |             | 13  | 14  | GND        |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 22    | 3       |             | 15  | 16  |            | 4        | 23     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
|       |         | 3v3         | 17  | 18  |            | 5        | 24     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 10    | 12      | MOSI0       | 19  | 20  | GND        |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 9     | 13      | MISO0       | 21  | 22  |            | 6        | 25     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 11    | 14      | SCLK0       | 23  | 24  | CE0        | 10       | 8      |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
|       |         | GND         | 25  | 26  | CE1        | 11       | 7      |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| ----- | ------- | ----------- | --- | --- | ---------- | -------- | ------ |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 0     | 30      | SDA0        | 27  | 28  | SCL0       | 31       | 1      |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 5     | 21      | GPCLK1      | 29  | 30  | GND        |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 6     | 22      | GPCLK2      | 31  | 32  | PWM0       | 26       | 12     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 13    | 23      | PWM1        | 33  | 34  | GND        |          |        |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 19    | 24      | MISO1       | 35  | 36  |            | 27       | 16     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
| 26    | 25      |             | 37  | 38  | MOSI1      | 28       | 20     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />
|       |         | GND         | 39  | 40  | SCLK1      | 29       | 21     |<br />
+-------+---------+-------------+-----+-----+------------+----------+--------+<br />

目前有三种方式可以实现对树莓派GPIO的驱动:raspberry-gpio-pythonWiringPibcm2835驱动库,以下将分别介绍这三种方法。注意因为涉及硬件操作,程序执行时需要使用管理员权限sudo;同时注意各函数库使用的IO引脚号不同,编程时请参照上表中对引脚的定义。

• RPi.GPIO (raspberry-gpio-python)

项目主页:http://sourceforge.net/projects/raspberry-gpio-python/

RPi.GPIO是树莓派官方推荐的GPIO驱动库,该程序库使用Python语言。RPi.GPIO可用于对实时性要求不高的项目中,如果熟悉Python语言很快就能上手,该程序库的缺点是目前尚不支持SPI、IIC及1-wire。

本代码实现了使用RPi.GPIO程序库控制GPIO 7以1s频率进行开-关操作,如果外接一个220欧姆电阻和LED,可观察到LED以1HZ的频率闪烁。

Code 1. Python RPi.GPIO实现GPIO控制

</p>
<p>#!/usr/bin/python</p>
<p>import RPi.GPIO as GPIO<br />
import time</p>
<p>GPIO.setmode(GPIO.BOARD)<br />
GPIO.setup(7, GPIO.OUT)</p>
<p>while True:<br />
	GPIO.output(7, GPIO.LOW)<br />
	time.sleep(0.5)<br />
	GPIO.output(7, GPIO.HIGH)<br />
	time.sleep(0.5)</p>
<p>

• WiringPi

项目主页:http://wiringpi.com/

WiringPi是一个类似Arduino以C/C++实现的IO驱动库,该函数库在LGPL v3协议下发布。Wiring Pi是这三种程序库中功能最强大的,除了支持GPIO操作,还支持IIC、SPI、串口以及很多外扩外设:如Gertboards、74595、12864 LCD及PiFace扩展板。使用WiringPi之前需要下载相应的函数库,配置方法请参见:http://wiringpi.com/download-and-install/

使用Wiring Pi操作GPIO的代码如下:

Code 2. WiringPi实现GPIO控制

<br />
#include &lt;wiringPi.h&gt;<br />
int main (void)  {<br />
	wiringPiSetup() ;<br />
	pinMode(0, OUTPUT) ;<br />
	for (;;)  {<br />
		digitalWrite(0, HIGH) ;<br />
		delay (500) ;<br />
		digitalWrite(0,  LOW) ;<br />
		delay (500) ;<br />
	}<br />
	return 0 ;<br />
}<br />

通过以下命令进行编译,编译时需i包含WiringPi库:

<br />
gcc -Wall -o blink blink.c -lwiringPi<br />

• bcm2835 C驱动库

项目主页:http://www.airspayce.com/mikem/bcm2835/

该程序库使用C语言,跨过Linux内核层,直接操控BCM2835的GPIO。因为并不是以Linux device driver的方式实现,这种方式会存在一些潜在的副作用。不过该函数库除了支持GPIO的操作,还支持SPI、IIC以及系统定时器。

示例代码:

Code 3. bcm2835驱动库实现GPIO控制

<br />
#include &lt;bcm2835.h&gt;</p>
<p>// Blinks on RPi Plug P1 pin 11 (which is GPIO pin 17)<br />
#define PIN RPI_GPIO_P1_11</p>
<p>int main(int argc, char **argv)<br />
{<br />
  if (!bcm2835_init())<br />
  return 1;</p>
<p>  // Set the pin to be an output<br />
  bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);</p>
<p>  // Blink<br />
  while (1)<br />
  {<br />
    bcm2835_gpio_write(PIN, HIGH);<br />
    bcm2835_delay(100);</p>
<p>    bcm2835_gpio_write(PIN, LOW);<br />
    bcm2835_delay(100);<br />
  }<br />
  bcm2835_close();<br />
  return 0;<br />
}<br />

编译方法:

<br />
gcc -o blink blink.c -l bcm2835<br />

【修订历史】

V1.3    2016/05/25 : 增加了Raspberry Pi B+, 2, 3的引脚定义。
V1.2    2014/09/11 : 修改了代码#include后头文件消失的问题,修改了文章标题。
V1.1    2014/03/04 : 增加了Wiring Pi及bcm2835 C函数库的说明。

【RPi树莓派使用指南】使用VNC远程查看桌面

虽然树莓派具有一个HDMI视频接口,但很多老式显示器并不支持HDMI。那如果没有HDMI接口的显示设备,但又想使用树莓派的图形化界面怎么办呢?

你可以使用VNC服务。在树莓派中安装了VNC服务端后,可以在用户的电脑运行VNC客户器,从而在用户电脑上直接看到树莓派输出的图像信息。

1、首先我们需要在树莓派上安装VNC服务器。使用Raspberry Pi控制台,输入以下命令:

<br />
sudo apt-get update<br />
sudo apt-get install tightvncserver<br />

下载更新包的速度比较慢,我大概等了有20分钟才弄好吧。

2、之后对VNC进行配置。首先通过以下命令运行VNC:

<br />
tightvncserver<br />

之后会出现以下画面,要求设置VNC密码,这个密码是客户端连接时使用的。输入密码之后还可根据需要,再输入一个view-only的密码,使用这个密码只能查看桌面,但不能操作:

3、之后需要在电脑上安装VNC客户端,可以在http://www.tightvnc.com/下载TightVNC,我下载时最新的版本是v2.6.4,安装时可以通过自定义选项选择只安装TightVNC viewer。运行TightVNC Viewer,在Remote Host中填入Raspberry Pi的IP地址,注意IP后需要加”:1″,应该是表示连接ID吧。之前我没加,就一直连接不上。

连接后要求输入密码,输入刚才在控制台中配置的密码,就可以成功登陆了:

4、如果你希望以1024 x 728的视窗显示于你的电脑,就要在Raspberry Pi输入以下命令:

<br />
vncserver :1 -geometry 1024x728 -depth 24<br />

从使用的情况看,在树莓派上运行debian用户界面的速度还是挺慢的,不知道是处理器的原因还是VNC的问题。不过远程连接确实是非常实用的功能,通过VNC,即使没有显示器也可以通过PC机访问树莓派的图形界面了。

【修订历史】

V1.1    2014/03/30 修改了bash命令的显示方式,修改了图片的对齐方式,增加了tightvnc的超链接。