github pybricks/pybricks-micropython v3.6.0b5
3.6.0b5

pre-release18 hours ago

Changelog

Unreleased

[3.6.0b5] - 2025-02-26

Changed

  • Changed order of the DriveBase.arc method parameters. This method has not
    yet been released or documented, so this is not a breaking change (support#1157).
  • Reduced voltage threshold at which the charging light goes from red to green
    to indicate that the battery is full from 8300 to 8190 mV (pybricks-micropython#292).
  • Simplified API for hub.imu.up() and hub.imu.tilt() to only use a single
    calibrated keyword argument instead of separate use_gyro options. This
    had not been released yet so is not a breaking change.

3.6.0b4 - 2025-02-14

Fixed

  • Fixed low-battery warning on boot (pybricks-micropython#292) when the
    voltage is not actually low.
  • Fixed light indidicator always briefly showing green when just plugged in
    or after rebooting (pybricks-micropython#292) even if battery is not
    actually full.

3.6.0b3 - 2025-02-14

Added

  • Added optional calibrated=True parameter to acceleration() and up() and
    angular_velocity() and rotation methods of the IMU (support#943).
  • Implemented hub.imu.orientation() to give the rotation matrix of the hub or
    robot with respect to the inertial frame.
  • Added calibration parameters that can be set for angular velocity offset and
    scale and acceleration offset and scale.
  • Added hub.system.reset_storage to restore storage and settings to default
    state.
  • Replaced update_heading_correction with _imu_calibrate.py for 3D
    calibration (support#1907).

Changed

  • Enabled UTF-8 support for str objects.
  • The method DriveBase.angle() now returns a float (support#1844). This
    makes it properly equivalent to hub.imu.heading.
  • Re-implemented tilt using the gyro data by default. Pure accelerometer tilt
    can still be obtained with hub.imu.tilt(calibrated=False).
  • Re-implemented hub.imu.heading() to use optionally use the projection of 3D
    orientation to improve performance when the hub is lifted off the ground.
    The 1D-based heading remains the default for now.
  • Change return value of connected() property from bool to int using the value
    of pbdrv_usb_get_bcd(). This will allow pro users to be able to tell if they
    have a "nonstandard" charger that could prevent proper
    charging (pybricks-micropython#274).
  • When the Bluetooth button is selected to stop the program, don't disable the
    stop button while the hub menu is active (support#1975).

Fixed

  • Fixed battery charging timeout if it didn't reach 100% after about 6 hours.
    This is same behavior observed in official firmware. (pybricks-micropython#292).
  • Fixed inconsistent battery level reported to user. Now it uses the same value
    as used by the light indicator (support#2055).
  • Fixed DriveBase.angle() getting an incorrectly rounded gyro value, which
    could cause turn(360) to be off by a degree (support#1844).
  • Fixed hub silently ignoring non-orthogonal base axis when it should raise.
  • Fixed not handling negative duration in Speaker.beep() (support#1996).

Removed

  • Removed ev3dev and ev3rt-based CI builds. Pybricks 2.0 on ev3dev will
    continue to be available as a separate download.

3.6.0b2 - 2024-10-15

Added

  • Allow color objects to be iterated as h, s, v = color_object or indexed
    as color_object[0]. This allows access to these properties in block
    coding (support#1661).
  • Added observe_enable to the hub BLE class to selectively turn observing
    on and off, just like you can with broadcasting (support#1806).
  • Added hub.system.info() method with hub status flags (support#1496) and
    value representing how the program was started.

Changed

  • Relaxed speed limit from 1000 deg/s to 1200 deg/s for external Boost
    motor (support#1623).
  • Make broadcast_channel optional instead of defaulting to 0.

Fixed

  • Fixed persistent data not being deleted when swapping
    from 3.6.0b1 to 3.5.0 and back to 3.6.0b1 (support#1846).
  • Fixed controls stopping if use_gyro is called again with the same
    argument as already active (support#1858).
  • Fixed lockup and reboot with f-strings and slice allocations in tight
    loops (support#1668).
  • Fixed program restarting if the stop button was held to end the program
    without an exception (support#1863).
  • Fixed program lockup when restarting a hub light or light matrix animation
    at exact multiples of its animation interval (support#1295).

3.6.0b1 - 2024-09-24

Added

  • Allow Bluetooth to be toggled off and on with the Bluetooth button on the
    Prime Hub and the Inventor Hub (support#1615), and have this state persist
    between reboots.
  • Added heading_correction to hub.imu.settings to allow for automatic
    correction of the hub.imu.heading() value (support#1678).
  • Added update_heading_correction to interactively set the heading
    correction value (support#1678).
  • Added optional one byte program identifier to program start command.
    For now, this is added to start various builtin
    programs, but it prepares for the ability to start different downloaded
    programs too (pybricks-micropython#254).
  • Added one byte program identifier to the hub status report to the host.
  • Added interface and implementation for storing and selecting multiple code
    slots on the Prime Hub and Inventor Hub.
  • Added ability to set distance and angle in DriveBase.reset(). If the
    DriveBase is using the gyro, it will be set to the same angle. (support#1617).
  • Added DriveBase.arc method with more intuitive parameters to drive along
    an arc, to eventually replace DriveBase.curve (support#1157).

Changed

  • Changed protocol to Pybricks Profile v1.4.0.
  • When upgrading the firmware to a new version, the user program will now
    be erased. This avoids issues with incompatible program files (support#1622).
  • The angular_velocity_threshold, and acceleration_threshold settings
    in hub.imu.settings are now persistent between reboots.
  • Reduced hub poweroff time from 3 to 2 second to make it easier to turn off
    the hub (pybricks-micropython#250).
  • Improved font for the digits 0--9 when displaying them
    with hub.display.char(str(x)) (pybricks-micropython#253).
  • On SPIKE Prime Hub and Robot Inventor Hub, moved Bluetooth indications to
    the Bluetooth light. Only warning lights will be shown on the main button
    light. See (support#1716) and (pybricks-micropython#261).
  • Allow gyro calibration only while all motors are coasting (support#1840) to
    prevent recalibration during very steady moves (support#1687)
  • Reduced default angular velocity stationary threshold from an undocumented
    5 deg/s to 2 deg/s to reduce unwanted calibration while moving (support#1105).
  • If imu.reset_heading() is called while a drive base is actively using the
    gyro, an exception will be raised (support#1818).

Fixed

  • Fixed not able to connect to new Technic Move hub with LWP3Device().
  • Removed gc_collect() from tools.run_task() loop to fix unwanted delays.
  • Fixed await wait(0) never yielding, so parallel tasks could lock up (support#1429).

Removed

  • Removed loop_time argument to pybricks.tools.run_task as this wasn't
    having the desired effect, and would cause loop round trips to take 10 ms
    for every await wait(1) (support#1460). This was an undocumented feature.

3.5.0 - 2024-04-11

Changed

  • Bump version from release candidate to 3.5.0 without additional changes.

3.5.0b2 - 2024-04-05

Added

  • Added optional keyword arguments to pybricks.tools.read_input_byte() for
    automatic conversion via chr and to skip to the last byte (support#1574).
  • Added disconnect method to pybricks.pupdevices.Remote and
    pybricks.iodevices.LWP3Device (support#802).

Changed

  • Raise a descriptive error when the Car class can't find a steering mechanism
    end stop within 10 seconds (support#1564).
  • Extended region of readable data with hub.system.storage to include
    user program (pybricks-micropython#243).

Fixed

  • Fixed hubs not shutting down when holding hub button (support#1419).

3.5.0b1 - 2024-03-21

Added

  • Added support for rumble in XboxController (support#1024).
  • Added Button.UP, Button.DOWN, Button.LEFT, and Button.RIGHT to
    XboxController buttons method (support#1537). The separate directional
    pad method remains available.

Changed

  • Allow single floating point value for brightness array (support#1547).

3.4.0 - 2024-03-11

Changed

  • Additional error checking in pybricks.robotics.Car setup (support#1502).

3.4.0b3 - 2024-03-05

Added

  • Added joystick_deadzone keyword argument to suppress controller drift in
    the XboxController (support#1473).
  • Added pybricks.tools.running to return if a stopwatch is currently running
    (support#1490).

Changed

  • Use Button parameter for XboxController (support#1488), not strings.
  • If pybricks.tools.run_task is called without arguments, it will return
    whether the runloop is running or not (support#1499).
  • On Move Hub, the verbosity of error messages is further reduced to reduce
    the firmware size, to allow for bug fixes/updates (pybricks-micropython#240).
  • Re-implemented pybricks.robotics.Car in C so it can be enabled on Move Hub
    which does not support frozen modules (support#1502).

Fixes

  • Fix pybricks.iodevices not allowing writing -128 value (support#1366) and
    raise informative error messages instead of clamping the input.

3.4.0b2 - 2024-02-10

Added

  • Added pybricks.iodevices.XboxController (support#191, support#1024).
  • Re-enable pybricks.iodevices.LWP3Device missing from last beta.

Fixes

  • Fix hub not shutting down while a program runs (support#1438).

Changed

  • On Technic Hub and City Hub, the Bluetooth chip is now configured to reject
    connection parameter updates from peripherals. This avoids interference with
    broadcast when used with the Xbox controller.

3.4.0b1 - 2024-01-30

Added

  • Added pybricks.robotics.Car for controlling a car with one or more drive
    motors and a steering motor. This is a convenience class that combines
    several motors to provide the functionality used in most Technic cars.

Fixes

  • Fix observing stopping on City and Technic hubs after some time (support#1096).
  • Fix Bluetooth locking up when connecting Bluetooth adapter with small MTU to Technic and City hubs (support#947).
  • Fix Technic Hub not always starting automatically after firmware exiting
    update mode (support#1408). Also apply this to Move Hub and City Hub.
  • Fix Bluetooth locking up when connecting Bluetooth adapter with small MTU to
    Technic and City hubs (support#947).
  • Fix Remote pairing difficulty (support#880).
  • Fix Remote light not working or crashing the hub (support#1357).
  • Fix Technic Hub and City Hub broadcasting missing messages (support#1357).
  • Fix Technic Hub and City Hub broadcasting delays.

Changed

  • Changed polarity of output in the Light class. This makes no difference for
    the Light class, but it makes the class usable for certain custom
    devices (pybricks-micropython#166).
  • Improved Bluetooth peripheral scanning and connect process to allow for new
    device types to be added in the future.

Changed

  • Changed keypad return type to set instead of tuple. This affects the remote
    and hubs.

3.3.0 - 2023-11-24

Changed

  • Bump version from release candidate to 3.3.0.

3.3.0c1 - 2023-11-20

Added

Changed

  • Allow Move Hub to ignore broadcast instead of raising an exception while
    connected.

Fixed

  • Fixed Move Hub accelerometer not working since v3.3.0b5 (support#1269).
  • Fixed Bluetooth chip locking up on Technic and City hubs when broadcasting (support#1095).
  • Fixed potential crash when GC occurs while observing BLE data (support#1278)
  • Fixed Technic Hub and City Hub eventually stopping observing BLE data after
    a few minutes (support#1096) by implementing an auto-reset workaround.

3.3.0b9 - 2023-10-26

Added

  • Added hub.buttons as an alias for hub.button on buttons with one
    hub (support#1254).
  • Implemented brake for DriveBase (support#881).

Changed

  • The use_gyro method is added to the normal DriveBase class instead of
    having a separate GyroDriveBase class. Since the latter was only released
    in beta versions, this is not a breaking change (support#1054).
  • New color distance function used by the color sensors that is more
    consistent when distinguishing user-provided colors (pybricks-micropython#104).
  • Updated the unreleased BLE API to ensure sent and received objects are the
    same. Allows one of the supported types or a list/tuple thereof.

Fixed

  • Improved external device detection speed (support#1140).
  • Fixed Powered Up Tilt Sensor not working (support#1189).
  • Fixed surface=False not working in ColorSensor (support#1232).
  • Fixed PUPDevice.write not selecting correct mode (support#1213).
  • Fixed City Hub turning back on after shutdown (support#1195).
  • Fixed SPIKE hubs not broadcasting at all when attempting to broadcast in a
    tight loop (support#1151).

3.3.0b8 - 2023-07-07

Added

  • Added use_gyro method to toggle gyro use on and off in the GyroDriveBase
    class (support#1054).
  • Added pybricks.tools.read_input_byte() function (support#1102).

Changed

  • Relaxed thresholds that define when the IMU is stationary, to make the
    defaults work better in noisier conditions (support#1105).

Fixed

  • Fixed Technic (Extra) Large motors not working (support#1131) on all hubs.
  • Fixed Powered Up Light not working (support#1131) on all hubs.
  • Fixed UART sensors not working on Technic Hub (support#1137).
  • Fixed incorrect number of ports on City Hub (support#1131).

3.3.0b7 - 2023-06-30

Added

  • Added 'modes' entry to the dictionary returned by PUPDevice.info(). It
    is a tuple of (name, num_values, data_type) tuples for each available mode.
  • Added pybricks.tools.read_input_byte() function (support#1102).
  • Added pybricks.tools.hub_menu() function (support#1064).

Changed

  • Changed internal drivers for LEGO devices (motors and sensors) on all platforms.

Fixed

  • Fixed hub will not power off when Bluetooth chip crashes on City and Technic hubs (support#1095).
  • Fixed off() method in ColorLightMatrix, UltrasonicSensor, ColorSensor (support#1098).

3.3.0b6 - 2023-06-02

Added

Changed

  • Updated BTStack to v1.5.5.

Fixed

  • Fixed BLE broadcast not working on City hub.
  • Fixed crash on BTStack hubs when program stopped during call to ble.broadcast().
  • Fixed BLE broadcast not working on Technic hub when not connected (support#1086).
  • Fixed delayed sensor sync on boot on City hub (support#747).

3.3.0b5 - 2023-05-16

Added

  • Enabled the gc module (except on BOOST Move hub).
  • Added hub.ble attribute for broadcasting/observing (pybricks-micropython#158).

Changed

  • Updated MicroPython to v1.20.0.

Fixed

3.3.0b4 - 2023-04-21

Fixed

  • Fixed gyro on Technic Hub occasionally giving a bad value, which made it
    not calibrate properly (support#1026).
  • Fixed discrepancy in heading value across hubs by accounting for sampling
    time (support#1022).
  • Fixed iterator for Matrix objects giving bad values.
  • Fixed Bluetooth sometimes locking up on Technic/City hubs (support#567).
  • Fixed GyroDriveBase being slow to respond to heading perturbations when
    driving at high speed (support#1032).

Added

  • Added pybricks.tools.cross(a, b) to get a vector cross product.
  • Added experimental implementation of hub.imu.heading() (support#912).
  • Added support for reading single-axis rotation, which is useful in
    applications like balancing robots, where full 3D orientation is not
    required, or even undesired.
  • Added hub.imu.ready() to check that the IMU has been calibrated and is
    ready for use.
  • Added GyroDriveBase class to control drivebase steering with the gyro.
  • Added optional window parameter to Motor.speed to specify the
    differentiation window size that determines the average speed. This lets the
    user choose smaller values to get a more responsive (but noisier) or higher
    values to get a smoother (but more delayed) speed signal.

Removed

  • Removed positive_direction from DriveBase initializer. This was
    temporarily added in the previous beta release to facilitate gyro support,
    but made it more complicated than needed (support#992).
  • Removed pybricks.geometry in an effort to reduce the number of modules with
    just a few elements. Matrix and vector have moved to tools. The Axis
    enum was moved to parameters. Each item can still be imported from its
    original location for backwards compatibility.

3.3.0b3 - 2023-03-28

Added

  • Added positive_direction to DriveBase initializer. It defaults to
    clockwise to ensure this is not a breaking change. Users can now change it
    to counterclockwise, which is more common in engineering (support#989).
  • Added support for setting drivebase acceleration and deceleration separately
    using a tuple, consistent with single motors (support#881).

Fixed

  • Fixed allocator interfering with motor control when memory usage is high (support#977).
  • Fixed Stop.NONE not working properly for some drivebase geometries (support#972).
  • Fixed reading programs larger than 65535 bytes on boot on SPIKE hubs. ([support#996).
  • Various Bluetooth stability and reliability improvements on BOOST Move hub
    (support#320, support#324, support#417).
  • Fixed Bluetooth random address not changing on City and Technic hubs (support#1011).

Changed

  • Methods like control.limits() now check the user input and raise a
    ValueError if a value is out of bounds (support#484). This affects only
    settings setters, which are usually used as a one-off. Nothing changes to
    speed values set at runtime. These are still capped to valid numbers without
    raising exceptions.
  • Renamed precision_profile to profile in the Motor initializer.
  • In DriveBase, wheel_diameter and axle_track now accept decimal values
    for increased precision (support#830).

Removed

  • Removed DriveBase.left and DriveBase.right properties (support#910).

3.3.0b2 - 2023-03-08

Added

  • Added precision_profile parameter to Motor initializer. This can be used
    to reduce control gains to get smoother motions for heavy loads or heavily
    gear applications where precision is less relevant.

Changed

  • Changed how the PID values are initialized for each motor. This may lead to
    slightly altered performance.

Fixed

  • Fixed move hub crashing on boot.
  • Fixed position based commands starting from the wrong position if the
    previous command was a time based command that could not hit its
    target (support#956).
  • Fixed EV3 motors getting out of date with the updated motor
    controllers (support#941) and (support#955).
  • Fixed long delay when connecting to remote on SPIKE hubs (support#466).

3.3.0b1 - 2023-02-17

Added

  • Added support for frozen modules when building from source (support#829).
  • Added close() method to DCMotor and Motor so they can be closed and
    re-initialized later (support#904).
  • Fixed workaround for motor hold drifting away under external input
    movement (support#863).
  • Added Motor.model object to interact with the motor state estimator.
  • Added Stop.BRAKE_SMART as then option for motors. It works just like
    SMART_COAST, but with passive electrical braking.
  • Added logging support for control stall and pause state.

Fixed

  • Fixed Light controlling wrong ports on Move hub (support#913).
  • Reduced motor motion while holding position and added configurable setter and
    getter for this deadzone.
  • Fixed type checking optimized out on Move hub (support#950).
  • Fixed end-user stall flag coming up too early in position based control.
  • Further reduced stutter at low motor speeds (support#366).

3.2.2 - 2023-01-06

Fixed

  • Fixed some objects do not implement __hash__ (support#876).
  • Fixed Motor.run_time not completing under load (support#903).

3.2.1 - 2022-12-26

Fixed

  • Fixed imu.angular_velocity returning the values of imu.acceleration.

3.2.0 - 2022-12-20

Changed

  • Buffered stdout is flushed before ending user program.

Fixed

  • Fixed SPIKE/MINDSTORMS hubs advertising after disconnect while user program
    is still running (support#849).
  • Fixed Essential hub hanging on boot when bootloader entered but USB cable
    not connected (support#821).
  • Fixed button needs debouncing on City/Technic/Essential hubs (support#716).
  • Fixed motor hold drifting away under external input movement (support#863).

3.2.0c1 - 2022-12-09

Fixed

  • Fixed motor.control.limits() not working if acceleration was None.
  • Fixed crash on calling methods on uninitialized objects (support#805).
  • Fixed crash on calling methods in __init__(self, ...) before
    calling super().__init(...) on uninitialized objects (support#777).
  • Reverted Pybricks Code stop button raises SystemAbort instead of
    SystemExit (support#834).
  • Improved stop message raised on SystemExit and SystemAbort (support#836).
  • Fixed Technic Hub and City Hub sometimes not shutting down when a Bluetooth
    operation is busy (support#814).
  • Fixed hub.system methods not working (support#837).

Changed

  • Changed default XYZ orientation of the Technic Hub and the Essential Hub to
    match the SPIKE Prime Hub and Move Hub (support#848).

3.2.0b6 - 2022-12-02

Added

  • Added support for PBIO_PYBRICKS_COMMAND_REBOOT_TO_UPDATE_MODE Pybricks
    Profile BLE command.
  • Implemented Motor.load() which now measures load both during active
    conditions (run) and passive conditions (dc).

Changed

  • The Pybricks Code stop button will force the program to exit even if the user
    catches the SystemExit exception (pybricks-micropython#117).
  • Changed PrimeHub.display.image() to PrimeHub.display.icon() and renamed
    its kwarg from image to icon (support#409).
  • Deprecated Control.load(), Control.stalled(), and Control.done()
    methods, but they will continue to exist in the firmware until further
    notice (support#822). New scripts are encouraged to use the (improved)
    variants available directly on Motor objects.

Fixed

  • Fixed connecting Remote on BOOST move hub (support#793).

Removed

  • Removed hub.system.reset() method.
  • Disabled micropython module on Move Hub.

3.2.0b5 - 2022-11-11

Added

  • Added DriveBase.stalled() for convenient stall detection.
  • Added DriveBase.done() for convenient completion detection, which is
    practical when combined with wait=False.
  • Added Motor.done() for convenient completion detection, which is
    practical when combined with wait=False. Especially on Move Hub, which
    does not have the control attribute enabled.

Fixed

  • Fixed brief hub freeze on pybricks.common.Logger.save() when not connected
    to the computer (support#738).
  • Fixed drive base stall flags being set while not stalled (support#767).
  • Fixed Motor.run_target raising exception for short moves (support#786).

3.2.0b4 - 2022-10-21

Added

  • Indicate that the hub is shutting down by quickly flashing the hub light for
    half a second. This makes it easier to see when you can stop pressing the
    button.
  • Indicate that the SPIKE Prime hub is booting and shutting down by fading
    the stop sign in and out.
  • Implemented iterator protocol on geometry.Matrix class.
  • Added support for multi-file projects (pybricks-micropython#115).
  • Added new System.storage() API (support#85).

Changed

  • Battery full indication (green light) comes on earlier (support#647).
  • New indication for over-charging battery (blinking green light).
  • On Move Hub, City Hub, and Technic Hub, programs can now be restarted with
    the button after downloading them. They are saved on shutdown.
  • Improved program download process. Reduces the likelihood of getting errors
    about incompatible .mpy files when accidentally entering characters in the
    terminal window when no program is active.
  • On Prime Hub and Essential Hub, there is no longer a wait time after boot
    before you can start programs.
  • On Prime Hub and Essential Hub, the user program is now stored in a section
    of the external flash that is not used by any file system of other known
    firmwares, in order to avoid compatibility issues when changing firmware.
  • Restored the Motor.speed() method and DriveBase equivalent to provide
    speed as a numerical derivative of the motor position, instead of a
    model-based estimate. For most use cases, this is a more intuitive result
    because this speed value is not affected by mechanical load.
  • When using the REPL, everything from all Pybricks modules was automatically
    imported for convenience. Now, MicroPython modules are also automatically
    imported (support#741).
  • Updated Bluetooth to Pybricks Profile v1.2.0.
  • Bluetooth now uses random private address instead of static public address
    (support#600).

Fixed

  • Fixed motors going out of sync when starting program (support#679).
  • Fixed motor torque signal overflowing under load (support#729).
  • Fixed city hub turning back on after shutdown (support#692).
  • Fixed IMU I2C bus lockup on SPIKE hubs (support#232).
  • Fixed REPL history corrupt after soft reset (support#699).
  • Fixed "ValueError: incompatible .mpy file" when pressing the button when
    there is no program yet (support#599).

3.2.0b3 - 2022-07-20

Fixed

  • Fix integral control not working properly due to mistakes introduced while
    converting the controllers to use millidegrees.

Changed

  • Motor.run_time no longer raises an exception for negative time values.
    Negative times are now treated as zero, thus producing a stationary
    trajectory.

3.2.0b2 - 2022-07-06

Added

  • Added Motor.stalled(). It can detect stall during speed and position
    control (run, run_angle, ...) just like Motor.control.stalled(), but
    it also detects stall for dc() command when the user controls the voltage
    directly.

Fixed

  • Fixed motor not stopping at the end of run_until_stalled (support#662).
  • Fixed incorrect battery current reading on Technic hub (support#665).
  • When the motor was pushed backwards while stalled, the control.stalled()
    was inadvertently cleared because a nonzero speed was detected. This is fixed
    by checking the intended direction as well.
  • Fixed I/O devices not syncing at high baud rate.
  • Fixed ENODEV error while device connection manager is busy (support#674).

Changed

  • Reworked internal motor model that is used to estimate speed. This results
    in better speed estimation at low speeds, which makes PID control smoother.
  • The Motor.speed() method and DriveBase equivalents now provide the
    estimated speed instead of the value reported by the motor. This is generally
    more responsive.
  • Overhauled the control code to make it smaller and more numerically robust
    while using higher position resolution where it is available.
  • Changed drive base default speed to go a little slower.
  • Updated MicroPython to v1.19.

3.2.0b1 - 2022-06-03

Added

  • Added Stop.NONE as then option for motors. This allows subsequent
    motor and drive base commands to transition without stopping.
  • Added Stop.COAST_SMART as then option for motors. This still coasts the
    motor, but it keeps track of the previously used position target. When a new
    relative angle command is given (e.g. rotate 90 degrees), it uses that
    position as the starting point. This avoids accumulation of errors when using
    relative angles in succession.
  • Made motor deceleration configurable separately from acceleration.
  • Enabled ujson module.
  • Added ability to use more than one DriveBase in the same script.
  • Added support for battery charging on Prime and essential hubs.

Changed

  • Changed how DriveBases and Motor classes can be used together.
    Previously, an individual motor could not be used when a drive base used it.
    From now on, devices can always be used. If they were already in use by
    something else, that other class will just be stopped (coast).
  • Changed how unexpected motor problems are handled, such as a cable being
    unplugged while it was running. Previously, this raised a SystemExit no
    matter which motor was unplugged. Now it will return an OSError with
    ENODEV, which is consistent with trying to initialize a motor that isn't
    there. The Motor class must be initialized again to use the motor again.
  • Changing settings while a motor is moving no longer raises an exception. Some
    settings will not take effect until a new motor command is given.
  • Disabled Motor.control and Motor.log on Move Hub to save space.
  • Changed LED color calibration on Prime hub to make yellow less green.
  • Updated to upstream MicroPython v1.18.
  • Changed imu.acceleration() units to mm/s/s (pybricks-micropython#88) for
    Move Hub, Technic Hub, and Prime Hub.

Fixed

  • Fixed color calibration on Powered Up remote control (support#424).
  • Fixed 3x3 Light Matrix colors with hue > 255 not working correctly (support#619).

3.1.0 - 2021-12-16

Changed

  • Renamed new DCMotor.dc_settings() method to DCMotor.settings() (support#536).

Fixed

  • Fixed direction for DriveBase.turn() and Drivebase.curve() for some
    arguments (support#535).
  • Fixed then=Stop.COAST not working in DriveBase methods (support#535).

3.1.0c1 - 2021-11-19

Added

  • Added DriveBase.curve() method to drive an arc segment.
  • Added then and wait arguments to DriveBase methods (support#57).

Changed

  • Dropped integral_range argument from Control.pid(). This setting was
    ineffective and never used. When set incorrectly, the motor could get stuck
    for certain combinations of kp and ki.
  • Improved motor behavior for cases with low-speed, low-load, but high
    inertia (support#366).
  • Changed how the duty cycle limit is set for Motor and DCMotor. It is now
    set as a voltage limit via a dedicated method, instead of Motor.control.

Fixed

  • Fixed then=Stop.COAST being ignored in most motor commands.
  • Fixed brake()/light.off() not working on Move hub I/O port C (support#501).
  • Fixed Remote() failing to connect when hub is connected to 2019 or newer
    MacBooks (support#397).
  • Fixed intermittent improper detection of hot-plugged I/O devices (support#500).
  • A program now stops when a Motor is unplugged while it is running, instead
    of getting in a bad state.

3.1.0b1 - 2021-09-21

Added

  • Support for LEGO Technic Color Light Matrix (support#440).
  • Support for LEGO UART devices with a new battery power flag. This is
    required to support the new LEGO Technic Color Light Matrix (support#440).
  • Support for the SPIKE Essential hub/Technic Small hub (support#439).

Fixed

  • Fixed Ultrasonic Sensor and Color Sensor turning off when a
    user script ends (support#456).
  • Hub reset due to watchdog timer when writing data to UART I/O device
    (support#304).
  • City/Technic hubs not connecting via Bluetooth on macOS 12 (support#489).

Changed

  • Updated to MicroPython v1.17.

3.1.0a4 - 2021-08-30

Added

  • Enabled builtin bytearray (pybricks-micropython#60).
  • Enabled ustruct module (pybricks-micropython#60).
  • Added alpha support for dual boot installation on the SPIKE Prime Hub.
  • Added pybricks.experimental.hello_world function to make it easier for
    new contributors to experiment with Pybricks using C code.
  • Added ability to import the main.mpy that is embedded in the firmware from
    a download and run program (support#408).
  • Added pybricks.iodevices.LWP3Device to communicate with a device that supports
    the LEGO Wireless Protocol 3.0.00 (pybricks-micropython#68)

Changed

  • Move Hub Bluetooth optimizations to reduce firmware size (pybricks-micropython#49).
  • Disabled pybricks.iodevices module on Move Hub to reduce firmware size.
  • Improvements to pybricks.pupdevices.Remote:
    • Check if a remote is already connected before attempting to create a new
      connection.
    • Rename first argument from address to name to match documentation.
    • Implement connecting by name.
    • Add name() method.
    • Add light attribute.

3.1.0a3 - 2021-07-19

Added

  • Added reset_angle=False keyword argument to Motor() class.
    This makes resetting the angle optional, allowing to maintain absolute
    positioning for robots with gears (support#389).

Changed

  • Moved MicroPython math module to umath to be consistent with other
    MicroPython modules.

Fixed

  • Fixed City hub not always powering off on shutdown (support#385).
  • Fixed Move hub turning back on after shutdown (support#386).

3.1.0a2 - 2021-07-06

Added

  • Support for reading button state on Technic Hub, City Hub, and Move Hub.
  • Support for reading hub name on all Powered Up hubs.
  • Enable MicroPython slicing feature on Technic Hub, City Hub, Prime Hub.
  • Added pystone benchmark tests for all hubs.
  • Added hub.system.shutdown() for graceful shutdown (support#58).

Changed

  • Move Remote class from experimental to pupdevices.
  • Move Remote.pressed() to Remote.buttons.pressed().
  • Remove pybricks.experimental module on Move Hub.
  • Increased Move Hub heap from 6K to 7K due to recently freed RAM (pybricks-micropython#57).
  • Changed hub.system.reset(action) to accept 2 only (support#379). This
    is technically a breaking change, although this method was never officially
    released or documented. With this change, entering firmware update mode
    remains possible for backwards-compatibility, but unsafe power off methods
    are removed.

Fixed

  • Fix Bluetooth not disconnecting when shutting down and button is still pressed.
  • Fix I/O ports not powering off when shutting down and button is still pressed.
  • Fix version number only showing git hash and not v3.x.

3.1.0a1 - 2021-06-23

Added

  • Added PnP ID characteristic to Device Information Service and to advertising
    data (pybricks-micropython#49).
  • Added special location in firmware for storing hub name (support#52). Note:
    Support will need to be added to tools separately to make use of this.
  • Added configuration option to run a simplified version of motor PID control.
    It is activated on the Move Hub to reduce build size. Motor performance on
    the other hubs is unaffected.
  • Experimental support for the Powered Up remote control (support#186).

Changed

  • Updated MicroPython to v1.16.
  • Simplified the Powered Up UART Protocol host implementation. Unused device
    properties are no longer stored in order to reduce flash and RAM
    usage (pybricks-micropython#57).

3.0.0 - 2021-06-08

Added

Changed

  • Hub.reset() moved to Hub.system.reset() (support#321).
  • Motor methods now raise OSError with uerrno.EBUSY instead of uerrno.EPERM
    if the motor is currently being used and the operation cannot be completed.

Fixed

  • Fixed resetting motor angle while holding position causes movement (support#352).
  • Fixed DriveBase not resetting during initialization (pybricks-micropython#21).
  • Fixed Ctrl+C stopping REPL when first started (support#347).
  • Fixed UART I/O devices retuning uninitialized data (support#361).

Prerelease

Prerelease changes are documented at support#48.

Don't miss a new pybricks-micropython release

NewReleases is sending notifications on new releases.