preload preload preload preload

DIY Dashboard

Welcome to my DIY Dashboard project using an Arduino.

Arduino is an open-source electronics prototyping board that you can use to do basically whatever you want. I had one laying around and decided to do something cool with it connecting with the iRacing API. The idea of a dashboard was the first one that came to mind. I’ve started this project back in April 2011 and you can see some early prototyping videos at the end of this post.

Closeup on the dashboard

Closeup on the dashboard


Up and running

Up and running

The dashboard I’m posting here have the following features:

  • RPM lights
  • Gear indicator
  • Pit limiter, rev limiter and low fuel indicators
  • 5 general purpose switches and buttons
  • 1 rotary encoder for dialing

I bought all the components that I needed (with the exception of the Arduino itself) in a regular electronic component shop. You can see the parts list below and it’s also included in the RAR file at the end of the post. The total cost of this project was about U$ 27,00 excluding the Arduino (43,00 brazilian reais) and was really fun to do it. For it to work, I had to assemble everything into a perfboard, code the Arduino firmare to receive the data from the computer and light up the whole thing and also code the server software that grabs the data from the iRacing API and send it through a USB serial connection to the Arduino.

For the buttons to work, you’ll need to install PPJoy to emulate a joystick and receive the input from the buttons on the dashboard.

Parts list and avarage price

Parts list and avarage price


In the pictures below you can take a look on how it looks like inside the dashboard. I don’t have much electronics and soldering experience so it turned out not that beautiful, but hey, it works! You can also see the schematics for all the electronic components.

Inside the plastic case

Inside the plastic case




I’m releasing all the schematics, parts list, source code and firmware for this project. In the RAR is included:

  • VB.NET source code for interfacing with iRacing API, Arduino serial port and PPJoy DLL
  • iWrapClient.dll and PPJoyDLL.dll (I coded it too, but I’m releasing only the DLL)
  • Arduino source code ready for upload to the board
  • Schematics
  • Parts list

The contents of this project is distributed as “donationware”. If you find them useful, please consider doing a small donation.






This project was featured in the InsideSimRacing TWISR episode of May 6th. I’d like to thank Shaun and Tom as well as Darin and Jessica for showing my project on the show. Really cool to see it there



  • 35 responses to "DIY Dashboard"

  • اغانى شعبى 2017
    1:41 on September 30th, 2017

    Hello,I read your blog named “DIY Dashboard @ FergoTech – Simracing hardware and tools” on a regular basis.Your humoristic style is witty, keep up the good work! And you can look our website about اغانى شعبى 2017.

  • DonnieQOpray
    11:57 on July 24th, 2016

    To start with I would like to say excellent
    blog! I had a simple question that I’d like to ask should you not mind.

    I was interested to understand the way you center
    yourself and clear your feelings before writing. I’ve had a tricky
    time clearing my mind in getting my ideas out.
    I truly do enjoy writing nonetheless it just looks like the first ten to fifteen minutes are lost just
    figuring out how to begin. Any recommendations or hints?
    Appreciate it!

  • frank
    2:37 on August 17th, 2015

    Hi. I bought all the parts and wired how you said but I don’t know what to do with all the files ! Please help!

  • Brandon
    16:33 on September 8th, 2014

    Hey when i want to uploud to my Arduino i get alot of errors from the code

    iracing_ard_05012011:43: error: ‘IOexp’ does not name a type
    iracing_ard_05012011:44: error: ‘IOexp’ does not name a type
    iracing_ard_05012011:45: error: ‘IOexp’ does not name a type
    iracing_ard_05012011.pde: In function ‘void setup()’:
    iracing_ard_05012011:72: error: ‘myIOexpander3′ was not declared in this scope
    iracing_ard_05012011:72: error: ‘P2′ was not declared in this scope
    iracing_ard_05012011:73: error: ‘P3′ was not declared in this scope
    iracing_ard_05012011:74: error: ‘P4′ was not declared in this scope
    iracing_ard_05012011:75: error: ‘P5′ was not declared in this scope
    iracing_ard_05012011:76: error: ‘P6′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void loop()’:
    iracing_ard_05012011:140: error: ‘myIOexpander3′ was not declared in this scope
    iracing_ard_05012011:140: error: ‘P0′ was not declared in this scope
    iracing_ard_05012011:143: error: ‘P1′ was not declared in this scope
    iracing_ard_05012011:145: error: ‘P1′ was not declared in this scope
    iracing_ard_05012011:147: error: ‘P1′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void blinkFuel(bool)’:
    iracing_ard_05012011:165: error: ‘myIOexpander3′ was not declared in this scope
    iracing_ard_05012011:165: error: ‘P1′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void showRPM(int)’:
    iracing_ard_05012011:192: error: ‘myIOexpander1′ was not declared in this scope
    iracing_ard_05012011:194: error: ‘myIOexpander1′ was not declared in this scope
    iracing_ard_05012011:198: error: ‘myIOexpander2′ was not declared in this scope
    iracing_ard_05012011:198: error: ‘P0′ was not declared in this scope
    iracing_ard_05012011:200: error: ‘myIOexpander2′ was not declared in this scope
    iracing_ard_05012011:200: error: ‘P0′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void showGear(int)’:
    iracing_ard_05012011:209: error: ‘myIOexpander2′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void turnoffrpm()’:
    iracing_ard_05012011:214: error: ‘myIOexpander1′ was not declared in this scope
    iracing_ard_05012011:215: error: ‘myIOexpander2′ was not declared in this scope
    iracing_ard_05012011:215: error: ‘P0′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void turnoffgear()’:
    iracing_ard_05012011:223: error: ‘myIOexpander2′ was not declared in this scope
    iracing_ard_05012011.pde: In function ‘void turnoffall()’:
    iracing_ard_05012011:228: error: ‘myIOexpander1′ was not declared in this scope
    iracing_ard_05012011:229: error: ‘myIOexpander2′ was not declared in this scope
    iracing_ard_05012011:230: error: ‘myIOexpander3′ was not declared in this scope
    iracing_ard_05012011:230: error: ‘P0′ was not declared in this scope
    iracing_ard_05012011:231: error: ‘P1′ was not declared in this scope

    • Joe
      17:44 on June 8th, 2015

      Im having the same issue any idea??

  • Marcio Arizon
    4:51 on May 23rd, 2014

    Ficou muito bom, parabéns.

  • jimdo.Com
    2:21 on May 18th, 2014

    Je voudrai vous dire que c’est véritablement du plaisir de venir sur ce

  • how to kiss
    6:17 on January 10th, 2014

    How to kiss: comment embrasser une fille

    Kissing is’nt as challenging as it would
    seem. Most think they don’t know how but when the time comes
    they’re in fact really great at it!

    A initial kiss should always be spontaneous but subtle, slow, and sweet.

    If your spouse kisses you very first you may open up your lips a little,
    but NO french kissing. It would destroy a very first kiss, comment embrasser and be sloppy.

    The idea, is really to press your lips up in opposition to your associates but not to much.

    Make confident your place is cozy also, so your not in
    ache whilst kissing.

    If your Kissing your companion, comment embrasser possibly start off by kissing him/her softly on the cheek, then
    when he/she looks at you, you can kiss them softly on the lips.
    comment embrasser

    And keep in mind becoming alone may be far better for a
    first kiss. Issues may not be so great with freinds watching…or jealous exes….
    comment embrasser une fille

    Remeber, remark embrasser une fille if the kiss was unusual you also can constantly laugh it
    of safley and try again up coming time.
    Si vous êtes déjà demandé comment embrasser votre partenaire, sans
    crainte d’être rejeté et la façon de rendre le
    baiser aussi passionné que possible, alors ne vous inquiétez pas.
    en suivant ce guide simple, vous aurez même la fille que vous êtes après penchant
    pour vous embrasser!

    un baiser peux vous faire du bien ou l’inverse,
    donc il est important de faire une bonne première impression quand il s’agit de baiser.
    ce guide va vous transformer à partir d’un ameteur à un prefessionnel en embrassant quelques
    minutes sans avoir besoin de pratique.

    vous pouvez consulter ce guide en ligne ou téléchargez-le gratuitement!
    obtener ce guide pour découvrir les ingrédients pour
    le baiser parfait!

  • SEOPressor
    1:32 on December 14th, 2013

    Hi, after reading this amazing article i
    am too happy to share my know-how here with friends.

  • do pheromones really attract women
    16:13 on April 20th, 2013

    Pricey Oscar,
    Thank you for halting by. From everything you say,
    it seems like there may well be a foundation to take
    this partnership additional. Having mentioned that, before braoching the
    topic of the partnership stone chilly, my suggestion could
    be to consider her out into a romantic evening meal or a night out (theatre/movie
    and so on) and kiss her goodnight. And see the way it goes from there.
    …good luck and you should let me understand what develops.

    7:12 on February 25th, 2013

    I and my friends watch the football game clips at YouTube
    for all time, because they have in nice quality.

    11:08 on February 15th, 2013

    I’m extremely impressed with your writing skills and also with the layout on your blog. Is this a paid theme or did you modify it yourself? Anyway keep up the nice quality writing, it is rare to see a great blog like this one nowadays.

  • Anchor3
    5:05 on December 29th, 2012

    Marvelous, what a web site it is! This weblog provides helpful facts
    to us, keep it up.

  • Armani exchange watch
    18:29 on December 28th, 2012

    A luxury watch may be purchased for multiplicity of reasons, personal
    satisfaction, gift for a friend, treasured keepsake, present for a special someone or an heirloom set
    aside with thoughts of the passing generations.
    Mechanical: this movement requires you to manually wind the spring by using the knob on the side of the casing.

    The reputation from the original luxury watch brand’s founder combined innovation and quality particularly with regard for the higher precision mechanical view motion.

  • David Ballew
    2:05 on December 19th, 2012

    hey guys i am triing to build this box but am having a error come up. I dont know how to write code or read it for that matter but i have been wanting to do this for a long time. Is there somneone that coupld posible help me with this and guide me in the way of direction i need to go. Thank you for your time

  • kid educational software
    0:52 on October 25th, 2012

    Oh my goodness! Awesome article dude! Thank you, However I am going through
    difficulties with your RSS. I don’t know the reason why I cannot subscribe to it. Is there anybody else having similar RSS issues? Anyone who knows the solution will you kindly respond? Thanx!!

  • byers used cars columbus ohio
    22:07 on October 24th, 2012

    Hi everybody, here every one is sharing such experience,
    thus it’s nice to read this web site, and I used to visit this web site all the time.

  • Dog crates pet
    19:14 on October 24th, 2012

    Hi, I do believe this is a great web site. I stumbledupon it ;) I
    may come back once again since i have book-marked it.
    Money and freedom is the greatest way to change, may you be rich and continue to help other people.

  • 100 Euro lenen
    19:27 on October 23rd, 2012

    Thanks for sharing your thoughts. I really appreciate your
    efforts and I will be waiting for your next write ups thanks once again.

  • doppelwandiger Edelstahlschornstein
    10:27 on October 7th, 2012

    Your style is so unique in comparison to other people I have
    read stuff from. Many thanks for posting when you’ve got the opportunity, Guess I will just book mark this blog.

  • Oyunu
    20:49 on August 23rd, 2012

    What’s up i am kavin, its my first time to commenting anyplace, when i read this piece of writing i thought i could also make comment due to this sensible article.

  • Clicking Here
    1:05 on July 27th, 2012

    Everyone loves what you guys are usually up too. This sort of clever work and coverage!
    Keep up the very good works guys I’ve incorporated you guys to my personal blogroll.

  • Rob U
    12:04 on July 23rd, 2012

    Have you tried the Arduino Leonardo board? Might be a way to avoid ppjoy.

    “While the Leonardo appears as a virtual serial port to your operating system (also called CDC) for programming and communication (as with the Arduino Uno), it can also behave as a (HID) keyboard or mouse.”

  • Woz Jr.
    22:03 on January 30th, 2012

    Voce é brasileiro? To com dificuldades de achar o rotary encoder.

    • Angel
      14:57 on April 20th, 2012

      You can use two momentary switches, so one will be for right movement and one for left movement. Thats really a rotary encoder internally. Take a look to the schematics, it’s easy to change rotary encoder with two actuators.

  • Jordan
    22:30 on January 29th, 2012

    wow, nice!

    im doing something in a similar category; im using encoders and buttons to make a DIY racing wheel with an arduino. a C# app reads the encoder positions from the arduino, then adjusts a virtual joystick from the ppjoy software. the racing game then reads the virtual joystick.

    has anyone ever used a ppjoy library with C#? i can figure it out.

  • Rob U
    1:17 on January 24th, 2012

    Great project. I have the lights up and running, which included having to redo the arduino library for my port expander chip. I am having a devil of a time getting the buttons to work since I am running Windows 7 64 bit and ppjoy is not playing nicely (actually not at all). I am learning about coding up my own virtual HID driver so there is a bonus in that.

    Thanks for the inspiration!

    • fergo
      1:31 on January 24th, 2012

      Cool! Are you using some reference to code the virtual driver? I tried searching for some documentation about virtual devices, but got no luck. If so, can you share a link?

      • Rob U
        2:44 on January 24th, 2012

        I am working with the example file in the windows WDK (

        It’s slow going for me though…I am mechanical engineer by training.

      • Rob U
        2:47 on January 24th, 2012

        Ooops. I should point out that this is a Studio 11 example.

      • Rob U
        20:01 on January 25th, 2012

        During further exploration I found vmulti which looks like it has done a good chunk of the work and has a test app. Looks like something for the weekend!

        • Rob U
          11:58 on July 23rd, 2012

          I still haven’t gotten vmulti to work. Oh well.

    • Jordan
      23:00 on January 29th, 2012

      could i see you ppjoy code?

      see my post above for why.

  • fergo
    18:25 on October 13th, 2011


    Thanks for the comment.
    The encoder has infinite rotation.

  • Anis Wins
    16:52 on October 13th, 2011

    good job realy a good job

    can you tell me if the the rotary encoder is unlimited rotation or is a 340° ?

  • Leave a Reply

    * Required
    ** Your Email is never shared