diff --git a/README.org b/README.org
index dee21c93cf5fc294b219cf300be56a387b422ea5..d42e2a7fc7c59653254a16d8b2cdf84af1c982cc 100644
--- a/README.org
+++ b/README.org
@@ -125,6 +125,10 @@ Multibyte values are exchanged in little endian format.
   duration in 10th of seconds on 1 byte. This cannot be used if the
   motor is moving.
 
+** [IMPLEMENTED] 0xE0 Reset (W)
+
+- Reset the device. Used mainly for testing.
+
 ** 0xF0-0xF7 Unique device ID (R)
 
 - Unique device ID as found in addresses 0x1FFFF7E8-0x1FFFF7EF
diff --git a/controller/python/controller.py b/controller/python/controller.py
index 29c9b8f84d1ab3bd9076e059f4392f6f5a5c3750..abe104093317c49c43272239be031453d7e255e0 100644
--- a/controller/python/controller.py
+++ b/controller/python/controller.py
@@ -22,6 +22,7 @@ class Controller:
     MOTOR_SPEED = 0x30
     ENCODER_TICKS = 0x32
     STATUS = 0x36
+    RESET = 0xE0
 
     def __init__(self, i2cbus=8):
         import smbus
@@ -161,3 +162,7 @@ class Controller:
         """Return the PWM frequency in Hz."""
         a, b, c = self._read(self.PWM_FREQUENCY, 3, "BBB")
         return a | (b << 8) | (c << 16)
+
+    def reset(self):
+        """Reset the device. Used mainly for testing."""
+        self._write(self.RESET, [])
diff --git a/controller/src/logic/mod.rs b/controller/src/logic/mod.rs
index 3ed0269c0b03c021d9408b83154dd738d72853a1..5de199dc0088b4ba1049f518b2a5212ee041a9b5 100644
--- a/controller/src/logic/mod.rs
+++ b/controller/src/logic/mod.rs
@@ -60,6 +60,7 @@ const CMD_MOTOR_SHUTDOWN_TIMEOUT: u8 = 0x28;
 const CMD_MOTOR_SPEED: u8 = 0x30;
 const CMD_ENCODER_TICKS: u8 = 0x32;
 const CMD_STATUS: u8 = 0x36;
+const CMD_RESET: u8 = 0xe0;
 
 include!(concat!(env!("OUT_DIR"), "/version.rs"));
 
@@ -153,6 +154,10 @@ fn process_command(
                 .push_back(u8::from(motor_control::is_moving()))
                 .unwrap();
         }
+        [CMD_RESET] => {
+            defmt::info!("resetting device after receiving the RESET command");
+            cortex_m::peripheral::SCB::sys_reset();
+        }
         _ => {
             defmt::warn!("unknown command or args {:#04x}", command);
             return false;