2月 05

raspberry pi 串口控制51单片机

  制作小车都用raspberry pi上的口有些麻烦,所以把一些基础控制给51单片机解决,raspberry pi控制高层应用。所以测试一下raspberry pi串口连接调试51单片机。
  第一步: 
sudo apt-get install python-serial
sudo easy_install pyserial

  第二部接线部分图
  raspberry pi板子串口接线图

raspberry 串口接线图1

raspberry 串口接线图1


  杜邦线连接
IMAG1302-1 
raspberry 串口接线图3

raspberry 串口接线图3

 

  代码部分
  raspberry pi python串口控制代码

#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------
# Filename:    
# Revision:    
# Date:        2013-02-5
# Author:      simonzhang
# Email:       simon-zzm@163.com
# WWW:         www.simonzhang.net
# -------------------------------
import serial
import time

#### 定义小灯亮灭初始值
i = 0 
#### 实例化串口
ser = serial.Serial('/dev/ttyAMA0', 9600, timeout = 0.5)
for j in range(10):
    if ser.isOpen() == False:
        ser.open()
    #### 每次循环对上值次取反
    if i == 0:
       i = 1
    else:
       i = 0
    #### 向串口发送字符
    ser.write(chr(i))
    #### 获取串口返回值
    #### linux为福阻塞模式,在阻塞模式下
    #### 会报错,所以抱起来就好了。
    try:
        re = ser.readlines()
    except:
        pass
    print re
    time.sleep(2)

  51单片机代码

#include 
#include 
typedef unsigned char uint8;
typedef unsigned int  uint16;


uint8 num;
sbit D0 = P0^0; 

void init()
{
	SCON = 0x50;
    TMOD = 0x20;

	TH1 = 0xFD;
	TL1 = 0xFD;
	TR1 = 1; //打开定时器
	ES  = 1;
	EA  = 1; //打开总开关
}

void interrupt_uart() interrupt 4
{
	if(TI)
	{
		TI = 0;
		REN = 1;
	}
	if(RI)
	{
		RI = 0;
		num = SBUF;	
		if (num == 1)
		{
			D0 = 0;
			SBUF = 0;
		}
		else
		{
			D0 = 1;
			SBUF =1;
		}
		REN = 0;
	}
}


main()
{
	init();
	while(1);
}

源码下载
raspberrypito51

2月 04

raspberry pi 开机wifi自动启动并发邮件通知(二)

比之前脚本添加了,测试公网IP的函数。
def get_global_ip():
get_html = urllib2.urlopen(‘http://iframe.ip138.com/ic.asp’).read()
_re_ip = re.compile(r’\d{2,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’, re.DOTALL)
_global_ip = _re_ip.findall(get_html)[0]
return _global_ip

代码下载NotificationIP.py

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元

12月 29

raspberry pi 上使用 lazarus

  安装lazarus。
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y fpc
$ sudo apt-get install -y lazarus

  十几分钟的等待,安装完毕。图形化界面下,programming中已经看到图标。开启lazarus,和delphi 7基本上是一样的。
  先拉了一个lable和button,电机button在lable中显示hello simonzhang.net。然后编译、执行,程序运行成功。
  存在的问题是,编译速度非常慢没发和delphi7 比。编译出的文件也很大,就这一个小测试程序文件就16M多。程序运行速度也不是很快。
  总结:由于之前用的是delphi7,所以用着东西做图形化的界面速度应该很快,直接将python代码前进去执行就比较方便了。也只限于测试。

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超声波测距