Skip to main content
Version: 1.0.2

IO Controller

Hardware

The AutomatePro is equipped with comprehensive onboard current and voltage monitoring systems. This reduces the need for external sensors and enables effective downstream monitoring, facilitating early detection of potential issues. The monitored power supply diagram is shown below.

AutomatePro power supply diagram

ROS API

Publishers

TopicTypeDescription
/diagnostic/io_controller_hwautomatepro_interfaces
/msg/IOControllerDiagnostic
Hardware and board diagnostics, including rail voltages and currents, power-good states, digital-drive faults, and board temperature.
/diagnostic/io_controller_fwautomatepro_interfaces
/msg/IOFirmwareDiagnostic
Firmware diagnostics, including controller uptime and fault codes.

IOControllerDiagnostic publishes these fields:

FieldTypeDescription
headerstd_msgs/HeaderMessage timestamp and frame metadata.
vbatt_voltage_monitorfloat32Battery voltage in V.
v12_io_smps_current_monitorfloat3212V IO SMPS current in A.
v12_io_smps_voltage_monitorfloat3212V IO SMPS voltage in V.
main_sbc_smps_current_monitorfloat32Main SBC SMPS current in A.
main_sbc_smps_voltage_monitorfloat32Main SBC SMPS voltage in V.
v5_io_smps_voltage_monitorfloat325V IO SMPS voltage in V.
v5_io_smps_current_monitorfloat325V IO SMPS current in A.
amp_total_power_monitorfloat32Total power monitor in W.
v12_io_power_goodbool12V IO rail power-good state.
v5_io_power_goodbool5V IO rail power-good state.
v3_3_io_power_goodbool3.3V IO rail power-good state.
main_sbc_power_goodboolMain SBC rail power-good state.
v5_sbc_power_goodbool5V SBC rail power-good state.
v3_3_sbc_power_goodbool3.3V SBC rail power-good state.
v1_8_sbc_power_goodbool1.8V SBC rail power-good state.
digital_drive_fault_1boolDigital-drive fault 1 state.
digital_drive_fault_2boolDigital-drive fault 2 state.
digital_drive_fault_3boolDigital-drive fault 3 state.
digital_drive_fault_4boolDigital-drive fault 4 state.
board_tempint8Board temperature in degrees Celsius.

IOFirmwareDiagnostic publishes these fields:

FieldTypeDescription
headerstd_msgs/HeaderMessage timestamp and frame metadata.
uptimeuint32IO controller firmware uptime in seconds.
fault_codeuint8[10]Firmware fault-code array.

Fault Code Index

ConstantValueDescription
NO_ERROR0x00No fault bits are set.
ERROR_INDEX_CAN0x01CAN fault bitfield index; read CAN faults from fault_code[1].
MASK_CAN_RX_BUF_OVERFLOW0x01Set in fault_code[1] when the CAN RX FIFO reports an overflow or RX overflow condition.
MASK_CAN_TX_BUF_OVERFLOW0x02Set in fault_code[1] when the CAN TX send buffer overflows.

No other fault_code indexes are defined for AutomatePro firmware diagnostics. Firmware diagnostics are published every second on /diagnostic/io_controller_fw; after each publish, the firmware clears all firmware error bits so persistent faults must be reasserted by the failing subsystem.

Example

This example prints diagnostic information about the IO Controller by subscribing to the /diagnostic/io_controller_hw topic. The ROS package is available here.

import rclpy
from rclpy.node import Node
from automatepro_interfaces.msg import IOControllerDiagnostic

class IOControllerDiagnosticSubscriber(Node):

def __init__(self):
super().__init__('io_controller_diagnostic_subscriber')
self.subscription = self.create_subscription(
IOControllerDiagnostic,
'/diagnostic/io_controller_hw',
self.listener_callback,
10)

def listener_callback(self, msg):
self.get_logger().info(f'Battery Voltage: {msg.vbatt_voltage_monitor} V')
self.get_logger().info(f'12V IO SMPS Current: {msg.v12_io_smps_current_monitor} A')
self.get_logger().info(f'12V IO SMPS Voltage: {msg.v12_io_smps_voltage_monitor} V')
self.get_logger().info(f'Main SBC SMPS Current: {msg.main_sbc_smps_current_monitor} A')
self.get_logger().info(f'Main SBC SMPS Voltage: {msg.main_sbc_smps_voltage_monitor} V')
self.get_logger().info(f'5V IO SMPS Voltage: {msg.v5_io_smps_voltage_monitor} V')
self.get_logger().info(f'5V IO SMPS Current: {msg.v5_io_smps_current_monitor} A')
self.get_logger().info(f'Total Power: {msg.amp_total_power_monitor} W')

self.get_logger().info(f'12V IO Power Good: {msg.v12_io_power_good}')
self.get_logger().info(f'5V IO Power Good: {msg.v5_io_power_good}')
self.get_logger().info(f'3.3V IO Power Good: {msg.v3_3_io_power_good}')
self.get_logger().info(f'Main SBC Power Good: {msg.main_sbc_power_good}')
self.get_logger().info(f'5V SBC Power Good: {msg.v5_sbc_power_good}')
self.get_logger().info(f'3.3V SBC Power Good: {msg.v3_3_sbc_power_good}')
self.get_logger().info(f'1.8V SBC Power Good: {msg.v1_8_sbc_power_good}')

self.get_logger().info(f'Digital Drive Fault 1: {msg.digital_drive_fault_1}')
self.get_logger().info(f'Digital Drive Fault 2: {msg.digital_drive_fault_2}')
self.get_logger().info(f'Digital Drive Fault 3: {msg.digital_drive_fault_3}')
self.get_logger().info(f'Digital Drive Fault 4: {msg.digital_drive_fault_4}')

self.get_logger().info(f'Board Temperature: {msg.board_temp} °C')

def main(args=None):
rclpy.init(args=args)
node = IOControllerDiagnosticSubscriber()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()

if __name__ == '__main__':
main()

Run the node using the following command:

ros2 run automatepro_python_tutorials io_controller_diagnostic_node