Acuariofilia Madrid

Versión completa: Aula Arduino para principiantes.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Entoces antonio tengo que poner el i2c o no , que ya me lo he comprado y lo tengo por si acaso, esta noche intentare hacerlo y ya te dire algo.
Este programa está asumiendo que el Display es un LCD 20x4 I2C.
Demo botonera
Fecha de Compilacion
Jun 14 2014 08:54:49

<<BEEP>>
Inicializando...
RTC Parado!
<<BEEP>>

<<BEEP>>
FIN INI (12s)
Memoria libre=894

<<BEEP>>
Botoneras activas en
3 segundos.
<Tick>
SEL( 966) 145
Pero ya no hace nada conforme voy presionando botones.
En primer lugar: te quedan solo 894 bytes libres.
Arduino UNO tiene 1K de memoria SRAM y te quedan 894 bytes. En principio parece que tienes bastante memoria, pero Arduino Mega 2560 tiene 8Kb y los cuelgues suelen tener que ver con la gestión de la memoria.

Faltan cosas importantes por implementar cosas que consumirán más memoria, tales como gestionar el fotoperiodo y el dimmer y gestión de menús. Ojalá tuviera un Arduino UNO para probar con él.

En segundo lugar dice:
SEL( 966) 145

Te ha identificado el pulsador central, pero este debería entregar SEL(1023) 145

El valor 145 indicaría que ese boton central ha sido presionado durante 14 segundos y medio.
Podría existir algún problema hardware con la botonera. Repasa ese montaje.

En tercer lugar:Dice RTC parado, pero ese error solo debería aparecer una vez en un primer intento. La segunda vez que lo arranques debería funcionar, porque al fallar en un primer intento opta por poner ajustar la hora y fecha del RTC con la hora y fecha de compilación.

Podría existir algún problema hardware con el RTC o con el bus I2C.

El objetivo de este programa era validar el hardware, y parece que en ese terreno hay más de un problema.

Cosas que puedes hacer:
1) Puedes repasar el hardware de la botonera.

2) Puedes descargar programas Arduino especificamente orientados a probar cada uno de los componentes. Concretamente hay que averiguar por qué parece no ir bien el RTC.

Cosas que yo podría hacer:
1) Por mi parte, puedo desarrollar un programita de aún más bajo nivel para leer la entrada analógica de la botonera para intentar descartar problemas de interferencias eléctricas.
A mí la botonera me va de lujo. Estoy navegando por una serie de menús usando esta botonera.

2) Poco más podría hacer, porque no soy muy dado a simplificar el código, piensa que para poder poner en hora el reloj necesitas un display y una botonera. También veo muy necesario un sistema de menús.

El hecho de que a mí me funcione en Arduino 2560 no significa que esté libre de bugs. Los fallos pueden ponerse de manifiesto en condiciones muy concretas y la cantidad de memoria disponible es una de ellas. Se que esta vez no te estoy ayudando mucho, pero con los datos que tengo poco más se me ocurre.

Sobre los tres distintos tipos de memoria que usan las diferentes placas de Arduino y para que sirven puedes mirar esto:
http://playground.arduino.cc/Learning/Memory
[Imagen: 5s46Fy0.jpg]
[Imagen: cTsDAUv.jpg]
[Imagen: vUJieZK.jpg]
[Imagen: 29cs0mq.jpg]
Ya te he comentado que parece haber más de un problema. ¿Has intentado hacer algo de lo que te he sugerido?

Prueba el RTC con esto
http://www.instructables.com/id/Arduino-...nd-Sketch/

La dirección I2C de tu display no tiene por qué coincidir con la de mi display. La tuya va a través de un módulo y dudo mucho que todos los módulos usen la misma dirección I2C. No tienes un hardware igual que el mío.

Imagino que estarás leyendo todo lo relativo a tu hardware.

La demo sirve para detectar problemas no para solucionarlos. Mientras no consigas hacer funcionar esa demo vas mal.

Estoy desarrollando un programita para chequear la entrada analógica para poder decirte algo más porque mi bolita de crisyal se me ha estropeado y no consigo ver que es lo que pasa a tu botonera.

Entre tanto, yo creo que hay un montón de cosas que tú puedes investigar por tu cuenta.
El programa que viene a continuación va escaneando las entradas analogicas desde A0 hasta A5 y después de hacer un elevado número de lecturas obtiene el valor promedio de todas ellas y la desviación estandar.

Para una situación sin variaciones a la entrada el valor de la desviación estandar en ese pin debe ser 0 salvo que el pin esté desenchufado o capte interferencias. En esos casos la lectura de esa entrada será un tanto aleatoria y el valor de desviación estandar sube.

La utilidad del programa es medir la calidad de las conexiones a los pines con entradas analógicas. Por ejemplo si durante el funcionamiento de este programa tocas con los dedos algún cable relacionado con una entrada analógica entrarán interferencias y la desviación estandar aumentará.

En nuestro caso tiene utilidad para verificar los valores obtenidos manteniendo pulsado algún botón.

Código:
/*
    (C) Antonio Castro Snurmacher (ciberdroide.com)
    Licencia de uso: Creative Commons Attribution
    EstadisticasAnalogRead.ino
*/
// ******************************************************************************************************
#include <Arduino.h>

#define PinINI A0
#define PinFIN A5

#define NUM_ITER_ANALOG_R   200L // Numero de veces que hacemos una lectura analogica
#define MICROSEG_ANALOG_R   50 // Espera entre lecturas analogicas individuales

// *****************************************
long MultiRead(int Pin){
    long ValProm=0L;

    for (int i=0; i<NUM_ITER_ANALOG_R; i++){
        ValProm += analogRead(Pin);
        delayMicroseconds(MICROSEG_ANALOG_R);
    }
    ValProm /= NUM_ITER_ANALOG_R;
    return ValProm;
}

// *******************************************
void TestAnalogReadPin(int Pin){
    long ValProm=0L;
    long DesvSt=0L;
    long Desv;

    for (int i=0; i<NUM_ITER_ANALOG_R; i++){
        ValProm += MultiRead(Pin);
    }
    ValProm /=NUM_ITER_ANALOG_R;
    for (int i=0; i<NUM_ITER_ANALOG_R; i++){
        Desv=(ValProm - MultiRead(Pin));
        DesvSt =  DesvSt + (Desv*Desv) ;
    }
    DesvSt= sqrt(DesvSt);
    Serial.print(Pin -A0);
    Serial.print(")  Media=");
    Serial.print(ValProm);
    Serial.print(" DesvEstd=");
    Serial.println(DesvSt);
}


// *************************************
void ScanAnalogInputs(){
    for (int i=PinINI; i<=PinFIN; i++){
        TestAnalogReadPin(i);
    }
}

// **************************
void setup(void) {
    Serial.begin(9600);
    Serial.println("TEST Entr.Analog.");
    Serial.println("Fecha Compilacion");
    Serial.print(__DATE__);
    Serial.print("  ");
    Serial.println(__TIME__);
}

// ********** LOOP **********
void loop(void) {
    ScanAnalogInputs();
    Serial.println("====================");
    delay(2000);
}
TEST Entr.Analog.
Fecha Compilacion
Jun 16 2014 17:45:41
0) 21 Media=21 DesvEstd=215
1) 7 Media=7 DesvEstd=21
2) 56 Media=56 DesvEstd=12855
3) 36 Media=36 DesvEstd=418
4) 8 Media=8 DesvEstd=36
5) 9 Media=9 DesvEstd=36
====================
0) 9 Media=9 DesvEstd=46
1) 7 Media=7 DesvEstd=23
2) 1022 Media=1022 DesvEstd=0
3) 41 Media=41 DesvEstd=470
4) 10 Media=10 DesvEstd=26
5) 15 Media=15 DesvEstd=36
====================
0) 10 Media=10 DesvEstd=49
1) 8 Media=8 DesvEstd=25
2) 1022 Media=1022 DesvEstd=0
3) 39 Media=39 DesvEstd=453
4) 10 Media=10 DesvEstd=25
5) 14 Media=14 DesvEstd=34
====================
0) 9 Media=9 DesvEstd=47
1) 7 Media=7 DesvEstd=24
2) 1022 Media=1022 DesvEstd=0
3) 40 Media=40 DesvEstd=464
4) 10 Media=10 DesvEstd=28
5) 14 Media=14 DesvEstd=36
ESTO ES LO QUE ME SALE A MI TESTEANDOLO UNAS VECES
Bueno te habrás fijado que sobra el primer "Serial.print(ValProm);"
Acabo de editar la entrada anterior y he suprimido esa sentencia que sobraba.

Compruebo que tienes la botonera en el pin A2.

El valor que está entregando '1022' es el que corresponde a tener apretado el botón central todo el rato. Eso es lo que parece haber ocurrido salvo en el primer intento que seguramente se recibió una mezcla de situaciones diferentes en el teclado mientras el programa exploraba los valores de esa entrada. 1023 equivale a 5voltios en la entrada analogica que es lo que debe recibir al pulsar el boton central SELECT.

Ignoro si todo eso se corresponde con lo que ha ocurrido realmente, pero eso es lo que ha detectado este test. Si no estabas apretando ningún botón o estabas apretando algo diferente algo va mal.

Más cosas. Recuerdo que tu display lo hiciste funcionar en alguna prueba anterior. Deberías repetir esa prueba pero utilizando el módulo I2C y averiguar si la dirección que usó mi programa 0x27 es la que corresponde a tu display. Sé de algunos displays que usan la 0x20 y podrían usar algún otro valor diferente.

Puede que el cuelgue tenga que ver con un dispositivo hardware que no se pudo inicializar.

El Buzzer que he visto en la foto me parece que es de los que usan corriente continua y tienen un oscilador en su interior. También lleva un disco piezoelectrico en su interior, pero lo que yo hago es proporcionarle las frecuencias de oscilación. ¿El tuyo usa una frecuencia fija y va con corriente continua verdad? Le estamos mandando corriente continua de pulsos. Si es como te digo el resultado acústico de usar algo así es imprevisible.

Tienes que tener muy presente el tipo de hardware que usas. En el mundo Arduino no hay nada que se parezca a dispositivos estandar. El Arduino se puede adaptar casi a cualquier cosa que le pongas. La imaginación es el límite, pero hay que ser muy consciente de que cada cosa que le pongas puede necesitar una librería o una configuración diferente.
A ver , he estado haqciendo varias pruebas y un problema que me encuentro ahora es que cuando conecto el GND y el VCC del RTC el display se enciende , pero cuando le conecto los otros dos ( SCL y SDA ) empieza a parpadear el display, eso por un lado , el zumbador va perfeco hace sus pitidos en su orden y funciona, la botonera no me hace nada, no se como vamos a arreglar este cacao maravillao antonio, mandame una foto de como lo tienes tu hecho a ver si se me enciende la luz.
Respecto a las pruebas del RTC ....como lo hago , explicame un poco mas, conexion de pines etc.
(16-06-2014, 10:53 PM)juanma1970 escribió: [ -> ]A ver , he estado haqciendo varias pruebas y un problema que me encuentro ahora es que cuando conecto el GND y el VCC del RTC el display se enciende , pero cuando le conecto los otros dos ( SCL y SDA ) empieza a parpadear el display, eso por un lado , el zumbador va perfeco hace sus pitidos en su orden y funciona, la botonera no me hace nada, no se como vamos a arreglar este cacao maravillao antonio, mandame una foto de como lo tienes tu hecho a ver si se me enciende la luz.
Respecto a las pruebas del RTC ....como lo hago , explicame un poco mas, conexion de pines etc.

En efecto tienes un buen cacao maravillao.

Tienes que ir por partes probando cada elemento hardware por separado.

1) ¿El resultado de la botonera anterior ocurrió mientras mantenías algún botón pulsado?

2) Dime la dirección I2C de tu conjunto Display + módulo I2C
mientras no me des respuesta a eso no tiene sentido que nos partamos la cabeza buscando lo que está mal. Intenta repetir la prueba de "Hola Antonio, vamos avanzando" pero esta vez con I2C y me comentas cual es la dirección I2C que has usado.

3) Ya te comenté que tu RTC tiene 2 chips. No se muy bien que hace aparte de la funcion normal de un RTC y no me lo has aclarado.Si consigues hacer funcionar tu RTC aunque sea con el puerto Serial, dime que dirección I2C has usado.

4) La forma en que yo he soldado la botonera solo servirá para liarte. Fíate del esquema. Yo el la foto no he visto el error pero es que una foto no es lo mejor para repasar un circuito.

Si tienes un tester úsalo para verificar la botonera. Es un circuito muy sencillito.

[Imagen: Botonera_5p.png]

Entre la entrada analógica y GND tienes que medir 10k sea cual sea la situación del pulsador.

Entre la entrada analógica y +5V tienes que medir la resistencia que corresponda a la situación del teclado. Tienes también el programa anterior para investigar lo que ocurre con el teclado.
http://www.ebay.es/itm/281113482518?ssPa...1439.l2649
http://www.ebay.es/itm/371005809592?ssPa...1439.l2649
volvere a hacer de nuevo la botonera a ver en que me he equivocado.
El resultado fue sin presionar ningun boton.

Este es el ultimo test que he hecho:
TEST Entr.Analog.
Fecha Compilacion
Jun 17 2014 21:32:58
0) Media=25 DesvEstd=150
1) Media=1021 DesvEstd=13
2) Media=46 DesvEstd=436
3) Media=16 DesvEstd=42
4) Media=1020 DesvEstd=1
5) Media=1020 DesvEstd=1
====================
0) Media=40 DesvEstd=444
1) Media=1021 DesvEstd=13
2) Media=43 DesvEstd=440
3) Media=13 DesvEstd=32
4) Media=1020 DesvEstd=0
5) Media=1020 DesvEstd=1
====================
0) Media=40 DesvEstd=448
1) Media=1021 DesvEstd=13
2) Media=40 DesvEstd=447
3) Media=9 DesvEstd=23
4) Media=1020 DesvEstd=1
5) Media=1020 DesvEstd=1
Respecto al LCD y el módulo I2C
¿Has leido lo que pone sobre este módulo? Dice lo siguiente:

El modulo, como su nombre indica, sirve para manejar un LCD con solo 2 hilos mediante el protocolo de comunicación I2C, esta basado en el integrado PCF8574P que es un expansor remoto de 8 bit’s de entradas/salidas digitales por comunicación I2C. En el mercado hay muchas variantes de este modulo y todas tienen sus cambios, no solo a nivel hardware si no también a la hora de realizar la configuración de la librería.

Es una advertencia crucial. También leo algo más. Si nos fiamos de lo que pone más abajo dice lo siguiente: Dirección del bus I2C 0x27, mediante la configuración de los puentes se puede cambiar la direccion.

Yo intentaría hacerlo funcionar usando la dirección 0x27 y utilizando un programa lo más sencillo posible y si no va prueba con 0x20 y si continua sin funcionar tendrías que intentar programar un scanner de direcciones I2C para intentar averiguarla.

En la pagina siguiente tienes ya un escanner ya hecho: I2C LCD PROBLEM WITH ARDUINO – SOLVED

Compruebo que tiene fallos. Lo voy a mirar.

Ya lo he corregido: Te pongo aquí el código corregido. Tenía el carácter de dobles comillas equivocado (“) en lugar del normal (") y daba errores muy extraños. (Pa volverse loco).

Código:
/****************************************************
I2C LCD PROBLEM WITH ARDUINO – SOLVED
By: Ahmed Abseed for arduiny.com
http://arduiny.com/i2c-lcd-problem-with-arduino-solved/
*****************************************************/

#include <Arduino.h>
#include <Wire.h>

void setup(){
    Wire.begin();
    Serial.begin(9600);
    Serial.println("I2C Scanner");
}

void loop(){    
    byte error, address;
    int nDevices;

    Serial.println("Scanning");

  nDevices = 0;
  for(address = 1; address < 127; address++ )  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4)  {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found");
  else
    Serial.println("done");
  delay(5000);           // wait 5 seconds for next scan
}

Me ha detectado dos dispositivos: 0x27 y(LCD) y 0x68 (RTC)

Respecto a la botonera:

R7 es una resistencia de 10K que queda conectada de modo fijo a la entrada analógica por un extremo y por el otro está conectada a masa. Por lo tanto, la entrada se pone a 0v y la Media saldrá = 0.

Tu obtienes 1020 en dos entradas. La 4 y la 5. Es evidente que tiene dos fallos.

1) Parece conectada a dos pines, (Pin 4 y Pin 5)
2) La entrada analogica parece conectada a +5V en lugar de a GND. O bien has conectado R7 a +5V o bien tienes un corto en el circuito de la botonera.

Te vuelvo a insistir. Entre la entrada analógica y GND tienes que medir 10k sea cual sea la situación de la botonera, y ahora además de medir eso deberías medir la resistencia entre la entrada analógica y +5V que debería ser muy alta con todos los botones levantados. Si no es así verifica que los botones cierran el circuito al pulsar y lo abre al soltar tal y como te indiqué.

¿Tienes un tester?
[Imagen: GTPAnN2.jpg]
En la entrada 4 y 5 tengo el SDA y el SCL del RTC.
Lo siento antonio pero ya no se que hacer , he repetido la botonera un monton de veces , ya no se donde poner el tester ni como , el programa anterior me dice que no ha localizado ningun lcd i2c ...todo me sale mal y me estoy rindiendo.
Toma dos resistencias de 10k y conectalas por un extremo a un pin de entrada analógico, por el otro una de ellas la conectas a GND y la otra a +5V

Escanea las entradas analógicas.