Reading BeagleBoard User Button (or any GPIO)

This one is short and sweet, based on the blinking LED example found here.

Here’s a shell script to read a GPIO and generate a square wave on the console:

#!/bin/sh
#
# Read a GPIO input

GPIO=$1

cleanup() { # Release the GPIO port
  echo $GPIO > /sys/class/gpio/unexport
  echo ""
  echo ""
  exit
}

# Open the GPIO port
#
echo "$GPIO" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio${GPIO}/direction

trap cleanup SIGINT # call cleanup on Ctrl-C

THIS_VALUE=`cat /sys/class/gpio/gpio${GPIO}/value`
LAST_VALUE=$THIS_VALUE
NEWLINE=0

# Read forever

while [ "1" = "1" ]; do
  # next three lines detect state transition
  if [ "$THIS_VALUE" != "$LAST_VALUE" ]; then
    EV="|"
  else
    EV=""
  fi

  # "^" for high, '_' for low
  if [ "1" = "$THIS_VALUE" ]; then
    EV="${EV}^"
  else
    EV="${EV}_"
  fi
  echo -n $EV

  # sleep for a while
  sleep 0.05

  # wrap line every 72 samples
  LAST_VALUE=$THIS_VALUE
  THIS_VALUE=`cat /sys/class/gpio/gpio${GPIO}/value`
  NEWLINE=`expr $NEWLINE + 1`
  if [ "$NEWLINE" = "72" ]; then
    echo ""
    NEWLINE=0
  fi

done

cleanup # call the cleanup routine

I saved this as ~/read_gpio, did a ‘chmod 755 read_gpio’and invoked it to read the user button, GPIO 7:

root@beagleboard:~# ./read_gpio 7
_________________________________|^^^^|_____|^^^|_____________|^^^|___|^^^|_____
____|^^|____|^^|____|^|________|^^^|_______|^^|____________|^^^|______|^^|_______

root@beagleboard:~#

Sampling at a 50ms interval appeared to catch most of my button pushes, even at an unreasonably high rate. A 100ms interval was too long and some of the faster button pushes were missed.

Tags: , , ,

5 Responses to “Reading BeagleBoard User Button (or any GPIO)”

  1. jimmy says:

    when i tried this i got this error over and over

    cat: /sys/class/gpio/gpio7/value: No such file or directory

    what have i done wrong?

  2. rbw says:

    Sounds like the

    echo “$GPIO” > /sys/class/gpio/export

    command failed to setup the GPIO properly.

    Please note my post is 9 months old and has not been updated. My work with the BeagleBoard was short-lived and I don’t have access to hardware to double-check what I’ve posted. Please refer to the link I reference in the first paragraph and try the steps manually before running the script as written.

  3. abc says:

    This post is old but I figured I would leave this here for anyone else who might come across this same error. I think the author used an older board revision which works fine using gpio7. On the newer beagleboard-xm the user button is mapped to gpio4 not gpio7.

  4. rbw says:

    Yes, this article is circa May 2009. I can’t remember off the top of my head what revision board we used, but I expect things have changed since the post. Unfortunately, I am no longer working with the Beagleboard and can’t update what I done to reflect newer hardware.

    Thanks for pointing out the differences.

  5. Tim B says:

    I have just got this working with a BB-xM release C. Even though the manual says it should be GPIO 7, GPIO 4 works.
    The BeagleBoard community is not the easiest to understand, they probably dont want to be understood by the likes of us. Now I want to get the LED example from MAKER working, then I will be a touch happier…

Leave a Reply

*