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.
Hola Antonio, estoy intentando hacerle un boatloader a mi arduino y estoy un poco en blanco, ya he fabricado el cable paralelo, pero no se que pasos hay que seguir exactamente, tu sabes algo del tema, gracias.
(22-04-2014, 09:33 PM)juanma1970 escribió: [ -> ]Hola Antonio, estoy intentando hacerle un boatloader a mi arduino y estoy un poco en blanco, ya he fabricado el cable paralelo, pero no se que pasos hay que seguir exactamente, tu sabes algo del tema, gracias.

Sacado de Arduino Bootloader

El programador se puede conectar la los pines ICSP ( las 2 filas de 3 pines ) - Asegurate de de conectarlo de la forma correcta. La placa debe ser alimentada por una fuente de energía externa o directamente por un cable USB.
También debes asegurarte de tener correctamente seleccionada la opción correcta en el menú Tools | Board. Por último solo hay que lanzar el comando apropiado desde el menú Tools > Burn Bootloader del Arduino IDE. Grabar un gestor de arranque puede durar 15 segundos o más, así que se paciente.


Se trata de una operación delicada que yo no he realizado nunca.

Por lo que pone, el Boot Loader para cada placa lo proporciona el IDE y lo envía al puerto paralelo.
Ya lo he intentado es y nada,esperare a que me llegue el chip atmega328
(23-04-2014, 10:19 AM)juanma1970 escribió: [ -> ]Ya lo he intentado es y nada,esperare a que me llegue el chip atmega328

OK.

Somos acuariófilos, y llevamos la perseverancia en nuestras venas.
Jajajaj, que razon tienes , hasta que no conseguimos nuestro objetivo no paramos , cueste lo que cueste.....hasta el divorcio si fuera necesario, jajajajaja.
No lo digas alto que nos hechan de la casa -fisch.gif
Si no nos han hechado ya ........nuestras parejas tienen peces para rato, ajajjajajajj.
Hola. A ver si me podeis ayudar en lo siguiente.

Tened en cuenta que mi programacion en C es nula aun Smile

Estoy intentando modificar el ejemplo de Fade a mi gusto
Voy a usar 4 fases de iluminación (8 leds en grupos de 2)

Empiezo por esto

int led1 = 2; // the pin that the LED is attached to
int led2 = 3; // the pin that the LED is attached to
int led3 = 4; // the pin that the LED is attached to
int led4 = 5; // the pin that the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 1; // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
// declare pin 2,3,4,5 to be an output:
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
// set the brightness of pin 2,3,4,5:
analogWrite(led1, brightness);
analogWrite(led2, brightness);
analogWrite(led3, brightness);
analogWrite(led4, brightness);

// change the brightness for next time through the loop:
if (brightness == 0 || brightness == 155) {
brightness = brightness + fadeAmount;
}

// wait for 50 milliseconds to see the dimming effect
delay(50);
}

Lo siguiente que tengo que hacer es el dimeo efectivo . La idea es tener 4 periodos: Apagado, amanecer ,a tope , atardecer y de nuevo apagado

No se si es necesario poner el RTC para ello, pero como en el futuro quiero poner la hora en el LCD lo conectare.

Seguimos con ello

Un saludo
Mencionas cuatro canales de dimeo independientes. ¿Son de distintos colores? Me sería útil saber cual es tu idea.

El RTC te va a permitir que la transición crepuscular (alba y ocaso) ocurra en momentos del día preestablecidos.

Lo que necesitas en cualquier dia es una función que obtenga el momento del día como un valor entero en función de la hora.

El Arduino únicamente dispone de un contador de milisegundos (veasé funcion millis() )que empieza en el comienzo del arranque del Arduino. Suponiendo que tu arrancaras siempre el Arduino a una hora preestablecida, te podría servir para tener una información del momento del día en que te encuentras. Entrega un valor unsigned long (como máximo 4294967295). Esto equivale a unos 50 dias. Es decir, el contador de millisegundos de Arduino volverá a cero aproximadamente cada 50 días. (hay soluciones pero es mucho mejor un RTC)

Cualquier enfoque sin usar RTC implica que un corte de luz desfasará el horario del sistema que habría que ajustar manualmente de alguna forma.

Te aconsejo que tanto el RTC que compres como el Display LCD usen el bus I2C. (son fáciles de usar).

En LCD yo he usado unos que admite 20 columnas y 4 filas. El modelo de 16 columnas y 2 filas te limitará bastante más.

Una vez tomadas las decisiones sobre qué es lo que a ti te podría convenor, podría ayudarte con su codificación.
Gracias Antonio
La idea de usar 4 canales es la siguiente.
Usare 4 parejas de led (8 en total) de 10W. cada canal usara una salida diferente de Arduino, con lo cual podre manejar cada canal a mi antojo. Esto lo quiero asi por si me hago alguna vez con macandra Smile ... que con mas luz estara mejor que con poca
De momneto todos los led son Blancos de 6500k. Mas tarde pondre algo de luz de luna.

Respecto al reloj y el LCD ya los tengo y los dos van por I2C. lo que no me aclaro es como acceder a ellos a traves de la misma via de comunicación. Se supone que las librerias haran el trabajo sucio ???

Estoy intentando hacer el codigo del dimeo.
ya he visto codigos por intenet de como simular la bajada de intensidad cuando se supone que pasa una nube!!! pero eso esta a años luz de mi conocimiento para programar aun Smile

Un saludo
(25-04-2014, 01:47 PM)Namiga escribió: [ -> ]Gracias Antonio
La idea de usar 4 canales es la siguiente.
Usare 4 parejas de led (8 en total) de 10W. cada canal usara una salida diferente de Arduino, con lo cual podre manejar cada canal a mi antojo. Esto lo quiero asi por si me hago alguna vez con macandra Smile ... que con mas luz estara mejor que con poca
De momneto todos los led son Blancos de 6500k. Mas tarde pondre algo de luz de luna.

Respecto al reloj y el LCD ya los tengo y los dos van por I2C. lo que no me aclaro es como acceder a ellos a traves de la misma via de comunicación. Se supone que las librerias haran el trabajo sucio ???

Estoy intentando hacer el codigo del dimeo.
ya he visto codigos por intenet de como simular la bajada de intensidad cuando se supone que pasa una nube!!! pero eso esta a años luz de mi conocimiento para programar aun Smile

Un saludo
Necesitas usar varias librería:

1) Librería Serial: Porque se usa para casi todo. Es la forma más habitual de comunicación de Arduino. Esta librería está incluida y no necesita ser importada. En Arduino podemos usar el USB para enviar y recibir comunicaciones serie. Esta es la forma en que Arduino se comunica con el ordenador habitualmente. El puerto serie de Arduino o UART (transmisor universal receptor asíncrono) se encuentra en los pines digitales 1 y 0 respectivamente (RX) y (TX)

2) Librería Wire: También conocida como: Two Wire Interface (TWI/I2C)
Permite comunicar con dispositivos que usan el protocolo I2C. Se asume que además de compartir entre ellos la misma conexión a masa, existirá un par de líneas (SDA y SCL) de comunicación bidireccional entre sensores y microcontrolador. A diferencia de la comunicación Serial, los dispositivos son direccionables y se conectan en paralelo a estas líneas (bus I2C):

SDA (Serial Data Line): Linea de datos.
SCL/CLK (Serial Clock Line): Linea de reloj que marcará el tiempo de RW (Lectura/Escritura)
En estas dos únicas líneas SDA SLC (bus IC2) se pueden conectar varios periféricos ya que cada dispositivo estará identificado por una dirección diferente. En muchos sensores para Arduino se comparte además una línea para la alimentación a (+5V).
La librería Wire de Arduino usa siempre 7 bits de direccionamiento. (Ojo porque hay dispositivos I2C que usan direccionamiento de 8 bits y no funcionarían con Wire).
Cada dispositivo debe tener una dirección única en el intervalo de 8 a 119. La dirección 0 está reservada como una dirección de broadcast (emisión a todos los nodos del bus). Las direcciones 1 a 7 están reservadas para otros fines, y las direcciones de la 120 a la 127 están reservadas para futuros usos.
Wire tiene dos forma de inicialización:
Wire.begin() inicializa como maestro.
Wire.begin(Dirección) inicializa como esclavo en esa dirección.

Los diferentes tipos de dispositivos ya vienen con una dirección que o bien hay que conocer, o bien la librería que lo usa ha de conocer ya que los dispositivos se conectan en paralelo sin más.

En la mayoría de las placas Arduino, la línea SDA (línea de datos) usa el pin analógico 4, y la línea SCL (línea de reloj) usa el pin analógico 5, pero en Arduino Mega, se evita gastar estos pines y para SDA se usa el pin digital 20 y para SCL el pin digital 21. Son pines digitales cuya modificación consiste en que internamente tienen unas resistencias pull-up que proporcionan un nivel alto en ausencia de señal. Se podrían usar otros pines digitales colocando externamente estas resistencias pull-up son dos de 10kohmios. Una sitiada entre SDA y +5Vcc y la otra entre SCL.

3) Librería LiquidCrystal_I2C: Es la que te va a permitir usar el LCD. Trae una amplia variedad de comandos.

4) Librería RTClib: Es la que te permitirá usar el RTC. Ponerlo en hora, y obtener la hora con varios comandos.

Acabo de programar una pequeña demo que ilustra el uso de todo esto.

Código:
// Incluir librerías
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>


#define LcdAddress          0x27    // Direccion I2C para el LCD

// Instanciar objetos (viene a ser lo equivalente a declarar una variable tipo objeto)
LiquidCrystal_I2C            lcd_i2c(LcdAddress, 20, 4); // para display de 20x4
RTC_DS1307                   RTC;


// ******************
void MostrarFechaHoraEnLCD(){
    DateTime now = RTC.now();
    int YYYY, MM, DD,  hh, mm, ss;
    char CadAux[21];

    YYYY=now.year();
    MM= now.month();
    DD= now.day();
    hh= now.hour();
    mm= now.minute();
    ss= now.second();

    sprintf(CadAux, "%4d/%02d/%02d %02d:%02d:%02d", YYYY, MM, DD, hh, mm, ss);
    lcd_i2c.setCursor(0,0);
    lcd_i2c.print(CadAux);
}

// ******************
void LCD_Ini(){
    lcd_i2c.init();
    lcd_i2c.backlight();
    lcd_i2c.setCursor(0,0);
    lcd_i2c.print("Prueba LCD i2c");
}

// ******************
void RTC_Ini(){
    RTC.begin();
    if (! RTC.isrunning()) {
        Serial.println("RTC Parado!" );
        RTC.adjust(DateTime(__DATE__, __TIME__));
        // RTC.adjust(DateTime("DEC 31 2011","12:59:45")); // Setting the time to a fixed
    }
    else{
        Serial.println("RTC OK!");
    }
}

// ******************
void setup(){
    Serial.begin(9600); // Iniciar Serial
    Wire.begin(); // Iniciar I2C
    LCD_Ini();    // Iniciar LCD
    RTC_Ini();    // Iniciar LCD
}

// ******************
void loop(){
   MostrarFechaHoraEnLCD();
   delay(1000);
}
Muchas gracias Antonio -good.gif

Entonces cada dispostivo usa su propia librria, que es la que tiene los comandos, aunque usen el mismo tipo de comunicación Smile. Entendido

Gracias por el codigo del RTC y EL LCD.Intentare comprenderlo, que no es poco para mi Smile

Y no se si sera pedir demasiado.... ya he dicho que mis conocimentos de programación son extremadamente basicos, pero en C todavia nulos -nosweat.gif

Estoy con el codigo para la ilumionación, basico... En realidad es el Fade de ejemplo, pero modificado para las 4 fases de luz que voy a poner.

Sin embargo hay algo que hace que se me restee el programa cada cierto tiempo y no veo que puede ser.

La idea es que el encendido sea gradual... y luego llegue al valor maximo que yo quiero (de momento 170 sobre 255).

Uso este codigo
Código:
int led1 = 2;           // the pin that the LED is attached to
int led2 = 3;           // the pin that the LED is attached to
int led3 = 4;           // the pin that the LED is attached to
int led4 = 5;           // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 1;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup()  {
  // declare pin 2,3,4,5 to be an output:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop()  {
  // set the brightness of pin 2,3,4,5:
  analogWrite(led1, brightness);
  analogWrite(led2, brightness);
  analogWrite(led3, brightness);
  analogWrite(led4, brightness);

  // change the brightness for next time through the loop:
   brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 170) {
    brightness == 170 ;
  }    
  
  // wait for 50 milliseconds to see the dimming effect    
  delay(90);    
  
  
}

A ver si me pongo las pilas, porque este es un mundo apasionante ...
Es un tontada, pero ver que todos los led se encendian para mi fue un subidón Big Grin
Hola, bueno mi tema es mas complicado teniendo en cuenta que llevo muy poco en este mundillo, pero tengo una duda, resulta que cuando yo pongo un ejemplo para mi lcd 4884 , el contraste de la pantalla sale perfecto , sin embargo cuando lo pongo con el codigo, se me encienden bien los leds , pero el contraste de la pantalla es maximo y no logro reducirlo, o no se como hacerlo, no se si tendria que bajarlo modificando el codigo , o lo puedo modificar desde el jostick del mismo lcd.
Despues ya veremos el funcionamiento del dimeo.Es otra historia.
Esto es lo que creo que tengo en el codigo respecto al lcd .
Código:
//*******Nokia 3310
//keypad debounce parameter
#define DEBOUNCE_MAX 15
#define DEBOUNCE_ON  10
#define DEBOUNCE_OFF 3

#define NUM_KEYS 5

#define NUM_MENU_ITEM    5  //Main, Set Time, LED Test, Extras, About

// joystick number
#define UP_KEY 3
#define LEFT_KEY 0
#define CENTER_KEY 1
#define DOWN_KEY 2
#define RIGHT_KEY 4

// menu starting points

#define MENU_X    0        // 0-83
#define MENU_Y    5        // 0-5

// adc preset value, represent top value,incl. noise & margin,that the adc reads, when a key is pressed
// set noise & margin = 30 (0.15V@5V)
int  adc_key_val[5] ={30, 150, 360, 535, 760 };

// debounce counters
byte button_count[NUM_KEYS];
// button status - pressed/released
byte button_status[NUM_KEYS];
// button on flags for user program
byte button_flag[NUM_KEYS];

// menu definition  - note Pad to eight characters
char menu_items[NUM_MENU_ITEM][12]={
    "MAIN    ",
        "SET TIME",
        "LED TEST",
        "EXTRAS  ",
        "ABOUT   "
};

void (*menu_funcs[NUM_MENU_ITEM])(void) = {
    menu_main,
        menu_set_time,
        menu_led_test,
        menu_extras,
        menu_about
};

char current_menu_item;

const char RTC_MENU_ITEMS = 9;
const char LED_MENU_ITEMS = 7;
const char EXTRAS_MENU_ITEMS = 5;

byte LCD_backlight_pinState = 1;
char tstr[5];  // temporary store for manipulating strings for LCD output



Nokia_3310_lcd lcd=Nokia_3310_lcd();
[/php]
El contaste creo que es por potenciómetro externo. No se puede controlar por código
(26-04-2014, 02:00 PM)Namiga escribió: [ -> ]El contaste creo que es por potenciómetro externo. No se puede controlar por código

En el mío también es así.

Por cierto, en el código he puesto la inicialización para 20x4. No sé si tu LCD es 20x4 o 16x2.