For the past few years I have had the pleasure of learing software development. Like a lot of others, I initially focused on the web. The large amount of YouTube channels, blogs, podcasts, online courses and communities like DEV make web development very accessible to newcomers. Over time however I realized that, although I love the web, I wanted to build something that wouldn't disappear once you close your laptop.
Apart from building a few 'Hello World' projects on popular boards like the Arduino and Raspberry Pi, I didn't have any experience or fundamental knowledge about development for hardware. It was hard to figure out where to start to push past the hardware tutorial stage. That is why I decided to minor in embedded systems. Now that I have completed my minor I'd love share an overview of some of the things I have learned. Over time I realised that this read is pretty long and I figured that you might want to skip parts here and there. So I made a table of contents that allows you to do that.
- What is an Embedded System?
- Building an embedded system
- Software development: web vs embedded
- Keeping your head up
- Some cool places and faces in the community
A lot of people disagree on the exact definition of an embedded system. My favourite definition, even though the engineer who said it doesn't see it as a complete one, is:
An embedded system is a computerized system that is purpose build for its application.
-- Elecia White during 'A Gentle Introduction to Embedded Systems', a presentation for her book 'Making Embedded Systems'.
To simplify the language that she uses: An embedded system is a (often tiny) computer that is build to perform one (or a few) specific task(s). Under this definition some examples of embedded systems are smartwatches, microwaves and the engine control unit in a car.
Embedded systems that are build from scratch require custom PCBs (Printed Circuit Boards). The goal is to build the smallest computer possible that will still meet the strict performance requirements. There is also a possibility some functionalities should be build with hardware instead of programmed within the software. The main reason for picking hardware over software is speed. Software on an embedded system is usually written in C or C++ and works with a RTOS (Real Time Operating System), embedded linux or no OS at all.
The hardware part of the process aligns a lot more with EE (Electrical Engineering) than with CS, software engineering or software development. This is why, at my college, the embedded systems minor is hosted by the EE department. It is also the main reason why it takes some time to switch from web to embedded. Even if you are a developer that puts the focus on the software within an embedded system, you need the know hardware fundamentals in order to properly debug your code.
The creation of an embedded device has a couple of stages which don't strictly happen one at a time. Each of these stages require different skills, knowledge and tools.
When the goal and the requirements of the project are clear, it's time to look for the hardware you need. This is often a combination of, but not limited to, a microcontroller or microprocessor, sensors, ICs (Integrated Circuits), resistors, capacitors and transistors.
In this fase it's important to try things out. That is why you'll most likely use a development board for a specific microcontroller and connect it to different sensors with jumper wires on a breadboard. If you have played around with electronics before you probably know the Arduino Uno, a development board that simplifies the development for the ATmega328. There are a lot more development boards and even more microcontrollers that might bring you closer to your goal. In this stage you'll mostly write software to see if you can get everything up and running.
Datasheets will help you to understand the features, usage and configuration of all the hardware components. These datasheets can range from a single page for simple LEDs to hundreds of pages for a microcontroller.
There is a possibility that some parts can't be placed on a breadboard or have a high chance of breaking when configured incorrectly. It's a good idea to simulate these parts and see if you can figure out the right configurations based on information in the datasheet. A popular free solution that can be used to do this is LTspice.
When a development version or small prototype is done, you can start documenting and finalizing the hardware design. A few popular tools for designing hardware are KiCAD, EasyEDA, Eagle and Altium.
The first thing that has to be created is a schematic capture. This is a visual representation of all the hardware components you'll need. Depending on the size of this diagram, the connections between the components are specified with lines or labels.
The next step is the PCB design. This design uses all the components specified by the schematic capture. You can draw a board, place components, draw traces ('wires' on the board), drill holes and place text. When the PCB design is done you can generate gerber files so a factory can produce your PCB.
Besides designing the hardware it is also imported to write down some UMLs or flow charts of the (most important) software that will be put on the microcontroller.
The schematic capture and flowcharts end up in a datasheet of the designed hardware. Additionally pin defentions, possible configurations, operating temperatures, operating voltages and sometimes even example circuits are added to the datasheet as well.
Writing and checking a datasheet can take a lot of time. That is why it might be a good idea to send the gerber files to a factory before starting this process since manufacturing the designed PCB and shipping will take time as well. It's also smart to create a list of all electronics components that need to be put on the PCB, also called a BOM (bill of materials) and order all those components as well.
When the PCB and components are in, it's time to solder. Depending on the size of the electronic components a solder iron, hot air or even a special oven can be used to stick the components to the PCB. In case some components have a small SMD (Surface Mounted Device) packages you may have to use a microscope to make sure pins aren't soldered together.
Then the circuit can be tested or debugged using various tools like a multimeter, signsal generator, ocilliscope and/or logic analyser. These tools can also be used during the development stage if a development circuit isn't behaving like it should.
In case there is a problem in the PCB design, that can't be corrected by desoldering some components or soldering some extra wires or resistors to the board the design has to be fixed in the software and the PCB and components have to be re-ordered.
This is also the moment the full application that has to run on the microcontroller is completed with all the necessary optimisations (if that hasn't been done already).
If there is a version of the hardware that can be tested it is time to perform unit, integration and finally acceptance tests. The unit test is a test where controlled inputs and outputs are 'written' and read from the design. If the right signals come back within a specified time-frame in various condition it passes the test. The integration test is done when your hardware has communicate with other pieces of hardware. If that communication goes well it passes the test.
The acceptance test should only be done with a PCB that contains the final design and didn't need any extra debug hardware fixes. In this test the full system will tested to see if all requirements of the system are met.
In some cases specific test results and behaviours are put in the datasheet as well.
When all the test pass you hand over the physical product, designs and documentation. It's time to celebrate since this process can take months or even years.
Embedded software development and web development have a few similarities. The most general skills that will help in both types of development are logical/computational thinking, creating algorithms, debugging, clean code and creating useful comments and documentation. What makes or breaks embedded software development for an individual lies within the differences.
The web is extremely diverse. Although a combination of HTML, CSS and JS on the front-end is the norm, there are quite a lot of front-end frameworks out there. Besides that a lot of different languages can be and are being used on the back-end. You could look for a back-end position right now and encounter: PHP, Python, NodeJS, Ruby, C#, Java and a lot more.
The embedded systems industry shows a clear preference of C and C++. This is mainly because these languages have the toolchains to compile for nearly any microcontroller. The control over memory also makes the use of these languages ideal. Python seems to grow in popularity as well. This could be because of the release of micropython. I've also seen some anecdotes on reddit of how Raspberry Pi compute modules are used on PCBs. Another interesting language is Assembly which is mainly used for small pieces of software that need to meet strict timing deadlines.
Other notable languages are VHDL and Verilog which don't produce code that runs on a machine but a hardware design that can be adopted by a FPGA (field-programmable gate array). This is an IC that can change its own circuit. So instead of writing software you are writing hardware.
If you happen to be a web developer that has switched jobs or works at an agency that has multiple stacks in production right now you'll know what it feels like to switch between frameworks. If you are lucky most concepts stay the same, making it mostly a matter of learning syntax.
Being able to write efficient software for a specific 'family' of microcontrollers is similar. It means you'll have to learn what features are available and in what ways the microcontroller can be configured. Due to the amount of differences between most families however it could be seen as picking up a new programming language rather than picking up a new framework. Other than that it's very similar. The first one will be hard but moving on to another family afterwords should be relatively easy. The biggest hurdles will probably be some newly introduced concepts tied to specific features and the Assembly language of the specific chip.
The most common web applications don't require math beyond high school level. Besides that you can trust that most of your users have a processor that is powerful enough to handle complex math within a certain amount of time.
Within embedded software development there are often some processes that require math that ranges from high school level to calculus on microcontrollers that are often not powerful of fast enough. A great example of one of these processes is DSP (Digital Signal Processing). This is used for processes video and audio and requires some calculus. Meeting the requirement or even making sure the application works means you have to pre-calculate coefficients and use mathematical tricks like fixed point numbers.
Additional hardware can be added to take some of the pain away but that will increase the cost of the device. Some things might have been implemented by someone online but run too slow in your specific application. Don't worry too much about calculating those coefficients though. Tools like matlab and miniDSP can help with that. The most important is that you know how to type of mathematical functions you will need to apply to reach your desired outcome (or at least how to translate them to code after googeling). The same goes for all the other cases math is needed (increasing accuracy of sensors, increasing speed,
Not all systems don't need heavy math and everything can be learned so don't let that scare you!
The use of binary is another thing that isn't really used in web applications. However all input signals from external sensors are ones and zeroes. Depending on which abstraction layer you code you may have to configure a microcontroller by changing bits and figuring out bitmasks. Again don't let this scare you, anything can be practiced.
A switch between fields can take its toll on you. Right now this is written from the perspective of taking a minor from a major in a different building. However, I strongly believe that these feelings are really universal and apply to situations beyond college and will occur after any major switch.
Stepping into a new environment makes most people nervous. No matter how introverted or extraverted you are, as humans we want someone to connect to. In most cases you'll be fine, unfortunately my 'nightmare' manifested itself making the first four weeks of my minor very difficult on an emotional level as well.
As the only the only on from my major and a non stereotypical electrical engineering look a lot of people gave me the 'don't even bother, you'll drop out anyways vibes'. Don't beat yourself up if classmates joke amongst eachother that they don't want to sit next to you, teachers randomly ask you of they should repeat material in a non-native language or if you sit alone for the first few breaks. Do know that you have to make a decision, is what you want to learn really worth the emotional hit? In my case I determined it was but I also made sure I did the following:
- Text my close friends when possible
- Taking on a hobby that involves being with other people
- Make sure I make time to spend time with family
Over time people realised I wasn't going to drop out and I have defintely noticed I earned some respect because of it. Besides that the project team I'm on slowely started to bond. So there were people I could say good morning to and to be fair from that moment on a lot of loneliness issues started to fix itself.
The classic imposter syndrome will creep up at some point. Especially if you are surrounded by people with a specific foundation you don't have remind yourself that you are new to all of this. A growth mindset is the most important thing you need to develop to stay on track. Make sure to write down all the things you learn and keep the work you can. Looking at everything you have accomplished up until this point can have a theraputic effect.
A switch is never just about technical skills, you'll be surrounded by a different community with different interests, values and key players. There are various resources and places to learn more about hardware and embedded systems. This is a list of my favourite go to places and people on the internet.
Hackaday.com is a site that shares the latest news for within the electonics and maker community. They also host the 'superconference' and share interesting projects from their community websites.
Hackaday.io is a platform that to showcase your hardware/software/embedded projects and interact with other makers. This is the community site of hackaday.com. There are a lot of cool projects that share components and files that allow you to rebuild it yourself.
Hackster is another platform which allows you to share projects. Most projects come with a very detailed description of how to build them yourself and are mostly based on development boards and popular platforms like Arduino and Raspberry Pi.
Adafruit is an American company that designs, produces and sells hardware that can be used by from beginners to advanced makers. Besides that the company has made a lot of open source libraries and also teaches about electronics through their learning platform and blog. Adafuit's products are also sold by (web)shops that are based outside of the use because of their quality and accessibility.
Sparkfun is another American company that designs, produces and sells hardware that can be used by both beginners and advanced users. Their products are also sold by shops based outside of the US because of quality and accessibility. They produce open source libraries and have a learning platform and a blog as well. What makes Sparkfun so cool is that they share all the design files of their self made products. This means you can not only buy them but see exactly how they are made and maybe even make some adaptations and send it off to the factory yourself.
All about circuits
All about circuits is a platform for electrical engineers that provides an open source textbook, news, tools and a forum. The educational content, especially their textbook, is extremely useful for hardware beginners. The fundamentals of electronics are explained in a slow pace with analogies and drawings. They also have a youtube channel that they use to introduce new mouser products.
Element 14 is another community with a forum (and a shop). They took over the ben heck show on youtube and share both entertaining and educational content based on electronics. I personally love the learning circuit because it teaches theory behind common concepts that are used in popular projects.
For electronics tutorials & fun projects Great Scott is one of the best youtube channels out there. He doesn't just walk you through what he does but also explains why he does certain things. This helps you to build your understanding of electronics in an entertaining way.
Personal favourite: How to create a simple Touchscreen GUI || Arduino LCD & Touchscreen Tutorial
Afrotechmods is another youtube channel that explains a lot about electronics and presents some projects from time to time. Unfortunately the last upload (as of writing this blogpost) was a year ago. However the creator is pretty active on twitter and has a Udemy course on how to build wireless charging circuits with a very good rating.
Shawn Hymel can be seen as another hardware advocate that has created educational videos and tutorials for Sparkfun, Adafruit. He has his on youtube channel on top of that. His tutorial series on KiCAD for Digi-Key is a really good start if you want to make your first PCB. Besides that he also has a tutorial series on Arduino and how to take your Arduino skills to the next level.
Bitluni is another maker with a youtube channel and a blog. He has build some very cool projects with a pretry populair development board called the ESP32. Not to long ago he posted a video on how he build a shield that transformed his ESP into a video game console.
Ben eater has the best youtube channel out there for people who would like to know how a computer works. He has a series in which he builds an 8-bit computer from scratch and explain how every part of it works. If you want to dive in the deep you can even buy the parts he uses and build your own!
EEV Blog is a Youtube Channel created by Dave Jones that has been around for ten years right now! It is centered around embedded systems and electrical engineering and covers a lot of topics from the use of different tools to the explaination of concepts around hardware.
Personal favourite: EEVblog #1176 - 2 Layer vs 4 Layer PCB EMC TESTED!
Jorvon 'Odd Jay' Moss
Jorvon Moss or 'Odd Jay' is the reason why I decided to take this journey. He makes robots that he takes with him by attaching them to his coat. He uses a combination of 3D printers and development boards to make his companion bots and often leaves guides on hackster with a guide describing how to make them yourself.
Helen Leigh is a technical writer and maker who creates art by using electronics innovative ways. From stitching electronics on fabric with conductive thread to DIY musical instruments she explores whatever is on her mind and shares it with the world. Through her book she learns kids and beginners to mix electronics and crafts.
TwinkleTwinkie is a PCB artist that makes and sells a lot of badges that can be worn. He posts a lot of designs on on Hackaday and reveals how he achieves certain effects. He also has a few lectures and demos on his youtube channel for those who want to learn how to build their own.
Jiří Praus is a maker that builds beautiful freeform PCBs by soldering wires and components to each other. The have a beautiful almost modern steampunk like look.
Seriously! Hopefully, this is a preview that made you at least aware of the existence of embedded systems. Embedded development is something I am really interested in right now so don't be surprised if you see more posts about electronics and microcontrollers 😄