Puerta Corrediza con Arduino, Bluetooth y Servo Motor

Estoy haciendo un proyecto para la escuela en el cual tengo que hacer que una puerta corrediza se abra o se cierre mediante 2 botones en una aplicacion con bluetooth, pero no logro hacer que el motor se mueva cuando apreto los botones en la aplicacion no hay errores en pantalla, solamente no funciona, dejo el codigo a continuacion:

#include <Servo.h>
int mover;
int mover2;
Servo servoMotor1;
Servo servoMotor2;
char rxChar;
void setup(){
  servoMotor2.attach(8,600,2400);
  Serial.begin(9600);
pinMode (4,INPUT);//Fin de carrera 1
pinMode (2,INPUT);//Fin de carrera 2
mover=90; //0 Abrir 180 Cerrar 60-120 Velocidades
mover2=180;//motor Cerradura
servoMotor1.attach(8);//Motor Pin8
servoMotor2.attach(9);//Motor Pin9
}
void loop() {
 int lectura; 
 int lectura2;
  servoMotor1.write(mover);
  servoMotor2.write(mover2);
  lectura=digitalRead(4);//fin de carrera
  lectura2=digitalRead(2);//fin de carrera
   if (Serial.available()){
    rxChar=Serial.read(); 
   }
   if(rxChar=='a'){
    mover=60;
    Serial.print(mover);
   }
   else if(rxChar=='b'){
    mover=120;
    Serial.print(mover);
   }
   servoMotor1.write(mover);
  if (lectura==LOW and mover==60){
    mover2=180;//Motor Cerradura Abierto
    mover=90;//motor frena
    
  }
  if (lectura2==LOW and mover==120){
    mover=90;//motor frena
    mover2=20;//Motor Cerradura Cerrado
  }
  }

el unico motor que necesito que se mueva con bluetooth es el servoMotor1

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Por lo que veo nada mas iniciarse el programa el servo se queda en la posicion 90, desconecta la alimentacion de la placa, situa el servo en cualquiera de los extremos y alimenta la placa y veras que automaticamente se situa en la posicion 90.

Y no veo nada en el codigo que haga que la variable mover cambie de valor

Eso no funciona asi, es un servo 360 con rotacion continua, 90 es para frenar el 0 para que gire contrareloj y 180 para que gire a la direccion del reloj. y la unica forma de que frene es cambiandole el valor a 90 y la idea es que cuando la aplicacion me devuelva 'a' "mover" cambie a 60 que es que gire en contrareloj

Revisa el código, primero haces esto

servoMotor1.write(mover);
servoMotor2.write(mover2);

pero luego

servoMotor2.write(mover);

Saludos

Resalto un problema en el código.

servoMotor2 donde funciona finalmente, en pin 3 o pin 9?
Obviamente quedará en pin 9, pero para que lo defines antes en pin 3? Comenta esa linea o elimínala.

Ah bien pense que hablabas de uno de 180º

#include <Servo.h>
int mover;
int mover2;
Servo servoMotor1;
Servo servoMotor2;
char rxChar;
void setup(){
  servoMotor2.attach(3,600,2400);
  Serial.begin(9600);
pinMode (4,INPUT);//Fin de carrera 1
pinMode (2,INPUT);//Fin de carrera 2
mover=90; //0 Abrir 180 Cerrar 60-120 Velocidades
mover2=180;//motor Cerradura
servoMotor1.attach(8);//Motor Pin8
servoMotor2.attach(9);//Motor Pin9
  digitalWrite(4, HIGH);
  digitalWrite(2, HIGH);
}
void loop() {
 int lectura; 
 int lectura2;
  servoMotor1.write(mover);
  servoMotor2.write(mover2);
  lectura=digitalRead(4);//fin de carrera
  lectura2=digitalRead(2);//fin de carrera
   if (Serial.available()){
    rxChar=Serial.read(); 
   }
   if(rxChar=='a'){
    mover=60;
    Serial.print(mover);
   }
   else if(rxChar=='b'){
    mover=120;
    Serial.print(mover);
   }
   servoMotor2.write(mover);
  if (lectura==LOW and mover==60){
    mover2=180;//Motor Cerradura Abierto
    mover=90;//motor frena
  }
  if (lectura2==LOW and mover==120){
    mover=90;//motor frena
    mover2=20;//Motor Cerradura Cerrado
  }
  }

Mira lo que he añadido en las lineas 16 y 17 a ver si hace lo quieres.

  digitalWrite(4, HIGH);
  digitalWrite(2, HIGH);

Con la sugerencia de @tresvdoble activas las resistencias pull-up, equivale a hacer directamente

pinMode (4, INPUT_PULLUP);
pinMode (2, INPUT_PULLUP);

Imagino que ya tiene conectadas las respectivas resistencias a 5V en los finales de carrera pero si caso no las tuviese, es una buena observación la del amigo.

Saludos

Probe las sugerencias que dejaron pero la puerta sigue sin moverse cuando apreto el boton abrir de mi aplicacion

#include <Servo.h>
int mover;
int mover2;
Servo servoMotor1;
Servo servoMotor2;
char rxChar;
void setup(){
  servoMotor1.attach(8,600,2400);
  Serial.begin(9600);

//pinMode (4,INPUT);//Fin de carrera 1
//pinMode (2,INPUT);//Fin de carrera 2
pinMode (4, INPUT_PULLUP);
pinMode (2, INPUT_PULLUP);
mover=90; //0 Abrir 180 Cerrar 60-120 Velocidades
mover2=180;//motor Cerradura
servoMotor1.attach(8);//Motor Pin8
servoMotor2.attach(9);//Motor Pin9
digitalWrite(4, HIGH);
digitalWrite(2, HIGH);
}
void loop() {
 int lectura; 
 int lectura2;
  servoMotor1.write(mover);
  servoMotor2.write(mover2);
  lectura=digitalRead(4);//fin de carrera
  lectura2=digitalRead(2);//fin de carrera
   if (Serial.available()){
    rxChar=Serial.read(); 
   }
   if(rxChar=='a'){
    mover=60;
    Serial.print(mover);
   }
   else if(rxChar=='b'){
    mover=120;
    Serial.print(mover);
   }
   servoMotor1.write(mover);
  if (lectura==LOW and mover==60){
    mover2=180;//Motor Cerradura Abierto
    mover=90;//motor frena
    
  }
  if (lectura2==LOW and mover==120){
    mover=90;//motor frena
    mover2=20;//Motor Cerradura Cerrado
  }
  }

¿Por lo menos obtienes las salidas de los print() cuando envías 'a' o 'b', o tampoco eso?

No, no aparece eso tampoco.

¿Estás seguro que la aplicación del celular funciona bien?

Yo supongo que si, vi varios tutoriales y todos hacen la aplicacion de la misma manera


"Supongo" no es suficiente.

Tienes que aislar el problema.
Prueba enviando los caracteres desde la consola, debería responder.
Si desde la consola responde entonces revisa las conexiones.

si ingreso el caracter desde la consola funciona bien, que conexiones deberia revisar?

Las del módulo bluetooth, si eso está bien el problema debe ser la aplicación.

Saludos

comprobe todo, ahora modifique un poco el codigo y cuando presiono el boton de la aplicacion me devuelve algo, pero no lo que quiero, dejo la imagen a continuacion


cada ⸮ es cada vez que aprete el boton, en vez de mostrar "a" cada vez que apreto el boton muestra "⸮"
Tambien dejo el codigo por las dudas

#include <SoftwareSerial.h>
#include <Servo.h>
int mover;
int mover2;
Servo servoMotor1;
Servo servoMotor2;
char rxChar;
SoftwareSerial BTserial(10, 11);
void setup(){
  Serial.begin(9600);
  Serial.println("Bluetooth test program");
pinMode (4,INPUT);//Fin de carrera 1
pinMode (2,INPUT);//Fin de carrera 2
mover=90; //0 Abrir 180 Cerrar 60-120 Velocidades
mover2=150;//motor Cerradura
servoMotor1.attach(8);//Motor Pin8
servoMotor2.attach(9);//Motor Pin9
BTserial.begin(9600);
BTserial.println("Bluetooth test program");
}
void loop() {
 int lectura; 
 int lectura2;
  servoMotor1.write(mover);
  servoMotor2.write(mover2);
  lectura=digitalRead(4);//fin de carrera
  lectura2=digitalRead(2);//fin de carrera
if (Serial.available())
   {
      BTserial.write(Serial.read());
      
   }
   if (BTserial.available())
   {
      Serial.write(BTserial.read());
      char rxChar = BTserial.read();
   }
   if(rxChar=='a'){
   Serial.print("60 Grados");
   mover=60;
   }
   if(rxChar=='b'){
   Serial.print("120 Grados");
   mover=120;
   }
  if (lectura==LOW and mover==120){
    mover=90;//motor frena
    mover2=30;//Motor Cerradura Cerrado
  }
  if (lectura2==LOW and mover==60){
    mover=90;//motor frena
    
  }
  }

Ahora me gusta más, me "hacía ruido" que usaras el serial para el módulo.

¿Verificarse que en la app esté correcta la velocidad y lo mismo para el módulo?

Agrego:

Esto no está bien

if (BTserial.available())
   {
      Serial.write(BTserial.read());
      char rxChar = BTserial.read();
   }

lee el caracter del serial y lo envía a consola, luego lee otro caracter para guardar en rxChar.
Además la variable rxChar que defines dentro del if() es local por lo que no es la misma que defines como global (de hecho, esa variable local se pierde al salir del if()).

Prueba así

if (BTserial.available())
   {
      rxChar = BTserial.read();
      Serial.write(rxChar);
       
   }

Si, el problema era la velocidad del modulo, y con el codigo que me diste ahora la aplicacion funciona perfecto, gracias.

Me alegra que lo hayamos hecho funcionar.
:+1:t2:

Saludos