Stap 2: Circuit en Code
Dit is het circuit dat de programmering van de Arduino Duemilanove Georg Friedrich Händel. Grappig genoeg, zijn gebaseerd op een Arduino microcontroller zelf. Ik gehecht een beeld van het schema in het geval dat u de adelaar-bestand niet openen.
Een achtergrond op het circuit:
Het meest unieke ding over dit circuit is waarschijnlijk het feit dat het gebruik maakt van een interrupt op digitale pin 2 die is aangesloten op de RX-pin van de Arduino (de Arduino die is bestemd om te worden geprogrammeerd)-bestemming. Dit is om te ontdekken de eerste lage bitsnelheid van seriële data, die de IDE zullen proberen te herstellen van de arduino voor het uploaden van een schets. Echter de IDE niet rechtstreeks de bestemming Arduino herstellen, maar dat is waarom ik opgenomen de intermediaire Arduino (The Arduino dat zal opnieuw de bestemming Arduino). Zodra een interrupt wordt geactiveerd een timer, echt een vertraging-functie, die een lage tot hoge puls aan D8 activeert zal beginnen. Op zijn beurt D8 is verbonden met de bestemming Arduino van reset lijn en zal leiden tot het opnieuw instellen.
Ik vond het een goed moment om de vertraging was bijna 500ms, of 499500us moet exact. Ik arriveerde bij dit door monitioring de seriële communicatieboekjes en reset lijn van een Arduino die is aangesloten VIA USB op mijn laptop terwijl ik heb geüpload een programma aan het, en trial and error. Ik postte een foto van de resultaten in deze stap, is degene met de Matlab-programma fungeren als een oscilloscoop. Dit kan zijn een punt van verbetering, omdat volgens de foto ik de vertraging 100ms of 250ms uit de eerste seriële herstelopdracht verkorten kan. Ik geplakt met 499500us omdat het werkte en de helft van een tweede kortere upload niet waard een uur was van foutopsporing voor mij. U kunt zien dat 499500us is geen zeer genral getal om te komen tot. Mij had voor uitproberen 490ms, 495ms, 499ms, 500ms, 501ms, 505ms,... voordat ik aankwam aan 499500us.
Om te voorkomen dat de interrupt reseting de bestemming Arduino op elke ontvangen seriële tranmission tijdens het uploaden ik opgenomen een time-out van de jaren 60. Die lijkt te zijn hoe lang het zou duren om te uploaden zelfs een ~ 30kb programma; de maximale grootte die mogelijk is. Echter de tijd voor het uploaden van een programma van 1.100 byte is ongeveer 5s zodat ik opgenomen een andere interrupt die stopt de time-out als een hoog voltage wordt ontdekt op de A0-pin van de Arduino-bestemming. Daarom, als u opneemt van een paar lijnen van code die een hoog niveau op de A0 pin in de setup-routine van uw bestemming Arduino die u aanzienlijk van de tijd tussen verkorten zal pulse uploads voor uw kleine schetsen. Ik een blauwe LED licht op wanneer de time-out actief is geprogrammeerd. Die aangeeft dat u uploadt, en niets anders kan worden overgedragen op het moment.
Één laatste nota voor deze stap. I recommend highly dit circuit zetten een schild, en met behulp van de vrouwelijke headers te monteren de XBee. Dit zal niet alleen uw circuit veel steviger, een kunstwerk te maken, niet permanent comission een XBee, maar ook vaart opwaarts uw prototyping evenals; dat is waarschijnlijk wat je doet wanneer uw uploaden vaak genoeg code te benift draadloos doen. Als u bent niet klaar niet solderen, wel of niet belive me lol, u kunt altijd het ciruit breadboard en dergelijks gebruiken. Dat is wat ik deed toen ik prototyping dit circuit.
Voor sommige reden hecht ik kan niet mijn code hier, weet u waarom? Ik heb geprobeerd Chrome en Explorer. Dus ik het hieronder geplakt.
/*
Deze sketch is bedoeld om te worden gemonteerd op een Arduino (ik gebruikte een UNO-5v) dat zal worden gebruikt
bedoeld om te herstellen van een Arduino Duemilanove thats draadloos geprogrammeerd. Het heeft een
onderbreken op pin 2 (gebonden aan RX op bestemming Arduino om te weten wanneer een upload
wordt geprobeerd en daarom opnieuw instellen van de bestemming Arduino op het geëigende moment.
Een andere interrupt bestaat op pin 3 (gebonden aan A0 op bestemming Arduino) die wordt gebruikt
Als een signalering pin door de geprogrammeerde Arduino te vertellen dit Arduino die de
programmeringsproces heeft gesloten. Een voorbeeld van een dergelijke signalering routine wordt weergegeven
hieronder. Beste praktijken, opnemen als de eerste regel in uw setup-routine van uw
geprogrammeerde Arduino.
pinMode (A0, uitvoer);
digitalWrite (A0, laag);
delay(1);
digitalWrite (A0, hoge);
delay(1);
digitalWrite (A0, laag);
pinMode (A0, INPUT);
Echter is dit niet nodig, omdat dit programma een 60s omvat time-out na
die kunt u opnieuw programmeren van deze chip. De hiervoor genoemde code gewoon stopt de
timeout, zodat u kunt uploaden van code immeadelty na het uploaden van uw vorige. In een
geval die u kan niet uploaden totdat de blauwe LED op D4 uitschakelt.
*/
vluchtige opstarten van Boole = vals;
vluchtige boolean = false;
statische byte resetpin = 8;
statische 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, resetter, laag); deze pin is aangesloten op de RX-lijn van de andere Arduino
attachInterrupt (1, stopignore, HIGH); deze pin is op A0 van de andere Arduino aangesloten
detachInterrupt(1); Deze interrupt is echter alleen noodzakelijk wanneer het ene heeft geactiveerd
}
void loop
{
if(Startup)
{
detachInterrupt(0); dus we niet weer opnieuw in het midden van de upload instellen doen
digitalWrite(resetpin,LOW);
delayMicroseconds(499500); 499500us werkte goed
digitalWrite(blueledpin,HIGH);
digitalWrite(resetpin,HIGH); brengen hoge te stoppen opnieuw de Arduino
misschien een kleine vertraging hier invoegen
attachInterrupt (1, stopignore, HIGH);
opstarten = false;
voor (unsigned int ik = 0; ik < 60000; i = i + 50) //delay totaal 60s tenzij "done" geldt
{
digitalWrite(blueledpin,LOW);
delay(25);
digitalWrite(blueledpin,HIGH);
delay(25);
if(done) //then stoppen timeout omdat de upload is voltooid
{
Ik = 60000;
breken;
}
}
Reset voor de volgende code upload
attachInterrupt (0, resetter, laag);
detachInterrupt(1);
= false;
digitalWrite(blueledpin,LOW);
}
}
ongeldig resetter() //triggered alleen aan het begin van een upload. B.V. eerste lage byte van een upload
{
opstarten = true;
digitalWrite(blueledpin,HIGH);
}
VOID stopignore()
{
= true;
}