15、Beaglebone外围电路设计第四周:数据的无线采集和显示效果
[复制链接]
活动眼看就要结束了!!感觉好多东西还没实现!
1、计划要加上Zigbee模块来实现无线的通讯!,由于时间来不及了!所以选择了我较为擅长的nRF24l01无线模块:
NRF24L01功能使用文档.pdf
(650.05 KB, 下载次数: 29)
这个无线模块我已经用过N次了!几乎每次活动我都会使用它!所以也没啥可说的!驱动程序和手册网上太多太多了!所以程序的移植较为简单,半天搞定!
2、数据采集端,我使用了MSP-EXP430FR5739开发板,采集了板载的加速度数值,并用过计算得到板子的水平倾角!以及板载的热敏电阻测得的温度值,另外还添加了超声波模块用来测距!采集端的程序和硬件都是原来做过的的,可以节省好多时间!采集端的详细介绍可看我的帖子:
https://bbs.eeworld.com.cn/viewthread.php?tid=324229
3,显示界面在前面的基础上做了些优化处理和小的调整:
这里主要讲讲我是怎样用Beaglebone实现数据的不断更新的!
我在之前的基础上,加入许多新的画布控件,目的是为了进行数据显示的刷新和表盘背景的刷新!
//用于刷新数据的画布(CANVAS_STYLE_FILL用法)
Canvas(g_sT, 0, 0, 0, &g_s35_480x272x24Display, 98, 80,
50, 20, CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, ClrWhite,ClrWhite, ClrBlack,
&g_sFontCH16, 0, 0, 0);
Canvas(g_sL, 0, 0, 0, &g_s35_480x272x24Display, 98, 140,
50, 20, CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, ClrWhite,ClrWhite, ClrBlack,
&g_sFontCH16, 0, 0, 0);
Canvas(g_sN, 0, 0, 0, &g_s35_480x272x24Display, 98, 200,
50, 20, CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, ClrWhite,ClrWhite, ClrBlack,
&g_sFontCH16, 0, 0, 0);
Canvas(g_sX, 0, 0, 0, &g_s35_480x272x24Display, 317, 90,
110, 20, CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, ClrWhite,ClrWhite, ClrBlack,
&g_sFontCH16, 0, 0, 0);
Canvas(g_sY, 0, 0, 0, &g_s35_480x272x24Display, 317, 140,
110, 20, CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, ClrWhite,ClrWhite, ClrBlack,
&g_sFontCH16, 0, 0, 0);
Canvas(g_sZ, 0, 0, 0, &g_s35_480x272x24Display, 317, 190,
110, 20, CANVAS_STYLE_FILL | CANVAS_STYLE_OUTLINE | CANVAS_STYLE_TEXT | CANVAS_STYLE_TEXT_LEFT, ClrWhite,ClrWhite, ClrBlack,
&g_sFontCH16, 0, 0, 0);
//三个表盘刷新
Canvas(g_sAll, 0, 0, 0, &g_s35_480x272x24Display, 0, 70,
480, 108, CANVAS_STYLE_FILL | CANVAS_STYLE_IMG, ClrWhite,0,0,
0, 0, g_Acceleration, 0);
//单个表盘刷新
Canvas(g_sSingle, 0, 0, 0, &g_s35_480x272x24Display, 80, 70,
320, 161, CANVAS_STYLE_FILL | CANVAS_STYLE_IMG, ClrWhite,0,0,
0, 0, g_Accsingle, 0);
我在这里将表盘的背景从大的画布取消,转而放在较小的画布上,便于背景的刷新!
玩过nRF24l01的朋友都知道,他拥有一个IRQ引脚,我将与其相接的管脚设置为外部中断,低电平触发中断:
//初始化引脚
RF_Pin_Init();
/* Configure the INTC to receive GPIO Interrupts. */
GPIOINTCConfigure();
/*
** Ensable interrupt generation on detection of a logic HIGH or
** LOW levels.
*/
GPIOIntTypeSet(RF_PORT,TP_IRQ,
GPIO_INT_TYPE_LEVEL_LOW);//IRQ变低产生中断
/*
** Disable interrupt generation on detection of a rising or a
** falling edge.
*/
GPIOIntTypeSet(RF_PORT,TP_IRQ,
GPIO_INT_TYPE_NO_EDGE);
/* Enable interrupt for the specified GPIO Input Pin. */
GPIOPinIntEnable(RF_PORT,
GPIO_INT_LINE_1,TP_IRQ);
其中:/*** This function configures the Interrupt Controller (INTC) to receive
** GPIO Interrupt.
*/
static void GPIOINTCConfigure(void)
{
/* Initialize the ARM Interrupt Controller. */
IntAINTCInit();
// This function configures the Interrupt Controller (INTC) to receive GPIO Interrupt
/* Register the Interrupt Service Routine(ISR). */
IntRegister(SYS_INT_GPIOINT1A, GPIOIsr);
/* Set the priority for the GPIO0 system interrupt in INTC. */
IntPrioritySet(SYS_INT_GPIOINT1A, 0, AINTC_HOSTINT_ROUTE_IRQ);
/* Enable the GPIO0 system interrupt in INTC. */
IntSystemEnable(SYS_INT_GPIOINT1A);
}
void RF_Pin_Init(void)
{
/* Enabling functional clocks for GPIO1 instance. */
GPIO1ModuleClkConfig();
GPIOModuleEnable(RF_PORT);
//选择引脚模式
GPIO1PinMuxSetup(TP_CS);
GPIO1PinMuxSetup(TP_CE);
GPIO1PinMuxSetup(TP_SCK);
GPIO1PinMuxSetup(TP_MOSI);
GPIO1PinMuxSetup(TP_MISO);
GPIO1PinMuxSetup(TP_IRQ);
/* Resetting the GPIO module. */
GPIOModuleReset(RF_PORT);
/* Setting the GPIO pin as an output pin. */
GPIODirModeSet(RF_PORT,TP_CS,GPIO_DIR_OUTPUT);
GPIODirModeSet(RF_PORT,TP_CE,GPIO_DIR_OUTPUT);
GPIODirModeSet(RF_PORT,TP_SCK,GPIO_DIR_OUTPUT);
GPIODirModeSet(RF_PORT,TP_MOSI,GPIO_DIR_OUTPUT);
GPIODirModeSet(RF_PORT,TP_MISO,GPIO_DIR_INPUT);
GPIODirModeSet(RF_PORT,TP_IRQ,GPIO_DIR_INPUT);
CE_OFF(); // 待机模式
CSN_ON(); // SPI禁止
SCK_OFF(); // SPI时钟信号低
}
进而我可以将刷屏的命令全部放在中断子函数中处理:
static void GPIOIsr(void)
{
/* Check the Interrupt Status of the IRQ pin. */
if(GPIOPinIntStatus(RF_PORT,
GPIO_INT_LINE_1,
TP_IRQ) & (1 << TP_IRQ))
{
//nRF24L01_RxPacket(RxBuf); //读取数据
if(nRF24L01_RxPacket(RxBuf))
{
if(g_ulPanel==2)//表盘刷屏
{
WidgetPaint((tWidget *)&g_sAll);
}
if(g_ulPanel==3||g_ulPanel==4||g_ulPanel==5)//表盘刷屏
{
WidgetPaint((tWidget *)&g_sSingle);
}
if(g_ulPanel==0)//表盘刷屏
{
WidgetPaint((tWidget *)&g_sT);
WidgetPaint((tWidget *)&g_sL);
WidgetPaint((tWidget *)&g_sN);
WidgetPaint((tWidget *)&g_sX);
WidgetPaint((tWidget *)&g_sY);
WidgetPaint((tWidget *)&g_sZ);
}
}
SPI_RW(FLUSH_RX); //清空接收缓冲
SetRx_Mode();
/* Clear the Interrupt Status of the GPIO Card Detect pin. */
GPIOPinIntClear(RF_PORT,
GPIO_INT_LINE_1,
TP_IRQ);
}//尽量减少时间
}
而在主循环中,我则是对收到的数据进行相应准换和处理,并显示出来!这里比较简单,大家可以看我的那个MSP430的例程,两者处理方式类似!
4、图片展示:
发送与接受:
实时变化数据:
模拟的表盘:
5、测试视频:
6、活动感想:
不出意外的话,在活动结束前,我是不能在有什么作为了!!这次活动的时间较为紧张, 但是却很充实!
我原来并未接触过此类的处理器!感觉压力很大!一步步走来,克服了一个又一个的硬件和软件问题!!虽然很辛苦但是我乐在其中!
当然除了我自己的去积极查阅资料解决问题以外,讨论群里的大侠们给了我很大的帮助和启发!这里真心谢谢你们!!!也要感谢maylove关于活动详情的耐心解答!!
最后,希望可以有更多的人来玩这块板子!希望我可以进一步利用这款开发板!希望我们的论坛越办越好!!
BY:在论坛的大家庭里成长的小菜鸟:anananjjj。