From 61ef52f967365b229efeca1b4524627001981635 Mon Sep 17 00:00:00 2001 From: "Mark A. Yoder" <Mark.A.Yoder@Rose-Hulman.edu> Date: Fri, 20 Sep 2024 09:18:31 -0400 Subject: [PATCH] Cleaned up beagle101 button events --- intro/beagle101/blinkLED.rst | 263 ++++++++++++++-------- intro/beagle101/code/blinkInternalLED.sh | 10 + intro/beagle101/{ => code}/buttonEvent.sh | 0 intro/beagle101/{ => code}/buttonLED.sh | 0 intro/beagle101/code/seqLEDs.py | 21 ++ 5 files changed, 195 insertions(+), 99 deletions(-) create mode 100755 intro/beagle101/code/blinkInternalLED.sh rename intro/beagle101/{ => code}/buttonEvent.sh (100%) rename intro/beagle101/{ => code}/buttonLED.sh (100%) create mode 100755 intro/beagle101/code/seqLEDs.py diff --git a/intro/beagle101/blinkLED.rst b/intro/beagle101/blinkLED.rst index eb0f0b97..be04d6f3 100644 --- a/intro/beagle101/blinkLED.rst +++ b/intro/beagle101/blinkLED.rst @@ -16,91 +16,93 @@ Here we'll show you how to do just that in three simple steps. These steps will work for any of the Beagles. Plug in the Beagle -******************* +------------------ For this step you need to get a USB cable and attach your Beagle to your host computer with it. Where you attached the cable depends on which Beagle you have. Click on the tab for your board. -.. tab-set:: +.. tabs:: - .. tab-item:: Black + .. group-tab:: Black .. figure:: figures/image8.jpg :width: 632px + :height: 166px :align: center :alt: Tethered Configuration - Tethered Configuration + Tethered Configuration .. figure:: figures/image9.jpg :width: 451px + :height: 206px :align: center :alt: USB Connection to the Board - Mini USB Connection to the Board as seen from the bottom. + Mini USB Connection to the Board as seen from the bottom. For more details see: :ref:`beagleboneblack-connectivity` - .. tab-item:: Blue + .. group-tab:: Blue .. figure:: figures/blueconnect.jpg :width: 451px :align: center :alt: USB Connection to the Blue - Micro USB Connection to the Blue + Micro USB Connection to the Blue - .. tab-item:: AI-64 + .. group-tab:: AI-64 .. figure:: figures/usb-tethering.jpg :width: 400px :align: center :alt: Tethered Configuration - Tethered Configuration + Tethered Configuration .. figure:: figures/usb-c-connection.jpg :width: 400px :align: center :alt: USB Connection to the Board - USB-c Connection to the Board + USB-c Connection to the Board .. figure:: figures/usb-a-connection.jpg :width: 400px :align: center :alt: USB Connection to the PC/Laptop - USB Connection to the PC/Laptop + USB Connection to the PC/Laptop .. figure:: figures/power-led.jpg :width: 400px :align: center :alt: Board Power LED - Board Power LED + Board Power LED - For more details see: :ref:`bbai64-quick-start` + For more details see: :ref:`connecting-up-your-beaglebone-ai-64` - .. tab-item:: Play + .. group-tab:: Play .. figure:: figures/tethered-connection.jpg :width: 1400 :align: center :alt: Tethering BeaglePlay to PC - Tethering BeaglePlay to PC + Tethering BeaglePlay to PC For more details see: :ref:`beagleplay-quick-start` - .. tab-item:: Pocket + .. group-tab:: Pocket .. figure:: figures/11fig-PB-microUSBattach1.jpg :align: center :alt: Tethered Configuration - Micro USB Connection + Micro USB Connection For more details see: :REF:`connecting_up_pocketbeagle` @@ -110,75 +112,81 @@ heart beat. The Beagle is now up and running, but you didn't have to load up Linux. This is because all Beagles -(except PocketBeagle, see :ref:`flash-latest-image` -to install an image on the Pocket) have built-in flash memory +have built-in flash memory that has the Debian distribution of Linux preinstalled. -.. _intro-using-vs-code: - -Using VS Code -************** - -.. important:: If VS code is not installed on your board please skip this section and refer - to next section on how to login and run the code via command line. +.. note:: + The one exception is the PocketBeagle which has no built-in + flash memory. See :ref:`flash-latest-image` + to install an image on the Pocket + +Login +----- + +Next you login to the Beagle from your host computer. +Here you have a choice. If you want a graphical approach, +choose the ``VS Code`` tab. If you want a command line +and your host is a Mac, take the ``ssh (Mac)`` tab. If you +are running Linux on your host, +take the ``ssh (Linux)`` tab. Finally take the +``putty (Windows)`` tab for command line from Windows. -Recent Beagles come with the IDE Visual Studio Code (https://code.visualstudio.com/) installed and -running. To access it, open a web browser on your host computer and browse to: ``192.168.7.2:3000`` -(use ``192.168.6.2:3000`` for the Mac) and you will see something like: +.. tabs:: -.. figure:: figures/vscode1.png - :width: 740 - :align: center + .. group-tab:: VS Code -At this point you can either run the scripts via a command line within VS Code, or -run them by clicking the ``RUN Code`` button. + Recent Beagles come with the IDE Visual Studio Code + (https://code.visualstudio.com/) installed and + running. To access it, open a web browser on + your host computer and browse to: ``192.168.7.2:3000`` + (use ``192.168.6.2:3000`` for the Mac) + and you will see something like: + .. figure:: figures/vscode1.png -Running via the command line -============================ + At this point you can either run the scripts via a command + line within VS Code, or run them by clicking the + ``RUN Code`` button. -Open a terminal window in VS Code by dropping down the ``Terminal`` menu and selecting ``New Terminal`` -(or entering ``Ctrl+```). The terminal window appears at the bottom of the screen as shown below. -.. figure:: figures/vscode3.png - :width: 740 - :align: center + Running via the command line -You can now enter commands and see them run as shown below. + Open a terminal window in VS Code by dropping down the + ``Terminal`` menu and selecting ``New Terminal`` (or entering + ``Ctrl+Shift+```). The terminal window appears at the + bottom of the screen as shown below. -.. figure:: figures/vscode4.png - :width: 740 - :align: center - -Running via the ``RUN`` button -=============================== + .. figure:: figures/vscode3.png -Use the file navigator on the left to navigate to ``examples/BeagleBone/Black/blinkInternalLED.sh`` and you will see: + You can now enter commands and see them run as shown below. -.. figure:: figures/vscode2.png - :width: 740 - :align: center + .. figure:: figures/vscode4.png -This code blinks one of the USR LEDs built into the board. Click on the ``RUN Code`` triangle on the upper right of the -screen (see red arrow) to run the code. (You could also enter ``Ctrl+Alt+N``) The USR3 LED should now be blinking. + Running via the ``RUN`` button -Click on the ``Stop Code Run`` (``Ctrl+Alt+M``) square to the right of the ``Run Code`` button. + Use the file navigator on the left to navigate to + ``examples/BeagleBone/Black/blinkInternalLED.sh`` + and you will see: -Time to play! Try changing the LED number (on line 10) from 3 to something else. Click the ``Run Code`` -button (no need to save the file, autosave is on by default). + .. figure:: figures/vscode2.png -Try running ``seqLEDs.py``. + This code blinks one of the USR LEDs built into the board. + Click on the ``RUN Code`` triangle on the upper right of + the screen (see red arrow) to run the code. (You could also enter ``Ctrl+Alt+N``) + The USR3 LED should now be blinking. -Using command line -****************** + Click on the ``Stop Code Run`` (``Ctrl+Alt+M``) square to the right of the + ``Run Code`` button. -To access the command line and your host is a Mac, take the ``ssh (Mac)`` tab. If you -are running Linux on your host, take the ``ssh (Linux)`` tab. Finally take the -``putty (Windows)`` tab for command line from Windows. + + + Time to play! Try changing the LED number (on line 10) from + 3 to something else. Click the ``Run Code`` button (no + need to save the file, autosave is on by default). -.. tab-set:: + Try running ``seqLEDs.py``. - .. tab-item:: ssh (Mac) + .. group-tab:: ssh (Mac) If you are running a Mac host, open a terminal widow and run @@ -188,7 +196,7 @@ are running Linux on your host, take the ``ssh (Linux)`` tab. Finally take the Use the password ``temppwd``. - .. tab-item:: ssh (Linux) + .. group-tab:: ssh (Linux) If you are running a Linux host, open a terminal widow and run @@ -198,7 +206,7 @@ are running Linux on your host, take the ``ssh (Linux)`` tab. Finally take the Use the password ``temppwd``. - .. tab-item:: putty (Windows) + .. group-tab:: putty (Windows) If you are running Window you need to run an ``ssh`` client to connect to the Beagle. I suggest you use ``putty``. @@ -212,7 +220,7 @@ are running Linux on your host, take the ``ssh (Linux)`` tab. Finally take the and password ``temppwd``. Blink an LED -============ +------------ Once logged in the rest is easy. First: @@ -233,7 +241,7 @@ internal LEDs. .. code-block:: shell-session - bone:~$ cat blinkInternalLED.py + bone:~$ cat blinkInternalLED.sh LED="3" LEDPATH='/sys/class/leds/beaglebone:green:usr' @@ -244,14 +252,25 @@ internal LEDs. echo "0" > ${LEDPATH}${LED}/brightness sleep 0.5 done - bone:~$ ./blinkInternalLED.py + bone:~$ ./blinkInternalLED.sh ^c +:download:`blinkInternalLED.sh<code/blinkInternalLED.sh>` + Here you see a simple bash script that turns an LED on and off. Enter Ctrl+c to stop the script. +Congratulations, you've blinked an LED. + +Your turn +^^^^^^^^^ + +Now that you have an LED blinking, try blinking a different LED. +Or, blink more than one LED at a time. Try slowing down, or speeding up +the blink rate. + Blinking via Python -==================== +------------------- Here's a script that sequences the LEDs on and off. @@ -273,19 +292,35 @@ Here's a script that sequences the LEDs on and off. while True: for i in range(LEDs): f[i].seek(0) - f[i].write("1") + f[i].write("1") # 1 turns the LED on time.sleep(0.25) for i in range(LEDs): f[i].seek(0) - f[i].write("0") + f[i].write("0") # 0 turns the LED off time.sleep(0.25) bone:~$ ./seqLEDs.py ^c - + +:download:`seqLEDs.py<code/seqLEDs.py>` + Again, hit Ctrl+c to stop the script. +This python script is a bit more complicated that the previous bash +script. Note that *LEDPATH* is the same in both scripts. They use the +same interface to control the built-in LEDs. The python script opens a +file for each of the LEDs and then writes a **1** to the file to turn on +the LED. A **0** is writen to turn it off. The *for* loop allows it to turn +on (or off) all four LEDs in sequence. + +Your turn +^^^^^^^^^ + +Try speeding up, or slowing down the sequencing by changing the *sleep* times. +If you have programming experience, make a single LED sequence back and forth. + + Blinking from Command Line -========================== +-------------------------- You can control the LEDs from the command line. @@ -308,18 +343,18 @@ You can blink any of them. Let's try ``usr1``. bone:~$ echo 1 > brightness bone:~$ echo 0 > brightness -When you echo 1 into ``brightness`` the LED turns on. -Echoing a 0 turns it off. +When you echo **1** into ``brightness`` the LED turns on. +Echoing a **0** turns it off. Blinking other LEDs -=================== +------------------- You can blink the other LEDs by changing in to thier directories and doing the same. Let's blink the USR0 LED. .. code-block:: shell-session - bone:~$ cd ../beaglebone\:green\:usr0/ + bone:~$ cd /sys/class/leds/beaglebone\:green\:usr0/ bone:~$ echo 1 > brightness bone:~$ echo 0 > brightness @@ -343,13 +378,20 @@ what triggers you can set: bone:~$ echo none > trigger Notice ``[heartbeat]`` is in brackets. This shows it's the -current trigger. The echo changes the trigger to ``none``. +current trigger. The ``echo`` changes the trigger to ``none``. +Your turn +^^^^^^^^^ Try experimenting with some of the other triggers and see if you -can figure them out. +can figure them out. Try changing the trigger on the other LEDs. + +.. note:: + + The following may not work on all Beagles since it depends on which + version of Debian you are running. Another way to Blink an LED -=========================== +--------------------------- An interesting thing about Linux is there are often many ways to do the same thing. For example, I can think of at least five ways to blink @@ -384,21 +426,26 @@ the ``gpioset`` command. The first command sets chip 1, line 22 (the usr1 LED) to 1 (on) for 2 seconds. The second command turns it off for 2 seconds. -Try it for the other LEDs. +Your turn +^^^^^^^^^ + +Try turning on and off the other LEDs. If you have programming experience, +try modifying the earler *bash* script to use `gpiod` instead of `echo`. .. note:: - This may not work on all Beagles since it depends on which + The following may not work on all Beagles since it depends on which version of Debian you are running. -Blinking in response to a button -================================= +Blinking in response to a button event +-------------------------------------- -Some Beagles have a USR button that can be used to control the LEDs. -You can test the USR button with ``evtest`` +Some Beagles have a **USR** button that can be used to control the LEDs. +You can test the **USR** button with ``evtest`` .. code-block:: shell-session + bone:~$ sudo apt install evtest bone:~$ evtest No device specified, trying to scan all of /dev/input/event* Not running as root, no devices may be available. @@ -410,7 +457,7 @@ You can test the USR button with ``evtest`` We want to use ``gpio-keys``, so enter ``1``. Press and release the USR button and you'll see: -.. code-block:: shell-session + .. code-block:: shell-session Input driver version is 1.0.1 Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100 @@ -439,23 +486,41 @@ the USR button and you'll see: Event: time 1692994988.641754, -------------- SYN_REPORT ------------ Ctrl+c -The following script uses evtest to wait for the USR button to be pressed and -then turns on the LED. +The value **1** means the **USR** button was pressed, the **0** means it +was released. The value **2** means the button is being held. -.. literalinclude:: buttonEvent.sh - :language: Shell +The following script uses ``evtest`` to wait for the **USR** button to be +pressed and then turns on the LED. + +.. literalinclude:: code/buttonEvent.sh :caption: buttonEvent.sh :linenos: -:download:`buttonEvent.sh<buttonEvent.sh>` +:download:`buttonEvent.sh<code/buttonEvent.sh>` + +Try running it and pressing the **USR** button. + +.. code-block:: shell-session + + bone:~$ ./buttonEvent.sh + ^c + +The **USR3** LED should turn on when the **USR** button is pressed. + +Your turn +^^^^^^^^^ +Try modifying the code to turn on a different LED. Try blinking 2 or 3 +LEDs when the button is pressed. Can you toggle an LED each time the +button is pressed? -Try running it and pressing the USR button. +Blinking in response to a button poll +------------------------------------- -The next script polls the USR button and toggles the LED. +The next script polls the USR button and toggles the LED rather that waiting +for an event. -.. literalinclude:: buttonLED.sh - :language: shell +.. literalinclude:: code/buttonLED.sh :caption: buttonLED.sh :linenos: -:download:`buttonLED.sh<buttonLED.sh>` +:download:`buttonLED.sh<code/buttonLED.sh>` diff --git a/intro/beagle101/code/blinkInternalLED.sh b/intro/beagle101/code/blinkInternalLED.sh new file mode 100755 index 00000000..485c563d --- /dev/null +++ b/intro/beagle101/code/blinkInternalLED.sh @@ -0,0 +1,10 @@ +LED="3" + +LEDPATH='/sys/class/leds/beaglebone:green:usr' + +while true ; do + echo "1" > ${LEDPATH}${LED}/brightness + sleep 0.5 + echo "0" > ${LEDPATH}${LED}/brightness + sleep 0.5 +done diff --git a/intro/beagle101/buttonEvent.sh b/intro/beagle101/code/buttonEvent.sh similarity index 100% rename from intro/beagle101/buttonEvent.sh rename to intro/beagle101/code/buttonEvent.sh diff --git a/intro/beagle101/buttonLED.sh b/intro/beagle101/code/buttonLED.sh similarity index 100% rename from intro/beagle101/buttonLED.sh rename to intro/beagle101/code/buttonLED.sh diff --git a/intro/beagle101/code/seqLEDs.py b/intro/beagle101/code/seqLEDs.py new file mode 100755 index 00000000..40f684a9 --- /dev/null +++ b/intro/beagle101/code/seqLEDs.py @@ -0,0 +1,21 @@ +import time +import os + +LEDs=4 +LEDPATH='/sys/class/leds/beaglebone:green:usr' + +Open a file for each LED +f = [] +for i in range(LEDs): + f.append(open(LEDPATH+str(i)+"/brightness", "w")) + +Sequence +while True: + for i in range(LEDs): + f[i].seek(0) + f[i].write("1") # 1 turns the LED on + time.sleep(0.25) + for i in range(LEDs): + f[i].seek(0) + f[i].write("0") # 0 turns the LED off + time.sleep(0.25) -- GitLab