登录发现更多内容
首页
分类
发帖
账号
自动登录
找回密码
密码
登录
立即注册
立即登录
立即注册
其他登录
QQ
微信
首页
Portal
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
产品教程
BBS
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
开发资料
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
样品购买
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
IoT云平台
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
GitHub
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
技术博客
求助问答
Xiuno资源
Xiuno教程
Xiuno插件
Xiuno主题
休闲茶馆
定制主题
搜索
搜索
热搜:
LoRa
ESP8266
安信可
本版
帖子
用户
请
登录
后使用快捷导航
没有账号?
立即注册
每日签到
任务
广播
导读
排行榜
设置
我的收藏
退出
18
1
2
首页
Ai-M61系列
›
【外设移植】双轴按键摇杆模块Ai-M61开发板 ...
1
2
/ 2 页
下一页
返回列表
【外设移植】双轴按键摇杆模块Ai-M61开发板
[ 复制链接 ]
发布帖子
zlook119
高级会员
7
主题
19
回帖
804
积分
高级会员
高级会员, 积分 804, 距离下一级还需 196 积分
高级会员, 积分 804, 距离下一级还需 196 积分
积分
804
私信
18人留言
楼主
Ai-M61系列
7242
18
2024-2-18 21:57:40
[i=s] 本帖最后由 zlook119 于 2024-2-18 22:10 编辑 [/i]
## 一、外设介绍 > 双轴按键摇杆模块采用金属按键摇杆电位器,模块包含两路模拟输出和一路数字输出接口, > > * 摇杆输出值分别对应(X、Y)双轴偏移量,其类型为模拟量 > * 按键表示用户是否在Z轴上按下,其类型位数字开关量。 > 其可以轻松控制物体(如二自由度舵机云台)在二维空间运动,因此可以通过控制器编程,传感器扩展板插接,完成具有创意性遥控互动作品。  ## 二、外设规格参数 > 1. 输入电压范围3.3V-5V > 2. 模块尺寸34mmX26mmX32mm 长宽高 ## 三、移植过程 #### M61与双轴按键摇杆模块接线 ##### 连接示意图  ##### 实际连接图  #### **由于读取引脚为模拟量,参考小泽哥的这篇文章学习了一下如何读取ADC值** ```http (十二)零基础开发小安派-Eyes-S1【外设篇】——ADC [https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=41948](https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=41948) ``` #### 这里粘贴一下```bflb_joystick.c```程序进一步解释ADC读取过程 ```c #include "bflb_gpio.h" #include "bflb_joystick.h" struct bflb_device_s *adc; struct bflb_device_s *gpio; //初始化一个结构体指针作为外设句柄 void generate_adc_channels(int pin_x, int pin_y, struct bflb_adc_channel_s chan[]) { // 构建一个pin引脚到通道的映射 chan[0].neg_chan = ADC_CHANNEL_GND; chan[1].neg_chan = ADC_CHANNEL_GND; // 根据pin_x和pin_y输出对应pos_chan switch (pin_x) { case GPIO_PIN_20: chan[0].pos_chan = ADC_CHANNEL_0; break; case GPIO_PIN_19: chan[0].pos_chan = ADC_CHANNEL_1; break; case GPIO_PIN_14: chan[0].pos_chan = ADC_CHANNEL_4; break; case GPIO_PIN_13: chan[0].pos_chan = ADC_CHANNEL_5; break; case GPIO_PIN_12: chan[0].pos_chan = ADC_CHANNEL_6; break; case GPIO_PIN_10: chan[0].pos_chan = ADC_CHANNEL_7; break; case GPIO_PIN_1: chan[0].pos_chan = ADC_CHANNEL_8; break; case GPIO_PIN_0: chan[0].pos_chan = ADC_CHANNEL_9; break; case GPIO_PIN_27: chan[0].pos_chan = ADC_CHANNEL_10; break; case GPIO_PIN_28: chan[0].pos_chan = ADC_CHANNEL_11; break; } switch (pin_y) { case GPIO_PIN_20: chan[1].pos_chan = ADC_CHANNEL_0; break; case GPIO_PIN_19: chan[1].pos_chan = ADC_CHANNEL_1; break; case GPIO_PIN_14: chan[1].pos_chan = ADC_CHANNEL_4; break; case GPIO_PIN_13: chan[1].pos_chan = ADC_CHANNEL_5; break; case GPIO_PIN_12: chan[1].pos_chan = ADC_CHANNEL_6; break; case GPIO_PIN_10: chan[1].pos_chan = ADC_CHANNEL_7; break; case GPIO_PIN_1: chan[1].pos_chan = ADC_CHANNEL_8; break; case GPIO_PIN_0: chan[1].pos_chan = ADC_CHANNEL_9; break; case GPIO_PIN_27: chan[1].pos_chan = ADC_CHANNEL_10; break; case GPIO_PIN_28: chan[1].pos_chan = ADC_CHANNEL_11; break; } } void bflb_joystick_init(uint8_t pin_x, uint8_t pin_y, uint8_t pin_sw){ struct bflb_adc_channel_s chan[2]; generate_adc_channels(pin_x, pin_y, chan); gpio = bflb_device_get_by_name("gpio"); adc = bflb_device_get_by_name("adc"); bflb_gpio_init(gpio, pin_x, GPIO_ANALOG | GPIO_SMT_EN | GPIO_DRV_0); bflb_gpio_init(gpio, pin_y, GPIO_ANALOG | GPIO_SMT_EN | GPIO_DRV_0); bflb_gpio_init(gpio, pin_sw, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0); /* adc clock = XCLK / 2 / 32 */ //ADC的一些配置 struct bflb_adc_config_s cfg; cfg.clk_div = ADC_CLK_DIV_32; cfg.scan_conv_mode = true; cfg.continuous_conv_mode = false; cfg.differential_mode = false; cfg.resolution = ADC_RESOLUTION_16B; cfg.vref = ADC_VREF_3P2V; bflb_adc_init(adc, &cfg); bflb_adc_channel_config(adc, chan, 2); } void bflb_joystick_read(struct bflb_joystick_attr* values, uint8_t pin_sw){ bflb_adc_start_conversion(adc); // 开启adc采集 while (bflb_adc_get_count(adc) < 2) { bflb_mtimer_delay_ms(1); // 将adc队列采集完毕 } uint32_t raw_data_x = bflb_adc_read_raw(adc); // FIFO中读取第一次采集数据 bflb_adc_parse_result(adc, &raw_data_x, &values->result_x, 1); uint32_t raw_data_y = bflb_adc_read_raw(adc); // FIFO中读取第二次采集数据 bflb_adc_parse_result(adc, &raw_data_y, &values->result_y, 1); values->result_sw = bflb_gpio_read(gpio, pin_sw); // 读取GPIO_PIN状态 bflb_adc_stop_conversion(adc); } ``` 总共包含三个函数 ```generate_adc_channels``` 建立PIN引脚和ADC的映射关系 ```bflb_joystick_init``` 摇杆初始化函相关函数 ```bflb_joystick_read``` 摇杆读取并获取数据的函数 #### 这里贴一下```bflb_joystick.h```程序运行的头文件 ```h #ifndef BFLB_JOYSTICK_H #define BFLB_JOYSTICK_H #include "bflb_adc.h" #include "bflb_gpio.h" struct bflb_joystick_attr{ struct bflb_adc_result_s result_x; struct bflb_adc_result_s result_y; bool result_sw; }; void bflb_joystick_init(uint8_t pin_x, uint8_t pin_y, uint8_t pin_sw); void bflb_joystick_read(struct bflb_joystick_attr* values, uint8_t pin_sw); #endif // BFLB_JOYSTICK_H ``` #### 粘贴一下我的测试```main.c```程序 ```c #include "board.h" #include "bflb_mtimer.h" #include "bflb_gpio.h" #include "bflb_joystick.h" int main(void) { board_init(); bflb_joystick_init(GPIO_PIN_19, GPIO_PIN_10, GPIO_PIN_13); struct bflb_joystick_attr myJoystick; while (1) { // 调用函数读取摇杆数据 bflb_joystick_read(&myJoystick, GPIO_PIN_13); // 显示读取的数据 printf(">X轴通道:%d X轴位置:%d X轴电压:%d\n", myJoystick.result_x.pos_chan,myJoystick.result_x.value,myJoystick.result_x.millivolt); printf(">Y轴通道:%d Y轴位置:%d Y轴电压:%d\n", myJoystick.result_y.pos_chan,myJoystick.result_y.value,myJoystick.result_y.millivolt); printf(">开关状态:%d\n", myJoystick.result_sw); bflb_mtimer_delay_ms(500); } } ``` #### 最后粘贴一下我跑的结果 ##### 运行结果  ## 最最后,感谢大家看到这里,因为是头一次接触M61及相关的编程,可能程序部分优化的还不够,感谢大家耐心观看并指正错误,希望大家共同进步,如果有不明白的地方可以在下边留言,我看到的话会及时回复大家,谢谢
[attach]19710[/attach]
点赞
1
收藏
2
淘帖
0
────
1
人觉得很赞
────
本主题由 管理团队 于 2026-7-3 10:16 移动
回复
使用道具
举报
18 回复
电梯直达
正序浏览
倒序浏览
正序浏览
沙发
物联网
回复
使用道具
举报
2024-2-18 22:15:27
赞一个
回复
评论
使用道具
举报
板凳
爱笑
回复
使用道具
举报
2024-2-19 08:30:18
回复
评论
使用道具
举报
用心做好保姆工作
地板
WT_0213
回复
使用道具
举报
2024-2-19 08:34:47
赞个
回复
评论
使用道具
举报
5
#
曹县
回复
使用道具
举报
2024-2-19 09:03:05
回复
评论
使用道具
举报
6
#
bzhou830
回复
使用道具
举报
2024-2-19 09:04:59
赞个
回复
评论
使用道具
举报
选择去发光,而不是被照亮
7
#
lazy
回复
使用道具
举报
2024-2-19 09:22:24
赞
回复
评论
使用道具
举报
8
#
曹县
回复
使用道具
举报
2024-2-19 10:26:27
回复
评论
使用道具
举报
9
#
noonezero
回复
使用道具
举报
2024-2-19 11:20:37
赞
回复
评论
使用道具
举报
10
#
粉色小风扇
回复
使用道具
举报
2024-2-19 15:43:55
666
回复
评论
使用道具
举报
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
立即登录
手机登录
点评
高级模式
本版积分规则
回帖并转播
回帖后跳转到最后一页
下一页 »
1
2
/ 2 页
下一页
浏览过的版块
小安派·S1
今日推荐
九章验证板——智能家居项目
Ai-Thinker Skills 正式发布!快来试试!
九章开发板疑问
🔌手把手!1T1R 毫米波测距演示怎么跑?接入与 Python 环境配置
ONELAB开发套件常见问题Q&A:距离、角度、速度、距离门设置
【九章MCP验证板】开发环境配置教程
AI-WV02-32S 铁板烧焊接翻车
不用写代码,先跑通这两个开源例程,感受毫米波能做什么
【体验】Ai-WV02-32S 这不就跑起来了么
【问题】Ai-WV02-32S 短路
热帖排行
九章验证板——智能家居项目
VC01的模块,在语音平台设置了串口功能,但是没起作用
Ai-Thinker Skills 正式发布!快来试试!
九章开发板疑问
🔌手把手!1T1R 毫米波测距演示怎么跑?接入与 Python 环境配置
ONELAB开发套件常见问题Q&A:距离、角度、速度、距离门设置
【九章MCP验证板】开发环境配置教程
TB-04模块 从机收不到主机信息
统计信息
会员数: 31191 个
话题数: 42269 篇
首页
分类
我的