Scratch controlling the GPIO on a RaspberryPi

This blog is now old hat – I’ve made a new version and much better instructions over in a new blog.

Click here

———————————————————————————-

This post is intended to make it as Simple as Pi to get up and running and make your RaspberryPi control some lights and to respond to switches and sensors.

Minimum Requirements – a RaspberryPi with Raspbian installed and a working internet connection, a breadboard, some Light Emitting Diodes (LEDs), some resistors and some wire connectors. Total cost £5-£10.

How to get a Rapsberry_Pi to control the GPIO Pins from Scratch
—————————————————————
Your RaspberryPi needs to be connected to the internet to install the software but not needed to run ScratchGPIO.

Copy the text below ( left click just before the s of sudo and drag right until all the text in the line, up to and including gpio.sh, as been selected) then right-click and select copy.  Open up an LX Terminal window and select Edit and the Paste that into an LX Terminal window and run it to download the installer.

sudo wget https://dl.dropbox.com/s/gery97qildl7ozd/install_scratch_gpio.sh -O /boot/install_scratch_gpio.sh

and then if using Raspberry Pi as a normal user, then just type (or copy and paste as before)

sudo /boot/install_scratch_gpio.sh

but if your logging as as a different user then type

sudo /boot/install_scratch_gpio.sh your_username

Either way will install all the necessary extra software and some simple examples.

(If you do not have internet on your Pi then,  put your SD card into a card reader and try using your browser to right-click and save the script direct to your SD card and then put it back into you Pi and run the second instruction)

Connecting Components Up
———————————————————————
EXTREME care should be taken when connecting hardware to the GPIO pins. You can cause your Pi to die by connecting the wrong things together – only do this if your confident of your ability to follow instructions correctly :)
AT A MINIMUM - get a breadboard and use some female-male 0.1 leads (available from lots of online suppliers or your local Maplin shop)

Check out GPIO pin guides to make sure you know what pins are what.

Wire up Pin 1 (3.3V) to (at least) a 330ohm resistor – connect that resistor to the long lead of an LED and then connect other end of LED to Pin 6 (0V).

It should light up. If it doesn’t try reversing your LED.

Now move the lead from Pin 6 to Pin 11.

Run the special Scratch icon (Scratch GPIO) on your desktop.
(It is actually a completely normal version of Scratch, it just runs a little Python background program as well that handles communications between Scratch and the GPIO and automatically enables Scratch’s Remote Sensor Connections(RSC))

To test out control from Scratch, click on File then Open and then click on the My Projects button and select blink11 and click on OK.  Once the project opens, just click on the OK to enable Remote Sensor Connections.  To run the script just click on the Green Flag.

Your LED should now blink on for 1 second and off for 2 seconds – see trouble shooting if this doesn’t happen.

What more can I do with Scratch and the GPIO

You can control seven pins as outputs (Pins 11,12,13,15,16,18,21) and treat seven as simple inputs (7,8,10,19,22,24,26)

As you can see in the blink11 script , you can simply use a broadcast message telling Pins to go on or off (Up to 3.3V and down to 0V)

The valid messages are pin11on, pin12on, pin13on, pin15onpin16on, pin18onpin21on along with the corresponding pin11off etc messages.

You can also say allon and allloff.

And you can replace the work on with high and replace off with low if you want to talk in pure logic levels.

You can combine msgs together to make a single broadcast so to turn Pin11 and Pin13 on and all others off you can say

broadcast pin11on pin12off pin13on pin15off pin16off pin18off pin21off

or

broadcast alloff pin12on pin13on

to switch pins 12 and 13 on.  Alternatively you can use the pinpattern broadcast to achieve the same result e.g:

broadcast pinpattern110

This will also set just pins 12 and 13 on.

To check an input, you should go into the Sensing block and click on the word “slider” at the bottom and you’ll notice that you have pins 10,19,22,24,25,7 and pin8.  If you connect a switch to one of these pins (through a resistor don’t forget) to OV, then you can detect when the switch is open or closed.  The inputs will normally read 1 and go to 0 when they are connected (through a resistor) to ground.  Click on the checkbox next to pin7 and try it out.

Using variables instead of broadcasts

For advanced Scratchers, you can use variables instead (or as well as broadcast messages) .

For example:  create a global variable called pin11

To make pin11 go on  use

set pin11 on

To make is go off use

set pin11 off

On can be replaced with high or 1 and off can be replaced with low or 0 so that you can use whatever logic scheme you’d like.
To set all outputs on use

set allpins on

To use a “bit-pattern” to set/unset multiple outputs simultaneously use

set pinpattern 1010001

(this will set Pin 21 , Pin 16 and Pin 11 on and all the rest off)

Note – currently there is an unfortunate “bug” in Scratch in that it remembers variable states and only sends changes out.  Even when you press the Green Flag, it will not send the state of all the variables out, it will only send them when a variable changes.  I recommend setting any gpio variables to a . and then to their initial state in a Green Flag start-up script.

When GreenFlag clicked

set pin11 .
set pin11 off

Motor Control

Connecting a motor directly to a GPIO pin WILL BREAK YOUR RASPBERRY PI!!! So don’t do it!   Google about driving motors from a RaspberryPi!!!

David Ferguson supplied the diagram below which shows a very cheap way of getting 2 motors connected safely to your Raspberry Pi. The chip used is a very cheap (37 pence) one called a ULN2003.  Wire pin11 of RPi to Pin1 on ULN2003 and then RPi pin12 to ULN2003 pin2 and finally RPi Pin6 (Gnd) connects to ULN Pin8.

Then ULN2003 pin16 goes to one motor, ULN2003 pin15 goes to other motor.  The other connections on each motor are both connected to ULN Pin 9.

Finally connect a separate motor power supply (I use a 4xAA battery pack to give 6V) and CAREFULLY connect +ve to the ULN2003 Pin 9 and -ve to ULN2003 pin 8)

motor_pinout

Once you’ve got your motor(s) SAFELY connected up, to control a motor, it is usually required to be able to not just switch it on or off but to vary its speed.

To do this in Scratch you can create 2 special variables called MotorA and MotorB and then assign these values from 0 (off) to 100(fully on)

MotorA controls pin11 and MotorB controls pin12.

e.g To make MotorA go at half speed use

set MotorA 50

To make MotorA switch off use

set MotorA 0

The motor variables can also be be used to simply vary the brightness of an LED.

Ultrasonic Sensor
Support for cheap 4pin ultrasonic sensors has been added.  To use one, connect Pin23 to the trigger or pulse input and connect the echo output (USING A 10K RESISTOR TO AVOID BROKEN PI!) to any of the input pins  (7,8,10,19,22,24 or 26).  This simple script

forever
broadcast sonar7
wait 1

will send a pulse out on pin23 once per second and setup up a new sensor input called sonar7 that will display the distance (in cm) that the sensor detects.   (NB You need to have done at least 1 broadcast before the sonar7 sensor will show up as a valid option)

Troubleshooting
To test if the software necessary to control the GPIO is correctly installed open a LXTerminal session and type

sudo python blink11.py

If this doesn’t give an error but doesn’t make a LED on Pin 11 blink then we have real problems Houston :(

Try connecting the lead going to Pin 11 back to Pin 1 to make sure the LED lights up then just in case you have a loose connection.

About these ads

131 thoughts on “Scratch controlling the GPIO on a RaspberryPi

  1. Hello,
    I am a complete electronics beginner and have had some trouble with the motor circuit (I burnt up the ULN2003 and the pi wasn’t even plugged in!) Too many batteries/ the ULN the wrong way around? Do you have a breadboard diagram I can use, or some pointers?

    Sorry to be a noob!

    • No problem – we were all noobs at one time :)
      As long as batteries < maximum voltage that the motors can stand then you'll be fine 4xAA normal will get a small motor turning – usually 6xAA at most

      From what you say – you just didn't identify which way round the ULN2003 was :(
      At one end of the chip – there is normally an indent – this marks the top of the chip and pin 1 is at top left.
      So if you follow my diagram from then on – you should be OK.

      But as you've found – get things wrong and problems will happen so you just have to be careful and double check things

      Simon

  2. Hi there cymplecy.
    Ive installed the scratch script and is starting to program a physical button. I havent done any soldering in 11 years so call me a we bit rusty if you want.
    The python script i used to test the button and whitch worked, looks like this.
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)

    This will import the necessary libraries in the GPIO namespace and set the pin numbering to correspond to your breakout board.

    Now we need to set the pin as input, pin 17 is used in this example.

    GPIO.setup(17,GPIO.IN)

    Reading the pin is now as easy as:

    input = GPIO.input(17)

    If we want to print “Button Pressed” each time a button is pressed (and assuming we’ve set up the switch so the pin goes high when pressed):

    while True:
    if (GPIO.input(17)):
    print(“Button Pressed”)

    To make this script with scratch GPIO my guess is
    Broadcast set pin11 off
    something with the sensor value block, i cant actually figure out how to change this one to listen for change in pin11.
    Have any ideas? :)

    And great great project you have up and running here. Im looking forward to do alot of scratch physical programming with my son and in the future daughter aswell.

    • hi
      Normally I use pin11 as an output but to use it as an input do
      On GreenFlag
      broadcast config11in
      and then press GreenFlag

      Then goto to 2nd last block in sensing section and click on the black arrow and select pin11 and then click on the checkbox to make it visible on the screen

      Simon

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s