martes, 13 de octubre de 2015

Guardar en un string los datos que se han pasado desde el PC o MAC al ARDUINO

A continuación aquí añado un pequeño código para guardar en un string los datos que se han pasado desde el PC o MAC al ARDUINO.

Código:
/*
* SerialReceive sketch
* Guardar en un string el contenido de un dato
* pasado por serial desde el PC o MAC a ARDUINO
*/

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

void loop ()
  { 
  char ch = ' '; //Variable donde se guarda el char que se recibe por serial.
  String mensaje ="" ; //Variable para guardar el texto pasado por serial.

  if (Serial.available()) //Si el serial esta libre...
    {
    while( ch != '\n') //leemos hasta el retorno de carro o enter.
      { 
      ch = Serial.read(); //Lee un caracter.
      Serial.println(ch); //Imprime el caracter "ch" recivido por serial. 
      mensaje = mensaje + ch ; //lo anadimos a la variable mensaje.
      delay(25); //Esperamos 25ms para evitar colixiones de datos.
      }
    Serial.println( mensaje); //Imprimimos el mensaje
    mensaje = "" ; //Borramos el string
     }
  }


Luego los datos de la variable mensaje los podremos utilizar como mejor nos convenga.

martes, 21 de abril de 2015

Instalar librerias de SketchUp enn un mac

Installing Ruby Plugins

SketchUp and .rbz files
The SketchUp 8 and 2013 allows you to install zipped Ruby files (.rbz) from within the product. If your plugin has a standard (.zip) extension, then you can just change the extension name from .zip to .rbz.
To install a SketchUp  Ruby plugin script with the .rbz format:
  1. We recommend logging into your computer as an admin before installing any Ruby scripts. This will make the installation go more smoothly and ensure that files get installed in the proper places.
  2. Select Window > Preferences (Microsoft Windows) or SketchUp > Preferences (Mac OS X). The Preferences dialog box is displayed.
  3. Click on Extensions. The Extensions panel is displayed.
  4. Click on the Install Extension button. The Open dialog box is displayed.
  5. Locate the Ruby zip file to install (.rbz).
  6. Click on the Open button. The Ruby plugin appears in the list of extensions.
Older versions of SketchUp and .rb files
If you're using an older version of SketchUp or you have a file with the .rb extension, you can install the plugin by placing the Ruby script file into the appropriate folder, and then restarting SketchUp.
Windows - the default location is:
  • SketchUp and SketchUp Pro: C:\Program Files\Google\Google SketchUp #\Plugins.
Mac OS X - the default location is:
Version 2013: Open a new Finder window, press and hold the Option key on your keyboard, the click Go in the menu bar > Library > Application Support > SketchUp 2013 > SketchUp > Plugins
Version 8 and older: [YOUR USER NAME]/Library/Application Support/Google SketchUp #/SketchUp/plugins
Tip: you may need to create your plugins folder in the SketchUp folder. To do so click File > New folder in your Finder window. If you prefer, you can also save your plugins to the same location under your Macintosh HD (Macintosh HD/Library/Application Support/Google SketchUp #/SketchUp/plugins). However, plugins in this location may be removed in an uninstall.
Once you have restarted SketchUp, you should see that the script's commands have been added to the appropriate menus. You can also run the script using the Ruby Console (open the "Windows" menu, and then click Ruby Console).

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