如何在树莓派上从源代码构建Golang

自打一开始,Google的Go编程语言就支持多种操作系统以及处理器架构。比如说Windows、Mac OS X、Linux、FreeBSD上的x86 32位及64位CPU。一直以来Golang项目也都支持ARM芯片,从ARMv5、ARMv6以及ARMv7系统架构。树莓派采用的是博通公司的基于ARMv6的架构,而树莓派能完美运行Linux和FreeBSD,因此在树莓派上也可以用Go语言来编程。本文就是指导你如何在树莓派上从源代码来构建Go语言。

Google暂时还没有为树莓派提供预构建好的Golang二进制包。尽管在写作本文时已经有一个针对Raspbian系统的Golang包了,但版本较老。因此如果目前想在树莓派上安装Golang的话,最好的方式就是从源代码开始构建。这听起来有点吓人但其实真的非常简单。

第一步是安装Mercurial,这是Google用来管理Go源代码的版本控制系统。

sudo apt-get install -y mercurial

对于Mercurial系统来说,其主要的命令行接口是hg,有了这个你就能下载Golang的源代码。下面的命令将把构建Golang所必须的源代码下载到/usr/local/go目录中去:

sudo hg clone -u default https://code.google.com/p/go /usr/local/go

这一过程大约需要10分钟,取决于你的网速有多快了。一旦下载完成,你就可以开始构建的过程了。用cd命令将当前目录修改为/usr/local/go/src,然后开始构建过程:

sudo ./all.bash

构建过程中会在终端上输出很多内容,大部分都是一些信息提示。整个构建过程大概需要90分钟到2小时。

构建进程会提示我们将Go的二进制包所在的目录添加到系统PATH中去。要做到这一点你需要编辑.profile文件,每次你创建一个新的shell会话时,Bash都会处理这个文件。用cd命令将你的当前目录切换回home,使用nano编辑器编辑.profile文件:

nano .profile

在文件最底部,添加如下这行:

export PATH=$PATH:/usr/local/go/bin

键入CTRL + X来退出nano编辑器,然后输入Y来确定编辑过的文件已保存。按下ENTER键来保持当前文件名不变。

你需要退出当前的终端然后重新开启另一个(如果你用的是桌面环境),或者也可以登出再登入(如果你用的是纯命令行界面)。

要验证Go是否安装正确,可以创建一个名为hello.go的文件,然后写下如下代码(著名的hello world又来了):

package main import “fmt” func main() { fmt.Printf(“Hello Make Tech Easier!

“) }

要运行它,请在终端上输入:

go run hello.go

程序的输出结果是一行文本:Hello Make Tech Easier!

开始尝试用Go编程

Go是一门非常强大的编程语言,其设计本意是为了能编写同时处理多个任务的程序,这称为并发(concurrency)。你可以编写程序来同时执行许多任务,而且还能让这些彼此分离的任务互相通信和交互。

请查阅这篇Writing Your First Concurrent Go Program(编写第一个并发的Go程序),试着运行文中的代码示例,看看为并发而生的编程语言在多任务操作系统上所表现出的强大威力吧。这一切都可以运行在你的树莓派上哦!

树莓派 SAKS 扩展板上手把玩 之 浪漫小夜灯

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

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

本节以 SAKS 扩展板为硬件基础,实现一个树莓派小夜灯。我们将要设计的小夜灯,将能通过一个触控开关来点亮或关闭。同时还能通过 SAKS 的2位拨码开关来调 节亮度。当拨码开关被置为双 OFF 时,第1、2个蓝色 LED 工作;当拨码开关第1位被置为 ON 时,第3个蓝色 LED 工作;当拨码开关第2位被置为 ON 时,第4个蓝色 LED 工作。以此改变小夜灯的亮度。

由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。

我们要用到 SAKS 的蓝色 LED,而蓝色 LED 与数码管共享 GPIO 引脚。要启用这一组 LED,请先确保 LED 的跳线被置为“ON”。

首先要了解轻触开关和拨码开关的使用方法。在 SAKS SDK 中,已经对开关的触发做了封装,如下:

#在检测到拨码开关状态被修改时自动执行此函数 def dip_switch_status_changed_handler(status): pass #在检测到轻触开关触发时自动执行此函数 def tact_event_handler(pin, status): pass if __name__ == “__main__”: #设定拨码开关回调函数 SAKS.dip_switch_status_changed_handler = dip_switch_status_changed_handler #设定轻触开关回调函数 SAKS.tact_event_handler = tact_event_handler

以上代码中,status 表示开关的状态。开关状态为ON时(轻触开关为按下状态,拨码开关为ON状态)返回True,OFF时返回False。当开关的状态发生变化时,SAKS SDK 自动调用以上的函数。那么我们只需要把自己的控制逻辑加入到以上函数即可。大部分时候你甚至不用弄清楚轻触开关和拨码开关的状态读取原理。

加入蓝色 LED 控制逻辑之后,程序代码如下:

from sakshat import SAKSHAT from sakspins import SAKSPins as PINS import time #Declare the SAKS Board SAKS = SAKSHAT() #当前开关状态 __light_status = False #在检测到拨码开关状态被修改时自动执行此函数 def dip_switch_status_changed_handler(status): ”’ called while the status of dip switch changed :param status: current status :return: void ”’ global __light_status #在小灯状态开着时执行 if __light_status: #拨码开关第1位状态为ON if status[0]: #点亮第3个LED SAKS.ledrow.items[2].on() else: SAKS.ledrow.items[2].off() #拨码开关第2位状态为ON if status[1]: #点亮第4个LED SAKS.ledrow.items[3].on() else: SAKS.ledrow.items[3].off() #print(status) #在检测到轻触开关触发时自动执行此函数 def tact_event_handler(pin, status): ”’ called while the status of tacts changed :param pin: pin number which stauts of tact is changed :param status: current status :return: void ”’ global __light_status #判断是否是右边的轻触开关被触发,并且是在被按下 if pin == PINS.TACT_RIGHT and status == True: #在小灯当前状态关着时将它们点亮并修改小灯当前状态为开; 在小灯当前状态开着时将它们灭掉并修改小灯当前状态为关 if not __light_status: SAKS.ledrow.items[0].on() SAKS.ledrow.items[1].on() #检测第1位拨码开关状态是否为ON if SAKS.dip_switch.is_on[0] == True: #点亮第3个LED SAKS.ledrow.items[2].on() #检测第2位拨码开关状态是否为ON if SAKS.dip_switch.is_on[1] == True: #点亮第4个LED SAKS.ledrow.items[3].on() else: SAKS.ledrow.items[0].off() SAKS.ledrow.items[1].off() SAKS.ledrow.items[2].off() SAKS.ledrow.items[3].off() __light_status = not __light_status #print(“%d – %s” % (pin, status)) if __name__ == “__main__”: #设定拨码开关回调函数 SAKS.dip_switch_status_changed_handler = dip_switch_status_changed_handler #设定轻触开关回调函数 SAKS.tact_event_handler = tact_event_handler input(“Enter any keys to exit…”)

将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/nxez/SAKS-tutorials/tree/master/nightlight

在终端运行:

git clone https://github.com/nxez/SAKS-tutorials.git cd SAKS-tutorials cd nightlight sudo python main.py

轻触第一个轻触开关,点亮、关闭小夜灯。再尝试拨动拨码开关,调节亮度。是不是很棒?

注意:SAKS SDK 对于开关的封装实际上是采用了多线程循环检测开关状态的方式实现。受限于树莓派CPU性能以及Python2.7对多线程支持上的局限性(Python 2.7的多个线程只能运行在一个CPU核心上),以上代码可能会因CPU占用过高而出现按键开关动作偶尔无法被正常监测。尤其是在树莓派2B多核版本上,树莓派单核版本反而效果更好。要对以上问题进行优化,比较可行的方法是用Python GPIO自行实现开关检测部分的代码并通过单线程方式来实现。

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

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

树莓派安装DLNA实现流媒体服务器

平板电视大都支持DLNA(Digital Living Network Alliance),一些智能电视可能无法支持直接播放Samba上的媒体,这时在树莓派安装一个MiniDLNA就可以让平板电视直接播放树莓派上的影音资源了。另外树莓派实验室之前有介绍过在树莓派上安装Samba的方法,将DLNA和Samba结合起来用更是方便又强大。下面介绍DLNA安装的具体步骤。

安装 minidlna

更新一下安装源

sudo apt-get update

安装 minidlna

sudo apt-get install minidlna

设置配置文件

设置/etc/minidlna.conf文件,在文件尾部添加如下内容:

#A表示这个目录是存放音乐的,当minidlna读到配置文件时,它会自动加载这个目录下的音乐文件 media_dir=A,/samba/DLNA/Music media_dir=P,/samba/DLNA/Picture media_dir=V,/samba/DLNA/Video #配置minidlna的数库数据的存放目录 db_dir=/samba/DLNA/db #配置日志目录 log_dir=/samba/DLNA/log

以上配置中,/samba/DLNA/* 这个目录可以自定义,一定要确保目录存在且设置权限为可读写。例子中的是已经配置好的 Samba 所在的目录,这样可以把 DLNA 目录共享在局域网之中,更方便的管理媒体文件。树莓派实验室之前有介绍过在树莓派上安装Samba的方法。

重启 minidlna

/etc/init.d/minidlna restart

测试

/etc/init.d/minidlna status

返回 [ok] minidlna is running 为正常。

这个时候就可以通过平板电视、电脑、手机来发现“媒体设备”播放DLNA目录下的媒体资源了。

DLNA 支持的媒体格式:

Image JPEG PNG, GIF, TIFF

Audio LPCM AAC, AC-3, ATRAC 3plus, MP3, WMA9

AV MPEG2 MPEG-1,MPEG-4*, AVC, WMV9

minidlna 使用技巧

查看资源个数

http://树莓派的IP地址:8200/

让 minidlna 随机启动

sudo update-rc.d minidlna defaults

启动 minidlna 服务

sudo service minidlna start

当你修改配置文件及媒体资源更新时,需要强制刷新,以便minidlna将最新的媒体文件进行索引

sudo service minidlna force-reload

取消 minidlna 的开机自动启动

sudo update-rc.d -f minidlna remove

停止 minidlna 服务

sudo service minidlna stop

停止 minidlna 所有进程

sudo killall minidlna

卸载 minidlna

sudo apt-get remove –purge minidlna

安装OpenWrt将树莓派变身为全能路由器

随着上网设备的增多,一直想搞个全局的智能梯子,本着重在折腾的原则,搞了个MikroTik 951G软路由来玩(不玩不知道,真尼玛强大),这时又偶然发现openwrt不光有x86版,也早就支持Pi了,要知道Pi的cpu和内存绝对秒杀HG255D等一系列的低端路由器啊,虽然树莓派价格相对比较高,如果有闲置的派拿来玩玩又何妨。

硬件准备:Raspberry Pi一个,注意,B+用户暂时不能完美使用。

USB无线网卡一个,这里使用AR9271芯片迅捷fw150ud,如果只做有线路由使用,可以不用

USB有线网卡一个,这里使用AX88772B芯片山寨usb网卡,如果只做无线路由使用,可以不用

需要网线上网可以接个千兆交换机或用替换下来的多口路由器代替

SD卡一个,有个128M或256M都够用了

Micro USB线及5V,2A电源,网线两根,不用解释

MikroTik 951G-2HnD,自建PPPoE服务器,方便测试

软件准备:

openwrt-brcm2708-sdcard-vfat-ext4.img(百度网盘)

实现过程:

一、准备SD卡,将磁盘镜像文件openwrt-brcm2708-sdcard-vfat-ext4.img写入SD卡。

Windows环境使用win32diskimager,简单方便。

Linux系统使用dd命令,dd if=~/foo.img of=/dev/sdX,X替换成相应设备名,使用fdisk -l查看,foo替换成相应镜像文件名。

OS X环境,执行diskutil list查看SD卡所在位置,然后使用diskuitl unmountDisk /dev/diskX,卸载SD卡,最后执行,dd bs=1m if=~/foo.img of=/dev/diskX,foo替换成相应镜像文件名,X替换成diskutil list显示的设备号。

二、软件设置

0.Openwrt会将Pi的自带网卡IP地址设为192.168.1.1,在我的网络环境中和主路由器是相同地址,所以需要修改一下。可以先用电脑及网线单独连接Pi,在浏览中输入ip即可看到登录界面,会提醒设置root用户密码,点击提示中的链接就可以完成密码设置。然后在Network->Interfaces中编辑默认IP为192.168.1.11,网关修改为上级路由IP,192.168.1.1,DNS也是必填项,见下图:

另一种方法是外接键盘显示器,启动Pi后编辑/etc/config/network文件,新手朋友还是推荐第一种方法。

1.将Pi自带网卡有线连接到上级路由器中,就可以在浏览器地址栏中输入192.168.1.11打开管理页面。

2.安装usb网卡驱动,在菜单中选择System->Software,先点击“Update Lists”更新软件列表,

完成更新后在”Download and install package”文本框中分别输入,kmod-usb-net和kmod-usb-net-asix,点击”OK”即可安装好usb有线网卡的驱动。

3.安装usb无线网卡驱动,同样方法安装,kmod-ath9k-htc,最后重启一下PI,即可发现无线网卡和有线网卡。

4.配置无线AP,按上述方法安装hostapd和wireless-tools两个软件,之后到Network->Wifi中点击”Edit”配置”AP”信息。

最后点击那个绿色图标的”Enable”按钮后即可启动无线AP,打开手机即可看到一个名为OpenWrt的wifi热点。

连接新创建的wifi热点时如果出现连接后出现无法获取IP的问题,有可能是没有设置好无线设备和网关的桥接,最新的14.7版OpenWrt是自动设置,之前使用OpenWrt 12.9时是要手动配置的。

5.设置PPPoE拨号,在Network->Interfaces中点击“Add new interface…”添加一个接口,然后选择eth1,在“Protocol of the new interface”中选择PPPoE,

最后点击“Submit”后会出现以下界面,输入用户名和密码即可实现PPPoE拨号。

填写完用户名密码后,点击”Physical Setting”,选择“eth1”接口。

最后点击“Save & Apply”保存并应用设置,后就会自动拨号上网,或在Network->Interfaces界面中点击WAN口的“Connect”按钮也可拨号上网。

注意这一步的前提是将Pi的usb有线网卡通过网线连接到光猫和ADSL猫,Pi自带网卡连接下级路由或交换机。

PS,在管理界面的每个页面操作后都需要点击”Save&Apply”来保存设置,如果出现这个按钮的话。

PS,因为是测试环境,pppoe是连接到Mikrotik 951G上实现拨号上网的,所以ip地址显示10.1.1.3。

PS,软件设置前三步的目的是利用现有路由器来安装网卡驱动,也可以先将PI自带网卡设置为PPPoE客户端进行拨号上网并安装相应驱动,方法同上文软件设置第5项,将eth1改为eh0即可。

via http://blog.sina.com.cn/s/blog_40983e5e0102v6qt.html

树莓派上手常见问题处理[转]

(转自LT的博客)

一、磁盘

1. Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

现象:非正常关机后,在开机信息最末尾出现

[ 15.721411] FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

原因:非正常关机,比如没执行 sudo poweroff 关机就拔掉 MicroUSB 供电插头。

解决:

方法1:最方便的是,将TF卡取下,用USB读卡器插入Windows系统,用磁盘修复即可。

方法2:在树莓派里使用 dosfstool,参见 http://www.raspberrypi.org/forums/viewtopic.php?f=28&t=64843 # umount /boot # git clone http://daniel-baumann.ch/git/software/dosfstools.git # cd dosfstools # make cc -O2 -fomit-frame-pointer -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wextra -Wno-sign-compare -Wno-missing-field-initializers -Wmissing-prototypes -Wstrict-prototypes -g -c -o fatlabel.o src/fatlabel.c . . . cc mkfs.fat.o -o mkfs.fat # ./fsck.fat -V /dev/mmcblk0p1 fsck.fat 3.0.24 (2013-11-23) 0x25: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt. 1) Remove dirty bit 2) No action ? 1 Starting check/repair pass. Starting verification pass. Leaving filesystem unchanged. /dev/mmcblk0p1: 14 files, 2383/7161 clusters ./fsck.fat -a /dev/mmcblk0p1 #mount /boot

方法3:直接使用我编译好的 fsck.fat pi@raspberrypi ~ $ git clone https://github.com/davidrobot/myRaspi.git Cloning into ‘myRaspi’… remote: Counting objects: 5, done. remote: Compressing objects: 100% (3/3), done. remote: Total 5 (delta 0), reused 5 (delta 0) Unpacking objects: 100% (5/5), done. pi@raspberrypi ~ $ cd myRaspi/bin/ pi@raspberrypi ~/myRaspi/bin $ chmod +x fsck.fat pi@raspberrypi ~/myRaspi/bin $ sudo cp fsck.fat /usr/bin pi@raspberrypi ~/myRaspi/bin $ sudo fsck.fat -a /dev/mmcblk0p1 fsck.fat 3.0.26 (2014-03-07) 0x25: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt. Automatically removing dirty bit. Performing changes. /dev/mmcblk0p1: 13 files, 1231/7161 clusters pi@raspberrypi ~/myRaspi/bin $

方法4:升级系统即可 sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade 或者使用全新的2014-12-24镜像。

2. 挂载U盘后必须要sudo才有写权限

现象:用户pi无写权限,必须sudo

原因:挂载时没有制定相关选项 uid 和 gid

解决:

先用 id 获取 uid gid再挂载 pi@raspberrypi ~ $ id uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(netdev),999(input),1002(spi),1003(gpio) pi@raspberrypi ~ $ sudo mount -o iocharset=utf8,uid=1000,gid=1000 /dev/sda4 /media/udisk/ pi@raspberrypi ~ $

二、网络

1. wlan0: deauthenticating from xx:xx:xx:xx:xx:xx by local choice (reason=3)

现象: 插入一个USB转LAN的网卡 eth1 ,USB无线网卡 waln0 就被断开了。拔掉USB转LAN网卡,WLAN才恢复。或者 eth0 ,连通,wlan0也会断开。这个不是LT所希望的。

pi@raspberrypi ~ $ dmesg | tail [ 452.068465] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 452.068481] usb 1-1.4: Product: USB To LAN Converter [ 452.068495] usb 1-1.4: Manufacturer: ADMtek [ 452.068508] usb 1-1.4: SerialNumber: 0001 [ 452.113419] pegasus: v0.9.3 (2013/04/25), Pegasus/Pegasus II USB Ethernet driver [ 452.118287] pegasus 1-1.4:1.0: setup Pegasus II specific registers [ 452.229480] pegasus 1-1.4:1.0: eth1, ADMtek ADM8511 “Pegasus II” USB Ethernet, 00:00:e8:00:24:40 [ 452.233024] usbcore: registered new interface driver pegasus [ 454.718505] wlan0: deauthenticating from 00:24:23:50:1e:ee by local choice (reason=3) [ 454.736171] cfg80211: Calling CRDA for country: DE

/etc/network/interfaces 是这样的

auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0 allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp

同时 /etc/wpa_supplicant/wpa_supplicant.conf 这样的

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid=”LT_U880″ psk=”password” }

原因:似乎是 wpa_supplicant 导致的。这里也有关于reason=3 的讨论。

解决:

重新编写 interfaces 文件,不使用 wpa-roam,参照 http://raspberrypihq.com/how-to-add-wifi-to-the-raspberry-pi/ 的写法 auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-ssid “LT_U880” wpa-psk “password” iface default inet dhcp

尽管这样解决了插入USB转LAN网卡后,WLAN失效,但是似乎会WLAN一直出现deauth,auth反复认证 reason =2 ,但是并不影响通讯,即使是不采用我的设置而采用系统默认的interfaces设置,也是有auth和deauth反复过程的。还有似乎这样拔掉USB无线网网卡后,不能再自动获取IP地址。有待进一步测试。

2. wlan0: deauthenticated from xx:xx:xx:xx:xx:xx (Reason: 2)

使用USB无线网卡,会反复出现下面的日志。我连接的是手机 ZTE U880 做的 AP 热点。

[ 1902.875736] wlan0: associated [ 2088.289608] wlan0: deauthenticated from 00:24:23:50:1e:ee (Reason: 2) [ 2088.353998] cfg80211: Calling CRDA to update world regulatory domain [ 2090.195247] wlan0: authenticate with 00:24:23:50:1e:ee [ 2090.247032] wlan0: send auth to 00:24:23:50:1e:ee (try 1/3) [ 2090.248793] wlan0: authenticated [ 2090.260863] wlan0: associate with 00:24:23:50:1e:ee (try 1/3) [ 2090.263822] wlan0: RX AssocResp from 00:24:23:50:1e:ee (capab=0x431 status=0 aid=1) [ 2090.266315] wlan0: associated

现象:无,见log

原因:不明

解决:

/etc/wpa_supplicant/wpa_supplicant.conf 文件确保无误

在/var/run 下 创建 文件夹 wpa_supplicant(/var/run/wpa_supplicant)

wpa_supplicant -d -Dnl80211 -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

重启即可。(感谢xty19贡献解决方法)

3. 插拔USB无线网卡死机

现象:使用上篇文章介绍的 XG-760N 网卡,发现有时拔出后,树莓派死机,ACT灯无动静。

关于网卡死机,并非个案,比如: 链接1, 链接2 也同样提到过。

原因:可能网卡兼容性不好。并非电流问题,我的电源是2A容量,并且测试过使用额外2A电流容量供电的贝尔金USB HUB,依然存在拔出时死机。但是测试反复插拔U盘和USB转LAN网卡,就不会。

解决:

方法1:尽量不要热插拔USB无线网卡

方法2:安装watchdog在死机后自动重启

方法3:能否找出网卡冲突的地方?

三、接口

1. MAX3232转接头连接USB转RS232转换接头和树莓派,控制台会出现乱码

现象:即便是PC采用FTDI232的USB转RS232,再使用MAX3232转接头,接入树莓派在串终端上输入字符时,回显有乱码。取决于转换线的质量。

原因:USB转RS232的过程中已经有一次5v TTL点平转RS232电平的转换,再经过MAX3232将RS232电平转换为3.3VTTL电平,转换环节太多,信号容易丢失。

解决:

采用精心设计的USB转RS232转换线可避免。LT 手头有两条线,经过MAX3232转接,一条线输入字母回显会乱码;另一条线使用键盘输入无任何问题,但是拷贝粘贴到终端时,回显会出现乱码。

不要使用USB转RS232,直接用MAX3232转接头连接电脑原生RS232和树莓派。

直接使用USB转3.3VTTL,避免多次转换。

2.USB接口带不动USB移动硬盘

现象:插入USB移动硬盘后,硬盘嗒嗒响

原因:USB供电不足

解决:

方法1:修改 config.txt ,添加 max_usb_current=1

方法2:修改 config.txt ,添加 safe_mode_gpio=4

四、模块

1.使用RTC模块,重启后时间变慢几秒

现象:使用RTC模块 DS3231,可以正常获取时间,但是发现树莓派重启后时间变慢几秒。

原因:当关机或者重启时,有可能树莓派将当前时间写入RTC,由于写入过程耗费时间,于是就产生了时间差。但是如果频繁重启会造成时间差越来越大。

解决:待解决

五、服务

1. ntp无法通过http代理同步时间

现象:使用http代理上网,ntp无法通过代理来同步时间

原因:ntp使用udp协议,无法穿过http代理

解决:

使用 http获取某个网站服务器时间。如 http://superuser.com/questions/307158/how-to-use-ntpdate-behind-a-proxy 介绍,可以使用国内的网站比如www.baidu.com。注意带www,不带的结果不一样。 sudo date -s “$(curl -sD – www.baidu.com | grep -E ‘^[[:space:]]*[dD]ate:’ | sed ‘s/^[[:space:]]*[dD]ate:[[:space:]]*//’ | head -1l | awk ‘{print $1, $3, $2, $5 ,”GMT”, $4 }’ | sed ‘s/,//’)” 或者另一种方式,区别是前者输出信息更工整,但是下面这个也是能工作的。 sudo date -s “$(curl -sD – www.baidu.com | grep ^Date: | cut -d’ ‘ -f3-6)Z” 此指令大概会滞后2-3秒钟左右时间,属于可接受范围。下面可见两条指令的区别。 pi@raspberrypi ~ $ echo $(curl -sD – www.baidu.com | grep -E ‘^[[:space:]]*[dD]ate:’ | sed ‘s/^[[:space:]]*[dD]ate:[[:space:]]*//’ | head -1l | awk ‘{print $1, $3, $2, $5 ,”GMT”, $4 }’ | sed ‘s/,//’) Wed Dec 10 06:22:31 GMT 2014 pi@raspberrypi ~ $ pi@raspberrypi ~ $ date && sudo date -s “$(curl -sD – www.baidu.com | grep -E ‘^[[:space:]]*[dD]ate:’ | sed ‘s/^[[:space:]]*[dD]ate:[[:space:]]*//’ | head -1l | awk ‘{print $1, $3, $2, $5 ,”GMT”, $4 }’ | sed ‘s/,//’)” Wed Dec 10 14:22:43 CST 2014 Wed Dec 10 14:22:45 CST 2014 pi@raspberrypi ~ $ pi@raspberrypi ~ $ echo $(curl -sD – www.baidu.com | grep ^Date: | cut -d’ ‘ -f3-6)Z 10 Dec 2014 06:22:57Z pi@raspberrypi ~ $ pi@raspberrypi ~ $ date && sudo date -s “$(curl -sD – www.baidu.com | grep ^Date: | cut -d’ ‘ -f3-6)Z” Wed Dec 10 14:23:04 CST 2014 Wed Dec 10 14:23:05 CST 2014 pi@raspberrypi ~ $

六、系统

1. Failed to fetch xz:/var/lib/apt/lists/partial/mirrordirector.raspbian.org_raspbian_dists_wheezy_main_binary-armhf_Packages Hash Sum mismatch

现象:执行sudo apt-get update后,更新一段过程中,然后卡在此过程

原因:不明

解决:

参考 http://forums.debian.net/viewtopic.php?f=10&t=108618 和 http://www.raspberrypi.org/forums/viewtopic.php?f=28&t=65062 ,执行指令 sudo rm /var/lib/apt/lists/partial/*

2. FATAL: Module g2d_23 not found.

现象:在ssh运行statx后,报 FATAL: Module g2d_23 not found.

原因:未查

解决:未查 http://93.93.130.214/forums/viewtopic.php?t=69662&p=506614

3. 桌面右键菜单变成 Open browser and terminal

现象:右键变成 Open browser and terminal …

原因:/home/pi/.config/pcmanfm/LXDE/pcmanfm.conf 更改了

解决:参照 http://www.raspberrypi.org/forums/viewtopic.php?f=91&t=26363,删除 pcmanfm.conf 注销登陆

树莓派创意DIY盘点 比比谁的脑洞更大

摘要:众所周知,树莓派一开始是一款为学生计算机编程教育设计的卡片式电脑,其系统基于 Linux。自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是 “麻雀虽小,五脏俱全”。就像其他任何一台运行 Linux 系统的台式计算机或者便携式计算机那样,利用树莓派可以做很多事情。根据树莓派创始人 Eben Upton 的说法,这款微型电脑将一直保持着 35 美元的售价,树莓派的低价意味着其用途更加广泛。

随着树莓派二代的推出,其配置已经可以满足更高的需求,而不仅限于各种小玩意儿。此前,我们曾经报道过基于树莓派打造的手机、笔记本电脑和相机等数码产品,由此可见,这款微型电脑的玩法其实非常多元化,关键是看你的脑洞有多大,比如下面这几款。

1. 游戏机

正如前文所说,树莓派其实是一台迷你的 Linux 计算机,我们可以利用它打造任何经典的游戏机,比如我们所熟知的超级任天堂、世嘉 MD 以及 Gamoboy 等等。当然,我们需要事先安装好特定的游戏机模拟器,并下载游戏 ROM。

2. 有声阅读器

如果你身边有一位具有阅读困难的朋友,那么不妨用树莓派为他/她制造这样一台将文字转换成语音的设备,这绝对能带来不一样的乐趣。这个项目还需要一些附加部件及专门的有声读物素材。

3. 下载及云端服务器

我们可以通过树莓派连接外接硬盘的方式来打造一个属于自己的云端服务器,树莓派的价格直接决定了这款服务器的成本不会很高,再配合相应的应用程序就能实现数据的下载和上传。

4. 数字时钟

用大号的晶体管和树莓派搭载一款颇具后现代风格的数字时钟并不是什么困难的事情,你还可以将它接入到网络中以便随时校正时间。当然,只需要几行代码,就可以在有线和无线的方式之中切换。

5. 监控摄像头

想知道谁偷偷进过你的办公室吗?希望捕捉到家中后院里偶尔光顾的小松鼠吗?树莓派动态摄像头可能就是一个好办法。不过你额外还需要一个被动视差红外传感器和一些基本的编码,不过投入的时间和金钱绝对可以值回投资。

新书推荐《零基础学 Raspberry Pi》

树莓派实验室成员 flycoor 在今年翻译了一本很好的开源硬件方面的教材——《零基础学Raspberry Pi》。本月已经上市,亚马逊、当当、京东均有销售。

是一本非常适合新手学习Raspberry Pi的书籍。它详细的介绍了从如何启动、初始化一个Raspberry Pi到最终将软硬结合、自己diy出来一个电子播放器的每一个过程。其内容涵盖了Raspberry Pi官方推荐系统Raspbian中的大部分软件应用的使用和编程方法,教程都是属于手把手教程类,只要你有耐心读完,那你一定能学的会。而且不论你的水平高低,你都将会在这本书中找出你所欠缺、需要的内容。

作为一本翻译的书籍,原作已经在海外畅销获得好。相信对正在入门树莓派的你会很有帮助。

命令行下的中文界面——zhcon安装

zhcon是我见过最难编译的,没有之一。树莓派的apt源上的zhcon装完之后无法启动utf-8编码模式,我找了一堆资料终于整理出了一个能用的zhcon包:下载zhcon-0.2.5。

编译前需要做两步:

sudo apt-get install libncurses5-dev

startx打开图形界面,进入zhcon的src目录,在报错的g++编译最后加上-lncurses

如下所示:

cd src g++ -funsigned-char -O2 -DNDEBUG -Wall -o zhcon basefont.o big52gbdecoder.o big5decoder.o configfile.o console.o gb2big5decoder.o gbdecoder.o gbkdecoder.o graphdev.o hzdecoder.o jisdecoder.o kscdecoder.o main.o window.o winime.o zhcon.o overspotclient.o nativeinputserver.o inputclient.o inputmanager.o inputserver.o candilist.o uniconinputserver.o nativebarclient.o mouse.o encfilter.o iconv_string.o cmdline.o display/libdisplay.a -limm_server -limmclient -ldl -lutil -lncurses cd .. ./configure make make install

Mac OS X上使用USB转串口线连接树莓派

因为没有HDMI的显示器,总之就是没有显示器来显示,想起RPi上有 TXD 和 RXD 加上手头上刚好有一个 usb to ttl 。

Mac OS Usb TTL驱动

驱动下载地址: PL2303 Mac OS X Driver Download

如果不是对最新版本有强迫症的话,安装文件: md_PL2303_MacOSX-10.6up_v1.5.1.zip。

安装完后重启系统,查询串口设备:

cd /dev ls tty.usbserial*

mac os 安装 screen

这里用到的串口工作是screen

brew install screen

或者

sudo port install screen

然后连接Raspberry Pi

可参考这篇文章 RPi Serial Connection

Raspberry PI串口通信

接着把我们 TTL 板子上的

GND->Groud

RXD->GPIO 14(TXD)

TXD->GPIO 15(RXD)

!注意: TXD连接的是RXD ,不要接成一样的。

Mac OS ttl 设置 raspberry pi

进行串口通讯

screen /dev/tty.usbserial 115200

接着我们就可以看到系统启动了,要我们输入用户名和密码

Raspbian GNU/Linux 7 raspberrypi ttyAMA0 raspberrypi login: pi Password: Last login: Sat Apr 26 05:58:07 UTC 2014 on ttyAMA0 Linux raspberrypi 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. ls NOTICE: the software on this Raspberry Pi has not been fully configured. Please run ‘sudo raspi-config’

然后

sudo raspi-config

选择第一个,下面就可以继续了

Expand Filesystem Ensures that all of the SD cards

重启完,目测好像新版的raspberry pi带有 openssh-server 。

顺便提供一个卸载驱动的方法

rm -rf /System/Library/Extensions/XXXX.kext rm -rf /System/Library/Extensions.kextcache rm -rf /System/Library/Extensions.mkext kextcache -k /System/Library/Extensions

这些指令需要管理员权限,建议使用root用户或者sudo -s。其中XXXX.kext就是驱动的名字,比如这里的两种USB-Serial驱动分别是Prolific和FDTI打头的。

via

DIY一个标准的树莓派扩展板(HAT)

Arduino的扩展板被称为Shield,而树莓派的扩展板则称作HAT(Hardware Attached on Top),意为附加在树莓派顶上的硬件板卡。下面兔子就带着大家从零开始设计一块开源的树莓派扩展板,暂名为Raspberry Pi ICA HAT。

所有设计资料均已开源,可以在懒兔子的GitHub上获取:

http://github.com/nightseas/pi_mods

Raspberry Pi ICA HAT

1.需求分析

兔子设计HAT的初衷是为树莓派提供基本的显示和用户输入功能,并引出UART、I2C、SPI等硬件接口,方便连接其他模块,同时也能够做为用户学习树莓派硬件编程的入门板(Starter Board)。ICA HAT的配置如下:

1.用户按键x5,可以作为上下左右和“确定”按键;

2.用户LED x4,实现基本指示功能,另有一个电源指示LED;

3.有源蜂鸣器x1,提供报警功能;

4.红外发射管x2,红外接收头x1,实现红外收发遥控功能;

5.七段数码管x2,实现8位数字显示,通过SPI接口的MAX7219芯片驱动;

6.I/O和电源扩展排针若干。

设定好需求后,首先需要考虑的是结构问题,本例的设计针对的是树莓派2B型号,同时也兼容一代的B+型号。下图为树莓派2B/B+的机械结构:

针对树莓派的机械结构,可以设计全长和半长两种HAT。全长板与树莓派外框尺寸相同,但由于树莓的USB和RJ45连接器较高,需要注意该区域底层的器件是否会与连接器接触。

半长板则只包含四个螺孔的区域。

两种板型都通过2.54mm间距排座与主板上的排针连接,并通过4个M2.5铜柱或螺钉与主板进行固定。如下图所示。

图 全长HAT和半长HAT

兔子已将设计好的两种尺寸HAT存放在GitHub上,读者可以在此基础上进行设计。

分析完机械结构后,紧接着需要考虑的是I/O资源分配。树莓派2B/B+的I/O中包括两个SPI接口、两个I2C接口和一个UART接口。没有可用的硬件PWM和ADC。并且,I2C0被用作IDPROM接口,用于读取HAT板卡信息,用户无法使用。SPI1在CPU中又叫做SPI_AUX,目前Linux驱动尚不完善,但可以通过pigpo库调用。如下图所示:

本例将SPI0、I2C1和UART0引出至排针,MAX7219使用SPI1控制,并使用GPIO作为软片选。其他功能根据布线任意分配GPIO。

2.硬件设计与制作

需求分析完成后开始进行硬件设计,兔子使用的是Cadence 16.6工具。原理图工具为OrCAD Capture CIS,PCB工具为Allegro PCB Editor。

首先是IDPROM,将一片EEPROM与树莓派的I2C0相连。这部分电路为保留功能,实际生产时不安装(实际不焊接的器件用NC表示)。

用户LED使用GPIO灌电流控制,当IO为低时LED点亮。

按键部分通过GPIO检测按键左侧电平实现,按键松开时为高电平,按下为低电平。这里未添加硬件消抖,需要软件实现。

红外发射管需要电流较大,因此通过一个GPIO控制NPN三极管来驱动红外LED,高电平时红外管导通。可以只焊接并使用一个LED,使用两个LED可以增强红外信号。

红外接收采用一体接收头HS0038,可以工作在3.3V电压下,使用一个GPIO来接收红外信号。

有源蜂鸣器也需要较大电流,和红外管一样采用三极管驱动,GPIO高电平时蜂鸣器发声。

数字显示采用两个4位7段数码管(共阴极,算上小数点其实是8段),并通过MAX7219芯片进行驱动。MAX7219最多提供8段8位显示,这里将MAX7219的段码A~DP按顺序同时连接两片数码管,用于显示每一位的内容。而MAX7219的数位(Digital)选择信号则分别连至两片数码管各公共端。

MAX7219通过SPI与树莓派相连,由于只需要控制不需要读取信息,DOUT可不接。芯片采用5V供电,严格意义上SPI应使用5V电平,经过树莓派的3.3V电平也可以正常控制,但建议设置电平转换电路。

最后是接口扩展排针,串接的100ohm电阻起限流保护作用。每个接口分别提供了3.3V电源和GND。

ICA HAT的PCB采用廉价的双面板(兔子生产10片PCB只需要50RMB),需要说明的是布局。

根据一般用户的使用习惯,数码管并排放置于板子的上部(最为醒目的位置),按键放在板子的右下角(惯用左手的朋友可放在左侧)。红外收发部分和IO接口整齐排列于四周板边以防止阻挡和方便接线。其他的如LED和蜂鸣器在板中间选择位置放置即可。

设计好的PCB文件可导出成光绘(Artwork)和钻孔(Drill)文件交予PCB厂商生产,国内的厂商一般也会接受Altium Designer和Protel格式的工程文件,但实际也是转成光绘来进行生产的。厂商同时会提供免费的测试,保证电路不出现短路等情况,下图为生产好的PCB:

PCB生产后是器件贴片焊接,如果是机器焊接就需要提供生产钢网用的助焊层(Solder mask)文件,和用于机器贴片的装配层(Assembly)文件.

这里由于器件简单量少,兔子采用手工焊接的方式。焊接时可先焊接难度较大引脚密集的贴片IC,然后焊接高度较低的贴片器件,最后焊接较高的直插器件。连接器和数码管可于最后焊接。下图为手工焊接完成的电路板,我们称之为PCBA:

需要注意的是,焊接完成后需要测试电路是否短路,特别是电源的短路,然后再上电测试。否则不但可能烧坏HAT板子,还有可能损坏树莓派主板。

原文出处。

在树莓派2上安装 Windows 10

微软在2015年4月29日发布了树莓派玩家期待已久的 Windows 10 物联网核心预览版(Windows 10 IoT Core Insider Preview Image for Raspberry Pi 2)。

这是Windows首次登录树莓派,下面树莓派实验室为你介绍如何在树莓派2上安装Windows10。安装前请先确认你已经有一台运行着Windows10技术预览版的电脑。

需要准备的东西

1.一台已经安装了Windows10技术预览版的电脑

2.树莓派2

3.5V的 micro USB 充电器,至少支持1A电流,推荐2A

4.一张8G Class 10(或更高)的 micro SD 卡,推荐这种

5.HDMI 线,如果你需要接显示器的话

6.网线

将 Windows 10 物联网核心预览版写入SD卡

微软提供了一个工具来将Windows10安装到SD卡上,以下的步骤需要在Windows10系统 (build 10069 或更新)下运行。

按照下面的说明配置你的SD卡:

1.注意:请一定在物理机器上完成,不要使用虚拟机,因为你需要将要使用到SD卡读卡器。

2.下载 Windows_IoT_Core_RPI2_BUILD.zip(选择 Windows_IoT_Core_RPI2_BUILD.zip 下载),在本地解压后将其中的 flash.ffu 文件保存在电脑上。也可以去微软官网下载,不过需要完成一些登记才会出现下载选项。

3.插入SD卡到读卡器。

4.打开管理员命令行提示符,使用 cd 命令切换到 flash.ffu 文件所在的目录。

5.找到SD卡对应的磁盘编号,后面要用到。你可以在命令提示符下面运行这几个命令看到:

diskpart list disk exit

6.使用命令提示符将系统镜像写入到你的SD卡,可以使用如下命令(一定要和上一步找到的磁盘编号一致,例如你的SD卡编号为3,那么下面使用 /ApplyDrive:\\.\PhysicalDrive3):

dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck

7.再点击任务栏上 “安全移除硬件” 的图标,将SD卡安全移除。如果不这样做系统镜像可能会被损坏。

启动你的树莓派

1.插入经过上面的步骤写好了系统的micro SD卡。

2.通过树莓派主板的网口连接网线。

3.连接HDMI视频线。

4.连接 micro USB 充电器。

启动 Windows 10 物联网核心预览版

1.Windows 10 物联网核心预览版将在上电后自动启动。

2.在首次启动系统的时候,系统需要进行一些配置,配置期间会显示一个蓝色背景的程序,等待几分钟之后树莓派会自动启动。然后系统将进入默认应用,显示树莓派2的IP地址。

3.按照这个说明使用 PowerShell 连接到树莓派

4.建议修改默认的管理员密码,请遵照PowerShell的说明文档。

5.远程调试器会在树莓派2启动时自动运行。

树莓派 Windows10 IoT Core 开发教程

入门指引

现在让我们把LED连接到安装了Windows10 IoT Core 的硬件设备,并创建一个应用程序来让它们闪烁。

在Visual Studio中加载工程

首先在这里找到例程,这里有C++和C#的版本可供选择。本教程仅介绍使用C#的版本。将工程文件夹拷贝到磁盘中,然后用Visual Studio打开。

然后检查你的Windows IoT设备,确保打开了远程调试功能(Remote Debugging),可以参考这里的Hello World程序。

请注意如果Windows 10找不到可用的GPIO接口,应用程序将不会工作。比如你将windows10安装在了VM虚拟机中。

将LED连接到 Windows 10 设备

准备好下面的东西:

一个LED灯

一个阻值220欧姆电阻

若干杜邦线和面包板

将LED的负极连接到Raspberry Pi2的GPIO 5引脚(Board编号29),正极串联嗲足后连接到3.3v电源。(请务必注意极性,在直插型封装的LED中,较长的引脚是正极+,较短的引脚是负极-)

部署应用程序

对于Raspberry Pi2来说,应该在architecture的下拉菜单中选择ARM。

以上的步骤都做好了以后。可以按下F5,程序会自动运行,然后就可以看到闪烁的LED和下面的模拟界面。

可以通过改变滑块的位置来调整LED闪烁的有效时间

代码详解

下面就是这个程序的代码,基本工作原理是当定时器的时间达到后,调用事件Tick改变LED的状态。

定时器代码

这里是设置定时器的C#代码

public MainPage() { // … this.timer = new DispatcherTimer(); this.timer.Interval = TimeSpan.FromMilliseconds(500); this.timer.Tick += Timer_Tick; this.timer.Start(); // … } private void Timer_Tick(object sender, object e) { FlipLED(); }

初始化GPIO引脚

为了能够驱动GPIO,首先需要对它进行初始化,这里是初始化程序的C#代码

using Windows.Devices.Gpio; private void InitGPIO() { var gpio = GpioController.GetDefault(); // Show an error if there is no GPIO controller if (gpio == null) { pin = null; GpioStatus.Text = “There is no GPIO controller on this device.”; return; } pin = gpio.OpenPin(LED_PIN); // Show an error if the pin wasn’t initialized properly if (pin == null) { GpioStatus.Text = “There were problems initializing the GPIO pin.”; return; } pin.Write(GpioPinValue.High); pin.SetDriveMode(GpioPinDriveMode.Output); GpioStatus.Text = “GPIO pin initialized correctly.”; }

简单的解释就是:

~首先,使用GpioController.GetDefault()获取GPIO控制权限

~如果设备不具有可用的GPIO资源,则返回null

~接下来通过调用GpioController.OpenPin()函数来打开GPIO引脚

~当我们获取了GPIO的控制权限并打开了GPIO引脚后,使用GpioPin.Write()函数来将LED关闭(参数设置High)

~这里还使用了GpioPin.SetDriveMode()函数将GPIO引脚的工作模式设置为输出模式。

改变GPIO引脚的状态

使用GpioPinValue.Low参数打开LED:

this.pin.Write(GpioPinValue.Low);

使用GpioPinValue.High参数关闭LED:

this.pin.Write(GpioPinValue.High);

因为我们将LED的正极连接到了3.3V电源,所以这里通过将GPIO引脚置低电平来打开LED。

比树莓派还便宜,这部电脑只要 9 美元

35 美元的树莓派已经够亲民了,现在又有一家公司要刷新“底线”。Next Thing Co.,这家美国创业团队日前发布一款比树莓派还便宜的微型电脑 CHIP,售价为 9 美元。

CHIP 具有普通电脑的所有基本功能:连接显示器和键盘后,可进行文档处理、收发邮件、上网、编程等操作,此外其还能与游戏机配对连接变成一台游戏机,或与特定的口袋键盘加屏幕的套装 PocketCHIP,组合成一个类似智能手机的小型移动电脑。

功能上 CHIP 与树莓派差不多,同时也都是开源硬件,支持开发者和创客们基于这个微型电脑发挥更多玩法。不过低价的 CHIP 在配置方面则与树莓派不同:高过 Raspberry Pi B+,但不敌树莓派最新版,可搭载 Windows 10 的 Raspberry Pi 2。

CHIP,搭载 1GHz 主频 Allwinner A13 处理器,512MB RAM,4GB ROM,不支持扩张卡。一个全尺寸 USB 接口,一个 microUSB 接口。内置 Wi-Fi 和蓝牙 4.0 模块,且预装了编程、游戏、浏览器和办公应用。CHIP 可运行基于 Linux 的各种操纵系统。

Raspberry Pi 2 ,搭载 900MHz 主频四核 ARM Cortex-A7 处理器,1GB RAM,拥有两个全尺寸 USB 接口、一个 microUSB 接口和一个全尺寸 HDMI 接口。除了运行 Linux,Raspberry Pi 2 还可搭载微软最新的 windows 10 系统。

一开始树莓派的出现是为激励儿童学习编程和计算机知识,后来其逐渐受到计算机发烧友和创客的追捧。有意思的是,推出 CHIP 的公司 Next Thing Co. 原本就是专门“捣鼓”树莓派的,他们创造过基于树莓派的相机 OTTO,给树莓派提供电源、Wi-Fi和蓝牙等支持的 STAK。

不过,树莓派体积相对较大,不太适合发展成为产品。树莓派创始人 Eben Upton 也曾在接受爱范儿采访时提到过他们在面对工业级产品需求时需要专门设计开发体积更小的“计算模块”。而更注重微型电脑实用性的 Next Thing Co. 则尽量缩小了 CHIP 的体积以便未来有更多实际用途。

就目前来看,随 CHIP 一起推出的 PocketCHIP 就是 Next Thing Co. 对微型电脑实用性的初探。PocketCHIP 在 CHIP 的基础上配备了一块 4.3 英寸显示屏和一个 QWERTY 键盘。Next Thing Co. 称,PocketCHIP 是个装在裤兜里的电脑,这比前些日子开发者利用树莓派 DIY 出来的手机 “TyPhone” 看起来要轻便很多。

如今 Next Thing Co. 没有再在树莓派基础上做产品,而是直接创造出属于自己的微型电脑 CHIP,看来这个公司未来的玩法是要抛弃树莓派专门围绕自家的 CHIP 来展开了?

国产百元“树莓派”龙芯开源主板

3月底的时候,新一代北斗导航卫星发射成功。据了解,此次北斗卫星部件的国产化率达95%,其中最核心的元器件要数龙芯1E和龙芯1F,前者负责常规运算,后者完成数据采集、开关控制、通讯等。

作为与龙芯1E同源的龙芯1C,其集成了主频300MHz的LS232双发射处理器。而现在,搭载1C的首款开源嵌入式主板也正式抵达消费者手中。

据悉,该主板拥有网口、USB口、SD卡槽等,可以运行嵌入式Linux、RT-Thread等操作系统,定位在为IT人士提供网络通讯、物联网、智能硬件的开发平台,售价199元。

也许这就是龙芯爱好者以“最便宜的方式推动发展”的路子吧。

树莓派 SAKS 扩展板挑战应用 之 站点宕机指示

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

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

本节介绍通过 SAKS 扩展板的 LED 指示任意网站的可访问状况。如果你有一个自己的网站或者博客,确保它能够在任何时候都能正常访问是很有必要的。当被监测的网站无法访问或者发生错误时,红色或黄色 LED 亮起,而当网站能正常访问时,绿色指示灯亮起。

本例程中涉及到的 SAKS 扩展板引脚编号如下:

功能 注释 BOARD

编码 BCM

编码 wiringPi

编码 LED排灯 LED-D7 第6个LED(绿) 28 1 31 LED-D8 第7个LED(黄) 26 7 11 LED-D9 第8个LED(红) 24 8 10

站点无法访问通常是因为:

1.服务器故障,Web 服务进程无法正常响应。此时无法获得任何请求响应。

2.服务器程序出错,Web 服务经常可以正常响应。此时可以获得请求的错误信息。

3.服务器或监测程序没有接入网络,或两者之间网络出现故障。

上述3种情况中,1、3均表现为请求超时或请求被拒绝,此时我们希望红色 LED 亮起提示管理员宕机。情况2通过错误代码可判断无法访问的具体原因,此情况下我们亮起黄色 LED 提示管理员需要排除错误。(实际上还可以根据需要,将请求返回的错误代码编号通过 SAKS 扩展板的数码管显示出来。)

以下程序代码将对预先设定的网址周期性进行监测,通过发送 HTTP 请求尝试获得应答。并对应答的结果来指示状态。

# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time import urllib2 import socket GPIO.setmode(GPIO.BCM) # 输出模式 GPIO.setup(1, GPIO.OUT) GPIO.setup(7, GPIO.OUT) GPIO.setup(8, GPIO.OUT) # 要检测的网址 url = “https://shumeipai.nxez.com/” # 设置超时时间10秒 urllib2.socket.setdefaulttimeout(10) # 初始化状态 status = 0 # 检测频率间隔 interval = 60 def check(): global status try: response = urllib2.urlopen(url) if response.code == 200: status = 200 except urllib2.HTTPError, e: if e.code == 500 or e.code == 404 or e.code == 403: status = e.code else: status = 0 except urllib2.URLError, e: print e status = 0 finally: print status while True: check() #正常状态,绿灯亮 if status == 200: GPIO.output(1, GPIO.LOW) GPIO.output(7, GPIO.HIGH) GPIO.output(8, GPIO.HIGH) #异常状态,黄灯亮 elif status == 500 or status == 404 or status == 403: GPIO.output(1, GPIO.HIGH) GPIO.output(7, GPIO.LOW) GPIO.output(8, GPIO.HIGH) #错误状态,红灯亮 else: GPIO.output(1, GPIO.HIGH) GPIO.output(7, GPIO.HIGH) GPIO.output(8, GPIO.LOW) time.sleep(interval)

以上代码保存为 sitecheck.py,接下来运行。

sudo python sitecheck.py

如果需要监测的网址数量是多个,可以对上面的代码进行完善。将轻触开关和数码管加入其中,数码管显示网址编号,而轻触开关切换当前指示网站的状态指示。

需要特别留意的是,当被检测的域名无法正常解析时,某些ISP会自作主张地返回一个200状态(通常是类似114的页面),这种情况下程序对站点可访问性的判断可能会受到影响,请根据您的ISP特征添加必要的逻辑判断。

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

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