这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » [dawnjeanh]“树莓派 DIY”进程帖 [更新:摄像头与OpenC

共20条 2/2 1 2 跳转至
菜鸟
2014-09-03 18:41:07     打赏
11楼

3)树莓派操作基础

2.上网设置

在某东上竟然就有支持树莓派的无线wifi适配器,EDUP EP-N8508GS黄金版,无需驱动,非常好

具体配置见下帖

http://www.geekfan.net/8776/


菜鸟
2014-09-03 19:43:22     打赏
12楼

3)树莓派操作基础

3.树莓派中文设置

中文设置需要联网,下载字库,输入法详细见下帖

http://shumeipai.nxez.com/2013/10/04/configuring-raspberry-pi-support-chinese.html

说明一点,选择地区时要用空格选择一下,这样才能选择,这一步好几次才选成功


菜鸟
2014-09-13 21:13:44     打赏
13楼
4)软件

2.gtk设置与hello world

gtk可以用来开发界面,本人也是初学者,从网上找到的教程

在终端中输入安装gtk,由于网速较慢装了时间比较长。

sudo apt-get install build-essential       #这将安装gcc/g++/gdb/make 等基本编程工具
sudo apt-get install gnome-core-devel #这将安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件
sudo apt-get install pkg-config            #用于在编译GTK程序时自动找出头文件及库文件位置
sudo apt-get install devhelp                 #这将安装 devhelp GTK文档查看程序
sudo apt-get install libglib2.0-doc libgtk2.0-doc     #这将安装 gtk/glib 的API参考手册及其它帮助文档
sudo apt-get instal glade libglade2-dev    #这将安装基于GTK的界面构造程序
安装好后可以写一个简单的界面程序hello world


//gtk_test.c  写个最简单的例子
#include
int main(int argc,char *argv[])
{
  GtkWidget *window;
   
  gtk_init(&argc,&argv);
 
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
  gtk_window_set_title(GTK_WINDOW(window),"Hello World!");
  gtk_widget_show(window);
 
  gtk_main();
  return 0;
}


保存退出,然后编译



gcc -o test test.c `pkg-config --cflags --libs gtk+-2.0`

结果如下



菜鸟
2014-09-19 22:14:36     打赏
14楼

4)软件

3.使用窗口显示CPU及GPU温度

网上查到获取CPU及GPU温度的方法,大部分是python的,自己拿C实现了一下,并且在gtk建立的窗口中显示,不再是显示在终端中。

gtk是刚入门,敲代码确实很繁琐。找到对应的文件IO函数以及shell指令的函数,实现python对应的功能。

提示一点,fopen读取后,要fclose再fopen数据才会刷新,不然数据是不变的。

下面是代码


#include <gtk/gtk.h>
#include <stdio.h>

FILE *fp;
int CPUtemp;
double GPUtemp;
gchar str[100];

gint timeFun(GtkWidget *label);

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *frame;	
	GtkWidget *label;
	gpointer data;

	gtk_init(&argc, &argv);
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
	gtk_window_set_title(GTK_WINDOW(window), "温度显示");
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 100);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

	//读取温度
	fp = fopen("/sys/class/thermal/thermal_zone0/temp", "rt");
	fscanf(fp, "%d", &CPUtemp);
	fclose(fp);
	fp = popen("/opt/vc/bin/vcgencmd measure_temp", "r");
	fscanf(fp, "temp=%lf`C", &GPUtemp);
	pclose(fp);
	sprintf(str, "CPU温度:%0.1f°C\nGPU温度:%0.1f°C", (double)CPUtemp / 1000, GPUtemp);
	
	gtk_container_set_border_width(GTK_CONTAINER(window), 20);
	frame = gtk_frame_new("温度");
	gtk_container_add(GTK_CONTAINER(window), frame);
	label = gtk_label_new(str);
	gtk_container_add(GTK_CONTAINER(frame), label);
	gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);

	g_timeout_add(1000, (GSourceFunc)timeFun, label);

	gtk_widget_show_all(window);
	gtk_main();	
	return 0;
}

gint timeFun(GtkWidget *label)
{
	fp = fopen("/sys/class/thermal/thermal_zone0/temp", "rt");
	fscanf(fp, "%d", &CPUtemp);
	fclose(fp);
	fp = popen("/opt/vc/bin/vcgencmd measure_temp", "r");
	fscanf(fp, "temp=%lf`C", &GPUtemp);
	pclose(fp);
	sprintf(str, "CPU温度:%0.1f°C\nGPU温度:%0.1f°C", (double)CPUtemp / 1000, GPUtemp);
	gtk_label_set_text(GTK_LABEL(label), str);
	return 1;
}


编译方法见gtk设置



菜鸟
2014-11-05 15:34:30     打赏
15楼

6)Matlab+树莓派

1.简介

最近才知道Matlab官方支持树莓派,也就是说可以直接用Matlab编程序控制树莓派,并且控制树莓派的IO,I2C,SPI等接口。

相信大部分理工科生都接触过Matlab,就不具体介绍了。Matlab官方支持三款第三方硬件,Arduino、Raspberry Pi和LEGO Mindstorms。Matlab与Simulink都可以连接到树莓派。这里有版本要求:2013a只有Simulink支持树莓派,以后的版本是Matlab与Simulink都支持。

下面的连接具体介绍了安装方法

http://www.mathworks.cn/help/supportpkg/raspberrypiio/ug/install-support-for-raspberry-pi-hardware.html

同时官方也有例程供大家参考

注意,使用Matlab对树莓派编程需要刷新的镜像,这是Matlab定制的Raspian Wheezy系统。Matlab安装完硬件支持包后会自动提示你准备新的TF卡,Matlab会往卡里刷入新的系统。


菜鸟
2014-11-05 15:41:10     打赏
16楼

6)Matlab+树莓派

2.控制LED

首先将树莓派与计算机链接在同一个局域网,并获得树莓派的IP地址(具体方法就不说了)。

rpi = raspi('192.168.137.135', 'pi', 'raspberrypi-oTzjeOKXVt');

这句话是新建一个树莓派对象,之后的控制都通过rpi来实现

led = rpi.AvailableLEDs{1};

定义一个LED。

writeLED(rpi, led, 1);

writeLED(rpi, led, 0);

控制LED亮灭。

具体代码如下:


clear
clc

rpi = raspi('192.168.137.135', 'pi', 'raspberrypi-oTzjeOKXVt');

led = rpi.AvailableLEDs{1};
for i = 1:10
    writeLED(rpi, led, 1);
    pause(0.5);
    writeLED(rpi, led, 0);
    pause(0.5);
end
clear rpi


这就实现了LED的亮灭,运行后就会发现树莓派上的电源LED旁边黄色LED在闪烁


顺便给大家一个Matlab函数自动获取树莓派IP,因为树莓派动态获取IP的话每次开机IP可能会不一样,手动查取很麻烦,下面Matlab程序获得:

function [ ip ] = getRpiIP(  )
%获得树莓派IP
rpi_hwadd = 'e8-4e-06-20-2f-b3';%物理地址
[~,cmdout]=system('arp -a');
pos = strfind(cmdout, rpi_hwadd);
pos = pos - 1;
while 1
    pos = pos - 1;
    if cmdout(pos) == ' '
        if cmdout(pos+1) ~= ' '
            pos1 = pos;
            break;
        end
    else
        if cmdout(pos+1) == ' '
            pos2 = pos;
        end
    end
end
ip = cmdout(pos1:pos2);

end

 


菜鸟
2014-12-01 10:32:29     打赏
17楼

6)Matlab+树莓派

3.控制IO

控制IO也很容易,与控制LED类似,下面是matlab中对树莓派IO控制的函数说明。

http://cn.mathworks.com/help/supportpkg/raspberrypiio/gpio-pins.html

%% 使用Matlab控制树莓派
clear
clc
%% 新建树莓派对象
rpi_ip = getRpiIP();
rpi = raspi(rpi_ip, 'pi', 'raspberrypi-oTzjeOKXVt');
%% 控制LED
for i = 1:10
    writeDigitalPin(rpi, 15, 1);
    pause(0.5);
    writeDigitalPin(rpi, 15, 0);
    pause(0.5);
end

 

经过学习,其实matlab中支持自动连接到树莓派,不需制定IP地址

mypi = raspi

 

这句指令就可以自动链接到树莓派


菜鸟
2014-12-04 19:30:10     打赏
18楼

7)树莓派开源项目Coder

1.简介与安装

这是google的一个团队推出的开源项目,让树莓派在局域网中充当一个web服务器,我们可以通过浏览器访问树莓派,并通过浏览器进行网页编程,包括了HTML,CSS,JS,NODE。

以下是coder官网

http://googlecreativelab.github.io/coder/

安装方法其实跟安装其他树莓派系统方法一样,在官网上下载系统,通过Win32DiskImager将镜像烧录到TF卡,将TF卡插到树莓派上,将树莓派链接到与你电脑同一个局域网中,然后上电启动。你不需要插上键盘、鼠标、显示器。window系统需要先安装Bonjour Print Services,然后再chrome内输入 https://coder.local 就可以链接到树莓派内的网页。




我们可以在网页内新建工程,编写网页。甚至我们可以通过NODE来编写控制IO的程序,这部分会接下来研究。


菜鸟
2014-12-05 22:33:37     打赏
19楼

6)Matlab+树莓派

4.使用I2C

通过matlab可以使用树莓派的硬件外设,如SPI、I2C、UART,这个例程是使用I2C扩展IO,使用的芯片是PCF8574,datasheet:http://pdf1.alldatasheet.com/datasheet-pdf/view/177289/TI/PCF8574.html

matlab控制I2C的内容可以在官网上找到例程:http://cn.mathworks.com/help/supportpkg/raspberrypiio/i2c-interface.html

以下是matlab程序:


%% 使用Matlab控制树莓派
clear
clc
%% 新建树莓派对象
rpi_ip = getRpiIP();
rpi = raspi(rpi_ip, 'pi', 'raspberrypi-oTzjeOKXVt');
%% 建立i2c对象
[i2cAddresses] = scanI2CBus(rpi,'i2c-1');
I2C_IOE = i2cdev(rpi,'i2c-1',i2cAddresses{1});
%% 控制LED
for i = 1:10
    write(I2C_IOE,0,'uint8');
    pause(0.5);
    write(I2C_IOE,255,'uint8');
    pause(0.5);
end

 scanI2CBus()函数用来扫描连到I2C总线上的设备地址,通过i2cdev()函数来创建一个设备对象,write()函数实现对设备写入数据。

这个芯片是扩展IO,可以看到扩展IO的引脚电平变化。



菜鸟
2014-12-10 16:27:14     打赏
20楼

8)摄像头与OpenCV

1.USB摄像头与安装OpenCV

我没有买树莓派专用的摄像头模块,价格也确实比较贵,用了USB的摄像头。linux中使用的是v4l2驱动摄像头。插上摄像头可以在终端中输入lsusb来查看是否有了摄像头设备。终端中输入v4l2-ctl --all可以看到摄像头的具体参数。当都正常,可以直接输入mplayer tv://就可以看到摄像头的图像了。

比较可惜,可能是我的摄像头在linux下支持的不好,在v4l2-ctl --all中colorspace识别不出来,说以直接显示颜色是不对的,比较后是RGB通道不对。

接下来安装OpenCV,安装OpenCV前应该安装好gcc/g++,gtk等,OpenCV是依赖他们的。可以使用apt方式来安装,简单方便。

sudo apt-get update
sudo apt-get install libcv-dev


以下是C++代码显示摄像头


#include 
#include 
#include 
using namespace std;
using namespace cv;
 
int main()
{
	VideoCapture capture(0);
	if(!capture.isOpened())
	{
		cout << "Failed to connect to the camera." << endl;
	}
	Mat frame;
	while(1)
	{
		capture >> frame;
		if(frame.empty())
		{
			cout << "Failed to capture an image" << endl;
			return -1;
		}
		Mat fgray(frame.rows, frame.cols, CV_8UC1);
		cvtColor(frame, fgray, CV_RGB2GRAY);
		imshow("Cam", fgray);
		int key = waitKey(20);
		if(key == 'q')
			break;
	}
	return 0;
}


因为RGB通道问题,我就直接转为灰度图像了。下面是参考网络写的makefile文件

CC = g++
# 可执行文件
TARGET = test
# C文件
SRCS = test.cpp
# 目标文件
OBJS = $(SRCS:.cpp=.o)
# 库文件
DLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui
# 链接为可执行文件
$(TARGET):$(OBJS)
 $(CC) -o $@ $^ $(DLIBS)
clean:
 rm -rf $(TARGET) $(OBJS)
# 编译规则 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.cpp
 $(CC) -o $@ -c $<

 

以下是结果





共20条 2/2 1 2 跳转至

回复

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