lunes, 30 de diciembre de 2013

Arduino mostrar temperatura con un DS1820 en un LCD 16x2 I2C

Tras varios días de desesperación ya he conseguiguido echar a andar el DS1820 conectado a un display, este es el codigo que he utilizado:



Código:
/*
Autor: Aitor Martin
Fecha: 28-12-2013
Titulo: Sensor de temperatura DS1820
Placa: Arduino uno
Post: http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-mostrar-temperatura-con-un.html

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.
*/

#include <OneWire.h> //Configurar bus onewhire de Dallas
#include <DallasTemperature.h>//El ternometro de Dallas DS1820
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2

//Pata por la que van a entrar los datos al Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup() 
  {
  lcd.init();
  lcd.backlight(); //enciende la iluminacion
  sensors.begin(); //Iniciamos la libreria del DS1820
  }

void loop() 
{

  sensors.requestTemperatures(); //leemmos la temperatura del sensor.
  lcd.setCursor(0, 0);
  lcd.print(sensors.getTempCByIndex(0)); 
  lcd.print(" *C");
  delay(3000);
  }



Nota:
A mi a la hora de compilar, las librerias del DS1820 me dierón problemas. Si este es tu caso mira este enlace:

http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-sensores-ds-1820-y-el-error.html

Arduino sensores DS 1820 y el error WConstants.h

Hace cosa de un par de días que me puse a hacer pruebas con los DS 1820 y no conseguia que me funcionase nada me daba un error el :

Error (TCL 3.7.1 Beta):
Documents/Arduino/libraries/DallasTemperature_371Beta/DallasTemperature.cpp:9:26: 
error: WConstants.h: No such file or directory

De internet me descargue muchas librerias diferentes, pero nada si no era un error, era el otro. Me fui a la que creo que es la web oficial y me descarge la versión TCL 3.7.1 Beta, pero me daba el error que aparace en el recuadro de arriba. A si que me decidi descargarme una versión mas vieja de la libreria. Me baje la libreria TCL 3.5.0 me me dio otro error muy diferente:

Error (TCL 3.5.0):
Documents/Arduino/libraries/DallasTemperature/DallasTemperature.cpp:9:26: error: WConstants.h: No such file or directory
Fuente: http://www.todomarino.com/forum/showthread.php?84914-Informativo-DS18B20-y-arduino-v-1-0

Esta ved me decia que no encontraba WConstants.h, a si que buscando por internet me encontre con una web en la que David Dicha Perez nos da la solución a este problema:

Solucion:
Si alguien se le ha dado por bajarse la ultima versión que han sacado los de arduino (la v 1.0) y usa los sensores de temperatura del tipo ds1820 o otros de dallas os va a fallar. A parte de bajar las ultimas versiones de las librerías onewire y dallastemperature hay que editar a mano la de dallastemperature y cambiar los sitios donde pueda poner WConstants.h o wiring.h por Arduino.h.

No se si ya lo sabíais pero me acabo de volver mico para encontrar esa referencia...

por si alguien quiere ver el resto de cambios echadle un ojo a los de la 1.0:

http://arduino.cc/en/Main/ReleaseNotes

A si que con el editor de textos abri el fichero DallasTemperature.cpp y cambie el texto que ponia WConstants.h por Arduino.h tal y como comentava David, compile y me funciono a la primera.

Antes:
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.

#include "DallasTemperature.h"

extern "C" {
  #include "WConstants.h"
}

Despues:
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.

#include "DallasTemperature.h"

extern "C" {
  #include "Arduino.h"
}

Si no quereis complicaros, en la sección de descargas suelo tener una copia de seguridad de mis librerias compartida con todo el mundo.


viernes, 27 de diciembre de 2013

Arduino funcion de alineación en un LCD

Esta tarde he estado practicando con los LCD via I2C, y he programado esta función que alinea el texto a la derecha, a la izquierda, lo centra, lo muestra aleatiramente en una fila especifica o muestra el texto aleatoriamnete por todo el display.




El codifo fuente es este:


Código:
/*
Autor: Aitor Martin
Fecha: 27-12-2013
Titulo: 007 Posicionar texto en el LCD
Placa: Arduino uno
Post: 

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.

--------------------------------------------------------------------------------------

LA funcion:
lcd_posiciona (16, 2, 1, 5, "Hola Mundo");
16 = Numero de columnas del LCD.
2  = Numero de filas del LCD.
1  = Fila en la que quieremos mostrar el texto (la primera es 1).
5  = Modo de alineacion.
"Hola Mundo" = El texto que vamos a mostrar.

Modos de alineacion:

1 = Izquierda
2 = Derecha
3 = Centro
4 = Aleatorio aciendo caso a la fila
5 = Aleatorio y no hace caso a la fila
*/


#include <Wire.h> //Para usar el I2C
#include <LiquidCrystal_I2C.h>//Para usar el display I2C

LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2
 
void setup()
    {
    lcd.init();        //Iniciamos LCD
    lcd.backlight();   //Enciende la iluminacion
    }
 
void loop()
  {
  lcd_posiciona (16, 2, 1, 1, "Alin. Derecha"); //Llamada a la funcion
  delay(2000);    //Espera 2 segundos
  lcd.clear();    //Borra el LCD
  
  lcd_posiciona (16, 2, 1, 2, "Alin. Izquierda"); //Llamada a la funcion
  delay(2000);    //Espera 2 segundos
  lcd.clear();    //Borra el LCD
  
  lcd_posiciona (16, 2, 1, 3, "Alin. Centro"); //Llamada a la funcion
  delay(2000);    //Espera 2 segundos
  lcd.clear();    //Borra el LCD

  for (int i=0; i<10; i++)
    {  
    lcd_posiciona (16, 2, 1, 4, "Alin. Aleatoria"); //Llamada a la funcion
    lcd_posiciona (16, 2, 2, 4, "Respeta fila"); //Llamada a la funcion
    delay(1000);    //Espera 2 segundos
    lcd.clear();    //Borra el LCD
    }
  
  for (int i=0; i<10; i++)
    {
    lcd_posiciona (16, 2, 1, 5, "Hola Mundo");
    delay(1000);
    lcd.clear();
    }
  }

void lcd_posiciona (int lcd_largo, int lcd_alto, int lcdy, int centrar, String texto)

  {
   int lcdx = 0;
   int largo = texto.length();
   int sobrante = lcd_largo - largo;
   int random_sobrante = random (0, (sobrante + 1));
   int random_y = random (0, lcd_alto);
   
   lcdy = lcdy - 1;
   
   switch (centrar)
     {
     case 1: lcdx = 0; break;
     case 2: lcdx = sobrante; break;
     case 3: lcdx = sobrante / 2; break;
     case 4: lcdx = random_sobrante; break;
     case 5:
             lcdx = random_sobrante;
             lcdy = random_y;
             break;
     default: 
     delay(0);// sentencias
     }

    lcd.setCursor(lcdx, lcdy);//Manda texto a las cordenadas calculadas
    lcd.print
(texto);
  } 


Arduino Display I2C parte 2

El ejemplo anterior no esta muy comentado, por eso lo voy a ir comentado paso a paso. He echo unas modificaciones en el codigo para poder insertar dos lineas de texto:

Código:
/*
Autor: Aitor Martin
Fecha: 27-12-2013
Titulo: 006 Display I2C Hola Mundo
Placa: Arduino uno
Post: http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-display-i2c-parte-2.html 

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.

Basado en un ejemplo de esta URL: 
http://blog.gotencool.com/2012/03/arduino-lcd-via-i2c.html?showComment=1388141296472
*/
#include <Wire.h>
  
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2
 
void setup(){
    lcd.init();
    lcd.backlight(); //enciende la iluminacion
    lcd.setCursor(0, 0);
    lcd.print("Hola mundo desde");
    lcd.setCursor(5, 1);
    lcd.print("el I2C");
}
 
void loop(){
    delay(1000);
}


Primero definimos las librerias que vamos a utilizar. La primera, Wire.h se encarga de manejar el bus I2C, y la otra libreria la LiquidCrystal_I2C.h se encarga de controlarnos el display I2C.

Código:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


A cada bus I2C se le pueden conectar 128 dispositivos. Eso no quiere decir que se puedan conectar 128 dispositivos iguales, ya que algunos fabricantes nos limitan en número de dispositivos iguales que se pueden conectar a un mismo bus I2C. Cada dispositivo tiene un código o dirección que lo disferencia respecto al resto como en este caso:

Código:
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2

Cuando compramos una placa ya montada con su dispositivo I2C, normamente esa pcb tiene unos jumpers o puentes soldables en la PCB para que nostros personalicemos la dirección de nuestro dispositivo.

El siguente paso es activar el LCD:

Código:
    lcd.init();
    lcd.backlight(); //enciende la iluminacion
    lcd.setCursor(0, 0);
    lcd.print("Hola mundo desde");
    lcd.setCursor(5, 1);
    lcd.print("el I2C");

Con  lcd.init(); inicializamos el diplay.

lcd.backlight();  enciende la iluminación.

lcd.setCursor(0, 0); Pone el cursor en la primera columna (1 de 16) y en la primiera dila (1 de 2).

Ahora escribiremos un texto con lcd.print("Hola mundo desde");

El resto de código es igual, solo que escribe un texto en la fila de abajo del display.
 
lcd.setCursor(5, 1);
lcd.print("el I2C");


En el foro de donde he sacado la informacion del display, en uno de los comentarios una persona preguntaba para que se utilizan las resistencias de pul-up, y la respuesta es la siguiente:

Respuesta:
En el bus I2C es importante colocar una resistencia de pull-up a cada 
linea, tanto a la SDA como a la SCL, porque son con estas resistencias 
precisamente las que le marcan la velocidad de transmisión al bus.
 
Prueba con resistencias pull-up de 4K7 que suele ser un valor bastante 
estándar, pero recuerda que dependiendo de la velocidad hay que subir o 
bajar el valor de estas pull-ups.
 

Microchip en este documento:
http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf 
Microchip aconseja:
4K7 < 100kbps 2K2 > 100kps 1K > 400Kbps
Fuente: http://www.foroselectronica.es/f65/configuracion-sda-scl-i2c-1298.html 



Arduino Display I2C

Tras probar varios codigos que me he encontrado por internet, finalmente me he encontrado con este blog gacias al cual he podido aprender a manejar el display I2C:

http://blog.gotencool.com/2012/03/arduino-lcd-via-i2c.html

Arduino + LCD vía I2C

Hace una semana me llegó un display LCD 16x2 con interfaz de conexión i2c, no había tenido oportunidad de probarlo hasta hace unos días.
La gracia de este LCD está en la interfaz, que requiere sólo 4 pines:
  • Vcc (+5V)
  • GND
  • SDA (TX Data)
  • SCL (RX Data)
La comunicación de datos se efectúa mediante i2c, el que emplea un bus de comunicación de dos cables, los que alimentan y comunican dispositivos identificados por una dirección física. El bus permite velocidades entre 100Kbits/s a 400Kbits/s y la transmisión de datos se efectúa en palabras de 8bits.

Para conectar el LCD al Arduino se debe emplear los pines 4 y 5 para SDA y SCL respectivamente. Las conexiones quedarían así:
Finalmente, una vez que hemos efectuado las conexiones debemos cargar algún programa (se requiere la librería LiquidCrystal_I2C):


Código:
#include <Wire.h>
  
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2
 
void setup(){
    lcd.init();
    lcd.backlight(); //enciende la iluminacion
    lcd.setCursor(0, 0);
    lcd.print("Probando i2c");
}
 
void loop(){
    delay(1000);
}

Arduino instalar librerias en MAC OSX

Esta mañana a sido la primera vez que me he visto en la necesidad de utilizar una libreria con arduino. Como soy un novato con el MAC y con el Arduino, no me aclaraba muy bien donde se tenian que guardar las libreias. Si pulsaba sobre el "Sketch/Mostrar la carpeta Sketch" me mandaba a un directorio que estaba a tomar por saco...

Al final lo he soluciona tras leer estea web: http://arduino.cc/es/Hacking/Libraries

Las librerias en el OSX, se tienen que introducir en el siguiente direstorio ~~/Documents/Arduino/libraries/

jueves, 26 de diciembre de 2013

Adruino control de reles 4

Con este codigo se pueden encender 8 reles uno detras de otro al pulsar un pulsador, en la 9ª pulsación todos se apagan.

Si te animas puedes hacer una variariacón en la que al llegar a la 9ª pulsación los reles enpiezan a apagarse de uno en uno...





Código:
/*
Autor: Aitor Martin
Fecha: 26-12-2013
Titulo: Reles con pulsador
Placa: Arduino uno
Post: http://aitormartin-apuntes.blogspot.com.es/2013/12/adruino-control-de-reles-4.html

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.
*/

int ledPin = 13; // seleccionamos pin para el LED
int inPin = 11;   // seleccionamos pin para el pulsador
int val = 0;     // variable para leer estado del pulsador
int pinArray[] = {0, 1, 2, 3, 4, 5, 6, 7};
int count = 0;
int count_array = 0;

void setup()
  {

  pinMode(ledPin, OUTPUT);  // configuramos el LED como SALIDA
  pinMode(inPin, INPUT);    // configuramos el pulsador como ENTRADA
  
  for (count=0;count<8;count++)      // declaramos todas las variables a la vez
    {
    pinMode(pinArray[count], OUTPUT);
    digitalWrite(pinArray[count], LOW);
    Serial.print(count); 
    }
  }

void loop()
  {

  val = digitalRead(inPin);  // leemos el estado del pulsador
  if (val == HIGH)
    {
    digitalWrite(ledPin, HIGH);
    if (count_array <= 7)
      {
      digitalWrite(pinArray[count_array], HIGH);
      count_array ++;
      }
      else
      {
      for (count_array = 0; count_array < 8;count_array++)
        {
         digitalWrite(pinArray[count_array], LOW);
        }
      count_array = 0;
      }
    
    }
    else
    {
    digitalWrite(ledPin, LOW);
    }
    delay(200);
}

Arduino - Pulsador (Pushbutton)

El pulsador es un componente que cierra un circuito cuando lo presionas. El ejemplo enciende y apaga un LED en función del estado de un botón o pulsador.

Conectamos tres cables a la Arduino. El primero va de una patilla del pulsador atravesando una resistencia pull-up (2.2 KOhms) y acabando en la salida de 5V de la Arduino. De la segunda patilla del pulsador conectamos un cable a masa (gnd). El tercer cable conecta con la patilla de la arduino (el pin 7 en nuestro ejemplo) que recibe el estado del pulsador.

Cuando el circuito está abierto (sin pulsar) no hay conexión interna entre las dos patillas del pulsador, por lo tanto el pin del ejemplo (pin 7) se encuentra conectado a 5 voltios (a traves de la resistencia pull-up) y recibe estado alto o HIGH. Cuando pulsamos el botón se conectan internamente las patillas del pulsador conectando el pin del ejemplo a masa (gnd) por lo que recibe estado bajo o LOW. (El pin del ejemplo sigue conectado a 5 voltios, pero la resistencia provoca que esté mas "cercano" a masa).

Código:
/* Lectura digital basica
 * ---------------------- 
 * Enciende y apaga un led conectado al pin digital 13
 * cuando se presiona el pulsador conectado al pin 7
 * Ilustra el concepto de Active-Low (activo en estado bajo)
 * que consiste en conectar un botón usando una resistencia
 * de pull-up (entre 1 y 10K)
 *
 * Basic Digital Read
 * ------------------
 * turns on and off a light emitting diode(LED) connected to digital  
 * pin 13, when pressing a pushbutton attached to pin 7. It illustrates the
 * concept of Active-Low, which consists in connecting buttons using a
 * 1K to 10K pull-up resistor.
 *
 * Created 1 December 2005
 * copyleft 2005 DojoDave <http://www.0j0.org>
 * http://arduino.berlios.de
 *
 */

int ledPin = 13; // seleccionamos pin para el LED
int inPin = 7;   // seleccionamos pin para el pulsador
int val = 0;     // variable para leer estado del pulsador

void setup() {
  pinMode(ledPin, OUTPUT);  // configuramos el LED como SALIDA
  pinMode(inPin, INPUT);    // configuramos el pulsador como ENTRADA
}

void loop(){
  val = digitalRead(inPin);  // leemos el estado del pulsador
  if (val == HIGH) {         // verificamos si el valor es alto (HIGH)
                             // que corresponde al boton sin pulsar
    digitalWrite(ledPin, LOW);  // Apagamos el LED
  } else {
    digitalWrite(ledPin, HIGH); // Encendemos el LED
  }
}

Personalmente ami me gusta mas de esta otro forma, que al pulsar el pulsador se encienda el led:

Código:
int ledPin = 13; // seleccionamos pin para el LED
int inPin = 7;   // seleccionamos pin para el pulsador
int val = 0;     // variable para leer estado del pulsador

void setup() {
  pinMode(ledPin, OUTPUT);  // configuramos el LED como SALIDA
  pinMode(inPin, INPUT);    // configuramos el pulsador como ENTRADA
}

void loop(){
  val = digitalRead(inPin);  // leemos el estado del pulsador
  if (val == HIGH) {         // verificamos si el valor es alto (HIGH)
                             // que corresponde al boton sin pulsar
    digitalWrite(ledPin, HIGH);  // Apagamos el LED
  } else {
    digitalWrite(ledPin, LOW); // Encendemos el LED
  }
}

Fuente:
http://arduino.cc/es/Tutorial/Pushbutton

Cambio de estado de un pulsador


¿cuantas veces nos ha pasado que nuestro proyecto necesita de uno o varios pulsadores? no hay problema, los pulsadores son sencillos de implementar y para leer su estado solo hay que hacer un digitalRead()…

…pero luego resulta que nuestro Arduino UNO o Leonardo hace cosas raras: si la acción a disparar por la pulsación es corta puede que nos la haga miles de veces por segundo o si es larga puede que no suceda nada cuando accionamos otros pulsadores porque Arduino está ocupado en otras cosas y no puede mirar el estado del pin al que hayamos conectado el pulsador.

A mi me pasó que tenía que medir las revoluciones por minuto de un anemómetro y no podía estar todo el tiempo esperando a que se activara el pin y cuando la velocidad de giro de aquel anemómetro era muy lenta el contador se volvía loco cada vez que se cerraba el contacto.

Solución: programar un pequeño código que detecte cuando un pin cambia de estado, bien sea de bajo a alto o viceversa, y además que lleve un contador dentro… y ha resultado ser uno de los códigos que más veces saco de mi “caja de herramientas”.


Mirad que sencillo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int estadoAnterior = 0;
int estadoActual;
int contador = 0;
int pin; // aquí el pin digital que se quiere leer

void setup()
{
  pinMode(pin, INPUT);
}

void loop()
{
  estadoActual = digitalRead(pin);
  if (estadoAnterior != estadoActual)  // ha habido un cambio de estado
  {
    contador++;                          // cuenta los cambios de estado
    int validarPar = contador % 2;       // solo queremos los cambios pares
    if (validarPar != 1)                 // si el cambio es par
    {
      //ponga aqui su codigo
    }
    estadoAnterior = estadoActual;
  }
}

Utilizamos 3 variables: estadoActual, estadoAnterior y contador. El código se limita a mirar en cada loop si las variables estadoActual y estadoAnterior son diferentes, si ello sucede es que el estado del pin ha cambiado desde la última vez que lo miró, incrementa el contador y a partir de aquí es donde se hace la magia: si el resto de la división entre el contador y 2 es diferente de 1 es que el cambio de estado se ha producido de “pulsado” a “no pulsado” y pasará a ejecutar lo que pongamos debajo de “ponga aqui su codigo”.

Si queremos que la acción se desarrolle cuando el puslador es accionado solo hay que cambiar la condición de la línea 18 y poner esta otra “if (validarPar == 1)”.

Además tenemos un contador que cuenta todos los cambios de estado con lo que podemos utilizar este código en encoders u otros dispositivos similares.

Podemos utilizarlo dentro de una función con las variables como locales y el código actuando dentro de una parte muy específica del proyecto, como por ejemplo, en el menú hecho con una LCD y unos botones.

Además podemos hacer que funcione también con pines analógicos, pero eso será en otro tutorial.

Fuente:
http://www.ardumania.es/cambio-de-estado-de-un-pulsador/

Arduino - Varios pulsadores por línea de entrada en Arduino


th pulsadores arduinoEn nuestro primer tutorial sobre el gran Arduino, desvelaremos una manera de usurar mas de un pulsador por línea de entrada he interpretar cada pulsador independientemente. ¿Parece imposible?, con las entradas analógicas de Arduino esto es muy sencillo de implementar.
A la hora de realizar nuestros proyectos con cierta complejidad en Arduino, las entradas digitales de este pueden verse limitadas por el uso de pulsadores, sensores digitales, interruptores, etc. Una solución sencilla, es usar las entradas analógicas que pueden tomar casi infinitos valores y determinar mediante comparación cual de los dispositivos externos se ha accionado. El principio básico de esta solución, es la utilización de un divisor de tensión:
pulsadores arduino 01
Esquema divisor de tensión.
El voltaje de referencia por defecto de Arduino es 5v. Este voltaje se usa para la conversión analógica/digital. Para un valor de 5v en una entrada analógica, su correspondiente en digital con el que trabajaremos en Arduino será 1023, y para un valor de 0v su correspondiente en digital será el 0. Para los demás valores analógicos, les corresponderán los valores intermedios 0-1023. Como podemos apreciar, la resolución de cambio de analógico a digital es de 1024 bits, solo podemos trabajar con 1024 valores analógicos.
Supongamos que queremos usar 5 pulsadores en una sola línea de entrada analógica,
pulsadores arduino 04Donde N es el número de pulsadores por línea.
Este valor es el margen que debemos dejar para interpretar cada pulsador de manera distinta. Tened en cuenta, que se ha incluido el estado en el que no estará pulsado ningún pulsador. En la entrada analógica debemos tener los siguientes valores de tensión cuando se pulse el pulsador:
Ninguno: 0v-0,833v
S1: 0,83v-1,66v
S2: 1,66v-2,49v
S3: 2,49v-3,33v
S4: 3,33v-4,16v
S5: 4,16v-4,99v
Al aumentar el número de pulsadores se disminuirá este margen. Es recomendable no usar un margen demasiado pequeño, porque las caídas de tensiones en los cables o tolerancia en las resistencias pueden producir errores.
Ahora debemos calcular las resistencias R1 y R2 del divisor de tensión:
pulsadores arduino 05
Despejando R2:
pulsadores arduino 06
Para R1 usaremos el valor que mas nos convenga, nosotros usaremos 3,3K.
Vout será uno de los valores del margen para cada pulsador. Es recomendable usar el valor medio del margen para evitar falsos estados.
Vcc podrá ser cualquier voltaje, en nuestro ejemplo 5v.
Por ejemplo, calcularemos R2 para el pulsador S3:
pulsadores arduino 07
Si el resultado de R2 no es un valor de resistencia estándar, cogeremos el valor comercial de resistencia más cercano.
Para los demás pulsadores, realizaremos la misma operación.
pulsadores arduino 02 
Este es el código que debemos usar para que funcione nuestro ejemplo:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void setup() {
Serial.begin(9600);
}
void loop() {
int analogValue = analogRead(0); // Lee el valor de la entrada analógica A0
analogValue = map(analogValue,0,1023,0,6); // Cambiamos el valor de rango
    switch (analogValue){
    case 1:
    Serial.println("Es 1");
    delay(300);
    break;
    case 2:
    Serial.println("Es 2");
    delay(300);
    break;
    case 3:
    Serial.println("Es 3");
    delay(300);
    break;
    case 4:
    Serial.println("Es 4");
    delay(300);
    break;
    case 5:
    Serial.println("Es 5");
    delay(300);
    break;
}
}

pulsadores arduino 03
Debemos tener en cuenta, que cuado se pulsan dos o más pulsadores al mismo momento, la resistencia R2 del divisor de tensión, seria el resultado de la asociación paralela de las resistencias de cada pulsador. Por ejemplo, si pulsamos S1 y S4, la R2 resultante sería:
pulsadores arduino 08
Y por tanto, Vout seria 3,92v. Nuestro Arduino interpretaría esta acción como si se pulsara S4.

Fuente:
http://www.tuelectronica.es/tutoriales/arduino/varios-pulsadores-por-linea-de-entrada-en-arduino.html

Arduino - Encendido aleatorio de reles / led

Partiendo de los egemplos anteriores, he echo esta ligera modificación en el codigo para que me encienda aleatoriamente un led o me active un rele como es el caso.



Código:
/*
Autor: Aitor Martin
Fecha: 26-12-2013
Titulo: Encendido y apagado aleatorio de reles
Placa: Arduino uno
Post: http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-encendido-aleatorio-de-reles-led.html

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.
*/

int pinArray[] = {0, 1, 2, 3, 4, 5, 6, 7};
int count = 0;
int timer = 1000;

void setup()
  {
  for (count=0;count<8;count++)      // declaramos todas las variables a la vez
    {
    pinMode(pinArray[count], OUTPUT);
    }
  }

void loop()
  {
  count = random(0, 8); // Aleatoriamente escogemos que pata se va a encender...
    
  digitalWrite(pinArray[count], HIGH);
  delay(timer);
  digitalWrite(pinArray[count], LOW);
  delay(timer);  
  }



Arduino efecto coche fantastico

En la web oficial de arduino me he encontrado estos egemplos que hacen los mismo de mi post anterior y yo los he modificado para hacer mi propia versión:



Código:

/*
Autor: Aitor Martin
Fecha: 26-12-2013
Titulo: Efecto coche fantastico
Placa: Arduino uno
Post: http://aitormartin-apuntes.blogspot.com.es/2013/12/arduino-efecto-coche-fantastico.html

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.

Basado en un ejemplo de esta URL: 
http://arduino.cc/es/Tutorial/KnightRider
*/

int pinArray[] = {0, 1, 2, 3, 4, 5, 6, 7};
int count = 0;
int timer = 1000; //Para hacerlo con led poner a 100ms

void setup()
  {
  for (count=0;count<8;count++)      // declaramos todas las variables a la vez
    {
    pinMode(pinArray[count], OUTPUT);
    }
  }

void loop()
  {
  for (count=0;count<8;count++)  //Vamos subiendo las luces...
    {
    digitalWrite(pinArray[count], HIGH);
    delay(timer);
    digitalWrite(pinArray[count], LOW);
    delay(timer);
    }
    
  for (count=7;count>=0;count--) //Vamos descenciendo las luces...
    {
    digitalWrite(pinArray[count], HIGH);
    delay(timer);
    digitalWrite(pinArray[count], LOW);
    delay(timer);
    }
  }


Coche Fantástico

Hemos llamado este ejemplo en memoria de una serie de TV de los años 80 donde el famoso David Hasselhoff tenía una Inteligencia Artificial mecánica que conducía su Pontiac. El coche había sido aumentado con multitud de LEDs de todos los tamaños realizando efectos de luces.

Así que decidimos esto para aprender más acerca de la programación secuencial y buenas técnicas de programación para la placa E/S, sería interesante usar el Coche Fantástico como una metáfora.

Este ejemplo utiliza 6 LEDs conectados a los pins 2 - 7 en la placa usando resistencias de 220 Ohm. El primer código de ejemplo hará que los LED parpadeen en una secuencia, uno por uno usando sólo digitalWrite(pinNum,HIGH/LOW) y delay(time). El segundo ejemplo muestra como usar una construcción for(;;) para realizar lo mismo, pero en menos líneas. El tercer y último ejemplo se concentra en los efectos visuales de encender y apagar los LED de una manera más suave.

Ejemplo para los fans de Hasselhoff's


Código:
Coche Fantástico 1

 
/* Coche Fantástico 1
 * --------------
 *
 * Basicamente una extensión de Blink_LED.
 *
 *
 * (cleft) 2005 K3, Malmo University
 * @author: David Cuartielles
 * @hardware: David Cuartielles, Aaron Hallborg
 */

int pin2 = 2;
int pin3 = 3;
int pin4 = 4;
int pin5 = 5;
int pin6 = 6;
int pin7 = 7;
int timer = 100;

void setup(){
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
  pinMode(pin5, OUTPUT);
  pinMode(pin6, OUTPUT);
  pinMode(pin7, OUTPUT);
}

void loop() {
   digitalWrite(pin2, HIGH);
   delay(timer);
   digitalWrite(pin2, LOW);
   delay(timer);

   digitalWrite(pin3, HIGH);
   delay(timer);
   digitalWrite(pin3, LOW);
   delay(timer);

   digitalWrite(pin4, HIGH);
   delay(timer);
   digitalWrite(pin4, LOW);
   delay(timer);

   digitalWrite(pin5, HIGH);
   delay(timer);
   digitalWrite(pin5, LOW);
   delay(timer);

   digitalWrite(pin6, HIGH);
   delay(timer);
   digitalWrite(pin6, LOW);
   delay(timer);

   digitalWrite(pin7, HIGH);
   delay(timer);
   digitalWrite(pin7, LOW);
   delay(timer);

   digitalWrite(pin6, HIGH);
   delay(timer);
   digitalWrite(pin6, LOW);
   delay(timer);

   digitalWrite(pin5, HIGH);
   delay(timer);
   digitalWrite(pin5, LOW);
   delay(timer);

   digitalWrite(pin4, HIGH);
   delay(timer);
   digitalWrite(pin4, LOW);
   delay(timer);

   digitalWrite(pin3, HIGH);
   delay(timer);
   digitalWrite(pin3, LOW);
   delay(timer);
}

Coche Fantástico 2

 
/* Coche Fantástico 2
 * --------------
 *
 * Reduciendo la cantidad de código usando for(;;).
 *
 *
 * (cleft) 2005 K3, Malmo University
 * @author: David Cuartielles
 * @hardware: David Cuartielles, Aaron Hallborg
 */

int pinArray[] = {2, 3, 4, 5, 6, 7};
int count = 0;
int timer = 100;

void setup(){
  // declaramos todas las variables a la vez
  for (count=0;count<6;count++) {
    pinMode(pinArray[count], OUTPUT);
  }
}

void loop() {
  for (count=0;count<6;count++) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer);
  }
  for (count=5;count>=0;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer);
  }
}

Coche Fantástico 3

 
/* Coche Fantástico 3
 * --------------
 *
 * Este ejemplo se concentra en conseguir efectos visuales fluidos.
 *
 *
 * (cleft) 2005 K3, Malmo University
 * @author: David Cuartielles
 * @hardware: David Cuartielles, Aaron Hallborg
 */

int pinArray[] = {2, 3, 4, 5, 6, 7};
int count = 0;
int timer = 30;

void setup(){
  for (count=0;count<6;count++) {
    pinMode(pinArray[count], OUTPUT);
  }
}

void loop() {
  for (count=0;count<5;count++) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count + 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
  for (count=5;count>0;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count - 1], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer*2);
  }
}



Fuente: http://arduino.cc/es/Tutorial/KnightRider

miércoles, 25 de diciembre de 2013

Arduino Encendido y apagado de led / reles

Este es mi primer programa echo en arduino, con el estoy aprendiendo un poco como funciona este jueguetito.



Código:
/*
Autor: Aitor Martin
Fecha: 25-12-2013
Titulo: Encendido y apagado de reles

Código de dominio publico. Se puede distribuir y modificar  libremente, 
siempre y cuando se mencione al autor y se proporcione un enlace a su web.
*/

int rele_01 = 0;    //Definimos un nombre a cada pin digital para que
int rele_02 = 1;    //nos sea mas facil trabajar con ellos...
int rele_03 = 2;
int rele_04 = 3;
int rele_05 = 4;
int rele_06 = 5;
int rele_07 = 6;
int rele_08 = 7;
  
void setup()    //El contenido de este void solo se ejecuta al arrancar...
  {                
  pinMode(rele_01, OUTPUT);    //Configuramos el/los  pines como salida.
  pinMode(rele_02, OUTPUT);
  pinMode(rele_03, OUTPUT);
  pinMode(rele_04, OUTPUT);
  pinMode(rele_05, OUTPUT);
  pinMode(rele_06, OUTPUT);
  pinMode(rele_07, OUTPUT);
  pinMode(rele_08, OUTPUT);
  }


void loop()    //El contenido de este void se ejecuta
               //constantemente en loop (de forma continua) 
  {
  digitalWrite(rele_01, HIGH);
  delay(1000);
  digitalWrite(rele_01, LOW);
  delay(1000);
  
  digitalWrite(rele_02, HIGH);
  delay(1000);
  digitalWrite(rele_02, LOW);
  delay(1000);
  
  digitalWrite(rele_03, HIGH);
  delay(1000);
  digitalWrite(rele_03, LOW);
  delay(1000);
  
  digitalWrite(rele_04, HIGH);
  delay(1000);
  digitalWrite(rele_04, LOW);
  delay(1000);
  
  digitalWrite(rele_05, HIGH);
  delay(1000);
  digitalWrite(rele_05, LOW);
  delay(1000);
  
  digitalWrite(rele_06, HIGH);
  delay(1000);
  digitalWrite(rele_06, LOW);
  delay(1000);
  
  digitalWrite(rele_07, HIGH);
  delay(1000);
  digitalWrite(rele_07, LOW);
  delay(1000);
  
  digitalWrite(rele_08, HIGH);
  delay(1000);
  digitalWrite(rele_08, LOW);
  delay(1000);
}

domingo, 15 de diciembre de 2013

Lazarus concatenar o unir cadenas tipo String

En lazarus para unir o concatenar varias cadenas tipo String solo tenemos que actuar sobre ellas como si se tratara de una suma comun y corriente:

Código:
//Suma de dos variables string en lazarus y delphi:

A:= 'Hola ';
B:= 'mundo';
C:= A+B;

//Suma de dos cadenas string en lazarus y delphi:

C:= 'Hola' + 'mundo';

//En ambos casos generaría una sola cadena tipos String que contiene la suma de los dos textos: "Hola mundo"

Lazarus convertir Boolean a String

Hace unos segundos me he visto en la necesidad de convertir un dato Boolean en uno tipo String y como no sabia si lazarus incorporaba o tenia esta función, he hecho una búsqueda en internet y me he encontrado con esta función muy simple y socorrida:

Código:
function booltostr(n: boolean):string;
begin
  if n = true then result := 'true'
  else result:='false';
end;  

Supongo que no hace falta explicar que para utilizarla podemos hacer una llamada tipo booltostr():

Código:
procedure TForm1.CheckDesbloquearSalidasChange(Sender: TObject);
begin
    if (CheckDesbloquearSalidas.Checked = false) then
    begin
     ShowMessage('Ahora el estado de las salidas es: '+ booltostr(CheckDesbloquearSalidas.Checked));
    end;
end;  

Este artículo basado en este post:

miércoles, 11 de diciembre de 2013

Post procesador de VCarve Pro a MACH3

Hace poco se me rompió el PC con el cual controlaba mi CNC (maquina de control numérico) y a la hora de configurar el nuevo PC, me he encontrado con que no me acordaba como tenia que guardar los ficheros en el VCarve Pro.
Para que no me suceda de nuevo esto, expongo aquí públicamente como tengo que guardar los G-Code para mi maquina:

Mach2/3 Arcs (mm)

Si por algún motivo estamos trabajando en pulgadas tenemos que cambiar la unidad del post procesador para que nos guarde nuestro G-code en pulgadas.

Un saludo.

miércoles, 23 de octubre de 2013

Lazarus Conectar a una base de datos SQLite 3 + Video

He hecho este mini manual para poder acordarme como conectar con la base de datos sqlite, ya que me ha costado un poco el aprender a conectar mi programa a la base de datos.


Este es el codigo que he utilizado:

Código:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, DBGrids,
  sqldb, db, sqlite3conn;

type

  { TForm1 }

  TForm1 = class(TForm)
    Datasource1: TDatasource;
    DBGrid1: TDBGrid;
    SQLite3Connection1: TSQLite3Connection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 Form1. Caption:='SQLite with DBGrid';
 SQLite3Connection1.DatabaseName:='datos.db';
 SQLite3Connection1.Connected:=true;
 SQLTransaction1.Database:=SQLite3Connection1;
 SQLQuery1.Database:=SQLite3Connection1;
 //SQLQuery1.SQL.text:='Select * FROM datos';
 SQLQuery1.SQL.text:='Select * from datos where nombres Like a   ';
 SQLQuery1.open;
 DataSource1.DataSet:=SQLQuery1;
 DBGrid1.DataSource:=DataSource1;
 DBGrid1.AutoFillColumns:=true;
end;

end.   



Para poder aprender hacer esto la información la he conseguido en:

http://alevel-computing.x10.mx/mw/index.php/Lazarus