Arrancar Arduino cargando el sketch directamente saltando bootloader

Holaa Gente.

Vereis, me he construido una useless box (la caja esta que tu le das a un interruptor, y ella lo vuelve a poner como estaba). Y la idea era dejarlo de alguna forma en la que con darle al botón el arduino se encienda, y vuelba a darle al botón.

Ahora mismo tengo que encender el arduino, y luego ya darle al botón. Con lo cual si la dejo siempre encendida se agota la bateria en nada. Y el tema del modo sleep nose si sería una forma de solucionarlo. Nose cuanto puede llegar a durar una bateria así. (6V 4 pilas AA).

Leí por algún sitio que podías grabar el sketch en el Arduino, de tal forma en la que justo cuando arranque, carge el sketch, sin tener que ejecutar el bootloader puede ser?.

Vosotros que pensais? sleep? grabar el sketch directamente (si es que se puede, yo pregunto)

Un saludo

Puedes hacerlo con un programador externo (ISP), así eliminas el bootloader.

Se puede usar otro arduino como ISP: https://www.arduino.cc/en/Tutorial/ArduinoISP

La idea es acabar metiendo el sketch en un Arduino Pro mini. Imagino que será igual para quemar el bootloader,no?

Y de esa forma tarda poco en arrancar? (<1 seg?)

No entiendo para que? Como escribes tu código?
usas programación de arduino y luego quieres que no use el bootloader? Es un contrasentido o te entiendo mal.
tampoco entiendo porque dices que tarda tanto? Tu problema es que 6 Pilas no son suficientes. Supongamos 1.5V x pila, son 6V. 6V es menor a 7V que es lo mínimo que requiere un regulador de arduino 5V para funcionar.
Ahora si usas un Mini PRO a 3.3V u otra variante a 3.3V entonces tus 6V si estan bien.

Me comprendes por donde puede estar tu problema.

Arduino funciona con un bootloader que tiene todas las instrucciones que luego usas para programarlo.
Si retiras el bootloader hay que programarlo como lo que es, un AVR de ATMEL usando otras librerías que al final darán resultados similares. Puede que mas rápido pero no sustancialmente mas rápido. A menos que hiles muy fino con cada instrucción como analogRead o digitalWrite. A todas se le puede sacar mucho jugo usando la programación de AVR.

Pues a mi el Arduino Uno oficial, conectando a Vin y a GND ese pack de pilas si que funciona eh. Vamos que se enciende y se mueve el servo y todo.

Me he explicado mal (como siempre jaja).
No es el bootloader lo que leí que dejaba de usarse.

Leí que cuando el Arduino se reinicia, espera x milisegundos por si recibiera "X" intrucción, para entrar en modo reprogramar. Y leí que es posible quitar ese tipo de secuencia, por lo cual no espera ese tiempo y inicia más ràpido.

¿Os suena? que lo mismo leí mal...

@surbyte , tu que harías en mi caso? La idea es que el servo se mueva siempre que se le de al botón, y el tiempo de respuesta desde que le des al botón y que el servo se mueva, sea corto.

Según entiendo te preocupas porque al encenderse el arduino dado que le undiste el boton este espera x tiempo antes de ejecutar el sketch cargado y deseas que tu aplicasion sea rápida.

Si no es así corrígeme porfa.

Sin embargo personalmente no creo que sea mucho tiempo, deberías de cerciorarte cuantos milisegundos son para ver si es relevante que te preocupes por eliminarlos porque puede que ni los percibas vos como humano.

Vaya locura de planteo!!!!
A ver no hablemos en el aire, ponle números. Mide el tiempo que tarda el arduino en hacer lo que debe desde que presionaste el botón y entonces si ese tiempo es perceptible pues ponte a ver como mejorarlo.

A ver cúanto demora
10 segundos......... seguro que no
5 segundos......... seguro que no
1 segundo. ......... seguro que no
menos de 1 segundo?

Leí que cuando el Arduino se reinicia, espera x milisegundos por si recibiera "X" intrucción, para entrar en modo reprogramar. Y leí que es posible quitar ese tipo de secuencia, por lo cual no espera ese tiempo y inicia más ràpido.

No pongas leí tal cosa. Pon el enlace y lo debatimos, no te parece? Tal vez interpretaste algo y nosotros otra cosa.
Todos siempre tenemos diferentes puntos de vista.

Siento no poder poner los enlaces. Pero he leido tantas cosas, de tantos sitios.. que ya no me acuerdo ni de donde son la mitad jaja.

Teneís todos razon. Lo mejor es ver primero si tarda o no mucho tiempo en iniciar y responder, y luego ya actuar.

A ver si en un rato modifico el montaje y ya os cuento

Gracias a todos

EDITO:
El Arduino UNO tarda 2 segundos en arrancar y "empezar a moverse". El código es muy simple, básicamente es un if(pin13==HIGH) servo.... Podría quitar el if, y mover el servo directamente, puesto que cuando se encienda el 100% de las veces el botón se ha tenido que accionar, pero imagino solo ganaría milisegundos.

¿Alguna idea de como reducir el tiempo u otra implementación para el proyecto?

De AQUÍ saque mi idea esa de quitar el bootloader para ahorrar 1 segundo
En concreto:

En la placa Arduino UNO, el bootloader siempre se ejecuta durante el primer segundo de cada reinicio. Durante estos instantes, el gestor de arranque se espera a recibir una serie de instrucciones concretas de parte del entorno de desarrollo para interpretarlas y así realizar la correspondiente carga de un posible programa. Si esas instrucciones no llegan pasado ese tiempo, el bootloader termina su ejecución e igualmente se empieza a procesar lo que haya en ese momento en la memoria flash.

Lo mismo lo he interpretado mal. Pero mi idea es que si quito el bootloader, ejecuta lo que hay en flash en ese momento, y así me ahorro 1 segundo.

¿Es posible eliminar el bootloader y dejar un sketch dentro del Arduino, y que se ejecute sin bootloader? (ahora, que cada reprogramación habrá que grabar el bootloader para poder reprogramar,o programar con ISP)

Lo que no entiendo es lo siguiente: esta tu arduino en sleep? lo enviaste a dormir y lo despiertas con una ISR que justamente lo saca de sleep?
O simplemente tu boton le da alimentacion? Creo que es esto último no?

CORRECCION: bueno parece que estoy equivocado y que tu estabas en lo cierto. Si quitas el bootloader programándolo por ICSP arrancará inmediatamente. El bootloader agrega 2 segundos que no son eliminables.

grabando sketches a la placa Arduino con un programador externo

O sea, usando otro arduino como programador y via ICSP puedes guardar el sketch y arrancará inmediatamente.
Una cosa mas aprendida!!!

Si surbyte según entendí tambien desde un inicio el botón es un switch que le da alimentación, lo que no sabia y me sorprende saber es que la operación de encendido tardase tanto creí que rondaba el orden de los mili segundos no 2 segundos jejeje, sip la solucion es esa programarlo por ISP y listo aunq yo preferiria utilizar el modo sleep

Bueno tienes la opcion de ponerlo en sleep consumiendo uA o sea muy poco, y cuando presionas el botón lo sacas de sleep y eso será instantáneo.

surbyte:
Bueno tienes la opcion de ponerlo en sleep consumiendo uA o sea muy poco, y cuando presionas el botón lo sacas de sleep y eso será instantáneo.

El problema es que si lo programo via ICSP, seguirá teniendo el bootloader, no? Tengo que eliminarlo de alguna forma. En realidad me gusta más la idea de ponerlo en sleep (creia que consumia más , llegando a varios mA).

¿Cuanto consumiria el pro mini en sleep? ¿Podria quitarse el led que indica que el arduino esta encendido para ahorrar más aún?. Lo alimentaré con el pack de 4pilas AA. No tendre ningún led ni nada conectado, solo el servo, que nose si consumirá algo si no se usa (yo creo que si, porque alimentarse se alimenta. Quizás si conecto el positivo a un pin y lo dejo en low se soluciona.

Un saludo y gracias

Yo he hecho una prueba hace poco con un NANO
En condiciones normales consume 50mA
si lo pones en sleep siguiendo el

[url=#include <avr/sleep.h>

void setup () 
{
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();
  sleep_cpu ();  
}  // end of setup

void loop () { }]tutorial de Nick Gammon [/url]

comprobé lo que el dice
Baja el consumo a 35mA aprox

El usa una configuración mínima que yo no probé y cae a 15 mA
y luego modificando estas opciones logra estos resultados

SLEEP_MODE_IDLE: 15 mA
SLEEP_MODE_ADC: 6.5 mA
SLEEP_MODE_PWR_SAVE: 1.62 mA
SLEEP_MODE_EXT_STANDBY: 1.62 mA
SLEEP_MODE_STANDBY : 0.84 mA
SLEEP_MODE_PWR_DOWN : 0.36 mA

Con este código dice bajar a 1.25nA TREMENDO!!! Tengo que probarlo urgente

#include <avr/sleep.h>

void setup () 
{

  for (byte i = 0; i <= A5; i++)
    {
    pinMode (i, OUTPUT);    // changed as per below
    digitalWrite (i, LOW);  //     ditto
    }
    
  // disable ADC
  ADCSRA = 0;  
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  noInterrupts ();           // timed sequence follows
  sleep_enable();
 
  // turn off brown-out enable in software
  MCUCR = bit (BODS) | bit (BODSE);
  MCUCR = bit (BODS); 
  interrupts ();             // guarantees next instruction executed
  sleep_cpu ();              // sleep within 3 clock cycles of above

}  // end of setup

void loop () { }

LO QUE IMPORTA SLEEP y DESPERTAR CON EL PULSADOR
Vamos a lo que te interesa, que es algo como ponerlo en sleep y volver cuando presiones un pulsador.
No me esfuerzo mucho pero Nick Gammon escribió este código para despertar o salir del sleep con una señal externa (puede ser tu pulsador)

#include <avr/sleep.h>

const byte LED = 9;
  
void wake ()
{
  // cancel sleep as a precaution
  sleep_disable();
  // precautionary while we do other stuff
  detachInterrupt (0);
}  // end of wake

void setup () 
  {
  digitalWrite (2, HIGH);  // enable pull-up
  }  // end of setup

void loop () 
{
 
  pinMode (LED, OUTPUT);
  digitalWrite (LED, HIGH);
  delay (50);
  digitalWrite (LED, LOW);
  delay (50);
  pinMode (LED, INPUT);
  
  // disable ADC
  ADCSRA = 0;  
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();

  // Do not interrupt before we go to sleep, or the
  // ISR will detach interrupts and we won't wake.
  noInterrupts ();
  
  // will be called when pin D2 goes low  
  attachInterrupt (0, wake, FALLING);
 
  // turn off brown-out enable in software
  // BODS must be set to one and BODSE must be set to zero within four clock cycles
  MCUCR = bit (BODS) | bit (BODSE);
  // The BODS bit is automatically cleared after three clock cycles
  MCUCR = bit (BODS); 
  
  // We are guaranteed that the sleep_cpu call will be done
  // as the processor executes the next instruction after
  // interrupts are turned on.
  interrupts ();  // one cycle
  sleep_cpu ();   // one cycle

  } // end of loop

Bueno esta puesto cuando pin 2 va a LOW pero lo puedes modificar si va a HIGH.

Usa la interrupcíón 0 del UNO/Nano/Mini PRo
Esta linea es la que controla eso

  attachInterrupt (0, wake, FALLING);

si quieres que sea cuando va a HIGH usas
attachInterrupt (0, wake, RISING);

El comienzo del código en el loop debes reemplazarlo por lo que tu quieres que haga el tuyo.
El resto lo pone en sleep y lo despierta cuando presiona el pulsador.
Por acá esta la solución sin tocar nada.

Wow, gracias surbyte . A ver si tengo tiempo y me pongo con el sleep, que nunca he tocado nada, y se ve que es muy util.

¿Como mediis el consumo del arduino? Cronometrando la duración de baterias o con multimetro?

multímetro
Consumo = corriente

surbyte:
multímetro
Consumo = corriente

Pero en donde poneis los terminales del multimetro para medir la corriente? Uno en VIN y otro en GND?

No sabes como se conecta un amperímetro? en Serie.
Las puntas de tu multímetro van en otros conectores, y luego abres el circuito por ejemplo entre el positivo de la bateria y el VIN y ahi pones el multimetro en modo corriente (obvio en mA)