Documente Academic
Documente Profesional
Documente Cultură
DIMEC, USACH
2015
void setup() {
// Inicializa comunicacion serial a 9600 bps :
Serial.begin(9600);
}
sensorValue = analogRead(analogInPin);
// mapea valor al rango de salida deseado:
outputValue = map(sensorValue, 0, 1023, 0, 255); // salida sin decimales
outV2 = (float)sensorValue*255.0/1023.0; // salida con decimales
Serial.print(sensorValue);
Serial.print(outputValue);
Serial.println(outV2);
Rojo-Amarillo-Verde
/* Enciende LEDs secuencialmente para una interseccion de dos calles */
// define pines digitales a usar
// Amarillo 1 y Rojo2
digitalWrite(v1, LOW);
digitalWrite(v2, LOW);
delay(5000);
RAV
digitalWrite(v1, LOW); // Rojo1 y Verde 2
digitalWrite(a1, LOW);
digitalWrite(r1, HIGH);
digitalWrite(v2, HIGH);
digitalWrite(a2, LOW);
delay(10000);
digitalWrite(r2, LOW);
//
digitalWrite(v1, LOW); // Rojo1 y Amarillo 2
// Rojo1 y Verde 2
digitalWrite(v1, LOW); digitalWrite(a1, LOW); digitalWrite(r1, HIGH);
digitalWrite(v2, HIGH); digitalWrite(a2, LOW); digitalWrite(r2, LOW);
segundos(10);
// mantenga por 10 sgs
// Rojo1 y Amarillo 2
digitalWrite(v1, LOW); digitalWrite(a1, LOW); digitalWrite(r1, HIGH);
digitalWrite(v2, LOW); digitalWrite(a2, HIGH); digitalWrite(r2, LOW);
segundos(5);
// mantenga por 5 sgs
}
void setup() {
pinMode(v1, OUTPUT); pinMode(a1, OUTPUT); pinMode(r1, OUTPUT);
pinMode(v2, OUTPUT); pinMode(a2, OUTPUT); pinMode(r2, OUTPUT);
}
void loop() {
// Verde1 y Rojo2
// Amarillo 1 y Rojo2
digitalWrite(v1, LOW);
digitalWrite(v2, LOW);
minutos(1UL);
// mantenga por 1 minuto
//delay(1*60*1000UL); // delay de un minuto tambien funciona !!!
// segundos(5); // para barrido rapido use pocos segundos
/*
Funcion MINUTOS() acepta un argumento en minutos
Invoca a la funcion "segundos" con argumento expresado en segundos
Usa variables del tipo unsigned long
*/
void minutos (unsigned long vmin){
unsigned long aux;
aux = vmin*60UL;
segundos(aux); }
/*
Funcion SEGUNDOS() acepta un argumento en segundos
Invoca a la funcion delay() con argumento expresado en milisegundos
Usa variables del tipo unsigned long
*/
void segundos (unsigned long vseg){
unsigned long aux;
aux = vseg*1000UL;
delay(aux); }
Giro Bidireccional
Giro Unidireccional
S1
S2
S3
S4
Resultado
El motor gira
en avance
El motor gira
en retroceso
El motor se
detiene bajo
su inercia
El motor
frena (faststop)
boolean anterior = 0;
boolean actual = 0;
int contador = 0;
void loop()
{
actual = debounce(anterior);
void setup()
{
Serial.begin(9600);
pinMode(2,INPUT);
}
delay (100);
Serial.println(contador);
}
anterior = actual;
}
void setup()
{ pinMode(releReedPin, INPUT);
Serial.begin(9600);
}
void loop() {
// Lee el estado del rele
estadoRele =
digitalRead(releReedPin);
Serial.println("Rele ON");
Serial.print("vuelta ");
Serial.println(vueltas);
Serial.print("Tiempo por
revolucion: ");
Serial.println(tiempo_una_rev);
Serial.print("Revoluciones por
minuto: ");
Serial.println(rpm);
}
else {
// Si el estado actual es LOW pasa de ON a OFF
Serial.println("Rele OFF");
tiempo_anterior = tiempo_ahora;
if (estadoRele != ultimoEstadoRele) {
if (estadoRele == HIGH)
{
vueltas++;
tiempo_ahora =millis();
tiempo_una_rev = tiempo_ahora tiempo_anterior;
rpm = 60000 / tiempo_una_rev;
// 1 minuto = 60000 ms
}
// Guarda el estado actual como ultimo estado
ultimoEstadoRele = estadoRele;
/*
* Tacometro optico para Arduino
*
* Utiliza un LED infrarrojo y un fotodiodo o fototransistor para
implementar un tacometro optico. El LED IR esta conectado al
pin 13 y siempre esta activo.
* El pin 3 esta conectado al detector IR, y genera una
interrupcion cuando la seal en su entrada cambia. El modulo de
Arduino utilizado es Arduino Micro.
*
* Programa basado en: www.instructables.com/id/ArduinoBased-Optical-Tachometer/
*/
int ledPin = 13;
// LED IR conectado a la salida digital 13
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
void rpm_fun()
{
// Esta funcion es la rutina de servicio de interrupcion (ISR)
para la interrupcion externa generada por el dispositivo detector.
La interrupcion solo incrementa el contador.
rpmcount++;
}
void setup() {
// La interrupcion 0 corresponde al pin digital 3, donde esta el
detector IR
// Se dispara con flanco de bajada (cambio de HIGH a LOW)
attachInterrupt(0, rpm_fun, FALLING);
// Encender el LED IR
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
// Inicializar variables de medida de velocidad
rpmcount = 0;
rpm = 0;
timeold = 0;
}
void loop() {
// Actualizar la velocidad cada segundo
// Durante esta espera, el contador se esta incrementando por
interrupcion
delay(1000);
// Desactiva interrupciones durante el calculo
detachInterrupt(0);
rpm = (60*1000/2)*(rpmcount/(millis() - timeold);
timeold = millis();
rpmcount = 0;
// Reiniciar el procesado de interrupciones
attachInterrupt(0, rpm_fun, FALLING);
}