GPS is perfect for navigating roads, because that doesn’t require much precision. But GPS is only accurate to several meters, which means that it is unsuitable for applications that require more precise positioning. GPS RTK (real-time kinematic) systems can achieve much greater accuracy, but they are complex and require a subscription to a correction service. Viktor Kurusa needed accurate positioning for his robotic lawn mower, but didn’t want to resort to GPS RTK. Instead, he used a few Arduino boards to enable UWB ranging for centimeter-scale positioning.
UWB (ultra-wideband) is a radio technology that the FCC opened up for consumer and commercial applications in 2002. It is ideal for transmitting large amounts of data at short ranges. It is also possible to use UWB to calculate distances by measuring the ToF (time of flight) between a “tag” device and an “anchor” device. Using two anchor devices, one can triangulate the position of the tag on a 2D plane. With three anchors, one can determine the tag’s exact location in 3D space.
Kurusa used this UWB positioning capability for his robotic lawn mower’s navigation. The lawn mower incorporates several boards: an Arduino Due, two Nanos, and four SparkFun Arduino Pro Minis. The latter four boards connect to Decawave DMW1000 UWB transceiver modules — three of them for the remote anchors and one of them for the onboard tag. The Due board acts as the primary onboard controller and runs FreeRTOS, monitors an MPU6050 accelerometer, and drives the robot’s motors through an H-bridge. One Nano board interfaces with ultrasonic sensors for obstacle avoidance and the second Nano monitors a LIDAR sensor, which the system checks if the ultrasonic sensors detect an obstacle.
With all of that hardware working in concert, Kurusa has a robotic lawnmower with a sophisticated sensor array. It knows exactly where it is in the yard, which lets it accurately follow paths while mowing. If something unexpected enter’s the mower’s path, such as a kid’s soccer ball, the mower will detect it and attempt to navigate around it.
Read more about this on: Arduino Blog