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

[复制链接]
查看833 | 回复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

本帖被以下淘专辑推荐:

选择去发光,而不是被照亮
回复

使用道具 举报

bzhou830 | 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, 下载次数: 4

选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

lovzx | 2024-9-21 15:33:39 | 显示全部楼层
我的有一个轴精度不行,突变太离谱,
回复 支持 反对

使用道具 举报

bzhou830 | 2024-9-21 19:26:33 | 显示全部楼层
lovzx 发表于 2024-9-21 15:33
我的有一个轴精度不行,突变太离谱,

正常,这种摇杆模块变阻器很水
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

iiv | 2024-9-21 20:45:44 | 显示全部楼层
这个俺也有,改天试一下
回复 支持 反对

使用道具 举报

爱笑 | 2024-9-23 09:35:48 | 显示全部楼层
用心做好保姆工作
回复

使用道具 举报

一只呆头鹅 | 2024-9-27 09:48:37 | 显示全部楼层
学习学习
回复

使用道具 举报

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

本版积分规则