Exploring Edison - In C
Written by Harry Fairhead   
Friday, 03 July 2015
Article Index
Exploring Edison - In C
The Program

You have a choice of languages that you can use with the Edison, but there are big advantages to choosing C or C++ for bigger projects. If you know Python or JavaScript then you will find it very easy to make the switch. So let's do it in C.


This is a chapter from our ebook on the Edison. The full contents can be seen below. Notice this is a first draft and a work in progress. 



Now On Sale!

You can now buy a print edition of Exploring Intel Edison.
You can buy it from:

USA and World  Amazon.com
Canada              Amazon.ca
UK                      Amazon.co.uk
France                Amazon.fr
Germany            Amazon.de
Spain                  Amazon.es
Brazil                  Amazon.br
Italy                    Amazon.it
Japan                 Amazon.co.jp
Mexico               Amazon.com.mx 

Chapter List

  1. Meet Edison
    In this chapter we consider the Edison's pros and cons and get an overview of its structure and the ways in which you can make use of it. If you have ever wondered if you need an Edison or an Arduino or even a Raspberry Pi then this is the place to start. 

  2. First Contact
    When you are prototyping with the Edison you are going to need to use one of the two main breakout boards - the Arduino or the mini. This chapter explains how to set up the Edison for both configurations. 

  3. In C
    You can program the Edison in Python, JavaScript or C/C+ but there are big advantages in choosing C. It is fast, almost as easy as the other languages and gives you direct access to everything. It is worth the effort and in this chapter we show you how to set up the IDE and get coding. 

  4. Mraa GPIO
    Using the mraa library is the direct way to work with the GPIO lines and you have to master it. Output is easy but you do need to be aware of how long everything takes. Input is also easy but using it can be more difficult. You can use polling or the Edison interrupt system which might not work exactly as you would expect.

  5. Fast Memory Mapped I/O
    There is a faster way to work with GPIO lines - memory mapped I/O. Using this it is possible to generate pulses as short at 0.25 microsecond and read pulse widths of 5 microseconds. However getting things right can be tricky. We look at how to generate fast accurate pulses of a given width and how to measure pulse widths.

  6. Near Realtime Linux 
    You need to be aware how running your programs under a non-realtime operating system like Yocto Linux effects timings and how accurately you can create pulse trains and react to the outside world. In this chapter we look the realtime facilities in every version of Linux. 

  7. Sophisticated GPIO - Pulse Width Modulation 
    Using the PWM mode of the GPIO lines is often the best way of solving control problems. PWM means you can dim an LED or position a servo and all using mraa. 

  8. Sophisticated GPIO -  I2C 
    I2C is a simple communications bus that allows you to connect any of a very large range of sensors. 

  9. I2C - Measuring Temperature  
    After looking at the theory of using I2C here is a complete case study using the SparkFun HTU21D hardware and software. 
  10. Life At 1.8V
    How to convert a 1.8V input or output to work with 5V or 3.3V including how to deal with bidirectional pull-up buses.

  11. Using the DHT11/22 Temperature Humidity Sensor at 1.8V 
    In this chapter we make use of all of the ideas introduced in earlier chapters to create a raw interface with the low cost DHT11/22 temperature and humidity sensor. It is an exercise in interfacing two logic families and implementing a protocol directly in C. 

  12. The DS18B20 1-Wire Temperature 
    The Edison doesn't have built in support for the Maxim 1-Wire bus and this means you can't use the very popular DS18B20 temperature sensor. However with a little careful planning you can and you can do it from user rather than kernel space. 

  13. Using the SPI Bus 
    The SPI bus can be something of a problem because it doesn't have a well defined standard that every device conforms to. Even so, if you only want to work with one specific device it is usually easy to find a configuration that works - as long as you understand what the possibilities are. 

  14. SPI in Practice The MCP3008 AtoD 
    The SPI bus can be difficult to make work at first, but once you know what to look for about how the slave claims to work it gets easier. To demonstrate how its done let's add eight channels of 12-bit AtoD using the MCP3008.

  15. Beyond mraa - Controlling the features mraa doesn't. 
    There is a Linux-based approach to working with GPIO lines and serial buses that is worth knowing about because it provides an alternative to using the mraa library. Sometimes you need this because you are working in a language for which mraa isn't available. It also lets you access features that mraa doesn't make available. 



Before we get started, it needs to be made clear why it is worth learning how to use the Edison in C. You can use languages such as Python and JavaScript and I have a great fondness for both. The reason for introducing another option is not about liking what you know - it is to do with efficiency. All of the system software on the Edison is written in C and Linux is written in C. What this means is that C programs have a direct and uncomplicated connection to the system software. This makes C programs simpler and faster and if you are writing an application using embedded hardware then speed is usually an issue. 

As well as speed, there is also the issue of timing. For many applications you have to be able to create a pulse of a known duration and within a specific time slot. The standard approach to Edison programming, i.e. using the Atom processor, isn't good enough for this task because Linux isn't a real time operating system and this introduces uncertainties into pulse timing. In situations such as these you have little choice but to move to programming the second CPU on the Edison board - the MCU. The MCU can, at the moment, only be programmed in C so if you want to future-proof your investment in the Edison, C has a lot going for it.

To summarize:

  • C is fast, efficient and gets you close to the hardware

  • You have to program the MCU in C so using it for the main processor as well makes sense.

Installing Eclipse

To write programs in C for the Edison the simplest way of working is to install and use the customized version of the Eclipse IDE provided for the Edison, the Intel System Studio IoT Edition, which can be downloaded from:


Eclipse is a well known IDE to Java programmers, but it is modular and can be customized to work with other languages. Intel has created a version of Eclipse that can be used to create C programs for the Edison and run and debug them very easily. You might outgrow the Eclipse approach, but it is very much the easiest way to get started.  

If you have used the Integrated Installer for Windows 64 then one of the options is to install Eclipse. You can rerun the installer if you want to add Eclipse to your current setup or if you need to refresh it. 




If there isn't an integrated installer for your OS then you can download Eclipse from the main IoT download site:  https://software.intel.com/iot/downloads

If you have to install Eclipse manually you will need a copy of 7Zip for Windows and you will have to download, extract and run the installer. You also need a copy of the Java Runtime Engine because Eclipse is a Java program. 

When you run Intel System Studio IoT Edition make sure you start it via the batch file devkit-launcher.bat - this is what sets up the standard version of Eclipse to run the IoT extensions. If you start it by running Eclipse.exe then the IDE will start but you wont have the IoT extensions installed. The batch file is linked to via the Eclipse icons that the installer creates. 

A First Project

When you first start Eclipse you will see the Intel IoT Developer Kit window. This is where you do everything that is specific to programming the Edison. If you need to see the IoT Developer Kit at any time just use the command Help,Intel IoT Developer Kit and the window will open. You can also pin the window as a sidebar in Eclipse so that you can see it all of the time.

A good place to start is the Hello World of IoT - blink an LED. In this case all we need to do is slect Create C/C++ IoT project and then select On board LED blink C and call the project LED or whatever you would like to call it.





At this point you might be a little puzzled as to what "On board LED" means. After all the mini-breakout board doesn't have an on board LED but the Arduino breakout board does. There are very few examples of using the mini-breakout board but this isn't a huge problem as we shall see. 

Don't click Finish, instead click Next. You have to tell Eclipse how to connect to your Edison so that the program can be downloaded and run.  All you have to do is enter the IP address of the Edison. If you have setup the WiFi then this connection will do the job perfectly, but there are other ways to connect an Edison to the Internet and these all work as well. 

Enter the IP address, a name for the connection and a description if you want to:




At this point you could start programming, but it is worth checking that you do have a connection. This is also an opportunity to discover how to edit and make use of connections. 

Last Updated ( Thursday, 12 May 2016 )