We zijn weer een stapje verder - ditmaal met een beetje hulp van ChatGPT, we zijn niet te beroerd om dat toe te geven, maar ik zal kort in mijn eigen woorden het gesprek samenvatten, niemand heeft immers zin om vraaggesprekken met robots terug lezen.
Mijn vraag was als volgt:
Is op de Arduino Uno R3 interrupt 0 altijd gelijk aan pin 2?
Het antwoord, in het kort, was 'ja.' Mijn volgende vraag was:
Wat is dan de interrupt die op de Wemos D1 R32 gekoppeld is aan GPIO 26?
Dit antwoord was iets uitgebreider: kennelijk heeft de Wemos, of specifieker gezegd, de ESP32, de interrupts niet standaard aan de pins vastgeplakt. We kunnen elke GPIO pin gebruiken voor interrupts. (ik moet nog maar eens goed leren hoe dit precies werkt, mijn begrip van interrupts is kennelijk toch nog wat mistig.)
ChatGPT legt uit dat ik op de volgende manier een interrupt kan koppelen aan een pin:
void setup() {
// Stel GPIO 26 in als input
pinMode(26, INPUT);
// Voeg een interrupt toe op GPIO 26
attachInterrupt(digitalPinToInterrupt(26), myISR, RISING);
}
De truc waar we in ons geval naar op zoek zijn is gevonden: digitalPinToInterrupt(26)
.
Mooi. Na diverse bestanden uit de eerder genoemde repo van fuzzillogic meermaals te zijn doorgespit zijn er een aantal dingen helder:
-
In InterruptChain.h
staat het volgende:
> Arduino Mega has 6 interrupts. For smaller Arduinos and / or to save a few bytes memory you can lower it to 2 or even 1. Don't go higher than 6 tho.
Ik denk dat hij zegt dat we niet hoger dan 6 moeten gaan omdat hij in InterruptChain.h en InterruptChain.cpp slechts 6 interrupts heeft gehardcode. Voor ons is dat volgens mij niet relevant omdat we niet direct naar een pin refereren, maar naar wat dan ook de waarde is die digitalPinToInterrupt(26)
teruggeeft. Dus we hoeven er geen 20 interrupts bij te programmeren.
-
De eerste parameter van bijvoorbeeld NewRemoteReceiver::init()
is de parameter waarin we geĂŻnteresseerd zijn: het interrupt-nummer. Die mag 0-6 zijn, of -1, om dit beter te begrijpen kijken we even naar RemoteReceiver.h
. In het kort: als de interrupt hoger is dan 0, registreert init
pin <nummer> met deze library.
Samenvattend
De stappen zijn eigenlijk heel eenvoudig: we gebruiken geen -1 als eerste parameter voor NewRemoteReceiver::init()
, dus als we even vanaf nul beginnen zijn dit de stappen:
- Open in de Arduino IDE: Examples → InterruptChain → ReceiveRemoteAndSensor
- Voeg aan
setup()
toe: pinMode(26, INPUT);
- Vervang
NewRemoteReceiver::init(-1, 2, showNewCode);
met:
NewRemoteReceiver::init(digitalPinToInterrupt(26), 2, showNewCode);
- Comment (zet
//
voor) de regels InterruptChain die gebruik maken van pin 0 - zoals uitgelegd is dit alleen nodig als de eerste parameter van RemoteReceiver
en/of NewRemoteReceiver
en/of SensorReceiver
, -1
is.
- Compile en upload.
Verder
Ik krijg nu inderdaad een output die precies hetzelfde is als op de Arduino Uno R3:
Addr <getal> unit 13 on, period: 246us
Dus we zijn op de goede richting. Er is nu echter wel een nieuw probleem bijgekomen:
Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1).
Gevolgd door een register dump, backtrace, en een reboot. Dus hij crasht. Wat nu? Daar kom ik op terug. Ik vermoed dat de interrupt teveel tijd in beslag neemt. Daar houden deze bordjes niet zo van, dan worden ze grillig, interrupts mogen niet teveel tijd in beslag nemen.
Overigens ook even niet het doel uit het oog verliezen: in dit stadium ben ik signalen aan het uitlezen zodat ik die kan reproduceren. We zitten dus nog steeds in de beginnersfase: kijken wat mijn zenders nu uitzenden zodat ik dat kan reproduceren. Uiteindelijk gaan we heel ergens anders naar toe: ontvangen signalen repeaten, en iets programmeren dat meer functionaliteit heeft dan de standaard Klikaanklikuit Android app.
Wordt vervolgd...