Mijn persoonlijke ervaringen over een aantal zaken dat je moet afwegen:
-Arduino & de IDE.
Pro's: Goedkoop (ja ook de originele bordjes, het is meer dan enkel een mcu),eenvoudige programmeeromgeving ,je hoeft de datasheet van de mcu niet volledig uit te spitten, mooie library's te vinden (een lib schrijven kan soms heel erg veel tijd nemen), snel een resultaat, met de usb aansluiting is een software-update / aanpassing snel gedaan, grote community die daar mee bezig is.
Con's: Oogt niet geweldig pro, speciale hardware features van de mcu kan je niet direct aan (i/o is allemaal achter de schermen gelinked), Arduino taal is géén pure C taal als je in atmelstudio een mcu zou willen programmeren, library's op het www zijn niet altijd geweldig goed of er zijn problemen qua timing / afhandelen van taken. Het is dan meer wat knip- en plakwerk, ipv een eigen ontwikkeling.
In de meeste "basis" boeken besteed men erg héél erg weinig aandacht aan interrupts, structs en pointers, terwijl dat dat je programma toch krachtiger maakt, betere respons geeft. Veel te veel focus op de "millis" variabele.
Ook de "delay" functie zou verbannen moeten worden. Daar hebben ze gelukkig op de site van Arduino toch al wat meer "warnings" bij geplaatst.Een eerste knipperende led zou voor mij met interrupts en timers gedaan moeten worden ipv je mcu niets te laten doen...
In de IDE is er geen intellisense, of link naar functies.Je bent snel bezig in notepad++ in de lib te gaan neuzen welke functies er nog beschikbaar zijn. Het debuggen blijft bij een serial output, of een pinneke hoog en laag laten worden.
Alternatieven / aanpassingen op Arduino:
-Een bordje van ST gaan gebruiken in de Arduino ide -> pas op, io pinnekes moet je zelf juist gaan definiëren/linken in het programma.
-Je kan je Arduino IDE ruilen voor de Atmel studio, met "visual micro" software. (betalende licentie) Dat in combinatie met een Segger Serial Wire Debugger (SWD), heb je debugging capaciteiten en intellisense naar functies / classen enz..
Met visual micro blijf je dan met de taal "Arduino C", ipv echte "C".
Zo kan je ook nog "meeliften" op de lib's die je op het www vindt, maar toch een IDE met meer features.
(Ik spreek hier nu voor hobby projectjes hé)
Er bestaat ook PlatformIO voor visualstudio code, maar dan denk ik dat Atmel studio een beter platform is.
-Custom AVR/PIC whatever
Pro's: Je gaat de hele datasheet doornemen, je beheerst dus alle aspecten van de controller die je gekozen hebt. Je programma is dus meer op je mcu afgestemd. Je hebt door dat er soms een kristal nodig is om je mcu een kloksignaal te geven. Ook een MCLR pin hoog maken doe je vanzelf. Debugmodelijkheden als je voor SWD kiest, of JTAG, etc..
Con's:
De datasheet van je mcu zal je goed moeten doorlezen, wat meer tijd neemt.
Je programma is minder "universeel" tov een arduino programma. Hiermee bedoel ik dat bvb de instelling van een bepaalde prescaler van een timer bij elke mcu anders kan zijn. Daardoor is je programma wel performanter.
Library's -> zal je zelf moeten schrijven of voorbeelden op het www zoeken. Je hebt een breadbord en wat randcomponenten nodig om je mcu te laten werken. (of je neemt een ontwikkeldbordje)
Daarnaast wil ik nog volgende zaken meegeven:
-Een mcu kost niet zoveel meer, dus voor een hobby project wat extra rekenkracht en geheugen is zeker handig, al zit er dan een véél te grote, inefficiënte library in, geen probleem.
Maarrrr, de datasheet van een eenvoudige kleine mcu kan je nog eens gemakkelijk doorlezen, de datasheet van een 32bit monster is soms zéér uitgebreidt (1000 pagina's en meer), om dan een interruptje te gaan opzetten in je arduino... dan is het voor mij geen onstpanned namiddag projectje meer...
Alles heeft z'n voor en nadelen, in elk opzicht.
Financieël / leercurve / resources etc...
Om een voorbeeldje te geven, configuratie van een interrupt.
Bij mikrobasic, voor een dsPIC:
pic basic code:
sub procedure InitTimer1()
T1CON = 0x8000
T1IE_bit = 1
T1IF_bit = 0
IPC0 = IPC0 or 0x1000
PR1 = 1000
end sub
Bij Arduino IDE, voor een Arduino MKRzero:
c code:
noInterrupts();
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_CLKEN |
GCLK_CLKCTRL_GEN_GCLK0 |
GCLK_CLKCTRL_ID_TC4_TC5;
while (GCLK->STATUS.bit.SYNCBUSY);
TC4->COUNT16.CC[0].reg = 29999;
while (TC4->COUNT16.STATUS.bit.SYNCBUSY);
NVIC_SetPriority(TC4_IRQn, 0);
NVIC_EnableIRQ(TC4_IRQn);
TC4->COUNT16.INTENSET.reg = TC_INTENSET_OVF;
TC4->COUNT16.CTRLA.reg |= TC_CTRLA_PRESCSYNC_PRESC |
TC_CTRLA_PRESCALER_DIV8 |
TC_CTRLA_WAVEGEN_MFRQ |
TC_CTRLA_MODE_COUNT16;
while (TC4->COUNT16.STATUS.bit.SYNCBUSY);
TC4->COUNT16.CTRLA.bit.ENABLE = 1;
while (TC4->COUNT16.STATUS.bit.SYNCBUSY);
interrupts();