Paso 2: Circuito y código
Este es el circuito que handel la programación de Arduino Duemilanove. Divertido lo suficiente, su basado en un microcontrolador Arduino sí mismo. Os adjunto una foto del esquema en caso de que no se puede abrir el archivo de eagle.
Un fondo en el circuito:
Lo más singular de este circuito es probablemente el hecho de que utiliza una interrupción sobre el pin digital 2 que es conectado al pin RX del Arduino (Arduino que está destinado a programar) destino. Se trata de detectar el primer bit bajo de datos en serie, que serán el IDE de intentar restablecer el arduino para un bosquejo de la carga. Sin embargo, el IDE no puede restablecer el destino Arduino directamente, pero es por eso que incluí el Arduino intermediario (el Arduino que restablecerá el destino Arduino). Una vez que una interrupción se activa un temporizador, realmente una función de retardo, que desencadena un bajo a alto pulso en D8 comenzará. A su vez, D8 está conectado a la línea de reset de Arduino destino y hará que se reinicie.
He encontrado un buen momento para retrasar fue casi 500ms o 499500us para ser exactos. Llegué a esto por monitioring la comunicación serial y restablecer la línea de un Arduino que fue conectado por USB a mi portatil y he subido un programa, y ensayo y error. He publicado una foto de los resultados en este paso, es que con el programa de Matlab que operan como un osciloscopio. Esto puede ser un punto de mejora, porque según el cuadro puedo acortar el retraso a 100ms o 250ms del primer comando reset serie. Me quedé con 499500us porque funcionó y un medio segundo subir más corto no era digno de otra hora de depurar me. Se puede ver que 499500us no es un número muy general para llegar a. Tuve que probar 490ms, 495ms, 499ms, 500ms, 501ms, 505ms,... antes de llegar a 499500us.
Para evitar la interrupción de restablecer el destino Arduino en cada transmisión serial recibido durante la carga incluye un tiempo de espera de 60. Que parece ser cuánto tiempo tomaría para subir incluso un programa de ~ 30kb; el tamaño máximo posible. Sin embargo es el momento de subir un programa de 1.100 bytes se detectan aproximadamente 5s así que incluido otra interrupción que se detiene el tiempo de espera si un alto voltaje en el pin A0 del destino Arduino. Por lo tanto, si se incluyen unas pocas líneas de código que pulso un alto nivel en el pin A0 en la rutina de setup() de destino Arduino que acortará significativamente el tiempo entre ficheros para sus pequeños bocetos. Programé un LED azul de luz cuando el tiempo de espera está activo. Indica que está cargando, y nada puede transmitirse en el momento.
Una última nota para este paso. Recomiendo poner este circuito en un escudo y utiliza los conectores hembra para montar el XBee. Esto no sólo hacer su circuito mucho más robusto, una obra de arte, no permanentemente Comisión un XBee, pero también acelerar su prototipos que es probablemente lo que tu hacer cuando su carga de código bastante a benift de hacerlo de forma inalámbrica. Si eres listo no soldar, sin embargo, o no belive me lol, siempre puede protoboard el circuito y utilizar como eso. Que es lo que hice cuando era prototipos este circuito.
Por alguna razón que no puedo conectar mi código aquí, ¿sabes por qué? He probado Chrome y Explorer. Así que pegué más abajo.
/*
Este bosquejo está destinado a ser montado en un Arduino (utilicé un 5v UNO) que va a ser utilizado
para restablecer un Arduino Duemilanove que se pretende programar inalámbricamente. Cuenta con una
interrumpir en el pin 2 (atada a RX en destino Arduino para saber cuando una carga
se intenta y por lo tanto, restablecer el destino Arduino en el momento apropiado.
Existe otra interrupción sobre el pin 3 (empatado a A0 en destino Arduino) que se utiliza
como un pin de señalización por el Arduino programado a este Arduino que la
ha concluido el proceso de programación. Se muestra un ejemplo de tal una rutina y señalización
a continuación. Para la mejor práctica, incluirla como la primera línea en su rutina de setup() de su
programar Arduino.
pinMode (A0, salida);
digitalWrite (A0, LOW);
Delay(1);
digitalWrite (A0, alto);
Delay(1);
digitalWrite (A0, LOW);
pinMode (A0, entrada);
Sin embargo esto no es necesario, ya que este programa incluye un 60s tiempo de espera después de
que se puede otra vez programar este chip. El anteriormente mencionado Código simplemente se detiene la
tiempo de espera, lo que le permite subir código immeadelty después de la subida anterior. En cualquiera
caso que no se puede subir hasta que se apaga el LED azul en D4.
*/
volátil Inicio boolean = false;
volátil boolean = false;
resetpin static byte = 8;
blueledpin estática bytes = 4;
void setup()
{
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(blueledpin,OUTPUT);
pinMode(resetpin,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(blueledpin,LOW);
digitalWrite(resetpin,HIGH);
attachInterrupt (0, resetter, LOW); este pin es conectado a la línea de RX de otra Arduino
attachInterrupt (1, stopignore, HIGH); este pin está conectado a A0 de otra Arduino
detachInterrupt(1); Sin embargo esta interrupción es necesario solamente cuando el primero de ellos ha provocado
}
void loop()
{
if(startup)
{
detachInterrupt(0); para no reiniciar otra vez en medio de la carga
digitalWrite(resetpin,LOW);
delayMicroseconds(499500); 499500us funcionado bien
digitalWrite(blueledpin,HIGH);
digitalWrite(resetpin,HIGH); traer para parar resetear el Arduino
tal vez introducir una pequeña pausa aquí
attachInterrupt (1, stopignore, HIGH);
Inicio = false;
para (unsigned int i = 0; i < 60000; me = i + 50) //delay un total de 60 a menos que "hecho" es verdadera
{
digitalWrite(blueledpin,LOW);
Delay(25);
digitalWrite(blueledpin,HIGH);
Delay(25);
if(Done) //then dejar tiempo de espera ya ha terminado de subir
{
i = 60000;
rotura;
}
}
reajuste para la carga siguiente de código
attachInterrupt (0, resetter, LOW);
detachInterrupt(1);
= false;
digitalWrite(blueledpin,LOW);
}
}
void resetter() //triggered solamente en el inicio de una carga. Por ejemplo, primer byte bajo de una carga
{
Inicio = true;
digitalWrite(blueledpin,HIGH);
}
void stopignore()
{
= true;
}