olá pessoal. estou com um projeto onde preciso fazer o motor de passo funcionar enquanto o sensor ultrassônico funciona e eu fiz dessa forma dentro de uma função o motor de passo gira no senstido horário e anti-horário e uma função para o sensor. Alguém tem alguma dica de melhoria ou pode me ajudar para melhorar?
estou usando o uno r3
void motorpHOR(int passos) {
for (ihor = 0; ihor < passos; ihor++) {
contpassos++;
sensor();
if (cmMsec > 2 && cmMsec < 19) {
interrupcao();
} else {
motorp.step(4);
}
}
}
void motorpAHO(int passos) {
for (iaho = 0; iaho < passos; iaho++) {
contpassos--;
sensor();
if (cmMsec > 2 && cmMsec < 19) {
interrupcao();
} else {
motorp.step(-4);
}
}
}
void sensor() {
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
Serial.print("Centimetros: ");
Serial.println(cmMsec);
}
Por favor, use o idioma inglês nas seções em inglês do fórum.
Seu tópico foi movido para a seção em português do fórum.
Se colocares o código todo, será mais simples de dar mais direcção. Mas pelo que colocaste aqui diria que o teu código tem duas funções e são quase que uma cópia da outra com excepção dum sinal negativo e uma variável.
As variáveis ihor e iaho são globais o que é um erro grave.
// depois precisas duma função que leia o teu sensor...
int sensor();
//esta é a função para movimentar o motor.
int motorp(unsigned int passos, int dir) {
unsigned int i = 0;
int pulses = 4;
if (dir == 1) pulses = -4; // dir = 1 quer dizer que vais andar no sentido anti horário.
if (passos < 0) return -1; //erro. e não faz nada...
for (i = 0; i < passos; i++) {
motorp.step(pulses);
}
}
loop() {
dist = sensor(); //isto retorna o valor da distância.
//aqui colocas a lógica que determina o número de passos a realizar e a direcçao ja que é impossível de entender isso pelo que postaste.
motorp(passos, direccao);
}
aqui está o código completo. espero que entenda. só queria dicas para melhorar o código.
#include <Stepper.h>
#include <Ultrasonic.h>
#define button1 6
#define button2 7
#define button3 12
const int passosPorVolta = 32, ngraus = 128;
Stepper motorp(passosPorVolta, 8, 10, 9, 11);
int contpassos = 0, ihor = 0, iaho = 0, vel = 500;
#define TRIGGER_PIN 4
#define ECHO_PIN 5
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
float cmMsec;
void setup() {
Serial.begin(9600);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
ajustarVelocidade();
motorp.setSpeed(vel);
ajustarPosicaoInicial();
}
void loop() {
motorpHOR(ngraus);
delay(10);
motorpAHO(ngraus);
delay(10);
}
void motorpHOR(int passos) {
for (ihor = 0; ihor < passos; ihor++) {
contpassos++;
sensor();
if (cmMsec > 2 && cmMsec < 19) {
interrupcao();
} else {
motorp.step(4);
}
}
}
void motorpAHO(int passos) {
for (iaho = 0; iaho < passos; iaho++) {
contpassos--;
sensor();
if (cmMsec > 2 && cmMsec < 19) {
interrupcao();
} else {
motorp.step(-4);
}
}
}
void sensor() {
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
Serial.print("Centimetros: ");
Serial.println(cmMsec);
}
void interrupcao() {
Serial.println("Sistema de segurança ativado.");
delay(500);
if (contpassos != 1) {
for (int i = 0; i < contpassos; i++) {
motorp.step(-4);
delay(10);
}
}
contpassos = 0;
ihor = 0;
iaho = ngraus;
delay(500);
int umapass = 0;
for (;;) {
if(umapass==0){
Serial.println("Sistema Travado. ");
umapass++;
}
delay(10);
if (digitalRead(button3) == 1) {
delay(1000);
break;
}
delay(300);
}
}
void ajustarPosicaoInicial() {
Serial.println("\nAjustar a posição da lâmina .\nBotão 1 para descer a lâmina.\nBotao 2 para subir a lâmina.");
for (;;) {
delay(10);
if (digitalRead(button1) == 1) {
Serial.println("Descendo lâmina de corte. ");
motorp.step(4);
delay(10);
} else if (digitalRead(button2) == 1) {
Serial.println("Subindo lâmina de corte. ");
motorp.step(-4);
delay(10);
} else if (digitalRead(button3) == 1) {
delay(1000);
break;
}
}
}
void ajustarVelocidade() {
Serial.println("\nAjustar a velocidade do motor de passos.\nBotão 1 para aumentar a velocidade.\nBotao 2 para diminuir a velocidade.");
delay(1000);
for (;;) {
delay(10);
if (digitalRead(button1) == 1) {
vel += 50;
if (vel > 600) {
vel = 600;
Serial.println("A velocidade do motor não pode ultrapassar os 600 RPM\nVelocidade ajustada para " + String(vel) + " RPM");
} else {
Serial.println("Velocidade ajustada para " + String(vel) + " RPM");
}
while(digitalRead(button1)==1){
//nada acontece.
}
} else if (digitalRead(button2) == 1) {
vel -= 50;
if (vel < 50) {
vel = 50;
Serial.println("A velocidade do motor não pode ser menor que 50 RPM\nVelocidade ajustada para " + String(vel) + " RPM");
} else {
Serial.println("Velocidade ajustada para " + String(vel) + " RPM");
}
while(digitalRead(button2)==1){
//nada acontece.
}
} else if (digitalRead(button3) == 1) {
delay(1000);
break;
}
}
}
é meu segundo dia usando o forum. irei procurar saber como usar melhor as funções para postagens.
Aqui, é melhor criares um standard para saberes que algo é uma macro e não uma variável.
Podes usar tudo letras maiúsculas, por exemplo para ser óbvio e não dar dores de cabeça.
Tu aliás fazes isto nos pinos do sensor ultrasónico.
Muito bem usares const int. Aqui podias definir os pinos dos botões também como const int que não ocupa memória a mais no programa e aí sim, é uma variável e não uma macro.
int contpassos = 0, ihor = 0, iaho = 0, vel = 500;
Isto não devia ser global...
Podes organizar as tuas funções de forma melhor para que retornem variáveis e passes variáveis para fazeres o que pretendes.
Fiz algumas modificações no código e ficou assim.
#include <Stepper.h>
#include <Ultrasonic.h>
const int passosPorVolta = 32, ngraus = 128, button1 = 6, button2 = 7, button3 = 12;
static bool sentido = HIGH;
Stepper motorp(passosPorVolta, 8, 10, 9, 11);
#define TRIGGER_PIN 4
#define ECHO_PIN 5
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
void setup() {
Serial.begin(9600);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
motorp.setSpeed(ajustarVelocidade());
ajustarPosicaoInicial();
}
void loop() {
for(;;){
motorPasso();
}
}
int motorPasso() {
unsigned contpassos = 0;
if (sentido == HIGH) {
for (int i = 0; i < 128; i++) {
float dist = sensor();
if (dist > 2 && dist < 19) {
i = 0;
return interrupcao(contpassos);
} else {
contpassos++;
motorp.step(4);
}
}
sentido = !sentido;
}
if (sentido == LOW) {
for (int i = 0; i < 128; i++) {
float dist = sensor();
if (dist > 2 && dist < 19) {
i = 128;
sentido = !sentido;
return interrupcao(contpassos);
} else {
contpassos--;
motorp.step(-4);
}
}
sentido = !sentido;
}
}
float sensor() {
unsigned long microsec = ultrasonic.timing();
float cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
Serial.print("Centimetros: "); Serial.println(cmMsec);
return cmMsec;
}
int interrupcao(int pontoInicial) {
Serial.println("Sistema de segurança ativado.");
delay(500);
for (int i = 0; i < pontoInicial; i++) {
motorp.step(-4);
delay(12);
}
int umapass = 0;
for (;;) {
if (umapass == 0) {
Serial.println("Sistema Travado. ");
umapass++;
}
delay(10);
if (digitalRead(button3) == 1) {
pontoInicial = 0;
break;
}
}
}
void ajustarPosicaoInicial() {
Serial.println("\nAjustar a posição da lâmina .\nBotão 1 para descer a lâmina.\nBotao 2 para subir a lâmina.");
for (;;) {
delay(5);
if (digitalRead(button1) == 1) {
Serial.println("Descendo lâmina de corte. ");
motorp.step(4);
} else if (digitalRead(button2) == 1) {
Serial.println("Subindo lâmina de corte. ");
motorp.step(-4);
} else if (digitalRead(button3) == 1) {
delay(1000);
break;
}
}
}
int ajustarVelocidade() {
Serial.println("\nAjustar a velocidade do motor de passos.\nBotão 1 para aumentar a velocidade.\nBotão 2 para diminuir a velocidade.");
int vel = 500;
delay(1000);
for (;;) {
delay(10);
if (digitalRead(button1) == 1) {
vel += 50;
if (vel > 600) {
vel = 600;
Serial.println("A velocidade do motor não pode ultrapassar os 600 RPM\nVelocidade ajustada para " + String(vel) + " RPM");
} else {
Serial.println("Velocidade ajustada para " + String(vel) + " RPM");
}
while (digitalRead(button1) == 1) {
//nada acontece.
}
} else if (digitalRead(button2) == 1) {
vel -= 50;
if (vel < 50) {
vel = 50;
Serial.println("A velocidade do motor não pode ser menor que 50 RPM\nVelocidade ajustada para " + String(vel) + " RPM");
} else {
Serial.println("Velocidade ajustada para " + String(vel) + " RPM");
}
while (digitalRead(button2) == 1) {
//nada acontece.
}
} else if (digitalRead(button3) == 1) {
delay(1000);
return vel;
}
}
}
Porque é que esta variável é static??
#define TRIGGER_PIN 4
#define ECHO_PIN 5
Porque não manter a consistência com os pinos e fazer disto const int?
void loop() {
for(;;){
motorPasso();
}
}
Porque fazes um loop dentro de outro loop sem nada à volta? Isto não faz sentido.
E em vez de atirares tudo para dentro duma função apenas, porque não dentro do loop fazer a lógica do sistema todo?
cara. fiz dessa forma agora.
#include <Stepper.h>
#include <Ultrasonic.h>
const int passosPorVolta = 32, button1 = 6, button2 = 7, button3 = 12;
bool estado = HIGH;
Stepper motorp(passosPorVolta, 8, 10, 9, 11);
#define TRIGGER_PIN 4
#define ECHO_PIN 5
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
void setup() {
Serial.begin(9600);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
motorp.setSpeed(ajustarVelocidade());
ajustarPosicaoInicial();
}
void loop() {
int contpassos = 0;
Serial.println(contpassos);
for (int i = 0; i < 128; i++) {
contpassos++;
float dist = sensor();
if (dist > 2 && dist < 19) {
Serial.println("Sistema de segurança ativado.");
if(estado == HIGH){
for(int j=0; j < contpassos; j++){
motorp.step(-4);
delay(12);
}
}else{
for(int k = i ;k < 128; k++){
motorp.step(-4);
delay(12);
}
}
Serial.println("Sistema Travado. ");
for (;;) {
if (digitalRead(button3) == 1) {
contpassos = 0;
estado = HIGH;
i=0;
break;
}
}
}
if(estado == HIGH){
motorp.step(4);
}else{
motorp.step(-4);
}
}
estado = !estado;
}
float sensor() {
unsigned long microsec = ultrasonic.timing();
float cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
Serial.print("Centimetros: ");
Serial.println(cmMsec);
return cmMsec;
}
void ajustarPosicaoInicial() {
Serial.println("\nAjustar a posição da lâmina .\nBotão 1 para descer a lâmina.\nBotao 2 para subir a lâmina.");
for (;;) {
delay(5);
if (digitalRead(button1) == 1) {
Serial.println("Descendo lâmina de corte. ");
motorp.step(4);
} else if (digitalRead(button2) == 1) {
Serial.println("Subindo lâmina de corte. ");
motorp.step(-4);
} else if (digitalRead(button3) == 1) {
delay(1000);
break;
}
}
}
int ajustarVelocidade() {
Serial.println("\nAjustar a velocidade do motor de passos.\nBotão 1 para aumentar a velocidade.\nBotão 2 para diminuir a velocidade.");
int vel = 500;
delay(1000);
for (;;) {
delay(10);
if (digitalRead(button1) == 1) {
vel += 50;
if (vel > 600) {
vel = 600;
Serial.println("A velocidade do motor não pode ultrapassar os 600 RPM\nVelocidade ajustada para 600 RPM");
} else {
Serial.println("Velocidade ajustada para " + String(vel) + " RPM");
}
while (digitalRead(button1) == 1) {
//nada acontece.
}
} else if (digitalRead(button2) == 1) {
vel -= 50;
if (vel < 50) {
vel = 50;
Serial.println("A velocidade do motor não pode ser menor que 50 RPM\nVelocidade ajustada para 50 RPM");
} else {
Serial.println("Velocidade ajustada para " + String(vel) + " RPM");
}
while (digitalRead(button2) == 1) {
//nada acontece.
}
} else if (digitalRead(button3) == 1) {
delay(1000);
return vel;
}
}
}
dessa forma está funcionando perfeitamente.
Porque é que tens esses while's sem nada dentro deles?
se caso o botão continuar sendo pressionado entra dentro desse loop para rodar apenas uma vez na condição anterior. tem alguma outra forma de resolver isso?
Apenas agir quando o botão trocar de estado em vez de estar num estado específico. Ou ambos...