登录发现更多内容
首页
分类
发帖
账号
自动登录
找回密码
密码
登录
立即注册
立即登录
立即注册
其他登录
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-Kit外设移植教程
›
【外设移植】双轴按键摇杆模块Ai-M61开发板 ...
1
2
/ 2 页
下一页
返回列表
【外设移植】双轴按键摇杆模块Ai-M61开发板
[ 复制链接 ]
发布帖子
zlook119
高级会员
7
主题
19
回帖
804
积分
高级会员
高级会员, 积分 804, 距离下一级还需 196 积分
高级会员, 积分 804, 距离下一级还需 196 积分
积分
804
私信
18人留言
楼主
Ai-M61-Kit外设移植教程
6132
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
人觉得很赞
────
回复
使用道具
举报
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 页
下一页
今日推荐
BW16打板擦除失败是什么原因
我在Application中使能了blinky sample, 程序并没有运行
机器人量产,以后会不会搬砖越来越难
FreeRTOS学习-02-i2c
FreeRTOS学习-01-PWM
FreeRTOS学习-00-led
AI-WV02-32S 无法烧录 ErrorCode: 003B, ErrorMsg: BFLB FLASH S
Ai-M61-32SU 模块硬件版本 V1.2-A1
浅尝bouffalo_sdk
腾讯WorkBuddy 编程测试
热帖排行
SDK包bouffalo_sdk-master中peripherals例子 mtimer疑问
开发板是Ai-M61-32S,询问引脚定义
BW16打板擦除失败是什么原因
RD-03Dv2不需要重新生成门限?
BW20-12F怎么关闭设备自动初始化wifi
分享一个AI硬件 的软件,非广告
新人报道!
我在Application中使能了blinky sample, 程序并没有运行
统计信息
会员数: 30993 个
话题数: 44907 篇
首页
分类
我的