The project consists of a land-based ROV remotely controlled by the user. Specifically, the structure of the ROV is divided as follows:
Mechanical section: Managed by an Arduino R1. Using two DC motors connected to an L298N motor controller, the vehicle can be moved. VL53L0X sensors will also be added to the front of the ROV, allowing it to detect surrounding objects up to 2 meters away and avoid collisions (Collision Avoidance).
‘Smart’ section: A Raspberry Pi 4B will be used, connected via serial to the Arduino board, in order to divide tasks and balance the workload. A camera will be installed to provide video streaming to the user. The Raspberry Pi will run Object Detection models, allowing the user to select a recognized object and have the ROV navigate intelligently and autonomously up to the collision limit of the selected object. The user will therefore have two driving modes: manual mode and autonomous mode based on the chosen object.
Communication: The user will connect remotely and use a web page to send commands to the Raspberry Pi. Since remote access is involved, I plan to use a VPS as a bridge between the user and the Raspberry Pi board.
In this phase, I've decided to divide each boards in separate parts and test them separately, before combine them.
-
Arudino:
- Testing:
- Sensors VL53L0X shares the same bus, that means to give each sensor a unique I²C address in software we use the XSHUT pin on each sensor so you can turn them on one at a time and change their address.

- L298N Motor Controller and the motors powered by 4 AA batteries 1.2V with a total of 4.8V

- Combination of the two VL53L0X laser-ranging modules with the L298N motor controller

- Sensors VL53L0X shares the same bus, that means to give each sensor a unique I²C address in software we use the XSHUT pin on each sensor so you can turn them on one at a time and change their address.
- Testing:
-
Raspberry PI:
- Testing:
- Arducam OV5647 camera module with built-in motorized IR-CUT filter attached via CSI.
- Picamera2 with Flask for localhost streaming
- Testing Streaming while using YOLO Object Detection models:
a. yolo11n & yolo11n_ncnnn_model ( Ideal for resource-constrained devices like Raspberry Pi and NVIDIA Jetson. NCNN can provide significant performance improvements. credits: https://docs.ultralytics.com/integrations/ncnn/#why-export-to-ncnn) This is the main model, There will be a comparison with older models like: yolov8n_ncnn_model and yolov5n_ncnn_model to see which fits best the case study. - Front-End: Basic streaming and a table that shows the objects detected to the user. The table is important so that the operator can choose which object the ROV has to move to.
- Back-End: Receive the commands if the user is in manual driving or the object that the ROV has to move to.
- Object in the center of the frame.
- Two-way communication PI-Arduino: The two boards are connected via USB
- find the ttyACM0 port (USB-ARDUINO)
- set the baud rate to 115200 (stty -F /dev/ttyACM0 115200)
- UPS for power supply with 1 18650 battery
- Arducam OV5647 camera module with built-in motorized IR-CUT filter attached via CSI.
- Testing:
-
Local Server & VPS:
- Testing:
- To keep the testing scalable and especially reduce the amount of work of the raspberry (since it goes at 2.5 fps with yolo11n_ncnn), In this part I will use a local machine (an old HP) that simulates the behaviour of the vps.
- To keep the testing scalable and especially reduce the amount of work of the raspberry (since it goes at 2.5 fps with yolo11n_ncnn), In this part I will use a local machine (an old HP) that simulates the behaviour of the vps.
- Testing: