GPIO: Blinklicht#

Write a Python program that uses one of the Raspberry GPIO pins to blink an LED at a given frequency. The program will be invoked like so:

$ path/to/repo/root/exercises/lastname.firstname/blink 25 0.5

Commandline#

The command takes two positional parameters,

  1. GPIO number

  2. Frequency, in seconds. The number can contain decimal points, and so can represent fractions of a second.

Use the argparse module to do the commandline stuff

sysfs GPIO#

The program uses sysfs GPIO, and not RPi.GPIO.

Note

  • RPi.GPIO is Raspberry specific. This means it won’t work on any other Linux than the Raspberry’s.

  • RPi.GPIO is Python specific. One cannot easily port prototype code to, say, C++.

  • RPi.GPIO is horrible; it accesses hardware registers directly.

  • Kernel documentation

  • Youtube tutorial (one of many). This shows how to uses sysfs GPIO in the shell. Note that we are writing a Python program, though.

  • Distilled, what we want to do (in Python) is this …

    $ cd /sys/class/gpio
    $ echo 25 > export
    $ cat gpio25/direction
    in
    $ echo out > gpio25/direction
    $ cat gpio25/value
    0
    $ echo 1 > gpio25/value    # see if it works
    $  # now for real
    $ i=0
    $ while true; do
    >   echo $((i%2)) > gpio25/value
    >   i=$((i+1))
    >   sleep 0.5
    > done
    
  • The new kid, libgpiod solves many of the problems that Sysfs GPIO has. Will switch to that when time is right (after we learned what encapsulation is).

Electronic Aspect#

External Circuitry#

Well, this is embarassing …

../../../../../../_images/gpio25led.png

Raspberry Header Pinout#

../../../../../../_images/GPIO-Pinout-Diagram-21.png

Implementation Notes#

  • After exporting the GPIO (echo 25 > export), the directory gpio25 and the files it contains are not immediately visible. Rather, the operation completes asynchronously. This means that you have to wait between the export and the access. 1/10 second should be sufficient.

    You do this using time.sleep(). Read the documentation of it.

  • A starting point, regarding the “Use argparse for commandline parsing” can be found here.

  • Write the program locally, on your PC, using VS Code (or whatever is your favorite editor).

    • WinSCP. You can use WinSCP to transfer the program to the Raspberry. Be aware though that the execute permission might not be transferred correctly - Windows and Unix are different.

    • VS Code, There is also a VS Code extension, Remote SSH, that you might want to try.