This repository contains code which runs on Beaglebone Black microcontrollers. This code is ment to interact with OCS agents but does not fit within the standard agent structure. Instead these pieces of code run as independent processes on the Beaglebone microcontrollers and interact with agents through UDP data packets.
Beaglebone Black's are off the shelf microcontrollers with ~80 configurable pins (GPIO, PWM, PRU, etc) and an onboard linux kernal. Each Beaglebone has two so called "Programmable Real time Units (PRUs)" which are able to independently run compiled code on 200 MHz processors. These PRUs have access to shared memory addresses and can query/change the state of specific PRU pins. The 200 MHz clock speed is a significant improvement over similar microcontrollers (16 MHz for Arduino Microcontrollers) and improves accuracy when measuring the state of a rapidly changing signal. Unfortunately, programming with the PRU's is not well documented and requires additional steps beyond what a typical user might understand.
Beaglebone code for the hwp_encoder agent. This code continually records rising/falling edges from two encoder signals (one primary one quadrature) and one IRIG-B timing signal. Encoder collection runs on PRU1 while IRIG-B collection runs on PRU0. Data is stored at shared memory addresses so it can be put into packets by the main processor.
- Connect to the beaglebone with the provided USB cable using the default credentials
ssh debian@192.168.7.2
, password:temppwd
- (Optional) Create a new user using
sudo adduser [username]
andsudo usermod -aG sudo [username]
- Make the IP of the beaglebone static, so that the board can be SSH-ed into over ethernet, by opening the file
/etc/network/interfaces
and make the following changes (Commented lines have been omitted):
Before
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
After
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address [user defined]
netmask [user defined]
network [user defined]
gateway [user defined]
iface usb0 inet static
address 192.168.7.2
netmask 255.255.255.252
network 192.168.7.0
gateway 192.168.7.1
- Reboot the beaglebone with
sudo reboot
. Connect the beaglebone to your network switch and varify that the beaglebone is accessible at the entered network configuration
- In order to use the beaglebone PRUs for DAQ, uncomment the following lines in
/boot/uEnv.txt
disable_uboot_overlay_video=1
disable_uboot_overlay_audio=1
uboot_overlay_pru=/lib/firmware/AM335X-PRU-UIO-00A0.dtbo
- Once the
/boot/uEnv.txt
file has been edited, reboot the beaglebone withsudo reboot
to apply the changes
- Clone the am335x_pru_package repository onto the beaglebone
- Navigate into the top level directory
cd am335x_pru_package
and then runmake
followed bymake install
- Navigate to
am335x_pru_package/pru_sw/app_loader/lib/
and copy the generated binarieslibprussdrv.a
,libprussdrv.so
,libprussdrvd.a
, andlibprussdrvd.so
into/usr/lib/
- Navigate into the hwp_encoder subdirectory
cd sobonelib/hwp_encoder
- Edit the
config.txt
file so that thePORT
andHOST_IP
match your agent setup- By default
PORT
should be 8080 for encoder1 and 8081 for encoder2 HOST_IP
is the IP address of the node running the encoder OCS agent
- By default
- With the configuration file set, run the command
make
.- This will both compile the code and instantiate the systemctl services
- To check the status of the encoder process, use
systemctl status hwp-encoder-pru.service
- To stop/start the encoder process, use
sudo systemctl stop hwp-encoder-pru.service
/sudo systemctl start hwp-encoder-pru.service
- To change the configuration parameters, simply update
config.txt
and runmake
again - To get more detailed logs from the process, use
journalctl -u hwp-encoder-pru.service -n 100
Beaglebone code for the hwp_gripper agent. This code is split into two independent processes. The first process runs on the PRU's and periodically records the state of six encoder signals (two for each actuator) and six limit switch signals (two for each actuator; one for the warm grip location and one for the cold grip location). Encoder collection runs on PRU1 while limit switch collection runs on PRU0. Data is stored at shared memory addresses so it can be put into packets by the main processor. The second process is a simple python script, which acts a server to process incomming control commands. This script accepts a socket connection from the agent and converts commands received into state changes of the Beaglebone's pins.
The hwp_gripper setup is largely similar to the hwp_encoder setup with a couple key differences. As a background it is assumed that you have read through and understood the hwp_encoder setup section.
- Typically the beaglebone OS is stored on an embedded MultiMediaCard (eMMC). For the hwp_gripper however, serveral I/O pins typically reserved for the eMMC are reappropriated to different tasks. This means that the OS needs to run from an external >=32 GB microSD card instead
- On a seperate computer, download the beaglebone OS from here. Filter for "BeableBone Black" and select a non-flasher debian image that runs on an SD card. Previous beablebones have used
AM3358 Debian 10.3 2020-04-06 4GB SD IoT
- Download Etcher onto the same computer, and use it to flash the OS onto the microSD card
- Insert the microSD into the beaglebone's microSD slot and supply power
- Uncomment the following lines in
/boot/uEnv.txt
disable_uboot_overlay_emmc=1
disable_uboot_overlay_wireless=1
disable_uboot_overlay_adc=1
- Reboot the beaglebone with
sudo reboot
. The beaglebone OS should now be running from the microSD card
- Exactly the same as hwp_encoder's Network Setup
- Exactly the same as hwp_encoder's PRU Config
- Exactly the same as hwp_encoder's External Package Installation
- Navigate into the hwp_gripper subdirectory
cd sobonelib/hwp_gripper
- Edit the
config.txt
file so that thePRU_PORT
andCONTROL_PORT
match your agent setup- By default
PRU_PORT
should be 8040 andCONTROL_PORT
should be 8041
- By default
- With the configuration file set, run the command
make
.- This will both compile the code and instantiate the systemctl services
- To check the status of the gripper processes, use
systemctl status hwp-gripper-pru.service
andsystemctl status hwp-gripper-control.service
- To stop/start the gripper processes, use
sudo systemctl stop hwp-gripper-pru.service
/sudo systemctl start hwp-gripper-pru.service
andsudo systemctl stop hwp-gripper-control.service
/sudo systemctl start hwp-gripper-control.service
- To change the configuration parameters, simply update
config.txt
and runmake
again - To get more detailed logs from the processes, use
journalctl -u hwp-gripper-pru.service -n 100
andjournalctl -u hwp-gripper-control.service -n 100