The following few pages will introduce you to programming the GPIO on the Raspberry Pi using command-line tools, shell and C programs. We will use LEDs for output and buttons for inputs.
First – the development platform. This is a Raspberry Pi inside an SKPang breadboard system and I’m using components from their Raspberry Pi Starter Kit. The top of the case has been removed in my photos to reduce reflections for the photos.
Other starter kits are of-course available, (and you might not be in the UK!) but if you get something like this – a small breadboard, some female to male jumper leads, LEDs, resistors and buttons then you’ll be fine. (e.g. if you are in the US, then Adafruit has a range of some Pi accessories, but do shop around!)
Examples:
Dear Drogon:
I have looked at some of your project examples and I belive you do great job publishing this examples and teaching how to work with Raspeberry Pi.
I have looked into http://www.rasperrypi.org and elinux.org trying to find something similar as project VIC314 (retrotext.blogspot.co.uk/2012/06/its-complete-post-is-coming-soon.html). I’ll like to replace the Keyrah USB interface by using the GPIO of the RasPi. I found a good project that analyzes the C64 keyboard (www.waitingforfriday.com/index.php/C64_VICE_Front-End).
Do you think it is possible to program the Raspeberry Pi to use a C64 matrix keyboard as a main keyboard and still use the VICE Commodore 64 emulator? Ofcourse I’ll still like to have the two DB9 joystick ports too.
Do you think this can be done, what would you suggest me to read?
My best regards
It looks like an 8×8 matrix, so you need 16 bits of GPIO.
The Pi has 17 bits of GPIO, so this is do-able without any additional hardware. It looks like the joysticks might just be “keys” that are not on the actual keyboard, so that single 8×8 interface can read the 64keys on the keyboard, so I guess the joystic shadows some of those keys?
So with some careful building it should be possible…. Not sure about the analog inputs though.
If you need to use the Pi’s GPIO for other things as well, then you could use an I2C GPIO expander, or a single shift-register to represent
-Gordon
What is the fastest practical switching speed of the GPIO? Are you using system level API calls and so are they somehow scheduled in and out (no pun) with the OS or is there a low-level driver?
There is no low-level driver, you can poke the hardware directly and achieve something approximating 20,000,000 accesses/second. However you can not rely on that being reliable for many reasons.
-Gordon
Hi,
Nice to know you from your blog. it’s really useful information about Raspi.
I would like to try read PrinterPort / DB25 out from PC using GPIO on raspi.
Here code that i use :
import os
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN)
GPIO.setup(24, GPIO.IN)
GPIO.setup(4, GPIO.IN)
GPIO.setup(17, GPIO.IN)
GPIO.setup(27, GPIO.IN)
GPIO.setup(22, GPIO.IN)
GPIO.setup(10, GPIO.IN)
GPIO.setup(9, GPIO.IN)
GPIO.setup(11, GPIO.IN)
GPIO.setup(18, GPIO.IN)
GPIO.setup(15, GPIO.IN)
while True:
if ( GPIO.input(23) == False ):
print(‘Read data printer-out’)
print(str(int(GPIO.input(24)))+’ ‘+str(int(GPIO.input(4)))+’ ‘+
str(int(GPIO.input(17)))+’ ‘+str(int(GPIO.input(27)))+’ ‘+
str(int(GPIO.input(22)))+’ ‘+str(int(GPIO.input(10)))+’ ‘+
str(int(GPIO.input(9)))+’ ‘+str(int(GPIO.input(11))))
Pin 23 connect to Pin 1 on DB25
Pin 24 connect to Pin 2 on DB25 as BIT0
Pin 4 connect to Pin 3 on DB25 as BIT1
Pin 17 connect to Pin 4 on DB25 as BIT2
Pin 27 connect to Pin 5 on DB25 as BIT3
Pin 22 connect to Pin 6 on DB25 as BIT4
Pin 10 connect to Pin 7 on DB25 as BIT5
Pin 9 connect to Pin 8 on DB25 as BIT6
Pin 11 connect to Pin 9 on DB25 as BIT7
When i try to print a as char, the output is :
pi@raspberrypi ~ $ sudo python /home/pi/hadi/readParalel.py
Read data printer-out
Read data printer-out
(
Read data printer-out
P
Do you have idea how to read PrinterPort out data using GPIO on Raspi..,
Thank you..,
Muhammad Abdul Hadi
Hi,
I don’t maintain the Python wrappers for wiringPi – I just do the C side of it all. You might want to ask in some Python forums about your Python code.
-Gordon
Hi Gordon,
Nice to read this web, but I’m so confused as I’m still new in this kind stuff, may I ask something,
what I need is something like this, if the pin in is changed from 1 to 0 or from 0 to 1 (make a different condition), then it send data to MySQL database, everytime the pin in is changed, it automatically send data to MySQL, (of course inserts new row in the MySQL).
If it can, would you please let me know what kind of script that I need to learn, and in what kind of language program that I need to use.
Many thanks,
Cheers,
Bing.
You can do this in a bash script, C, C++, PHP, Python, Perl, etc. just about any language that will let you manipulate MySQL can be used to monitor the GPIO. Use whatever language you are most familiar with when dealing with MySQL – that will most likely be the harder part of the whole thing.
-Gordon