这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【chronos】树莓派DIY进程 - 更新【实验番外篇】任务四:基于树莓派的网

共41条 2/5 1 2 3 4 5 跳转至
菜鸟
2014-09-06 14:05:12     打赏
11楼

10楼的方案主要还是串口调试,真正实现用串口传递数据还是需要编写代码的。学习了一下xukai871105的那个“UART使用”的博客,试了一下,也成功了。

代码如下:

import serial
import time

ser = serial.Serial("/dev/ttyAMA0",baudrate=9600,bytesize=8,parity='N',stopbits=1,xonxoff=0,timeout=1)

def main():
        while True:
                count = ser.inWaiting()
                if count != 0:
                        recv = ser.read(count)
                        print recv
                        ser.write(recv+" test!\n")

                ser.flushInput()
                time.sleep(0.1)

if __name__ == '__main__':
        try:
                main()

        except KeyboardInterrupt:
                if ser != None:
                        ser.close()

 




博客传送门-->


菜鸟
2014-09-06 14:27:46     打赏
12楼

在更新基础实验5之前还是完善我的WIFI问题吧……对于经常公司、家里两地使用RPi的我来说,还是配置好多个WIFI自动连接的好!

配置/etc/network/interfaces

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet static
address 192.168.1.111
netmask 255.255.255.0
gateway 192.168.1.1

配置/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
  ssid="CHRONOS"
  scan_ssid=1
  psk="very secret passphrase"
  priority=5
}

network={
  ssid="Netcore"
  scan_ssid=1
  psk="very secret passphrase"
  priority=2
}

tips:1、scan_ssid=1  对特定的SSID进行扫描

         2、priority=5  优先级越高,就能越早匹配到


菜鸟
2014-09-07 14:37:30     打赏
13楼

任务五:【基础实验】(5)网络连接实验

实际上,网络连接实验在之前的任务中已经涉及到了,所以在这个任务中想把一直都很感兴趣的Yeelink尝试一下,配合手中的小风扇和继电器(三极管驱动也行),给RPi做个简单的温控装置,并在Yeelink上观察温度变化。

工具:小风扇,继电器模块,去Yeelink上注册一个账户,并添加一个传感器(相关内容大家到网上找一下吧,我就不啰嗦啦)

参考资料传送门-->

1、新建python脚本和result.txt,用来编写代码和存储温度记录

每3分钟检测一次温度,并上传至Yeelink,如果温度高于40度则启动风扇,代码如下:

#!/usr/bin/env python  
# -*- coding: utf-8 -*-  
import requests  
import json  
import time
import RPi.GPIO as GPIO
  
def main(): 
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(12,GPIO.OUT)
 
    fileRecord = open("result.txt", "w")  
    fileRecord.write("connect to yeelink\n");  
    fileRecord.close()  
    while True:  
        # 打开文件  
        file = open("/sys/class/thermal/thermal_zone0/temp")  
        # 读取结果,并转换为浮点数  
        temp = float(file.read()) / 1000  
        # 关闭文件  
        file.close() 
        	
        # 控制继电器,CPU温度高于40度时,吸合,启动风扇
        if temp > 40 :
            GPIO.output(12,GPIO.LOW)
        else:
            GPIO.output(12,GPIO.HIGH)
  
        # 设备URI  
        apiurl = 'http://api.yeelink.net/v1.0/device/13938/sensor/23142/datapoints'  
        # 用户密码, 指定上传编码为JSON格式  
        apiheaders = {'U-ApiKey': '888faf021ceb05c1f5f4039fcc10****', 'content-type': 'application/json'}  
        # 字典类型数据,在post过程中被json.dumps转换为JSON格式字符串  
        payload = {'value': temp}  
        #发送请求  
        r = requests.post(apiurl, headers=apiheaders, data=json.dumps(payload))  
  
        # 向控制台打印结果  
        fileRecord = open("result.txt", "a")  
        strTime = time.strftime('%Y-%m-%d:%H-%M-%S',time.localtime(time.time()))  
        fileRecord.writelines(strTime + "\n")  
        strTemp = "temp : %.1f" %temp + "\n"  
        fileRecord.writelines(strTemp)  
        fileRecord.writelines(str(r.status_code) + "\n")  
        fileRecord.close()  
          
        time.sleep(3*60)  
  
if __name__ == '__main__':  
    main()  

2、设置开机自动启动

新建脚本:auto-start.sh

#!/bin/bash
cd /home/pi/code/tempUL
python tempUL.py &

tips:& 表示脚本后台运行

切换到auto-start.sh所在目录,更改权限:

sudo chmod a+x auto-start.sh
修改/etc/rc.local,在exit 0之前增加一行
#!/bin/sh -e  
#  
# rc.local  
#  
# This script is executed at the end of each multiuser runlevel.  
# Make sure that the script will "exit 0" on success or any other  
# value on error.  
#  
# In order to enable or disable this script just change the execution  
# bits.  
#  
# By default this script does nothing.  
  
# Print the IP address  
_IP=$(hostname -I) || true  
if [ "$_IP" ]; then  
  printf "My IP address is %s\n" "$_IP"  
fi  
  
# 向yeelink上传树莓派CPU温度  
/home/pi/code/tempUL/auto-start.sh start
  
exit 0  

3、通过ps指令查看该脚本是否在后台运行

ps aux | grep tempUL.py

如果此时需要调试、更改代码,需要通过kill指令终止相关进程
kill -s 9 2220

4、重启,等待或干点儿别的(陪陪LP什么的^_^),之后我们来查看一下效果

中途我停了一会儿,看来还是有一定的效果的~~
5、总结

温度高低的设定还是要看实际的需求、工作的场合,以及降温系统的能力,希望这个温控装置的实验能给大家一个启发吧~~


配套的小风扇:SEPA MFB30A-05 DC 5V 0.2A

室温:25℃,待机半小时CPU在43℃左右,开启风扇10分钟后下降到33℃左右,数据供大家参考


mission accomplished!


菜鸟
2014-09-07 16:55:58     打赏
14楼

推荐一个FTP软件:FileZilla,RPi默认SSH是支持SFTP的,这样我们上传/下载/管理文件就方便多了,软件默认UTF-8编码

打开后输入主机IP地址:sftp://***.***.***.***,用户名和密码后直接点快速连接就OK啦!

建议使用root账户,以便获取相应目录的权限

软件传送门-->


菜鸟
2014-09-12 17:30:45     打赏
15楼

【实验番外篇】任务一:MY OLED~~启动I2C接口,驱动OLED屏

原计划其实是想驱动搁置了有一段时间了的ALIENTEK 2.8寸 TFT液晶屏,无奈LG的驱动IC兼容性上不知怎样,可能还需要一段时间才能搞定。还是先来移植一下手中的其他模块吧~~

最近一直强迫自己使用UBUNTU来调试RPi,才发现还是“同门”间好沟通啊,比在WINDOWS下操作还是方便啊~~

扯远啦。。。下面才是正题:

模块信息:OLED显示屏,128×64标准I2C接口

VCC --> 3V3

SDA --> GPIO02(SDA1, I2C)

SCL --> GPIO03(SCL1, I2C)

GND --> GND

   

(一)启动I2C接口

1、打开模块配置文件

sudo nano /etc/modules

添加如下两项内容

i2c-bcm2708
i2c-dev

安装python-smbus系统管理总线接口和I2C调试工具

sudo apt-get install python-smbus
sudo apt-get install i2c-tools

打开黑名单,把I2C放出来

sudo nano /etc/modprobe.d/raspi-blacklist.conf

将对应项目注释掉

然后,建议重启一下~~用lsmod指令查看一下驱动是否载入成功

使用i2cdetect -l指令查看树莓派上的I2C总线,树莓派1代使用的是I2C-0,树莓派2代使用的是I2C-1,后面编程时需要注意这点

使用i2cdetect -y 1指令扫描当前挂载的所有I2C从机,我的OLED屏默认地址是0x51,0x3b应该是RPi上的设备,UU代表设备忙


用i2cdump指令可以查看器件内部寄存器值,用法为i2cdump -y 总线号 设备地址,目前模块还没有开启,寄存器处于初始状态

PS:i2cget和i2cset指令:分别可以对寄存器进行获取和写入。用法为i2cget -y 总线号 设备地址 寄存器地址 模式和i2cset -y 总线号 设备地址 寄存器地址 数值 模式;模式默认为b(byte)即读取8bit数据,i2cget可用模式有b/w/c,i2cset可用模式有b/w/c/i/s,其中w为word(16bit),i和s分别为I2C和SMBUS的block数据。

2、代码移植及显示效果

这次依然用的还是python,新建了2个python脚本,一个用来存放显示代码,一个用来存放功能代码

显示代码如下:

# coding=utf-8
__author__ = 'chronos'
#!/usr/bin/python

import time
import oledFunc

# OLED I2C ADDRESS
oledaddress = 0x51

# OLED RESET
oledFunc.oledreset(oledaddress)
time.sleep(1)

#OLED DISPLAY STRING
oledFunc.oledstr(oledaddress, 0, 0, 'RaspberryPi DIY')
oledFunc.oledstr(oledaddress, 2, 0, ' CHRONOS OLED ')

while True:
    # 读取CPU温度信息
    file = open("/sys/class/thermal/thermal_zone0/temp")
    # 读取结果,并转换为浮点数
    temp = float(file.read()) / 1000
    # 关闭文件
    file.close()
    # 显示CPU温度及当前系统时间
    oledFunc.oledstr(oledaddress, 4, 0, 'CPU TEMP:'+str(temp))
    oledFunc.oledstr(oledaddress, 6, 0, time.strftime("%y-%m%d %X"))
    # 前两行文字向左滚动
    oledFunc.oledscrollhorizontal(oledaddress, oledFunc.SCROLL_LEFT, 0, 3, oledFunc.FRAMS_2)
    # 250ms更新一次
    time.sleep(0.25)

功能代码:

# coding=utf-8
__author__ = 'chronos'
#!/usr/bin/python

import smbus

# open /dev/i2c-1
bus = smbus.SMBus(1)

# OLED FUNC CMD
WRITE_OCMD = 0x01
WRITE_ODAT = 0x02
OLED_RESET = 0x03

DISP_8X16STR = 0x10
DISP_AREA = 0x11
FILL_AREA = 0x12
SET_SCROHOR = 0x13
SET_SCROVER = 0x14
SET_SCROVERHOR = 0x15

SET_ADDRESS = 0x21

PAGE0 = 0x00
PAGE1 = 0x01
PAGE2 = 0x02
PAGE3 = 0x03
PAGE4 = 0x04
PAGE5 = 0x05
PAGE6 = 0x06
PAGE7 = 0x07

SCROLL_UP = 0x01
SCROLL_DOWN = 0x00
SCROLL_RIGHT = 0x26
SCROLL_LEFT = 0x27
SCROLL_VR = 0x29
SCROLL_VL = 0x2A

FRAMS_2 = 0x07
FRAMS_3 = 0x04
FRAMS_4 = 0x05
FRAMS_5 = 0x00
FRAMS_25 = 0x06
FRAMS_64 = 0x01
FRAMS_128 = 0x02
FRAMS_256 = 0x03


# OLED RESET
# 函数功能 :模块复位
# 第1个参数:为模块的地址
def oledreset(addr):
    bus.write_byte(addr, OLED_RESET)


# OLED FILLAREA
# 函数功能 :在指定的范围填充指定的数据
# 第1个参数:为模块的地址
# 第2个参数:所要填充数据的起始页
# 第3个参数:所要填充数据的结束页
# 第4个参数:所要填充数据的起始列
# 第5个参数:所要填充数据的结束列
# 第6个参数:所要填充的数据
def oledfillarea(addr, spage, epage, scolumn, ecolumn, filldata):
    buff = [spage, epage, scolumn, ecolumn, filldata]
    bus.write_i2c_block_data(addr, FILL_AREA, buff)


# OLED DISPLAY STRING
# 函数功能 :在指定的地方开始显示指定点阵数据图英文字符串
# 第1个参数:为模块的地址
# 第2个参数:所要显示英文字符串的起始页
# 第3个参数:所要显示英文字符串的起始列
# 第4个参数:所要显示的英文字符串
def oledstr(addr, page, column, strs):
    buff = [page, column]
    lstr = map(ord, strs)
    buff.extend(lstr)
    bus.write_i2c_block_data(addr, DISP_8X16STR, buff)


# OLED Scroll Horizontal
# 函数功能 :指定区域显示的内容向左还是向右翻滚
# 第1个参数:为模块的地址
# 第2个参数:指定向左还是向右翻滚 SCROLL_LEFT SCROLL_RIGHT
# 第3个参数:要翻滚的起始页
# 第4个参数:要翻滚的结束页
# 第3个参数:翻滚帧
def oledscrollhorizontal(addr, lr, spage, epage, frames):
    buff = [lr, spage, epage, frames]
    bus.write_i2c_block_data(addr, SET_SCROHOR, buff)


# OLED Scroll Vertical
# 函数功能 :指定区域显示的内容向上翻或向下翻
# 第1个参数:为模块的地址
# 第2个参数:指定向上或者向下翻滚 SCROLL_UP SCROLL_DOWN
# 第3个参数:最上方翻滚起始行
# 第4个参数:最下方翻滚结束行
# 第3个参数:翻滚步数大小
# 第4个参数:翻滚快慢延时
def oledscrollvertical(addr, scrollupdown, rowsfixed, rowsscroll, scrollstep, stepdelay):
    buff = [scrollupdown, rowsfixed, rowsscroll, scrollstep, stepdelay]
    bus.write_i2c_block_data(addr, SET_SCROVER, buff)


# OLED Scroll Mixed
def oledscrollmixed(addr, fixedarea, scrollarea, vlr, spage, epage, frames, offset):
    buff = [fixedarea, scrollarea, vlr, spage, epage, frames, offset]
    bus.write_i2c_block_data(addr, SET_SCROVERHOR, buff)


# OLED Deactivate Scroll
# 函数功能 :显示的内容停止翻滚
# 第1个参数:为模块的地址
def oleddeactivatescroll(addr):
    bus.write_byte_data(addr, WRITE_OCMD, 0x2E)


# OLED Set Location
def oledsetlocation(addr, page, column):
    buff = [0xB0 | page, column % 16, column/16+0x10]
    bus.write_i2c_block_data(addr, WRITE_OCMD, buff)

上传视频,大家看看效果哈~~

http://v.youku.com/v_show/id_XNzgwNDM1NDc2.html


助工
2014-09-13 19:21:38     打赏
16楼
太强了,驱动需要自己写吗

菜鸟
2014-09-15 23:48:25     打赏
17楼
呵呵,过奖了啊~~这个OLED屏自带一部分基本的驱动,可以直接调用,其他的可以自己写,用起来挺方便的~~

菜鸟
2014-09-17 01:17:22     打赏
18楼

【实验番外篇】任务二:MY RADIO~~序:添加红外遥控器

好几天没更新了,最近进度有些慢,大部分时间都去忙标书了。。。

这个任务基本已经完善了(当然还可能存在个别BUG),作为使用部分必不可少的遥控器,这里单独拿出来写一下吧~~

!!上照片!!

材料:红外遥控器一个,红外接收管一个,10K电阻一个,0.1uF电容一个,1nF电容一个

电路:可以参考网上的相关资料,数据输出端我接在了GPIO25(Pin#22)上,lirc_rpi默认使用的是GPIO18(Pin#12),这个后面设置上需要更改成GPIO25

实验内容:添加红外遥控,同时实现遥控关机、重启、启动程序等功能

(一)添加红外遥控

1、安装lirc服务进程

sudo apt-get install lirc

2、加载lirc_rpi内核模块(注意更改为实际使用的GPIO

sudo modprobe lirc_rpi gpio_in_pin=25 gpio_out_pin=24

此时GPIO24被设置为红外载波输出,这里没有连接

3、先来测试一下红外接收是否正常

sudo mode2 -d /dev/lirc0

如果按遥控器上的键,屏幕上显示出一串pluse和space值的话,就基本OK啦~~

4、配置 /etc/lirc/hardware.conf 文件

...
LIRCD_ARGS="--uinput"
...
DRIVER="default"
...
DEVICE="/dev/lirc0"

5、识别记录遥控器上对应的按键

停止当前的lirc服务

sudo /etc/init.d/lirc stop

记录按键配置文件

irrecord -n -d /dev/lirc0 ~/lircd.conf

tips:如果遇到设备忙的问题,可以先reboot一下,再执行第5步

然后可以按照英文提示完成按键学习的过程,需要注意的是第一次按键需要按下去的时间比较长,此时lirc正在对遥控器的编码进行解析。

之后就可以开始记录按键并对按键命名了,一次学习过程不要超过10个按键,按键多的可分几次进行。

6、完成后,开启lirc服务(注意下面的路径,网上好多资料的路径不对)
sudo /etc/init.d/lirc start

利用irw指令测试一下遥控器是否能够正常工作

(二)遥控关机、重启、启动程序

1、配置按键的功能,编辑 /etc/lirc/irexec.conf

根据大家实际的功能需求进行设置,同时为了实现开机自启,设置此文件权限为可执行

2、编辑相关脚本,同样需要设置文件权限为可执行

powerctl.sh

#!/bin/sh
sudo halt

rebootctl.sh

#!/bin/sh
sudo reboot

radioctl.sh,这里执行的 radio.py 也需要设置文件权限为可执行

#!/bin/sh
sudo /usr/bin/python2 /home/pi/code/oled/radio.py

3、在 /etc/rc.local 中 exit 0 之前添加如下内容

(sleep 5;
sudo modprobe lirc_rpi gpio_in_pin=25 gpio_out_pin=24
sleep 5;
irexec -d /etc/lirc/irexec.conf
)&

重启后,将自动加载lirc_rpi模块,并在后台执行irexec,按遥控器上所设置的按键,即可实现遥控关机、重启、启动程序的功能。


菜鸟
2014-09-17 12:56:48     打赏
19楼

【实验番外篇】任务二:MY RADIO~~

这个实验是前两个实验的延续,在之前的基础上新增了一个FM模块

FM STEREO RADIO MODULE

I2C接口,接线上又省GPIO啦~~FM芯片是RDA5802E的,买回来店家给的手册和范例程序都对不上,无语。。。。

在网上找了RDA5802E的规格书和编程指南,自己码吧~~

接上模块先读一下I2C地址

冒出来三个。。。真多,查了一些资料了解到,0x10是模块的标准地址,0x11是复合格式I2C地址,0x60是模块厂内调试备用地址


这里吐槽一下店家给的代码,I2C通讯不需要发送地址吗。。。

RDA5802 的 I2C 接口中寄存器的地址是不可见的。 RDA5802 中有一个固定的起始寄存器地址(写操作时为 02H,读操作时为 0AH),并有一个内部递增计数器。


发送完设备地址和读写 r/w 命令比特后,便可以直接开始读写数据,所以代码中用到的write_i2c_block_data都没有寄存器地址

了解完寄存器说明后,开始码代码啦~~


安装pylirc库

sudo apt-get install python-pylirc

编写红外遥控接口代码(Buttons.py),对于python初学者还是比较推荐pycharm的,能够养成一个比较标准的python代码习惯:)

#!/usr/bin/env python
# coding=utf-8
import pylirc


class Buttons:

    # 初始化,这里的app需要和调用它的文件名称一致,conf需要和之前实验中irexec地址一致,"/etc/lirc/irexec.conf"
    def __init__(self, app, conf):
        if not pylirc.init(app, conf, 1):
            raise Exception("Unable to init pylirc")
        # 阻塞模式关闭
        pylirc.blocking(0)

    def readbutton(self):
        # 按下按键传递对应的config值,如果没有匹配的key则为None
        btn = pylirc.nextcode()
        if btn:
            return btn[0]
        else:
            return None

之后在我们的工程中进行调用即可(以下代码仅为调用示范)

from Buttons import Buttons

# 导入按键设置
btn = Buttons("radio", "/etc/lirc/irexec.conf")

irbutton = btn.readbutton()     # 按键接收

if irbutton == 'PLAY':
    ......

码了两个晚上,基本实现了下面几个功能:

1、遥控启动程序

2、遥控退出程序

3、自动搜台

4、显示中文电台名称(只预置了一部分电台名称)及当前电台频率

5、调节音量大小

6、实时显示系统时间

7、系统信息功能菜单

(1)CPU温度    (2)GPU温度    (3)Host Name    (4)Host IP

(5)Wlan0 IP    (6)定时关机 - 设置/取消    (7)固件版本

码完代码记得设置文件权限为可执行,以实现被遥控器启动,上传完整代码~~

git clone git://github.com/chronosMaker/RPiRadio.git

室内信号强度还是不行。。。换个GSM模块上的2.5m吸盘天线试试。。。效果还可以接受~~


剩下的就是回去录个视频啦~~



菜鸟
2014-09-17 13:30:28     打赏
20楼
额。。。图片质量有点儿高了。。。

共41条 2/5 1 2 3 4 5 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]