ICs

viernes, 11 de marzo de 2016

Luz Estroboscópica

Una luz estroboscópica es una luz que parpadea con una determinada frecuencia.
Con Arduino puede variarse esta frecuencia a través de la lectura analógica de un potenciómetro.
Este es un proyecto sencillo que saque del siguiente sitio:

http://superawesomebook.com/strobe/


sólo que se me ocurrió agregarle un control de velocidad a un motor de DC de manera que al iluminarlo con la luz estroboscópica lograra verse detenido.

Detalles para su construcción

Reciclé una linterna de leds de 9 leds alimentados con una fuente externa de 4,5volts. Para controlarlos con Arduino agregar un transistor BC547b.
El motor, también alimentado con 4,5 volt de la fuente externa, se controlo con un Mosfet IRF520. Ambos transistores provistos por el starter kit de Arduino.


Esquema de conexión





Video



Sketch

/***************************************************************************
Luz estroboscopica con Motor DC
Led en pin 13 
Motor en pin PWM  9
Potenciometro Led en A2
potenciometro en A1

marzo 2016
****************************************************************************/  
int analogPin = 2; // entrada analógica para la frecuencia de parpadeo del Led
int velMotor = 1  // entrada analógica para la velocidad del motor
int ledPin = 13; // Salida para Led
int motor =9;  // Salida PWM para motor 
  // How much time should the light stay on between delays, in Microseconds (millionths of a second)?
    /* Big number = more blur, more perceived brightness
     * Small number = less blur, less perceived brightness  */
  long onTime = 250;

  // What should the minimum delay be in milliseconds (thousandths of a second)?
  // This sets the bottom delay range of the strobe, as a delay of 0 doesn't actually flash =P
  // The strobe starts with this as the "fastest" mode, and goes slower from there, adding to the delay
  int minDelay = 1; // 1 is the lowest we can actually do without a better delay function  

  // What should the maximum delay be in milliseconds?
  // This is the longest time that the biggest potentiometer value will be mapped to, and longest
  // time between strobe flashes.
  int maxDelay = 100;




// Initialize the number to hold our strobe delay. Isn't used till we get to the main loop
long strobeDelay = 0;

void setup() {
 pinMode(ledPin, OUTPUT); // Setup ledPin as an output.
pinMode(motor,OUTPUT);
}

void loop() {
  // To make the math easier, we use map(value, fromMin, fromMax, toMin, toMax) to convert the
  // 0 to 1023 range we get from analogRead, into our strobe delay range of 1 to 100 :D
  strobeDelay = map(analogRead(analogPin), 0, 1023, minDelay, maxDelay);

  digitalWrite (ledPin, HIGH); // Switch the ledPin to HIGH, turn it on!
  delay Microseconds(onTime); // Delay while on, for the given onTime.
  digitalWrite(ledPin, LOW); // Switch the ledPin to LOW, turn if off!
  delay (strobeDelay); // Delay while off, for given strobeDelay.
int vel=analogRead(A1);

analogWrite (motor,vel);


}


miércoles, 27 de enero de 2016

Simular presencia encendiendo y apagando luces

Introducción

Este no es el primer proyecto que desarrollo con Arduino pero es el primero que quiero documentar en forma ordenada para poder mostrarlo y compartirlo. Luego de jugar, copiar y modificar proyectos sencillos sacados en la web empecé a pensar en aquellos que sirvieran en satisfacer alguna necesidad. Ante la inminente salida de vacaciones mi esposa me preguntó si podríamos colocar algún dispositivo que simule nuestra presencia en la casa prendiendo y apagando las luces para que puedan verse desde la calle. Existen los relojes que uno puede programar pero consideré que tenía algunas desventajas. Por ejemplo es necesario un reloj por cada luz sobre la que actuar y lo segundo es que debe hacerse un programa para que cada día tenga horarios diferentes de encendido/apagado. Con Arduino se simplifica bastante. Primero con una placa que comande un módulo de relés, uno para cada circuito.Luego con programación se puede pensar fácilmente un algoritmo que varíe el horario para cada día ya sea aleatoriamente o con un array de 7 elementos. Para solucionarlo en pocas horas pensé en una primera versión que en resumen hace:

  •  se introducen en variables arrays la hora y minutos de encendido y de apagado de una sola luz
  • elegí hacerlo en una secuencia que se repite cada  tres días
  • con sólo la elección de éstos tres horarios puedo modificarlos  sumando o restando para tener otros grupos de horarios para encender otras luces.
  • queda pendiente para la próxima versión hacer que sea aleatorio la elección de los horarios. 
Los Materiales
  • Placa Arduino UNO
  • Modulo de 4 relés
  • Modulo Tiny RTC I2C

Sketch

/*VACACIONES
 *  Programa para encendido/apagado automático de 2 luces  
 *  tres dias diferentes
 *  para dos reles
 *  enero 2016
 *  Flavio Ragazzi *  
 */
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int factor; //determinación de  día 0, 1 ó 3

int HoraIn =21 ; // Hora para el  encendido
int HoraOut = 23; //Hora para el  apagado
int MinIn[] ={45,39,23};  // minutos para el encendido  
int MinOut[] ={8,17,3}; // minutos para el apagado 
int Retraso[] ={7,11,9}; //retraso para en encendido de la segunda luz

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
    pinMode(10,OUTPUT);  // pin para comando de rele 1
    pinMode(12,OUTPUT);  // pin para comando de rele 2

  
  if (! RTC.isrunning()) {
    Serial.println("RTC  NO FUNCIONA!");
    // setea elmodulo RTC con la fecha  de la PC cuando fue compilado/cargado el sketch
    RTC.adjust(DateTime(__DATE__, __TIME__)); 
  }
}
void loop () {
    DateTime now = RTC.now(); 
    
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.println(now.minute(), DEC);
  
        delay(1000);

factor= now.day()%3; //determinación si se trata de día 1,2 ò 3 factor es el resto que resulta de dividir el día por tres

Serial.print("dia:");
Serial.print(factor);
Serial.print(' ');
Serial.print("hora de encendido : ");
Serial.print(HoraIn);
Serial.print(':');
Serial.print(MinIn[factor]);
Serial.print(' ');
Serial.print("hora de apagado : ");
Serial.print(HoraOut);
Serial.print(':');
Serial.println(MinOut[factor]);

// para elencendido
if(now.hour()==HoraIn && now.minute()>=MinIn[factor]){
  digitalWrite(10,LOW);
  if(now.hour()==HoraIn && now.minute()>= (MinIn[factor]+Retraso[factor])){
    digitalWrite(12,LOW);
    }
  }
//para el apagado  
if(now.hour()==HoraOut && now.minute()>= MinOut[factor]){
    digitalWrite(10,HIGH);
    if(now.hour()==HoraOut && now.minute()>= (MinOut[factor]+Retraso[factor])){
    digitalWrite(12,HIGH);
    }
}
}