2605|6

504

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

【微雪RP2040双核开发板】加速度,角速度计实现 [复制链接]

616a83330164be1710940defb768cd96

 

前言

前一篇我们移植了LVGL,有GUI之后我们就可以利用这块圆形的240x240的屏幕做一些有意思的东西了。

我们结合六轴加速度计,使用chart控件将,六轴数据通过曲线显示出来,实现一个加速度计,角速度计算的Demo。

 

过程

QMI8658数据的获取可以参考样例程序

chart的使用可以参考lvgl官网。

添加代码

/home/lhj/RP2040-LCD-1.28/c/examples/LCD_1in28_test.c


编译

cd build

export PICO_SDK_PATH="/home/lhj/pico-setup/pico/pico-sdk" && cmake -DLV_CONF_BUILD_DISABLE_EXAMPLES=1 -DLV_CONF_BUILD_DISABLE_DEMOS=1 ..

make

 

/*****************************************************************************

* | File        :   LCD_1in28_test.c

* | Author      :   Waveshare team

* | Function    :   1.3inch LCD  test demo

* | Info        :

*----------------

* | This version:   V1.0

* | Date        :   2021-08-20

* | Info        :

#

# Permission is hereby granted, free of charge, to any person obtaining a copy

# of this software and associated documnetation files (the "Software"), to deal

# in the Software without restriction, including without limitation the rights

# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

# copies of the Software, and to permit persons to  whom the Software is

# furished to do so, subject to the following conditions:

#

# The above copyright notice and this permission notice shall be included in

# all copies or substantial portions of the Software.

#

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

# THE SOFTWARE.

#

******************************************************************************/

#include "LCD_Test.h"

#include "LCD_1in28.h"

#include "QMI8658.h"

#include <stdio.h>

#include "pico/stdlib.h"

#include "hardware/adc.h"

#include "draw.h"

#include "lvgl.h"

#include "lv_port_disp.h"

 

bool timer_callback(repeating_timer_t *rt)

{

    lv_tick_inc(5);

    ///printf("%lld\r\n",time_us_64());

}

 

static void btn_event_cb(lv_event_t * e)

{

    lv_event_code_t code = lv_event_get_code(e);

    lv_obj_t * btn = lv_event_get_target(e);

    if(code == LV_EVENT_CLICKED) {

        static uint8_t cnt = 0;

        cnt++;

 

        /*Get the first child of the button which is the label and change its text*/

        lv_obj_t * label = lv_obj_get_child(btn, 0);

        lv_label_set_text_fmt(label, "Button: %d", cnt);

    }

}

 

/**

 * Create a button with a label and react on click event.

 */

void lv_example_get_started_1(void)

{

    lv_color_t color;

    color.full=(uint16_t)0xF800;

    lv_obj_t * btn = lv_btn_create(lv_scr_act());     /*Add a button the current screen*/

    lv_obj_set_style_text_font(btn, &lv_font_montserrat_24 ,0);

    lv_obj_set_style_text_color(btn,color,0);

    lv_obj_set_pos(btn, 120-100, 120-50);                            /*Set its position*/

    lv_obj_set_size(btn, 200, 100);                          /*Set its size*/

    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);           /*Assign a callback to the button*/

 

    lv_obj_t * label = lv_label_create(btn);          /*Add a label to the button*/

    lv_label_set_text(label, "Hello LVGL");                     /*Set the labels text*/

    lv_obj_center(label);

}

 

lv_obj_t * chart;

lv_chart_series_t * ser1;

lv_chart_series_t * ser2;

lv_chart_series_t * ser3;

lv_chart_series_t * ser4;

lv_chart_series_t * ser5;

lv_chart_series_t * ser6;

int adc_chart_init(void)

{

    lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x343247), 0);

 

    /*Create a chart*/

    chart = lv_chart_create(lv_scr_act());

    lv_chart_set_type(chart, LV_CHART_TYPE_LINE);

    lv_chart_set_point_count(chart, 20u);

    lv_chart_set_range(chart,LV_CHART_AXIS_PRIMARY_Y, 0, 240);

    lv_chart_set_range(chart,LV_CHART_AXIS_SECONDARY_Y, 0, 240);

    lv_chart_set_update_mode(chart, LV_CHART_UPDATE_MODE_SHIFT);

    lv_chart_set_div_line_count(chart, 4, 8);

    //lv_chart_set_zoom_x(lv_obj_t * obj, uint16_t zoom_x);

    //lv_chart_set_zoom_y(lv_obj_t * obj, uint16_t zoom_y);

    lv_chart_set_axis_tick(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 0, 5, 1, true, 80);

    lv_chart_set_axis_tick(chart, LV_CHART_AXIS_PRIMARY_X, 0, 0, 12, 1, true, 50);

    lv_obj_set_size(chart, 240, 240);

    lv_obj_align(chart, LV_ALIGN_CENTER, 0, 0);

 

    /*Add two data series*/

    ser1 = lv_chart_add_series(chart,lv_color_hex(0xFF0000),LV_CHART_AXIS_PRIMARY_Y);

    ser2 = lv_chart_add_series(chart,lv_color_hex(0x00FF00),LV_CHART_AXIS_PRIMARY_Y);

    ser3 = lv_chart_add_series(chart,lv_color_hex(0x0000FF),LV_CHART_AXIS_PRIMARY_Y);

    ser4 = lv_chart_add_series(chart,lv_color_hex(0xFFFF00),LV_CHART_AXIS_PRIMARY_Y);

    ser5 = lv_chart_add_series(chart,lv_color_hex(0x00FFFF),LV_CHART_AXIS_PRIMARY_Y);

    ser6 = lv_chart_add_series(chart,lv_color_hex(0xFF00FF),LV_CHART_AXIS_PRIMARY_Y);

    return 0;

}

 

int adc_chart_newdata(int index,int32_t newdata,int refresh)

{

    if(index == 0)

    {

        lv_chart_set_next_value(chart, ser1, newdata);

    }

    if(index == 1)

    {

        lv_chart_set_next_value(chart, ser2, newdata);

    }

    if(index == 2)

    {

        lv_chart_set_next_value(chart, ser3, newdata);  

    }

    if(index == 3)

    {

        lv_chart_set_next_value(chart, ser4, newdata);  

    }

    if(index == 4)

    {

        lv_chart_set_next_value(chart, ser5, newdata);  

    }

    else

    {

        lv_chart_set_next_value(chart, ser6, newdata);  

    }

    if(refresh)

    {

        lv_chart_refresh(chart); /*Required after direct set*/

    }

    return 0;

}

 

struct repeating_timer timer;

 

int LCD_1in28_test(void)

{

    if (DEV_Module_Init() != 0)

    {

        return -1;

    }

    adc_init();

    adc_gpio_init(29);

    adc_select_input(3);

    LCD_1IN28_Init(VERTICAL);

    LCD_1IN28_Clear(WHITE);

    DEV_SET_PWM(60);

    add_repeating_timer_ms(5,timer_callback,0,&timer);

    ///sleep_ms(5000);

    lv_init();

    lv_port_disp_init();

    //lv_example_get_started_1();

 

    float acc[3], gyro[3];

    static int num = 0;

    unsigned int tim_count=0;

    adc_chart_init();

    QMI8658_init();

 

    while(1)

    {

        /* 读取采样值 */

        num++;

        QMI8658_read_xyz(acc, gyro, &tim_count);

        adc_chart_newdata(0,acc[0]*240/1024+120,0);

        adc_chart_newdata(1,acc[1]*240/1024+120,0);

        adc_chart_newdata(2,acc[2]*240/1024+120,0);

        adc_chart_newdata(3,gyro[0]*240/1024+120,0);

        adc_chart_newdata(4,gyro[1]*240/1024+120,0);

 

        if(num>=5)

        {

            num = 0;

            adc_chart_newdata(5,gyro[2]*240/1024+120,1);

            printf("acc_x   = %4.3fmg , acc_y  = %4.3fmg , acc_z  = %4.3fmg\r\n", acc[0], acc[1], acc[2]);

            printf("gyro_x  = %4.3fdps, gyro_y = %4.3fdps, gyro_z = %4.3fdps\r\n", gyro[0], gyro[1], gyro[2]);

        }

        else

        {

            adc_chart_newdata(5,gyro[2],0);

        }

 

        sleep_us(1000); /* 必须又sleep 否则定时器不会回调 */

        lv_task_handler();  

    }

 

    DEV_Module_Exit();

    return 0;

} RP2040-LCD-1.28.zip (28.11 MB, 下载次数: 1)

 

测试效果

 

 

总结

以上实现了简单的六轴加速度计的曲线显示,还可以优化下显示界面,比如显示数值等。

或者可以做成切换到罗盘等各种形式,有GUI后就可以自由发挥了。

 

 

此帖出自移动便携论坛

最新回复

六轴加速度计是板载的吗?   详情 回复 发表于 2022-12-8 09:07
点赞 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

六轴加速度计的曲线显示效果还是很不错的

此帖出自移动便携论坛
 
 
 

回复

6960

帖子

11

TA的资源

版主

板凳
 
感谢分享,历害了。
此帖出自移动便携论坛
 
 
 

回复

281

帖子

7

TA的资源

一粒金砂(高级)

4
 

感谢分享,历害了。

此帖出自移动便携论坛
 
 
 

回复

4908

帖子

12

TA的资源

版主

5
 

不错~厉害厉害~

此帖出自移动便携论坛
 
 
 

回复

6450

帖子

10

TA的资源

版主

6
 

六轴加速度计是板载的吗?

此帖出自移动便携论坛

点评

是的  详情 回复 发表于 2022-12-8 09:24
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

504

帖子

4

TA的资源

纯净的硅(高级)

7
 
秦天qintian0303 发表于 2022-12-8 09:07 六轴加速度计是板载的吗?

是的

此帖出自移动便携论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
ICC错误集锦 看懂ICC AVR的报错

新手用ICC编程的时候,经常会出现一些错误,现在将常见的错误报告整理如下。这里的一些错误是我为了展示而故意制造的,欢迎 ...

新年献礼:TI Stellaris系列原理图和封装

58493这个包含8962等封装 58494这个是9BXX系列的封装 本帖最后由 fengzhang2002 于 2011-1-1 14:01 编辑 ]

无线扩音器的设计与研究

http://player.youku.com/player.php/sid/XMjY0NzU1MzUy/v.swf 本帖最后由 37°男人 于 2011-5-9 11:19 编辑 ]

Helper2416开发板移植minigui3.0.12之一:让PC运行minigui

本帖最后由 Gyroxp 于 2015-1-25 11:30 编辑 笔者最近有时间学习嵌入式linux,于是熟悉了一下基本操作之后,选定了移植minigu ...

CircuitPython的冰柱滴水代码

518671 网友将冰柱滴水的代码移植到了CircuitPython上 https://github.com/gamblor21/pyicle

尝鲜测评|兆易创新GD32L233评估板,开启节能“芯”时代!

活动详情&板子资料:免费申请|兆易创新GD32L233尝鲜体验,开启节能“芯”时代! 兆易创新近期推出GD32L233 ...

Verilog关于inout端口电路的设计与仿真

// 模块功能说明 // 当方向控制信号“wr_”为“1”时,y_作为输出,值为输入信号a_的值 // 当方向控制信 ...

【得捷电子Follow me第1期】任务1:熟悉thonny软件和micropython的基本语法

Thonny 是一个适合初学者的 Python IDE,由爱沙尼亚的 Tartu 大学 开发,它采用了不同的方法,因为它的调试器是专为学习和教学编 ...

共聚焦显微镜——摩擦学领域的新款“滑板鞋”

两个物体表面相互接触即会产生相互作用力,研究具有相对运动的相互作用表面间的摩擦、润滑与磨损及其三者之间关系即为摩擦学,目 ...

老铁们,我回来了!

不忘初心,牢记使命! 加油加油加油!

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表