Sunteți pe pagina 1din 19

Renato Salinas

DIMEC, USACH
2015

Con mapeo tipo int y tipo float


/* Entrada Analoga , salida analoga, output serial
Lee Puerto analogo, mapea resultado al interval 0 a 255 y usa este valor para manejar salida PWM
Despliega resultado en monitor serial
El circuito:
* Pin central del potentiometro se conecta al pin A0
Pines laterals del pot. van a +5V y a tierra (ground)
* LED conectado del pin 9 a tierra
*/
const int analogInPin = A0; // Pin analogo (entrada) conectado al potenciometro
const int analogOutPin = 9; // Pin analogo conectado al LED
int sensorValue = 0;
// valor leido desde el potenciometro
int outputValue = 0;
// valor de salida al PWM (analog out)
float outV2 = 0;
// variable usada para mostrar salida punto flotante

void setup() {
// Inicializa comunicacion serial a 9600 bps :
Serial.begin(9600);
}

Con mapeo tipo int y tipo float


void loop() {
// lee valor analogo:

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

// envia valor analogo (Puerto pwm):


analogWrite(analogOutPin, outputValue);
// muestra resultados en monitor serie:
Serial.print("sensor = " );

Serial.print(sensorValue);

Serial.print("\t output = ");

Serial.print(outputValue);

Serial.print("\t floatOutput = ");

Serial.println(outV2);

// espera 20 milliseconds antes de repetir el loop


// para estabilizar al conversor ADC y facilitar lectura al usuario
delay(20);

Rojo-Amarillo-Verde
/* Enciende LEDs secuencialmente para una interseccion de dos calles */
// define pines digitales a usar

int v1 =2; int a1 =3; int r1 =4;


int v2 =5; int a2 =6; int r2 =7;
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
digitalWrite(v1, HIGH); digitalWrite(a1, LOW); digitalWrite(r1, LOW);

digitalWrite(v2, LOW); digitalWrite(a2, LOW); digitalWrite(r2, HIGH);


delay(10000);

// mantenga por 10 segs

// Amarillo 1 y Rojo2
digitalWrite(v1, LOW);

digitalWrite(a1, HIGH); digitalWrite(r1, LOW);

digitalWrite(v2, LOW);

digitalWrite(a2, LOW); digitalWrite(r2, HIGH);

delay(5000);

// mantenga por 5 segs

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);

// mantenga por 10 sgs

//
digitalWrite(v1, LOW); // Rojo1 y Amarillo 2

digitalWrite(a1, LOW); digitalWrite(r1, HIGH);


digitalWrite(v2, LOW); digitalWrite(a2, HIGH); digitalWrite(r2, LOW);
delay(5000);
}

// mantenga por 5 sgs

/* Enciende semaforos LEDs para una interseccion de dos calles */


// Dr. R. Salinas, Noviembre 2015
// define pines digitales a usar;

// 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

// usa dos funciones propias MINUTOS() y SEGUNDOS()


//
int v1 =2; int a1 =3; int r1 =4;
int v2 =5; int a2 =6; int r2 =7;

// 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

digitalWrite(v1, HIGH); digitalWrite(a1, LOW); digitalWrite(r1, LOW);


digitalWrite(v2, LOW); digitalWrite(a2, LOW); digitalWrite(r2, HIGH);
segundos(10);

// Amarillo 1 y Rojo2

digitalWrite(v1, LOW);

digitalWrite(a1, HIGH); digitalWrite(r1, LOW);

digitalWrite(v2, LOW);

digitalWrite(a2, LOW); digitalWrite(r2, HIGH);

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); }

Control via un transistor (giro en un sentido)


Control via puente H (giro en ambos sentidos)

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);
}

if ( anterior == 0 && actual == 1)


{
contador++;

boolean debounce(boolean dato_anterior)


{

boolean dato_actual = digitalRead(2);


if (dato_anterior != dato_actual)
{
delay(10);
dato_actual = digitalRead(2);
}
return dato_actual;
}

delay (100);
Serial.println(contador);
}
anterior = actual;
}

const int releReedPin = 2;


int vueltas = 0;
int estadoRele = 0;
int ultimoEstadoRele = 0;
long tiempo_anterior = 0;
long tiempo_una_rev = 0;
unsigned long tiempo_ahora;
long rpm;

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");

// Compara el estado del rele con el estado


previo

tiempo_anterior = tiempo_ahora;

if (estadoRele != ultimoEstadoRele) {

// Si el estado ha cambiado incrementa el


contador

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);
}

S-ar putea să vă placă și