- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个小项目,根据人按住开关的时间来移动步进电机,时间越长,速度越高。我使用的代码提高了速度,我可以在串行监视器上看到它,但步进电机没有改变。我想知道是否可以在不使用电位器的情况下改变步进器的速度以及如何改变?
#include <Stepper.h>
const int ForwardLimitSwitchPin = 2;
const int ReverseLimitSwitchPin = 3;
const int StepperStepPin = 4;
const int StepperDirectionPin = 5;
const int LimitSwitchActivated = LOW; // Limit switch grounds pin
const int StepperMaxRPM = 255;//default = 100
const int swDireita = 13;
const int swEsquerda = 12;
int velMotor = 0;
static const unsigned long REFRESH_INTERVAL = 1000; // ms
static unsigned long lastRefreshTime = 0;
boolean flag;
//Stepper stepper(200, StepperStepPin, StepperDirectionPin);
Stepper stepper(200, 8, 9, 10, 11);
void setup() {
pinMode(swDireita, INPUT);
pinMode(swEsquerda, INPUT);
digitalWrite(swDireita, HIGH);
digitalWrite(swEsquerda, HIGH);
pinMode(ForwardLimitSwitchPin, INPUT_PULLUP);
pinMode(ReverseLimitSwitchPin, INPUT_PULLUP);
stepper.setSpeed(StepperMaxRPM);
Serial.begin(115200);
}
void loop() {
while (digitalRead(swDireita) == 0) {
motorDireita();
}
velMotor = 0;
while (digitalRead(swEsquerda) == 0) {
motorEsquerda();
}
velMotor = 0;
while (digitalRead(swDireita) == 0 && digitalRead(swEsquerda) == 0) {
motorParado();
}
velMotor = 0;
}
void motorParado() {
Serial.print("Ambos ativados, parada");
Serial.print("\n");
stepper.setSpeed(0);
stepper.step(0);
}
void motorDireita() {
//51 por segundo para 5 seg total
/*if(!flag){
flag = true;
velMotor = 51;
}else */
if (velMotor < 255 && millis() - lastRefreshTime >= REFRESH_INTERVAL) {
lastRefreshTime += REFRESH_INTERVAL;
velMotor += 25;
}
//int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
//int motorSpeed = map(velMotor, 0, 1023, 0, 255);
Serial.print("direita ativada, velocidade: ");
Serial.print(velMotor);
//Serial.print(motorSpeed);
Serial.print("\n");
stepper.setSpeed(velMotor);
//stepper.setSpeed(motorSpeed);
stepper.step(1);
}
void motorEsquerda() {
//51 por segundo para 5 seg total
if (velMotor < 255 && millis() - lastRefreshTime >= REFRESH_INTERVAL) {
lastRefreshTime += REFRESH_INTERVAL;
velMotor += 51;
}
Serial.print("Esquerda ativida, velocidade: ");
Serial.print(velMotor);
Serial.print("\n");
stepper.setSpeed(velMotor);
stepper.step(-1);
}
最佳答案
对于来到这里的任何人,我已经找到了解决方案。看起来双极步进电机只是以一定的速度移动 {80,100, 160, 180, 200,220, 255},我的代码在 0-255 范围内,所以我只是根据时间改变了代码以达到一定的速度开关被按下!感谢您的帮助 xD
#include <Stepper.h>
/*
const int ForwardLimitSwitchPin = 2;
const int ReverseLimitSwitchPin = 3;
const int StepperStepPin = 4;
const int StepperDirection = 5;
*/
const int StepperMaxRPM = 255; //default = 100
const int swDireita = 13;
const int swEsquerda = 12;
int velMotor = 80;
static const unsigned long REFRESH_INTERVAL = 1000; //ms
static unsigned long lastRefreshTime = 0;
//Stepper stepper(200, StepperStepPin, StepperDirectionPin);
Stepper stepper(200, 8, 9, 10, 11);
void setup() {
Serial.begin(115200);
pinMode(swDireita, INPUT);
pinMode(swEsquerda, INPUT);
digitalWrite(swDireita, HIGH);
digitalWrite(swEsquerda, HIGH);
stepper.setSpeed(StepperMaxRPM);
}
void loop() {
while (digitalRead(swDireita) == 0) {
motorDireita();
}
while (digitalRead(swEsquerda) == 0) {
motorEsquerda();
}
while (digitalRead(swEsquerda) == 1 && digitalRead(swDireita) == 1) {
Serial.print("to aqui");
velMotor = 0;
stepper.setSpeed(velMotor);
Serial.print(velMotor);
}
}
void motorDireita() {
if (millis() - lastRefreshTime >= REFRESH_INTERVAL) {
lastRefreshTime += REFRESH_INTERVAL;
switch (velMotor) { //80//100//160//180//200//220//255
case 0:
Serial.print("antes: ");
Serial.print(velMotor);
velMotor = 80;
stepper.setSpeed(velMotor);
break;
case 80:
velMotor = 100;
stepper.setSpeed(velMotor);
break;
case 100:
velMotor = 160;
stepper.setSpeed(velMotor);
break;
case 160:
velMotor = 180;
stepper.setSpeed(velMotor);
break;
case 180:
velMotor = 200;
stepper.setSpeed(velMotor);
break;
case 200:
velMotor = 220;
stepper.setSpeed(velMotor);
break;
case 220:
velMotor = 255;
stepper.setSpeed(velMotor);
break;
}
}
Serial.print(velMotor);
Serial.print("\n");
stepper.step(1);
}
void motorEsquerda() {
if (millis() - lastRefreshTime >= REFRESH_INTERVAL) {
lastRefreshTime += REFRESH_INTERVAL;
switch (velMotor) { //80//100//160//180//200//220//255
case 0:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 80;
stepper.setSpeed(velMotor);
break;
case 80:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 100;
stepper.setSpeed(velMotor);
break;
case 100:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 160;
stepper.setSpeed(velMotor);
break;
case 160:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 180;
stepper.setSpeed(velMotor);
break;
case 180:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 200;
stepper.setSpeed(velMotor);
break;
case 200:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 220;
stepper.setSpeed(velMotor);
break;
case 220:
Serial.print("antes ");
Serial.print(velMotor);
velMotor = 255;
stepper.setSpeed(velMotor);
break;
}
}
Serial.print(velMotor);
Serial.print("\n");
stepper.step(-1);
}
关于c++ - Arduino步进电机速度控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51215229/
有没有办法在 D 范围内创建一个步骤?例如,在 python 中, 范围(1、10、2)给我 [1, 3, 5, 7, 9] 1 .. 10 以内的所有赔率 有没有办法在 D 中使用
我在 javascript 和 css(没有 jquery 或其他任何东西)中的幻灯片作业有问题。 此幻灯片应该有两种模式,一种是 i) 自动显示图片,另一种是 ii) 手动更改它们。该按钮应分别更改
我有一个在堆栈上声明的结构。这是结构的样子: struct MyStruct { int integer; std::vector booleanVector; }; 当我使用 gdb
我的容器进入第一行,但是当 float 导致第二行开始时,第二行没有进入。如何防止踩踏? HTML echo "". $row["FirstName"]. "" . $day_month .""; C
我们在 VMWare 中运行 Linux Debian。使用 gdb 调试时,如果尝试跨过 memset/memcmp/strcmp 等...,gdb 会返回以下错误: Cannot find bou
我是一名优秀的程序员,十分优秀!