OpenGL和pcDuino搭建数字示波器
来源:互联网 发布:开淘宝店的花费 编辑:程序博客网 时间:2024/05/20 03:07
看到大神们用Arduino、AVR做示波器,感觉很好玩,手头的pcDuino能不能做呢?一不做二不休,现在我们就自己用pcDuino做一个。
硬件清单:
pcDuino一块
杜邦线若干
软件环境:
1、pcDuino板载ubuntu
2、GCC 4.6
3、QT 4.8.5:http://qt-project.org/downloads
4、OpenGL:qt library自带
5、Arduino SDK(c_enviroment):https://github.com/pcduino/c_enviroment
照例先来捋一下思路,由于手头没有LCD模块,只能用显示器来充当示波器的屏幕了(27寸的示波器,哇咔咔~)。因为涉及到绘图,这里我使用OpenGL作为绘图工具,虽然有点炮打蚊子的感觉,但是。。。还有什么比OpenGL更好的跨平台图形库呢?同时逼格也得到提升,何了乐而不为。嘿嘿~
实现原理很简单,通过pcDuino的analogRead函数读取信号源的电压变化,再用OpenGL构建一个坐标系,X轴代表时间,Y轴代表电压,持续绘制电压随时间的变化曲线,就得到我们需要的波形图像了。
QT和OpenGL的环境搭建请参照这个帖子,这里不再赘述:http://www.oschina.net/question/1174645_121352
下面来看关键的GLWidget类代码,完整的QT项目源码稍后奉上,或通过邮件和微信与我联系索取:)。
#include "OpenGLwidget.h"#include <QTimer>#include <QKeyEvent>#include <math.h>#include <iostream>#include <GL/glu.h>#include <Arduino.h>#include <Serial.h>#include <wiring_private.h> //出于性能考虑宏定义一些必要的常量计算//step定义opengl的x轴步长,即把x轴的-1到1均分成窗口的宽度(像素)#define STEP 2/800.0//units定义了窗口的x轴有800个点#define UNITS 800//pcduino的12bits ADC范围是0~4095,正负各4095#define ANALOGVALUE 4095*2 //定义opengl的顶点二维数组,800个点,每个点由两个float组成GLfloat ver[UNITS][2];//定义了x轴的起步值,-1.0即屏幕的最左边GLfloat xstep = -1.0; //openglwidget的构造器,设置了窗口大小、窗口标题和更新opengl画布的signalOpenGLWidget::OpenGLWidget( QWidget* parent) : QGLWidget(parent){ setGeometry( 0, 30, 800, 600 ); setWindowTitle("Joker's OpenGL Framework"); t = new QTimer(this); connect(t, SIGNAL(timeout()), this, SLOT(updateGL())); t->start(0);} OpenGLWidget::~OpenGLWidget(){ } //opengl的初始化函数void OpenGLWidget::initializeGL(){ glShadeModel( GL_SMOOTH ); //设置颜色清空颜色,参数依次为RGBA,这里是一个我觉得比较帅气的灰色:) glClearColor( 0.3, 0.3, 0.3, 1.0 ); glClearDepth( 1.0 ); //开启深度测试 glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); //开启opengl的反锯齿 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_POLYGON_SMOOTH); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); } //opengl的绘制函数,调用一次绘制一帧画面void OpenGLWidget::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //清空颜色缓冲区 glClear(GL_COLOR_BUFFER_BIT); //定义视点、原点和视角俯仰,由于这个例子只是2d绘图,可以忽略 gluLookAt (0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //绘制两条直线代表x和y坐标轴 glBegin(GL_LINES); glColor3f(0.5,0.5,0.5); //这两个点可以画x轴 glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); //这两个点可以画y轴 glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); glEnd(); //绘制波形,用opengl的一个line strip定义,line strip其实就是一组点连成的线 glBegin(GL_LINE_STRIP); //定义line strip的颜色,这里也是我认为比较帅气的绿色,哈哈 glColor3f(0.0,1.0,0.0); //这个循环会通过analogRead取得电压数值,并把这个电压值转换成波形的y值,写入顶点数组 for(int i=0;i<UNITS;i++){ *(ver[i]) = xstep+=STEP; *(ver[i]+1) = analogRead(5)/ANALOGVALUE; glVertex2fv(ver[i]); } //std::cout<<analogRead(5)/4095.0*2<<std::endl; glEnd(); //把顶点数据压入opengl的渲染管道,开始绘图 glFlush();}//窗口大小变化的回调函数void OpenGLWidget::resizeGL( int width, int height ){ //std::cout<<width<<"*"<<height<<std::endl; if ( height == 0 ) { height = 1; } glViewport(0,0,(GLint)width,(GLint)height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); //gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity();}//键盘按键的回调函数,按esc退出void OpenGLWidget::keyPressEvent(QKeyEvent *e){ switch ( e->key() ){ case Qt::Key_Escape: close(); }}
编译运行,由于手头没有信号发生器,我就拿pcduino的PWM信号简单测试一下:
PWM输出的200Hz的方波,似乎很工整
我们加快频率到800,缩短占空比
实测我的写法只能支持2kHz左右的带宽,求大神优化:)
看腻了方波工整的信号,我索性输入一个音频信号,大家猜猜是哪首歌?猜对有奖:)
作者博客原帖:http://blog.jokerjewel.com/articles/2013/12/21/1387628153495.html
0 0
- OpenGL和pcDuino搭建数字示波器
- zz-数字和取样示波器的关键器件和电路
- 简易数字存储示波器
- 数字存储示波器
- 数字示波器的使用
- 数字示波器的用法
- 数字示波器FFT分析
- pcduino 搭建Qt开发环境
- 搭建pcduino交叉编译环境
- 当代数字示波器的发展
- 数字示波器的激烈竞争
- 数字示波器的使用情况
- pcDuino + busybox 成功搭建最小linux系统
- 数字示波器无源探头工作原理浅析
- 数字示波器自动检定系统硬件设计
- 2014-3-20 数字示波器 方案设定
- 2014-3-28 数字示波器 2
- TeKtronix TDS210数字示波器使用简介
- Java IO的一般使用模式
- 移动端webapp开发必备知识
- 不用友元,访问类的私有成员变量的方法
- DDAL技术议案选型
- mac共享无线网
- OpenGL和pcDuino搭建数字示波器
- Android GSM驱动模块详细分析
- GPIO驱动相关笔记
- 基于annotation注解的Spring3 MVC Static Pages Example之四静态页面向学习笔记
- libjpeg 的使用与安装
- 译_jBPM4用户指南:第三章_图形化流程设计器(GPD)
- Linux把一个文件标准输出输入到另一个文件中
- 【JavaScript】正则表达式
- 文本文件与二进制文件