Calificación:
  • 1 voto(s) - 1 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Proyecto Dimmer (Arduino desde 0)
#1
Buenas tardes,
Se me han roto los dimmer con los que regulaba la iluminación de mi sótano y he decidido hacer unos con arduino y la ayuda de txapuzas (http://txapuzas.blogspot.com.es/2009/12/...ia-de.html)

Primero vamos a centrarnos en el Arduino (Con el que es mi primer contacto).

Os explico brevemente cómo funcionaban y quiero que funcione por arduino (seguro que es posible):

- Pulsación corta: Apaga/Enciende las luces (recordando la intensidad a la que estaban cuando apagamos)
- Pulsación larga: Regula la intensidad; si está al máximo brillo, atenúa y si está al mínimo, aumenta el brillo. Si está en un valor intermedio de brillo, la primera vez que mantenemos pulsado empieza a aumentar y si soltamos y volvemos a dejar pulsado, atenúa la sala.

-Ya que usamos arduino, me gustaría dejarlo preparado para controlarlo remotamente y ver el estado de las salidas también.

He empezado mezclando algo de los ejemplos del IDE y he conseguido esto:

Código:
/*
The circuit:
* LED from pin 11 to ground
* pushbutton to pin 2 from +5V
* 10K resistor to pin 2 from ground
*/

const int Pulsador = 2;   // Pulsador
const int Salida = 11;    // Salida 0-5v
int buttonState = 0;      // Variable para leer el estado del pulsador
int Brillo = 0;           // Cantidad de Salida 0-255
int Intervalo = 5;        // Intervalos de aumento/reducción
int Velocidad = 30;       // Velocidad de efecto

void setup() {
  // Configuramos el pin Salida como salida.
  pinMode(Salida, OUTPUT);      
  // Configuramos el pin Pulsador como entrada.
  pinMode(Pulsador, INPUT);  
  // Inicializamos el puerto serial.
  Serial.begin(9600);  
}
void loop(){
  // Leemos el estado del pulsador
  buttonState = digitalRead(Pulsador);

  // Comprobamos el estado del pulsador
  if (buttonState == HIGH) {        
    digitalWrite(Salida, HIGH);  
    Serial.println("Press");
  }
  else {
    digitalWrite(Salida, LOW);
    Serial.println(buttonState);
  }
  delay(Velocidad);
}

Aunque estoy a años luz, con un pulsador ya enciendo un LED y muestro por serial el estado de la pulsación. :aplauso:
Seguramente todo este código haya que cambiarlo, pero poco a poco...

Primeras dudas:
-¿Por qué necesito conectar una resistencia de 10K a gnd para que funcione? Si no lo hago, ayer se mantenía el estado en pulsado como 5 segundos más, y hoy, si suelto la resistencia, el LED parpadea como loco.

Problemas detectados:
-Con el delay a 30ms, cuando pulso el botón, el arduino hace 3 o 4 ciclos, con lo que en principio es complicado distinguir entre pulsación corta/larga. Sin tener ni idea, ¿tendré que usar milis? Le daré una pensada, a ver qué se me ocurre/investigo...


Seguiré actualizando. Gracias y perdón por el tocho.... :dale2:
Citar
#2
Monte algo parecido hace 2 años, tienes la documentación aquí por si te sirve: http://giltesa.com/category/electronica/...?order=asc

El primer código que encontraras permite encender y apagar desde el pulsador (que no interruptor/botón...) y desde el mando a distancia. Cambien permite programar el apagado automático pasado un tiempo.

El segundo código permite encender y apagar la luz principal y la secundaria, ademas esta ultima permite atenuar y recuerda la ultima configuración, pero solo durante la ejecución, si se va la luz se pierde, si quisieras mantenerlo tendrias que guardar la configuración en la memoria EEPROM del micro.


Es necesario usar una resistencia con el pulsador para evitar interferencias y obtener lecturas de LOW/HIGH - 0/5V exactas.
http://arduino.cc/es/Tutorial/Button

Intenta no usar delays o podrían coincidir durante una pulsación haciendo que tengas que pulsar de nuevo el pulsador...


Mola
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
Citar
#3
Tu primera duda; La colocacion de una resistencia a alimentacion (Vcc) o a masa (gnd) se hace para no dejar el pin digital al "aire", con lo que podria obtener cualquier valor (1 o 0) de forma totalmente incontrolable y aleatoria. Con esta resistencia, nos aseguramos que cuando el pulsador no este accionado, el pin se mantenga estable en 1 o 0 segun nos interese. Ademas de evitar un corto entre Vcc y masa en la parte del interruptor.

Sobre la segunda pregunta, se me ocurre que cuentes el tiempo que mantienes el pulsador accionado y despues hagas algun calculo que te saque un equivalente a la luminosidad que quieres. Teniendo en cuenta que has de dejar unos pocos ms inciales sin tenerlos en cuenta (de esta forma aplicas un pequeño filtro por software para evitar rebotes).

Espero te sirva. Es una aplicacion muy sencilla la que quieres hacer, quizas te interese usar solo el micro y los componentes necesarios para que funcione y ahorrar espacio y el arduino, pero para testearlo todo, va bien que empieces con el arduino.

Saludos
Citar
#4
Como te han dicho los compañeros, la resistencia "pull-up" es obligatoria en los pulsadores.

Te recomiendo que uses interrupciones para los pulsadores, de esta forma no tienes que estar todo el tiempo comprobando si se ha pulsado el boton. Queda mucho mas elegante.

Dale un vistazo a esta web que explica muy bien el tema de pulsadores, interrupciones y rebotes.

http://fuenteabierta.teubi.co/2012/12/ma...duino.html

Saludos
Citar
#5
SusoINC escribió:Buenas tardes,
Primeras dudas:
-¿Por qué necesito conectar una resistencia de 10K a gnd para que funcione? Si no lo hago, ayer se mantenía el estado en pulsado como 5 segundos más, y hoy, si suelto la resistencia, el LED parpadea como loco.

Problemas detectados:
-Con el delay a 30ms, cuando pulso el botón, el arduino hace 3 o 4 ciclos, con lo que en principio es complicado distinguir entre pulsación corta/larga. Sin tener ni idea, ¿tendré que usar milis? Le daré una pensada, a ver qué se me ocurre/investigo...


Seguiré actualizando. Gracias y perdón por el tocho.... :dale2:

La resistencia de 10K a tierra en el interruptor, es necesaria, ya que de no ponerla, cuanto tu actuas el interruptor (Introducimos 5V), cortocircuitas tierra con alimentacion. Es lo que se llama una resistencia PullDown.

Para el interruptor, necesitaras evitar de alguna forma el rebote, yo en tu caso añadiria un condensador al interrutor, sino tendras que emplear una rutina antirebote. El rebote es debido a que el interruptor es un elemento mecanico, y no funciona idealmente, sino que cuando tu le pulsas, envia varios pulsos aunque no lo parezca, que el arduino es capaz de reconocer y no funciona como debiera.

resim

En este caso en la foto es el circuito de la Izquierda.


No te recomiendo que uses delays en el codigo, implementalo con millis(), aunque sea un poco mas costoso jejejeje.

De todas maneras, echale un ojo a esta instruccion de arduino, te puede ser util:

http://arduino.cc/es/Reference/PulseIn

A partir de aqui yo creo que ya puedes tirar para adelante.
Citar
#6
daniez escribió:Como te han dicho los compañeros, la resistencia "pull-up" es obligatoria en los pulsadores.

Te recomiendo que uses interrupciones para los pulsadores, de esta forma no tienes que estar todo el tiempo comprobando si se ha pulsado el boton. Queda mucho mas elegante.

Dale un vistazo a esta web que explica muy bien el tema de pulsadores, interrupciones y rebotes.

http://fuenteabierta.teubi.co/2012/12/ma...duino.html

Saludos


Interesante este articulo Guiño
Citar
#7
Muchas gracias. Aportes del nivel del foro, muy buenos.
Para mí, golpe de remo. Consultaré más a menudo la documentación...

Con esto tengo más que suficiente para seguir.

Seguiré actualizando
Citar
#8
No necesitas poner resistencia pullup ni pulldown física en arduino, los pines digitales se pueden configurar con una resistencia pullup y te evitas el hardware a mayores.
Para usarlas debes poner despues de:
pinMode(Pulsador, INPUT); // esto lo tienes puesto tu para configurar el pin "Pulsador" como entrada
// a continuacion pones
digitalWrite(Pulsador,HIGH);//esto al estar configurado como entrada activa la resistencia pullup interna del pin "Pulsador"
...pero tu ahora mismo lo tienes con resistencia pulldown por lo que tienes que cambiar el código y donde pones
if (buttonState == HIGH) {
digitalWrite(Salida, HIGH);
Serial.println("Press");
}

debes cambiarlo para (buttonState == LOW)...
Y ahora el pulsador simplemente lo tienes que conectar a gnd.
Esta es la mejor forma de conectar un pulsador a arduino.
Cuando un hombre planta un árbol bajo cuya sombra sabe que no se sentará ha comenzado a comprender el sentido de la vida... o lo que es lo mismo... comparte!!!
Citar
#9
DiegoLale escribió:No necesitas poner resistencia pullup ni pulldown física en arduino, los pines digitales se pueden configurar con una resistencia pullup y te evitas el hardware a mayores.
Para usarlas debes poner despues de:
pinMode(Pulsador, INPUT); // esto lo tienes puesto tu para configurar el pin "Pulsador" como entrada
// a continuacion pones
digitalWrite(Pulsador,HIGH);//esto al estar configurado como entrada activa la resistencia pullup interna del pin "Pulsador"
...pero tu ahora mismo lo tienes con resistencia pulldown por lo que tienes que cambiar el código y donde pones
if (buttonState == HIGH) {
digitalWrite(Salida, HIGH);
Serial.println("Press");
}

debes cambiarlo para (buttonState == LOW)...
Y ahora el pulsador simplemente lo tienes que conectar a gnd.
Esta es la mejor forma de conectar un pulsador a arduino.


Pues ahora me entero de que el arduino tenia resistencia pull-up interna. ¡¡Y yo poniendo resistencias en los pulsadores !!

Gracias por la info, la pondremos en practica.
Citar
#10
Es un detalle k se suele pasar por alto
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Subir datos a ubidots y thingspeak desde un dispositivo. alejayo 5 856 16-08-2017, 11:30 AM
Último mensaje: alejayo
  Dimmer para tira de leds, problema ZeroCool 7 1,297 27-04-2016, 08:57 PM
Último mensaje: Bayaz
  Proyecto sckay 46 3,525 23-11-2015, 04:17 PM
Último mensaje: Iván
  Proyecto tablet pc con arduino crivi01 3 851 23-10-2015, 08:13 PM
Último mensaje: jukillo
  envio coordenadas gps desde android a arduino jhon_bishop 7 2,257 13-10-2015, 09:00 PM
Último mensaje: Bayaz