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).

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.

Dependencies

cluster_python Python cluster_python_basics Basics cluster_ece19 ECE19: Exercises and Custom Topics python_basics_python_0300_strings More About Strings python_basics_python_0200_sequential_types Sequential Datatypes python_basics_python_0300_strings->python_basics_python_0200_sequential_types python_basics_python_0150_datatypes_overview Datatypes python_basics_python_0300_strings->python_basics_python_0150_datatypes_overview python_basics_python_0250_refs_flat_deep_copy References, (Im)mutability python_basics_python_0300_strings->python_basics_python_0250_refs_flat_deep_copy python_basics_python_0220_for for Loops python_basics_python_0193_while while Loops python_basics_python_0220_for->python_basics_python_0193_while python_basics_python_0220_for->python_basics_python_0200_sequential_types python_basics_python_0170_if The if Statement python_basics_python_0193_while->python_basics_python_0170_if python_basics_python_0160_boolean Boolean python_basics_python_0193_while->python_basics_python_0160_boolean python_basics_python_0170_if->python_basics_python_0160_boolean python_basics_python_0200_sequential_types->python_basics_python_0150_datatypes_overview python_basics_python_0160_boolean->python_basics_python_0150_datatypes_overview python_basics_python_0150_datatypes_overview_compound Compound Datatypes python_basics_python_0150_datatypes_overview_compound->python_basics_python_0150_datatypes_overview python_basics_python_0120_helloworld Hello World python_basics_python_0110_blahblah Blahblah python_basics_python_0120_helloworld->python_basics_python_0110_blahblah python_basics_python_0500_files File I/O python_basics_python_0500_files->python_basics_python_0220_for python_basics_python_0330_strings_encoding Strings and Encoding python_basics_python_0500_files->python_basics_python_0330_strings_encoding python_basics_python_0140_variables Variables python_basics_python_0150_datatypes_overview->python_basics_python_0140_variables python_basics_python_0130_syntax_etc Syntax etc. python_basics_python_0130_syntax_etc->python_basics_python_0120_helloworld python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0150_datatypes_overview_compound python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0150_datatypes_overview python_basics_python_0250_refs_flat_deep_copy->python_basics_python_0140_variables python_basics_python_0140_variables->python_basics_python_0130_syntax_etc python_basics_python_0330_strings_encoding->python_basics_python_0300_strings ece19_file_read Reading a File ece19_file_read->python_basics_python_0500_files ece19_blinklicht GPIO: Blinklicht ece19_blinklicht->ece19_file_read