Why Arduino is not the right educational tool

I could have started with ‘why the Arduino sucks’ or ‘why the Arduino is bad’, which would have gotten me a tremendous load of page views. But I didn’t because it simply isnt’t true. The Arduino does not ‘suck’, and neither is it bad in its own right. It just isn’t the right tool to teach people programming, but it’s abused that way. Let me tell you why:

What is the Arduino?

“Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It’s intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.” There. I just copy-pasted that from www.arduino.cc. And they’re right! The arduino project is great for  creating interactive objects or environments. You’ve got a gazillion of code examples to use, you can easily read out sensors that would take hours to days to get going (even with coding experience) and a large user base to ask questions. Above all, creating interactive objects or environments is about human interaction (fun!). Hook up a sensor to an actuator, create new combinations and play around… But it’s NOT a good standard to learn coding, or benefit from the power of embedded electronics.

And that’s where I’m bearing a grudge to the use of Arduino’s as a ‘getting started with programming’. Learning to work with microcontrollers is sometimes a steep pathway, but leverages the power of these little beasts. Using an Arduino to learn programming is like using MacDonalds to learn cooking; you get your meal, very fast, but you don’t get the skills to cook yourself. When you need a quick meal, the Mac can be OK (debatable, but just to make my point), but it’s not a cooking class.

5 reasons why, in no particular order:

1: no project space / code partioning / decent IDE

To me this is a great nuisance; I understand you don’t want to overwhelm novices with options, but the Arduino IDE ridicules decent code writing. Maybe you’re supposed to bend your knees that they’ve included color highlighting of variables, but come on, if you want to write decent code, at least give the option to look up variable definitions. See what that looks like below, in a screenshot from Code::Blocks. Another, somewhat related point is that you’re supposed to write all your code in one ‘sketch’. When you want to write any substantial program, with functions you’d like to be able to use later on, good practice (or even complimentary practice) is to create modular pieces of code. Writing everything in one long file is going straight against that objective, and stimulates writing ‘spaghetti code’, with definitions of variables everywhere and nowhere.

The concept of why header files are important is described here on www.cplusplus.com. Another good discussion and fast ‘howto’ is written here (read the discussion!). Also, a great document describing why and how modularizing your code is great can be found on this post at embedded.com

To get a good understanding of  ‘how it’s done right’, please take a look at this very clear document from MIT (pdf)  regarding header files:

“A well organized C program has a good choice of modules, and properly constructed header files that make it easy to understand and access the functionality in a module. They also help ensure that the program is using the same declarations and definitions of all of the program components. This is important because compilers and linkers need help in enforcing the One Definition Rule.”


Being able to look up definitions and implemenations....

Being able to look up definitions and implementations….

Being able to look up the definitions and implementations of files is a great help in writing modularized code. The Arduino IDE does not provide an easy way to create other c / h files, nor does it enable looking up the definitions of it’s own code (what does ‘digitalWrite’ actually do?). When learning to program C, PLEASE learn to use header  files appropriately!

2:bad abstractions / naming

The Arduino ‘programming language’ uses a lot of predefined functions to use peripherals of the Arduino. A lot of these functions use misguiding names or use bad abstractions, simply not describing what they’re doing. Good hardware abstraction saves the end user from fiddling a lot, bad hardware abstraction confuses. A few examples:

  1. analogWrite(int): “writes an analog value (PWM) to a pin”. You say what? PWM is analog? It’s as much analog as a CD contains analog information. Pulse width modulation is NOT analog; the rate is ‘approximately’ 490Hz, and no clues are given to what RC combination you should use to make it analog. This is misguiding; good enough for a LED but it’s not the ‘Analog’ you’d like to use as a setpoint for an analog control system. 
  2. OK, and if you generate PWM, at LEAST let me be able to set the PWM frequency.
  3. pinMode(): I have to admit this is fixed now, but a while ago you had the options ‘INPUT’ and ‘OUTPUT’ only. When you wanted to have an input with pullup, you also had to do a digitalWrite() to the pin you just made an INPUT. When you know the AVR architecture, you know that you’re writing the DDRx and PORTx registers, but to a newbie it’s quite strange to ‘write’ to a pin you just made ‘input’ to get a pullup. It’s fixed now, but it took too long; the pinMode function was already available, and it just needed this extra option. This was not abstracting the hardware, but even creating code that will not be able to port nicely to other microcontrollers (which is probably why it was fixed around the time the Due came).
  4. variables: why use all the chars, ints, longs, etcetera? Using stdint (uint8_t, uint16_t, int32, …) will give more insight, and more portable code. The int for AVR-GCC is 16-bit, while it is 32-bit for the GNU ARM compiler….
  5. Missing abstraction / feature: progmem. A lot of people use strings in memory for debugging. Fixed strings could be stored in flash memory and read from that memory, that feature is present in avr-libc. My guess is that 90% of people saying ‘my Arduino is full’ would benefit from adding some kind of keyword.

3: horrible documentation

Again, this article / rant is based on using it for educational purposes. The documentation on the functions tells nothing about which peripherals are used, not even on a deeper level, hidden away from normal users. I’ve used openFrameworks before, and at least with their IDE you can look in the code how functions are implemented. When using the Arduino, you’re kept dumb. Could I be using a timer while running the servo() functions? Will sending a serial string block my program? Will using analogWrite interfere with other timed functions? You can’t read it in their reference manual.

The Arduino reference also describes its ‘language’. The underlying framework uses some C and some C++ features, both not clearly described. If you want to learn programming, ‘Arduino’ is not the language you’d like to have on your resume, you want to be able to program in C! The difference / equality is not clear, and leads to confusement when going to other microcontrollers or ANSI-C environments. Where are classes used? Where are structs used? I understand that Arduino doesn’t want to scare off new users, but there is no roadmap to ‘advanced’ use.

4: no access to peripherals / wasting resources

I know, you do have access to the peripherals of the Arduino / Atmel chip when you mingle your Arduino code with ‘real’ C and use the Atmel registers. But when you’re that far, please do yourself a pleasure and write your own code, where you know which peripherals are used in which way. When I started programming microcontrollers I was amazed at the speed at which they worked (8 MHz PIC); writing code optimized for the peripherals, using interrupts to do as much parallel as possible showed me what power lies in embedded devices and computers. To me, using the Arduino to learn programming embedded systems takes away that golden edge of creating ‘lean and mean’ applications.

At my current job, people are trying to write control loops using the Arduino; by using the micros() funciton they take the start time of the loop() function, do their tasks, and then poll the micros() function to wait until their loop time has passed. This wastes so much potential for future tasks that should be added, or for processes that are not running at the same timebase. This alone is what makes the mbed better; it’s implementation of ‘Ticker’ functions has its drawbacks, but at least uses interrupt-based timing, leaving the main loop for ‘slow processing’ tasks.

5: no ‘real’ debugging

When the Atmega328 was used no debugging port was available; now the Due is released and the Atmel devices have debug ports from tiny series (DebugWire) to the XMEGA series (PDI and JTAG), this powerfull toolset is kept from the Arduino users. I think development time of applications drops by 30% for me when being able to use a proper debugger setup. At least the ARM could use the OpenOCD implementation, and give power to the programmers. A few breakpoints give a very fast indication of what code is executed, and what error conditions happen. This is where I get very enthousiastic about all new ARM development kits with debugger hardware included. Add arm-gdb and OpenOCD, and you’re up! Setting up those toolchains can be a bit fiddly, but completely worth it when trying to make a decent embedded application.


What’s your alternative?

I think that’s enough for complaining. Your next question should be: how do we educate programming with a good environment? I have several options, all of whom might be worse or more difficult to start with. To get back to my comparison between the Mac and learning to cook yourselve: learning to cook takes someone to teach you. I’ve helped quite a few people to show how to start using other tools, and in general they’re a bit grumpy at the start (why is this so laborious?), and happy in the end (now I understand what’s happening!).

  1. Scratch. To get youngsters to start programming, this is fun, and shows what programs are. It’s fun and easy, and it even enables code partitioning! It’s not embedded though, but if you start out young, this is a good way to learn programming.
  2. mbed. Now open sourced, this lets you use NXP boards and the inexpensive Freescale Freedom board. Here I’m getting quite enthousiastic. The compiler is online, which is great for novices, as you don’t have to install toolchains. Also a humongous archive of code examples is available that you can easily import into your project. Yes, projects! You can organize and partition your code, and use version control online. The code provided by mbed is C++, using classes and operator overloading, which was a bit confusing for me as ANSI-C-er at first, but the documentation is SO clear, and easily available (again found in your project) that it was more encouraging me to also use those features. Peripherals cannot be used simply, but you can use timers indirectly to generate timing interrupts, and again this is well documented.  You don’t like online services? You can also use it offline. The only downside to the mbed for me is that you can’t debug using breakpoints or watchpoints.
  3. AVR-GCC /WinAVR, with Xmega series. The AVR-GCC toolchain (with avr-libc) has a respectable reputation and a very good userbase (www.avrfreaks.net). The reason I recommend the Xmega series is the *fantastic* documentation, the fact that the peripherals each have their own application note, that Atmel Studio is bloated, but gives you the real tools in hands for code partitioning (Goto definition of…), debugging (breakpoints!) and simulation (view bits in peripherals!). When using the (overpriced) Dragon debugger you can debug devices up to 32k code size. Starting with this setup without any coding knowledge might be a bit too steep though, try to get help online, or ask a knowledgeable friend to help out. Reading the application notes just gives me that fizzling feeling that you can make a system that does SO much on its own once you set it up; DMA’s to get ADC values into memory, event system to trigger timers to trigger DACs, etcetera. Quite a bit of work, but than you’re doing embedded-fu. Like making Sushi instead of going to the Mac…..
  4. Use Launchpad/STM32/… Other ARM board. Yes and no here… Yes, ARM is the future, but it’s quite complicated to start with, I think. Also, when using free toolchains you have to put a lot of work into setting up the toolchain. It’s rewarding though; boards with debuggers for takeaway prices (EUR 8 for an STM32F0 Discovery -> Atmel, are you reading this?!), and something to put on your resume: I’ve worked with ARM. The documentation however is mostly poor and frightingly large…. Also, the option set for compilers and IDE’s is so large, that it’s hard to find out why your program is not compiling when it isn’t…


The Arduino is great ‘programming fastfood’: easily available, quick result and sometimes quite tasty. But it isn’t suitable for educating ‘how to program’ or ‘getting performance out of microcontrollers’, or use it as a first step that has an advanced level for enthousiasts. To do that learn real cooking; start with boiling water with scratch, cook potatoes with mbed and make sushi with Atmel to end up going freestyle on the ARM development boards. Now you’re playing with power!


125 thoughts on “Why Arduino is not the right educational tool

  1. It depends how you define programming. Not everyone needs to work on a low and professional level.

    I agree with Scratch, since it’s all in one environment.

    Considering working with electronics Arduino is the most easy way to start. Why you think most microcontroller related projects on Kickstarter adapt Arduino. It’s unbeatable if you consider all the resources available and the community. Maybe not the best IDE, but when you start programming with if/else you don’t need the bells and whistles you mention.

    • admin says:

      Hello Kasper,
      There’s no way to beat the number of Arduino-based projects. But that doesn’t mean it’s a good basis to start learning programming.

      If your only goal EVER is to do some if/else logic, and read some sensors and display data (or turn on a motor) on a human-compatible time scale, Arduino is a good tool to do some quick and dirty programming. If you want to do more, now or in the future, there is no direct path to look how the underlying code is written, or a way you’re encouraged to follow ‘good practice’ rules for encapsulation or abstraction. This, in my opinion, cuts off a very important part of learning the skill of programming.
      When I take a look at the mbed, I see that the quick and easy options for programming are still there, but that I can easily have a quick look in the sources if I want to, and that the IDE supports and encourages good coding techniques; see these course notes on writing modular code.
      The fact that Arduino is fully open source, and thus cheap to clone has brought it far, and it deserves credit for making microcontroller projects appealing again. But I’ll keep stating that it’s wasting resources, and that the complete environment discourages good coding practices.

      • Drew Thompson says:

        Look, my background is CompEng and CompSci and I have seen alot of code and platforms. From assembler on mainframe/RISC and CISC/x86 platforms, PASCAL, C, C++, LISP, Java J2EE, SAP ABAP, MS .NET C#/VB#, Python, etc.. The fact of the matter is how much you put into a Language/IDE and what you get out in a timely manner is what is important to the business. Clean/Efficient code – yes I’ve been through this and graded on how efficient my code was or how small of a bus and processing I could get away with to meet the specs. Nowadays.. being the first person to market is key. The hack together with simpler tools and components.. does it get the job done? At the end of the day if you have a freescale chip or an arduino and the end-cost sways .. which way? If I was accountable for making medical, automotive, flight control devices yeah.. I wouldn’t be in the Arduino side of things, but I think it depends on your application.

    • Mark Harrington says:

      Ps for those who want to learn how to do this effectively in c here is a tutorial I found on the net


    • Mark Harrington says:

      For a more in depth study of this topic please see following article below


      What I found particularly interesting was that part about Ethernet connectivity and of course the examples quoted with respect to communicating across the net

      Good until you reach this part Hmmmm interesting ?? Object oriented programming

      Now what The student has only learnt how to use the Arduino ide How will you ever explain this bit of code to them seeing as they have only ever understood Arduino IDE never mind c , c++ java or html or style sheets or javascript

      Now all of a sudden lets introduce them to net programming and applets shall we

      hypermedia.net. * :

      Huh ??? Where did this ever appear in the java framework why just java.net

      Oh well first problem

      public void paint(graphic g )

      Oh do they understand all of this ?? which context are you in at the moment I can see this becoming ever so confusing

      And what about the applet tags then and how do you set the size of the applet ?

      Well I never all of a sudden you’ve now got to show them all of this then take then back to simple arduino

      You are going to get some questions here aren’t you, never mind confusion. com

      And what about applet signatures and the security manager package Oh !! Security manager now what ??

      See code below

      import hypermedia.net.*;
      UDP udp; // define the UDP object
      String currentMessage;
      String ip = “”; // the Arduino IP address
      int port = 9999; // the Arduino UDP port
      void setup() {
      size(700, 700);
      udp = new UDP( this, 10000 ); // create UDP socket
      udp.listen( true ); // wait for incoming message
      void draw()
      ellipse(width/2, height/2, 230, 230);
      void receive( byte[] data ) {
      // if the message could be “Pushed” or “Released”
      if ( data.length == 6 || data.length == 8 )
      for (int i=0; i < data.length; i++)
      currentMessage += data[i];
      // if the message is really Pushed
      // then answer back by sending "Light"
      if (currentMessage == "Pushed")
      udp.send("Light", ip, port );
      else if (currentMessage == "Released")
      Chapter 11
      [ 407 ]
      udp.send("Dark", ip, port );

      problems problems problems

      No main method, threading , the this pointer never mind c pointers destroying objects, creating objects through constructors and the friendly , private , public functions Overriding functions and of course templates polymorphism , locking threads , thread priority to name but a few hmmm !!

      What happened to good old fashioned c then

    • chris says:

      To whom it may concern, I am in the electricl engineering field and yes I am an engineer, It is the year 2015 now and everything is going smaller and easier to use for the end user. The IDE for Arduino was inovative and had the fore site to what was coming. There are companies now that employ people to work with the arduinos to control robot on assembly lines. Due to the fact that they are so very easy to program everything. Yes even a child could do it. Chech out Adafruit and arduino badge system fr children. If your a die hard programmer that whom knowledge spans back to GW basic and before, then your just use to doing things the hard way and the long way.
      In the year 2015 we want it done “now” and “quick”. We don’t to wast time on a program that will take 40 lines for code to run a machine. When we can do in 4 lines with the arduino ide. So conclusion: get out of the way for the new geration of fast programming to get the same work done in a third of the time. C and C++ …time to retire

      • fuckoff says:

        damn ur an idiot

      • Navagos says:

        (I know I’m 2 Years late, but still)

        Yea, sadly I believe you when you say you are an “electricl” engineer,…
        Which just shows that this is yet another field which is heavily degenerating…

        What in my opinion is the biggest problem with the arduino is the community. (Best example right here)
        Who actually think arduino is less work than everything else without ever even checking out the alternatives.
        Obviously controlling a robot arm with a “normal” c++/c library for an IPC or an STM board is not going to take significantly more LOC than with the arduino.

        I consult for 4 companies, and “strangely” the only company that needs my help for almost every change they make is the one using the arduino. (Which obviously means changes take them a lot longer)
        The problems are mainly due to peripherals conflicting, or being not compatible with the arm
        (for example “analog” outputs not being analog but PWM)

        On a side note, I don’t know what country chris is from, but in most of our assembly lines (Germany), arduino does neither meet the MTTF nor the general robustness requirements needed to get a certified assembly line going. So shedding out the extra 500$ for an IPC or PLC is totally worth it.

      • watman says:

        I can’t help but to wonder how you’re able to program even 4 lines with that spelling.

    • Kuashio says:

      Bells and whistles? Bells and whistles!?

  2. John Lloyd says:

    I would disagree. Arduino is great for imparting a concrete understanding of basic programming concepts to children. Learning loops, conditional logic, and basic functions form the core of any Pri/Sec level CS class. Arduino lets students learn those core concepts through playing with something they can touch and interact with. Projects also require skills from other disciplines which help pique young imaginations.

    • admin says:

      Hello John,
      Thanks for your comment. I value your opinion, but I still think Arduino is almost a dead end ally when it comes to going further with embedded programming. Which is fine if you’re forced to do some electronics in your project, but don’t want to learn all the concepts of embedded programming. If you want to learn programming to ‘young adults’, give them something that opens up their options, instead of closes them in. Although Arduino is open source, it’s quite hard to browse that code from the IDE, and general programming concepts are not taught due to the restricted IDE (encapsulation, abstraction).

    • Tyler says:

      How does arduino teach to children? Kids in my high school are lucky to be able to text! And now all of a sudden, arduino is for children? Yes it may be simple, but for children?

      • admin says:

        Hi Tyler,
        Thanks for your response, but I do not completely get your point. I’ve seen Arduino used as educational platform (for younger and older ‘children’), and I think it is a very unsuitable choice to use it for that purpose. Of course, teaching requires a teacher, especially with more complex stuff as programming. I think I never suggested that any platform would be able to teach ‘by itself’.

        • Aditya Goturu says:

          Bah! I am 16 and I grew sick of the overprotectiveness of arduino. Me and some of my friends are using various atmegas and attinys.

  3. Dan says:

    Good point!
    I’ve just add the TI’s Launchpad line on your alternative list.

  4. Jeroen says:

    I would strongly disagree. First there is no difference between avr-gcc and Arduino. It is exactly the same, just packaged in such a way that a beginner can start straight away.
    Second: I have seen how my 13 year old son went from not interested in programming at all to enthusiastically programming and tinkering with his Uno. That is where Arduino excels: in getting people into programming and into electronics. Sure, later in life you have to learn programming on a more serious level. And you know what? You can do that using Arduino! Get the free Atmel IDE and away you go. All the functionality you can ever need. Still not satisfied? Get a Due and learn the future, not some kind of irrelevant sideshow.
    The Arduino is not perfect, especially the documentation of advanced features is unstructured and takes a while to get to grips with. And many versions of the Arduino seem superfluous.

    • Boo says:

      How on earth did you come to this conclusion ? I find Arduino fanatics are always sticking their necks where it doesn’t fit.

    • admin says:

      I think that your son is lucky enough to have a devoted teacher that can help to show the road to a full IDE. That’s missing for all those that learn Arduino and are than scared by the ‘complexity’ of other systems.
      I don’t know how many people not even know that they’re programming C (they’re programming ‘Arduino’!) let alone understand that it’s avr-gcc or understand how to migrate all libraries to a AVR-Studio environment.
      For -again- educational purposes it’s better to have an environment that has a bit steeper learning curve, but also gives the freedom of learning more from the environment you’ve took your first steps in.

    • Dave says:

      I’m gonna agree with both of you on this. I wasn’t that interested in programming until I discovered Arduino. It made me want to learn about it. But, as someone who is just getting into it, it seems pretty obvious that if you really want to seriously tinker with Arduino, then it would behoove you to learn how to program. I can see how some impatient people would just wanna skip that and simply ask someone to tell them how to get his/her program to do what they want. So I guess Arduino would be a good motivator. I’m still looking for a good starting point for a good base knowledge foundation. I’m not gonna use Arduino as my foundation tho, thats for sure. I’m thinking Python or Ruby

  5. Boo says:

    Arduino => Lazy people who loves comfort zones, good for doing quick things.

    True micro controller development teaches you about ISR, registers, multiplexing, setting up a port that shares peripherals interfaces, working in C or ASM.

  6. Mark Beckett says:

    While you can’t deny that Victor is right with regard to popularity and hiding the underlying functions, there is a comparison I once made to someone else.

    I presume most of you drive/own a car.!

    How many of you know the inner workings of the engine, the valve timing, injection, and the engine management computer?
    What about the gearbox (auto or manual) and exactly how each part interacts based on the diff ratio?

    When you get into your car, and want to do a short run to the shop, you really don’t expect to have to set the ignition timing, the fuel ratio, and the gearbox and diff settings.

    Maybe you have some default settings, based on yesterdays trip when it was fully loaded with 4 people.

    Most people just expect to get it, and drive.
    The underlying features are hidden and just work.

    Sure as it sits it has much more potential, and it won’t win a race, compete in a rally, or do some of the other stuff that a specially built version in which each component is adjusted to suit the event and conditions.

    The point is that some people simply want a car to drive.
    Arduino is like that car, hop in, start it and away.

    There are probably thousands of users that will never take up programming, but may start playing with hardware and use the Arduino IDE in order to achieve what they want/need.

    So sorry Victor I think your points are valid, but its still ONE tool available to educate.
    It is certainly not the only tool, but a lot less confusing to many people.


    • admin says:

      Hi Mark,
      Very valid point, and good comparison. But if you want to teach engineering, and not teach driving the car, you’ll have to know something about internals. I guess I want to go ‘deeper’ in teaching than others…

      • Greg says:

        The point you are missing is that Arduino is not about teaching engineering. It is about providing an experience where the students can quickly getting something working so they are inspired and have the confidence to try to do more.

        Starting by installing a programming tool chain then trying to understand a proper programmer’s IDE will discourage most of them before they write their first line of code. Dealing with DDR and PORT registers, plus bit operations just to get an LED to blink would further discourage the few that lasted through the setup.

        Your McDonald’s / cooking analogy is poor. McDonald’s is to cooking as handing someone a box with a blinking LED is to programming. A better analogy is that Arduino is like starting to teach a kid to cook by having them make Mac-n-cheese. Using engineering tools to teach a beginner to program is like teaching a kid to cook by having them make a cupcake from scratch in a bakery. They’ve never been in a bakery before, the tools are all oversized for making one cupcake, and there are a dozen steps that have to be done nearly perfectly to get an edible result.

        • Jay says:

          Greg, excellent analogy!

        • deltaC says:

          I take you are not an engineer by the points you are raising. If a person is that easily discouraged than engineering really is not for them. ‘Physics’ don’t care about your feelings. The ‘problem’ doesnt care whether you are well rested and fed or not. The ability to push thru and to sustain a certain level, to get up again and try again, a million times if need be to get to the point when it is starting to work, thats engineering. An engineer who has not ‘failed’ a project has never pushed his/her limits!
          That doesn’t mean one should make the entry point any harder than it needs to be, but neither should one sugarcoat reality. By teaching pseudo-C (arduino) and Java (processing) you make it so much harder for kids to switch to professional software, knowing your way around datasheets and knowing how to find what you are looking for. Learning a complex program/tool chain is one part of the big battle and it is a skill that is being very well paid for by employers.
          Still, Arduino is a nice little toy, even for prototyping, but hardly more as you can get the same results with any mc with uVision/AtmelStudio (even Eclipse/VisualStudio) without the extreme limitations.

    • Mark Harrington says:

      You could say this too equally you could argue what happens when you get to the shop and you dont even know where the petrol cap is or how to check the oil and when do you know your breaks need replacing or do you just take this for granted too

      Depends I suppose if you want a nation of dummies but then isn’t that why the US military was recently hacked much to their embarrassment

      Still not to worry I guess

  7. john lim says:

    Not really true. Arduino does exposes its processor architecture like registers and interrupt vector maps etc if you bother to research.

    Moreover as a long time C programmer, I find the arduino a useful tool to teach basic programming construct like loop and conditional cases quickly to some first time young people who are not able to visualize these ideas in their mind without some physical demonstrations.

    A blinking light emphasizes the idea of loop to these kind of people, likewise the selection of action depending on sensor triggered (PIR , Light, sound sensor etc) reinforces to them the idea of if else conditions.

    • admin says:

      Hello John,
      It does expose if you research… But it’s a PITA to open cpp and h files from libraries you’ve included in the Arduino IDE.
      My whole point is that the Arduino environment doesn’t encourage digging into the details. As others have pointed out, sometimes that isn’t necessary, I agree to that.
      But to teach programming, I think it is good to be able to have a quick look what’s under the hood, and to be encouraged to use good coding style like NOT writing everything in the same file. The Arduino IDE is to blame for a lot of the points I’ve made here.
      For general concepts, the Arduino might suffice. But if you want to go for some performance (I’m now teaching how to control a small robot with 2 motors with encoders) and discover how speedy and powerful microcontrollers can be, Arduino is not the right tool. If you have to learn a new tool when you’re ready for more detail, I think you get discouraged. That’s why I think the mbed platform (for instance, it’s just what I have experience with) is better. You can easily look into libraries, see function definitions, use interrupt based timing.
      Maybe the bottom line is: if you teach young kids (elementary school): use Arduino ’cause it’s simple. Any higher: please get some C programming concepts grounded well and use a ‘real’ IDE with consistent naming.

  8. Chey says:

    There are plenty more IDEs out there. Here’s a couple options for those who don’t like the standard Arduino IDE.


    “to each his own”

  9. Sun says:

    Great finding! Can’t agree more! I just returned the Arduino kit I’ve bought a week ago because my goal is to consolidate my low level knowledge, but just realized it is painful to dig into the low level baremetal with Arduino. I did find all the sources needed to understand the details of initialization and basic drivers in the Arduino IDE, but it is just inconvenient to figure out the programming specs by reading meaningless code rather than reading MCU or a board manual, which I mean should be something like Intel’s x86 software developer manual.

    Not sure about mbed, is it very easy to start programming baremetal mbed without the mbed libs? Is there any simple board with simple processors and just a few peripherals directly connected to the MCU for us to practice programming MCU from the first instruction to execute?

    • admin says:

      At least mbed doesn’t hide everything from view; when you hover over a function call, there’s a way to immediately dive to the function implementation of that function.
      To start from bare metal, you can start with anything. I did this with first with Atmel (AVR-GCC, now included in WinAVR) then MSP430, then ARM (ST, EnergyMicro, LPC). I really like the 8-pin DIP ARM (LPC812) from NXP to do bare metal stuff. It’s so tiny you have to be creative!

  10. Duality says:

    I agree with the post.
    But I started out with arduino, and had alot of fun playing with it, but after a while you find out that there is another way of doing it (through the real C programming),
    And me being me 😛 I want to be as close as possible to the machine and exactly know What it does why it does it. and knowing gives you power imho 🙂 and it’s alot of fun too!

  11. Graham says:

    I sort of agree but I like the Arduino IDE as a teaching tool. It is simple, yes keeps all the code in one sketch, but it is simple. When we start to teach children Maths for example, we start with the numbers, not necessary at that time to define them as a set if integers! Initially the fact they can be negative is actively ignored. Once they have a grasp of the basics then more concepts can be introduced.
    I would prefer to start with If Then Else and For and While rather than polymorphism! Rather explain simple data types, byte char int rather than portable ones, we can get to those later.
    First I want to get you interested!!

    • truthadjustr says:

      I’ve spent over a month now into deciding what development board to start with. I have some basic PIC16F84 experience before. When I first saw the Arduino sketch, I was turned-off by it. Not because it looked easy and welcoming for kids and newcomers, but because I had the impression how in the world can it express multi-threading and ISR? These stuff are hard realities of real word embedded systems. The IDE already looked good. The hardware is fine. But the limping of the syntactic expression through ‘sketch’ is patronizing to the point of insult. I bet, by exposing real C syntax there, things would have been better that way. Besides, with sketch, you have ‘int’ data types. With sketch syntax, the result is a bad mix. Making a good IDE using true C, and a nice hardware should have been the right way. To be honest, I am scared looking at every line of sketch, who knows what’s under there…

  12. Nikolai says:

    I started out on Arduino 2 months ago. I have developed desktop apps and web/server solutions for more then 10 yers using C#, as main language. I wanted to start out with AVr’s and got a Arduino board with 15 pratical leasons, and found out that there was some way to go. Then i got ‘Make: Electronics’ and ‘Practical Electronics for inventors’ to kickstart my self on basic knowledge. After that the Arduino cookbook. I have read all and experimented with all the analog components to build a basic knowledge. Now Iam digging further down the AVR, and looking in to using pure C to code my stuff. I quickly realised that the AVR is alot smarter enginered then Arduino made me think in the first place. Any ideas on where to go from here. I would like to understand more about using digital components. Even Practical electronics for inventors, has this plug and play approach that doesn’t tell you why it works as it do. By the way. Whitout Arduino i would proberly never have started out on AVR’s 😉

    • admin says:

      Thanks for your comment, and good points.
      I know that recently there’s been a very good course online in programming embedded systems at a university in the States, probably the courseware is open. I’ll see whether I can find the link. You could also take a small step and go to mbed; still a lot of stuff is in libraries, but it’s easier to track down which code is coming from where, and you’re encouraged to create libraries and treat them as such.
      If you want to continue with AVR, AVRFreaks is a great place with lots of knowledge

  13. Davis says:

    Strongly agree!!. I can testify that your article is totally true because i am a student and i am in a arduino infected collage. In theory arduino is useful to start programming and doing quickly prototypes and then migrate to other platforms with better performance. The problem is that in real life, the migration never happens. The bridge between arduino and a better plataform does not exist because arduino has educated students in the wrong way, and now they see very complicated migrate to another plattaform so they decide stay with arduino. They never learn to code properly because arduino dont teach to code properly, and they cant see that there is a world outside arduino with a lot of things to learn.

  14. ramakant says:

    I just dont understand, this is how we blink lights in the ardunio IDE, so what is the big difference, do you do it differently in c/c++ ? Does the built in while(1) really matter so much? What am I missing here?


    void setup() {
    DDRB = 0xFF;

    void loop() {

    PORTB = 0x20;
    PORTB = 0x00;

    • No, that is ‘correct’ code; however, it is grossly inefficient. Using the internal hooks ‘setup’ and ‘loop’ require dedicated places in memory (in addition to the wasted memory used by the boot loader).

      Also, note that in your code you:
      1. Set all of Port B to outputs (default LO, so off)
      2. Set all of Port B to be 0b00100000, hence, you turned off all pins at the same time you turned on PB5
      3. Turned off all pins at the same time to turn off one pin (PB5)

      Instead, try this:
      #define LED 0x20 // OR _BV(PB5) <– defined in default AVR headers

      PORTB ^= LED; // XOR the port with one bit will toggle just one pin, doesn't affect the state of the other pins


      However, the real point is that if all you ever need to do is toggle an LED, then Arduino is perfect for you. BUT, if you want to learn what you are actually doing, there are better approaches. I field questions from Arduino users all of the time – none of them actually understand what they are doing.

      Using embedded systems to teach programming is kind of dumb anyway (and I work in embedded systems). Learning software by using hardware boards is doubling the amount of things which can go wrong. Why not teach coding principles using actual software? Show how to make a loop that can add all of the numbers from 1 to 10, and then run that program immediately on the computer?

  15. ramakant says:

    delay.h got deleted above

  16. Omar Mokhtar says:

    Totally agree with you! I am lucky to find someone who supports the same opinion!

    Add to that :
    – Arduino does not support multithreading
    – Arduino IDE does not support version control
    – Serial communication in Arduino is polling based not interrupt based. Which is the worst thing ever.
    – Arduino provides the most stupid function ever called ‘delay’ !

  17. Vito says:

    Strongly agree!! but…
    if someone what try to understand, can be an easy way…

    i’m poor, so i’d like to reach big results, witout wasting money and resources..so … i try to build all with my hands… i love microchip’s controllers, thath allow you to have the total controll of the programm, by c++ complier (free) !

  18. George says:

    I’m guessing, like you lead off in your introductory paragraph, you wanted something to shock people into skiming through your article. I do agree with much of your article, but your aggressive stance feels so frustrated possibly targeting a previous teacher or course.

    As an aside, it is ironic that an educational page has so many grammatical and spelling errors. 🙂

    • admin says:

      Hi George,
      I’m not targetting a teacher, but when writing this down I had had many discussions with colleagues about this subject, and I wanted to write it down for myself completely. So yes, it was born out of frustration, but mainly because I was frustrated with the use of Arduinos and the lack of understanding of embedded systems (wasting resources) in an educational system.
      Maybe this is also a good place to write that I was mainly targeting secondary and university education, not primary schools. I understand the use of Arduinos there.

      Regarding the grammar and spelling errors: please indicate what and where, and I’ll correct them. English is not my native language, so I’m happy to learn what can be improved!

  19. Egon Herrmann says:

    Hi there

    Thank you for your article, it is very insightful.

    I am an electrical engineer and we had quite a few classes in programming micro controllers when I was in university.

    Our first course was about the raw basics: programming a 8051 using the Assembly language. We later had courses in programming PICs in C and we also had a number of C++ courses.

    Problem is that I HATED every second of it, as I didn’t have any knowledge of programming prior to university and the subject was too complex for me to learn at the rate that we had to learn it. The end result was that I didn’t practice any more than was needed to pass a test and I mostly relied on short term memory to do so. Now I have some basic knowledge in programming and of micro controller architecture, but not nearly enough to construct and program a complete, working system. I do, however, have quite an extensive knowledge of electronics in general.

    This is where Arduino comes in real handy: I can use my knowledge in electronics and combine it with the raw and easy Arduino architecture to have a system that does what I want it to do without having to spend weeks to get my code to work. I will, however, rather use something like the Arduino Pro Mini as the brain of my self-designed PC board in my projects, as I feel that the larger boards (such as the UNO or MEGA) are too cumbersome to work with and the thousands of wires frustrate me (they do help in the prototyping stage, though).

    The pre-coding design techniques that I learnt in the courses are still very valuable and I feel that, even though the Arduino architecture is so simple and raw, you can still use those techniques to design your Arduino program before actually starting to code it.

    That being said; I don’t believe that Arduino should be used in commercial applications (I mainly use it in hobby-electronics). Further, I do agree with you that Arduino should NOT be used as a tool to teach programming with (especially on a tertiary education level) and I would consider any university-level project done with an Arduino as “cheating.”

    What I do believe Arduino is good for, is when you want your project to do something without the need to pay too much attention to the programming, but rather to a working project (especially ones that don’t need a lot of processing power).

    To conclude, I do believe that Arduino does definitely have its place in hobby electronics and it is still very possible to go through a design stage before actually commencing the programming thereof, so it isn’t a complete mindless platform to use. Learning to program correctly takes a lot of time and commitment and, if programming isn’t the main purpose of your project, Arduino is a good alternative to get the job done. If your main purpose is to learn how to program, you should best choose another platform from the start.

    P.S. An analogy I would use for Arduino style C programming vs. real C programming, is Krav Maga vs. Jiu Jitsu. Krav Maga, being a raw form of martial arts, can be learnt relatively quickly, but it is still quite effective. Jiu Jitsu consists of many fine skills and takes years to master, yet you are left with a better quality knowledge of martial arts. Which one you choose depends on if you need to go to battle in a few months’ time and need to be able to defend yourself, or if becoming a martial arts master is one of your life long purposes.


  20. Joe says:

    This week the SF Chronicle wrote about how kids can learn to “code” and become “engineers”! It worries me that people are being led to believe they can learn some javascript, and boom, they’re in line for big bucks at google. Perhaps in the process of using Arduino, beginners will get a sense of what they can and cannot do, and the limitations will lead them to ask questions and find other embedded system platforms (mbed?) that allow them to learn about timing, ISRs, threads, inter-thread messaging, etc.

  21. mike says:

    I agree with Mark’s car example. I can see your point to a certain extent in that it’s not perfect form a lot of perspectives. Then again, what is ? Back to mark’s car example , i use arduino because it just works and gets me from point A to point B. Now if something better than the Arduino comes along – i’ll probably use that. I write most of my code in python and have making some little starter apps in android – so in regards to number 1, if the was structured in a way that required a lot of modular C files and coding and imports, I would have to spend a lot of time writing in C just to get something out of my arduino. I guess i am probably limited by whats possible because of the arduino sketch – i just probably wouldn’t have even reached a point of getting a result out of microcontrollers had it required 6 months to get started. For a beginner like myself, just gathering the arduino parts and electrical components and getting a good book on arduino development and finally finding the time to sit down and write a bliking LED script or a moving servo script, can take anywhere from a few hours to a few days.(with other obligations like work + family)

    • Mark Harrington says:

      Try Pic basic( proton) that’s a good ide as well and also teaches basic English methodology reference writing algorithms

      Unfortunately it is only for pic but the Pic18 F ( Amicus compiler )very similar to Arduino to some degree

      This too is free and they have some excellent people in that forum who are quite helpful Ive got this as well and it is very very good even has its own RTOS for this as well (RTOS = real time operating system ) event driven

      Link below

      Second to this I like the rasperry pi now that is incredible and can be used alongside Netbeans IDE to create both C and JavaFX programs never mind what this tiny dev board can do and does even with networking

      This you have got to play with Its truly magical

      • Mark Harrington says:

        ts a little bit more than just an ordinary micro controller Its embedded linux which is what your smart phones of the future are Go check out ada fruit too with this
        Link below

        Good tutorials on this sites Hats off to this crowd excellent the work they do This is one crowed Id love to meet

        Very interesting group of dedicated people

  22. Bruno Beloff says:

    As a former University lecturer in computing, turned full-time developer, I disagree.

    Arduino is a great educational tool. Not a great education, but a great tool.

    For all its silly inconsistencies, Arduino is a quick, low-cost route to controlling hardware. It gives the learner (or the professional developer) positive feedback quickly. What more could you want?

    Arduino does not teach software engineering. But don’t fail it for that – that was never its purpose. Nor does it provide hardware-level debugging. But if you think you need hardware debugging, I respectfully suggest that you go and learn some software engineering.

    • Low cost? All of the parts needed for a bare bones AVR board is less than $5. A simple programmer for AVR can be bought for $15 (and reused again and again).

      It doesn’t teach ANY engineering. It teaches people how to copy and paste code from one source to another, without them learning how any of the underlying hardware or software actually works.

    • truthadjustr says:

      What I don’t get with Arduino is the following:
      – they have a good hardware = OK
      – they have a good looking polished IDE = OK
      – therefore, WHAT in the world is that ‘int’ data type doing in this alien-like language called sketch???

      By including ‘int’ there, why not just expose the entire C headers and functions and syntax? It would not have been as confusing as it is now looking at a one-line file with a strange-looking ‘int’ data type that doesn’t seem to fit in the picture.

  23. Glen Mason says:

    I am a lecturer in embedded systems at a further educational college. I was introduced to it by Dr Rob Toulson co author of Fast and Effective Embedded Systems Design book. Before using the mbed we used old development boards for the PIC16F84A etc which required multiple tool chains. I love the simplicity of mbed and its IDE I only wish it had an online de-bugger. I feel the layout of the mbed code is more inline with professional C code practise compared to the arduino code e.g the loop() expression. A lot of my colleagues are starting to use arduino however what they are doing is copying and pasting example code together which is messy and they are not really understanding what is going on. I use the mbed because its great for teaching students like the author says you can partition code in a professional way and the documentation is very good.

    Taking students along the Arduino path will no do tjhem good in the long run especially when they get their 1st interview at an embedded systems design house.

    As for Rasberry Pi well I don’t even want to go there..

  24. Roberto says:

    Arduino sucks like shit (To Start Learn), People that want to lern, program very complex things in arduino and they dont know the OHM law. I want to continuw writing but i dont speak/write very good inglish.

  25. Mat says:

    Just out of curiosity, how many of you are certified teachers? I ask because the premise of the discussion revolves around the art and science of teaching, but it seems many of you are programmers. Also, at what level of education are we talking? My nine year old daughter loves the Arduino starter kit we “play” with (and MITs Scratch software). If that leads her into an awareness of programming and coding and creates an inspiring experience that allows her 1) to break down the stereotypes of women in engineering and programming 2) continue to investigate it’s career potential, hasn’t it done it’s job? I think the variables being overlooked, such as level of education it’s being used, teacher delivery, teacher comfort level (a lot of teachers want their children to have exposure, but are not any better at programming than my keyboard by itself) and intended outcomes, are also worth considering when choosing the tool.
    I have seen a lot of middle school students move to the deeper levels being discussed here after having some experiences with Ardunio (as well as NXT with leJOS and Robo C in all fairness).

    I have very much enjoyed the discussion here and how it has stretched my thinking, so thanks.

    • truthadjustr says:

      I second to your opinion on the merits of arduino inspiring young kids into tech. Arduino should have simply exposed true C syntax in its IDE, and young kids will have still continued still to get inspired, with opportunity to dive deep if needed because the path is there, when they are ready. I don’t see how the ‘sketch’ syntax made it easier in fact i was surprise what the ‘int’ data type there is doing (if indeed the intention was higher abstraction). The C abstraction is the only workable abstraction for embedded systems and this is time tested. By using true C in the arduino IDE, it will still inspire kids and enthusiasts. I don’t see, how ‘sketch’ has advantage over C when I stare at the IDE.

  26. Verto says:

    OMG. So the default editor sucks. Calling it an “IDE” is a stretch. Who cares? Don’t use it if it doesn’t work for you. Noone is advertising Arduino’s glorified text editor as the final word in programming education. Notepad isn’t a very good word processor; shall we complain about that too?


  27. Jim says:

    The great thing about Arduino is that real cheap Arduino boards (Arduino Mini Pro – ATMega328P)have become available for real programmers to use in the conventional manner. ie. Start by getting rid of all traces of Arduino by erasing the bootloader and just program the board with usual ISP method.

  28. g says:

    I played with Lego’s I am sure many of you did also.We all built some fun and creative things. How terrible!! so much wasted creativity due to the the fact that my home or furniture isn’t constructed in this manner. We often forget that baby steps which involve enjoyment and rewards are important in the process of learning. Even if the rewards are kind of negative such as learning how things don’t work well once you let the smoke out, its still fun.

  29. Sailor says:

    Mr Hack van de Dam, reading responses, at least you took a shot with this article.

  30. Arslan ali says:

    hmmm admin i m using arduino in my security based project but i m confused y i m using it n y i red a’lot of advantages n disadvantages n compared it with other but it waste less n i could nt got my answer ..so plz tell me if u have some idea about this

  31. Gary Foster says:

    The Ardiuno platform is fantastic to learn on. For £10, you have access to lots of I/O, PWM, interupts etc.

    This is exactly the kind of platform I learnt on (though in my day it was assembler not C).

    How can this possibly be bad ! you learn how to read / write registers, do control loops, and hang functions on hardware interrupts.

    Sure if you want to progress and use Real time OS’s / Jtag / Other debuggers / C++ (god forbid) then no, you need something else.

    But then you are talking about needing a software degree.

    That should not detract from a platform that can get kids / enthusiastic makers into writing code and getting stuff going.

  32. Timo says:

    This post just destroyed my enthusiasm in going on programming on my arduino which I got 3 days ago.

    Actually. I knew its not very good to teach a real (C or whatever) programing.

    But I want to get in touch with some programming in general. I know, there are so many hidden things, which I’d actually like to understand. But that would take me years to understand – and I have a hell of other things to do – thats why I think, Arduino is bad for teaching programming, or more: Good Programming in general.

    But it let you discover the basics, like, how does a program look like? Boolean shizzle, how do I have to build up the program to achieve what I want, If/else conditions etc. etc.

    In my opinion, easy projects, like an automatic door (what I want to do) are very good done by the arduino, and give u a little glimpse in the programming world.

    But as an actual educative platform, its not that good, because like many already said: Implemented libraries, already programmed functions, hidden features etc etc.

    (Just my opinion)

  33. Joe Honey says:

    Well, I had the pleasant experience of learning the 8051 and 8086 inside and out many years ago. I wrote my programs in assembler starting with start location to my program in the reset interupt vector. We had to use the lab equipment to program it- painfully time consuming to accomplish a simple task, but atleast I really know how a microprocessor/microcontroller works. Then I got an ardiuno and plugged it into my usb port and made an led blink.

  34. John says:

    Great article, I just wish I had found it before I bought my Arduino kit. I have always been into electronics and used to build my own projects. I really wanted the Arduino to learn programming, and since I have no experience whatsoever, I fell for the, “great way to learn programming” sales pitch. I bought the beginners starter kit thinking I would learn something, but I have yet to write my own (working) sketch that actually does something useful. I’m a little annoyed now that I know that learning to program the Arduino doesn’t give you transferable skills, although I have learned a few things about programming which I’m sure are common to all languages.

    I dont really want to have to copy other peoples projects, because the whole point was to learn how to program it myself.

  35. Alessio says:

    This kind of went over my head. I’m looking into Arduino to do exactly what you’re advising not to do, but I’m looking for opinions elsewhere before I commit to buying.

    I only say it because it seems that I’m the target audience for this article but my overwhelming feeling is that there are high level problems with the programming language… Which doesnt seem like something that should stop me taking my initial steps into programming with Arduino.

    It feels like this was aimed more at your peers, the technical descriptions and suggestions feel like they over complicate things when the Arduino commands are relatively straight forward. The way I see it is that electronics can be understood and Arduino is just slightly more complicated electronics.

  36. Anyi says:

    In my opinion, arduino is good…for quick results and testing purposes. But for someone studying electronic engineering, it should not be used for a final year project. Why? First of all the purpose of being in higher institution is to learn how to use basic electronic components to develop complex hardware. Secondly is the cost evaluation. Obviously whoever says arduino should be used for electronic engineering final year projects doesn’t have any value for true experience or cost efficiency.

  37. Andras says:

    I teach Microcontroller programming at a University. I have used EvB 4.3 boards from a Polish company (and-tech.pl). They have an Atmel32 chip and quite a few things mounted already on the evaluation board (Led, switches, 7 segment, LCD, motor driver, MMC card reader, 1W thermometer, IR sensor 4×8 pin GPIO, RS232, RS485, USB, external power in, TWI units mounted (RTC clock and EEPROM) ), buzzer, pot meters for creating analog in for the ADC. It is a great little board for teaching but very few people are developing for it (compared to Arduino) and it does not have the shield system … 1v1 it beats an Arduino uno hands-down but in the long run shields make the Arduino shine. I use the Atmel Studio (freely available IDE) and C/C++ to program these (with AVRDude directly).

    As far as I understand I can do the same for the Arduino – use the Atmel Studio and AVRDude to program it – is that correct? After all it’s an Atmel chip.

    I would use the same approach for programming the Arduino as well (dispensing completely with the silly language) – I would only buy Arduino to get all the shields and functionality developed for it. Then I guess one would have the best of both worlds – C/C++ programming with proper programming practices and access to all Arduino stuff – that would leave students knowing an environment that has a lot of development happening + lots of shields available – as well as proper C/C++ programming of microcontrollers.

    PS. I checked the and-tech.pl site they are offering now the Evb 5.1 that added even more motor controls + IR LED + RGB LED into the mix. You can connect external things to it just not as elegantly as the Shield system.

  38. nemo says:

    if Arduino is not the right educational tool, what WOULD you recommend.

  39. […] Arduino: pourquoi ce n’est pas la meilleure manière d’apprendre à coder http://www.hackvandedam.nl/blog/?p=762 […]

  40. Vested says:

    For PWM, try the following alternative to analogWrite(). “pin” is the pin you want to output to, “period” is the period of the signal in milliseconds, and “dutyCycle” is the duty cycle of the signal in percentage.

    void pwm(int pin, int period, int dutyCycle)
    float dutyCycle2 = dutyCycle/100;
    int pulseOn = period * dutyCycle2;
    int pulseOff = period – pulseOn;
    digitalWrite(pin, HIGH);
    digitalWrite(pin, LOW);

    This function works very well as a PWM signal generator and in addition gives some insight on how PWM actually works.

  41. milo says:

    arduino is awful, it makes me feel bad i dont know how to code

  42. Roberto says:

    I completely agree. In addition, the lack of documentation limits advanced users who already know how to program and rather use the system for rapid prototyping.

  43. David Watson says:

    At the risk of stoking dying embers, I would like to suggest that you’re all right, except for those of you that comment that other people are wrong. I’m a retired systems engineer and start building computers with Intel’s 4004. We programmed in ASM/HEX and keyed binary using toggle switches. Before long we had a full byte-wide processor (8008) and the world opened for us. We started converting the telecommunications network from analog to digital using successors of these. One of my first post graduated jobs involved ‘booting’ a DEC PDP 11/40, using toggle switches on the front panel to install the bootloader so we could read off of mag tape. Our language of choice/necessity was FORTRAN (WATFOR/WATFIV). Somebody introduced us to Pascal so we would develop ‘structured programs’. You can read the history of Pascal elsewhere.

    In any event, to make a longer story shorter, there is no magic solution to either educating people or learning yourself. If we consider all of the very valid comments posted above as what they are, opinions (like somebody once said is akin to a certain orifice that we all have), I would like to share mine with you. Education is not, and should not be about a solution considered by some to be batter than another. Knowledge is boundless and so should be our education. I’ve been in the industry for almost 45 years and still sleep better at night if I was able to learn something new. I have 5 engineering degrees from 4 universities In Canada and the US (and yes, a couple of the alphabet soup ones). My education is not finished. I would be overwhelmingly disappointed in today’s education if some technology was overlooked or ignored as having been deemed superfluous.

    Arduino may not be a lot of things, but what it is should not be trivialized, nor should the education of our children. In my humble opinion, expose them to everything so they can learn not only what’s right but what is wrong. I don’t advocate sticking a child’s hand into a fire so they understand what ‘hot’ means, but face it, we all did it on our own anyhow. Most kids are smarter than we give them credit for. Let them explore.

    For me, Arduino is a toy and I’m having fun playing with it. If the IDE sucks, blame the IDE.

  44. Sergio says:

    Regarding your comment:
    “I know that recently there’s been a very good course online in programming embedded systems at a university in the States”

    I am very interested in learning how to programm embededded systems with C and I would be very thankful if you could share the link to the online course mentiones above.

  45. Dan says:

    I am an Electrical Engineering student and this is nearly a year late response to dispute a statement with a civil response. You can program in C using the Arduino by utilizing Eclipse and the proper AVR software without even touching the Arduino IDE and this was all done back in 2013/2014.

    At my school, we started off with the general concepts that you regard as inadequate regarding the interaction with the Arduino as an embedded system however, we only used that IDE for 10 weeks to familiarize ourselves with the core subsystems utilization for the Uno.

    We are on the quarter system but during the following quarter (10 weeks of class, 1 week of finals and off for a week, repeating this 3 times during the academic year), we started programming the microcontroller directly using commands not provided by Arduino, which you can observe in the included sample code that was written using “functions” to configure the hardware to behave in the way that we desired.

    Basically, we had to manipulate the entire functionality of the device ourselves, which meant we generated our own PWM’s using the timer counter subsystem and the OCR0A or other registers to calculate the speed and pwm type to produce. Note, we had to reference an atmega328p book that contained all of the configurations that we needed to manipulate in order to articulate flags, watchdog timers, ISR interrupts and various other register/thing related behaviors. Some of the practices were relevant to operational related defects and what could be perceived as timing obstructions that could result in inadequate product performance.

    Note that the following code simply contains a few functions that were used in the main body of code to operate an autonomous robot and I will be more than glad to show you the original code prior to when I revamped it to operate the robot independently of “delays”. I will be honest to state that I am sick of individuals who grossly underestimate the arduino boards, not to mention the atmel328p line of microprocessors in the electrical engineering field considering that when they think of “Arduino”, they think that we only learned how to program through the shoddy Arduino IDE. The sad part is, there is alot to be learned and no one can officially state that they know everything and the only benefit of writing this comment is to simply influence your opinion so that other individuals in the field will start to view potential interns and co-op students individually based upon their practices and abilities to learn without relying on their GPA.

    void Initialization(void)



    void Config_Timer_0_76kHz(void)




    Enjoy. Also note the following link can introduce you to what I applied and how assuming you are unable to find the book/pdf relevant to the Atmega328p.

  46. Avinash Gupta says:

    Very good 🙂 I also once tried to see what arduino can offer but left only just after a hour when I found out that it does NOT supports “separate compilation”, and library functions must be written in header files in place of .c (source) files! Wow can’t think of a much sillier method to make things “appear” easier!

    I am happy with Atmel Studio 6 for Atmel MCU and MPLAB X for PIC MCUs.

  47. edward says:

    I’m agree. I prefer Raspberry or Beaglebone Linux environment, It is a very real programming language.

  48. Andrew says:

    Having experienced the complete development lifecycle thus far from the 6502, z80, BBC to PIC and being a retired lecturer in Electronic Engineering I would like to give my thoughts.
    Most children under the age of 18 are only interested in Games and Videos. If it does not play a game then they are not interested. The Raspberry Pi does possess games and video capability, the Arduino does not. Modern programming techniques like Scratch and Python are best taught on the Raspberry Pi. The Arduino uses its own variation of old C. C is the worst of all languages, in my opinion to learn as a first language. I still struggle with string (char arrays) and pointers. The Arduino ide throws in an extra ‘String’ data type which confuses the issue further. Bad news for the learner.
    The Arduino environment is best suited to Instrumentation and Control. A motivated learner should be able to let their imagination run riot with Arduino applications and encourage learning more coding techniques and understanding the operation of the hardware. I have recently lent a lot of Arduino parts to my ‘Access to Engineering’ student I have been tutoring this year. He will study for a degree in Aircraft maintenance next year. I am sorry to say that the package I gave him remains unopened. Its a sign that he will struggle on that degree course. No spark was ignited! The days of direct register manipulations is over, as are the days of circuit design, board etching, hole drilling when a lot of complex circuit boards can be bought from China for 99p including postage.
    The Arduino is an ideal learning environment if used with the right calibre students for the Instrumentation and Control environment.

  49. Nikols says:

    In the title you said “NOT THE RIGHT EDUCATIONAL TOOL”, but in the body you are talking about “EDUCATIONAL TOOL” for programming.
    I find this very misleading.

    IMO it is great educational tool, for getting into electronics and programming.
    As a software engineer, I think it will not teach you programming, but it will teach you basic concepts on which programming is based, along with procedural thinking (most important for kids IMO).

    And it will teach kids that they can be inventors and producers not just consumers. There is more pleasure to build something than to buy it.

    • Don’t forget that for a lot of people, raspberry pi is the only thing they know that’s close to a ‘circuit that could control things’. Microcontrollers.. no operating system, tonnes of input output facilities, simple programming (“write your first bit of code, connect power ,and watch it run”) are unheard of and a total mind blower when all you know about is computers with operating systems, and mini versions of them (rasp pi again) and then the difficulty setting up automation and repeatability (startup scripts), also shutdown requirements to avoid filesystem corruption.

      I think you miss the point. Arduino introduces microcontrollers to people who have only ever thought in the computer world.

      I am still blown away. Yes I’d like to be able to do stm32 stuff in ChibiOS but I still feel like I’ve discovered another universe with arduino and adafruit and teensy.

  50. I will have to disagree with this idea. I am not a programmer, but I have learned programming through making things work, with the money & tools that I have. Arduino for me, makes things work, the way I want them to work, because I “programmed ” it. And Damnit, Arduino isn’t the only thing you have to program, there has to be an interface somewhere, whether it be an app, an LCD, or whatever. So that is where, by necessity, you just accidentally learn a different language, and realize the differences and similarities between the two. Oh crap, now I can use eclipse, xcode, LabView, or any IDE tossed at me. My point is: Arduino is a perfect demonstration to teach the end user that you don’t have to settle for the “Shit” at best buy that doesn’t do what you tell it, the way you want it to. To do that, you just take a little bit of that free information, and start growing it. Steve Wozniak was doing a very similar thing, right before Apple Computer.

  51. Ron Harding says:

    This evaluation is clearly incomplete by not investigating alternatives to arduino;

    many 32 bit ARM devices have taken on the pinout of arduino so that they as well can be used as stackable compatible cards.

    try the Seeeduino ARCH(NXP 32 bit processor) or

    try the Netduino variants which runs on .net Microframework and you can write c# code that directly drives the hardware.

    try the ruggeduino — as arduino by itself was never designed to be used in an actual product as a drop in module.

    you can write interrupt driven code for the arduino, as i have done it. this is an important programming concept on micro-controllers to grasp, and that can be done with arduino.
    simple example;
    make circuit with two push button and assign input capture on each. wire up a single LED to an output.
    next on pc host make smart terminal emulator application, c# or whatever.

    next build algorithm;
    for PB1 ISR when button pressed,
    have the LED flash at a rate of 1/2 second
    for PB2 ISR when button pressed,
    have the LED flash at a rate of 3/4 second
    when both PB1 and PB2 are pressed simultaneously have the LED flash at 0.10 second
    for each of the above, pass associated messages to the c# terminal display.

    so what do we have? terminal that can be used during the debug of your system. we can write terminal code to ‘simulate’ button press states to run through PB1, PB2, PB1 + PB2.

    next steps would be to start out with I2C interface (which Netduino provides), along with SPI, JTAG, as well.

    my two cents (or my two dollars same thing)

  52. Bachi says:

    I fully agree that in particular C should not be used for programming education. Heck, in my opinion it should not be used anymore for anything other than low-resource hardware – and outright forbidden for any new server software.

    For getting into electronics however, it’s a different thing – there it has its place.

    Besides, re: IDE: Use Arduino Eclipse – at least this question’s solved nowadays. The original Arduino IDE is simply unusable.

  53. duparq says:

    I’m not a great fan of Arduino either. So, I started to develop my own hardware abstraction tool as I switched from AVRs to STM32F103.

    At least, it does not need 1KB to blink a LED and makes the code easy to read (and hopefully easy to port).

    It is free software, hosted on Github: https://github.com/duparq/hwa

  54. ed says:

    and yet the Arduino has brought mor people to programming and building than anything else. Kinda reminds me of my youth when the ball-pen was introduced and people protested it coz it wasnt right for writing, unlike the fountain pen.

  55. Teach Arduino says:

    If Arduino sucks why are so many people getting into electronics now and using it?

    Its the cheapest.

    Free IDE.

    Has tutorials everywhere.

    Is able to be made complex at a later date.

    You need to wake up man: Basic is the way to start.

  56. ricky says:

    I graduated with bachelor degree of electronic Eng. I am so happy to see the existence of arduino. It is because most people starting with Arduino don’t know what happen behind the code. While more and more people skip this step, as a software developer, I will be getting easier and easier to find a related job with much higher salary than ever. Just because no one knows how to improve the performance and debug in a assembly level.

    SO…keep going arduino’s lovers. You will never bet the professionals.

  57. Simon says:

    I think Aruduino embodies all of the fundamental concepts that would enable anyone to translate an algorithm into a working implementation. If Arduino can not handle the time complexity of the algorithm, either modify the algorithm or use a different different framework for implementation (which might be Arduino on bigger hardware, are C on AVR, or bigger hardware).

    We should be teaching children from first principles, algorithmic thinking (including modular, divide and conquer and other algorithmic techniques for solving problems) first, which should all be implementation agnostic.

    This separation also teaches a key skill, to evaluate what platform is the most suitable for implementation, and to appreciate the various pros and cons (such as cost vs speed, and so on) of each platform.

    Also there are fully fledged IDE’s for Arduino like Microsoft Community + Virtual Micro plug in, which provides very decent software based debugger.

  58. Frank Cosby says:

    There are two kinds of people who loves cars: those who love to drive cars and those who love to know how the car engines work. Arduino (and other lego-like board) fans, only love to drive the cars. The science and technology other than the steering wheel is far beyond their interests.

  59. I totally agree with Nikols, programming is 2nd in Arduino the real ingredients of arduino is electronics. It is a great tool to learn electronics and to solve your everyday problem by building your own tool. Take for example, you can build your own baby monitor by implementing cmuCAM and arduino and voila a cheap baby monitor that you can use to monitor your baby via an app. (get my point here) Any Tom, Dick and Harry can learn and build something that they want, that is the real beauty of Arduino. Cheers.

  60. Theguyuk says:

    While slightly of the C programming theme this following article link best illustrates where the Arduino concept came from and was aimed for making and build for none Geeks.


  61. geoffrey boehm says:

    This is meant as a comment on the original article, not a reply to a comment.

    First, a huge thank-you for this article. I have been toying with the idea of getting into arduino, and in browsing various articles became disturbed by a couple of things which I found strange. First was the terminology of “uploading” a program from a PC to the Arduino, which is the reverse of standard embedded systems (actually, all systems) nomenclature. Why would they say “uploading” when what they are doing is downloading? Second – what the hell is a “sketch”, and where is “void main()”?

    Well – your article pointed out a whole lot more disturbing things about the arduino, such as the mislabeled “analog write” and, most important, lack of both documentation and ability to examine the underlying code to figure out what the function calls are actually doing. It became very clear that not only is arduino just a toy, but that it teaches incorrect terminology and bad programming technique – things that take time to UNLEARN for anyone who actually wants to become a programmer. When I read that people use it for instrumentation and control systems, I sure hope those are only for toys, not anything real.

    BTW – in case you are wondering who am I to express such strong opinions: Retired software engineer with 25 years experience, most of it programming industrial control systems, about half of it programming embedded systems, including 5 years development of debuggers for an embedded systems tool vendor.

  62. Will says:

    As an experienced programmer, arduino has been a great way to get into embedded systems. I’ve just agreed to do some work on an educational program in my state that teaches kids about robotics using a simple arduino-based robot. The state educational authority has decreed that c/c++ loop constructs are too difficult for kids to learn at this level. It was only when I thought about it that I saw that they are probably right. But now I’m racking my brain to think of a way to code an easy to use loop construct!

  63. noname says:

    I don’t agree with you.

    Arduino is far better than ever for starting to learn programming. Learning programming doesn’t mean necessarily learning a programming language.

    Programming skill requires to switch your brain to another world than what your brain is used to.
    This is also a bit like getting used to ride a bike.

    For a starter, best interest to have fun in the first place. It is necessary not to be bored soon before getting over the initial learning curve and this will bring you maximized focus. Otherwise it would even be scary and frustration.

    And furthermore,
    You don’t have to use Arduino IDE. If you use Visual Studio or Atmel Studio, you will get a professional environment you can organize your projects.
    “Visual Micro” is also amazing Add-in for Visual Studio will bring you a nice debugging feature.

    So, “no woman no cry” 🙂

  64. Sener says:

    Saying “Arduino” sounds like something toy to most of the people. This is a marketing strategy. In fact that it is a real serious chip from some perspectives.

    If you consider airplanes, cars, factories, etc… which have many embedded electronic systems. And surprisingly, most of the micro-controllers of theirs are not even powerful as Atmega328, they are maybe just Attiny85 or just any PIC.

    So, ignore whats been said, just experience yourself and see, learning has never been that fun.

  65. Antonio says:

    Hello im a computer engineer and i have C and assembly language experience, i’m interested on create solution using microcontrollers, what do you recommend me?

  66. jim says:

    Arduino concept was an idea and was completed 80 % in hardware,however the developers spent 20 % on below the par software and 0% on documentation.

    Today the hardware development is done by others , not by Arduino – both cc and com.
    The .cc Arduino software is done by volunteers and practically limited to fixing bugs.

    One of the biggest challenge to new user is Arduino.cc discussion forum with few “know it all ” all powerful self proclaimed administrators. Definitely not a place to learn computing.

    As an attempt to introduce computers to children it seems to be relegated to flashing LEDs.
    The only plus is its “open source” and “Made in China” label – either real or hidden.

    And Arduino Due would be another subject for discussion.

  67. Paco says:

    Its not about “teaching” or “learning” electronics and programing. It is about “motivating” interest in programing.
    No the Arduino is not the “best” way to teach or learn. The best way to learn coding is boring and tedious and takes discipline and self motivation. For those not intending to make a career out of a otherwise unattainable customizable electronic project, there is Arduino and Raspberry pi and…

  68. eestudent says:

    I had previously picked up an Arudino book which was interesting, but I found it near impossible to get a sense of what my code actually did. It gave me quick results, but I learned very little after the first month of hobbyist level stuff.

  69. Tomas says:

    I agree that the Arduino IDE is not “the right” educational tool. I think the Arduino IDE is a nifty tool that has the potential of becoming something great, but at the same time it have some idiosyncracies that makes it very hard to leave the initial learning stage and make some serious system programming:

    1. it stores the compiling tools and generated objects in a non-standard place (in at least Linux), so that replacing the IDE with a text editor of ones own choice essentially implies PORTING the program including the program environment, few newbies can do that,

    2. it compiles ino files, not standard C++, nor C, I have found no way to get it compile pure C or C++, let alone D and other proglans that I consider (Ada, some VM, perhaps Lua-VM) for educational purposes,

    3. ino should by default contain FreeRTOS for every processor (or some other RTOS), now it is simple and exceedingly inflexible single-task programming, which is a grave misuse of the MCU/MPU capacity

  70. Eric says:

    “Great article, I just wish I had found it before I bought my Arduino kit. I have always been into electronics and used to build my own projects. I really wanted the Arduino to learn programming, and since I have no experience whatsoever, I fell for the, “great way to learn programming” sales pitch. I bought the beginners starter kit thinking I would learn something, but I have yet to write my own (working) sketch that actually does something useful. I’m a little annoyed now that I know that learning to program the Arduino doesn’t give you transferable skills, although I have learned a few things about programming which I’m sure are common to all languages.

    I dont really want to have to copy other peoples projects, because the whole point was to learn how to program it myself.” John, Marth 17th, 2015.

    The whole time I’ve been reading this article I’ve two things from the very start.

    1. This rant may have applied 4 years ago, though I highly doubt it considering I started my programming “quest” with an Arduino Uno about 2 years ago, and ANY information no matter how “deep” I had to dig was super READILY available with the most basic of internet access.

    and 2.

    You’ve just swayed a potential future programmer from learning by completely lying. Newcomers are going to stumble upon this and think all the fun they’re having their Arduino is a complete waste of time, try and move on to one of your suggestions, become overwhelmed and probably cast aside any further thoughts of coding. For anyone reading this nearly every single argument on this guys list is completely untrue
    in the year 2017. Creating .h and .cpp files for libraries? Check. Individual “modules”? Check (arrow pointing down button in the Arduino IDE allows extra files to compile with your “sketch”. And the Arduino “language” is a great precursor to “real” object-oriented programming. You learn all about variables, functions, how essential simplifying code is in the endgame (making things transparent and “elegant”).
    You need to update this or just get rid of it.

  71. Xavier says:

    I do agree with you in all aspects. Arduino is the worst tool ever to learn programming and electronics, no matter what the Arduino’s lovers have to say. Yes, one can build an electronics device in minutes, without knowing anything about what is being done, and that doesn’t mean one is learning something. That process is full and truly mechanical. Even thoug I’m an Arduino hater, I do own several boards (Leonardo one, and few hand-made Uno) for prototyping purposes AS IT WAS CONCEIVED.

    Although the Arduino API sucks, it’s a mistake to overlook it, ’cause the zillions of LOC based on it, so I started to write a compatibility layer between my beloved LPC microcontrollers (from NXP) and the Arduino’s API and I noted how much the horrible Arduino’s software architecture is, it makes non sense at all in many ways! So I gave up trying to make something so powerful (LPC1114, LPC1127, LPC812/824, LPC1548, etc.) to fit into something that doesn’t worth it, at least from the point of the engineering software.

    And no one would ever use Arduino to teach embedded systems, not even in colleges! Arduino lovers: Never forget that it tool was developed to prototype and to code/wire proof of concepts!!!!!

  72. Humberto Faggiano says:

    Hi, I’m Electrical Engineer since 1988, and my thesis was a microcontroler to manage a robotic camera for diagnostics of electronic components in a pc board.
    On those late days I should program at very low level programing using HEX codes for the microprocesor instructions, but I was luky, my University owned an HP9600 multi procesor system Computer wich can emulate any Microcontroller or Microprocessor just addind the appropiate pcboard interface for that specific micro, then uses fortran, pascal, basic or ather languages used in that days to program those MICROCONTROLLER.
    Said that, it’ s very important to underline tha Arduino is a MICROCONTROLLER ( low level programming), wich creators had the brilliant idea to sumarize a set of C, C++ instructions to easy the way to program it. Arduino is no a MICROPROCESSOR (high level programming), microprocessor are more suitable to manage Data big amount of it. Microcontrollers are designed to manage INPUTS, from sensors, and through some code make an action through some actuator, (stepmotor, servo, lights, etc.) . So even if I couod agree that arduino will not suitable as a Microprocessor, the foundations to teach how machines interact with the physical world that Arduino’s provide, are brilliant, all of this speaking about arduino as educational tool. So for any one who would teach about the marvels of arduino should begin to introduce first to a non-engineers students, the difference between MicroProcessor and MicroControllers.

    Kind Regards

  73. ron says:

    you are nuts
    from an old retired bell labs engineer present at the creation of unix and c
    machine/assembly/c/c++ seen it all
    and still teaching coding today

  74. Guna Shekar Raju says:

    even i agree with this article but…. let me tell my experience
    I am mechatronics Engineer and for our Mini and industrial projects in our University (Arduino is permanantly banned!!!) as this brings down our programming skill that our instituion thaught to us.
    As a robot hobbyist i easily say that (Reduce complexity) Arduino helped me in :
    1.Reduce wire mesh up.
    2.Save a lot of time.
    3.Debugging made me easy.
    4.Pleasent and reliable environment than Kiel uV,
    MP Lab, (MikroC- SomeWhat OK).
    5.Happy ending and MISSION SUCCESS!!
    i use to interface PIC or Atmel processors to arduino which makes my projects more effective and extended ports etc…

    So in short—— SKY IS NOT THE LIMIT in the same way

    Arduino is just newbie programming even a kid can program it well.

  75. […] Van De Dam, H. (2013). Why Arduino is not the right educational tools. Retrieved from http://www.hackvandedam.nl/blog/?p=762 […]

  76. Don’t forget that for a lot of people, raspberry pi is the only thing they know that’s close to a ‘circuit that could control things’. Microcontrollers.. no operating system, tonnes of input output facilities, simple programming (“write your first bit of code, connect power ,and watch it run”) are unheard of and a total mind blower when all you know about is computers with operating systems, and mini versions of them (rasp pi again) and then the difficulty setting up automation and repeatability (startup scripts), also shutdown requirements to avoid filesystem corruption.

    I think you miss the point. Arduino introduces microcontrollers to people who have only ever thought in the computer world.

    I am still blown away. Yes I’d like to be able to do stm32 stuff in ChibiOS but I still feel like I’ve discovered another universe with arduino and adafruit and teensy.

  77. Pallav Aggarwal says:

    I don’t think Arduino is a bad platform per say but I agree it should not be used for education or training.

    It makes learner believe in shortcuts.

    In my experience I have seen engineers having a very good understanding of making things with Arduino failed miserably when need to do something using another MCU platform, they lack knowledge of basics of electronics, reading datasheets, and the list goes on and on…

    I have a funny phrase for Arduino: It’s like a tricycle, anyone can use it, no one will fall but you cannot race with it.

    It’s good for making(so very popular among makers/DIYers) for sure.

    I have written an article [ http://bit.ly/2Dmojke ] for how to be a good embedded design engineer, one may refer for some useful pointers.

    Pallav Aggarwal

  78. Rigia says:

    In my opinion, there are two kinds of people in the deal of programming:
    1) Programmers that are enthusiast about the low-level/under-the-hood stuffs.
    2) Programmers that are enthusiast about building an innovative product using a system.

    The first kind of people(programmers) are those who wants to have a deep understanding about the system itself and most probably improve or build a new better system. For example, building a new operating system that is 1000X faster, secure, reliable and scale-able than any other OS in the world. Whereas, the second kind of people are those that just need to build a product that are innovative and solve real world problems as soon as possible and as simply as possible.
    If there are only low level programmers/engineers then there will be no one to produce innovative solutions to the general public. And if there are only application developers then there product will eventually be unsatisfactory and when there might be a need to enhance the underlying system, there will be no one to do it. So for a perfect world, we need both of them in a good proportion.
    All I want to point out is that the Arduino infrastructure is best for category (2) but category (1) will not grow much. And I would also say that Arduino is well enough to let the novices get started with basic programming and also embedded system programming(not entirely but gives a head start). It may not entirely teach about how the internals work, like- the GPIO port register, the buses, the processor architecture, etc, but it obviously gives an insight of a microcontroller lets a device work and how it signals the devices in various ways.
    I myself belong to the category (1). I am more enthusiast about how the software interacts with the hardware at the lowest level and I love to program the registers manually. I love to write 10 lines of code to light an LED rather than just 1 line of digitalWrite(13, HIGH). And if I get tired of writing those 10 LOC repeatedly than I simply make a few wrappers for myself. So in a sense I also don’t prefer Arduino, although it was how I first started my embedded projects(which I came to realize were actually not embedded projects rather application projects with some electronics).
    Therefore, my conclusion is that Arduino might not be the best for hardcore educational purpose but may be the best tool to get you just started.

  79. […] Van De Dam, H. (2013). Why Arduino is not the right educational tools. Retrieved from http://www.hackvandedam.nl/blog/?p=762 […]

  80. codebeat says:

    This article is somewhat biased. I think Arduino did their best to create an entry level all-in-one solution to get people/kids familiar with microcontrollers, electronics and programming. And yes, there are some imperfections, such as the ide however there are plenty other ide’s you can use, such as Sloeber or platformIO. The user base and support for it is large, huge, take a look at the Stack exchange sites for example.

    The only problem I notice with use of Arduino is the quality of code however this is not a problem of the system itself, as system. The system take away alot of hassle you normally encounter as starter with other environments. The code is mostly written by hardware people and most of them are not the best programmers. For example Adafruit, hardware okay however software is another story, made for functionality and mostly huge in compile size, a lot of bloat. If you are a good programmer and know your stuff, most of these problems can be solved by writing your own stuff or override it with your own stuff.

    On the educational side, the biggest problem is to learn in steps, dividing problems into steps and to make it optional to be able to reuse it. Reuse is the keyword to learn efficiency. To make functions or classes, make libraries (with functions or classes) for example. I have seen ‘sketches’, one large amount of repeating code. At a new project, they start al over again and again and again to repeat the same, copy and paste from another project. Efficiency is too late visible in the education process.

    I don’t think this is a problem of the system, it is a problem of education. Every introduction to a language starts with simple ‘problem’/case and a simple solution (you can copy and paste) however a simple project can grow over time. First you want to do this and after this you want to do that. An example shows you how to do it however not how to it efficiently. This isn’t a problem of a system or a language, it is a problem of education (first learning functionality and not efficiency) and this is everywhere. For example, when a variable can reach only a max value of 25, use a byte instead of an int. Or when you start to repeat code, make it a function. etc.

    Knowing your hardware is a key to understand what you are doing, knowing there are limitations. Because when you know there are limitations, you can imagine there are limitations to take care of, to avoid unresponsible use of resources or power, to make it efficient as possible, to be able to extend it future. All education is based upon finding a solution however not a long term solution. That is not a problem of a system, it is the way of education is a problem. It suggests there are no limits.

    That is why newbies have to have a microcontroller that is very limited to start with, 8KB for example or limited features, to force to think ‘limited’ and efficient. Doesn’t matter which language but there must be some real limitations to deal with, force creativity to find a solution to reach the ‘impossible’ goal.

    Nowadays, the MCU following the same route like desktop PC’s, more memory, more storage, more Mhz. There are now scripting languages running on MCU’s such as Javascript and Python. Stupid, a role of education to tell this is stupid. It is a time effecient way to make a simple solution however not an instruction or power efficient solution. Solution makers don’t seem to care and manufacturers don’t seem to care either because they want to sell their new faster products.

    Last time I saw the Maximite 2, you can write dirty BASIC code on it and it’s performance is equal or faster to ASM written code in the past. More memory, more CPU power. That’s the way we hide the need/lack of efficiency these days, by learning it wrong and it doesn’t seems to matter. I don’t agree with this behaviour however it is the real world (sadly).

    So yeah, there is no product, language better than others, these all have the same (bad) starting point: “find a solution and code efficiency, perfection is not important”, doesn’t learn you perfection, just learn the basics. What you prefer is a matter of taste and based on knowledge. You see, an educational problem, attitude problem or can I write “a commercial problem”? Binding to a platform can introduce a long term benefits for institutions or companies. Scratch, Microsoft Blocks, Google Blocky etc it is the same to learn in blocks however not in terms of sourcecode. Writing a complex program this way can be pretty messy. The same basics, program fuctionality however no long term solution, no perfection, no optimalizations, no efficiency.

  81. Dea Maysa says:

    When setting up Arduino so that it can work as an embedded system,input the program into it. Sometimes in reality Arduino can’t work the way it wants. Can you explain, why did that happen? Thank you

    (Sorry for my bad English. I hope you understand what I mean)

  82. Darren Evans says:

    The way to make coding for this hardware reasonably free of pain points is to open source the tooling and libraries yes? That way extension developers for other IDEs can integrate the libraries and command-line tools into their IDE ecosystem. Are Arduino trying to lock people into its own IDE ecosystem deliberately. If so then it deserves to fail. Locking us into the hardware is fine and inevitable but don’t make writing software for your hardware a chore.

  83. Coman Nutu says:

    I will say it :
    Arduino is shit.
    ( not the board or the chip, they are fine )

    Having something working fast :
    Arduino gets things to work fast ?
    This is a far cry away from the truth. It is a lie.
    Every programmer who calls himself one, has a set of libraries and premade structures for projects, for increased productivity.
    Setting up a led blink program with microchip’s mplab takes me less than a minute.

    You won’t get far with shi..i mean Arduino.
    You make 2 led blink and half assed serial transmission. Then it’s over. The domain of most problems cannot be solved using the “Arduino” solution.

    Case at hand :

    I needed to have a joystick controller working over usb.
    Needed it fast.
    Went to shop, bought Shitduino UNO.
    You can’t use it’s usb port unless you overwrite the firmware in byzantine ways.
    Gave up after 4 hours of pure fail.

    Arduino sucks.

    ps: why the fuck do you have an usb port on the shit and i can’t use it from the start ?
    Bastards !

    pps: All bullshit for productivity and shit is a lie. Do not trust the arduino priests, they have no ideea what they are talking about. They know nothing, thus they belive to know it all.

  84. ARNAB BARUA says:

    I am an electronics engineer but I was a total noob in C programming. I used to see my buddies do AVR programming but the programming part seemed all Hebrew. I was saved by Arduino. See, its all about your own interests. I learned programming using Arduino but when I hit the limitations, I slowly phased out to Atmel Studio and AVR C. I find AVR C more interesting now. Its more than a year since I used Arduino IDE and I am using small AVR chips like Attiny13, Attiny5 and Attiny24.

Leave a Reply

Your email address will not be published. Required fields are marked *