jueves, 26 de diciembre de 2013

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.