Arduino trådlös programmering med XBee serie 1 eller 2 (2 / 5 steg)
Steg 2: Krets och kod
Detta är den krets som kommer att Händel programmering av Arduino Duemilanove. Lustigt nog, dess baserad på en Arduino mikrokontroller själv. Jag bifogade en bild på schematiskt ifall du inte kan öppna filen eagle.
En bakgrund på banan:
Det mest unika med denna krets är förmodligen det faktum att den använder ett avbrott på digital stift 2 som är ansluten till RX stift målet Arduino (Arduino som är avsett för att programmeras). Detta är att upptäcka den första låg bit av seriell data, som kommer att vara IDE försöker återställa arduino för en skiss uppladdning. IDE går inte att återställa målet Arduino direkt, men det är därför jag tagit förmedlande Arduino (The Arduino som återställer målet Arduino). När ett avbrott utlöses en timer, verkligen en fördröjning funktion, kommer att börja som utlöser en låg till hög puls på D8. I sin tur D8 är ansluten till destination Arduino Återställ linje och kommer att få den att återställa.
Jag hittade en bra tid att skjuta var nästan 500ms, eller 499500us att vara exakt. Jag kom på detta genom att övervaka seriell kommunikation och Återställ linje av en Arduino som var ansluten VIA USB till min laptop medan jag laddade upp ett program till det, och prova. Jag postat en bild av resultaten i detta steg, det är en med Matlab programmet fungerar som ett oscilloskop. Detta kan vara en punkt av förbättring, eftersom enligt bilden kan jag förkorta dröjsmålet till 100ms eller 250ms från det första seriella Återställ kommandot. Jag fastnade med 499500us eftersom det fungerade och en halv en andra kortare uppladdning inte var värt en annan timmes felsökning för mig. Du kan se att 499500us inte är ett mycket genral tal att komma fram till. Jag var tvungen att prova 490ms, 495ms, 499ms, 500ms, 501ms, 505ms,... innan jag kom till 499500us.
För att hålla avbrottet från reseting målet Arduino på varje mottagna seriell överförings medan uppladdning jag tagit en timeout av 60-talet. Som verkar vara hur lång tid det skulle ta att ladda upp ännu en ~ 30kb program; den maximala storleken som möjligt. Men tid att ladda upp en 1100 byte program är ca 5s så jag inkluderat en annan avbrott som kommer att stoppa tidsgränsen om en hög spänning har upptäckts på den A0 pin av målet Arduino. Därför, om du tar några kodrader som pulserar en hög nivå på A0 stift i rutinen setup() av din destination Arduino du kommer att avsevärt förkorta tiden mellan inlagda för dina små skisser. Jag programmerat en blå LED-ljus på när timeout är aktiv. Anger att du överför, och inget annat kan överföras på gång.
En sista anmärkning för detta steg. Jag rekommenderar starkt att sätta denna krets på en sköld, och använda de kvinnliga rubrikerna för att montera XBee. Detta kommer inte bara göra din krets mycket kraftigare, ett konstverk, inte permanent kommissionen en XBee, men också fart upp din prototyper. vilket är förmodligen vad du gör när din uppladdning koden tillräckligt ofta till benift från att göra det trådlöst. Om du inte är inte redo löda, ändå, eller inte tror mig lol, kan du alltid breadboard ciruit och använda det sådär. Vilket är vad jag gjorde när jag var prototyper denna krets.
Av någon anledning jag inte kan koppla min kod här, vet du varför? Jag har provat Chrome och Explorer. Så jag klistrade det nedan.
/*
Denna skiss är avsedd att monteras på en Arduino (jag använde en UNO 5v) som kommer att användas
Om du vill återställa en Arduino Duemilanove som är tänkt att trådlöst programmeras. Den har en
avbryta på stift 2 (knuten till RX på destination Arduino att veta när en uppladdning
försök och därför återställa målet Arduino på approriate gång.
En annan avbrott finns på stift 3 (knuten till A0 på destination Arduino) som används
som en signalering pin av programmerade Arduino att berätta denna Arduino som den
Programming process har ingått. Visas ett exempel på en sådan signalering rutin
nedan. För bästa praxis, ta med det som den första raden i din setup() rutin av din
programmerade Arduino.
pinMode (A0, OUTPUT);
digitalWrite (A0, låg);
Delay(1);
digitalWrite (A0, hög);
Delay(1);
digitalWrite (A0, låg);
pinMode (A0, indata);
Detta är emellertid inte nödvändigt, eftersom detta program omfattar en 60s timeout efter
som du kan återigen programmera detta chip. Den tidigare nämnda kod helt enkelt slutar den
timeout, så att du kan ladda upp koden immeadelty efter din tidigare uppladdning. I någon
fall du inte kan ladda upp tills den blå lampan på D4 stängs av.
*/
flyktiga booleska start = false;
flyktiga boolean = false;
statiska byte resetpin = 8;
statiska 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, låg); denna pin är kopplad till raden RX i andra Arduino
attachInterrupt (1, stopignore, hög); denna pin är kopplad till A0 av andra Arduino
detachInterrupt(1); Men detta avbrott är bara nödvändigt när den första som har utlöst
}
void loop()
{
IF(Startup)
{
detachInterrupt(0); så vi inte Återställ igen mitt i uppladdningen
digitalWrite(resetpin,LOW);
delayMicroseconds(499500); 499500us fungerade bra
digitalWrite(blueledpin,HIGH);
digitalWrite(resetpin,HIGH); få hög för att stoppa reseting Arduino
kanske sätta in en liten fördröjning här
attachInterrupt (1, stopignore, hög);
Start = false;
för (unsigned int jag = 0; jag < 60000; i = i + 50) //delay sammanlagt 60-talet om inte "gjort" stämmer
{
digitalWrite(blueledpin,LOW);
Delay(25);
digitalWrite(blueledpin,HIGH);
Delay(25);
IF(Done) //then stoppa timeout eftersom uppladdningen är klar
{
Jag = 60000;
bryta;
}
}
återställa för nästa kod uppladdning
attachInterrupt (0, resetter, låg);
detachInterrupt(1);
= false;
digitalWrite(blueledpin,LOW);
}
}
void resetter() //triggered endast i början av en uppladdning. T.ex. första låg byten i en uppladdning
{
Start = sant;
digitalWrite(blueledpin,HIGH);
}
void stopignore()
{
= sant;
}