树莓派学习使用入门资料整理 – Raspberry PI

关于[Python],人生苦短,我用python

Python2.x 与Python3.x 存在严重的兼容性问题

关于opencv

OpenCV 编程简介(矩阵/图像/视频的基本读写操作)
Emgu cv Tutorial

关于Linux学习

关于树莓派

树莓派入门指南
用python让树莓派说话
树莓派吧
树莓派官方社区Python讨论版
极客工仿树莓派板块
树莓派中文站
Mike’s Electric Stuff 查设备sheet
树莓派I2C接口扩展
树莓派GPIO使用
探索Wiring Pi
Wiringpi.com 官网
Café
AllDatasheet
Search Datasheet
Handbook of hardware schemes, cables layouts and connectors pinouts
All Pinouts
AdaFruit
Asterisk搭建VoIP
树莓派学习索引

修复fs解决树莓派系统损坏无法启动,错误信息:unable to mount root fs on unkown-block

树莓派(这个网站)最近的一次瘫痪发生在上周三晚上(大概九点以后),直到昨天晚上周一(大概九点以后)才恢复访问。持续时间已经可以用天算了,中间没有及时的去修复解决,记录一下整个过程。

其中各种罗里吧嗦,不感兴趣的可以直接锚点过去,开始修复

当时是在修一个LED头灯(折腾),树莓派的GPIO连接到了面包板上,来来回回试验头灯的LED板接线。结果树莓派连续闪了几次红灯之后(连续短路,可能有电路回流),ssh失去连接,当时网络灯还亮着,几次ssh之后都连接不上,于是我拔掉了树莓派的电源又重新插上,结果派就只亮电源灯了(This is a terrible mistake)。

心想这下坏了,板子烧了,当时就是这种想法。但又记得树莓派好像有类似过载保护的芯片(自恢复保险丝),这种情况是不是会避免掉呢,于是各种百度,了解到的一个事实是:”树莓派的自恢复保险丝可能没有想象中的那么可靠(主要是针对国产板子说的吧),即使能恢复,也可能需要48小时甚至72小时,有时等多久也恢复不“。看到这个貌似稍微舒坦了一点,感觉好像还有希望。但是手头既没有显示器电视等输出设备,也没有USB转TTL线,怀着无比纠结的心情,睡觉了。

第二天下班回来继续百度,如果是保险丝坏了,是不是可以自己换个呢,于是各种1688,电子件采购论坛,由于不清楚规格,焊接等的条件,这个也就没有继续下去。自恢复保险丝恢复了没?怀着忐忑的心情给树莓派接上电源,结果还是电源灯亮。第三天下班回来又试了一次,还是这样。

中间的碎片时间也会思考,树莓派是不是真完了,但是也没看着冒火花闻着烧焦味儿啊,真是硬件出问题了?会不会是软件,首先得确认这个。于是周六回家的时候,带上树莓派、HDMI线、无线键鼠回家了。回家之后连上电视,开机不到一秒钟,出现的画面:

树莓派开机文件系统出错截图
树莓派开机文件系统出错截图

而且键盘还没有反应,应该是还没启动到加载驱动的位置吧。

心想这下爽了,板子没问题,不过是系统坏了。最次的情况是重新烧系统。

但是辛辛苦苦攒下来的东西就没了,这个我是非常难以接受的,虽然访问量不大,也不盈利,怎么说也是近一年时间积攒的经验全都没了,接受不了。

于是想到求助,拍了张照片存了下来(iPhone的像素怎如此渣,好在能依稀辨别错误信息:unable to mount root fs on unkown-block,不能在未知块上挂载root文件系统)。

昨天上班上班第一件事(为什么不是前天晚上,驱了一路车有点累了,早上都没赶上班车)就是发帖求助,树莓派吧segmentfaultgeek-workshop都发布了,只希望有更多的大神看到小白的求助。

然后晚上收到大神们的回复,先感谢一下。

开始修复

其实基本流程我是清楚的(只不过没有实践经验),系统坏了,要么是引导坏了,要么是文件损坏。需要将SD卡挂载到linux系统,如果能识别,就把文件拷贝出来,该重做系统就重做系统(其中又少不了一番折腾)。

于是(好在有个debian)SD卡插上debian,debian自动挂载了两个文件系统,boot和7.9G文件系统,boot打开之后里面有两个img文件,使用ext2fs读不出来(现在还是没弄明白它是干什么的),还是感谢@fyplus(来自geek-workshop)大神。而7.9G文件系统则挂载失败,提示错误:

wrong fs type, bad option, bad superblock on /dev/sda1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog – try
dmesg | tail  or so

自动挂载失败,手动挂载也失败。等等,bad superblock on /dev/sda1,什么是superblock
百度了之后有点明白了,于是又度娘“superblock 修复”,找到了一些文章,提及到的是使用fsck修复superblock。

例如这篇文章,而我的sd卡是ext4格式,所以我使用的命令是

fsck -t ext4 /dev/sdb2

如图:

fsck修复文件系统结果截图
fsck修复文件系统结果截图

提示修复完成,但仍有错误,一看debian已经把有错误的7.9G文件系统挂载上了,打开一看正是linux的系统文件夹:dev var etc mnt usr var srv(我自己建立的,我太爱你们了),我次奥这是不是好了呢,插上sd卡,接通电源,闪了几下,插上网线,ssh pi@192.168.1.104 回车密码,YES!!!

至此,网站又恢复了访问:https://lison.cc
真是好事多磨,一拨又三折呀。

感谢百度贴吧:@qijionly @xiaohuozi88888
geek-workshop: @fyplus @软件-蹄飞
segmentfault: @沙渺 @RobinTang @Simple4Wan

挂载sd卡参考:
http://blog.csdn.net/leo115/article/details/7697886

其他参考内容:
Repair a broken SD card “superblock” on a #RaspberryPi
linux文件系统问题:wrong fs type, bad option, bad superblock
SuperBlock损坏修复

 

顺带解决一个问题:Google Fonts拖慢WordPress访问速度。

这个问题也是困扰了我好久,但我粗暴的把它归结为我的硬件与网络条件问题,因为使用的是电信家庭网、加上渣路由,还有树莓派的处理速度。之前知道有这个问题,不知道当时忙了还是怎么样,没放在心上,直到今天三番五次的打不开文章编辑页面,于是firebug了一下,发现原来我的wp也在连接Google fonts,于是照着这篇文章,给办了。
http://devework.com/google-fonts-in-wordpress.html

debian安装google-chrome

还是简单的记录下吧,两天前刚装的今天又忘了。

1.首先得到*.deb的压缩包,无论是从google.com还是google.com.hk。其实比较靠谱的还是:

2. 执行安装命令

3.如果有遇到错误提示,直接执行以下命令来安装chrome浏览器需要的类库。

 

文章出自:www.freehao123.com/linux-chrome/ 免费资源部落

记 · 真机安装Debian7

有废旧电脑一只,屏幕边上的塑料磕掉了一块,电池再也充不进电,喇叭还呲呲响,不过重要的是:还能用!!!

方正OEM的外国垃圾(都怪我年幼不懂事)。1G内存,1.几GHz的奔腾CPU,160G硬盘,好像还独立显卡。这个配置运行个Debian7应该木有问题,于是乎,开搞吧。

目的:
旧电脑搞起来,要搞就搞大的,搞起来搞起来~~~。
之前一直使用虚拟机下运行eclipse(学点安卓),为什么,因为我喜欢linux。linux+ADT+Git,一切都在学习摸索中前进。

然后:
就是装系统了,手头上没有空的DVD盘(有也不想刻啦),于是找来U盘开搞,把U盘给引导了,iso文件写进去,用到了这个工具:Universal-USB-Installer,选择要写入镜像的盘符,千万别选错了,后果你知道的,然后选择要写入的iso文件路径,确定之后一切就那么开始了。

其他的不多记录了,windows下的东西用起来都比较方便的。

然后我使用的Debian是这个debian-7.6.0-i386-netinst

安装的过程也比较简单,高人们说安装的时候尽量选英文,不选择更新系统,其他的等装完系统再说。

而我在最后选择服务器类型的时候,选择了webserver和database server之后,告诉我剩余安装时间为1dxxhhxxMM,当时就想哭了。。。没办法只好睡觉时候开着机器,第二天早上起来看看才装完。

来张图吧,最近no pic you say ge jb挺火啊。。。

真机安装debian过程

可以看到当时天还没黑呢。。。

折腾过的东西备忘一下,省得下次遇到了还翻来覆去的问度娘,有时候度娘不是那么友好的,比如我问:我有一台电脑,想安装debian7,怎么安装,想必不会得到满意的答案。而如果我问:U盘安装linux,可能还需要做一下筛选才能找到答案。

好吧,ARTIFICIAL INTELLIGENCE时代什么时候来临,你快控制我把,GPU;或者:你快GC我吧,HOST。

Raspberry Pi 树莓派GPIO学习 – 控制家用电灯

如果不是那天偶然看到有位盆友在炫耀他的新技能:用树莓派通过Java实现远程控制电灯,上次购置折腾系列配件的时候也不会多买一个继电器,ok,既然买了,就把他折腾起来。

目的:
用程序控制家用灯泡,好像很酷的样子。

准备材料:
1. 树莓派一只
2. 5V低电平继电器扩展版
3. 家用灯泡一只
4. 公对母杜邦线三根
5. 面包板一块(可无)
6. 普通电线一段,用于连接灯泡

先来张图树莓派、面包板、继电器连接图

原理图是很简单的,继电器扩展版上低电端有三个引脚,分别是VCC、GND、IN,名词解释为:电源,接地,输入引脚。

简单的连线图(Fritzing还不会用):

树莓派连接5V低电平继电器示意图

所用继电器扩展版

继电器针脚接线图

VCC接树莓派5V针脚(红色)
GND 接树莓派GND针脚(棕色)
IN接树莓派GPIO25,或者其他的GPIO也可以,只要与程序控制的pin脚是一致的(橙色)

红色、棕色、橙色的杜邦线接法与下图“面包板接线图”是一致的

接好之后继电器扩展版的电源灯是亮的(红色LED)

继电器正面图这是继电器的玉照,有必要说明一下三个端点,常开、公共、常闭。

常开,正常状态为开路(开路即断开的),通电后关闭(连通)
公共端,顾名思义
常闭,正常状态为闭合(连通状态),通电后断开(开路)

因此,继电器是没有正负极之分,正负极可以任意接在常开或常闭,是否有电流通过取决于当前低电端给予的电平情况。

PS:接入家用电之后,强电端与继电器扩展版底部都是有电的,需谨慎操作,不幸的我就被电过一次,所以折腾的时候请小心。

再来张面包板的接线图:

面包板PIN接线图

很简单,没什么多说的,关于上图中针脚p*与GPIO对应关系,参考这里的关系图:https://lison.cc/?p=54

 

最终要实现的开关效果并不是带有ON/OFF的那种,往上按开,往下按关,而是类似电脑的开机键,按一下开,再按一下关。(有谁知道这种开关专业名称叫什么,老师说过,不过我忘了)

具体实现原理是读取GPIO针脚的电平状态,如果高电,说明已经打开,此时需关闭;如果低电,说明已经关闭,此时需打开。

程序中没有用到循环,而是执行一次开,再执行一次关。

还是直接贴代码:

wiringPi控制电灯源码light.c

 

唯一注意一点是为GPIO口设置高低电平时需先设置pin的模式,INPUT/OUTPUT。

wiringPi的官方资料还是要仔细看看的。

再来个演示视频:

后记
视频最后没有录制完,最后使用手机安装ConnectBot,可以远程用putty连接树莓派,并执行sudo ./light,从而以另一种欺骗的方式实现手机远程智能家居,以后研究一下android做个app控制家用电器。

参考文章:
http://wiringpi.com/reference/core-functions/
http://cafe.miwor.com/SAH/12.html

树莓派编号引脚说明:
http://blog.csdn.net/jcdjx/article/details/41866219

 

树莓派获取主板温度并采用图标显示

记录今天在淅淅沥沥的小雨下宅了一天的,算是收获吧。

之前就看到有文章写道利用树莓派系统内置命令获取主板温度的方法,由于处于学习阶段,只是尝试了一下获取温度重定向到另外的输出文件就停止了,今天没事做,于是就戳了一下相关的功能。

目的:
获取树莓派主板的温度,并在页面上以图标的方式展现出来。

涉及知识:(都是入门级的)
linux进程与系统调用
linux下文件操作
文件描述表
进程标准输入、输出、重定向
jQuery+HighCharts图表插件

直接贴代码吧,搞完了剪头去。

#include<stdio.h>
#include<stdlib.h>
//默认执行的秒数
#define TIMES 60
//默认输出的文件路径
#define LOGFILE “temperature.log”
//第一个参数为执行的秒数
//第二个参数为重定向到新文件的路径(名称)
int main(int argc,char *argv[])
{
int times=TIMES;
FILE *f_log;
//初始化执行的次数
if(argv[1]!=NULL)
times=atoi(argv[1]);
//打开文件指针
if(argv[2]!=NULL)
f_log=fopen(argv[2],”a+”);
else
f_log=fopen(LOGFILE,”a+”);
//将默认输出管道重定向至文件指针,f_temp
dup2(fileno(f_log),1);
while(times>0)
{
//system调用系统文件,默认输出将重定向至文件指针指向的文件
//获取主板温度
system(“/opt/vc/bin/vcgencmd measure_temp”);
//获取系统时间
system(“date”);
printf(“%d\n”,times);
times–;
sleep(1);
}
//关闭文件指针
fclose(f_log);
return 0;
}
编译与调用:
make pi_temp && ./pi_temp 60 temperature2.log
参数解释:
60表示会执行60次,也就是60秒
temperature2.log 获取主板温度之后的数据将输出到此文件中
等待60秒之后,*.log中的内容看起来是这样的:(请自动忽略时间部分)

temp=45.5’C

Sat Apr 26 15:31:26 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:27 HKT 2014
temp=45.5’C
Sat Apr 26 15:31:28 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:29 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:30 HKT 2014
temp=44.9’C
Sat Apr 26 15:31:31 HKT 2014

把这些内容复制到:https://lison.cc/pi_temp/temp.html 这个页面的文本框中,点击提交按钮,图标会根据数据展示特定时间内的温度变化曲线,如图:

QQ截图20140426152944

后续:

1.既然能够获取主板温度,是不是也可以获取CPU温度等其他温度,如果可以的话,可以获取内容在同一图表进行展现。

2.既然能够获取这些温度,就可以外接风扇,监控温度,若超过设定值,自动开启风扇进行散热了,有时间再戳吧。

代码格式有点乱,直接来个图吧:

pi_temp.c源代码截图

 

改进版的代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>

//默认执行的秒数
#define TIMES 60

//默认输出的文件路径
#define LOGFILE “temperature.log”

//循环条件,传入-1将无限循环
#define LOOPCONDITION(x)(x==-1?1:x)

//显示错误信息并退出程序
void error(char *msg)
{
puts(msg);
exit(1);
}

/*
* argc 执行的秒数(次数)
* argv 重定向到新文件的路径(名称)
*/
int main(int argc,char *argv[])
{
int times;
FILE *f_log;

if(argc==1)
{
times=TIMES;
f_log=fopen(LOGFILE,”a+”);
}
else if(argc==2)
{
//初始化执行的次数
if(atoi(argv[1]))
times=atoi(argv[1]);
else
fopen(argv[1],”a+”);
}
else if(argc==3)
{
if(atoi(argv[1]))
times=atoi(argv[1]);
else
error(“Invalid times formate”);

f_log=fopen(argv[2],”a+”);
}
else
error(“Unkow argument format”);

//克隆当前进程,产生子进程
pid_t pid=fork();

if(pid==-1)
error(“Cannot fork process”);

//创建父子进程连接管道
int fd[2];
if(pipe(fd)==-1)
error(“Cannot create pipe”);

//子进程
if(!pid)
{
//关闭子进程的输入管道
close(fd[0]);

//将子进程的输出管道重定向到f_log的输入管道
dup2(fileno(f_log),1);
}

int status;
while(LOOPCONDITION(times))
{
//system调用系统文件,默认输出将重定向至文件指针指向的文件
//获取主板温度
system(“/opt/vc/bin/vcgencmd measure_temp”);

//获取系统时间
system(“date”);

times–;
sleep(1);
}

//关闭文件指针
fclose(f_log);

return 0;
}

Raspberry Pi 树莓派GPIO学习 – wiringPi控制LED灯闪烁

目的:
用树莓派点亮LED,并控制LED灯的亮与灭。

准备材料(如下图):
硬件:
LED灯一只
220欧姆电阻一只
树莓派一只
母对母杜邦线三根

树莓派控制LED灯准备材料

软件:
1.wiringPi,开源树莓派GPIO操作库,C语言版,安装方法:http://blog.csdn.net/xukai871105/article/details/17737005

今晚是第二次折腾树莓派的GPIO口,昨晚没搞定,因为完全没有仔细看wiringPi与GPIO对应图:9825bc315c6034a8f3056360ca13495408237668

举个栗子:

3.3v是树莓派26个针脚的第一个,6是GND口,1口+6口接通LED灯是亮的,这是普通的电流回路,但是无法通过高低电平控制,也就无法通过程序控制。可以看到上图中3.3v对应wiringPi Pin中都是“—“,姑且理解为不使用吧。而wiringPi的pin是从GPIO1开始的,上图中的第六行第五列,wiringPi是1,这个1就是程序可以控制高低电平的。这就是树莓派的GPIO与wiringPi的对应关系。

GPIO口的接线细节图

程序代码:
树莓派GPIO控制LED程序代码

编译运行,引用wiringPi库,位于/usr/local/lib:
gcc blink.c -o blink -lwiringPi
sudo ./blink

演示视频:

结论:

昨晚x宝来货,于是开始戳树莓派的GPIO口,正极接了3.3V,负极接了GND,灯亮了,很开心。但是wiringPi控制的digitalWrite却始终没反应,终了,搞不定,不能睡太晚,还要赶班车,于是便睡下了。
[ 是的,走马观花注定一事无成。]

what happen to my hostname (raspberry pi)

暂时找不到合适的标题,先这么地吧,反正你懂的。

事由:昨日,因故poweroff了pi(正常的),然后又poweron了,结果putty能连上,vncviewer打不开了。于是putty连上pi,执行vncserver,提示我:Syntax error:”(“。。。,具体的错误记不清了,有个fontpath之类的字眼。

WHY:没有修改vnc的什么配置,就是第一次安装的时候设置了密码,后来也没动它,至于是不是开启自启的也更不用管了。后来问了度娘很多次,终于在谷歌上找到了答案(具体链接地址找不着了):

正常情况下命令提示符是这样的:pi@raspberry ~ $

而当时我的命令提示符是这样的:pi@(none) ~ $

因此,可以敲入hostname查看当前的hostname到底是什么,如果有不对,可以执行 sudo vim /etc/hostname,当时可能是戳nginx的时候多加入了一行:lisonliou.gicp.net:8000,不好用之后也忘了去掉,结果导致今天这么多的问题:哎,我还要菜刀什么时候~~~

 

linux chmod 菜鸟命令改变文件夹权限

sudo chmod -cR 777 /srv/www/wordpress/public_html

选项:

-c 若已更改,显示变更记录,从xxx(权限码)变更到xxx(权限码)

R递归改写权限

完成之后可以使用:sudo ls -l /srv/www/wordpress/public_html查看修改情况。

刚才wordpress上传控件时提示没有权限,想只把pi用户增加写权限,结果搞得全站403 Forbidden,要不就File not found,所以暂时干脆来个777,关于权限的码目前还不是很清楚,chmod还没怎么用过,这里先记一下。