1月 29

CentOS 下收集CPU温度

  服务器自动重启,怀疑与温度过高有关。直接检测cpu温度,等重启后,查看是否温度问题。
  操作系统CentOS 6.2 ,内核必须是6.22以上的。使用senosor。

# yum install -y lm_sensors
配置
# sensors-detect

载入模块
# modprobe coretemp

查看温度
# sensors
成功看到CPU温度。

用脚本放在crontab中循环跑,等重启了查查看是否温度过高。
#!/bin/sh
log=’/root/temperature.log’
get_data=`date +’%Y-%m-%d %k:%M’`
echo $get_data >> $log
echo `sensors` >> $log

1月 10

我的用 raspberry pi 手工制作的小车(一)

  首先切割了一块,20x20cm的2mm厚的亚克力板。也许是手磨速度问题,切割时比较粘刀,所以切得很不整齐。
image

  我用边角料给超声波测距模块做了个架子。
image

  底层方的东西还不是很多。包含TT电机和H桥驱动,步进电机驱动板,红外测距模块和接线板。

raspberry_pi_auto-1.jpg

我的raspberry pi小车下层。包含TT电机和H桥驱动,步进电机驱动板,红外测距模块。

  上层东西也不多,raspberry pi的板子占了一大块。剩下的摄像头,步进电机和超声波测距模块。

我的raspberry pi 小车的上层。包含步进电机,和raspberry pi的主板。

我的raspberry pi 小车的上层。包含步进电机,和raspberry pi的主板。

  来张正面照。摄像头拍的照片可以通过浏览器访问。

我的raspberry pi小车的正面照。

我的raspberry pi小车的正面照。

  当前程序已经测试完成,在桌子上跑问题也不大。但是存在一个问题。使用电池驱动时,程序一启动系统就重启了,应该是电压或电流不稳定。正在改进中。
  当前费用统计。

成本统计
产品名             数量    单价(元)   总价(元)
raspberry pi 2.0      1      341       341
2mm厚200x200mm 亚克力板   1      7        7
HC-SR04超声波测距模块    1      7.3       7.3
1/16 5V 4相 5线步进电机   1      5.8       5.8
五线四相步进电机驱动板    1      3.2       3.2
万向轮 尼龙轮子        1     4         4
TT马达+车轮套装        2     8.1       16.2
usb接口            1     1        1
SYB-170 面包板        1     2.8       2.8
两路H桥IO口电机驱动板     1     8        8
红外壁障模块          2     8        16
摄像头             1    利旧设备   0
总计:412.3

小配件大约数量
螺丝部分均为M3
6mm铜柱   12个
20mm铜柱  4个
15mm铜柱  4个
螺丝1mm   12个
螺丝10mm  2个
螺母    20个

线才大约数量
双母头杜邦线20CM  20根
双公头杜邦线20CM  10根
公母头杜邦线20CM  10根
排插端子      1组

小配件加线材大于25元

1月 08

python 连接hbase存、取图片

  连接hbase1.0.4需要使用Thrift,我用的是python2.6。
  安装thrift。下载地址https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.tar.gz解压后安装命令。
在hbase服务器上,确保hbase服务已经启动。在thrift目录中,用管理员运行一下命令安装。
./configure
make
make install

  安装完毕生成hbase的client代码命令格式如下,
thrift –gen
登陆到hbase的权限进入
$ cd hbase/src/main/resources/org/apache/hadoop/hbase/thrift

生成python的
$ thrift –gen py Hbase.thrift
再生成一个C的学习备用,与本文无关
$ thrift –gen c_glib Hbase.thrift

将gen-py文件夹下的hbase文件夹拷贝到要连接hbase的服务器的python目录下,我用的是python2.6,自己手动安装的。命令如下
cp -R hbase /usr/local/lib/python2.6/site-packages/

拷贝完毕用import导入 hbase成功。开始写代码了。参考hbase里的例子在hbase/src/examples/中。

  我的任务就是把某个目录下,以jpg结尾的图片放到hbase里,因为图片名没有重复,所以用图片名做row name。hbase手动建表’hbase(main):013:0> create ‘img’, ‘data:”。

  首先统计一下照片的数量。这个image目录下只有jpg的图片,使用匹配只是备将来使用。下面只是测试脚本,不关心业务逻辑。

# find /image/ -name \*.jpg -type f |wc -l
13140

# du -s -h /image
303M /image/

  本地共有13140张照片共303M,写入hbase测试脚本如下:

#!/bin/bash 
# -------------------------------
# Revision:
# Date:        2012-12-11 
# Author:      simonzhang 
# Email:       simon-zzm@163.com 
# Web:         www.simonzhang.net 
# -------------------------------

import os
import re

from thrift.transport import TSocket  
from thrift.transport import TTransport  
from thrift.protocol import TBinaryProtocol  
   
from hbase import Hbase  
from hbase.ttypes import *

#### base set
find_path=(r'/image/',
           )

class HbaseWrite():
    def __init__(self):
        self.tableName = 'img'
        self.transport = TSocket.TSocket('192.168.100.100', 9090)
        self.transport = TTransport.TBufferedTransport(self.transport)
        self.transport.open()
        self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
        self.client = Hbase.Client(self.protocol)

    def createTable(self, tableName):
        col1 = ColumnDescriptor(name="data:",maxVersions=1)
        self.client.createTable(tableName,[col1])

    def write(self, PicPath, PicName):
        row = PicName.split('.')[0]
        _data = PicName.split('.')[1]
        PicData = open('%s/%s' % (PicPath, PicName), 'rb').read()
        # 此处需要注意格式,网上的格式报错,少个参数报错如下
        # TypeError: mutateRow() takes exactly 5 arguments (4 given)
        self.client.mutateRow(self.tableName, row, [Mutation(column="data:%s" % _data, value=PicData)], {})

    def read(self, tableName, PicName):
        row = PicName.split('.')[0]
        data_type = PicName.split('.')[1]
        get_data = self.client.get(tableName, row, 'data:%s' % data_type, {})[0]
        if get_data:
            return get_data.value
        else:
            return "Error"


def main(_path):
    WHB = HbaseWrite()
    WHB.createTable()
    find_file=re.compile(r"^[0-9a-z]*.jpg$")
    find_walk=os.walk(_path)
    for path,dirs,files in find_walk:
        for f in files:
            if find_file.search(f):
                path_name=path
                file_name=f
                WHB.write(path_name, file_name)


if __name__ == "__main__":
    for get_path in find_path:
        main(get_path)

开始测试脚本
# time python hbase_test.py

real 1m15.471s
user 0m4.881s
sys 0m2.867s

到hbase里查看写入的数量,证明已经完全写入。
hbase(main):001:0> count ‘img’
:
:
:
13140 row(s) in 10.2780 seconds

2013-5-16. 因为对hadoop理解不足。以下写的有问题,提醒大家注意。

hbase使用hadoop进行存储,查看hadoop的磁盘使用量。
26K namenode1/
298M u01/

  我的内存给namenode可以使用25G。根据以上数据计算结果如下:
((25*1000*1000)/26)*298= 286538461M = 286538G = 286 T

  如果每台服务器有三块1T存储硬盘,此集群可以有95台服务器。共存储此类照片大约为12634615360张。内网测试,写入速度3.9M。

  注:有一点需要注意,写入的数据删除后磁盘空间也不会释放,原理应该改和mongodb一样,但是没有仔细查看。

12月 25

PL2303 烧录 STC12C5A60S2单片机

  买了51最小的单片机和PL2303的烧录线。安装驱动没有问题,我安装在win7上操作。
  烧录程序过程:
  先安装驱动。先连好VCC(红线)、RXD(绿线)、TXD(白线)、GND(黑线),接好usb安装驱动。看到系统中有连接的com口。
image
  将红线拔掉,启动烧录程序。等到显示“仍在连接中, 请给 MCU 上电…”时将红线插上,就开始烧录了。
  如报错如下:

仍在连接中, 请给 MCU 上电…
MCU Type is: STC12C5A60S2
MCU Firmware Version: 6.2I
Chinese:MCU 固件版本号: 6.2I
下次冷启动后使用外部晶体或时钟
RESET pin 仍为 RESET
上电复位增加额外的复位延时振荡器放大增益: High gain
下次下载时 P1.0/P1.1 与下载无关
下次下载用户应用程序时将数据Flash区擦除: NO
P4.6/RESET2 用作 P4.6
启动内部看门狗后禁止改看门狗分频数 NO
下次上电自动用有关参数启动内部看门狗 NO
Idle(空闲)状态时内部看门狗停止计数 YES
冷启动后内部看门狗预分频数(未启动): 256
MCU Clock:11.07831MHz./时钟频率:11.07831M.
Chinese:正在重新连接 …
Connection failed. / 握手失败 (End: 12:03:54)

  解决方案需要将波特率都改为9600即可,如图。

PL2303烧录STC12C5A60S2单片机

PL2303烧录STC12C5A60S2单片机

  还需要注意两个地方。一、STC-ISP烧录软件使用管理员权限启动。二,烧录的时候不要给板子加电。芯片只连PL2303线即可。

12月 17

raspberry pi HC-SR04超声波测距

  所购买的HC-SR04的超声波模块介绍如下:
1、典型工作用电压:5V。
2、超小静态工作电流:小于 2mA。
3、感应角度:不大于 15 度 。
4、探测距离:2cm-400cm
5、高精度:可达 0.3cm。
6、盲区(2cm)超近。

  实测raspberry pi电压4.7V。所以直接测试一下,但是需要获取系统时间和系统处理耗时,测试结果精度不高,可以区三次平均数。

  接线如图:
image

  代码如下:

#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------
# Revision:
# Date:        2012-12-11
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# ------------------------------- 
import time
import RPi.GPIO as GPIO
import datetime as dt

# 初始化
# 需要注意输出与输入的接口
# 17为发射,18为接收
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.IN)
GPIO.output(17, False)

while  1:
   time.sleep(1)
   # IO 触发,给10us的高电平
   # 模块自动发送8个40khz的方波
   GPIO.output(17, GPIO.HIGH)
   time.sleep(0.00001)
   GPIO.output(17, GPIO.LOW)
   # 获取发射完毕时间
   t1 = time.time()
   # 未接收为False,循环检查开始接受点
   # 转为True为开始接受
   while GPIO.input(18) == False:
       pass
   # 循环检查开始接收,转为False。则为接受完毕
   while GPIO.input(18):
       pass
   # 获取接受完毕时间
   t2 = time.time()
   # 计算发送与接收时间差
   t3 = t2-t1
   print t3
   # 空气中1个标准大气压在温度15度时速度为340m/s
   # 25度为346m/s
   # 所以按照一秒钟34000厘米计算
   # 根据硬件文档,该模块探测距离在2-400cm之间
   # 测试范围的时间间隔应该为0.000117到0.023529
   # 为了方便取值自行变化一点
   if 0.0235 > t3 > 0.00015:
       distance = t3*34000/2
       print 'Distance: %f cm' % distance
   else:
       print 'Null'

raspberry pi HC-SR04超声波测距