diff --git a/src/shared/sensors/VN100/VN100.cpp b/src/shared/sensors/VN100/VN100.cpp
index f4fee6778509858a9a4c61b23ca8dfcd102180af..7a808633d782a3b9aa948348c87dbadedf602837 100644
--- a/src/shared/sensors/VN100/VN100.cpp
+++ b/src/shared/sensors/VN100/VN100.cpp
@@ -27,11 +27,9 @@
 namespace Boardcore
 {
 
-VN100::VN100(USARTType *portNumber, int baudRate, CRCOptions crc,
-             uint16_t samplePeriod)
-    : portNumber(portNumber), baudRate(baudRate), crc(crc)
+VN100::VN100(USART &usart, int baudRate, CRCOptions crc, uint16_t samplePeriod)
+    : usart(usart), baudRate(baudRate), samplePeriod(samplePeriod), crc(crc)
 {
-    this->samplePeriod = samplePeriod;
 }
 
 bool VN100::init()
@@ -109,12 +107,6 @@ bool VN100::init()
         return false;
     }
 
-    if (!this->start())
-    {
-        LOG_ERR(logger, "Unable to start the sampling thread");
-        return false;
-    }
-
     // Set the isInit flag true
     isInit = true;
 
@@ -129,11 +121,11 @@ void VN100::run()
     while (!shouldStop())
     {
         long long initialTime = miosix::getTick();
-
-        // Sample the data locking the mutex
-        miosix::Lock<FastMutex> l(mutex);
-        threadSample = sampleData();
-
+        {
+            // Sample the data locking the mutex
+            miosix::Lock<FastMutex> l(mutex);
+            threadSample = sampleData();
+        }
         // Sleep for the sampling period
         miosix::Thread::sleepUntil(initialTime + samplePeriod);
     }
@@ -151,7 +143,7 @@ bool VN100::sampleRaw()
     }
 
     // Send the IMU sampling command
-    serialInterface->writeString(preSampleImuString->c_str());
+    usart.writeString(preSampleImuString->c_str());
 
     // Wait some time
     // TODO dimension the time
@@ -200,9 +192,6 @@ bool VN100::closeAndReset()
     // Free the recvString memory
     delete recvString;
 
-    // Free the serialInterface memory
-    delete serialInterface;
-
     return true;
 }
 
@@ -241,7 +230,7 @@ VN100Data VN100::sampleData()
     }
 
     // Returns Quaternion, Magnetometer, Accelerometer and Gyro
-    serialInterface->writeString(preSampleImuString->c_str());
+    usart.writeString(preSampleImuString->c_str());
 
     // Wait some time
     // TODO dimension the time
@@ -269,7 +258,7 @@ VN100Data VN100::sampleData()
     // Returns Magnetometer, Accelerometer, Gyroscope, Temperature and Pressure
     // (UNCOMPENSATED) DO NOT USE THESE MAGNETOMETER, ACCELEROMETER AND
     // GYROSCOPE VALUES
-    serialInterface->writeString(preSampleTempPressString->c_str());
+    usart.writeString(preSampleTempPressString->c_str());
 
     // Wait some time
     // TODO dimension the time
@@ -319,7 +308,7 @@ bool VN100::disableAsyncMessages(bool waitResponse)
 bool VN100::configDefaultSerialPort()
 {
     // Initial default settings
-    serialInterface = new USART(portNumber, 115200);
+    usart.setBaudrate(115200);
 
     // Check correct serial init
     return true;
@@ -342,11 +331,8 @@ bool VN100::configUserSerialPort()
         return false;
     }
 
-    // Destroy the serial object
-    delete serialInterface;
-
     // I can open the serial with user's baud rate
-    serialInterface = new USART(portNumber, baudRate);
+    usart.setBaudrate(baudRate);
 
     // Check correct serial init
     return true;
@@ -425,20 +411,18 @@ bool VN100::selfTestImpl()
         return false;
     }
 
-    // I check the model number (I perform the procedure twice to delete junk
-    // problems)
-    sendStringCommand("VNRRG,01");
-    miosix::Thread::sleep(
-        100);  // These sleep are important at very high baud rates
-    recvStringCommand(recvString, recvStringMaxDimension);
-    miosix::Thread::sleep(100);
+    // removing junk
+    usart.clearQueue();
 
+    // I check the model number
     if (!sendStringCommand("VNRRG,01"))
     {
         LOG_WARN(logger, "Unable to send string command");
         return false;
     }
 
+    miosix::Thread::sleep(100);
+
     if (!recvStringCommand(recvString, recvStringMaxDimension))
     {
         LOG_WARN(logger, "Unable to receive string command");
@@ -654,7 +638,7 @@ bool VN100::sendStringCommand(std::string command)
     }
 
     // I send the final command
-    serialInterface->writeString(command.c_str());
+    usart.writeString(command.c_str());
 
     // Wait some time
     // TODO dimension the time
@@ -667,7 +651,7 @@ bool VN100::recvStringCommand(char *command, int maxLength)
 {
     int i = 0;
     // Read the buffer
-    if (!(serialInterface->readBlocking(command, maxLength)))
+    if (!usart.readBlocking(command, maxLength))
     {
         return false;
     }
diff --git a/src/shared/sensors/VN100/VN100.h b/src/shared/sensors/VN100/VN100.h
index d2d5c6c943c088c09a9eae55417276fa07a228ff..64886b774eca270e46dba86435bd1019c308050f 100644
--- a/src/shared/sensors/VN100/VN100.h
+++ b/src/shared/sensors/VN100/VN100.h
@@ -80,14 +80,13 @@ public:
     /**
      * @brief Constructor.
      *
-     * @param USART port number.
+     * @param usart Serial bus used for the sensor.
      * @param BaudRate different from the sensor's default [9600, 19200, 38400,
      * 57600, 115200, 128000, 230400, 460800, 921600].
      * @param Redundancy check option.
      * @param samplePeriod Sampling period in ms
      */
-    VN100(USARTType *portNumber = USART2, int baudRate = 921600,
-          CRCOptions crc        = CRCOptions::CRC_ENABLE_8,
+    VN100(USART &usart, int baudrate, CRCOptions crc = CRCOptions::CRC_ENABLE_8,
           uint16_t samplePeriod = 20);
 
     bool init() override;
@@ -238,8 +237,13 @@ private:
      */
     uint16_t calculateChecksum16(uint8_t *message, int length);
 
-    USARTType *portNumber;
+    /**
+     * @brief Serial interface that is needed to communicate
+     * with the sensor via ASCII codes.
+     */
+    USART &usart;
     int baudRate;
+
     uint16_t samplePeriod;
     CRCOptions crc;
     bool isInit = false;
@@ -266,12 +270,6 @@ private:
      */
     unsigned int recvStringLength = 0;
 
-    /**
-     * @brief Serial interface that is needed to communicate
-     * with the sensor via ASCII codes.
-     */
-    USARTInterface *serialInterface = nullptr;
-
     /**
      * @brief Mutex to synchronize the reading and writing of the threadSample
      */
diff --git a/src/tests/sensors/test-vn100.cpp b/src/tests/sensors/test-vn100.cpp
index 2e93b1eff2ce610def3f0bfe76feed3f7418efc2..5f5fd14ada39d8be9b93487304a685e9819db712 100644
--- a/src/tests/sensors/test-vn100.cpp
+++ b/src/tests/sensors/test-vn100.cpp
@@ -31,26 +31,42 @@ int main()
 {
     VN100Data sample;
     string sampleRaw;
-    VN100 sensor{USART1, 921600, VN100::CRCOptions::CRC_ENABLE_16};
+
+    GpioPin u2tx1(GPIOA_BASE, 2);
+    GpioPin u2rx1(GPIOA_BASE, 3);
+
+    u2rx1.alternateFunction(7);
+    u2rx1.mode(Mode::ALTERNATE);
+    u2tx1.alternateFunction(7);
+    u2tx1.mode(Mode::ALTERNATE);
+
+    USART usart(USART2, 115200);
+    VN100 sensor{usart, 115200, VN100::CRCOptions::CRC_ENABLE_16};
 
     // Let the sensor start up
     Thread::sleep(1000);
 
+    printf("Initializing sensor\n");
     if (!sensor.init())
     {
         printf("Error initializing the sensor!\n");
         return 0;
     }
 
-    printf("Sensor init successful!\n");
-
+    printf("Running self-test\n");
     if (!sensor.selfTest())
     {
-        printf("Error self test check!\n");
+        printf("Unable to execute self-test\n");
+        return 0;
+    }
+
+    if (!sensor.start())
+    {
+        printf("Unable to start the sampling thread\n");
         return 0;
     }
 
-    printf("Sensor self test successful!\n");
+    printf("Sensor sampling thread started!\n");
 
     // Sample and print 100 samples
     for (int i = 0; i < 100; i++)