Path Finding Robot (Arduino IDE)

Here we will use the HC-SR04 Ultrasonic sensor to give Bot:Bot eyes. These sensors can be purchased on the internet and I suggest you buy one from 4Tronix as they have mounted it on a breakout board to get over the voltage issues (the sensor runs on 5v logic where as the Micro:Bit runs on 3v logic).

I have created a simple path finding algorithm as an introduction to this type of programming. One of the problems that we encounter is that if we explicitly tell Bit:bot what to do every time it encounters an obstacle it will move in a predictable way that will mean that the robot will either get stuck or go around in circles in certain scenarios. To combat this we will use random delays when the robot turns and random number of turns before changing direction.

I opened up the previous project and created a new tab called _03_PathFinder and added the following code;

[pastacode lang=”c” manual=”%2F*%0A%20*%20Path%20finding%20algorithm%20for%20the%204Tronix%20Bit%3ABot%0A%20*%20Author%20David%20Bradshaw%202018%0A%20*%20Requires%20the%20ultrasonic%20sensor%20HC-SR04%0A%20*%2F%0A%0Aint%20leftCount%20%3D%200%3B%0Aint%20rightCount%20%3D%200%3B%0Aboolean%20isLeft%20%3D%20true%3B%0Along%20randDelay%3B%0Along%20rndSide%20%3D%20random(512%2C%202048)%3B%0A%0Aint%20numberofTurns%20%3D%20(int(rndSide)%20%2F%20100)%3B%20%2F%2FWill%20decide%20how%20many%20times%20to%20turn%20each%20way%20before%20changing%20direction%0A%0A%2F*%0A%20*%20This%20algorithm%20will%20make%20the%20robot%20go%20forwards%20until%20an%20object%20is%20less%20than%2025cm%20away%0A%20*%20Then%20it%20will%20turn%20either%20left%20or%20right%20for%20a%20random%20amount%20of%20times%0A%20*%20When%20it%20has%20turned%20either%20left%20or%20right%20for%20a%20random%20number%20or%20turns%20it%20will%0A%20*%20turn%20the%20other%20way%20and%20the%20process%20is%20repeated.%20If%20an%20obstacle%20is%20less%20than%205cm%0A%20*%20away%20it%20will%20go%20backwards%20for%20250mS%0A%20*%20%0A%20*%20This%20is%20a%20random%20pathfinder%20with%20no%20memory%2C%20it%20uses%20random%20intervals%20to%0A%20*%20minimise%20the%20risk%20of%20getting%20stuck%20or%20going%20the%20same%20way%20over%20and%20over%20again.%0A%20*%20The%20robots%20behaviour%20should%20appear%20to%20be%20random.%0A%20*%2F%0Avoid%20simplePF()%0A%7B%0A%20%20%20%20int%20distance%20%3D%20getDistance()%3B%20%2F%2FUses%20the%20ultrasonic%20sensor%20to%20detect%20obstacles%0A%20%20%20%20randomSeed((detectLight(%22LEFT%22)%20*%20digitalRead(rightLineSensor)%20*%20distance))%3B%0A%0A%20%20%20%20randDelay%20%3D%20random(512%2C%201024)%3B%20%20%2F%2FGenerate%20a%20random%20number%20to%20calculate%20the%20delay%0A%20%20%20%20randDelay%20%3D%20(randDelay%20%2F%204)%3B%0A%20%20%20%20%0A%20%20%20%20if%20(distance%20%3E%2050)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20setColourLeft(0%2C%2064%2C%200)%3B%0A%20%20%20%20%20%20%20%20setColourRight(0%2C%2064%2C%200)%3B%0A%20%20%20%20%20%20%20%20forwards(255)%3B%20%20%2F%2Ffull%20speed%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%20(distance%20%3C%2050%20%26%26%20distance%20%3E%2025)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20setColourLeft(64%2C%2064%2C%2025)%3B%0A%20%20%20%20%20%20%20%20setColourRight(64%2C%2064%2C%2025)%3B%0A%20%20%20%20%20%20%20%20forwards(128)%3B%20%20%2F%2Fhalf%20speed%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%20(distance%20%3C%2025%20%26%26%20distance%20%3E%205)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F%2FObject%20in%20front%20so%20we%20better%20turn%0A%20%20%20%20%20%20%20%20if(isLeft%20%3D%3D%20true)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20setColourLeft(0%2C%2064%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20setColourRight(64%2C%200%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20leftCount%20%3D%20leftCount%20%2B%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20left(128)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20delay(randDelay)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(leftCount%20%3E%20numberofTurns)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20leftCount%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isLeft%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20setColourLeft(64%2C%200%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20setColourRight(0%2C%2064%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20rightCount%20%3D%20rightCount%20%2B%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20right(128)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20delay(randDelay)%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(rightCount%20%3E%20numberofTurns)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rightCount%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20isLeft%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%20(distance%20%3C%205)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20setColourLeft(64%2C%200%2C%200)%3B%0A%20%20%20%20%20%20%20%20setColourRight(64%2C%200%2C%200)%3B%0A%20%20%20%20%20%20%20%20backwards(255)%3B%0A%20%20%20%20%20%20%20%20delay(250)%3B%0A%20%20%20%20%7D%0A%7D” message=”A Simple Path Finder” highlight=”” provider=”manual”/]

I then added the following line to the loop() method in the _00_programLoop tab;

[pastacode lang=”c” manual=”%2F*%0A*%20PUT%20YOUR%20MAIN%20LOOP%20CODE%20HERE%0A*%2F%0AsimplePF()%3B%0A” message=”Call the above Function” highlight=”” provider=”manual”/]

Remember that your Neopixels won’t work unless you carry out the Neopixel modification and you must add all libraries if you haven’t already links are in the code.

You can download the code by clicking Bitbot_Lib_PathFinder or from the resources page.