miércoles, 27 de agosto de 2014

LibreCAD importar DXF

Hola, no he indagado mucho por que el LibreCAD no permite importar ficheros, pero como me hacia falta una solución rápida yo le he echo de esta forma:

Desde la consola del linux he ido al directorio /usr/share/librecad/ y le he cambiado los permisos a la carpeta library mediante chmod para poder crear directorios y pegar archivos dentro de dicha carpeta.

Posteriormente dentro de la carpeta library he creado un directorio donde he guardado los diferentes ficheros DXF que quería importar en mi proyecto.

Después de reiniciar el LibreCad, he habilitado Library Browser que esta en:

View -> Toolbars -> Enable Library Browser

Ahora nos debería de aparecer nuestra carpeta en una pestaña desplegable y si la seleccionamos veremos nuestros dibujos...

domingo, 5 de enero de 2014

Arduino cast o truncar un número foat para Convertit float a int, convertir int a byte...

Según el manual de referencia de Arduino, el operador cast (convertidor de tipos) traduce de un tipo de variable a otra y fuerza que los cálculos se realicen según en el nuevo tipo de variable.

Ejemplo
int i;
float f;
f = 3.6;
i = (int) f; // ahora i es 3

Nota
Cuando hacemos un casting de un float a un int (coma flotante a entero) el valor es truncado, no redondeado. Así que por ejemplo, tanto (int) 3.2 como (int) 3.7 acaban siendo 3.

Fuente: http://arduino.cc/es/Reference/Cast

Una ved llegados a este punto podemos pensar que cast no muy útil puesto que al utilizarlo perdemos los decimales. Pero existe un truco para pasar un valor foat a int sin perder las decimales. Imaginemos que estamos trabajando con un termometro que nos mide la temperatura en grados, y el valor entregado lo tenemos almacenado en una variable float, y nosotros queremos pasarlos a una variable tipo int con dos decimales de precisión. Para solventar este problema, tenemos que trabajar en fracciones de la unidad (décimas, centésimas, milésimas) y escoger la unidad que mejor se ajuste a nuestras necesidades.

En este ejemplo que me puso noter en el foro de arduino se ve claramente a que me refiero:

Código:
float grados=27.56;
int centGrados= grados*100.0; // centGrados=2756
Serial.print(centGrados/100); // Imprime 27
Serial.print(",");
Serial.print(centGrados%100);// Imprime 56 

Fuente: http://forum.arduino.cc/index.php?topic=208565.0

Gracias a ehrja y noter por enseñarme este truco.

sábado, 4 de enero de 2014

Arduino Histeresis, retardo o tolerancia de una medida

Normalmente se le llama histeresis a una tolerancia o retardo que tiene un material. Imaginemos que nuestro arduino esta midiendo la temperatura de un liquido que tiene que empezar a fluir a los 30ºC y tiene una tolerancia de 2ºC pues nuestro liquido fluiría entre los 28 y los 32ºC.

De esta forma nosotros podríamos calentar el liquido hasta alcanzar los 33ºC y dejar de calentarlo hasta que la temperatura leída sea menor que 30ºC pero pero superior a 28ºC....

Con esta función calculamos la histeresis de un número:

Código:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2

int tolerancia = 5;

void setup() 
  {
  lcd.init();
  lcd.backlight(); //enciende la iluminacion 
  }

void loop() 
  {
    Histeresis (random(-10, 10), random(-10, 10), tolerancia );
    delay(2000);
  }
// x = Es un valor fijo, por ejemplo el que hemos programado o estipulado.
// y = Puede ser el valor obtenido por una sonda.
// t = La tolerancia o magen que hemos estipulado, la histeresis.

void Histeresis (int x, int y, int t)
  {
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("X: ");
    lcd.print(x);
    lcd.print(" Y: ");
    lcd.print(y);
    lcd.setCursor(0, 0);
    lcd.print("Tol: ");
    lcd.print(t);
    lcd.setCursor(6, 0);

    int superior, inferior = 0;
    superior = x + t; //valor fijo + tolerancia
    inferior = x - t; //valor fijo + tolerancia
    if ((y >= inferior) && (y <= superior))
      {
      lcd.print(" Si");
      }
      else
      {
      lcd.print(" No");
      }
  }



viernes, 3 de enero de 2014

Arduino Obtener el taño de un aray 2D con sizeof();

Hacia tiempo que estaba atascado con un programa, necesitaba recorrer un array multidimensional o array 2D del cual desconocía el tamaño o número de filas.

Código:
int ProgTemporizador [][7] = 
  {
  //Fecha, Mes, Año, Hora, Minutos, Salida, Estado  
  {2014, 1, 2, 10, 12, 0, 1},
  {2014, 1, 2, 10, 13, 0, 0},
  {2014, 1, 2, 10, 13, 1, 1},
  {2014, 1, 2, 10, 14, 1, 0}
  };



Después de preguntar en el foro de arduino, noter me dio la solución. Cuando hacia sizeof(ProgTemporizador); el resultado que obtenía era 56 y yo me pensaba que estaba haciendo algo mal. Pero no es así, ya que sizeof(); no el número de filas de un array, si no que nos devuelve tamaño en bytes del array. Para obtener el número de filas de un array en nuestro caso tenemos que dividir el resultado por 14:

Si hacemos un sizeof(ProgTemporizador); obtenemos  56 (4*7*2), que es el resultado de la mutiplicación del número de filas del array por El número de columnas del array por 2 ya que un INT ocupa 2 bytes.

Código:
int ProgTemporizador [][7] = 
  {
  //Fecha, Mes, Año, Hora, Minutos, Salida, Estado  
  {2014, 1, 2, 10, 12, 0, 1},
  {2014, 1, 2, 10, 13, 0, 0},
  {2014, 1, 2, 10, 13, 1, 1},
  {2014, 1, 2, 10, 14, 1, 0}
  };

void setup()
  {
  Serial.begin(9600); 
  }

void loop()
  {
  int x = sizeof(ProgTemporizador);   
  x = (x / 7) / 2;
  //x = x / 14; Mas facil seria dividirlo por 14...
  Serial.print ("Numero X = ");
  Serial.println (x);
  for (int i=0; i < x; i++)
    {
      for (int n=0; n < 7; n++)
        {
          Serial.print(ProgTemporizador [i][n]);
          Serial.print("   ");
        }
    Serial.println();    
    }
  Serial.println ("-----------------------------------------------------");  
  delay(5000);
  }

Fuente: http://forum.arduino.cc/index.php?topic=208323.0

Arduino Funcion para obtener la fecha en modo texto

Hace un rato me he encontrado con esta funcion que ha publicado jalfonsosuarez en el foro de arduino, y me ha parecido muy interesante, ya que con ella se puede pasar una fecha obtenida del relog en tiempo real (RTC) a modo texto muy facilmente y con poco codigo:

Código:
/*
FUNCION PARA OBTENER LA FECHA EN MODO TEXTO
Devuelve: DD-MM-AAAA HH:MM:SS
*/
String dimeFecha()
  {
  char fecha[20];
  DateTime now = RTC.now(); //Obtener fecha y hora actual.
        
  int dia = now.day();
  int mes = now.month();
  int anio = now.year();
  int hora = now.hour();
  int minuto = now.minute();
  int segundo = now.second();
        
  sprintf( fecha, "%.2d.%.2d.%.4d %.2d:%.2d:%.2d", dia, mes, anio, hora, minuto, segundo);
  return String( fecha );
  }

Fuente:
http://forum.arduino.cc/index.php?topic=207403.0 

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.