Quantcast
Channel: Luis Llamas
Viewing all 1123 articles
Browse latest View live

STM32F103, el competidor ARM de Arduino de bajo coste

$
0
0

arduino-STM32F103

arduino-STM32F103

En esta entrada vamos a analizar el STM32F103, un nuevo y muy duro competidor de Arduino. El STM32F103 combina la potencia de un procesador ARM, con un ultra bajo coste de 3,30€. Además, puede ser programado con el propio entorno Arduino IDE. En definitiva, un duro competidor de Arduino, que aparece en escena dispuesto a reclamar su cuota de mercado.

¿Que es el STM32F103?

El STM32F103 es una placa de desarrollo, similar a Arduino. Sin embargo, mientras la mayoría de Arduinos montan un procesador AVR, el STM32F103 dispone de un procesador ARM, lo que se traduce en unas especificaciones ampliamente superiores.

El STM32F103 no es la única placa basada en un procesador ARM. De hecho, la propia familia de Arduino tiene un modelo con procesador ARM, el Arduino DUE. También existen otras placas de desarrollo, fuera de la familia Arduino, con procesador ARM.

Lo que hace novedoso y especial al STM32F103 es que es la primera placa ARM realmente barata. Es ahí, precisamente donde más duele, donde toca a Arduino, siendo capaz de competir en precio incluso en los modelos más baratos.

El coste actual de una placa STM32F103 es de 3,30€. Esto la sitúa ligeramente por encima de un Arduino Nano V3, pero es incluso más barata que un Arduino UNO R3, mucho más que un Arduino Mega, y muy alejada de los 20€ (como poco) que puede costar un Arduino DUE clónico.

Por este precio, increíblemente bajo, obtenemos las siguientes características

  • ARM 32-bit Cortex™-M3 CPU Core
  • Frecuencia de 72 MHz (1.25 DMIPS/MHz)
  • 64 Kbytes de memoria Flash
  • 20 Kbytes de SRAM
  • 4-16 MHz cristal
  • RTC (reloj de tiempo real) integrado
  • Modo Sleep, Stop y Standby
  • 26 entradas y salidas digitales, la mayoría tolerantes a 5V
  • Interrupciones en todas las I/O
  • 2 conversores A/D de 12-bit de 1 μs, (10 entradas analógicas)
  • 7 temporizadores
  • 2 interface I2C
  • 3 interface USARTs
  • 2 interface SPIs a 18 Mbit/s
  • Interface CAN
  • Micro USB para alimentación de la placa y comunicaciones

Es decir, el STM32F103 no solo deja a Arduino al nivel de un juguete maltrecho, si no que deja en ridículo a prácticamente cualquier autómata industrial que podáis encontrar, con precios de varios miles de euros.

El procesador del STM32F103 opera a 3.3V, al igual que el resto de procesadores ARM. Sin embargo, la placa STM32F103 incorpora un regulador de voltaje, por lo que puede ser alimentada a 5V. Además, la mayoría de las I/O digitales son tolerantes a 5V, algo que casi ninguna placa ARM proporciona y que resulta muy útil, al evitar tener que incorporar convertidores de nivel.

El tamaño del STM32F103 es de 5.3cm x 2.2cm, y dispone de hileras de 20 pines a cada lado (que deberemos soldar, igual que en Arduino Mini y Nano). Este tamaño hace que no quepa en una protoboard de 170 contactos, por lo que deberemos usar una de 270 contactos o superior.

Como puntos negativos, el STM32F103 es objetivamente más complicado de programar que Arduino. Esto se debe en buena medida a la escasez de información disponible, y la ausencia de una comunidad de usuarios que tiene Arduino detrás. Sin embargo, el procesador STM32, el corazón del STM32F103, se está implantando con rapidez en una gran cantidad de desarrollos y placas, por lo que esperemos que la comunidad aumente próximamente.

En definitiva, el STM32F103 es una placa de desarrollo imbatible en características / precio que, por sus muy superiores capacidades y su bajo precio, resulta en una auténtica pesadilla como competidor para Arduino.

Pero, e incluso más importante, al ser la primera placa ARM de ultra bajo coste supone un hito en el campo de la automatización. Si Arduino ha supuesto una revolución (¿alguién recuerda los PIC, o los PLC?…), el STM32F103 supone el comienzo de una nueva época basada en nuevos de procesadores, como el STM32, que auguran un futuro apasionante donde los actuales procesadores AVR quedan retratados como dinosaurios del pasado,

En siguientes entradas entraremos en detalles de la placa STM32F103, su patillaje y esquemas, y aprenderemos a programar esta magnifica placa con el propio entorno de Arduino IDE.

Mientras tanto, si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino


Diferencias entre tipos de calderas domésticas

$
0
0

tipos-de-calderas

tipos-de-calderas

Las calderas son un elemento fundamental en la climatización de la mayoría de edificios y, por tanto, son uno de los principales elementos que intervienen en la eficiencia energética. Precisamente debido a esta importancia, una gran parte de las medidas de ahorro energético que surgen en una auditoria energética recaen en la mejora y comprobación de estos generadores de calor.

Las calderas transforman la energía almacenada en el combustible en calor disponible para su uso en edificio. Obviamente, el rendimiento de la caldera afecta sobremanera en la eficiencia de las instalaciones. Una caldera ineficiente repercutirá directamente en un mayor consumo de combustible y, por tanto, en un mayor gasto económico.

Existe una gran diversidad de calderas. Cada tipo de caldera tiene sus propias características, que le confieren un rendimiento y unas condiciones de uso apropiadas. Deberá ser la labor de un técnico especializado decidir el tipo de caldera más adecuado para cada instalación en particular, atendiendo a criterios de idoneidad tanto energética como económica.

Tipos de calderas en función del tipo de tiro:

  • Tiro natural

    Emplean la diferencia de densidad de los gases de escape, de mayor temperatura, para la evacuación. Requiere una elevada temperatura de gases de escape, lo que significa menores rendimiento. Están en desuso y suelen aplicarse exclusivamente a calderas atmosféricas de bajo rendimiento.

  • Tiro forzado

    Emplean un ventilador para forzar la extracción de gases. El ventilador de extracción supone un pequeño consumo adicional, que queda sobradamente compensando por el incremento de rendimiento que puede realizarse al disminuir la temperatura de los gases de escape.

Tipos de calderas en función del tipo de hogar:

  • Calderas atmosféricas (rendimiento 70-80% PCI)

    Realizan la combustión en una cámara no aislada, y toman el aire de la habitación o recinto donde están instaladas. La evacuación de gases se realiza mediante un tubo de evacuación de gases con cortatiro. Sus rendimientos son bajos debido, principalmente, a que no permiten regular la cantidad de oxigeno en la combustión. Además suponen un riesgo para los usuarios ya que, en caso de fallo, pueden verter los gases tóxicos de la combustión en la habitación. Está prohibida la adquisición de calderas atmosféricas desde el 1 de enero de 2010.

    caldera-1

  • Calderas estancas (rendimiento 80-90% PCI)

    Realizan la combustión en una camara sellada, totalmente independiente de la habitación en la que se encuentran instaladas. Toman el aire del exterior del recinto, mediante un doble tubo concéntrico que permite la entrada y salida de gases. Siempre son de tiro forzado, dado que el tiro de los gases no tiene suficiente fuerza para realizar la aspiración y expulsión de los gases. Disponen de rendimientos superiores y aportan una mayor seguridad para el usuario.

    caldera-2

Otras clasificaciones de calderas

Los siguientes términos y tipos de calderas son habituales dentro de las instalaciones de climatización y de las mejoras de eficiencia energética.

Calderas de bajo NOx

Son calderas que disponen de sistemas para reducir la cantidad de gases de caldera. No es un tipo de caldera en sí, es una característica. No obstante, se suele denominar así a una caldera similar a una estanca convencional, con sistemas para reducir sus emisiones. Su eficiencia es levemente superior a una caldera convencional.

Calderas de baja temperatura

Están diseñadas para trabajar con temperaturas de retorno de agua muy baja (40ºC, frente a 70ºC de una convencional). Esto se traduce en un rendimiento superior, en torno al 95-98% del PCI. Los materiales de estas calderas están diseñados para suportar la condensación y formación de ácidos que estas bajas temperaturas de retorno provocan, y que dañarían en poco tiempo a una caldera convencional.

Calderas de condensación

Es un tipo especial de caldera, especialmente diseñada para evitar las pérdidas por vapor de agua en los humos emitidos. Para ello, operan a muy bajas temperaturas de emisión (40 ºC) y retorno (30 ºC), para evitar la formación de vapor de agua. Obtienen los rendimiento más elevados, hasta un 108-110% del PCI. Sin embargo, requieren sistemas especiales de calefacción, como suelos radiantes o radiadores de muy alta superficie, para poder trabajar con temperaturas tan bajas. De lo contrario no se aprovecha el calor de condensación, y la caldera opera de forma similar a una caldera de baja temperatura.

Detectar campos magnéticos con Arduino y sensor Hall A3144

$
0
0

arduino-hall

arduino-hall

¿Que es un sensor Hall?

Un sensor Hall es un dispositivo que nos permite realizar mediciones de campo magnético.

Los sensores Hall son ampliamente utilizados. Por ejemplo, en la industria del automóvil se usan para funciones tan dispares como para el accionamiento de los cinturones de seguridad, o la medición de la posición del árbol de levas. También se usan para medir velocidades de fluidos, detección de metales, factores de inducción, entre otras muchas aplicaciones.

Una ventaja importante de los sensores Hall es que realizan la medición a distancia, sin necesidad de contacto físico. Aunque su alcance es limitado (típicamente pocos centímetros) esto supone que apenas presentan desgaste mecánico. Además son inmunes a ruidos y polvo. Esto los convierte en sensores fiables y duraderos.

En general, encontramos dos tipos de sensores Hall:

  • Analógicos. Generan una salida proporcional a la intensidad del campo magnético. Empleados para medir la intensidad de un campo magnético
  • Digitales. Proporcionan un valor Alto en presencia de campo magnético, y bajo en ausencia del mismo. Por tanto, son empleados para detectar la existencia de campos magnéticos. A su vez se dividen en,
    • Switch, se activan al acercar el polo, y se desactivan al retirar el polo
    • Latch, se activan al acercar un polo, y mantienen su valor hasta que se acerca un polo contrario

En esta entrada emplearemos un sensor Hall A3144, de tipo digital Switch. Podemos emplear este sensor para detectar la presencia de un objeto, al que previamente habremos colocado un pequeño imán, o para fabricar tacómetros (contadores de revoluciones) simplemente acoplando un pequeño imán de neodimio al eje.

Precio

Los sensores Hall A3144 son realmente baratos. Podemos encontrar 10 dispositivos A3144 por 1€ en vendedores internacionales en Ebay o Aliexpress.

hall-a3144

Teoría y ecuaciones

Su principio de funcionamiento es el efecto Hall, denominado así por su descubridor Edwin Herbery Hall, en 1849.

Al hacer circular una corriente eléctrica a lo largo de un semiconductor en presencia de un campo magnético, los son desviados por efecto del campo magnético, dando lugar a una tensión perpendicular a la corriente y al campo magnético.

efecto-hall

Midiendo esta tensión originada por el efecto Hall podemos conseguir construir sensores y medidores de campos magnéticos.

Esquema eléctrico

El esquema eléctrico que necesitamos es el siguiente.

arduino-hall-esquema

Por lo que el esquema de conexión con Arduino quedaría así.

arduino-hall-esquema-electrico

El esquema y valores de resistencias mostrador corresponden con el sensor A3144. Otros sensores hall requieren otros esquemas de montaje. Consultar su datasheet correspondiente si vuestro componente es distinto.

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-hall-montaje

Ejemplo de código

El código necesario para realizar la lectura es simple. Simplemente leemos el estado el estado del Pin del sensor Hall, tal y como vimos en la entrada entradas digitales en Arduino.

int HALLPin = 5;
int LEDPin = 13;

void setup() {
  pinMode(LEDPin, OUTPUT);
  pinMode(HALLPin, INPUT);
}

void loop() {
  if(digitalRead(HALLPin)==HIGH)
  {
    digitalWrite(LEDPin, HIGH);   
  }
  else
  {
    digitalWrite(LEDPin, LOW);
  }
}

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Medir distancia con Arduino y sensor de ultrasonidos HC-SR04

$
0
0

arduino-ultrasonidos

arduino-ultrasonidos

¿Que es un sensor de ultrasonidos?

Un sensor de ultra sonidos es un dispositivo para medir distancias. Su funcionamiento se base en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor, que dispone de un micrófono adecuado para esa frecuencia.

Midiendo el tiempo entre pulsos, conociendo la velocidad del sonido, podemos estimar la distancia del objeto contra cuya superficie impacto el impulso de ultrasonidos

Los sensores de ultrasonidos son sensores baratos, y sencillos de usar. El rango de medición teórico del sensor HC-SR04 es de 2cm a 400 cm, con una resolución de 0.3cm. En la práctica, sin embargo, el rango de medición real es mucho más limitado, en torno a 20cm a 2 metros.

Los sensores de ultrasonidos son sensores de baja precisión. La orientación de la superficie a medir puede provocar que la onda se refleje, falseando la medición. Además, no resultan adecuados en entornos con gran número de objetos, dado que el sonido rebota en las superficies generando ecos y falsas mediciones. Tampoco son apropiados para el funcionamiento en el exterior y al aire libre.

Pese a esta baja precisión, que impide conocer con precisión la distancia a un objeto, los sensores de ultrasonidos son ampliamente empleados. En robótica es habitual montar uno o varios de estos sensiores, por ejemplo, para detección de obstáculos, determinar la posición del robot, crear mapas de entorno, o resolver laberintos. En aplicaciones en que se requiera una precisión superior en la medición de la distancia, suelen acompañarse de medidores de distancia por infrarrojos.

Precio

El sensor de ultrasonidos HC-SR04 es un sensor barato. Podemos encontrar unidades por 0,65€ en AliExpress.

HC-SR04

Teoría y ecuaciones

El sensor se basa simplemente en medir el tiempo entre el envío y la recepción de un pulso sonoro. Sabemos que la velocidad del sonido es 343 m/s en condiciones de temperatura 20 ºC, 50% de humedad, presión atmosférica a nivel del mar. Transformando unidades resulta

343 \frac{m}{s} \cdot{} 100 \frac{cm}{m} \cdot{} \frac{1}{1000000} \frac{s}{\mu s} = \frac{1}{29.2} \frac{cm}{\mu s}

Es decir, el sonido tarda 29,2 microsegundos en recorrer un centímetro. Por tanto, podemos obtener la distancia a partir del tiempo entre la emisión y recepción del pulso mediante la siguiente ecuación.

Distancia(cm)= \frac {Tiempo(\mu s)}{29.2 \cdot 2}

El motivo de divir por dos el tiempo (además de la velociad del sonido en las unidades apropiadas, que hemos calculado antes) es porque hemos medido el tiempo que tarda el pulso en ir y volver, por lo que la distancia recorrida por el pulso es el doble de la que queremos medir.

sensor-ultrasonico-explicacion

Esquema eléctrico

El esquema eléctrico que necesitamos es el siguiente.

arduino-ultrasonidos-esquema-electrico

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-ultrasonidos-montaje

Ejemplo de código

Para activar el sensor necesitamos generar un pulso eléctrico en el pin Trigger (disparador) de al menos 2ms. Nosotros generaremos un pulso de 5ms. Previamente, pondremos el pin a Low durante 2ms para asegurar un disparo limpio.

Posteriormente usamos la función “pulseIn” para obtener el tiempo requerido por el pulso para volver al sensor. Finalmente, convertirmos el tiempo en distancia mediante la ecuación correspondiente.

const int TriggerPin = 5;
const int EchoPin = 6;
const int LedPin = 13;

void setup() {
	Serial.begin(9600);
	pinMode(LedPin, OUTPUT);
	pinMode(TriggerPin, OUTPUT);
	pinMode(EchoPin, INPUT);
}

void loop() {
	int cm = ping(TriggerPin, EchoPin);
	Serial.print("Distancia: ");
	Serial.println(cm);
	delay(1000);
}

int ping(int TriggerPin, int EchoPin) {
	long duration, distanceCm;
	
	digitalWrite(TriggerPin, LOW);  //para generar un pulso limpio
	delayMicroseconds(2);
	digitalWrite(TriggerPin, HIGH);  //generamos Trigger (disparo) de 5ms
	delayMicroseconds(5);
	digitalWrite(TriggerPin, LOW);
	
	duration = pulseIn(EchoPin, HIGH);  //medimos el tiempo entre pulsos, en microseg
	
	distanceCm = duration * 10 / 292/ 2;   //convertimos a distancia, en cm
	return distanceCm;
}

Observar que intentamos emplear siempre aritmética de enteros, evitando usar números en coma flotante. Esto es debido a que las operaciones en coma flotante ralentizan mucho el procesador, y suponen cargar un gran número de librerías en memoria.

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Las 3 claves de la mejora de procesos

$
0
0

3-reglas-mejora-procesos

3-reglas-mejora-procesos

Con las señales de mejora y progresiva recuperación de la economía global comienzan a aparecer, paulatinamente, nuevas ofertas de incorporación en el mercado laboral. Actualmente, dentro del ámbito de la ingeniería, uno de los puestos más demandados es el de experto en mejora de procesos.

Merecería mención aparte lo curioso que resulta que se suscite interés en la mejora de la productividad al final de un proceso de recesión. Lo correcto hubiera sido realizar estas mejoras antes o incluso durante la misma. Deberíamos plantearnos que seguimos teniendo un terrible malentendido, respecto a la mejora de procesos. Precisamente, cuanto peor es la situación, mayor es la inversión que deberíamos hacer en mejorar nuestra eficiencia para disminuir los costes.

En cualquier caso, lo cierto es que puede resultar una tarea desbordante, especialmente para ingenieros noveles, abordar un proceso de mejora de procesos integral en una pequeña o mediana empresa que, por las circunstancias económicas, halla parado o reducido durante tiempo su inversión en mejora de procesos.

Comparto con vosotros lo que, para mi, son las 3 claves que te garantizan en el éxito en la mejora de los procesos.

  • Elimina los procesos innecesarios. Bastante autodescriptivo. Si un proceso puede ser clasificado como innecesario, no debería existir. Si no hay motivo de que exista, es un gasto superfluo y debe ser eliminado. Un ejemplo claro son gran parte de las esperas y desplazamientos, que pueden ser eliminados con una redistribución del espacio productivo.
  • Reduce los procesos que no portan valor. Entendiendo valor del producto aquello por lo que estaría dispuesto a pagar nuestro cliente, es obvio que algunos de nuestros procesos no aportan valor, pero por otro necesitamos hacerlos. Por ejemplo, la limpieza de las oficinas, o la gestión de tu MPR no aportan valor para el cliente, pero son fundamentales para el correcto funcionamiento de la empresa. En estos casos, hay que localizar y reducir al máximo estos procesos.
  • Automatiza los procesos repetitivos. La automatización es la mejor amiga de la mejora de procesos. Pero no solo en procesos productivos directos. La automatización también debe ser integrada en oficinas y, en general, en todo el workflow de la empresa, ayudando a reducir la burocracia innecesaria y los gastos indirectos. En última instancia, cualquier proceso que no requiera de habilidades creativas o toma de decisiones sujeta a factores no previsibles, debería ser realizado de forma automática.

Estos puntos son el resultado directo de la aplicación de las prácticas del Lean Manufacturing, convenientemente reducido y sintetizado. Son 3 reglas simples, fáciles, claras, y sencillas de entender y recordar, que deberían acompañarte y convertirse en tus mejores amigos durante todo proceso de mejora.

Por supuesto, que sea fácil de entender no significa que sea fácil de llevar a la práctica. Distribuir el espacio en una fábrica para mejorar la versatilidad, reducir las esperas y los transportes suele ser algo asumible. Abordar una reforma integral del workflow de una empresa para reducir las tareas que no aportan valor, eliminar la burocracia, y automatizar procesos… puede ser una tarea titánica.

No obstante, mantener estas 3 reglas en la cabeza y aplicarlas debidamente en el momento correcto nos permitirán estar un poco más cerca del éxito.

mejora de procesos

Medir vibración con Arduino y sensor SW-18020P

$
0
0

arduino-sw18020p

arduino-sw18020p

¿Que es un sensor de vibración?

Un sensor de vibración es un dispositivo que reacciona ante movimientos bruscos, golpes, o vibraciones, pero no a movimientos constantes o progresivos. En el caso de detectar una vibración genera una señal digital, que cesa al finalizar la vibración.

El principio de funcionamiento es muy sencillo. El dispositivo dispone de un cilindro, con dos contactos. Uno de los contactos está unido a una varilla metálica ubicada en el centro del cilindro. A su alrededor, el otro contacto se arrolla a su alrededor en forma de muelle.

En caso de una vibración, el muelle se deforma por efecto de la inercia, estableciendo contacto en varios puntos con el contacto fijo. De esta forma, se establece una conexión eléctrica entra ambos contactos, que puede ser leida con un microprocesador, como si fuera un pulsador, como vimos en entradas digitales en Arduino.

arduino-vibracion-sw18020p-funcionamiento

Precio

Los sensores de vibración SW-18020P son dispositivos baratos. Podemos encontrar 10 sensores de vibración por 1€ en vendedores internacionales en Ebay o AliExpress.

sw18020p

Esquema eléctrico

El esquema eléctrico que necesitamos es el siguiente.

arduino-vibracion-sw18020p-esquema

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-vibracion-sw18020p-montaje

Ejemplo de código

A continuación tenemos un ejemplo de código para realizar la lectura del sensor. Leemos el estado del sensor mediante la entrada digital, usando la resistencia internar de Pull Up. Por otro lado, empleamos el valor shakeTime y la variable estado previo para controlar el cambio de estado, y así detectar la vibración.

const int sensorPin = 2;
const int ledPin = 13;

int tiltSensorPreviousValue = 0;
int tiltSensorCurrentValue = 0;
long lastTimeMoved = 0;
int shakeTime = 50;

void setup() {
    pinMode(sensorPin, INPUT);
    digitalWrite(sensorPin, HIGH);  //activamos la resistencia interna PULL UP
    pinMode(ledPin, OUTPUT);
}

void loop() {
    tiltSensorCurrentValue = digitalRead(sensorPin);
    if (tiltSensorPreviousValue != tiltSensorCurrentValue) {
        lastTimeMoved = millis();
        tiltSensorPreviousValue = tiltSensorCurrentValue;
    }
    if (millis() - lastTimeMoved < shakeTime) {
        digitalWrite(ledPin, HIGH);
    }
    else {
        digitalWrite(ledPin, LOW);
    }
}

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Medir temperatura con Arduino y sensor LM35

$
0
0

arduino-LM35

arduino-LM35

¿Que es un sensor LM35?

El LM35 es un sensor de temperatura digital. A diferencia de otros dispositivos como los termistores en los que la medición de temperatura se obtiene de la medición de su resistencia eléctrica, el LM35 es un integrado con su propio circuito de control, que proporciona una salida de voltaje proporcional a la temperatura.

La salida del LM35 es lineal con la temperatura, incrementando el valor a razón de 10mV por cada grado centígrado. El rango de medición es de -55ºC (-550mV) a 150ºC (1500 mV). Su precisión a temperatura ambiente es de 0,5ºC.

Los sensores LM35 son relativamente habituales en el mundo de los aficionados a la electrónica por su bajo precio, y su sencillez de uso.

Precio

Los sensores LM35 son baratos. Podemos encontrar un sensor LM35 por 0,60€ en vendedores internacionales en Ebay o AliExpress.

lm35

Esquema eléctrico

El patillaje del LM35 se muestra en la siguiente imagen. Los pines extremos son para alimentación, mientras que el pin central proporciona la medición en una referencia de tensión, a razón de 10mV/ºC.

arduino-LM35-sensor

Por tanto, el esquema eléctrico que necesitamos es el siguiente.

arduino-LM35-esquema--electrico

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-LM35-montaje-electrico

Ejemplo de código

El código necesario para realizar la lectura es simple. Simplemente leemos el valor del tensión mediante la entrada analógica, y traducimos el valor a grados celsius usando la relación 10 mV/C.

const int sensorPin= 0;

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

void loop()
{
  int value = analogRead(sensorPin);
  float millivolts = (value / 1024.0) * 5000;
  float celsius = millivolts / 10; 
  Serial.print(celsius);
  Serial.println(" C");
  delay(1000);
}

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Detector de movimiento con Arduino y sensor PIR

$
0
0

arduino-pir

arduino-pir

¿Que es un sensor PIR?

Los sensores infrarrojos pasivos (PIR) son dispositivos para la detección de movimiento. Son baratos, pequeños, de baja potencia, y fáciles de usar. Por esta razón son frecuentemente usados en juguetes, aplicaciones domóticas o sistemas de seguridad.

Los sensores PIR se basan en la medición de la radiación infrarroja. Todos los cuerpos (vivos o no) emiten una cierta cantidad de energía infrarroja, mayor cuanto es su temperatura. Los dispositivos PIR disponen de un sensor piezo eléctrico que capta esta radiación y convertirla en una señal eléctrica.

En realidad cada sensor dividido en dos campos y se dispone de un circuito eléctrico que compensa ambas mediciones. Si ambos campos reciben la misma cantidad de infrarrojos la señal eléctrica resultante es nula. Por el contrario, si los dos campos realizan una medición diferente, se genera una señal eléctrica.

De esta forma, si un objeto atraviesa uno de los campos se genera una señal eléctrica diferencial, que es captada por el sensor, y se emite una señal digital.

sensor-pir

El otro elemento restante para que todo funcione es la óptica del sensor. Básicamente es una cúpula de plástico formada por lentes de fresnel, que divide el espacio en zonas, y enfoca la radiación infrarroja a cada uno de los campos del PIR.

De esta manera, cada uno de los sensores capta un promedio de la radiación infrarroja del entorno. Cuando un objeto entra en el rango del sensor, alguna de las zonas marcadas por la óptica recibirá una cantidad distinta de radiación, que será captado por uno de los campos del sensor PIR, disparando la alarma.

sensor-pir-optica

Precio

Los sensores PIR son dispositivos baratos. Podemos encontrar sensores PIR por 0,80€ en vendedores internacionales en Ebay o AliExpress.

pir-sensor

Esquema eléctrico

Este es el esquema de patillaje de un sensor PIR.

arduino-pir-sensor

El esquema eléctrico que necesitamos es el siguiente.

arduino-pir-esquema-electrico

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-pir-montaje

Ejemplo de código

El código necesario para realizar la lectura es simple. Simplemente leemos la salida del PIR, y hacemos parpadear el LED mientras la señal esté activa.

const int LEDPin= 13;
const int PIRPin= 2;

void setup()
{
  pinMode(LEDPin, OUTPUT);
  pinMode(PIRPin, INPUT);
}

void loop()
{
  int value= digitalRead(PIRPin);
 
  if (value == HIGH)
  {
    digitalWrite(LEDPin, HIGH);
    delay(50);
    digitalWrite(LEDPin, LOW);
    delay(50);
  }
  else
  {
    digitalWrite(LEDPin, LOW);
  }
}

Si quisiéramos ejecutar una acción una única vez al detectar movimiento, en lugar de todo el tiempo que la señal este activa, usaríamos el siguiente código.

const int LEDPin = 13;        // pin para el LED
const int PIRPin = 2;         // pin de entrada (for PIR sensor)

int pirState = LOW;           // de inicio no hay movimiento
int val = 0;                  // estado del pin

void setup() 
{
	pinMode(LEDPin, OUTPUT); 
	pinMode(PIRPin, INPUT);
	Serial.begin(9600);
}

void loop()
{
	val = digitalRead(PIRPin);
	if (val == HIGH)   //si está activado
	{ 
		digitalWrite(LEDPin, HIGH);  //LED ON
		if (pirState == LOW)  //si previamente estaba apagado
		{
		  Serial.println("Sensor activado");
		  pirState = HIGH;
		}
	} 
	else   //si esta desactivado
	{
		digitalWrite(LEDPin, LOW); // LED OFF
		if (pirState == HIGH)  //si previamente estaba encendido
		{
		  Serial.println("Sensor parado");
		  pirState = LOW;
		}
	}
}

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino


Medir inclinación con Arduino y sensor tilt SW-520d

$
0
0

arduino-sw520d

arduino-sw520d

¿Que es un sensor tilt?

Un sensor de inclinación es un dispositivo que proporciona una señal digital en caso de que su inclinación supere un umbral. Este tipo de sensor no permite saber el grado de inclinación del dispositivo, simplemente actúa como un sensor que se cierra a partir de una cierta inclinación.

Antiguamente estos sensores se constituían ubicando una gota de mercurio en el interior de una ampolla de vídrio, en cuyo interior se alojaban dos conductores. A partir de cierta inclinación la gota de mercurio se desplazaba, cerrando el contacto entre ambos conductores.

En la actualidad, por motivos medioambientales, casi todos los sensores de mercurio han sido desplazados por sensores Tilt de doble esfera. Se dispone de un cilindro cuya pared constituye un contacto eléctrico, mientras que el otro contacto esta localizado en el centro de la base. Al inclinar lo suficiente el dispositivo ambas esferas constituyen un puente entre ambos contactos, cerrando el circuito.

sw520d

Debido a su principio de funcionamiento, estos sensores resultan sensibles a movimientos bruscos y vibraciones.

Precio

Los sensores de orientación SW-520D son dispositivos baratos. Podemos encontrar 10 sensores de vibración por 1€ en vendedores internacionales en Ebay o AliExpress.

sw18020p

Esquema eléctrico

El esquema eléctrico que necesitamos es el siguiente.

arduino-tilt-esquema

Montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-tilt-montaj

Ejemplo de código

El código necesario para realizar la lectura es simple. Simplemente leemos el estado del sensor mediante la entrada digital, usando la resistencia interna de Pull Up.

const int SensorPin = 12;
const int LEDPin = 13;

void setup() {
    pinMode(SensorPin , INPUT);
    digitalWrite(SensorPin , HIGH);	  //activamos la resistencia interna PULL UP
    pinMode(LEDPin, OUTPUT);
}

void loop() {
    if (digitalRead(SensorPin))	{
        digitalWrite(LEDPin, HIGH);
    }  else	{
        digitalWrite(LEDPin, LOW);
    }
}

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Usar el emulador de Android de Visual Studio en Android Studio

$
0
0

android-studio-windows-emulator

android-studio-windows-emulator

Si desarrolláis aplicaciones para Android habréis sufrido que la parte más complicada no es el desarrollo, si no el propio entorno de desarrollo (IDE). La instalación es lenta y complicada, el emulador simplemente lamentable, y cuesta mucho más configurar el entorno a tu gusto, que desarrollar la aplicación en sí.

La situación mejoró levemente con la publicación de Android Studio, que sustituyó a Eclipse como IDE standard para programar en Android. Sin embargo, el emulador de Android SDK sigue siendo insufriblemente lento.

Curiosamente, con la publicación de Visual Studio 2015 (gratuito en su versión Community Edition), Microsoft ha incluido un emulador de Android. Este emulador Android de Microsoft es, irónicamente, mucho más rápido y potente que el propio de Google.

En esta entrada vamos a configurar Android Studio para emplear el emulador de Visual Studio 2015.

Instalando

Comenzaremos instalando el software necesario, en caso de que no lo tengamos instalado ya. Así:

  • Descargamos e instalamos Android Studio desde este enlace.
  • Descargamos e instalamos Visual Studio 2015 Community Edition desde este enlace. Aseguraros de marcar la opción de instalar el emulador de Android.

Alternativamente podemos instalar únicamente el emulador de Android de Visual Studio desde esta dirección.

Nos tomamos un buen café mientras se descarga e instala todo lo necesario.

Preparando Visual Studio Emulator

Ejecutamos Visual Studio Emulator, y lanzamos una instancia de un dispositivo para asegurarnos de que todo está configurado y funciona correctamente.

Android_Emulator_1

A continuación necesitamos el ID de una de las máquinas. Para ello abrimos una consola de comandos y escribimos

"c:\Program Files (x86)\Microsoft Emulator Manager\1.0\emulatorcmd.exe" /sku:Android list /type:device"

Android_Emulator_2

Copiamos el identificador de la máquina que queremos emplear como emulador.

Configurar Android Studio

A continuación abrimos Android Studio y aplicamos las siguientes opciones,

  • Entramos en el menu “Run” seleccionamos “Edit/Configurations”.
  • Android_Emulator_3

  • En “Default/Android Application”, ponemos como Target Device “Show choose dialog” y marcamos “Use the same device for future launches”.
  • Android_Emulator_4

Esto hará que Android studio nos pregunte por un dispositivo ADB conectado cuando hagamos el Debug de la aplicación, y recordará este device para las siguientes sesiones.

Ahora vamos a crear un botón que nos permita lanzar directamente el emulador de Visual Studio 2015. Para ello,

  • Entramos en “File/Settings”.
  • Android_Emulator_5

  • En “Tools”, seleccionamos “External Tools”, pulsamos en el botón de añadir nueva.
  • Android_Emulator_6

  • Ponemos el nombre y descripción que queramos, y rellenamos los siguientes valores.

Program:
C:\Program Files (x86)\Microsoft Emulator Manager\1.0\emulatorcmd.exe

Parameters:
/sku:Android launch /id:00000000-0000-0000-0000-000000000000

Android_Emulator_7

Donde tenéis que cambiar 00000000-0000-0000-0000-000000000000 por el ID de vuestra máquina, que hemos obtenido previamente.

  • Pulsamos sobre el botón derecho encima de cualquier barra de herramientas.
  • Android_Emulator_8

  • Seleccionamos “Customize menus and toolbars”.
  • Android_Emulator_9

  • Dentro del grupo “Main toolbar” seleccionamos el icono tras el que podemos poner nuestro nuevo botón, y seleccionamos “Add after” (en el caso del ejemplo, yo lo he puesto detrás del botón Forward”.
  • Android_Emulator_10

  • Como acción a realizar por el botón, seleccionamos la herramienta externa que hemos creado previamente.

Android_Emulator_11

Android_Emulator_12

Ya tenemos correctamente configurado Android Studio para lanzar el emulador de Visual Studio. Probamos a ejecutar una aplicación para verificar que hemos hecho todo el proceso correctamente.

Android_Emulator_13

Ahora podemos desarrollar software con un emulador de Android eficiente y lanzado directamente desde nuestro botón en Android Studio.

Salidas analógicas PWM en Arduino

$
0
0

arduino-salida-analogica

arduino-salida-analogica

En tutoriales anteriores hemos visto cómo usar las entradas digitales y las entradas analógicas para recibir señales del mundo. También hemos visto como interactuar con el entorno mediante las salidas digitales.

Sin embargo, en ocasiones no será suficiente con una señal digital (ON/OFF), si no que necesitaremos proporcionar un valor analógico de tensión, por ejemplo, para regular la intensidad de iluminación de un LED, o variar la velocidad de un motor DC.

En esta entrada vamos a ver cómo utilizar una salida PWM para emular una señal analógica de tensión desde Arduino.

¿Cómo funciona una salida analógica?

Las salidas analógicas son algo más complicadas que las digitales (como ya pasaba con las entradas analógicas y digitales).

Lo primero que tenemos que entender es que la mayoría de automatismos (y Arduino no es una excepción) no son capaces de proporcionar una auténtica salida analógica. Ni siquiera pueden suministrar una salida analógica discretizada (es decir, a saltos) de tensión. Lo único que pueden proporcionar es una salida digital de -Vcc o Vcc. (por ejemplo, 0V y 5V)

Para salvar esta limitación y simular una salida analógica la mayoría de los automatismos emplean un “truco”, que consiste en activar una salida digital durante un tiempo y mantenerla apagada durante el resto. El promedio de la tensión de salida, a lo largo del tiempo, será igual al valor analógico deseado.

Existe más de una forma de hacer esta aproximación. Una de las más sencillas, y por ello muy empleada en automatización, es la modulación de ancho de pulso (PWM). En esta modulación se mantiene constante la frecuencia (es decir, el tiempo entre disparo de pulsos), mientras que se hace variar la anchura del pulso.

PWM

La proporción de tiempo que está encendida la señal, respecto al total del ciclo, se denomina “Duty cycle”, y generalmente se expresa en tanto por ciento.

Es inmediato deducir que la señal promedio es el producto de la tensión máxima y el DutyCycle, según la siguiente expresión.

V_{medio}= \left ( V_{cc+} - V_{cc-} \right )\cdot \frac{DutyCycle}{100}

De forma similar, tenemos que

DutyCycle= 100 \cdot \frac{V_{medio}}{\left ( V_{cc+} - V_{cc-} \right )}

PWM no es una señal analógica

Es importante recordar en todo momento que en una salida PWM el valor de tensión realmente es Vcc. Por ejemplo, si estamos alimentando un dispositivo que necesita 3V, y usamos una pulsada, en realidad estaremos suministrando 5V durante un 60% del tiempo y 0V durante el 40%. Pero si el dispositivo, por ejemplo, soporta como máximo 3V, podemos dañarlo si lo alimentamos mediante un PWM.

Una señal pulsada es suficiente para emular una señal analógica en muchas aplicaciones. Por ejemplo, podemos variar la intensidad luminosa en un LED mediante un PWM. El LED realmente se enciende y apaga varias veces por segundo, pero este parpadeo es tan rápido que el ojo no lo aprecia. El efecto global percibido es que el LED brilla con menor intensidad.

Otro ejemplo, al variar la velocidad de un motor DC con un PWM, en la mayoría de los casos la inercia del motor se encargará de que el efecto del PWM sea despreciable. No obstante, en función de la frecuencia podemos notar vibraciones o ruidos, en cuyo caso podremos deberemos variar la frecuencia del PWM.

Por otro lado, debemos tener en cuenta los efectos que supone la rápida conexión y desconexión de la señal pulsada puede suponer en el dispositivo alimentado. Por ejemplo, en el caso de cargas inductivas (motores, relés, o electroimanes) la desconexión supondrá la generación de voltaje inducido que puede dañar la salida digital o el propio dispositivo, por lo que será necesario disponer de las protecciones oportunas.

En cuanto a transistores, en general, los de tipo BJT resultan apropiados para funcionar como amplificación de señales PWM. Esto no suele ser así en los transistores MOS, donde los efectos capacitivos del mismo, unidos a la limitación de corriente de las salidas digitales, frecuentemente harán que necesitemos un driver de amplificación previo para evitar que el transistor trabaje en zona activa.

Usar de forma inadecuada una señal PWM puede dañar al dispositivo alimentado, si no soporta la tensión Vcc aplicada.

Salidas analógicas en Arduino

Arduino implementa por hardware salidas PWM en varios de sus pines, que aparecen identificados en la placa con el símbolo “~” junto al número del pin. También podemos emular por software señales PWM, pero con la carga de trabajo adicional que ello supone para el procesador.

En Arduino Uno, Mini y Nano, disponemos de 6 salidas PWM de 8bits en los pines 3, 5, 6, 9, 10 y 11.

En Arduino Mega disponemos de 15 salidas PWM de 8bis en los pines 2 a 13 y 44 a 46

Arduino Due cuenta con 13 salidas PWM de 8bits en los pins 2 a 13. Además, esta placa incorpora dos salidas analogicas discretizadas (DAC) con resolución de 12bits (4096 niveles)

Una resolución de 8bits en una salida PWM significa que tenemos 256 niveles. Es decir, indicamos el Duty cycle mediante un número de 0 a 255.

Los Timer en PWM por hardware

Las funciones PWM por hardware emplean los Timer para generar la onda de salida. Cada Timer da servicio a 2 o 3 salidas PWM. Para ello dispone de un registro de comparación por cada salida. Cuando el tiempo alcanza el valor del registro de comparación, la salida invierte su valor.

Cada salida conectada a un mismo temporizador comparte la misma frecuencia, aunque pueden tener distintos Duty cycles, dependiendo del valor de su registro de comparación.

Asociación de timers y PWM

En el caso de Arduino Uno, Mini y Nano

  • El Timer0 controla las salidas PWM 5 y 6.
  • El Timer1 controla las salidas PWM 9 y 10.
  • El Timer2 controla las salidas PWM 3 y 11.

Mientras que en Arduino Mega

  • El Timer0 controla las salidas PWM 4 y 13.
  • El Timer1 controla las salidas PWM 11 y 11.
  • El Timer2 controla las salidas PWM 9 y 10.
  • El Timer3 controla las salidas PWM 2, 3 y 5.
  • El Timer4 controla las salidas PWM 6, 7 y 8.
  • El Timer5 controla las salidas PWM 44, 45 y 46.

Frecuencia del PWM

La frecuencia de cada PWM depende de las características del temporizador al que está conectado, y de un registro de preescalado, que divide el tiempo por un número entero.

La frecuencia de los PWM se puede modificar cambiando el preescalado de los Timer correspondientes.

Arduino Uno, Mini y Nano disponen de tres temporizadoras.

  • Timer0, con una frecuencia de 62500Hz, y preescalados de 1, 8, 64, 256 y 1024.
  • Timer1, con una frecuencia de 31250Hz, y preescalados de 1, 8, 64, 256, y 1024.
  • Timer2, con una frecuencia de 31250Hz, y preescalados de 1, 8, 32, 64, 128, 256, y 1024.

Arduino Mega añade tres temporizadores más

  • Timer3, 4 y 5, con una frecuencia de 31250Hz, y preescalados de 1, 8, 64, 256, and 1024.

Por tan, la frecuencia estándar para las salidas PWM en Arduino Uno, Mini y Nano es de 490Hz para todos los pines, excepto para el 5 y 6 cuya frecuencia es de 980Hz

En cuanto a Arduino Mega, la frecuencia estándar es de 490Hz para todos los pines, excepto para el 4 y 13 cuya frecuencia es de 980Hz

Incompatibilidades

El uso de los Timer no es exclusivo de las salidas PWM, si no que es compartido con otras funciones. Emplear funciones que requieren el uso de estos Timer supondrá que no podremos emplear de forma simultánea alguno de los pines PWM.

A continuación alguna de las incompatibilidades más frecuentes

Servo

La librería servo hace un uso intensivo de temporizadores por lo que, mientras la estemos usando, no podremos usar algunas de las salidas PWM.

En el caso de Arduino Uno, Mini y Nano, la librería servo usa el Timer 1, por lo que no podremos usar los pines 9 y 10 mientras usemos un servo.

En el caso de Arduino Mega, dependerá de la cantidad de servos que empleemos.

  • Si usamos menos de 12 servos, usa el Timer 5, por lo que no perderemos los pin 44, 45 y 46.
  • Para 24 servos, usarlos Timer 1 y 5, por lo que perderemos los pin 11, 12, 44, 45 y 45.
  • Para 36 servos, usarlos Timer 1,3 y 5, perdiendo los pin 2, 3, 5, 11, 12, 44, 45, 46.
  • Para 48 servos, usar los Timer 1, 3, 4 y 5, perdiendo todos los pin PWM.

Comunicación SPI

En Arduino Uno, Mini y Nano, el pin 11 se emplea también para la función MOSI de la comunicación SPI. Por lo tanto, no podremos usar ambas funciones de forma simultánea en este pin. Arduino Mega no tiene este problema, ya que figuran en pines distintos.

Función Tone

La función Tone emplea el Timer 2, por lo que no podremos usar los pines 3 y 11, y en Arduino mega los pines 9 y 10.

Montaje

Para este tutorial no es necesario ningún montaje. Sin embargo, podemos verificar el correcto funcionamiento de las salidas analógicas simplemente midiendo con un polímetro la tensión entre la salida digital y GND.

arduino-salida-analógica-esquema

Código

El código necesario para encender una salida PWM es muy sencillo gracias a las bibliotecas de Arduino, que configuran por defecto las salidas de PWM en la función Setup, ocultando la dificultad de manipulación de los Timer.

Así, en en el ejemplo mas básico, simplemente definimos el pin PWM que queremos emplear, y usamos la función analogWrite para escribir el valor del Duty Cycle, medido de 0 a 255.

El siguiente código incrementa progresivamente el valor de una señal analógica desde 0 a 255. Al alcanzar el valor máximo el contador pasará a 0, por lo que el ciclo volverá a iniciarse.

const int analogOutPin = 11; // Analog output pin

byte outputValue = 0;        // valor del PWM

void setup() {
}

void loop() {
analogWrite(analogOutPin, outputValue);
delay(10);
outputValue++;
}

Para visualizar el código anterior podemos emplear un voltímetro o un LED colocado en el pin 11. Sin embargo, podemos modificar el código anterior con un pequeño truco, para traspasar el valor del PWM a otra señal, y así visualizarlo en el LED integrado en la placa en el pin 13.

No os centréis en la parte de interrupciones, si no sólo en la función Loop(). El resto del código es un poco complejo para esta entrada. Simplemente quedaros con que es un truco para mostrar un PWM en el LED integrado, y así hacer más fácil nuestras pruebas.

const int analogOutPin = 11; // Analog output pin that the LED is attached to
byte outputValue = 0;  


void setup()
{  
	bitSet(DDRB, 5);	    // LED pin (13)
	bitSet(PCICR, PCIE0);       // enable pin change interrupts on bank 0  
	bitSet(PCMSK0, PCINT3);     // enable PCINT3 (PB3) pin change interrupt 
}

void loop() 
{
	analogWrite(analogOutPin, outputValue); 
	delay(10);
	outputValue++;
}  

ISR(PCINT0_vect)
{
	if(bitRead(PINB, 3))
	{ 
		bitSet(PORTB, 5);   // LED on 
	}
	else
	{ 
		bitClear(PORTB, 5); // LED off  
	} 
}

Finalmente, si juntamos el código anterior con lo que vimos en comunicación por puerto de serie podemos hacer un programa que reciba un número de 0 a 10, y varíe la intensidad del LED integrado en la placa.

const int analogOutPin = 11;
byte outputValue = 0;  

void setup()
{  
	Serial.begin(9600);         // Iniciar puerto serie

	bitSet(DDRB, 5);	    // LED pin (13)
	bitSet(PCICR, PCIE0);       // enable pin change interrupts on bank 0  
	bitSet(PCMSK0, PCINT3);     // enable PCINT3 (PB3) pin change interrupt 
}

void loop() 
{
	if (Serial.available()>0){	// Si hay datos disponibles
        //leeemos la opcion
  	  outputValue = Serial.read();	// Leemos la opción
	  outputValue -= '0';		// Restamos '0' para convertir a un número
	  outputValue *= 25;		// Multiplicamos x25 para pasar a una escala 0 a 250
	  analogWrite(analogOutPin, outputValue);
	}
}  

ISR(PCINT0_vect)
{
	if(bitRead(PINB, 3))
	{ 
		bitSet(PORTB, 5);   // LED on 
	}
	else
	{ 
		bitClear(PORTB, 5); // LED off  
	} 
}

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Cumplimos 4 años

$
0
0

cuatro-años

cuatro-años

¡Cómo pasa el tiempo! 4 años han pasado ya desde que comenzamos este blog. Y aquí seguimos, con más ganas, más contenidos y más novedades que nunca.

Coincidencias de la vida, también estamos a puntito a puntito de pasar el 1.000.000 de páginas vistas. No haremos una fiesta de tipo “visitante un millón”, con un gran globo blanco cayendo del techo, pero quiero aprovechar para agradecer a todos los que alguna vez os habéis dejado caer por aquí.

Este año ha traído muchos cambios. El blog se ha vuelto más friky, con muchos más contenidos en la parte de Arduino, Zona Geek, y Programación. Una decisión con la que estoy muy contento, además de por la buena acogida que han tenido, me lo paso pipa disfruto mucho escribiéndolas.

Para el próximo año… más y mejor. Esperemos ir terminando con los tutoriales más sencillos de Arduino y Programación, para poder empezar a subir la dificultad progresivamente. Con un poco de suerte, antes de que nos demos cuenta estaremos haciendo robots, cuadricopteros, tanques, domótica, y todas esas cosas que nos gustan.

Un año más, gracias por acompañarnos durante este camino y hacer que merezca la pena para seguir mejorando y creciendo cada día ¡Gracias por vuestra visita!

Usar el sensor de temperatura interno de Arduino

$
0
0
arduino-sensor-temperatura-interno

Un hecho no muy conocido de Arduino es que la mayoría de modelos disponen de un sensor de temperatura interno en el procesador, que podemos hacer para realizar mediciones sin necesidad de sensores externos.

Los procesadores que incorporan este sensor son el ATmega 168A, 168P, 328 y 32P (Arduino Uno y Nano), y el Atmega32U4 (Arduino Leonardo). Por contra, este sensor no está disponible en ATMega2560 (Arduino Mega).

La precisión de este sensor es limitada, dado que se encuentra dentro del integrado del procesado y le afecta el calor del mismo. Este incremento de temperatura será mayor cuanto mayor sea la carga del procesador y la corriente que circula por las salidas.

Con algo de calibración, el sensor interno de Arduino puede proporcionar una medición aproximada de la temperatura ambiente con una precisión de 2ºC, siempre que el procesador haya estado apagado durante al menos 10 minutos.

Pese a sus limitaciones, el sensor de temperatura resulta interesante porque permite realizar mediciones sin emplear dispositivos exteriores. Por ejemplo, es útil para determinar el estado del procesador, en pruebas rápidas en una placa, o incluso en proyectos de mediciones de temperatura que requieran poca precisión, y con periodo entre mediciones largo.

El código que necesitamos para realizar la medición es el siguiente:

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

  Serial.println(F("Internal Temperature Sensor"));
}

void loop()
{
  Serial.println(GetTemp(),1);
  delay(1000);
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);
  delay(20);
  ADCSRA |= _BV(ADSC);
  while (bit_is_set(ADCSRA,ADSC));
  wADC = ADCW;

  // Esto es la función a calibrar.
  t = (wADC - 324.31 ) / 1.22;
  return (t);
}

Si queréis calibrar el sensor, tenéis que tomar varias mediciones, dejando 30 minutos el sensor apagado, cotejar las mediciones con las de un sensor calibrado, y ajustar los valores 324.31 y 1.22 de la expresión (pero no os esperéis maravillas, como hemos dicho la precisión siempre va a ser limitada).

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Obtener usuarios y ordenadores de Active Directory con C#

$
0
0
csharp-active-directory

Si sois administradores de sistemas con Active Directory estaréis acostumbrados a lidiar con la gestión de cientos o incluso miles de usuarios y ordenadores.

En estas circustancias, muchas veces resulta de utilidad hacer consultas a Active Directory desde C# para acceder, filtrar, o ejecutar acciones de forma rápida y cómoda desde alguno de nuestros desarrollos.

Con este objetivo, compartimos el código necesario para hacer consultas de usuarios y ordenadores desde Active Directory mediante C#.

Consultar usuarios desde Active Directory

Para que el código funcione es necesario importar el ensamblado System.DirectoryServices;

El código para importar usuarios es el siguiente. Podéis personalizar las propiedades devueltas por la consulta a vuestro gusto. Recordar cambiar XXXXXX por el nombre de vuestro AD, e YYY por la extensión.

public List GetADUsers()
{
	List rst = new List();

	string DomainPath = "LDAP://DC=XXXXXX,DC=YYY";
	DirectoryEntry adSearchRoot = new DirectoryEntry(DomainPath); 
	DirectorySearcher adSearcher = new DirectorySearcher(adSearchRoot);

	adSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
	adSearcher.PropertiesToLoad.Add("samaccountname");
	adSearcher.PropertiesToLoad.Add("title");
	adSearcher.PropertiesToLoad.Add("mail");
	adSearcher.PropertiesToLoad.Add("usergroup");
	adSearcher.PropertiesToLoad.Add("company");
	adSearcher.PropertiesToLoad.Add("department");
	adSearcher.PropertiesToLoad.Add("telephoneNumber");
	adSearcher.PropertiesToLoad.Add("mobile");
	adSearcher.PropertiesToLoad.Add("displayname");
	SearchResult result;
	SearchResultCollection iResult = adSearcher.FindAll();

	User item;
	if (iResult != null)
	{
		for (int counter = 0; counter < iResult.Count; counter++)
		{
			result = iResult[counter];
			if (result.Properties.Contains("samaccountname"))
			{
				item = new User();

				item.UserName = (String)result.Properties["samaccountname"][0];

				if (result.Properties.Contains("displayname"))
				{
					item.DisplayName = (String)result.Properties["displayname"][0];
				}

				if(result.Properties.Contains("mail"))
				{
					item.Email = (String)result.Properties["mail"][0];
				}

				if (result.Properties.Contains("company"))
				{
					item.Company = (String)result.Properties["company"][0];
				}

				if (result.Properties.Contains("title"))
				{
					item.JobTitle = (String)result.Properties["title"][0];
				}

				if (result.Properties.Contains("department"))
				{
					item.Deparment = (String)result.Properties["department"][0];
				}

				if (result.Properties.Contains("telephoneNumber"))
				{
					item.Phone = (String)result.Properties["telephoneNumber"][0];
				}

				if (result.Properties.Contains("mobile"))
				{
					item.Mobile = (String)result.Properties["mobile"][0];
				}
				rst.Add(item);
			}
		}
	}
	
	adSearcher.Dispose();
	adSearchRoot.Dispose();

	return rst;
}

public class User
{
	public string UserName { get; set; }

	public string DisplayName { get; set; }

	public string Company { get; set; }

	public string Deparment { get; set; }

	public string JobTitle{ get; set; }

	public string Email { get; set; }

	public string Phone { get; set; }

	public string Mobile { get; set; }
}

Consultar ordenadores desde Active Directory

Por su parte, el código necesario para listar los ordenadores del AD es el siguiente. Igualmente podéis personalizar las propiedades devueltas a vuestro antojo, y no olvidéis cambiar XXXXXX e YYY por el nombre y extensión de vuestro AD, respectivamente.

public static List GetADComputers()
{
	List rst = new List();

	string DomainPath = "LDAP://DC=XXXXXX,DC=YYY";
	DirectoryEntry adSearchRoot = new DirectoryEntry(DomainPath);
	DirectorySearcher adSearcher = new DirectorySearcher(adSearchRoot);

	adSearcher.Filter = ("(objectClass=computer)");
	adSearcher.PropertiesToLoad.Add("description");
	adSearcher.SizeLimit = int.MaxValue;
	adSearcher.PageSize = int.MaxValue;

	SearchResult result;
	SearchResultCollection iResult = adSearcher.FindAll();

	Computer item;

	for (int counter = 0; counter < iResult.Count; counter++)
	{
		result = iResult[counter];

		string ComputerName = result.GetDirectoryEntry().Name;
		if (ComputerName.StartsWith("CN=")) ComputerName = ComputerName.Remove(0, "CN=".Length);
		item = new Computer();
		item.ComputerName = ComputerName;

		if (result.Properties.Contains("description"))
		{
			item.Description = (String)result.Properties["description"][0];

		}
		rst.Add(item);
	}

	adSearcher.Dispose();
	adSearchRoot.Dispose();

	return rst;
}

public class Computer
{
	public string ComputerName { get; set; }
	
	public string Description { get; set; }
}

Esperamos que el código os sea de utilidad y si tenéis cualquier duda ¡no dudéis en dejarnos vuestro comentario!

Ver televisión online sin publicidad abusiva

$
0
0
tv-on-tablet_wide-dc481d70f878700dfb28c05ba2d889fe9a61bdd0

Televisión e Internet forman un equipo perfecto. El empleo de Internet como sistema de transmisión es una realidad, aunque esto sea algo que cuesta entender a ciertos medios “clasicos”.

Constantemente surgen nuevas opciones para ver televisión a través de Internet. Incluso las propias cadenas han optado por transmitir su contenido a través de Internet, u ofrecer sus propias plataformas.

Sin embargo, algunos canales más reticentes aún no transmiten sus contenidos a través de Internet. Ciertas páginas han encontrado su negocio emitiendo estos canales, rodeadas de cantidades ingentes de anuncios.

Hasta hace poco el uso de bloqueadores de anuncios aliviaba la presión ante esta publicidad abusiva. Pero ahora las páginas han empezado a detectar el uso de bloqueadores, impidiendo ver sus contenidos mientras los tengamos activados.

En esta entrada vamos a aprender a saltarnos esta prohibición, y poder visualizar los canales de televisión sin publicidad abusiva.

Lo importante no son tanto los detalles del proceso (que pueden variar de una página a otra) como el proceso en sí. Y sobre todo ilustrar que en Internet nadie puede obligarte a ver algo que no quieres.

Eliminar la publicidad abusiva

Para el ejemplo, vamos a intentar ver “Discovery Max” de forma online (que le voy a hacer, me gusta el programa de pesca de cangrejos). Recordar que lo importante no es el ejemplo en sí, sino mostrar el proceso. Para el proceso vamos a usar el explorador Chrome, aunque el proceso es similar en cualquier navegador.

Empezamos buscando en Google “discovery max online”. Elegimos uno de entre los resultados que aparezcan (en realidad son todos prácticamente iguales, si no el mismo).

Aparece una página atiborrada de publicidad y el visor del canal tapado por un cartel exigiendo que inhabilitemos Add Block. ¿Vamos a hacer caso? ¡Ni mucho menos!

Pulsamos con el botón derecho encima del cartel y seleccionamos “Inspeccionar elemento”.

2015-10-12 22_17_36-ver-television-online-sin-publicidad

Se abre la ventana inferior las herramientas para desarrollador de Google donde podremos observar la ponzoña de el deficiente código de la página.

En resumen de lo que vemos, estas páginas usan (excesivos) iframes anidados. Es decir, meten una página, dentro de otra página, dentro de otra página, y en medio rellenan con capas y capas de publicidad. Nosotros queremos encontrar la página original.

Si buscáis un poco por encima de donde os haya saltado el cursor, encontramos el primer iframe. Hacer doble click en su dirección, copiar, y pegar en la barra de dirección para subir un nivel.

2

Repetimos el proceso hasta llegar a una página en la que exista un único iframe. Inspeccionando el código de la página podréis evitaros la mayoría o todos los saltos, y acceder directamente a la página en un paso. Si no conseguís leer el código HTMl no importa, probar poco a poco, en pocos saltos llegaréis igualmente.

3

Si en algún momento algún cartel, o cualquier otro elemento, podéis eliminarlo desde las herramientas de desarrollador, simplemente pulsando la tecla suprimir.

En esta última página, en primer lugar vamos a eliminar el cartel que exige desinstalar los bloqueadores de anuncios. Pulsamos con el botón derecho encima del mismo, seleccionamos “Inspeccionar elemento”.

Un poco encima de donde aparezca el cursor, veremos un div llamado “adb-enabled” (adivinar para que sirve). Lo borramos sin piedad pulsando la tecla Suprimir. ¡adiós cartel!.

4

Ahora eliminaremos las capas de publicidad restantes. Buscamos un div llamado “divpubli” (que originales son con los nombres ¿eh?). Seleccionamos, tecla suprimir, y … sayonara publicidad.

5

De hecho, en esta página, podéis eliminar todo menos el iframe, y dentro de este todo excepto el div con ID= “jwplayer1_wrapper”, con lo que la página quedaría reducida a esto.

6

Ya podemos disfrutar de la retransmisión sin publicidad abusiva, y de paso habremos eliminado bastante código y errores que ralentizan alarmantemente tu ordenador. Por último, si estáis interesados, guardar la página como favorito para poder acceder directamente la próxima vez.

Los procesos mostrados se exponen únicamente con fin didáctico, siendo la responsabilidad final de su uso exclusivamente del usuario. Aunque, como se suele decir, quién roba a un ladrón…


Marty McFly y Doc llegan hoy desde 1985 (regreso al futuro)

$
0
0
regreso-al-futuro

4:29 del miércoles 21 octubre de 2015.

Según la segunda entrega (1989) de la mítica de la trilogía Regreso al Futuro, hoy es el día en el que Marty McFly (Michael J. Fox) y Emmett Brown “Doc” (Christopher Lloyd) llegan en su DeLorean a Hill Valley, California, en su viaje a través del tiempo desde el Sábado 26 de octubre de 1985.

Pese a la evidente (y bastante decepcionante) ausencia de de patinetes flotantes y coches voladores en nuestras calles, como buen Geek que se precie, no puedo dejar pasar esta fecha tan esperada para hacer un pequeño homenaje una saga que se ha convertido un icono, y que ha ejercido una gran influencia en toda una generación.

Hoy, más que nunca, tiene sentido decir: ¡El futuro es ahora!

regreso-al-futuro- panel

regreso-al-futuro- delorean

regreso-al-futuro-condensador-fluzo

regreso-al-futuro- pizza

regreso-al-futuro- skate

regreso-al-futuro- botas

regreso-al-futuro- marty-doc

Esquema de patillaje de Arduino (pinout)

$
0
0

arduino-pinout-portada

El esquema de patillaje de un dispositivo electrónico, o pinout, es uno de los documentos de referencia más útiles y que más frecuentemente consultaremos a la hora de realizar un montaje. El caso de Arduino no es una excepción, más aún teniendo en cuenta la gran cantidad de pines y modelos de placas disponibles.

A medida que la complejidad de nuestros circuitos aumenta y empezamos a emplear funciones más complejas, como comunicación entre dispositivos o interrupciones, resulta más conveniente disponer a mano de estos esquemas, para poder consultar rápidamente los datos de cada pin en las distintas placas existentes.

Os dejo los esquemas de pinout de las principales placas de Arduino, que serán documentos de consulta que emplearemos frecuentemente en el resto de entradas del blog.

Esta entrada se actualizará periódicamente con nuevos esquemas. Última actualización 10/11/2015.

Arduino Uno

aduino-pinout-uno

Arduino Nano

aduino-pinout-nano

Arduino Mini Pro

aduino-pinout-pro-mini

Arduino Mega

aduino-pinout-mega

Si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Fuente: Los esquema de esta entrada están basados en el trabajo de http://www.pighixxx.com/

Hacer gráficas fácilmente con Arduino IDE v1.6.6

$
0
0
arduino-portada-grafica

Acaba de ser lanzada la nueva versión 1.6.6 del IDE de Arduino y una de las novedades más celebradas es la inclusión de una ventana para hacer gráficos con los valores recibidos por el puerto de serie.

En esta entrada vamos a ver cómo emplear esta sencilla pero útil herramienta, llamada “Serial Plotter”, para visualizar información enviada desde Arduino por el puerto de serie.

Arduino Serial Plotter

Cómo decíamos, el nuevo IDE de Arduino incorpora una extensión al tradicional monitor serial, que permite mostrar en una gráfica en tiempo real los valores recibidos por puerto de serie.

Tampoco esperéis maravillas… es una herramienta sencilla, muy alejada de lo que podemos obtener conectando Arduino con una aplicación de Processing, C#, Python o Java (alguno de los cuales trataremos próximamente en el blog)

Pero precisamente esta sencillez y facilidad de uso es lo que convierte en útil al serial plotter, ya que nos permite realizar test rápidos, o supervisar los valores de una variable sin esfuerzo.

Encontramos el nuevo “Serial Plotter” en el menú “Herramientas”, justo al lado del tradicional “Serial Monitor”.

arduino-serial-plotter

Vamos a mostrar su uso con un simple ejemplo. Para ello, comenzamos conectando Arduino por USB, tal y como vimos en la entrada Comunicación de Arduino con puerto de serie.

Cargamos el siguiente código en Arduino. Simplemente genera números aleatorios entre 1 y 3 con dos decimales, y los envía por el puerto de serie cada 100 ms.

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

void loop() {

  float value;
  value = random(100,300)/100.0;

  Serial.println(value);

  delay(100);
}

El resultado que obtendréis es similar al de la siguiente imagen.

arduino-grafica

Por supuesto, en una aplicación real el valor mostrado sería una variable supervisada como, por ejemplo, la medición realizada mediante alguno de los muchos sensores que hemos visto en el blog. Igualmente, deberíamos ajustar el tiempo entre envíos a la frecuencia de medición que deseemos.

Vemos que, pese a tener sus limitaciones, es una herramienta que resulta útil por su sencillez para realizar pruebas y montajes rápidos. Esperemos que en próximas versiones mejoren y añadan nuevas funcionalidades al Serial Plotter.

Mientras tanto, si te ha gustado esta entrada y quieres leer más puedes consultar el resto de tutoriales de Arduino

Encender un LED con Arduino

$
0
0
arduiino-led

En esta entrada veremos como encender un LED mediante las salidas de Arduino. Para ello, veremos el principio de funcionamiento y el esquema eléctrico necesario.

Por supuesto, también podemos usar el contenido de esta entrada para encender un LED con cualquier otro autómata, o directamente conectándolo a tensión con una fuente de alimentación o batería. El esquema eléctrico es el mismo, sin más que sustituir la salida de Arduino por vuestra fuente de tensión.

En algunos libros o páginas web veréis que, a veces, conectan directamente el LED a una salida digital o analógica de Arduino. Aunque esto funciona (luego veremos porque) es una mala práctica. EN general, los LED deben conectarse siempre a través de una resistencia.

Para entender la importancia y el papel de esta resistencia, y poder calcular su valor, es necesario entender cómo funciona un LED.

¿Qué es un LED?

Un LED es un diodo emisor de luz, es decir, un tipo particular de diodo que emite luz al ser atravesado por una corriente eléctrica. Los diodos (emisor de luz, o no) son unos de los dispositivos electrónicos fundamentales.

Recodemos que diferenciamos entre dispositivos eléctricos y electrónicos. Los dispositivos eléctricos engloban resistencias, condensadores y bobinas, e integran el campo de electricidad. Los dispositivos electrónicos, surgen del uso de materiales semiconductores, y dan lugar al campo de la electrónica.

Un diodo es una unión de dos materiales semiconductores con dopados distintos. Sin entrar en detalles, esta diferencia de dopado hace que genere una barrera de potencial, que como primera consecuencia hace que el paso de corriente en uno de los sentidos no sea posible.

Aquí tenemos la primera característica de los diodos, tienen polaridad, es decir, solo dejan pasar la corriente en un sentido. Por tanto, tenemos que conectar correctamente la tensión al dispositivo.

La patilla larga debe ser conectada al voltaje positivo (ánodo), y la corta al voltaje negativo (cátodo).

arduino-led-patillaje

Regla menométcnica:
– La patilla “más” larga es la positiva.
– La patilla “menos” larga es la negativa.

La otra consecuencia de la barrera de potencial es que, incluso conectando el dispositivo con la polaridad correcta, a baja tensión los electrones siguen sin poder atravesar el dispositivo. Esto ocurre hasta alcanzar un cierto valor de tensión que llamamos tensión de polarización directa (Vd), que depende del tipo de diodo.

A partir de esta tensión decimos que el diodo está polarizado y la corriente puede atravesarlo libremente con una resistencia casi nula. La tensión que realmente está alimentando al diodo es la diferencia entre la tensión aplicada, y la tensión de polarización directa del diodo.

Como vemos, en el momento que superamos la tensión de polarización, y dado que la resistencia del diodo es muy pequeña, se genera una gran corriente que destruirá el diodo. Por ese motivo, necesitamos una resistencia que limite la cantidad de corriente que circula por el diodo.

En resumen, si no ponemos una resistencia, el sistema solo tiene dos estados.

  • Si alimentamos a una tensión inferior a Vd, el LED no luce.
  • Si alimentamos a una tensión superior a Vd, el LED se rompe.

En cualquier caso, no conseguiremos hacer lucir el LED sin utilizar una resistencia de valor adecuado.

¿Por qué funciona conectando a una salida de Arduino directamente?

Como hemos adelantado esto, a veces veréis en tutoriales en Internet que algunos conectan un LED directamente a una salida de Arduino, sin usar una resistencia. Efectivamente, esto funciona y el LED luce sin romperse. ¿Cómo puede ser posible esto?

Esto funciona porque Arduino tiene una limitación de 20mA en sus salidas. Esta limitación hace que el LED no se funda, aunque realmente se está comportando como si fuera un corticircuito. Simplemente Arduino no puede dar más corriente.

No obstante es esto es una práctica totalmente desaconsejada por varios motivos. En primer lugar porque supone forzar de forma innecesaria la salida de Arduino, lo que puede acortar su vida a largo plazo. Por otro porque 20mA es, en general, una corriente demasiado elevada para un Led. Pero sobre todo, porque es una chapuza y una falta de higiene electrónica total.

¿Qué tipos de LED usaremos en electrónica?

Existe una gran gama de LED disponibles, desde los LED habituales de pequeña potencia, a los LED de gran potencia empleados en iluminación. Estos últimos requieren etapas adicionales de potencia (drivers) para poderlos encender desde un autómata.

Dentro de los LED de pequeña potencia, que son los que vamos a emplear con más frecuencia, los más habituales son los encapsulados tradicionales de LED de 3mm o 5mm.

arduino-led-3mm-5mm

También podemos encontrar LED opacos (diffused) o LED transparentes (clear). Los LED opacos están pensados para “encenderse” ellos mismos (por ejemplo, para hacer un panel de mando). Por el contrario, los LED transparentes están pensados para iluminar una área, pero no al propio LED.

arduino-led-clear-diffused

Adicionalmente, encontraremos LED con diferentes ángulos. Los LED con un ángulo de iluminación más pequeño tienen un haz más cerrado, por lo que concentran la luz en un área estrecha. Por el contrario, los LED con ángulos más amplios concentran una cantidad de luz inferior hacia delante, y a cambio iluminan un área mayor.

Por último, veréis que algunos LED tienen el encapsulado de un color. Este color es simplemente para identificar el color de la luz emitida por el LED sin tener que encenderlo, pero no tiene ninguna influencia en el color de la luz emitida, que sólo depende de la construcción interna del LED (personalmente, yo los prefiero con el encapsulado sin colorear).

arduino-led-color

¿Cuánto cuesta un LED?

El coste de los LED es muy similar independientemente de su tipo y tamaño (exceptuando, lógicamente, los LED de alta potencia), aunque algunos colores pueden ser un poco más caros.

En general, son dispositivos realmente baratos. Podemos encontrar LED por 1 céntimo de euro, en vendedores internacionales de eBay o AliExpress.

arduino-led-buy

Por último, comentar que tenemos también disponibles una gran cantidad de accesorios para LED, como soportes, soportes roscados, tapas decorativas de plástico, etc. ..y también son muy baratos, en torno a un céntimo de euro la unidad.

arduino-led-accesories

Calcular el valor de la resistencia

Hemos dicho que lo principal para hacer funcionar un LED es calcular el valor de la resistencia necesaria. Para calcular el valor de tensión necesaria para alimentar un LED necesitamos conectar 3 parámetros

  • La tensión de alimentación (Vcc)
  • La tensión de polarización directa del LED (Vd)
  • La corriente nominal del LED (In)

Calcula el valor de la resistencia es sencillo. Como hemos dicho, la tensión que soporta el LED es la diferencia entre la tensión aplicada y la tensión de polarización directa del LED.

Aplicando la ley de Ohm, con el valor de la intensidad nominal del LED

V = V_{cc}-V_d = I_{nominal} * R

Por lo que lo que el valor de la resistencia resulta

R = \frac{I_{nominal}}{V_{cc}-V_d}

Dado que las resistencias comerciales tienen valores normalizados, no encontraréis una resistencia con el valor exacto que hayáis calculado. En este caso, elegiremos la resistencia normalizada inmediatamente superior al valor calculado, para garantizar que la corriente es inferior a la nominal.

La tensión de alimentación Vcc es conocida para nosotros. En caso de aplicar una fuente de alimentación o una batería, Vcc es la tensión nominal de la misma. En el caso de una salida digital o analógica de Arduino, Vcc dependerá del modelo que estemos usando (5V o 3.3V) pero también es conocido.

Recordar que aunque uséis una salida analógica PWM la tensión entregada a la carga es siempre Vcc. Consultar la entrada Salidas analógicas PWM en Arduino si tenéis dudas en esto.

Respecto a la tensión de polarización y la corriente nominal dependen de los materiales y constitución interna del diodo. En el caso de diodos LED convencionales de 3mm y 5mm, dependen principalmente del color y luminosidad

No obstante, en la mayoría de las ocasiones el propio vendedor facilita estos valores en el anuncio. En caso de duda deberemos acudir al Datasheet del LED para consultar los valores nominales.

En la siguiente tabla os adjuntamos unos valores generales de la tensión de polarización Vd típica para cada color. También os figura el valor de la resistencia necesaria, en Ohmios, para distintos valores de tensión de alimentación Vcc.

Color Vdd Resistencia (Ohmios)
3.3V 5V 9V 12V
Infrarrojo 1.4V 150 270 510 680
Rojo 1.8V 100 220 470 680
Naranja 2.1V 100 200 470 680
Amarillo 2.2V 100 200 470 680
Verde 3.2V 10 150 330 560
Azul 3.5V 100 330 560
Violeta 3.6V 100 330 560
Blanco 3.8V 100 330 560

Conexión eléctrica

La conexión eléctrica es realmente sencilla. Simplemente ponemos la resistencia previamente calculada en serie con el LED.

arduino-led-esquema-electrico

El montaje en una protoboard quedaría de la siguiente forma.

arduino-led-montaje

Ejemplos de código

A continuación alguno de los códigos para probar a encender LED con nuestros Arduinos, y el montaje indicado. Los códigos son similares a los que hemos visto previamente en las distintas entradas del blog, pero empleando un LED externo en lugar del LED integrado en la placa. Para ello, solo tenemos que sustituir el número de PIN 13, correspondiente con el LED integrado, por el PIN de la salida a la que vamos a emplear.

Así, el primer código sirve para encender y apagar un LED, tal y como vimos en la entrada salidas digitales en Arduino.

const int ledPIN = 9;
 
void setup() {
  Serial.begin(9600);    //iniciar puerto serie
  pinMode(ledPIN , OUTPUT);  //definir pin como salida
}
 
void loop(){
  digitalWrite(ledPIN , HIGH);   // poner el Pin en HIGH
  delay(1000);                   // esperar un segundo
  digitalWrite(ledPIN , LOW);    // poner el Pin en LOW
  delay(1000);                   // esperar un segundo
}

El siguiente código emplea las salidas digitales y la comunicación por puerto de serie para hacer parpadear el LED el número de veces que enviemos por el puerto de serie, tal y como vimos en la entrada comunicación por el puerto de serie de Arduino.

const int ledPIN = 9;

int option;

void setup(){
  Serial.begin(9600);
  pinMode(ledPIN , OUTPUT); 
}

void loop(){
  //si existe información pendiente
  if (Serial.available()>0){
    //leeemos la opcion
    char option = Serial.read();
    //si la opcion esta entre '1' y '9'
    if (option >= '1' && option <= '9')
    {
      //restamos el valor '0' para obtener el numero enviado
      option -= '0';
      for(int i=0;i

Consultar servidor de licencias FlexLM desde C#

$
0
0
csharp-flexLM

FlexLM es un software de supervisión de licencias ampliamente extendido en el mundo corporativo. FlexLM es empleado por importantes empresas de sofware para gestionar el uso de sus licencias flotantes, especialmente en el caso de programas de CAD.

En ocasiones resulta útil poder ejecutar consultas a un servidor FlexLM para obtener información sobre las licencias en uso y disponibles en el servidor, para un software específico.
Por ejemplo, podemos usarlo para balancear la carga de usuarios entre servidores de licencias, hacer estadísticas de uso de software, o analizar pautas de comportamiento en usuarios.

En esta entrada compartimos un código en C# para realizar consultas sobre a un servidor FlexLM. La información obtenida puede ser tratada para obtener los datos que necesite vuestra aplicación.

Para hacer la consulta tenemos esta función.

private string queryFLEXLMLicense(string flexLMPath, string port, string host, string license)
{
    string rdo = "";
    string args = String.Format("lmstat -c {0}@{1} -f {2}", port, host, license);

    ProcessStartInfo info = new ProcessStartInfo(flexLMPath, args);
    info.WindowStyle = ProcessWindowStyle.Hidden;
    info.UseShellExecute = false;
    info.RedirectStandardOutput = true;

    using (Process p = Process.Start(info))
    {
        string output = p.StandardOutput.ReadToEnd();

        // standard output must be read first; wait max 5 minutes
        if (p.WaitForExit(300000))
        {
            p.WaitForExit();
        }
        else
        {
            // kill the lmstat instance and move on
            p.Kill();
            p.WaitForExit();
        }
        rdo += output;
    }
}

Aquí tenemos un ejemplo de su uso, donde tendréis que sustituir los valores empleados por los de vuestra instalación.

public void main()
{

    string flexLMPath = @"C:\Program Files\flexLM\lmutil.exe";   //sustituir con la ruta de lmutil.exe en vuestro PC
    string port = "27001";
    string host = "XXX.YYY.com";    //sustituir con la dirección del servidor de licencias
    string license = "ZZZ";        //sustituir con el nombre de la licencia a consultar
    
    string license = queryLicenses(flexLMPath, port, host, license);
}

Ahora podéis emplear

Viewing all 1123 articles
Browse latest View live