云课五分钟-Arduino wokwi和步进电机实验报告快速撰写

news2024/9/25 16:28:16

wokwi

程序

#include <AccelStepper.h>
// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
// This defines the analog input pin for reading the control voltage
// Tested with a 10k linear pot between 5v and GND
const byte PositionPot = A0;
const byte AccelerationPot = A1;
void setup()
{  
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(35);
}
void loop()
{
  // Read new position
  int analog_in = analogRead(PositionPot);
  stepper.setAcceleration(analogRead(AccelerationPot));
  stepper.moveTo(analog_in);
  stepper.run();
}

仿真 

 

频率控制步进电机转速。 


 

实践项目名称

基于Arduino的步进电机速度与位置控制实践

实践目的

通过实践掌握使用Arduino和AccelStepper库控制步进电机的基本方法,实现根据模拟输入(电位器)动态调整电机的目标位置和加速度,进一步理解步进电机的工作原理及其在开环控制系统中的应用。

实践设备

  1. Arduino开发板(如Arduino Uno)
  2. 步进电机及驱动器
  3. 电位器(2个,用于位置和加速度控制)
  4. 面包板和连接线
  5. 电脑及Arduino IDE软件
  6. AccelStepper库

实践原理

本实践利用Arduino读取两个电位器的模拟信号,分别作为步进电机的目标位置和加速度的控制输入。通过AccelStepper库,可以方便地设置步进电机的最大速度、加速度,并根据输入信号动态调整电机的运行状态。电位器的阻值变化被转换为0-1023的数字信号(Arduino的模拟输入分辨率),用于控制电机的不同参数。

实践内容

  1. 组装电路:将步进电机驱动器与Arduino、步进电机以及电位器正确连接。确保电位器的中心端接Arduino的模拟输入引脚(A0和A1),另一端分别接5V和GND,形成电压分压电路。
  2. 编写并上传代码:在Arduino IDE中编写控制程序,设置步进电机的最大速度和初始加速度,然后在循环中读取电位器的值来调整电机的目标位置和加速度,并执行电机的运行。
  3. 测试与调试:运行程序,观察步进电机根据电位器调节的反应,验证电机的位置控制和加速度调整是否准确、平滑。

思考题及作答

思考题

  1. 如果将电位器的连接改为使用数字引脚而不是模拟引脚,程序应该如何修改以实现对步进电机的控制?
  2. 程序中stepper.setAcceleration(analogRead(AccelerationPot));一行直接使用了模拟读数值作为加速度,这样做有何潜在问题?如何改进?

作答

  1. 如果将电位器连接到数字引脚,由于数字引脚只能读取高低电平(0或1),无法直接获取连续的模拟值,因此无法直接使用电位器来调节控制参数。一种替代方案是使用PWM(脉冲宽度调制)输出,虽然它本质上是数字信号,但可以通过调整占空比来模拟不同的控制级别。另一种方法是使用外部ADC(模拟数字转换器)模块来将电位器的模拟信号转换为数字信号,再由Arduino读取。

  2. 直接使用analogRead()的返回值作为加速度值存在几个潜在问题:首先,analogRead()的返回值范围是0-1023,而加速度的合理范围可能远小于这个值,导致加速度设置过大或过小,不易控制;其次,模拟信号可能受到噪声干扰,导致加速度值不稳定。改进的方法是先将analogRead()的值映射到一个更合适的加速度范围内,例如使用map()函数,同时可以增加一些平滑处理(如滑动平均)来减少噪声的影响。示例代码修改如下:

    int rawAcceleration = analogRead(AccelerationPot);  
    int mappedAcceleration = map(rawAcceleration, 0, 1023, 0, 100); // 假设合适的加速度范围是0-100  
    stepper.setAcceleration(mappedAcceleration);

    cpp复制代码

    int rawAcceleration = analogRead(AccelerationPot);
    int mappedAcceleration = map(rawAcceleration, 0, 1023, 0, 100); // 假设合适的加速度范围是0-100
    stepper.setAcceleration(mappedAcceleration);

    这样,加速度值就被限制在了一个更合理的范围内,且更容易通过电位器进行精细调整。


云课五分钟-Arduino wokwi和步进电机实验报告快速撰写


 

详细介绍

代码概述

提供的代码是一个基于Arduino平台的简单示例,用于控制步进电机的位置和加速度。它使用了AccelStepper库,这是一个专为步进电机设计的Arduino库,支持多种步进模式(如单步、双步、半步和微步)以及加速和减速功能。

硬件连接

  • 步进电机通过驱动器与Arduino的2、3、4、5号数字引脚相连,这些引脚默认被AccelStepper库用作FULL4WIRE模式的控制引脚。
  • 两个电位器分别连接到A0和A1模拟输入引脚,用于控制步进电机的目标位置和加速度。

代码解析

  • AccelStepper stepper;:声明一个AccelStepper对象,默认使用FULL4WIRE模式和2, 3, 4, 5引脚。
  • const byte PositionPot = A0; 和 const byte AccelerationPot = A1;:定义电位器连接的模拟输入引脚。
  • setup() 函数中设置了步进电机的最大速度(setMaxSpeed(1000))和初始加速度(setAcceleration(35))。
  • loop() 函数是一个无限循环,用于不断读取电位器的值并更新步进电机的目标位置和加速度。

潜在问题

  1. 直接使用analogRead()的返回值作为加速度可能导致加速度值过大或过小,因为analogRead()的返回值范围是0-1023。通常,需要将这个值映射到一个更合适的加速度范围内。
  2. 加速度值的变化可能过于频繁,导致电机运行不稳定。可以通过增加一些平滑处理(如滑动平均)来减少噪声的影响。

更多示例

示例1:映射加速度值

在这个示例中,我们将analogRead()的返回值映射到一个更合适的加速度范围内(例如0-100):

#include <AccelStepper.h>  
  
AccelStepper stepper;  
  
const byte PositionPot = A0;  
const byte AccelerationPot = A1;  
  
void setup() {  
  stepper.setMaxSpeed(1000);  
  stepper.setAcceleration(35);  
}  
  
void loop() {  
  int position = analogRead(PositionPot);  
  int rawAcceleration = analogRead(AccelerationPot);  
  int mappedAcceleration = map(rawAcceleration, 0, 1023, 0, 100); // 映射到0-100范围  
  stepper.setAcceleration(mappedAcceleration);  
  stepper.moveTo(position);  
  stepper.run();  
}

cpp复制代码

#include <AccelStepper.h>
AccelStepper stepper;
const byte PositionPot = A0;
const byte AccelerationPot = A1;
void setup() {
stepper.setMaxSpeed(1000);
stepper.setAcceleration(35);
}
void loop() {
int position = analogRead(PositionPot);
int rawAcceleration = analogRead(AccelerationPot);
int mappedAcceleration = map(rawAcceleration, 0, 1023, 0, 100); // 映射到0-100范围
stepper.setAcceleration(mappedAcceleration);
stepper.moveTo(position);
stepper.run();
}

示例2:增加平滑处理

在这个示例中,我们使用滑动平均来减少加速度值变化中的噪声:

#include <AccelStepper.h>  
  
AccelStepper stepper;  
  
const byte PositionPot = A0;  
const byte AccelerationPot = A1;  
const int smoothFactor = 10; // 平滑因子,越大越平滑  
int accelerationValues[smoothFactor];  
int accelerationIndex = 0;  
int smoothAcceleration = 0;  
  
void setup() {  
  stepper.setMaxSpeed(1000);  
  stepper.setAcceleration(35);  
    
  // 初始化加速度值数组  
  for (int i = 0; i < smoothFactor; i++) {  
    accelerationValues[i] = 0;  
  }  
}  
  
void loop() {  
  int position = analogRead(PositionPot);  
  int rawAcceleration = analogRead(AccelerationPot);  
  
  // 更新加速度值数组并计算滑动平均  
  accelerationValues[accelerationIndex] = rawAcceleration;  
  smoothAcceleration = 0;  
  for (int i = 0; i < smoothFactor; i++) {  
    smoothAcceleration += accelerationValues[i];  
  }  
  smoothAcceleration /= smoothFactor;  
    
  // 映射平滑后的加速度值到合适范围  
  int mappedAcceleration = map(smoothAcceleration, 0, 1023, 0, 100);  
    
  stepper.setAcceleration(mappedAcceleration);  
  stepper.moveTo(position);  
  stepper.run();  
    
  // 更新加速度值数组索引  
  accelerationIndex = (accelerationIndex + 1) % smoothFactor;  
}

cpp复制代码

#include <AccelStepper.h>
AccelStepper stepper;
const byte PositionPot = A0;
const byte AccelerationPot = A1;
const int smoothFactor = 10; // 平滑因子,越大越平滑
int accelerationValues[smoothFactor];
int accelerationIndex = 0;
int smoothAcceleration = 0;
void setup() {
stepper.setMaxSpeed(1000);
stepper.setAcceleration(35);
// 初始化加速度值数组
for (int i = 0; i < smoothFactor; i++) {
accelerationValues[i] = 0;
}
}
void loop() {
int position = analogRead(PositionPot);
int rawAcceleration = analogRead(AccelerationPot);
// 更新加速度值数组并计算滑动平均
accelerationValues[accelerationIndex] = rawAcceleration;
smoothAcceleration = 0;
for (int i = 0; i < smoothFactor; i++) {
smoothAcceleration += accelerationValues[i];
}
smoothAcceleration /= smoothFactor;
// 映射平滑后的加速度值到合适范围
int mappedAcceleration = map(smoothAcceleration, 0, 1023, 0, 100);
stepper.setAcceleration(mappedAcceleration);
stepper.moveTo(position);
stepper.run();
// 更新加速度值数组索引
accelerationIndex = (accelerationIndex + 1) % smoothFactor;
}

在这个示例中,我们使用了一个数组来存储最近的smoothFactor个加速度值,并计算它们的平均值作为当前的加速度值。这样可以有效减少由于电位器读数不稳定引起的加速度变化。


实践项目名称
基于Arduino的步进电机速度与位置控制实践

实践目的
通过实践掌握使用Arduino和AccelStepper库控制步进电机的基本方法,实现根据模拟输入(电位器)动态调整电机的目标位置和加速度,进一步理解步进电机的工作原理及其在开环控制系统中的应用。

实践设备
Arduino开发板(如Arduino Uno)
步进电机及驱动器
电位器(2个,用于位置和加速度控制)
面包板和连接线
电脑及Arduino IDE软件
AccelStepper库
实践原理
本实践利用Arduino读取两个电位器的模拟信号,分别作为步进电机的目标位置和加速度的控制输入。通过AccelStepper库,可以方便地设置步进电机的最大速度、加速度,并根据输入信号动态调整电机的运行状态。电位器的阻值变化被转换为0-1023的数字信号(Arduino的模拟输入分辨率),用于控制电机的不同参数。

实践内容
组装电路:将步进电机驱动器与Arduino、步进电机以及电位器正确连接。确保电位器的中心端接Arduino的模拟输入引脚(A0和A1),另一端分别接5V和GND,形成电压分压电路。
编写并上传代码:在Arduino IDE中编写控制程序,设置步进电机的最大速度和初始加速度,然后在循环中读取电位器的值来调整电机的目标位置和加速度,并执行电机的运行。
测试与调试:运行程序,观察步进电机根据电位器调节的反应,验证电机的位置控制和加速度调整是否准确、平滑。
思考题及作答
思考题:

如果将电位器的连接改为使用数字引脚而不是模拟引脚,程序应该如何修改以实现对步进电机的控制?
程序中stepper.setAcceleration(analogRead(AccelerationPot));一行直接使用了模拟读数值作为加速度,这样做有何潜在问题?如何改进?
作答:

如果将电位器连接到数字引脚,由于数字引脚只能读取高低电平(0或1),无法直接获取连续的模拟值,因此无法直接使用电位器来调节控制参数。一种替代方案是使用PWM(脉冲宽度调制)输出,虽然它本质上是数字信号,但可以通过调整占空比来模拟不同的控制级别。另一种方法是使用外部ADC(模拟数字转换器)模块来将电位器的模拟信号转换为数字信号,再由Arduino读取。
直接使用analogRead()的返回值作为加速度值存在几个潜在问题:首先,analogRead()的返回值范围是0-1023,而加速度的合理范围可能远小于这个值,导致加速度设置过大或过小,不易控制;其次,模拟信号可能受到噪声干扰,导致加速度值不稳定。改进的方法是先将analogRead()的值映射到一个更合适的加速度范围内,例如使用map()函数,同时可以增加一些平滑处理(如滑动平均)来减少噪声的影响。示例代码修改如下:
cpp
int rawAcceleration = analogRead(AccelerationPot);  
int mappedAcceleration = map(rawAcceleration, 0, 1023, 0, 100); // 假设合适的加速度范围是0-100  
stepper.setAcceleration(mappedAcceleration);
这样,加速度值就被限制在了一个更合理的范围内,且更容易通过电位器进行精细调整。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙开发实战(5.0)自定义安全键盘场景实践

鸿蒙HarmonyOS开发实战往期必看文章&#xff1a;&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发性能实践总结&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发案例实践总结合集&#xff08;持续更新......&#xff09; 一分钟了解”纯血版&…

编译原理3——词法分析

3.1词法分析器的作用 词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将它们组成词素&#xff0c;生成并输出一个词法单元序列&#xff0c;每个词法单元对应于一个词素。 但在这个过程中&#xff0c;词法分析器还要和语法分析器进行交互。交互&…

计算机出现msvcp140.dll丢失的6种解决方法,亲测有效

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。本文将总结6种解决msvcp140.dll丢失的方法&#xff0c;帮助大家轻松解决这个问题。 一&…

1、软件测试的基础概念(1)

文章目录 一、软件测试1、软件测试&#xff08;Software Testing&#xff09;2、缺陷&#xff08;Defeat&#xff09;3、测试用例&#xff08;Test Case&#xff09;4、测试金字塔5、测试策略6、测试左移和测试右移7、质量度量 二、软件的测试分类1、单元测试2、集成测试3、系统…

2024中国新科技100强名单出炉!MIAOYUN荣获“2024云原生领航企业奖”

当前&#xff0c;新一轮科技革命和产业变革加速演进&#xff0c;只有加强颠覆性科技创新&#xff0c;才能占领科技创新的制高点&#xff0c;为发展新质生产力注入强大动能&#xff0c;不断塑造高质量发展竞争优势。近日&#xff0c;2024中国新科技100强金i奖评选名单出炉&#…

Thingsboard规则链:fetch device credentials节点详解

引言 源码剖析 应用场景与案例 结语 ThingsBoard从入门到实战课程&#xff0c;深入透析底层原理&#xff0c;快速搭建自己的IOT平台_哔哩哔哩_bilibiliThingsBoard从入门到实战课程&#xff0c;深入透析底层原理&#xff0c;快速搭建自己的IOT平台共计12条视频&#xff0c;包…

π122M31 双通道数字隔离器,工业控制领域的得力助手

π122M31 双通道数字隔离器 CAN通信隔离兼容ADuM7241ARZ电路简单、稳定性更高&#xff0c;具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 5.0kVrms…

Bugku 渗透测试1

描  述: 甲公司邀请你对他们公司进行网络安全测试&#xff0c;但是甲公司只给了一个官网链接你能打到他们内网吗&#xff1f; 打开靶场地址 1、场景1 查看网站源码&#xff0c;查看最下面&#xff0c;得到flag。 2、场景2 根据场景1提示&#xff0c;下个flag网站管理员才能…

SelMatch:最新数据集蒸馏,仅用5%训练数据也是可以的 | ICML‘24

数据集蒸馏旨在从大型数据集中合成每类&#xff08;IPC&#xff09;少量图像&#xff0c;以在最小性能损失的情况下近似完整数据集训练。尽管在非常小的IPC范围内有效&#xff0c;但随着IPC增加&#xff0c;许多蒸馏方法变得不太有效甚至性能不如随机样本选择。论文对各种IPC范…

windows下tp5创建定时任务

1、创建定时任务&#xff08;自定义命令行可参考官网自定义命令行 ThinkPHP5.0完全开发手册 看云&#xff09; 2、cmd进入项目根目录测试php think 3、新建一个task.bat 文件来运行 d://项目盘符 cd D:\wwwroot\www.xxx.com//项目根目录 php think test //项目接口 4、 Win…

TON生态系统开发指南:从零开始构建你的Web3应用

随着Web3的不断发展&#xff0c;TON&#xff08;The Open Network&#xff09;生态系统逐渐成为备受瞩目的区块链平台。依托其与Telegram的深度整合&#xff0c;TON生态为开发者提供了一个极具潜力的开发环境&#xff0c;特别是在社交、支付和金融这三个核心领域。本文旨在帮助…

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

在Linux内核的源码中&#xff0c;你会发现许多这样的“奇特”代码。它们看起来可能有点陌生&#xff0c;但它们实际上是C语言的一种扩展形式&#xff0c;这种扩展在C语言的标准教材中往往不会提及。这就是为什么你在阅读Linux驱动代码或内核源码时&#xff0c;可能会感到既熟悉…

【操作系统】速成1

速成即可&#xff0c;不问时间&#xff0c;不问过去&#xff0c;只求所得。 始于2024年9月25日04&#xff1a;30 目录 2.1 CPU&#xff0c;指令&#xff0c;64vs32 2.2 磁盘&#xff0c;内存 CPU Cache 参考&#xff1a;xiaolincoding.com 2.1 CPU&#xff0c;指令&#…

深入解析Pandas DataFrame:数据组织策略——宽格式与长格式的应用与转换

在数据科学和数据分析领域&#xff0c;如何组织数据是一个关键步骤。 Pandas DataFrame 作为 Python 中处理和分析数据的强大工具&#xff0c;提供了灵活的数据组织方 式&#xff0c;其中按行展开&#xff08;宽格式&#xff09;和按列展开&#xff08;长格式&#xff09;是最…

uniapp打包自动上传小程序后台

官方文档 ip查看地址 1、下载包&#xff1a; npm install miniprogram-ci --save 2、小程序后台&#xff1a; 3、将生成的密钥放置到项目根目录 4、项目根目录创建autoUpload.js 编写自动上传代码&#xff1a; const ci require(miniprogram-ci) const path require(…

双十一买什么好?五款数码好物推荐!

​双十一&#xff0c;作为全球最大的购物狂欢节&#xff0c;总是能够给数码发烧友们带来无尽的惊喜和机会。在这个数码狂欢的节日里&#xff0c;我们不仅有机会捡漏&#xff0c;还能够找到那些一直向往的数码好物。作为一名数码职业者&#xff0c;我一直对最新的数码科技充满热…

PTA L1-071 前世档案

L1-071 前世档案&#xff08;20分&#xff09; 网络世界中时常会遇到这类滑稽的算命小程序&#xff0c;实现原理很简单&#xff0c;随便设计几个问题&#xff0c;根据玩家对每个问题的回答选择一条判断树中的路径&#xff08;如下图所示&#xff09;&#xff0c;结论就是路径终…

CSS 实现元素根据自身位置进行偏移

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>.item {…

UNI-SOP使用说明

UNI-SOP提供了两个集成客户端&#xff1a;SpringBoot2.x/JAVA1.8和SpringBoot3.x/JAVA17&#xff0c;满足不同项目的集成需求。 平台接入 使用UNI-SOP之前&#xff0c;业务平台需要进行接入&#xff0c;完成校验后才能正常使用&#xff0c;先引入客户端开发SKD包。 <depen…

UE4_后期处理七—仿红外线成像效果

效果图展示&#xff1a; 参考文档&#xff1a;https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-fresnel-in-your-unreal-engine-materials?application_version5.4 二、所用知识点扩充 在创建电影或过场动画时&#xff0c;你常常需要想办法更好地突显角…