当前位置: 首页 > news >正文

【Beetle RP2350】摇杆控制自定义角度旋转舵机

一、硬件介绍

1、产品特点

Beetle RP2350【RP2350A_QFN60】是一款基于RP2350微控制器的高性能迷你开发板,双核双架构设计(支持 Arm Cortex-M33或Hazard3 RISC-V内核)为开发者提供灵活的性能配置。

双核双架构,性能自由切换

  • 采用Raspberry Pi RP2350高性能微控制器,支持Arm Cortex-M33Hazard3 RISC-V内核选择。
  • 主频高达150MHz,配备520KB RAM2MB Flash,可高效处理大量数据,满足高性能计算需求。

高度集成,硬币大小

  • 尺寸仅为25mm x 20.5mm,相当于一枚硬币大小,适合空间受限的应用场景。
  • 提供 11个IO接口BAT接口和3.3V电源接口,满足多样化连接需求。

锂电池管理与监测
集成 锂电池充电管理电池电压监测 功能,支持实时电量监控,确保设备在低电量时及时采取措施,确保持续运行。

易于编程与集成

  • 支持 C/C++ 和 MicroPython 编程
    在这里插入图片描述

2、功能引脚示意图 / 原理图

板载LED灯

IO25引脚控制

充电指示灯

指示充电状态的绿色LED灯

通过三种方式指示充电状态:

1、充满电或未接入电源时熄灭;

2、充电时常亮;

3、USB供电,未连接锂电池时高频闪烁;

用户按键

使用QSPI_SS引脚控制该按钮

在这里插入图片描述

引脚号数字口模拟口UARTI2CSPI其它
0D0TX1
1D1RX1
4D4SDA
5D5SCL
8D8TX2
9D9RX2
16D16SPI0/MISO
18D18SPI0/SCK
19D19SPI0/MOSI
26D26A0
27D27A1
BAT锂电池输入接口,IO29为电池电压检测引脚
GND接地引脚
VCC该引脚接在USB电源引脚,作为输出时电压为USB电压,通常为5V
3V33.3V稳压电源输出

主要原理图:

在这里插入图片描述

3、外部硬件

1、摇杆模块

该模块为一个双向的10K电阻器,随着摇杆方向变化,阻值也会随着变化,从而改变输出的值。

本模块可用 5V / 3.3V 供电,初始状态下X,Y读出电压为供电电压的1/2左右( 1.65V / 2.5V );
当随着X、Y方向移动,读出电压值减小(0V) / 增大(VCC);
其中X、Y方向输出的数据为模拟量,而Z轴输出的为数字量 (0 / 1)

在这里插入图片描述

模块引脚介绍:

模块引脚功能
+5V3.3V / 5V
VRXX方向模拟量(0~3.3v) 初始值: 1.65V
VRYY方向模拟量(0~3.3v) 初始值: 1.65V
SWZ方向上的按键 (0 / 1)
2、360°舵机模块【MG90S】

当接收到脉冲信号时,舵机会根据信号的脉宽计算需要转动的角度,并通过电机驱动器输出转动力矩,从而控制输出轴的旋转。
通过内部的位置反馈器,舵机可以检测电机当前的位置和角度,并精确地控制输出轴的角度和位置。

脉冲宽度(周期20ms)方向和速度
0.5ms顺时针,速度快
1.0ms顺时针,速度慢
1.5ms停止
2.0ms逆时针,速度慢
2.5ms逆时针,速度快

在这里插入图片描述
在这里插入图片描述

二、硬件连接

模块与开发板引脚之间的连接方式如下:

RP2350开发板VCCGNDD0D26(A0)D27(A1)D43V3
舵机模块5VGND信号线----
摇杆模块-GND-VRXVRYSW3V3

实物效果搭建如下:

在这里插入图片描述

三、项目功能实现思想

【摇杆自定义旋转舵机】

实现效果:

通过摇杆旋转方向及范围以控制舵机运行的方向和与之对应的速度快慢;

当按下摇杆按键时,增大 / 减小此时运行的速度,并点亮 / 熄灭板载LED;

并且在串口上输出相关的运动信息;

开发板通过ADC引脚获取摇杆移动时的数据,并通过转换后将数据输出到PWM引脚上从而控制舵机运行;

运行流程图如下:

在这里插入图片描述
在这里插入图片描述

四、功能实现主要步骤

主要相关代码

1、LED控制部分

int Led_State = LOW;void Led_Init(){pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, Led_State); 
}void Led_Control(){Led_State = !Led_State;digitalWrite(LED_BUILTIN, Led_State); 
}

2、摇杆控制部分

int X_Pin = A0;
int Y_Pin = A1;
int Z_Pin = D4;
int X_Data = 0,Y_Data = 0,Z_Data = 1;
int X_Pos = 498,Y_Pos = 505,X_Min = 0,Y_Min = 0,X_Max = 1017,Y_Max = 1017;void Controller_Init(){pinMode(X_Pin, INPUT);pinMode(Y_Pin, INPUT);pinMode(Z_Pin, INPUT_PULLUP);
}void Controller_Get(){X_Data = analogRead(X_Pin);Y_Data = analogRead(Y_Pin);
}

3、舵机控制部分

#include <Servo.h>int speed = 0;
int percent = 0; int Servo_Pin = D0;
Servo myservo; void Servo_Init(){myservo.attach(Servo_Pin, 500, 2500); // 0.5ms ~ 2.5ms
}void Servo_Stop(){myservo.writeMicroseconds(1500); // STOP
}void Servo_Control(){Controller_Get();if(!digitalRead(Z_Pin)){delay(50);if(!digitalRead(Z_Pin)){Led_Control();}}else if(X_Data >X_Pos) //正向{if(Led_State){speed = map(Y_Data,0,1017,1500,500);myservo.writeMicroseconds(speed); // 顺时针Fastpercent = map(speed,500,1500,100,0);Serial.print("舵机加速顺时针运行速度为:");Serial.print(percent);Serial.println(" %");}else{speed = map(Y_Data,0,1017,1500,1000);myservo.writeMicroseconds(speed); // 顺时针SLOWpercent = map(speed,1000,1500,100,0);Serial.print("舵机顺时针运行速度为:");Serial.print(percent);Serial.println(" %");}}else if(X_Data < X_Pos){if(Led_State){speed = map(Y_Data,0,1017,1500,2500);myservo.writeMicroseconds(speed); // 逆时针Fastpercent = map(speed,1500,2500,0,100);Serial.print("舵机加速逆时针运行速度为:");Serial.print(percent);Serial.println(" %");}else{speed = map(Y_Data,0,1017,1500,2000); myservo.writeMicroseconds(speed); // 逆时针SLOW percent = map(speed,1500,2000,0,100);Serial.print("舵机逆时针运行速度为:");Serial.print(percent);Serial.println(" %");}}else if(X_Data == X_Pos || Y_Data == Y_Pos)  //停止{Servo_Stop();Serial.println("舵机已停止");}
}

完整代码

#include <Servo.h>
int Led_State = LOW;
int X_Pin = A0;
int Y_Pin = A1;
int Z_Pin = D4;
int X_Data = 0,Y_Data = 0,Z_Data = 1;
int X_Pos = 498,Y_Pos = 505,X_Min = 0,Y_Min = 0,X_Max = 1017,Y_Max = 1017;int speed = 0;
int percent = 0; 
int Servo_Pin = D0;
Servo myservo; void Led_Init(){pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, Led_State); 
}void Led_Control(){Led_State = !Led_State;digitalWrite(LED_BUILTIN, Led_State); 
}void Controller_Init(){pinMode(X_Pin, INPUT);pinMode(Y_Pin, INPUT);pinMode(Z_Pin, INPUT_PULLUP);
}void Controller_Get(){X_Data = analogRead(X_Pin);Y_Data = analogRead(Y_Pin);
}void Servo_Init(){myservo.attach(Servo_Pin, 500, 2500); // 0.5ms ~ 2.5ms
}void Servo_Stop(){myservo.writeMicroseconds(1500); // STOP
}void Servo_Control(){Controller_Get();if(!digitalRead(Z_Pin)){delay(50);if(!digitalRead(Z_Pin)){Led_Control();}}else if(X_Data >X_Pos) //正向{if(Led_State){speed = map(Y_Data,0,1017,1500,500);myservo.writeMicroseconds(speed); // 顺时针Fastpercent = map(speed,500,1500,100,0);Serial.print("舵机加速顺时针运行速度为:");Serial.print(percent);Serial.println(" %");}else{speed = map(Y_Data,0,1017,1500,1000);myservo.writeMicroseconds(speed); // 顺时针SLOWpercent = map(speed,1000,1500,100,0);Serial.print("舵机顺时针运行速度为:");Serial.print(percent);Serial.println(" %");}}else if(X_Data < X_Pos){if(Led_State){speed = map(Y_Data,0,1017,1500,2500);myservo.writeMicroseconds(speed); // 逆时针Fastpercent = map(speed,1500,2500,0,100);Serial.print("舵机加速逆时针运行速度为:");Serial.print(percent);Serial.println(" %");}else{speed = map(Y_Data,0,1017,1500,2000); myservo.writeMicroseconds(speed); // 逆时针SLOW percent = map(speed,1500,2000,0,100);Serial.print("舵机逆时针运行速度为:");Serial.print(percent);Serial.println(" %");}}else if(X_Data == X_Pos || Y_Data == Y_Pos)  //停止{Servo_Stop();Serial.println("舵机已停止");}
}void setup() {Serial.begin(9600);while (!Serial);Led_Init();Controller_Init();Servo_Init();
}void loop() {Servo_Control();delay(200);
}

五、实现现象

通过移动摇杆的方向以及移动范围,从而控制舵机运行的方向以及运行速度;
按下按钮时,开启加速模式(开启板载LED) / 普通运行模式(关闭板载LED);
串口输出相关运动信息;

在这里插入图片描述


文章转载自:

http://9hWiXD8R.Lfcnj.cn
http://dBSFSiZ4.Lfcnj.cn
http://kXdPl88C.Lfcnj.cn
http://a4Qih77f.Lfcnj.cn
http://FTaFzwf4.Lfcnj.cn
http://tQBWhyiG.Lfcnj.cn
http://ghOKCgvQ.Lfcnj.cn
http://Ru6CTYc4.Lfcnj.cn
http://GTxzWpjH.Lfcnj.cn
http://KrQpqrnS.Lfcnj.cn
http://hZBQr46a.Lfcnj.cn
http://rUTQoicO.Lfcnj.cn
http://jEiWkpw3.Lfcnj.cn
http://QykvTDDA.Lfcnj.cn
http://eZ7Pc94g.Lfcnj.cn
http://hx9mmy5C.Lfcnj.cn
http://kWnJUmXq.Lfcnj.cn
http://exoNN3Is.Lfcnj.cn
http://Pawjv2KE.Lfcnj.cn
http://0WKx1xJm.Lfcnj.cn
http://GowDafQh.Lfcnj.cn
http://Xuqmwo8v.Lfcnj.cn
http://NpIWsjpU.Lfcnj.cn
http://nOl7wqTx.Lfcnj.cn
http://JfB7uC51.Lfcnj.cn
http://cwFk6G5Y.Lfcnj.cn
http://iUPhTDTC.Lfcnj.cn
http://B4hpW5Wo.Lfcnj.cn
http://JTPfAIfR.Lfcnj.cn
http://uDuu0z33.Lfcnj.cn
http://www.dtcms.com/a/370844.html

相关文章:

  • 波特率vs比特率
  • C++ 14新增特性以及代码示例
  • SDRAM详细分析-08 数据手册解读
  • 51单片机---硬件学习(电子琴、主从应答模式、modbus模型、DS18B20传感器显示温度)
  • Blender 3D建模工具学习笔记
  • k8s网络原理
  • 新后端漏洞(上)- Weblogic SSRF漏洞
  • LockSupport详解以及使用
  • 【73页PPT】智慧方案业务协同管理平台解决方案(附下载方式)
  • Qt的入门
  • v0.29.1 敏感词性能优化之内部类+迭代器内部类
  • 【C++ 启发式搜索算法】
  • 个人成长职业发展
  • AI、人工智能础: 实体命名!
  • LeetCode 刷题【66. 加一、67. 二进制求和】
  • langchain源码概览
  • 07-任务调度器的挂起和恢复
  • dask.dataframe.shuffle.set_index中获取 divisions 的步骤分析
  • 【Go项目基建】GORM框架实现SQL校验拦截器(完整源码+详解)
  • 数据结构——栈(Java)
  • golang连接influxdb的orm操作
  • C#中一段程序类比博图
  • rh134第三章复习总结
  • Spring的事件监听机制(一)
  • 【鸿蒙 NEXT】V1迁移V2状态管理
  • FRCNet
  • git 冲突,Merge
  • NAND Flash块擦除与数据状态解析
  • 分享一个基于Python+大数据的房地产一手房成交数据关联分析与可视化系统,基于机器学习的深圳房产价格走势分析与预测系统
  • 超文本的定义