MicroRNG is a hardware (true) random number generator device that can be used in embedded systems as a reliable source of entropy. This quick guide explains how to use MicroRNG device in UART mode on Linux platforms utilizing a serial interface.
- A MicroRNG device configured for 2-wire UART operation mode (‘JP Mode select’ switch is set to position 1-2).
- A Linux system with a serial port available.
Connect components with wires as shown in the picture below (connect also additional two wires for GND and 3.3V) or utilize MikroBUS socket if available.
A Python sample code for retrieving serial number, version, model and 4 random bytes from MicroRNG as an integer
import serial # # The following Python3 sample code demonstrates how to use serial interface in Linux for connecting to MicroRNG device using a 2-wire UART connection. # Before running this sample code, make sure the jumper of the 'JP Mode select' switch is set to position 1-2 (2-wire UART mode). # For a complete UART API description visit https://tectrolabs.com/assets/documents/microrng-datasheet.pdf # # Set appropriate serial device parameters. Set UART speed as 19200 bps (19200 is a factory programmed default speed for the MicroRNG). # Replace "/dev/ttyS2" with the appropriate device path specific to your Linux system. ser = serial.Serial(port = "/dev/ttyS2", baudrate = 19200, timeout = 1) # Send 'U' command to MicroRNG and make sure that it won't be running in sleep mode. ser.write(b'U') # Read the status byte from MicroRNG device status = ser.read(1) # The status byte value 0 indicates no errors if status != b'\x00' : print("Could not detect a MicroRNG device") exit() # Retrieve MicroRNG serial number using 's' command ser.write(b's') sn = ser.read(30) # Retrieve serial number as 30 ASCII characters print("Device serial number: ", sn) # Read the status byte b = ser.read(1) if status != b'\x00' : print("Could not retrieve serial number from MicroRNG device") exit() # Retrieve MicroRNG version number using 'v' command ser.write(b'v') ver = ser.read(3) # Retrieve version number as 3 ASCII characters print("Device version number: ", ver) # Read the status byte b = ser.read(1) if status != b'\x00' : print("Could not retrieve version number from MicroRNG device") exit() # Retrieve MicroRNG model using 'm' command ser.write(b'm') model = ser.read(6) # Retrieve model as 6 ASCII characters print("Device model: ", model) # Read the status byte b = ser.read(1) if status != b'\x00' : print("Could not retrieve model from MicroRNG device") exit() # Send command '1' (code 49) to MicroRNG and request 4 random bytes for building a random integer. # This 3 bytes command is used to retrieve true random bytes from the MicroRNG device. # The command byte is followed by a 16 bit unsigned integer which represents the # requested amount of random bytes (max value is 50000), the lower byte # is sent first and then the higher byte. The MicroRNG device # expects to receive all three bytes within a reasonable amount of # time. There should not be delays longer than 90 milliseconds # between moments when sending each byte, as part of command, # otherwise the device will ignore the command. request = bytearray([49, 4, 0]) ser.write(request) # Read the response from MicroRNG as 4 bytes. b = ser.read(4) # Read the status byte from MicroRNG status = ser.read(1) if status != b'\x00' : print("Could not retrieve data from MicroRNG device") exit() # Build a random integer from the retrieved bytes int_val = int.from_bytes(b, 'little', signed=False) print("Random integer: ", int_val)