Thursday 27 December 2012

Adafruit LCD and Keypad Kit

I purchased one of these this week and having played with it for a few days I have to say it is a great addition to the Raspberry Pi. It is the "Adafruit RGB Negative 16x2 LCD+Keypad Kit for Raspberry Pi" available from the Adafruit website here for $25 plus postage.  Which compared to the price of the Pi seems expensive, but this seems to be an issue with all accessories, as the Pi is just so cheap. For me the extra functionality this add on brings seemed well worth the money.

As its name implies it comes in a kit form which you have to solder together yourself.  I had not done any soldering before, but the Adafruit website claims "Assembly is easy, even if you've never soldered before and the kit can be completed in 30 minutes." and I can attest that I assembled it with no problems although I think it took me more like two to three hours than the 30 minutes (I assume that is the estimated time for someone more experienced at soldering).  The kit basically consists of a circuit board which is identical in size to the Pi and assembly involves soldering all of the components onto that board.

Once completed you have a unit which sits on top of your Pi connecting to the GPIO pins on the top left corner and resting on the ethernet port on the bottom right corner.  (When the model A is released early next year I guess that Adafruit will have to add some more parts to the kit to make up the height difference for the missing ethernet port).  You get a two row text display with sixteen characters on each line and a back light which you can change the color of for the whole display via code.  There are also five input buttons in the bottom left arranged in a directional pad configuration with a select button to the one side.

 
These look like they will be great for all sorts of projects, removing the need for a full keyboard, but in combination with the screen offering a full range of interaction with your projects.  My only slight criticism (and indeed my only criticism about the whole product at all) is I think these would have been better in the bottom right corner where the board is supported by the ethernet port.  Where they are, it feels if you pressed the buttons too hard it could dislodge the board from the Pi.  But to be fair I know nothing about circuit board design and me saying "can't you just move that bit over there?" about something which might be in fact quite difficult, could well be a rather unhelpful comment.  Maybe this could be a 3D printing project for someone to build some sort of support for that corner?
 
In the bottom right of the board is a small potentiometer which once you have your board assembled and running you use to adjust the contrast (using a small screwdriver) to get the display nice and clear (apparently each LCD screen is slightly different, hence the need to manually set this.)
 
Once you have the board assembled and connected to your Pi it is time to get some code running on it.  There is some sample code to get you started on the Adafruit website here.  I found it did not work for me first time and I had a panicked moment of thinking my soldering job was not up to scratch.  But after a quick Google of the error message I found it was in fact something I could fix from the software side of things.  In fact just re-reading the instructions as I write this, I realise I missed the very first instruction:  "edit /etc/modules (sudo nano /etc/modules) and add: i2c-bcm2708 i2c-dev to the end of the file. Then save and reboot to enable the hardware I2C driver.". So if it doesn't work first try for you, try what I did not bother to do and recheck that you followed all of the instructions!  After that try a Google search on your error message and then an inspection of your solder work.
 
My first actual useful project with it was to get my Pi to display its IP address when it boots up.  Great for being able to remotely connect into it without connecting a keyboard or monitor.  When I have time I will write up a full step by step guide on how to get this working.


Monday 26 November 2012

Getting started with Databases on the Pi with SQLite

Sooner or later one of your projects is going to need to store some data; and what better place to store that data than a database?  This post is going to run through the basics of what you will need to do to get started with databases on your Raspberry Pi.  To do so I am going to make use of a database technology called SQLite.

SQLite is an excellent choice of database technologies to get started with on the Pi for a number of reasons:
  • It is incredibly easy to install.
  • Python comes with built in support for connecting to it.
  • It is free and open source.
  • Databases are stored in a single file which you can directly connect to from your code, without the need of a running server process.
  • The library is small.
  • And yet a serious product being used in many well known products such as Mozilla's Firefox web browser.  Check this page out for a full list.
Obviously SQLite may not be the perfect choice for every project and if you want to read up some more about if it will be suitable for your particular project check out the Appropriate Uses of SQLite page on their website.

But I suspect that SQLite will be a good fit for many projects on the Pi.

Installation


I said that it was easy to install so here goes. Boot your Pi up to the command line (or if you are already in the graphical interface open LXTerminal) and type:

sudo apt-get install sqlite3

Wait while it downloads and installs; and you are done.

Creating Your First Database


So now we have installed it, the next step is to create a database.  You'll be pleased to know this is equally easy.  You will remember from above that I said SQLite databases were a single file.  So all we need to decide is what we are going to call that file and where we are going to save it.  For this example we shall call it MyFirstDatabase.db and we'll just save it in the default home folder.  So still on the same command line type:

sqlite3 MyFirstDatabase.db

You don't need to worry about any configuration options because there are none.  You are greeted by the sqlite command prompt








and that is it; you have created your first database and are connected to it.  There is one slight caveat to this.  SQLite has not yet actually created the database file, so if you were to exit SQLite now and look for MyFirstDatabase.db you wouldn't find it.  Why?  Well we haven't created any content for our database yet and with no content what do we actually have?  So let us start adding some content.

Creating Your First Table


In SQLite, data is stored in data tables which conceptually look much like data tables you would encounter in the real world:


First we need to create the table and then we need to add the data into that table.  To do both of these tasks we are going to use a language called SQL.

"Wait a second..." I hear you say.  "I thought we were already using SQLite, now we need another SQL?  And what's the difference?"

OK, good question.  SQL stands for "Structured Query Language" and it is a language much like Python is a language.  Though not strictly a programming language in the traditional sense, but specifically tailored for querying data.  SQLite is a program which let's you run SQL commands, much like the Python editor on your desktop will let you run a Python program, but also provides the whole mechanism of what to do with those commands.  SQL is found in industry applications such as SQL Server, Oracle, MySQL and many others.  Every program has a slightly different flavour of SQL, but the basics will be the same across all of them and well worth your time to learn.

 To create the table as shown type the below at the sqlite> prompt and press enter:

CREATE TABLE fruit ( name TEXT, calories INT, price NUMERIC);

As a helpful note, all commands in this blog post in blue text are SQL commands and should be entered at the sqlite> prompt.  Any commands in red text should be entered at the standard Linux command line $ prompt.

Don't forget the semicolon on the end.  If you do (as I always seem to) just put it on the next line and press enter. That's it, you've just created a table called fruit.

So what did we do?

Well fruit is the name of the table that we created and what we will use to refer to the table when we want to put data in and get data out of it.  name, calories and price are the names of the three columns;  TEXT, INT and NUMERIC are the datatypes for the corresponding columns.

For anyone who has used any other SQL database engines in the past it is worth noting here that SQLite uses a dynamic data type system.  This means you can actually store any type of data in any column.  The data types that you define when you create the table are merely recommended data types and do not enforce the type of data which can be stored in a particular column.  A more detailed explanation can be found on the SQLite website here.

Now if we exit SQLite we will find that it has created MyFirstDatabase.db.  Type

.exit

and then

ls

and we can see our newly created database sitting happily in the filesystem:


Inserting Data


Well now we have a table the next step is to get some data into it and again we are going to do this using SQL.

Reconnect to the database with the same command as before

sqlite3 MyFirstDatabase.db

Then to insert the first row of data you can see in the table above we type

INSERT INTO fruit values("Raspberry", 60, 4.99);

repeat for the next two rows

INSERT INTO fruit values("Apple", 52, 0.79);
INSERT INTO fruit values("Orange", 85, 2.5);

Great now our table has three rows of data, but how do we check what is there?

Querying Data


To see what data is in a particular table we use the SQL select command.

SELECT * FROM fruit;

which shows us the three rows of data we just added:



the * just means give me all columns.  Alternatively if we just wanted to see a subset of columns we could have typed

SELECT name, price FROM fruit;

now we just get the name and price columns returned



What if we want to filter a particular subset of rows?  For that we need a where clause

SELECT * FROM fruit WHERE price > 3;


gives us all rows where the price is greater than 3. Or

SELECT * FROM fruit WHERE name = "Apple";


returns just the Apple row of data.

The SELECT statement is really one of the cornerstones of the SQL language and these are just some very basic examples of what you can do with it.

Deleting Data


If we want to remove data from our table then we can use the DELETE command.

which is very similar to the SELECT command so

DELETE FROM fruit WHERE name = "Raspberry";

will delete the Raspberry row

DELETE FROM fruit;

will delete all of the rows in the fruit table.

TIP:  If you want to re-add the data you just deleted, a quick way to do this is to press the up arrow on the command prompt to get back the insert commands you initially used to add the data and just press enter on each one to run that command again.

Next


Look out for my next blog where we will look at how we can connect to our database from Python.  Essential if we want to start making use of databases in our projects.

Tuesday 23 October 2012

How to Setup Remote Desktop from a Windows Machine to your Raspberry Pi - Step by Step Guide

As I mentioned in the previous post I recently found the need to be able to remote desktop to my Raspberry Pi.  This is a step by step guide on how to set it up.

What does this guide help me do?


It will let you control your Raspberry Pi from another machine.  Meaning that the Raspberry Pi will not need to be connected to a monitor, keyboard or mouse.

Before we get started a few clarifications:

  • This guide is to set up remote desktop from another computer on your home network to your Raspberry Pi. 
  • It does not explain how to connect to your Pi from outside your home network.
  • The instructions are for connecting from a windows machine.

What do I need before I get started?

  1. A Raspberry Pi running the latest Raspbian “wheezy” image (at time of writing 2012-09-18-wheezy-raspbian.zip).  It should work with other Linux versions too, but that is the one I have tested with.
  2. The Raspberry Pi should be connected to your home network and have a internet connection.
  3. A second machine running windows that you want to use connect from which is connected to the same home network.

The Steps


Raspberry Pi Setup


So first we need to install some software on the Raspberry Pi, but don't worry it is very easy!
  1. Start up your Pi to the terminal prompt. 
  2. Type the following command "sudo apt-get install xrdp"
  3. If promoted enter your password (the default is "raspberry")
  4. Type "Y" and press enter.
  5. This is now installing xrdp onto your Pi which is the software we are going to use for the remote desktop connection.  Wait for it to complete.
  6. Restart your Pi.  We are going to check that xrdp is going to start up automatically.
  7. When your Pi has booted to the command prompt look for [ ok ] Starting Remote Desktop Protocol server : xrdp sesman.  This shows you that xrdp is installed and automatically starting up on start up of your Pi
  8. The last step is to make a note of the IP address of your Pi which should also be displayed on the start up screen.  In my case below it is 192.168.1.9.  This is the address of your Pi on your network and what we will use to connect to your Pi from the second machine.

Second Machine Setup


1. Launch Remote Desktop Connection which can be found at Start->All Programs->Accessories->Remote Desktop Connection
2. Type in the IP Address for your Pi which you noted above.

3. Click Connect (you may get a security warning at this stage just click OK if you do.  After all it is your Pi on your network so nothing to worry about security wise).
4. Leave the Module on the default of sesman-Xvnc and enter your username and password for your Pi.  (The default is pi and raspberry if you haven't changed them).

5. Click OK and after a few moments you should be greeted my your Raspberry Pi's desktop!

6.  When you are finished simply log-out from the Pi's desktop.







Monday 1 October 2012

Back To The Pi

Wow! It's October already.  I'm not entirely sure what happened to the summer, but I do know I haven't looked at my Pi in two months...

In starting up again I wanted to look at the reasons why I hadn't done more.  I am still very excited about the project and the device, so it is not lack of interest.   I feel like saying it was a lack of time and although work has been busy these last two months (with a major release now only days away) it's not fair to say I have not had time for other interests.

So what I am putting it down to is location.  I have read the debate that the cost of a Pi is actually significantly more than $35 as you need a number of accessories before it is a usable computer.  The counter to this argument (which I am generally in agreement with) is that many of the extra accessories you will need, people will find they already own.  Very specifically in this area and the most expensive accessory you will need is a display device.  But here is where I am beginning see a flaw in the argument and why I've not played with my Pi more.

I agree that most households (mine included) will have a HMDI enabled display in the home.  The problem I have, is this display is the television sitting in the living room.  Which has a number of intrinsic problems.  Firstly it is on a television stand, so when the Pi is connected to it you have to sit on the floor in front of it, which is not the most comfortable of positions.  Secondly when the Pi is all wired up in the middle of said living room with wires sticking out from it in all directions it doesn't really add to the ambiance of the room.  This meant I was packing it away between uses, which had the knock-on effect of I couldn't just play with it for 15 minutes as it took about that long to get it set up and put away again.  And the last problem of using the television is that it is actually used to watch television on!  So it was not like I could play with the Pi while watching some mindless TV show.

But I am all about solutions to problems and in starting again with my Pi this seems like the biggest one to address.  And my solution?  Remote Desktop.

I got it successively installed last night and can now remote from any of my other machines to the Pi.  This has already paid dividends with me getting further with my GPS project than I had before all from the comfort of my bed.

Look out for a blog post on how to set up Remote Desktop for your Pi coming soon.

Tuesday 24 July 2012

First Look at the GPIO Pins

One of the things that excites me about the Pi, is the ability to use the GPIO pins to control external devices.  Now I don't have much of an electronics background so this is all going to be pretty new to me.  I thought a good place to start was the article in the second edition of MagPi (the Raspberry Pi magazine which is an excellent read and I think compulsory reading if you are interested in the Pi).

Back in 2011 when I first got interested in the Pi project I thought I'd try and learn some basic electronics and so bought these from Amazon*:


Checking the components list I found my electronic kit had everything I needed.  All I needed now was a way to connect to the header pins on my Raspberry Pi.  According to the article I needed female to male jumper wires.  Now this was Sunday evening and I didn't want to order them off the internet and have to wait for them to arrive.  I wanted to start playing right then!  So I thought I'd go down to Radio Shack (a mere 5 minute walk from my house) and see if they had them...

Well, following my Radio Shack visit I have two pieces of advice for you.  Firstly if you want the sales assistants to leave you alone in Radio Shack then hang out in the electrical components section.  I'm sure if I had been looking at mobile phones I would have had multiple people ask if they could help me, as it was I got a pointer to the area of the store I needed as I walked in and then while I searched through draws of components for a good twenty minutes, nobody asked me if they could help.  Next time I'm in there looking at phones and someone asks if they can help me, I'm going to make sure I have a nasty electronics question ready for them.

But anyhow after twenty minutes of searching I couldn't find any jumper wires, so instead settled on these which I figured I could attach to the ends of wires I already had and then attach to the pins:


Which brings me to my second piece of Radio Shack advice: These are NOT the right parts!  As it happens I have managed to use them to hack a solution out of, which will do for now, but it's not one I'd recommend so I'm not going to go into the details of it here.  When I have a more permanent solution I will let you know.

 


I hooked up the circuit, following the digram from the magazine and fired up the RasPi.  Nothing went pop and there was no black smoke so all good so far.  Then I pressed the button and still no black smoke, but the faint shining of the LED; looks like I got it right!


Next step was to get was to install the GPIO drivers.  Now I hadn't yet connected my Pi to the internet, but no problem I just took my USB pen drive from my Pi and used my notebook to download the required file to the pen drive before returning it to the Pi. Then followed all the instructions without problem, until:

sudo python setup.py install

At which point I get an error message about not being able to download a requirement.  Looks like my Pi needs the net after all.  So I do actually have a network cable, the only issue with it is the length.  So the router gets pulled out from behind the sofa and into the middle of the room and then moving the Pi away from the monitor a bit gets the whole thing to reach.  Plugging the cable in makes some new lights light up on the Pi and then rerunning the command above works.

Next step is to create my Python program.  I manage to create the text file using the right click menu then using open with, I find my OS has a python editor pre-installed, nice!

I type in the code carefully as per the magazine, go to run it and get:

"Unexpected Indent"

What!?!  Python cares about how I lay out my code?  Python reads whitespace? Surely not?  But yes, indeed Python does care about indentations. Interesting...  I do see why this could be a good thing to enforce a standard coding style, but it worries me that there is code that I cannot see.  But removing one of the tabs from the line "<tab><tab>if mybutton == False:" fixed the problem and I had a working program which I was controlling with an external switch.

This is something I have been interested in doing for many years and have never even come close with any of my previous computers.  With the Raspberry Pi, I have a working prototype in a single evening.  Impressive stuff!

Tuesday 17 July 2012

My Pi has Arrived!

My Pi is here!  Very exciting.  So looks like I did everything right with the SD card, as it all booted up without issues.  Pictures of my board are here.

My two initial observations were just how small the thing actually is (I know I knew it was the size of a credit card, but it still seems amazingly small when you actually have it in your hand) and the second was how strangely satisfying it is to have a machine which boots to a command prompt.  Though I must admit I did spend a few minutes staring at said command prompt wondering: now what?

A little bit of digging in the wiki found the startx command and I booted into the GUI in no time.  So in terms of the accessories that I had, they all worked with no problems at all, just plugged them in and I was away.  I think I need to change the local to recognise it is a US keyboard, but thankfully I still remember where all the keys are supposed to be so didn't bother changing it at this point.

I didn't have loads of time to play with it this evening, so had a quick go with scratch before calling it a night. Didn't seem to be able to get any sound going, so that is probably the next thing I need to look at.  And for some reason I couldn't work out how to clear the stage in scratch.  But anyway I will leave you with my very first scratch program output:


Monday 16 July 2012

Final Preparations

My Amazon order arrived on time and all looks good.  I will say that the keyboard looks better on the web than perhaps it actually is.  In reality it is what I would expect for the price: nothing amazing but perfectly functional.

My last preparation task was to get my SD card ready.  I have decided to start off with the debian "squeeze" version from the RasPi website and decided I would use my netbook Ubuntu to write the image (may as well make this a Linux learning exercise at the same time!).  I used the excellent instructions from the wiki (http://elinux.org/RPi_Easy_SD_Card_Setup), which all went well expect that I ran out of disk space on the Linux partition on my netbook, so had to work out where the rest of my hard drive was "mounted" (Not quite sure what this exactly means, something to add to my list of things to learn at some point).  Decided to go for the command line option which worked out fine, but then when we got to re-sizing the flash partitions (http://elinux.org/RPi_Resize_Flash_Partitions) there seemed to be some maths involved, so bottled it and installed GParted which I have to say worked very nicely.  Next time I'll try it command line (probably...)


So I think I am ready for my Pi!



Fingers crossed I did everything right!

Oh and I think I have decided on my first project.  A GPS enabled car computer.  Watch this space for details.