From 28e422d55bcff8f39e16e5a348eeb18b92224e3d Mon Sep 17 00:00:00 2001 From: silver2row <silver1row@cox.net> Date: Fri, 1 Mar 2024 01:37:35 -0600 Subject: [PATCH] add relay.rst back... --- boards/capes/relay.rst | 281 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 boards/capes/relay.rst diff --git a/boards/capes/relay.rst b/boards/capes/relay.rst new file mode 100644 index 00000000..7d996829 --- /dev/null +++ b/boards/capes/relay.rst @@ -0,0 +1,281 @@ +.. _bone-cape-relay: + +BeagleBoard.org BeagleBone Relay Cape +##################################### + +Relay Cape, as the name suggests, is a simple Cape with relays on it. +It contains four relays, each of which can be operated independently from the BeagleBone. + +.. image:: images/BeagleBoneRelayCapeA2-400x274.png + :align: center + +* `Order page <https://beagleboard.org/capes#relay>`_ +* `Schematic <https://git.beagleboard.org/beagleboard/capes/-/tree/master/beaglebone/Relay>`_ + +.. note:: + The following describes how to use the device tree overlay under development. + The description may not be suitable for those using older firmware. + +Installation +************ + +No special configuration is required. When you plug the Relay Cape into your BeagleBoard, +it will automatically be recognized by the Cape Universal function. + +You can check to see if the Relay Cape is recognized with the following command. + +.. code-block:: + + ls /proc/device-tree/chosen/overlay + +A list of currently loaded device tree overlays is displayed here. +If you see `BBORG_RELAY-00A2.kernel` in this list, it has been loaded correctly. + +If it is not loaded correctly, you can also load it directly +by adding the following to the U-Boot options +(which can be reflected by changing the file /boot/uEnv.txt) to reflect the text below. + +.. code-block:: + + uboot_overlay_addr0=BBORG_RELAY-00A2.dtbo + + +Usage +***** + +.. code-block:: + + ls /sys/class/leds + +The directory "relay1", for instance, exists in the following directory. +The LEDs can be controlled by modifying the files in its directory. + +.. code-block:: + + echo 1 > relay1/brightness + +This allows you to adjust the brightness; +entering 1 for brightness turns it ON while entering 0 turns it OFF. + +The four relays can be changed individually +by changing the number after "relay" in /sys/class/leds/relay. + +Code to Get Started +******************* + +Currently, using sysfs in .c files, libgpiod-dev/gpiod in .c files, and +python3 files with the Relay Cape work well! + +* For instance, a kernel that I found to work is kernel: `5.10.168-ti-r77` + +* Another idea, an image I found that works is `BeagleBoard.org Debian Bookworm IoT Image 2023-10-07` + +There are newer images and kernels if you want to update and there are older ones in case you +would like to go back in time to use older kernels and images for the Relay Cape. Please remember +that older firmware will work differently on the BeagleBone Black or other related am335x SBC. + +C Source with File Descriptors +****************************** + +You can name this file Relay_Test.c and use gcc to handle compiling the source into a binary like so: + +`gcc Relay_Test.c -o Relay_Test` + +.. code-block:: + + /* + + This is an example of programming a Relay on the Relay Cape for the BeagleBone Black or other am335x board with the Relay Cape. + + Use the Relay Cape attached to the BeagleBone Black for a change in seconds and then exit with CTRL-C. + + The original source can be found here by Mr. Tranter: https://github.com/tranter/blogs/blob/master/gpio/part5/demo1.c + + Jeff Tranter <jtranter@ics.com> + + and...Seth. I changed the source a bit to fit the BeagleBone Black and Relay Cape while using sysfs. + + */ + + #include <errno.h> + #include <fcntl.h> + #include <stdio.h> + #include <stdlib.h> + #include <sys/stat.h> + #include <sys/types.h> + #include <unistd.h> + + int main() + { + + // Export the desired pin by writing to /sys/class/leds/relay1/brightness + + int fd = open("/sys/class/leds/relay1/brightness", O_WRONLY); + if (fd == -1) { + perror("Unable to open /sys/class/leds/relay1/brightness"); + exit(1); + } + + fd = open("/sys/class/leds/relay1/brightness", O_WRONLY); + if (fd == -1) { + perror("Unable to open /sys/class/leds/relay1/brightness"); + exit(1); + } + + // Toggle LED 50 ms on, 50ms off, 100 times (10 seconds) + + for (int i = 0; i < 100; i++) { + if (write(fd, "1", 1) != 1) { + perror("Error writing to /sys/class/leds/relay1/brightness"); + exit(1); + } + usleep(50000); + + if (write(fd, "0", 1) != 1) { + perror("Error writing to /sys/class/leds/relay1/brightness"); + exit(1); + } + usleep(50000); + } + + close(fd); + + // And exit + return 0; + } + +C Source with gpiod.h and File Descriptors +*********************************************** + +Also...if you are looking to dive into the new interface, libgpiod-dev/gpiod, here is another form of +source that can toggle the same relay listed from the file descriptor. + +One thing to note: `sudo apt install cmake` + +1. mkdir GPIOd && cd GPIOd + +2. nano Relay.c + +3. add the below source into the file Relay.c + +.. code-block:: + + /* + + Simple gpiod example of toggling a LED connected to a gpio line from + the BeagleBone Black and Relay Cape. + Exits with or without CTRL-C. + + */ + + // This source can be found here: https://github.com/tranter/blogs/blob/master/gpio/part9/example.c + // It has been changed by me, Seth, to handle the Relay Cape and BBB Linux based SoC SBC. + + // kernel: 5.10.168-ti-r77 + // image : BeagleBoard.org Debian Bookworm IoT Image 2023-10-07 + + // type gpioinfo and look for this line: line 20: "P9_41B" "relay1" output active-high [used] + // That line shows us the info. we need to make an educated decision on what fd we will use, i.e. relay1. + // We will also need to locate which chipname is being utilized. For instance: gpiochip0 - 32 lines: + + // #include <linux/gpio.h> + #include <gpiod.h> + #include <stdio.h> + #include <unistd.h> + + int main(int argc, char **argv) + { + const char *chipname = "gpiochip0"; + struct gpiod_chip *chip; + struct gpiod_line *lineLED; + + int i, ret; + + // Open GPIO chip + chip = gpiod_chip_open_by_name(chipname); + if (!chip) { + perror("Open chip failed\n"); + return 1; + } + + // Open GPIO lines + lineLED = gpiod_chip_get_line(chip, 20); + if (!lineLED) { + perror("Get line failed\n"); + return 1; + } + + // Open LED lines for output + ret = gpiod_line_request_output(lineLED, "relay1", 0); + if (ret < 0) { + perror("Request line as output failed\n"); + return 1; + } + + // Blink a LED + i = 0; + while (true) { + ret = gpiod_line_set_value(lineLED, (i & 1) != 0); + if (ret < 0) { + perror("Set line output failed\n"); + return 1; + } + usleep(1000000); + i++; + } + + // Release lines and chip + gpiod_line_release(lineLED); + gpiod_chip_close(chip); + return 0; + } + +4. mkdir build && touch CMakeLists.txt + +5. In CMakeLists.txt, add these values and text via nano or your favorite editor! + +.. code-block:: + + cmake_minimum_required(VERSION 3.25.0) + + project(gpiod LANGUAGES C) + + add_executable(Relay Relay.c) + + target_link_libraries(Relay gpiod) + +6. cd build && cmake .. + +7. make + +8. ./Relay + +.. code-block:: + + #!/usr/bin/python3 + + # Getting help from #beagle on IRC + # You know who you are currently! + + from pathlib import Path + from time import sleep + + class Gpio: + def __init__(self, name): + self.name = name + self._value_path = Path('/sys/class/leds/', name, 'brightness') + + def get(self): + return int(self._value_path.read_text()) + + def set(self, value): + self._value_path.write_text(str(value)) + + relay_one = Gpio('relay1/') + + relay_one.set('1') + sleep(2) + relay_one.set('0') + sleep(2) + +These are a few examples on how to use the RelayCape and am335x supported BeagleBone Black SBC. -- GitLab