3)树莓派操作基础
2.上网设置
在某东上竟然就有支持树莓派的无线wifi适配器,EDUP EP-N8508GS黄金版,无需驱动,非常好
具体配置见下帖
http://www.geekfan.net/8776/
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`
结果如下
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设置
6)Matlab+树莓派
1.简介
最近才知道Matlab官方支持树莓派,也就是说可以直接用Matlab编程序控制树莓派,并且控制树莓派的IO,I2C,SPI等接口。
相信大部分理工科生都接触过Matlab,就不具体介绍了。Matlab官方支持三款第三方硬件,Arduino、Raspberry Pi和LEGO Mindstorms。Matlab与Simulink都可以连接到树莓派。这里有版本要求:2013a只有Simulink支持树莓派,以后的版本是Matlab与Simulink都支持。
下面的连接具体介绍了安装方法
同时官方也有例程供大家参考
注意,使用Matlab对树莓派编程需要刷新的镜像,这是Matlab定制的Raspian Wheezy系统。Matlab安装完硬件支持包后会自动提示你准备新的TF卡,Matlab会往卡里刷入新的系统。
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
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
这句指令就可以自动链接到树莓派
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的程序,这部分会接下来研究。
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的引脚电平变化。
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
#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 $<
以下是结果
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |