Go Down

Topic: No entiendo esta linea de código. (Read 151 times) previous topic - next topic

9acca9

Apr 18, 2019, 05:43 am Last Edit: Apr 18, 2019, 05:53 am by 9acca9
Buenas.
Resulta que estoy intentando hacer un alimentador para gatos con un servo motor, y un arduino nano. Esto ya lo hicieron por lo que uso el código y la idea de otro. Pero algo raro le pasa a mi proyecto, y es que se tilda, pareciera luego de unas veces de usarlo. Pero más allá de eso, estuve probando el código en tinkercad.com (un simulador) y hay algo que no entiendo respecto al código. que es este:

Code: [Select]
#include <Servo.h>

Servo myservo;

const int servoPin = 9;
const int buttonPin = 12;
const int ledPin = 13;

void setup() {
  myservo.attach(servoPin);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  digitalWrite(ledPin, LOW);
  myservo.write(180);
  delay(1000);
  myservo.detach();
}

void loop() {
  int buttonVal = digitalRead(buttonPin);
  if(buttonVal == LOW) {
    myservo.attach(servoPin);
    myservo.write(30);
    delay(575);
    myservo.write(180);
    delay(1500);
    myservo.detach();
    delay(5000);
  }
  delay(13);
}



Para qué es ledPin?? Yo pensaba que era un error del que hizo el código, que quizás en su circuito tenía un led que encendía y apagaba pero en el simulador sucede algo raro.

Si elimino todo lo relacionado con ledPin y ejecuto la simulación me encuentro con que el servo motor se mueve todo el tiempo sin que presione el interruptor...... y no entiendo entonces. Para qué es ledPin??? De hecho en el circuito no hay nada conectado a 13.

Un saludo a todos y gracias.


cas6678

En relacion al pin 13 ese codigo lo unico que hace es ponerlo en estado bajo (low) en el setup, nada mas. Luego en el loop no lo usa. Desconozco que hace la libreria servo.h quizas ahi SI se use, por ejemplo para encender cuando se mueve el servo, no lo se.

Tu dices que no hay nada conectado al pin 13. Es que el pin 13 tambien tiene un led integrado en la propia placa arduino, y ese led se enciende con un digitalWrite (13,HIGH) y se apaga con un digitalWrite (13,LOW) con independencia que no tenga nada fisicamente conectado al pin 13. Mira la placa y sabras si la libreria servo.h lo usa sin necesidad de poner un led exterior en el 13. Es un led integrado que esta al lado de A7 en el propio nano.

Saludos.

arduin01

#2
Apr 19, 2019, 04:10 pm Last Edit: Apr 19, 2019, 04:11 pm by arduin01
Pues primero de todo, hay dos problemas con el código. Si un pin está configurado como "INPUT", no se puede usar digitalWrite. En este caso, lo que habría que hacer es usar "INPUT_PULLUP" y quitar el digitalWrite. Y tampoco se puede usar digitalWrite sin usar pinMode, así que el digitalWrite del ledPin no hace absolutamente nada.

De todos modos, lo he probado en un Arduino de verdad conectado a un servo y no hay problema alguno en ninguno de los casos, así que concluyo que es un error del simulador, especialmente teniendo en cuenta los graves problemas que hay en el código que he mencionado.
"Hay 10 tipos de personas en el mundo: las que saben binario y las que no." -- Anónimo
"There are 10 types of people in the world: those who know binary and those who don't." -- Anonymous

Kike_GL

#3
Apr 19, 2019, 06:13 pm Last Edit: Apr 19, 2019, 06:19 pm by Kike_GL
Quote from: arduin01
Pues primero de todo, hay dos problemas con el código. Si un pin está configurado como "INPUT", no se puede usar digitalWrite. En este caso, lo que habría que hacer es usar "INPUT_PULLUP" y quitar el digitalWrite.
Esos comandos son equivalentes y validos. Existen 3 opciones de hacer eso mismo:

Code: [Select]
pinMode(buttonPin, INPUT);      //Configura como salida
digitalWrite(buttonPin, HIGH);   //Activa pull-up

//Es lo mismo que hacer:
digitalWrite(buttonPin, HIGH);   //Por defecto todos los pines son entrada + Activa pull-up

//Es lo mismo que hacer:
pinMode(buttonPin, INPUT_PULLUP);   //Configura como salida + Activa pull-up


Quote from: arduin01
Y tampoco se puede usar digitalWrite sin usar pinMode, así que el digitalWrite del ledPin no hace absolutamente nada.
Eso si es un error, lo correcto seria

Code: [Select]
const byte ledPin = 13;   //Basta con byte que ocupa menos que int
void setup() {
   pinMode(ledPin, OUTPUT);  //Indispensable, recuerda que por defecto todos los pines están en INPUT
   digitalWrite(ledPin, LOW);  //Innecesario ya que por defecto están en LOW
}


En muchos Arduinos el pin 13 corresponde al LED interno, pero se recomienda usar la contante LED_BUILTIN para hacer referencia a dicho pin así te asegurar de que no importe el modelo de Arduino.

Code: [Select]
void setup() {
   pinMode(LED_BUILTIN, OUTPUT);     //Define como salida
   digitalWrite(LED_BUILTIN, HIGH);    //Prende LED interno de Arduino
   delay(500);                                    //Espera medio segundo
   digitalWrite(LED_BUILTIN, LOW);     //Apaga LED interno de Arduino
}
Saludos, Kike_GL

9acca9

Muchas gracias por la explicación detallada!!

Go Up