ajuda para programar motor de passo com sensor

Olá, Sou iniciante com arduinos e tenho um projeto para utilizar um sensor de chuva com um motor de passo. A princípio me pareceu bem simples, mas agora estou com dificuldade para escrever o programa.

O que preciso é que o motor de passo gire meia volta quando chover e volte a posição inicial quando parar de chover.

Já agradeço de antemão a ajuda!!

abraços,

O que já funcionou até agora?

Viva Marco! Bem-vindo ao fórum.
Qual é a maior dúvida? Já tem o driver para ligar o motor passo-a-passo? Precisa de um shield para fazer a ligação do Arduino ao motor de passo. Em relação à programação, há uns exemplos no seu IDE que podem servir de primeira aproximação à resolução do problema.
Pode dar uma vista de olhos a este exemplo também.

Obrigado Luis e Lago,

Mecanicamente tudo funciona, tenho o sensor de chuva que liguei no pino 13 (e funciona como um botão, certo? ou seja, molha liga, seca desliga), meu motor de passo está ligado por um motor shield que usa os pinos 5,6,7,8 do arduino.

Usei um modelo para escrever os código e consegui que funcionasse assim: gira anti-horário o tempo todo e quando aperto o botão (ou ligo o sensor), gira no sentido horário. Tentei incluir alguns comandos mas sem sucesso. Podem me dar uma mãozinha?

obrigado

O código que estou usando é esse:

#include <Stepper.h>
int pinosensor = 13; //Porta sensor
int passos = 1; //Passos a cada acionamento do botao
int leitura = 0; //Armazena o valor lido do botao horario

const int stepsPerRevolution = 200;

// Inicializa a biblioteca utilizando as portas de 5 a 8 para
// ligacao ao motor
Stepper myStepper(stepsPerRevolution, 5,7,6,8);

void setup()
{
pinMode(pinosensor, INPUT);

myStepper.setSpeed(60); //Determina a velocidade do motor
}

void loop()
{
//Gira o motor no sentido horario
leitura = digitalRead(pinosensor);
if (leitura != 0)
{
myStepper.step(-passos);
}

}

O pino 13 é uma má escolha devido ao led que está lá ligado.

Como ligaste o sensor e que sensor é?

O código para fazer isto não é muito mais do que tens feito... O motor gira?

Há aí 2 coisas que não estão bem. A primeira é que para girar meia volta, ele deve girar 100 passos, devido a esta linha:

const int stepsPerRevolution = 200;

A segunda, é que só deve girar quando detecta a alteração do estado, ou seja, se não estava a chover e começou, gira. O mesmo deve acontecer para a volta à origem, isto é, se estava a chover e parou, volta à origem.

Sendo assim, pegando no seu exemplo:

#include <Stepper.h> 
int pinosensor = 13;      //Porta sensor   
int passos = 100;         //Passos a cada acionamento do botao 
int leitura = 0;          //Armazena o valor lido 
int leitura_anterior = 0; //Armazena o valor lido no ciclo anterior 


const int stepsPerRevolution = 200;   

// Inicializa a biblioteca utilizando as portas de 5 a 8 para 
// ligacao ao motor 
Stepper myStepper(stepsPerRevolution, 5,7,6,8);       

void setup()   
{ 
  pinMode(pinosensor, INPUT); 

  myStepper.setSpeed(60); //Determina a velocidade do motor 
} 

void loop() 
{ 
  //Gira o motor no sentido horario 
  leitura = digitalRead(pinosensor);
  
  if (leitura == 0 && leitura != leitura_anterior)
  {
    myStepper.step(passos);   
  } 

  if (leitura != 0 && leitura != leitura_anterior)
  {
    myStepper.step(-passos);   
  } 
  
  leitura_anterior = leitura;
}

Penso que qualquer coisa deste género deve funcionar.

Também estou de acordo com o bubulindo quando ele diz que o pino 13 não é o melhor pino para ligar o sensor.

Já agora, esta é a maneira correcta de postar código aqui no fórum. Utiliza-se o botão com o símbolo '<>' da barra de ferramentas, e coloca-se o código entre os marcadores que são gerados quando se prime esse botão.

Muito obrigado!!
Funcionou!!! mesmo assim, farei a troca do pino do sensor para evitar conflitos.

Me desculpe se postei errado os códigos, não acontecerá novamente.

Valeu pela ajuda e com certeza teremos mais conversas interessantes. Sou iniciante e não pretendo parar tão cedo!

Respondendo a pergunta do Bubulindo, é um sensor de chuva simples, quando molha ele fecha o circuito, por isso comparei com um botão. Fiz a ligação como a de um botão comum, mas alterei a entrada, como sugerido, para o pino 4.

abraços,

gente eu to usando essa programação para fazer uma janela automatizada, porem eu queria mudar um pouco porem estou com uma certa dificuldade, eu quero que o motor atue até chegar em um sensor de fim de curso e não apenas o quanto eu peço pra ele rodar na programação, tem como alguem me ajudar??

Eu penso que aquilo que está a pedir não é ajuda, mas é que alguém lhe faça o trabalho. Enquanto não mostrar trabalho feito da sua parte, não me convide, porque eu não vou ajudar.

Por favor, alguém pode me ajudar? Não sei programar mas venho tentando já a algum tempo e não esta dando certo, se alguém puder ajudar, agradeço muito!
O que preciso é: Tenho 4 motores de passo, motor A vai alimentar e não precisa de ponto inicial. Mas motor B, C e D precisam de um ponto de partida p/ não se perderem ao menos quando ligar a maquina
Segue abaixo o que fiz até agora, antes funcionava "sem chaves home" mas os motores se perdiam toda vez que ligar a maquina

#include <Stepper.h>
#define BAUD (9600)
#define homeB 2 //---------------------//define os pinos de home - sensores de home//----------------------------------------------------------------------//
#define homeC 3
#define homeD 4
#define finalizouB = 0
#define finalizouC = 0
#define finalizouD = 0
const int passos = 800;
const int voltas = (passos * 800 / 4.75);

//----------------------------------//Pinos declarados p/ os eixos, passos por volta 0,44º de precisão no caso de 800ppv//---------------------------------//
Stepper eixoA(passos, 22, 24, 26, 28);
Stepper eixoB(passos, 30, 32, 34, 36);
//Stepper eixoC(passos, , , , );
//Stepper eixoD(passos, , , , );

byte cont = 0;
const int ciclos = 6;//-------------------------------// Quantas vezes o loop será repetido//--------------------------------------------------------------//
const int veloc = 100;
const int enblA = 9;//--------------------------------// Pinos de enable dos motores //--------------------------------------------------------------------//
const int enblB = 8;
const int enblC = 7;
const int enblD = 6;
unsigned int valor;
unsigned int pwm;
const int stop(0);<-------- AQUI NÃO FUNCIONA COMO IMAGINEI! JÁ TENTEI VÁRIOS OUTROS E NEHUM FUNCIONOU...

void setup() {
valor = analogRead(A0);
pwm = map(valor, 0, 1023, 0, 10);//-----------//Valor lido pelo potenciometro, determinarará a velocidade//-----------------------------------------------//
Serial.begin(BAUD);

eixoA.setSpeed(veloc * valor);
eixoB.setSpeed(veloc * valor);
//eixoC.setSpeed(velocvalor);
//eixoD.setSpeed(veloc
valor);

pinMode(enblA, OUTPUT);
pinMode(enblB, OUTPUT);
pinMode(enblC, OUTPUT);
pinMode(enblD, OUTPUT);

pinMode(homeB, INPUT); //-----------------------------//configura o home B como entrada
digitalWrite(homeB, HIGH); //------------------------//liga o pullUp interno do Arduino
pinMode(homeC, INPUT); //----------------------------//configura o home C como entrada//--------//Sensores posição inicial//------------------------------//
digitalWrite(homeC, HIGH); //------------------------//liga o pullUp
pinMode(homeD, INPUT); //----------------------------//configura o home D como entrada
digitalWrite(homeD, HIGH); //------------------------//liga o pullUp
}
//----------------------------------------------------------------------------//-----------------------------------------------------------------------------//
void finalizou()
{
if (digitalRead(homeB) == 0) { //-----------------------//se o sensor do eixo B for acionado...

eixoB.stop();<-------- AQUI NÃO FUNCIONA COMO IMAGINEI! JÁ TENTEI VÁRIOS OUTROS E NEHUM FUNCIONOU...
eixoB.currentPosition(); //////////////////////adquire a posicao atual do eixo B
posicaoinicialB = eixoB.currentPosition(); ////carrega o valor na variavel posicao inicial do eixo B
eixoB.step(posicaoinicialB / 2);///////////////calcula o valor para o centro ( coloque a posicao que voce quiser aqui )...
eixoB.step(); /////////////////////////////////manda o motor para o centro
finalizouB = 1; ///////////////////////////////finaliza a nicializacao dos motores

eixoC.stop();<-------- AQUI NÃO FUNCIONA COMO IMAGINEI! JÁ TENTEI VÁRIOS OUTROS E NEHUM FUNCIONOU...
eixoC.currentPosition();
posicaoinicialC = eixoC.currentPosition();
eixoC.step(posicaoinicialC / 2);
eixoC.step();
finalizouC = 1;

eixoD.stop();// <-------- AQUI NÃO FUNCIONA COMO IMAGINEI! JÁ TENTEI VÁRIOS OUTROS E NEHUMFUNCIONOU...
eixoD.currentPosition();
posicaoinicialD = eixoD.currentPosition();
eixoD.step(posicaoinicialD / 2);
eixoD.step();
finalizouD = 1;
}
//-----------------------------------------------------------------------//-----------------------------------------------------------------------------------//
void loop(){

while (cont < ciclos) {
digitalWrite(enblA, LOW);
digitalWrite(enblB, HIGH);
digitalWrite(enblC, HIGH);
digitalWrite(enblD, HIGH);
eixoA.step(-6 * voltas);//---------------------//movimento eixo A//--------------------------------------------------------------------------------------//
Serial.println("Eixo A trabalhando");
digitalWrite(enblA, HIGH);
Serial.println("Eixo A no aguarde");
//--------------------------------------------------------------//-----------------------------------------------------------------------------------------//
digitalWrite(enblB, LOW);
digitalWrite(enblA, HIGH);
digitalWrite(enblC, HIGH);
digitalWrite(enblD, HIGH);

Serial.println("Eixo B trabalhando");
eixoB.step(5 * voltas);//---------------------//movimento eixo B//---------------------------------------------------------------------------------------//
digitalWrite(enblB, HIGH);
Serial.println("Eixo B no aguarde");

cont ++;
}
//-------------------------------------------------------------------//--------------------------------------------------------------------------------------//
if (cont == ciclos) {
digitalWrite(enblA, HIGH);
digitalWrite(enblB, HIGH);
digitalWrite(enblC, HIGH);
digitalWrite(enblD, HIGH);
}
if ( cont == ciclos) {
Serial.println("Terminamos");
}
}

Na função setup() tem que rodar o step para um dos lados até que o interruptor seja activado.

Boa tarde, estou com uma dificuldade imensa pra fazer uma programação (a principio eu pensei que seria facil, mas começou a dar um confusão gigante na minha cabeça).
Bom basicamente eu preciso de uma programação em que o meu motor a passo (nema 17) ele gire quando ele detectar algo no sensor (sensor de movimento e18-D80nk).
Estou usando essa programação:

#include <AccelStepper.h>
#define sensor 6
int velocidade_motor = 100;
int aceleracao_motor = 100;
int sentido_horario = 0;
int sentido_antihorario = 0;
int numero = 0;

// Definicao pino ENABLE
int pino_enable = 10;

// Definicao pinos STEP e DIR
AccelStepper motor1(1,7,4 );

void setup()
{
Serial.begin(115200)
pinMode(sensor, INPUT)
digitalWrite(sensor, LOW)
Serial.begin(9600);
pinMode(pino_enable, OUTPUT);
// Configuracoes iniciais motor de passo
motor1.setMaxSpeed(velocidade_motor);
motor1.setSpeed(velocidade_motor);
motor1.setAcceleration(aceleracao_motor);

Serial.println("Digite 1, 2 ou 3 e clique em ENVIAR...");
}

void loop()
{
if (digitalRead(sensor))Serial.println ("sim");

else Serial.println ("não");
delay(741).;
// Aguarda os caracteres no serial monitor
if (Serial.available() > 0)
{
numero = Serial.read();
{
if (numero == '1')
{
Serial.println("Numero 1 recebido - Girando motor sentido horario.");
digitalWrite(pino_enable, LOW);
sentido_horario = 1;
sentido_antihorario = 0;
}

if (numero == '2')
{
Serial.println("Numero 2 recebido - Girando motor sentido anti-horario.");
digitalWrite(pino_enable, LOW);
sentido_horario = 0;
sentido_antihorario = 1;
}

if (numero == '3')
{
Serial.println("Numero 3 recebido - Parando motor...");
sentido_horario = 0;
sentido_antihorario = 0;
motor1.moveTo(0);
digitalWrite(pino_enable, HIGH);
}
if (digitalRead(sensor))Serial.println
digitalWrite(pino_enable, LOW);
sentido_horario = 1;
sentido_antihorario = 0;
else Serial.println
sentido_horario = 0;
sentido_antihorario = 0;
motor1.moveTo(0);
digitalWrite(pino_enable, HIGH);

// Move o motor no sentido horario
if (sentido_horario == 1)
{
motor1.moveTo(10000);
}
// Move o motor no sentido anti-horario
if (sentido_antihorario == 1)
{
motor1.moveTo(-10000);
}
// Comando para acionar o motor no sentido especificado
motor1.run();
}
Alguem pode me dar uma ajudinha, serio ja tentei de tudo (sou novo nessa area)

refiz a programação , e agora o motor gira quando detecta o sensor, porem ele fica devagar mesmo aumentando a velocidade ou a aceleração do motor , alguem sabe como modifica isso ?

#include <AccelStepper.h>
#define pinSensor 6
int passos = 400;
int velocidade_motor = 100;
int aceleracao_motor = 000;
int sentido_horario = 0;
int sentido_antihorario = 0;
int numero = 0;

// Definicao pino ENABLE
int pino_enable = 10;

// Definicao pinos STEP e DIR
AccelStepper motor1(1,7,4 );

void setup()
{
pinMode(pinSensor, INPUT);
Serial.begin(9600);
pinMode(pino_enable, OUTPUT);
// Configuracoes iniciais motor de passo
motor1.setMaxSpeed(velocidade_motor);
motor1.setSpeed(velocidade_motor);
motor1.setAcceleration(aceleracao_motor);

Serial.println("detectado ou não detectado");
}

void loop()
{
bool sensor = digitalRead(pinSensor);

if (!sensor) {
Serial.println("detectado - Girando motor sentido horario.");
digitalWrite(pino_enable, LOW);
velocidade_motor = 500;
aceleracao_motor = 500;
sentido_horario = 1;
sentido_antihorario = 0;
}else {
Serial.println("não detectado - Parando motor...");
sentido_horario = 0;
sentido_antihorario = 0;
motor1.moveTo(0);
digitalWrite(pino_enable, HIGH);

}
// Move o motor no sentido horario
if (sentido_horario == 1)
{
motor1.moveTo(10000);
}
// Move o motor no sentido anti-horario

// Comando para acionar o motor no sentido especificado
motor1.run();
}