Arduino onderbreekt
Onderbreekt
Dit is een gids voor het implementeren van interrupts voor uw Arduino-code. Er is veel goede informatie over onderbrekingen, maar deze gids maakt deel uit van een serie over het runnen van je Arduino met een klein stroomverbruik. En we bedoelen klein. We hebben het over jarenlang gebruik, afhankelijk van de toepassing…. Op een knoopcelbatterij. Dit is het spul dat u moet weten om uw toekomstige embedded of Internet of Things-projecten te creëren. Eerlijk gezegd is het belachelijk hoeveel stroom een voorraad Arduino verspilt. Door gebruik te maken van de verschillende trucs in deze gidsreeks, kunt u het stroomverbruik met meer dan een factor 1000 verminderen! Klinkt interessant? Dan is dit de gids voor jou! Als je deze gids leuk vindt, of wilt zien hoe we interrupts hebben geïmplementeerd in ons eigen project, kijk dan op onze website op:
//doteverything.co/
Waarom heb ik onderbrekingen nodig?
Het antwoord is eigenlijk heel eenvoudig. Je hebt onderbrekingen nodig omdat je zonder onderbrekingen je Arduino niet in slaap kunt brengen en verwacht dat hij weer wakker wordt (in het algemeen. Er zijn manieren om uit de slaap te ontwaken zonder onderbrekingen in beperkte situaties). En als je het niet kunt laten inslapen, zul je macht slurpen als een marathonloper die door Death Valley rent in het midden van het zomerse water. De slaapstand verbruikt heel, heel weinig stroom ... maar het vereist speciale inspanning om het in te stellen. Het eerste dat u moet weten, is hoe u uw code schrijft om te profiteren van onderbrekingen, dan kunt u de krachtigere technieken gebruiken.
WAT is een onderbreking?
Een onderbreking is een paar dingen. Maar in de kern is het een stuk code dat wordt aangeroepen wanneer er een speciale actie plaatsvindt. Welke speciale actie? Kortom, wanneer een bepaalde pin zijn spanning heeft veranderd. Op de Duemilanove / UNO zijn er slechts 2 van dergelijke pinnen die in aanmerking kunnen komen. Maar zoals u kunt zien, is dit een zeer brede vereiste. Je kunt alles gebruiken om de spanning op die pinnen te veranderen. Het kan gebruikersinvoer zijn via een knop, het kan een randapparaat zijn zoals een sensor, het kan een andere microchip zijn, het kan zelfs een interne timer zijn. Het eerste dat u moet doen om te beginnen met het gebruik van interrupts, is uitzoeken hoe uw applicatie kan worden omgezet naar een externe, elektrische trigger. Vaak zullen andere apparaten die u met uw Arduino wilt verbinden, interrupts gebruiken om uw aandacht te trekken. Ons vorige instructable, hoe u Bluetooth aan uw Arduino-project kunt toevoegen, is een perfect voorbeeld van het op zo'n manier koppelen van een extern apparaat.
Deze gids laat zien hoe u een voorbeeldcircuit aansluit op brandonderbrekingen. Vervolgens geven we een voorbeeldcode. Hopelijk, nadat je hebt gezien hoe het is gedaan, kom je in de juiste stemming om erachter te komen hoe je een interrupt op je project kunt toepassen.
Stel dat ik niet om stroomverbruik geef. Heb ik nog steeds onderbrekingen nodig?
Ja! Zelfs als u niet van plan bent de processor in de sluimerstand te zetten, heeft u mogelijk onderbrekingen nodig! Onderbrekingen zijn essentieel als u een tijdafhankelijke toepassing heeft. Dit kan betekenen dat u elke x milliseconden een actie moet uitvoeren, of dat u een actie moet uitvoeren onmiddellijk nadat een externe gebeurtenis heeft plaatsgevonden. Als je bekend bent met de basis van Arduino-programmeren, vraag je je misschien af waarom je niet zomaar een while-lus kunt gebruiken om te controleren wanneer het tijd is om je actie uit te voeren. De typische oplossing is om je while-lus zo snel mogelijk de status van de pin te laten 'peilen'. Deze methode werkt vaak, maar is onbetrouwbaar. Wat gebeurt er als je aan het pollen bent voor een druk op de knop, maar de knop wordt ingedrukt en losgelaten voordat je while-lus de status van de knop opnieuw controleert? Je mist de druk op de knop. Wat gebeurt er als je op zoek bent naar een zeer snelle gebeurtenis, zoals een signaal van een sensor? Je zult vrijwel constant moeten peilen en je programma kan niets anders doen uit angst de kritieke gebeurtenis te missen. Maar met interrupts ben je 100% gegarandeerd van het evenement. Het gebruik van een interrupt bespaart u ook de noodzaak om de staat constant te controleren, waardoor het rekenvermogen wordt bespaard en uw while-lus sneller naar zijn andere taken kan gaan.
Stap 1: Circuitoverzicht

Dit is het circuit dat je moet bouwen om je eerste interrupt te maken:
... Of het is tenminste het circuit dat je MOET bouwen. Gelukkig hebben de meeste Arduino-kaarten al de LED en weerstand ingebouwd, in precies deze configuratie. Ze kunnen worden ingeschakeld in software. Helaas laat alleen het gebruik van de ingebouwde functionaliteit je niet alles zien wat er aan de hand is! Het is dus de moeite waard om dit schema te bestuderen en te begrijpen wat het doet. Het feit dat dit exacte circuit al in Arduino is ingebouwd, zou u een hint moeten geven over hoe belangrijk het is.
Het belangrijkste onderdeel van dit circuit is de 20k-weerstand aangesloten op + 5V. Dit wordt een pull-up-weerstand genoemd. Als de weerstand op GND was aangesloten in plaats van op + 5V, zou het een pull-down-weerstand worden genoemd (Arduino heeft geen pull-down-weerstanden ingebouwd, je moet ze extern toevoegen). De pull-up-weerstand houdt de pin waarmee hij is geassocieerd normaal op + 5V. Dus met rust gelaten, zal de pin altijd HOOG zijn. Als u de pin rechtstreeks op GND aansluit (bijvoorbeeld door de knop te sluiten), wordt de pin verlaagd naar 0V en wordt LOW weergegeven. Als we de pull-up niet hadden, konden we de knop niet krijgen om iets zinvols te doen. Elke Arduino-pin kan intern worden aangesloten op + 5V door pinMode op te geven (pin #, INPUT_PULLUP). Merk op dat de pullup alleen zinvol is als de pin is geconfigureerd als invoer. Bekijk de DigitalPins-pagina voor meer informatie over pull-ups.
De INTERRUPT_PIN moet naar pin 2 of 3 gaan op je Arduino UNO (of een andere op 328p gebaseerde Arduino). Voor andere Arduino's, kijk op deze pagina om een pin met interruptfunctie te vinden. Voor ons codevoorbeeld zullen we het aansluiten op pin 2. De LED die is aangesloten op ANY_PIN is een eenvoudig circuit. Arduino heeft al een LED aangesloten op pin 13, dus die zullen we gebruiken maar voel je vrij om het circuit aan te passen met je eigen LED op een andere pin. De Arduino LED heeft een "L" ernaast.
Knoppen hebben vaak 4 pinnen - meestal zijn twee van de pinnen gewoon intern verbonden met de andere pin aan dezelfde kant van de knop. Als u op de knop drukt en er gebeurt niets, controleer dan of u uw circuit daadwerkelijk hebt bedraad over de pinnen die verbinding maken wanneer de knop wordt ingedrukt, niet over de pinnen die altijd zijn aangesloten.
Stap 2: werkelijke bedrading

Met dat alles in gedachten, als je de interne Arduino-pullups en de ingebouwde LED wilt gebruiken, is hier het supereenvoudige circuit dat je eigenlijk moet bedraden.
Stap 3: de code

Er zijn een paar dingen die het waard zijn om hier op te wijzen. Het meest interessant is regel 10, waar we de interrupt configureren. attachInterrupt () heeft 3 argumenten nodig. De eerste is het interruptnummer, niet het pincode. U hoeft zich hier geen zorgen over te maken, zorg er gewoon voor dat u altijd digitalPinToInterrupt (Pin #) gebruikt en het wordt automatisch vertaald. Onthoud dat alleen bepaalde pinnen kunnen worden omgezet in interrupt-pinnen. Het tweede argument is de naam van de functie waarnaar u wilt dat uw code springt wanneer de onderbreking wordt geactiveerd. U kunt zien hoe deze functie is gedefinieerd op regel 21.
Het derde argument om attachInterrupt () toe te voegen is in dit geval het trefwoord FALLING. Dit betekent dat de interrupt wordt geactiveerd wanneer de spanning op pin 2 van HOOG naar LAAG gaat. U kunt ook RISING specificeren, die wordt geactiveerd wanneer de spanning LAAG naar HOOG gaat; of u kunt CHANGE gebruiken, die wordt geactiveerd wanneer de spanning in beide richtingen verandert. In ons circuit, wanneer de knop wordt ingedrukt, gaat de spanning van hoog naar laag en wanneer de knop wordt losgelaten, gaat deze van hoog naar laag. We willen de code niet twee keer activeren telkens wanneer de knop wordt omgeschakeld, dus kiezen we voor RISING of FALLING. Uw aanvraag kan om iets anders vragen.
Het uitproberen
Als u de code laadt, de seriële monitor opstart en op de knop klikt, zult u merken dat de LED zich niet precies gedraagt zoals we het bedoeld hadden. We willen dat de LED elke keer dat de knop wordt ingedrukt tussen aan en uit schakelt. Maar voor jou zal het waarschijnlijk een paar keer aan en uit knipperen elke keer dat je op de knop drukt. Dit gebeurt omdat knoppen niet perfect zijn. Je vinger drukt misschien de knop in, maar als je op microscopisch niveau kijkt, stuitert de knop eigenlijk meerdere keren op de contacten voordat deze volledig wordt gesloten. Elke bounce veroorzaakt een onderbreking. Ons systeem is zo nauwkeurig en zo gevoelig dat we daadwerkelijk een nieuw probleem hebben geïntroduceerd! Om dit op te lossen, gebruiken we een routine die bekend staat als debouncing om de interruptdetectie minder gevoelig te maken.
Stap 4: Voorbeeld

Hier is er een die ik heb opgeklopt. Het is niet perfect, er zijn zeker betere manieren, maar het zou voldoende moeten zijn om u op weg te helpen met het gebruik van knoppen.
Het basisidee is om de laatste keer dat de knop werd ingedrukt te loggen met behulp van de millis () functie. (De functie millis () vertelt je hoeveel milliseconden zijn verstreken sinds de sketch begon te lopen). Als de vorige interrupt-trigger minder dan 200 milliseconden vóór de huidige plaatsvond, is het waarschijnlijk dat de knop stuitert, dus er wordt geen actie ondernomen. Anders gebeurt alles normaal. Alle variabelen die u binnen een Interrupt-functie wilt wijzigen, moeten als vluchtig worden verklaard, zodat de interrupt en de hoofdlus het nooit oneens zijn over de waarde.
Stap 5: Wat is de volgende stap?
Dat is het! Elke keer dat u op de knop klikt, moet de LED van status veranderen. Je hebt nu een werkende onderbreking. Het is aan jou om manieren te bedenken om onderbrekingen in je project op te nemen. Zoals u kunt zien, zijn onderbrekingen essentieel wanneer timing en rekenkracht belangrijk zijn. In de volgende gids zullen we bespreken hoe de ATMega328p in de slaapstand met ultralaag vermogen kan worden geplaatst, waarbij we vertrouwen op onderbrekingen om ons weer wakker te maken. Tot die tijd abonneer je ons op Instructables en bekijk onze productpagina op www.doteverything.co. We bouwen Dot, een Internet of Things-apparaat waarvan we hopen dat je het cool en nuttig zult vinden, en via deze reeks handleidingen laten we je precies zien hoe je je eigen versie van de hardware kunt bouwen!