发帖
6 0 0

【外设移植】Ai-WB2+双轴摇杆模块

bzhou830
论坛元老

72

主题

1449

回帖

1万

积分

论坛元老

积分
12106
Ai-WB2系列 1217 6 2024-9-21 14:53:18

外设介绍

双轴摇杆模块采用PS2游戏手柄上金属按键摇杆电位器、模块设置二路模拟输出和一路数字输出接口、输出值分别对应(x、y双轴偏移量,其类型为模拟量。按键表示用户是否在z轴上按下、其类型为数字开关量。

image.png

模块接口如下:
image.png

移植过程

根据上述的分析可知,我们需要:

  1. 两路ADC分别用来采集x轴和y轴的模拟值;
  2. 一路GPIO输入用来检测Z轴上的数字输出;

总结一下就是要使用到ADC和GPIO输入两个功能。

GPIO的使用可以参考:【Ai-WB2入门篇】GPIO使用 - Ai-WB2系列 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)

ADC的使用则可以参考:【Ai-WB2中级篇】ADC模数转换 - Ai-WB2系列 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)

需要注意的是上述ADC的使用中这里面只使用到了1个通道,而我们这里需要同时使用两个通道,这个需要翻一下文档来拆看对应API的调用。翻阅文档可以找到:

int hosal_adc_add_channel(hosal_adc_dev_t *adc,uint32_t channel)

添加向ADC设备添加ADC通道。参数说明如下:

  • adc:ADC端口设备
  • channel:需要添加的ADC通道
  • 返回值:成功时返回0,否则返回EIO或其他值

知道了这个,那么我们就可以添加多个ADC采集通道了。

硬件接线

硬件的连接,左边为WB2, 右边为双轴遥感

IO11 ---> VRX

IO5 ---> VRY

IO3 ---> SW

3V3 ---> 5V

GND ---> GND

image.png

代码解析

#include <stdio.h>
#include <string.h>
#include <FreeRTOS.h>
#include <task.h>
#include <hosal_adc.h>
#include <hosal_gpio.h>
#include <bl_adc.h>
#include <bl_gpio.h>
#include <blog.h>

/**********   BL602 ADC ************
*    channel0   ----->     gpio12
*    channel1   ----->     gpio4
*    channel2   ----->     gpio14
*    channel3   ----->     gpio13
*    channel4   ----->     gpio5
*    channel5   ----->     gpio6
*    channel7   ----->     gpio9
*    channel9   ----->     gpio10
*    channel10  ----->     gpio11
*    channel11  ----->     gpio15
*/

#define ADC_X_PIN           11
#define ADC_Y_PIN           5
#define KEY_PIN             3

void main(void)
{
    static uint8_t key_state = 0;
    static hosal_gpio_dev_t key;
    key.port = KEY_PIN;
    key.config = INPUT_PULL_UP;
    hosal_gpio_init(&key);

    static hosal_adc_dev_t adc0 = {
        .cb = NULL,
        .config = {
            .mode = HOSAL_ADC_ONE_SHOT,
            .pin = ADC_X_PIN,
            .sampling_freq = 340,
        },
        .dma_chan = 0,
        .p_arg = NULL,
        .port = 0,
    };

    hosal_adc_init(&adc0);

    hosal_adc_add_channel(&adc0, bl_adc_get_channel_by_gpio(ADC_X_PIN));
    hosal_adc_add_channel(&adc0, bl_adc_get_channel_by_gpio(ADC_Y_PIN));

    for (;;)
    {
        int v_y = hosal_adc_value_get(&adc0, bl_adc_get_channel_by_gpio(ADC_Y_PIN), 100);
        int v_x = hosal_adc_value_get(&adc0, bl_adc_get_channel_by_gpio(ADC_X_PIN), 100);
        hosal_gpio_input_get(&key, &key_state);

        blog_info("x = %ld mV, y = %ld mV, btn = %d\r\n", v_y, v_x, key_state);

        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

结果验证

image.png

──── 0人觉得很赞 ────

使用道具 举报

2024-9-24 06:02:43
本帖最后由 bzhou830 于 2024-9-24 10:41 编辑

![Snipaste_2024-09-24_05-59-46.png](data/attachment/forum/202409/24/060240v4cg5fbkn959fz9a.png "Snipaste_2024-09-24_05-59-46.png")
Snipaste_2024-09-24_05-59-46.png

demo_xy.tar

919.5 KB, 下载次数: 8

2024-9-21 15:33:39
我的有一个轴精度不行,突变太离谱,
2024-9-21 19:26:33
lovzx 发表于 2024-9-21 15:33
我的有一个轴精度不行,突变太离谱,

正常,这种摇杆模块变阻器很水
2024-9-21 20:45:44
这个俺也有,改天试一下
2024-9-23 09:35:48
学习学习
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28200 个
  • 话题数: 40097 篇