A little over a year ago, I launched this Patreon page to help grow the Pybricks project, with the goal to keep working on it around the clock. Thanks to you, 2024 has been a fantastic year, with lots of progress on exciting new features and projects for Pybricks. I am incredibly grateful for your support and I can't wait to release more updates and projects in 2025. Thank you, and happy new year!
--- Laurens, co-creator of Pybricks
It has been amazing to see many FLL and WRO teams enjoy using Pybricks for their competitions and presentations. Some teams even went on to win the world finals!

Thanks to WRO coach and judge Attila Farago for taking these pictures!
Besides the new technical features released this year, I've been working on a new series of projects and a brand new learning guide to help you master robotics and coding. More chapters should be coming out next year!

This year has been quite the roller coaster, with lots of amazing creations from the Pybricks community. I can't wait to see what you will all make next year.

Picture and design credit: Lasse Deleuran. (Check out his other creations too!)
The first big new feature this year was Xbox Controller support. For the first time, LEGO fans could operate their Technic, MINDSTORMS and SPIKE creations directly with a physical controller with analog inputs. It was great fun to announce this together with RacingBrick.

While working on the Bluetooth driver for the Xbox controller, we've also improved wireless communication between the LEGO hubs. You can even communicate with other BLE powered boards now.


The other major update this year concerned the gyro. In a few months, we will be launching a new firmware with even better control of the gyro. You will be able to capture 3D motion, and easily calibrate your gyro for improved performance during competitions.
If you've missed it, I've recently posted about an ambitious initiative for next year. We're on a mission to save LEGO MINDSTORMS EV3! I've been working on this for some time now, and I can't wait to publish the first experimental version next year.

There were also lots of smaller, incremental upgrades to the firmware this year. Many of you have participated in testing and discussions of new features. Thank you! You can view each of the updates and related discussions using the links below.
Special thanks to David Lechner (co-creator of Pybricks) and other Pybricks community members for their code contributions this year!
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.
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(use_gyro=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 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.
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.
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 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).
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 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 3 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 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 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.
Bump version from release candidate to 3.5.0 without additional changes.
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).
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 hubs not shutting down when holding hub button (support#1419).
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.
Allow single floating point value for brightness array (support#1547).
Additional error checking in pybricks.robotics.Car setup (support#1502).
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).
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).
Fix pybricks.iodevices not allowing writing -128 value (support#1366) and raise informative error messages instead of clamping the input.
Added pybricks.iodevices.XboxController (support#191, support#1024).
Re-enable pybricks.iodevices.LWP3Device missing from last beta.
Fix hub not shutting down while a program runs (support#1438).
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.
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.
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 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 keypad return type to set instead of tuple. This affects the remote and hubs.
LCR Brick Tech
2024-12-31 16:43:25 +0000 UTC