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

#21 Mensaje por Anilandro »

Yo tengo algunos PICS y un programador, pero nunca he hecho nada con ellos...

El circuito de Arduino-Morse del hablaba antes es:

Imagen

Y el programa:

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

// Programa que emite texto en Morse traducido por: http://www.traductormorse.com/ añadiendo una "f" al final para cerrar la cadena

// Mensaje largo: "sos sos . rms titanic . hemos chocado contra un iceberg . nos hundimos rapidamente de proa"
char mensaje[] = "... --- ... / ... --- ... / .-.-.- / .-. -- ... / - .. - .- -. .. -.-. / .-.-.- / .... . -- --- ... / -.-. .... --- -.-. .- -.. --- / -.-. --- -. - .-. .- / ..- -. / .. -.-. . -... . .-. --. / .-.-.- / -. --- ... / .... ..- -. -.. .. -- --- ... / .-. .- .--. .. -.. .- -- . -. - . / -.. . / .--. .-. --- .- .-.-. f";

// Mensaje corto, sólo dos SOS seguidos
//char mensaje[] = "... --- ... / ... --- ... f";

int longitud; // variable longitud del mensaje
int puntero = 0; // puntero del contador de exploración del mensaje
void punto(); // declaramos función punto()
void raya(); // declaramos función raya()

void setup()
{
pinMode(13, OUTPUT); // pin 13 como salida de LED
pinMode(8, OUTPUT); // pin 8 como salida de sonido
pinMode(7, INPUT); // pin 7 como entrada de botón Start
while(mensaje[puntero]!='f') // cálculo de longitud de la cadena Morse
{
longitud++;
puntero++;
}
}

void loop() // bucle principal de programa
{
delay(1000);
while(digitalRead(7)== HIGH){} // bucle de espera a que se pulse el botón START
delay(1000);

for(int g=0;g<longitud;g++) // bucle interno para leer e interpretar cada uno de los caracteres
{
//delay(50);
if (mensaje[g]=='.') // detecta un punto y llama a su función
{
punto();
}
if (mensaje[g]=='-') // detecta una raya y llama a su función
{
raya();
}
if (mensaje[g]==' ') // detecta un espacio y hace una pausa de 0,3 seg. entre letras
{
delay(300);
}
if (mensaje[g]=='/') // detecta una / y hace una pausa entre palabras de 0,1 seg (a los que se sumarán 2 espacios, en total 0,7 seg)
{
delay(100);
}

}

} // final del bucle principal

//=========== FUNCIONES ========================================

void punto() // interpreta un punto
{
digitalWrite(13, HIGH); // enciende LED en pin 13
beepON(50); // llama a función para generar el sonido del punto
digitalWrite(13, LOW); // apaga el LED
delay(130);
}

void raya() // interpreta una raya
{
digitalWrite(13, HIGH); // enciende LED en pin 13
beepON(200); // llama a función para generar el sonido de la raya
digitalWrite(13, LOW); // apaga el LED
delay(130);
}

void beepON(int dur) // genera sonido del beep de duración variable si es punto o raya
{
for (int f=0; f<dur; f++) // bucle de generación de sonido
{
digitalWrite(8, HIGH); // pone pin 8 de sonido a 1
delay(1); // tiempo en alto del pin 8
digitalWrite(8, LOW); // pone pin 8 de sonido a 0
delay(1); // tiempo mínimo en bajo del pin 8
}
}
==============================================================================
==============================================================================

Si queréis bajar directamente el archivo fuente Morse_Largo.ino, podéis hacerlo en la siguiente dirección:

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

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

#22 Mensaje por Anilandro »

Esta mañana he recibido en un sobre postal dos de los gadchets que pedí para el Arduino, se trata de un lector-escritor de tarjetas microSD, que permite guardar gigas de datos, y una plaquita de reloj en tiempo real. Los precios han sido, del primero 2,55€ y del segundo 2,35€, ambos con portes incluidos...

Imagen

...A ver si durante las vacaciones puedo comenzar a utilizarlos.

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

#23 Mensaje por Anilandro »

Prosiguiendo con el asunto del Arduino, por primera vez he realizado una prueba que comunicación serie. Los primeros Arduinos disponían de un port RS-232, con el que podían comunicarse con el ordenador, pero actuamente casi ningún PC lleva ya este medio de transferencia de datos, habiendo sido sustituido por el conocido USB. Sin embargo, incluso con el USB se emula una transmisión serie y un port COM virtual, aunque para ello es necesario que estén instalados los drivers que permiten reconocerlo.

Veamos las órdenes que nos permitirán efectuar la comunicación:

#include <SoftwareSerial.h> // incluímos la librería con las funciones de comunicación serie

void setup()
{
Serial.bengin(9600); // inicia comunicación a 9600 baundios (pueden ser desde 300 a 250.000)
Serial.println("Comunicacion establecida"); // imprime en el canal recien abierto la frase "Comunicación establecida"
}

...Vale, ¿y cómo podemos ver esta frase escrita en el ordenador? ...pues para ello hemos de abrir un terninal. De hecho el propio IDE del Arduino dispone de uno, que se activa pulsando sobre un botón con una lupa, es el Monitor Serie, situado en la parte superior derecha de la ventana. Cuando se abra la nueva ventana en blanco solamente deberemos ajustar la velocidad en baundios que coincida con la del programa intro en el menú. En caso de equivocarnos no pasa nada, simplemente saldrán un montón de signos extraños, pero si introducimos el 9600, casi al segundo, aparecerá "Comunicación establecida"...

En este momento, si en la línea en blanco superior introducimos algún símbolo o palabra y damos ENTER, será transmitido hacia la placa Arduino, que podrá leerlo símbolo a símbolo (1 Byte cada vez), con la orden:

Serial.read();

...Y luego podremos hacer con dichos datos lo que queramos, desde mostrarlos en un display hasta utilizar los caracteres o los valores ASCII para encender unos LED's, arrancar un motor, o activar alguna función del programa.

Bien, dejémonos de teoría. Compliquemos un poco el asunto y montemos el siguiente circuito:

Imagen

Que adoptará el siguiente aspecto:

Imagen

Continuará...

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
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Mis primeros pasos con Arduino

#24 Mensaje por mister_electronico »

La ventaja que le veo a los arduinos es que como estan popularizados, los chinos se los han chapado y por eso tienen precios muy baratos que funcionan bien.

La ventaja de todas estas placas es no tener que hacer el PCB que siempre es un coñazo sobre todo con microcontroladores de gran numero de patillas en SMD, lo cual es un coñazo para montarlos a un precio asequible.

Freescale tiene el FRDM-KL25Z que a mi me salio sobre los 10 euros que comparado con los arduinos tiene mas prestaciones.

Tengo un montón de microcontroladores que compre en su día de PIC en SMD, pero la verdad es que nunca acabo montándolos por la pereza que me da montar la placa.

La verdad es que espero que los fabricantes como Microchip y otros se animen a montar tipos placas prototipo básicas esto es con el micro y integrado de comunicación a precios asequibles, por que si bien entiendo el coste de desarrollo de programa ( Que ya casi todos los están dando gratis ), lo que no encuentro de recibo es que por una placa básica como la que digo me estén queriendo cobrar el precio de un Receptor de un TDT.

Y lo que desde luego no pienso es ya que vivimos en un economía de libre mercado y en la que las grandes multinacionales se encargaron muy mucho de cargarse los sistemas arancelarios, es pagar un duro a intermediarios, si vamos acabar al final trabajando por el plato de arroz... que acabemos todos.

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

#25 Mensaje por Anilandro »

Sí, la verdad es que los promotores de Arduino y los fabricantes que se han metido en ello han tenido la vista que les ha faltado a otros, lo que siempre he pregonado de ofrecer las cosas claras, de no agobiar al que empieza con programaciones e instrucciones complicadísimas o tener que crear y soldar tus propias placas. Con Arduino se puede comenzar poco a poco, y encima todo es baratísimo. No es una placa de prestaciones, pero para su intención didáctica tampoco las necesita. El Arduino DUE ya es distinto, puesto que lleva un micro ARM a 86 Mhz, 500 KB de flash, 54 entradas-salidas, etc, etc. También he comprado uno por 14€, que me llegará supongo en 15 días.

Yo compré algunos Microchip 16Fxxx y tengo una placa programadora, pero luego compré una MiniSTM-32 y con el trabajo inmenso que me dio sacarle algunas cosas, se me quitaron las ganas de proseguir con placas y micros sin digerir...

...Y de los SMD ya ni hablo, con la vista que he perdido son como cagaditas de mosca, y tampoco tengo experiencia en realizar circuitos impresos con pistas tan delgadas y próximas entre ellas, los que yo hacía hace años eran casi neandertales comparados con los de hoy en día... :)

Saludos
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

#26 Mensaje por Anilandro »

Siguiendo con el tema de las comunicaciones serie con Arduino, el programa de control será el siguiente:

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

// Prueba de enviar y recibir datos serie. Pulsadores desde el Arduino y encender y apagar dos LED's desde el ordenador

#include <SoftwareSerial.h>
int puntero1=1; // veces que se ha pulsado el botón 1
int puntero2=1; // veces que se ha pulsado el botón 2

void setup()
{
pinMode(6, INPUT); // pin 6 como entrada digital donde conectaremos el pulsador 1
pinMode(7, INPUT); // pin 7 como entrada digital donde conectaremos el pulsador 2
pinMode(2, OUTPUT); // pin 2 como salida digital donde conectaremos el LED verde
pinMode(3, OUTPUT); // pin 3 como salida digital donde conectaremos el LED rojo
pinMode(13, OUTPUT); // pin 13 como salida digital (aunque no lo vamos a usar)
digitalWrite(2, LOW); // salida de pin 2 a 0
digitalWrite(3, LOW); // salida de pin 3 a 0
digitalWrite(13, LOW); // salida de pin 13 a 0 (sólo para que el LED de la placa no esté encendido)

Serial.begin(9600); // establecemos la comunicación serie a 9600 baundios
while (!Serial){;} // espera a que la conexión se establezca
Serial.println("Comunicacion establecida con Arduino"); // indica al ordenador que se ha establecido
}

void loop()
{
while (digitalRead(6)== HIGH && digitalRead(7)== HIGH) // espera a que se pulse un botón
{
int dato=Serial.read(); // mientras tanto lee un byte enviado desde el ordenador
if (dato!=-1) // -1 indica que no hay datos que leer
{} // se puede intercalar una orden de monitorización de los valores entrados

if (dato==49) // ASCII que corresponde "1"
{
digitalWrite(2, HIGH); // enciende el LED del pin 2
}
if (dato==50) // ASCI1
I que corresponde a "2"
{
digitalWrite(2, LOW); // apaga el LED del pin 2
}
if (dato==51) // ASCII que corresponde "1"
{
digitalWrite(3, HIGH); // enciende el LED del pin 2
}
if (dato==52) // ASCII que corresponde a "2"
{
digitalWrite(3, LOW); // apaga el LED del pin 2
}

}
if (digitalRead(6)== LOW) // detecta pulsar botón 1
{
String cadena = String (puntero1);
String cadenaF = "Boton 1 "+ cadena;
Serial.println(cadenaF);
puntero1++; // suma 1 a puntero 1
}
if (digitalRead(7)== LOW) // detecta pulsar botón 2
{
String cadena = String (puntero2);
String cadenaF = "Boton 2 "+ cadena;
Serial.println(cadenaF);
puntero2++; // suma 1 a puntero 1
}
while (digitalRead(6)== LOW || digitalRead(7)== LOW){} // espera a que deje de pulsarse un botón
delay(100);

}

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

El programa en fichero "Arduino-03-Serial.ino" lo podéis bajar del enlace:

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

Bien, una vez construido el circuito y cargado el programa, en el monitor serie del IDE de Arduino del PC nos ha de aparecer el mensaje que indica que se ha establecido la comunicación serie. En este caso "Comunicación establecida con Arduino"

Imagen

Si ahora pulsamos el botón Nº1 de la placa...

Imagen

...Nos aparecerá en el monitor serie:

Imagen

...Pulsando más veces, tanto el botón 1 como el 2, veremos que van apareciendo en filas sucesivas, con su identificación de número y las veces que se ha pulsado en esta sesión:

Imagen

Continuará...

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
Alfon
Mensajes: 1432
Registrado: Dom Mar 04, 2007 10:44 pm
País: España
Ciudad: Figueres
Ubicación: Gerona/España
Contactar:

Re: Mis primeros pasos con Arduino

#27 Mensaje por Alfon »

Hola Anilandro y gente.
Un truquillo del Arduino que hago servir, para ahorrarme componentes, es suprimir las presistencias de pull-up que has puesto de 1K, no hacen falta.
Internamente el micro lleva unas resistencias de 10K que las puedes activar a masa o a +5V, así te ahorras algunos componentes externos.
El código para activarlas es sencillo, tomando tus líneas donde defines:
pinMode(6, INPUT); // pin 6 como entrada digital donde conectaremos el pulsador 1
pinMode(7, INPUT); // pin 7 como entrada digital donde conectaremos el pulsador 2
digitalWrite(6, HIGH); // Activa resistencia pull-up interna
digitalWrite(7, HIGH); // Activa resistencia pull-up interna


En caso de querer activar la resistencia a masa, y dar 5V cuando apretas el botón, sería lo mismo pero:
digitalWrite(6, LOW); // Activa resistencia pull-down interna
....

Saludos
El saber no ocupa lugar, pero sí tiempo ^_^
-- Personal --> www.bitacoradealfon.es <--
-- Comercial --> www.altortech.es <--

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

#28 Mensaje por Anilandro »

Gracias Alfon, sabía de la existencia de las resistencias internas programables en las entradas en el caso de los ARM de 32 bits, ya que lo utilicé con la placa MiniSTM32, pero no que el Atmega-328 tuviera también esta posibilidad. Realmente están muy bien pensados estos procesadores.

Imagen


¿Sabes si el 328 también permite configurar las salidas como push-pull o como colector abierto?

Imagen

Saludos
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
Alfon
Mensajes: 1432
Registrado: Dom Mar 04, 2007 10:44 pm
País: España
Ciudad: Figueres
Ubicación: Gerona/España
Contactar:

Re: Mis primeros pasos con Arduino

#29 Mensaje por Alfon »

Hola Anilandro.
Sí, la puedes dejar en colector abierto. (me imagino que es lo que pienso que es, dejar la salida sin conectar a 5V y tampoco a 0V, dejarla libre de potencial).
No se si es la mejor forma de hacerlo, pero yo lo hago fácil:
void(){
digitalWrite(6, LOW); // Pone la salida a 0V
delay(1000);
pinMode(6, OUTPUT); // define de nuevo la salida y al definirla se pone en colector abierto por defecto
delay(1000);
}
Supongo que habrá la instrucción para hacerlo en ensamblador, pero como eso cambia en cada micro, pues yo lo hago así.
Funciona con todos, Atmega32u4, atmega328, 168, 1280, 2560.

Yo normalmente no lo recomiendo de dejar a colector abierto, por que se convierte en una antena captadora de perturbaciones extraordinariamente fiable, o sea que una chispa de un relé que tengas cerca te provoca tensiones en el terminal libre y provoca "cuelgues" del micro.
Creo que lo comenté en otros hilos, las salidas o entradas siempre que no se vayan a utilizar, se definen como salidas y a 0V, así no habrá entradas de alta impedancia que puedan captar perturbaciones. Esto sumado a un watchdog (hay librería), pues convierten a los arduinos en fiables al 99,9% en entornos industriales.
(no hay micro fiable al 100%, ni siquiera los profesionales, todos disponen de watchdog y la experiencia demuestra que a veces también se cuelgan, por eso en procesos críticos se utilizan dobles procesadores que funcionen en modo redundado).

Saludos
El saber no ocupa lugar, pero sí tiempo ^_^
-- Personal --> www.bitacoradealfon.es <--
-- Comercial --> www.altortech.es <--

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

#30 Mensaje por Anilandro »

Seguiré tus consejos, Alfon, a veces no tenemos en cuenta que los transitorios y las señales parásitas pueden echar a perder un circuito que parecía adecuado. En electrónica analógica siempre he tenido mucho cuidado con las masas y especialemente con las partes de alta impedancia. En los digitales TTL no es tan importante por su baja impedancia que las cosas funcionan por umbral, pero en los cmos otra vez nos encontramos con estos problemas, y no digamos cuando hay radiofrecuencia de por medio.

Para el pull-up he encontrado una orden directa. Se trata de "pinMode(pin, INPUT_PULLUP)", pero no existe su equivalente "INPUT_PULLDOWN", con lo cual mejor hacerlo como me has indicado.

El watchdog aún no lo he utilizado para nada, pero sin duda deberé implementarlo en el contador de vehículos.

Saludos

Llorens
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 1 invitado