Arduineces y otras hierbas (Monitorizar fugas de agua)

Todo cuanto tiene que ver con la obtención, almacenamiento y proceso de la información digital, sus aplicaciones y el software y hardware utilizado.
Responder
Mensaje
Autor
Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#41 Mensaje por Anilandro »

Entrando en el asunto del control de la placa Arduino mediante señales externas, comenzaremos por probar un sistema fácil mediante un mando a distancia por infrarrojos.

Imagen


Cuando manejamos cualquier aparato eléctrico o electrónico con un mando a distancia por infrarrojos, parece evidente que por cada tecla que pulsamos, el mando emite una señal distintiva que corresponde a una acción, y también que esta señal ha de estar formada por trenes de impulsos que forman a su vez una "palabra" digital, de manera que el receptor, al decodificarla reconozca la acción concreta que estamos ordenando.

Supongo que habrá muchos tipos de mandos distintos y algunos con protocolos extraños, pero la mayoría utilizan el llamado protocolo NEC estandar, que funciona modulando una portadora de 38 Khz en ráfagas de impulsos que duran medio milisegundo y se combinan entre ellos para transmitir 32 bits de información. Estos a su vez se dividen en 8 de dirección, 8 de dirección invertidos, 8 de comando y 8 de comando invertidos. Se supone que esta duplicidad de bits normales e iguales pero invertidos sirve para corregir errores que puedan producirse en el proceso de transmisión-recepción.

Imagen


Bien, como breve información adicional diremos que la manera como estos impulsos codifican la información es en forma de unos "1" y ceros "0", y que sea uno u otro valor depende exclusivamente de la separación entre impulsos en el tiempo, es decir, si un impulso está separado del anterior en 2,25 milisegundos, corresponde a un "1", y si es de la mitad, de 1,12 milisegundos, corresponde a un 0.

Imagen

Estos detalles pueden ser interesantes a nivel electrónico, pero si queremos utilizar este mando a distancia para el control de algún dispositivo, no será realmente necesario sabérselo de memoria, si no que nos bastará averiguar que secuencia de "1" y "0" concreta que forman la "palabra digital" de 32 bits correspondiente a cada tecla, y para a averiguarlo hay dos sistemas básicos.

El primero de ellos es más caro y complejo porque implica disponer de un osciloscopio con memoria que nos retenga la forma de onda procedente del sensor. Además, una vez la tengamos fija en pantalla, nosotros mismos deberemos interpretar el estado de cada bit (1 o 0) de acuerdo a la separación de sus correspondientes impulsos, lo cual no será difícil, ya que los tiempos "largos =1" y "cortos=0" se distinguen perfectamente. Pero como al menos deberemos comprobar varias veces la misma tecla para estar seguros de no equivocarnos y encima tengamos muchas teclas a comprobar, el tiempo dedicado a ello puede ser considerable, así que vamos a ver otro sistema mucho más simple, rápido y sobre todo barato, que implica únicamente utilizar el Arduino UNO. Hagamos el siguiente montaje:

Imagen

Ahora cargaremos en el IDE un corto programita que podemos bajar del enlace:

https://dl.dropboxusercontent.com/u/559 ... IR.ino.ino

Lo cargamos en la placa Arduino y arrancamos el monitor serie del IDE. Tras esto, pulsaremos cualquier tecla y podremos observar como en pantalla aparece no la forma del osciloscopio, si no directamente su secuencia de unos y ceros de 32 caracteres de longitud. Pues bien, se trata de anotarlas con un copia y pega para poder usarlas posteriormente en uno u otro montaje.

Imagen

Tomando como referencia nuestro mando a distancia, los códigos NEC que he obtenido por este procedimiento han sido los siguientes:

111111111010001001011101 (CH-)
111111110110001010011101 (CH)
111111111110001000011101 (CH+)
111111110010001011011101 (<<)
111111110000001011111101 (>>)
111111111100001000111101 (>P)
111111111110000000011111 (-Vol)
111111111010100001010111 (+Vol)
111111111001000001101111 (EQ)
111111111001100001100111 (FL-)
111111111011000001001111 (FL+)
111111110110100010010111 (0)
111111110011000011001111 (1)
111111110001100011100111 (2)
111111110111101010000101 (3)
111111110001000011101111 (4)
111111110011100011000111 (5)
111111110101101010100101 (6)
111111110100001010111101 (7)
111111110100101010110101 (8)
111111110101001010101101 (9)


Por tanto, si deseamos utilizar esta información en un programa, simplemente deberemos incluir órdenes condicionales tipo if() o tipo switch() para que una tecla determinada nos dispare una acción concreta. Esbozando un poco un programa de este tipo, sería:

============================
#include <IRremote.h> // Incluimos la librería de decodificación del protocolo NEC

void setup()
{
}

void loop
{
if (irrecv.decode(&results)) //Si el receptor IR recibe una señal, entra dentro de la función
{
switch(results.value) //Después de obtener el código lo compara con varios casos
{

case 0b111111111010001001011101: //Al apretar la tecla (CH-)
// acción "A" que debe efectuar.........
break;

case 0b111111110110001010011101: //Al apretar la tecla (CH)
// acción "B" que debe efectuar.........
break;

case 0b111111110110001010011101: //Al apretar la tecla (CH+)
// acción "C" que debe efectuar.........
break;

}
irrecv.resume(); //borra buffer de datos IR
}
}

============================

* Observar que al ser números binarios, en las órdenes "case" han de ir precedidos de los caracteres "0b" (cero "b")

Es decir, cada orden "case" reconocerá su propio código binario, y sólo responderá a la pulsación de su tecla asociada, lo cual utilizaremos en el próximo mensaje para mover un servo proporcional...

Continuará...

Un saludo a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#42 Mensaje por Anilandro »

Veamos entonces como podemos controlar un servo.

Cualquier aficionado al radiomodelismo de aviones, coches o buques, o bien aquellos que han trabajado en robótica o sistemas automáticos, saben que es un servo. En esencia es un dispositivo electromecánico que dispone de un brazo o actuador, el cual se moverá a una posición determinada mediante una señal de mando, y será capaz de abrir o cerrar válvulas, mover compuertas, controlar el timón de un pequeño buque o los planos de control de un aeromodelo. Los servos más comunes suelen ser del tipo denominado "proporcionales", porque su movimiento responde "en proporción" a un parámetro de la señal de control.

Servo proporcional de pequeño tamaño
Imagen

A la vez, estos servos, incluso los de pequeño tamaño, son capaces de ejercer una fuerza considerable, con un brazo de palanca de 1 cm algunos pueden ejercer hasta 25 kilos de fuerza y moverse de un extremo a otro de su recorrido en una fracción de segundo.

Para su alimentación eléctrica los servos disponen de un conector hembra con tres cables, normalmente, negro, rojo y amarillo:

- El negro (o a veces marrón) es la masa, conectada al polo negativo.
- El rojo es el positivo de la corriente continua de alimentación, que los modelos normales va de los 4,5 a los 6 volts.
- El amarillo es la entrada de la señal de mando

La señal de mando tiene la forma de un impulso digital, con el 0 a tensión de masa y el 1 a 5 volts, siendo el parámetro que controla el servo la duración del tiempo en que dicha señal está en su estado alto. Salvo en el caso de servos muy especiales como los de control de escotas en veleros de radiocontrol, en los de uso habitual el arco de movimiento es de alrededlor de 180 grados (+90 y -90 a partir de un punto central), un impulso de 1 milisegundo provocará que el brazo mecánico se desplace a uno de sus extremos, mientras que un impulso de 2 milisegundos lo va a mover hacia el extremo contrario, adoptando entre estos dos valores todas las posiciones intermedias del brazo.

Impulsos de control del servo
Imagen

A la vez, estos impulsos de mando no son únicos, es decir, el servo no tiene memoria del último impulso recibido y se queda en la posición, sino que debe refrescarse cada 20 milisegundos (50 veces por segundo), aunque este valor puede variar bastante hacia arriba o hacia abajo sin que el servo pierda su posición de referencia.

Por otra parte, debemos decir que el Arduino UNO tiene catorce pins (del 0 al 13) que pueden configurarse como entradas o como salidas digitales, pero hay seis de ellos que son especiales, se trata del 3,5,6,9,10 y 11, ya que aparte de actuar como entradas o salidas normales a todo o nada, son capaces de generar una señal PWM (Pulse-width modulation), o modulación por ancho de pulso. Esta señal, pasada a través de un sencillo circuito de filtro "paso bajo" formado por una resistencia y un condensador, permite simular una tensión continua de valor variable entre 0 y 5 volts, pero además, con las órdenes correspondientes puede generar el tipo de impulsos que se necesita para controlar un servo...

...Para conseguir esto deberemos incluir en le programa la librería <Servo.h>, que permite controlar 12 servos, aunque por las limitaciones del Arduino UNO respeto a los pins PWM, sólo podremos hacerlo con 6. Las órdenes principales, contando la inclusión, serán sólo tres:

#include <Servo.h> // librería de control de servos
Servo servomotor; // Nombre del servomotor (que declararemos al principio como si fuera una variable)
servomotor.write(posicion); // mueve el servo a la posición angular especificada entre 0 y 180 grados, metido en el programa loop()

Bien, llegados a este punto ya estamos en disposición de mover el servo al punto de recorrido que deseemos. Para ello asociaremos cinco teclas del mando a distancia que nos permitan:

CH- Mover el servo a su extremo bajo
CH Mover el servo al punto medio
CH+ Mover el servo a su extremo alto
<< Mover 5 grados hacia abajo
>> Mover 5 grados hacia arriba

El circuito que vamos a utilizar será el mismo de cuando leímos los códigos de las teclas, pero añadiendo el servo, cuyo terminal negro o marrón irá a la masa común (GND), el amarillo de señal al pin 3 y con el rojo de alimentación hay varias opciones...

...la alimentación de un servo tiene ciertos condicionantes, no sólo en referencia a la tensión (entre 4,5 y 6 volts), si no también a la intensidad que necesita, porque la acción mecánica del servo se basa en un pequeño motor eléctrico que ataca a una serie de engranajes desmultiplicadores de giro (y por tanto multiplicadores de fuerza), los cuales, a través del eje de salida mueven el brazo actuador, y su consumo depende de dos cosas: del pico de corriente al activarse, y del considerable aumento tanto de este pico como del consumo constante que se produce si este servo debe mover además algo que le oponga resistencia.

Para una prueba experimental con el servo libre (sin que tenga que ejercer ninguna fuerza mecánica), y siempre que sea del tipo pequeño llamado "de 9 gramos" (más o menos el peso del servo) que normalmente figura en los materiales del Arduino Starter Kit, podemos hacer varias cosas:

1) Si alimentamos la placa Arduino sólo a través del USB del ordenador, podemos conectar la alimentación del servo (cable rojo) a pin Vin, el cual recibirá algo más de cuatro voltios y medio. En este caso no cargamos la placa del Arduino aunque sí la salida USB del ordenador. Además, el brazo del servo se moverá algo lentamente con las órdenes

2) Si alimentamos la placa Arduino a través de su conector con 4 pilas de 1,5V, la tensión será de 6 volts. Podemos seguir tomando la corriente positiva del pin Vin, y en este caso, al recibir el servo los 6 volts, se moverá mucho más rápido.

3) Si alimentamos la placa Arduino a través de su conector con 6 pilas de 1,5V, la tensión será de 9 volts, demasiado alta para alimentar el servo en Vin, con lo cual deberemos enchufarlo a +5V, tensión que pasa a través del regulador AMS1117 de la placa y que puede estar al límite de su capacidad. Bien, también así va a funcionar, pero yo no lo aconsejo, porque nos podemos cargar el componente.

4) Para mí, la mejor opción y además autónoma, es fabricarnos un pack de pilas de alimentación, que puede llevar 6 unidades (6x1,5=9 volts), pero con una toma "intermedia" entre la cuarta y quinta pila, con lo cual dispondremos de salidas de 0 (masa), +6 y +9. El Arduino se alimentaría a través del +9 y el servo, de forma separada, a +6 volts.

Pack de pilas 0-6-9 volts
Imagen

Además, en todos estos casos, colocaremos entre la masa y el terminal positivo del servo dos condensadores, uno electrolítico de cierta capacidad y uno de poliéster de baja capacidad. Dichos condensadores tiene la misión de eliminar o disminuir la caída de tensión brusca que produce el pico de arranque del servo. El electrolítico efectuará la mayor parte del filtrado, y el de poliéster se ocupará de los componentes de alta frecuencia que siempre se producen en los transitorios y que la impedancia del electrolítico le impide eliminar...

Montaje con el Arduino para mover el servo mediante el mando a distancia por infrarrojos
Imagen

Enlace al programa "Arduino-Servo-IR-07.ino:
https://dl.dropboxusercontent.com/u/559 ... -IR-07.ino


**Programa**
====================================
/*
Control de un servo mediante un mando a distancia por infrarrojos
Modificado por Anilandro, 2016
*/

#include <Servo.h> //Importamos la librería para controlar servos
#include <IRremote.h> //Importamos la librería para recibir la señal de infrarrojos

Servo servomotor; //Nombre del servo
int RECV_PIN = 11; //Pin del receptor IR
IRrecv irrecv(RECV_PIN);//Establecer el pin del IR
decode_results results; //Variable del código NEC
int posicion; //Variable global para establecer la posición angular del servo

void setup()
{
irrecv.enableIRIn(); //Inicializamos el receptor IR
servomotor.attach(3); //Asociamos el servo al pin 3 del Arduino
posicion=90; //Ponemos el servo a 90º al iniciar el programa
}

void loop() // Inicio del bucle del programa
{
if (irrecv.decode(&results)) //Si el receptor IR recibe una señal, entra dentro de la función
{
switch(results.value) //Después de obtener el código NEC almacenado en "results.value" compara casos
{
case 0b111111110110001010011101: //Código NEC boton CH y posición del servo a 90º
posicion=90;
break;

case 0b111111111110001000011101: //Código NEC boton CH- y posición del servo a 20º
posicion=20;//Posición del servo a 0º
break;

case 0b111111111010001001011101: //Código NEC boton CH+ y posición del servo a 160º
posicion=160;
break;

case 0b111111110010001011011101: //Código NEC boton >> y posición del servo +5º
posicion=posicion+5;
if(posicion>160){posicion=160;} //límite por si seguimos subiendo sobre 160º
break;

case 0b111111110000001011111101: //Código NEC boton << y posición del servo -5º
posicion=posicion-5;
if(posicion<20){posicion=20;} //límite por si seguimos bajando de 20º
break;
}
irrecv.resume(); //borra buffer IR
}
servomotor.write(posicion); // mueve el servo a la posición angular especificada
}


===================================

Continuará...

Un saludo a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#43 Mensaje por Anilandro »

Bueno, a venido el cartero y me ha traído otro de los pedidos de gatchets para el Arduino que realicé hace unos 12 o 13 días. Se trata de un pack de 37 sensores que han venido de China por 14€...

Imagen


Una vez desplegados sobre la mesa tienen el siguiente aspecto:

Imagen


El listado de las cosas que hay dentro es:

1 Sensor lineal Hall con 4022LD
1 Contacto Reed con LM393
1 Detector de llama con LM393
1 Sensor digital de temperatura con LM393
1 Sensor de contacto Darglinton KSP13 con LM393
1 Micro de condensador con LM393 sonidos fuertes
1 Micro de condensador con LM393 sonidos débiles

1 Relé 5V con transistor y protección
1 Encoder de giro
1 Joy stick de 2 ejes con potenciómetros e interruptor

2 Sensores de posición de mercurio con 1 LED
1 Sensor de mercurio
1 Zumbador activo
1 Zumbador pasivo

1 Sensor IR
1 Diodo láser
1 Sensor de temperatura y humedad
1 Sensor óptico de giro de rueda perforada

1 Led tricolor intermitente
1 Led emisor infrarrojos
2 Led bicolor
1 Led tricolor normal
1 Led tricolor SMD
1 detector de òptico de latidos (led+fotodiodo)

1 Emisor-receptor de seguimiento IR con LM393
1 Emisor-receptor detector de obstáculos con HC00AG
1 LDR
1 Pulsador
1 Sensor analógico temp NTC
1 Sensor de vibración
1 Termómetro programable Dallas 18B20
1 Sensor analógico hall 3144
1 Linear hall sensor 49B 601BG
1 Interruptor de bola

El caso es que salvo esta bolsa en un pequeño sobre proveniente de GuanZhou, no hay nada más, ni una simple hoja informativa, pero rebuscando en Internet encuentras de todo, como una imagen general descriptiva y también circuitos concretos de aplicación...

Imagen

En resumen y por el precio es un regalo, aunque algunas cosas están repetidas o son simples componentes soldados en un pequeño CI sin ningún componente adicional. A algunos de ellos sin duda le sacaremos utilidad...

Un saludo a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

XBaroman
Mensajes: 167
Registrado: Dom Feb 13, 2011 7:04 pm
País: España
Ciudad: Alnorte

Re: Mis primeros pasos con Arduino

#44 Mensaje por XBaroman »

Hola Anilandro.
Como siempre interesantes aportes, yo por mi parte no consigo tiempo suficiente para profundizar ... pero lo seguiré intentando.

En esta página encontraras tutoriales, esquemas etc. que te harán ganar tiempo.

https://www.adafruit.com/category/35

Un saludo.

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#45 Mensaje por Anilandro »

Muy interesante el link XBaroman, hay sensores para muchos usos, algunos incluso que no es normal encontrar. Los precios algo caros, pero se supone que serán de mayor calidad que los vendidos "a peso".

En otro orden de cosas, hace un par de días, un amigo me comentó que en las lecturas analógicas de tensión con el Arduino veía valores muy raros. Me pasó algunas cifras y en efecto, no sólo era que las tensiones fueran muy distintas, si no que además carecieran de linealidad, cesando de subir además a los 3 volts.

...Si necesitamos obtener valores reales, algunos de estos problemas tiene fácil solución con una simple operación matemática, pero el de falta de linealidad es más complejo, porque exige una tabla de correcciones que abarque todo el rango dinámico, lo cual lleva trabajo obtener y absorbe mucha memoria al implantarse en micros tan pequeños como el Atmega328, con sólo 2K de RAM y 32K de flash...

...Pero como la cosa me sonaba extraña, he realizado mis propias pruebas. Primeramente he comparado las lecturas de mis dos tésters digitales, un UNIT-T-5215 de mediana calidad, y un LUTRON DM-9093 de calidad excelente, entre 0 y 6 volts (medidos en la escala de 20V), observando que apenas diferían en más o menos una unidad al tercer dígito, lo que me daba un concordancia media superior al 99%

Comparando las lecturas de mis dos tésters digitales

Imagen


Seguidamente cargo en el Arduino un sencillo programa de lectura de un pin analógico que me envía la lectura en formato digital de 10 bits (0-1024) al monitor serie del PC. Anoto unas 15 medidas de tensión, más cercanas entre ellas en los valores bajos, en donde se supone que puede haber más porcentaje de error.

Lectura de valores digitales de tensión entre 0 y 6 volts, comparando con la lectura del téster

Imagen


Coloco los datos resultantes en un eje de coordenadas, con las tensiones medidas en el eje Y y su valor digital (0-1024) en el eje X, y luego de unir el cero y el punto de (5v/1024d) con una recta observo que la linealidad de todas las medidas es excelente, también con valores de concordancia que superan el 99%, y eso, teniendo incluso en cuenta el error que pueda haber cometido al dibujarlos a mano sobre una escala tan pequeña...

Gráfica de tensión real y lectura digital que muestra una absoluta linealidad

Imagen

Es decir, la relación entre la tensión real y su valor de medida digital se mantiene sin variación apreciable en toda la gama dinámica, truncándose, naturalmente a partir de 5 Volts, en que el valor digital ha alcanzado el máximo para un número de 10 bits, el 1.024. Seguidamente, añado al programa del Arduino la línea:

V_analog = V_digital x 5 / 1024 ;

...y entonces ya me aparece en el monitor serie del PC el valor real de tensión, que a igual que ocurría con la comparación entre dos tésters, sólo varía con el medido por el LUTRON en más o menos una unidad al tercer dígito...

Valores reales de tensión medidos, que apenas varían con el téster en una unidad al tercer dígito

Imagen


El hecho extraño que las tensiones medidas por mi amigo no suban de los 3 volts tiene su explicación cuando me muestra su placa. Resulta que es un Arduino UNO, en efecto, pero no original y ni siquiera una copia china que pretenda parecerse, sino una versión con un microcontrolador distinto en formato SMD, alimentado a 3,3 volts, y por tanto, la comparación en el conversor A/D debe alcanzar el valor de 1024 a esta tensión y no a 5 volts como el mío. Naturalmente, esto sigue sin explicar la aparente falta de linealidad a bajos valores de tensión, problema que yo no he observado, y que supongo se ha debido a errores de lectura.

Un saludo a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#46 Mensaje por Anilandro »

Volviendo al tema del control de la placa Arduido desde el ordenador, lo siguiente que haremos es que las órdenes que le damos a través del mando a distancia de infrarrojos aparezcan el el PC. Para esto deberemos modificar su programa, añadiendo las órdenes de comunicación serie necesarias, que en el siguiente listado hemos marcado en rojo...

===================================
/*
Control de un servo mediante un mando a distancia por infrarrojos
Modificado por Anilandro, 2016
*/

#include <Servo.h> //Importamos la librería para controlar servos
#include <IRremote.h> //Importamos la librería para recibir la señal de infrarrojos

Servo servomotor; //Nombre del servo
int RECV_PIN = 11; //Pin del receptor IR
IRrecv irrecv(RECV_PIN);//Establecer el pin del IR
decode_results results; //Variable del código NEC
int posicion; //Variable global para establecer la posición angular del servo

void setup()
{

Serial.begin(9600); //Inicializamos comunicación serie
while (!Serial){;} // espera a que la conexión se establezca
Serial.println(" *** Arduino OK ***"); // indica al ordenador que se ha establecido la comunicación
[/color]
irrecv.enableIRIn(); //Inicializamos el receptor IR
servomotor.attach(3); //Asociamos el servo al pin 3 del Arduino
posicion=90; //Ponemos el servo a 90º al iniciar el programa
}

void loop() // Inicio del bucle del programa
{
if (irrecv.decode(&results)) //Si el receptor IR recibe una señal, entra dentro de la función
{
switch(results.value) //Después de obtener el código NEC almacenado en "results.value" compara casos
{
case 0b111111110110001010011101: //Código NEC boton CH y posición del servo a 90º
posicion=90;

Serial.print(" IR CENTRO: ");
Serial.println(posicion);

break;

case 0b111111111110001000011101: //Código NEC boton CH- y posición del servo a 20º
posicion=20;//Posición del servo a 0º

Serial.print(" IR MAXIMO: ");
Serial.println(180-posicion);

break;

case 0b111111111010001001011101: //Código NEC boton CH+ y posición del servo a 160º
posicion=160;

Serial.print(" IR MINIMO: ");
Serial.println(180-posicion);

break;

case 0b111111110010001011011101: //Código NEC boton >> y posición del servo +5º
posicion=posicion+5;
if(posicion>160){posicion=160;} //límite por si seguimos subiendo sobre 160º

Serial.print(" IR BAJA 5: ");
Serial.println(180-posicion);

break;

case 0b111111110000001011111101: //Código NEC boton << y posición del servo -5º
posicion=posicion-5;
if(posicion<20){posicion=20;} //límite por si seguimos bajando de 20º

Serial.print(" IR SUBE 5: ");
Serial.println(180-posicion);

break;

case 0b111111111100001000111101: // añade un espacio entre líneas a monitor PC
Serial.println("");
break;


}
irrecv.resume(); //borra buffer IR
}
servomotor.write(posicion); // mueve el servo a la posición angular especificada
}

===================================


Sobre este programita es necesario realizar dos aclaraciones:

1) Si nos fijamos en la segunda orden "case", observaremos que la posición de servo 20º, en realidad envía el dato "IR MAXIMO" y el valor 160, como si en realidad el servo tuviera el brazo en el estremo contrario, y esta aparente incongruencia se mantiene en los tres "case" siguientes. Pues bien, no hay ningún error en ello, es solamente que una vez montado todo el sistema he visto que el servo "va al revés" y que al aumentar los grados de la variable "posición" no gira en sentido horario, si no antihorario. Para que los datos parezcan más lógicos a la vista, lo que hago es "invertir" el sentido de los mensajes y así coinciden con el movimiento que observamos.

2) Lo segundo es que he añadido una orden "case" completa, que no corresponde a ningún movimiento del servo, sino que solamente añadirá una línea en blanco al listado que aparezca en el PC, para así poder separar secuencias de movimiento.

De momento leeremos estos datos en el monitor serie del programa IDE o bien desde el HyperTerminal de Windows, donde nos aparecerán mensajes como los de la siguiente imagen...

Imagen


Continuará...
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#47 Mensaje por Anilandro »

Ya sé que la misma información la he publicado en otro hilo, en el del sistema de adquisición de datos con el Lutron, pero como es relativa al Arduino y, está bien que también aparezca aquí.

Este mediodía he recibido otro de los gadchets que pedí para el Arduino. Era uno de los que más me interesaban, la "Arduino Ethernet Shield" procedente de Hong Kong...

Imagen


...este módulo provee al Arduino capacidad de comunicación y control a través de una red interna o de Internet, disponiendo además de un lector/escritor de tarjetas microSD.

Ya he visto varios proyectos interesantes con esta placa, como el de transferencia de archivos o un miniservidor web... veremos que sale de ello...

Un saludo a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#48 Mensaje por Anilandro »

Poco a poco siguen llegando "gadchets" de los que pedí a principios de mes. Ahora le ha tocado el turno a una pantallita TFT en color de 128x160 pixels, que además está equipada con una base para tarjetas SD... tengo ganas de acabar el programa del Lutron y volver exclusivamente al Arduino... un amigo ya está trabajando con el reloj en tiempo real y con la base de tarjetas de memoria uSD...

Imagen


Imagen


...Algunos de los textos e imágenes que pueden representar este tipo de pantallitas


Imagen

Imagen

Un saludo a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#49 Mensaje por Anilandro »

Aunque comienza a darme un poco de vergüenza seguir mostrando nuevos materiales mientras tengo el Arduino semi-abandonado por tener que dedicar todo mi tiempo libre al programa de "adquisición de datos", sigo recibiendo elementos que pedí hace casi un mes para esta placa microcontroladora. En este caso me ha llegado un pequeño módulo GPS, de tan sólo 8 €, que según dicen compañeros que lo están usando, va de maravilla...

Imagen


Saludos a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Avatar de Usuario
Anilandro
Mensajes: 4905
Registrado: Dom Feb 11, 2007 10:16 pm
Ubicación: Islas Baleares, España
Contactar:

Re: Mis primeros pasos con Arduino

#50 Mensaje por Anilandro »

Una nueva placa para el Arduino. Se trata de un módulo WiFi, de unos 6 €, enviado directamente desde China...

Imagen


Saludos a todos
La VIDA sólo es energía que ha aprendido a defenderse... (Anilandro)

*** La Web de Anilandro *** http://sites.google.com/site/anilandro

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados