New domain and blog

New domain and blog
Please head over to my new domain to view my blog and current projects

Thursday, 29 August 2013

Raspberry Pi: 3x3x3 LED Cube

If you do a web search for LED cubes, you will notice that they have been built so many times and anything less than 8x8x8 is a bit of a waste of time. Knowing all of this, and basically because I am bored out of my mind, I decided to go ahead and build one with old parts lying around at home. 

I ended up with a small 3x3x3 LED cube connected to my Raspberry Pi. I chose 3x3x3 because no extra hardware is needed. All I needed to do was find 27 LED's which I took off an old LED matrix sign board. 


The basic concept is this; the cube, in this case 3x3x3, is made up of columns (9) and layers (3).On each layer, all the cathodes are connected together and in each column, the anodes are connected together. Therefore, 12 ouputs are needed to control all 27 LED's.

By driving the layer output low and the column output high, the specific LED will turn on. Driving both the layer and column output low, will turn the LED off. By sequencing what LED is on when, you can draw different patterns. The bigger the cube, the better patterns can be drawn.

Update:
I have drawn up a schematic to show the hardware connections for the cube and the cube to he RasPi's GPIO header.


You can download a schematic here.

Take a look at this 32x32x32 LED cube that someone build.


I wrote my code in Python3.2 using the Rpi.GPIO library.

Greg

Wednesday, 28 August 2013

Recipe: Beetroot Burgers

Over the last few weeks I have been on a veggie burger quest. It all started when I tried a SexyFood burger at the Bay Harbour Market in Hout Bay. I enjoy my meat, but am also starting to find the satisfaction in non-meat products. 


These are the burger that I have been buying from SexyFood. They are great but I am not going to be able to get them when I get back home to the UK. So began my quest to create a decent veggie burger. 

I tried some the other day and it all ended in a rather big mess. The base was potato but they just all fell apart. I then kept my eye out for another recipe that had decent comments. That is when I came across The Post Punk Kitchen and this recipe. The comments went on for ages and they were all positive so I decided to give it a go. I made a few small changes but it's pretty much the same. 

Ingredients:

  • 2 ½ cups cooked and cooled brown rice
  • 2 cups cooked and drained lentils (1 can)
  • 2 cups grated beetroot (raw) – can also use carrot but haven’t tried that
  • 1 small onion finely chopped
  • Salt and black pepper (add more pepper next time)
  • 1 teaspoon tyme
  • 1 teaspoon dry hot mustard
  • 1 teaspoon chilli powder (add more next time)
  • 1 cup breadcrumbs
  • 2 large tablespoons humus

Mix all ingredients in a bowl. Use food processor to blend. I blended about ¾ of the mixture finely and left ¼ rough to leave some texture, but do it how you prefer. Once blended, it is a relatively dry consistency but packs together well when pressed.

Use a burger press or round mold to form the patties. I cut the top rim off a yogurt container and used that as my mold. My patties were about 10 cm in diameter and around 10-15 mm thick. I wrapped each patty in cling film and put them in the freezer. The ingredients above made 12 patties.


When ready to eat, remove from the freezer and cook from frozen. After about 10-12 min they should be cooked through and ready to eat. Because all the ingredients are grated, they cook really quickly. I am not sure how well they will braai, but with a fine grid I'm sure they will be file. I'll definitely give it a go.

Eat with an avo and you will not be disappointed.


This is what I used for my mold to form my patties.

Greg

Wednesday, 17 July 2013

LabVIEW: Twitter toolkit

I have had this post in my head for a while but just haven't gotten around typing it up yet. I came across the LabVIEW Twitter Toolkit some time ago and gave it a go. It took a while to understand all the security features, but once I got my head around that, everything went smoothly.


The place to start is here. This will guide you through setting up your Twitter Developer Account and creating your application credentials. 

A few points to take note of:
  • You must add a callback URL, even if you just add your website. This field must be a valid URL and cannot be blank.
  • Your application must have read and write access.
  • Generate your Access Token if it has not been generated yet.
I have edited the basic single tweet example to count characters etc. Here is my version of the block diagram.



I count the characters in the Tweet string and if more than 140 are entered, I disable the Tweet button and change the font colour to red. The block diagram looks as follows.



So the idea is, the first time you run the program after you have set up your Twitter Application, enter only the Consumer Key and Consumer Secret. Then type a tweet and press the Tweet button. A browser tab will open and ask you to verify your application. Do this and then the tweet will be posted.

Now enter your Access Credentials and use them for every tweet in the future. By explicitly entering the Access Credentials, you prevent having to authorise your application every time you send a tweet.

That is all there is to it. Once you have it all set up sending tweets from LabVIEW is pretty simple thanks to the toolkit.

Here is a copy of my application if you want to give it a go.

Greg

Friday, 5 July 2013

LabVIEW: CLD Timing Engine

After working through the example programs from National Instruments, I found that most of them have a common trait. Since I have worked through the programs twice and seem to have an understanding of the architecture that I plan on using, that might all change later today – story for another day, I am focusing on getting set pieces of code together that I can generate quickly to save time.

One of the very important functions that I have been practicing is a Timing Engine. This Timing Engine needs to be able to be Started, Stopped, Paused, Reset, have a Target Time set, indicate whether the timer Has Elapsed and indicate the running Elapsed Time.


Here is my main program that I used to test my Timing Engine. It starts off by resetting the Timing Engine and setting a Target Time. It will then run until the Target Time has been reached at which time the Time Elapsed? indicator will be set. The Timing Engine can be paused by clearing the Advance Time control and reset by pressing the Reset control. 

The actual Timing Engine looks like this. (I got the idea from one of the example programs so this is not entirely my own work.) I like the way it works and can be put together really quickly so works well for me.


Basically, a time stamp is taken each time the vi is run. The previous time stamp is subtracted from the current time stamp giving the change in time (dt). If the Advance Time control is set, dt is added to the Elapsed Time and if the Reset control is set the Elapsed Time is set to zero. Once the Elapsed Time reaches the Target Time, the indicator is set. 

I have used this Timing Engine for the Car Wash, Sprinkler Controller and Boiler Controller and it works really well. There are many other ways to perform this same task, but this works for me and I hope it can help you in some way.

You can download the source files here.

Greg

Tuesday, 25 June 2013

My Pursuit of LabVIEW CLD Status

Over the last few weeks I have been honing my LabVIEW programming skills. Not having a full-time job at the moment, very long story, makes this learning easier; I have a lot of time on my hands, but also trickier; I only have the four example exams from the NI website and my imagination to come up with programs to write. My mind also wonders onto Raspberry Pi, TI LaunchPad, running in the forest and various other distractions. 


As can be seen from my last post, I have worked through the four example exams with varying success. I have started round two to get my times down and skills up. So far so good.

I downloaded the example exams quite a while ago but for some reason I found myself back on the CLD e-kit webpage yesterday. Either a new download has recently been added or I just haven't noticed it before, but there is a a download called Preparation: Download Certification Prep Exam Sample Exercises.

This folder is brilliant. Firstly, it gives you a break from writing long, complete programs and secondly, it explains/demonstrates some fundamental processes that can be used in your final programs. The exercises are also only around 45-60min long so great when you don't have much time. 

I worked through 6 today and although I knew most of the principals, it was nice to get a reminder and refresher on some of the basics.

So if you don't have the exercises yet, go and download them and have a look. 

Greg

    Tuesday, 4 June 2013

    LabVIEW CLD Preparation

    I am busy getting ready for my LabVIEW CLD exam so working through the worked examples. I have just completed the first one, The ATM Machine and would really appreciate any feedback that you can provide.


    After looking at the solution, I realised that my version of the solution might have been a bit of overkill, but it works and this is a learning process for me. I will be adding all my solutions here so will try and keep this as clean as possible. If you do decide to comment, please not what solution you are commenting for.
    What I have learnt from the example exams:
    • If you get stuck on a section. leave it, carry on and come back to it later. It’s better to get as many sections completed as possible rather than having one section not working and the rest not done as time ran out. I got stuck on one section for 45min and was just getting frustrated with myself. I eventually got up and left it for a few hours, I know you cant do this in the exam. When I came back to look at it, I solved the problem in 5min, a Boolean constant was false instead of true.
    • Document, document, document. Do documentation as you are writing the code. There might be no time left at the end to get your documentation done and it is a HUGE part of the total mark. I still need to do much better here.
    • A quote that I heard while doing an edX online course. “Comments should describe things that aren't obvious from the code: WHY, not what" John Ousterhout
    • Practice, practice, practice. There are a few tricky areas that I have picked up by doing the example programs. Small/simple things that have taken a lot of time to figure out. Just being aware of these might save you a lot of time.
    • Test your code regularly. The more you test the better the chance of you having a working program to submit. I test my code after every change I make. This might be overkill, but at least I know that I will always have working code with the functionality that I have added.
    • When I redo the example exams next week, I am going to start getting into the habit of backing up my code. I currently use Tortoise SVN to make regular backups but this is not available for the exam. Keep a working copy and backup after you finish a section.
    • Use breakpoints, extra indicators and the probe tool to debug. Sometimes a simple problem that can a long time to figure out, but this time can be drastically reduced by using the tools available.
    ------------------------------------------------------------------------------------------------------------
    ATM Machine 1:
    Here are some questions that I have:
    • Is it necessary to provide HTML help files for every VI? Takes quite a bit of time which could be used elsewhere.
    • For the exam, do you need to make an executable to provide with the solution?
    • I know my 'Enter Pressed' case in the MHL needs some work. 
    • Is there a way to update a single element in the Accounts.txt file or do you need to rewrite the whole file?
    You can find my post on the NI Forums here.
    Or you can get a copy of the code here.
    ------------------------------------------------------------------------------------------------------------
    Boiler Controller 1:
    I have just finished the Boiler Controller example. This took me around 5 hours so I’m getting quicker. Need to practice some common VI’s that I use so that I can get those done quickly. I found the question not as clear as the ATM Machine but I think I got there.
    Some questions again:
    • The Stop button; is that just to stop the application because the shutdown button just restarts the application.
    • I ended up using quite a few local variables but not sure if that’s OK. Is there another way to do things. The main place I used them was for the start and shutdown process to remember the button states and valve position value.
    • My Time Count only counts in seconds. Is it necessary to count in milliseconds?
    • Is it necessary to disable any controls or indicators during certain steps? As far as I can see it doesn’t say so.
    You can get a copy of the code here.
    ------------------------------------------------------------------------------------------------------------
    Car Wash 1:
    This exam was by far the trickiest so far. Once I managed to get my head around the timing system, then the rest of the program just fell into place. I started yesterday and finished it this morning for a total time of around just over 5 hours. Practice is still needed but I am slowly starting to used to some concepts which I will study and hope to be able to use in the CLD exam.
    Only one questions this time:
    • Is it better to update the display in an Update Display case or each time outside the case but inside the While loop like I did in this program? I found it easier to do it this way.
    You can get a copy of the code here.
    ------------------------------------------------------------------------------------------------------------
    Sprinkler System 1:
    I finished the Sprinkler system in just over 4 hours which included being stuck on one part for over an 45min. Out of the four examples, I feel this one was the easiest to complete. I am not sure if is because of the practice that I have been having, or because it is the easiest question. I feel that I am getting there which is good.
    Next is to practice some common components that I can build quickly to save time, like the timing engine and getting the front panel built as quick as possible.
    You can get a copy of the code here.
    ------------------------------------------------------------------------------------------------------------
    Thanks in advance for all your advice.

    Greg

    Sunday, 2 June 2013

    Raspberry Pi: MCP23008 Port Expander

    I have been wanting to get an MCP23008 I2C port expander connected to my Raspberry Pi for quite a while. I finally got one and during my breaks from LabVIEW CLD exam preparation, made the circuit on some strip board. 


    Using the Quick2Wire Python I2C library makes getting this working really quick and easy. Just make sure you place your LED's the correct way around. I spent a bit of time debugging the I2C until I thought of checking the obvious. 

    Currently I only have the outputs working as I didn't have any switches with me. I'll add two switches and get that going next. 

    Here is the code that I used. I set up a little menu to select which LED to turn on or off. 


    Next I plan to get the software PWM working so that I can connect up to Cheerlights. Need to do some more studying and then will get that going. Also need some RGB LED's first.

    Until next time, happy coding.

    Greg

    Monday, 20 May 2013

    A week of LabVIEW courses at National Instruments

    Last week I sat my first two LabVIEW courses. I have been wanting to do some courses for a long time but have never really had the opportunity. Fortunately as I am not working at the moment, I got the time to do them. As I did my CLAD exam a few months ago, I decided to to LabVIEW Core 3 and LabVIEW Connectivity.



    LabVIEW Core 3 was on Monday to Wednesday and then LabVIEW Connectivity was on Thursday and Friday. The week was really packed in, but the amount of hands-on time kept us busy and focused.

    Over all I got more out of Core 3 and will definitely be using many of the concepts in my future programs. I have also thought back to some of my first programs and realised that I could have made them so much better in many ways. I am planning on doing my CLD exam around August so will be going over many of the topics in my practice programs. 

    I found Connectivity a more fun course where we learnt how to use many network tools and tools to include shared libraries from .net and many other programming languages.

    The examples that you work through for both courses are very in depth and explain the concept being taught very well. The instructors that lead the course are very knowledgeable and helpful about the course subject  and other questions and topics that arise during the discussion periods. 

    I highly recommend taking one or many courses that NI offer as this is a great way to learn quickly. The learning curve that I went through a few years ago when I learnt LabVIEW by myself would have been drastically shortened had I done some courses sooner. 

    Go on, give your NI representative a call and book a course today. You will not regret it one bit.

    Greg

    Wednesday, 24 April 2013

    Raspberry Pi temperature profile using LabVIEW

    Connected to my Raspberry Pi is a DS18B20 temperature sensor which I have mounted inside the case roughly above the processor. I wanted to map the temperature profile inside the case and have a visual representation of it. To do this I joined up a Python script, an SQLite3 database and LabVIEW.


    I only have one temperature sensor connected and the RasPi doesn't run very warm so this image is rather exaggerated. I'll explain a bit more later.

    So I started off by writing a Python script that runs on my RasPi. It measures the temperature and then logs it to a SQLite3 database that I store in a shared folder on a mounted USB flash drive. I have accelerometer data in the database too, but that will be added a bit later.



    That is all that happens on the RasPi. Next I wrote a LabVIEW program that queries the database over the network to get all the data. I need to do a bit of work on my query to just return the last line of data but that I'll add in future versions.

    To query the SQLite3 database, I used the this toolkit which works really well and is super simple to get set up. Once I have the temperature, I need to display it on in user interface. This is where Sensor Mapping Express VI comes in really handy.


    All you need to do is point to your .stl file and select where you want to the temperature sensors to sit on the RasPi. I used this model which I converted using Google SketchUp. This is where I had to use four dummy senors to be able to show the temperature difference. I have set the outside 4 sensors to 0 degrees Celsius and only sensor 0 is getting the temperature from the database. With more sensors this can be made a lot more accurate. As I said earlier, this is just to prove a concept for now.

    Every 100ms I query the database, build an array with the temperature data and then apply it to the Sensor Mapping Express VI. The temperature profile then changes according to the surface temperature of the RasPi.

    Here are the colours that I used for my mapping:

    Temperature vs Colour mapping:
    0 Celsius R-0 G-0 B-255
    21.25 Celsius R-0 G-255 B-255
    42.5 Celsius R-0 G-255 B-0
    63.75 Celsius R-255 G-255 B-0
    85 Celsius R-255 G-0 B-0

    I have already connected up an ADXL345 accelerometer which is acquiring tilt and pitch values, so my next step is to be able to move the  model in LabVIEW as I move my physical RasPi. Should be some fun for a few more hours.

    If you want a copy of my code, you can grab it over here.

    Please feel free to leave any tips, comments or questions below.

    Greg

    Monday, 22 April 2013

    Route static files for BottlePy web framework

    I have been using BottlePy on my Raspberry Pi for quite some time. I really like the simplicity of the framework and the ease at which you can get something up and running. The one issue I had, was that you could not load static css or js files. 

    There are ways around this, like placing your files in Gist and linking to the raw code, but this can be an issue when you want to run your webserver 'offline'. The documentation is not very clear on how to do this, so here is what I did to get it working properly. 

    This is the template that I use to route the static files. This is part of my main python code that runs the server.

    Then all you need to do is add your file names in the .tpl file. By doing this, your css, or js files can be stored locally so they can still be served if you are offline. 

    That is about it. I hope this helps because I really find this framework great to use and works flawlessly on my Raspberry Pi.

    Greg