Étape 2: Circuit et Code
C’est le circuit qui sera handel la programmation de l’Arduino Duemilanove. Drôle, son basé sur un microcontrôleur Arduino lui-même. J’ai joint une photo du schéma dans le cas où vous ne pouvez pas ouvrir le fichier d’eagle.
Un rappel sur le circuit :
La chose plus unique sur ce circuit est probablement le fait qu’il utilise une interruption sur la broche numérique 2 qui est connecté à la broche RX de la destination Arduino (l’Arduino qui est destiné à être programmé). Il s’agit de détecter le premier bit bas de données sérielles, qui seront l’IDE vous essayez de réinitialiser l’arduino pour un téléchargement de croquis. Toutefois, l’IDE ne peut pas réinitialiser la destination Arduino directement, mais c’est la raison pour laquelle j’ai inclus l’Arduino intermédiaire (The Arduino qui réinitialisera la destination Arduino). Une fois qu’une interruption est déclenchée une minuterie, vraiment une fonction de retard, qui déclenche un faible à haute impulsion sur D8 commencera. À son tour, D8 est relié à la ligne reset de l’Arduino destination et entraînera sa réinitialisation.
J’ai trouvé un bon moment pour retarder était presque 500ms ou 499500us pour être exact. Je suis arrivé à ceci de surveiller la communication série et réinitialiser la ligne d’un Arduino qui était connecté VIA USB à mon ordinateur portable alors que j’ai téléchargé un programme pour elle et de tâtonnements. J’ai posté une photo des résultats dans cette étape, c’est celui avec le programme Matlab fonctionnant comme un oscilloscope. C’est peut-être un point d’amélioration, car selon l’image, je peux raccourcir le délai à 100ms ou 250ms de la première commande de réinitialisation série. J’ai coincé avec 499500us parce que cela a fonctionné et un deuxième téléchargement plus court ne valait pas une autre heure de débogage pour moi. Vous pouvez voir que 499500us n’est pas un nombre très genral pour arriver à. J’ai dû essayer 490ms, 495ms, 499ms, 500ms, 501ms, 505ms,... avant mon arrivée à 499500us.
Afin de maintenir l’interruption de réinitialisation la destination Arduino sur chaque reçue tranmission de série lors du téléchargement, j’ai inclus un délai d’attente de 60 s. Qui semble être de combien de temps il faudrait pour télécharger même un programme de ~ 30kb; la taille maximale possible. Cependant le temps de télécharger un programme de 1 100 octets est environ 5 s donc j’ai inclus une autre interruption qui interrompt le délai d’attente si une haute tension est détecté sur la broche de A0 de la destination Arduino. Par conséquent, si vous incluez quelques lignes de code qu’un niveau élevé sur la broche A0 dans la routine setup() de votre destination Arduino entre que vous permettra de réduire considérablement le temps des impulsions télécharge pour vos petits croquis. J’ai programmé une DEL bleue d’allumer sur lorsque le délai d’attente est actif. Indiquant que vous téléchargez, et rien d’autre peut être transmise à l’époque.
Un dernier mot pour cette étape. Je recommande fortement de mettre ce circuit sur un bouclier et en utilisant les en-têtes femelles pour monter le XBee. Cela va non seulement faire votre circuit beaucoup plus robuste, une œuvre d’art, pas définitivement réglées un XBee, mais également accélérer votre prototypage ainsi ; qui est probablement ce que vous faites lorsque votre téléchargement de code assez souvent à benift de le faire sans fil. Si vous n'êtes pas prêt pas souder, cependant, ou Don't belive me lol, vous pouvez toujours planche à pain le ciruit et utilisez-le comme ça. Qui est ce que j’ai fait quand j’étais prototypage ce circuit.
Pour une raison quelconque, que je ne peux pas joindre mon code ici, savez-vous pourquoi ? J’ai essayé Chrome et Explorer. Donc j’ai collé ci-dessous.
/*
Cette esquisse est destinée à être monté sur un Arduino (j’ai utilisé un 5v UNO) qui va être utilisé
pour réinitialiser un Arduino Duemilanove qui est censé programmé sans fil. Il a un
interruption sur la broche 2 (lié au RX sur destination Arduino pour savoir quand un téléchargement
est tentée et donc réinitialiser la destination Arduino au moment approriate.
Une autre interruption existe sur la broche 3 (lié au A0 sur destination Arduino) qui est utilisée
comme une épingle de signalisation de l’Arduino programmée à raconter cet Arduino qui le
processus de programmation a conclu. Un exemple d’une telle routine de signalisation
ci-dessous. Concernant les meilleures pratiques, incluez-le dans la première ligne de votre routine setup() de votre
Arduino programmée.
pinMode (A0, sortie) ;
digitalWrite (A0, faible) ;
Delay(1) ;
digitalWrite (A0, élevé) ;
Delay(1) ;
digitalWrite (A0, faible) ;
pinMode (entrée, A0) ;
Cependant, ce n’est pas nécessaire, parce que ce programme comprend une 60 s timeout après
qui encore une fois, vous pouvez programmer cette puce. Les précités code arrête simplement la
délai d’attente, ce qui vous permet de télécharger le code immeadelty après votre téléchargement précédent. Dans l’un
cas, que vous ne pouvez pas télécharger jusqu'à ce que la LED bleue sur D4 s’éteigne.
*/
volatil démarrage booléen = false ;
boolean volatile = false ;
public static byte resetpin = 8 ;
public static byte blueledpin = 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, révisable, faible) ; Cette broche est reliée à la ligne RX de l’autre Arduino
attachInterrupt (1, stopignore, HIGH) ; Cette broche est attachée à A0, d’autre l’Arduino
detachInterrupt(1) ; Cependant cette interruption est nécessaire uniquement lorsque l’un a déclenché
}
void loop()
{
if(Startup)
{
detachInterrupt(0) ; donc nous ne pas re-encore une fois au milieu de l’upload
digitalWrite(resetpin,LOW) ;
delayMicroseconds(499500) ; 499500us a bien fonctionné
digitalWrite(blueledpin,HIGH) ;
digitalWrite(resetpin,HIGH) ; porter haut pour arrêter la réinitialisation de l’Arduino
peut-être insérer une petite pause ici
attachInterrupt (1, stopignore, HIGH) ;
Startup = false ;
pour (unsigned int j’ai = 0; j’ai < 60000; i = i + 50) //delay un total de 60 s à moins que « fait » est vrai
{
digitalWrite(blueledpin,LOW) ;
Delay(25) ;
digitalWrite(blueledpin,HIGH) ;
Delay(25) ;
if(Done) //then arrêter timeout parce que le téléchargement est terminé
{
J’ai = 60000 ;
rupture ;
}
}
réinitialiser pour le téléchargement de code suivant
attachInterrupt (0, révisable, faible) ;
detachInterrupt(1) ;
= false ;
digitalWrite(blueledpin,LOW) ;
}
}
resetter() Sub //triggered seulement au début d’un téléchargement. Par exemple premier octet de poids faible d’un téléchargement
{
Startup = true ;
digitalWrite(blueledpin,HIGH) ;
}
Sub stopignore()
{
= true ;
}