Categories
Embedded

Reading BeagleBoard User Button (or any GPIO)

Short and sweet post with shell script for reading GPIOs on the BeagleBoard

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.

5 replies on “Reading BeagleBoard User Button (or any GPIO)”

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?

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.

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.

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.

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…

Comments are closed.