In de blogpost van vandaag willen we een op afstand bestuurbare verkenningsrobot bouwen met behulp van de Acebott Smart Car Kit. De robot wordt bestuurd met een joystick en toont zijn omgeving in radaroptiek op een klein scherm.
De ultrasone sensor, die al gemonteerd is op een servomotor met een acrylhouder, wordt gebruikt om de omgeving te scannen.
Het besturingssysteem maakt gebruik van de PS2 joystick shield en ESP32 D1 R32 setup die je misschien al kent van de blogposts over het besturen van de Bionic Spider robot.
Hardware
Als je de aanpassingen aan het PS2 Joystick Shield in een eerdere blog uit de Bionic Spider Controller serie al hebt gedaan, kun je de volgende paragraaf overslaan.
Voor de realisatie van het project heb je nodig:
(optioneel) 9V blokbatterij + Batterijclip
en natuurlijk een geassembleerd exemplaar Acebott robot auto
Aangezien de analoge ingangen van de twee assen van de joystick verbonden zijn met GPIO 2 en 4, die verbonden zijn met ADC2, kunnen deze niet gelijktijdig met de WLAN-module gebruikt worden. De aansluitingen IO 34 en IO35 (ADC1) bevinden zich hier echter direct naast, zodat de functionaliteit eenvoudig kan worden ingesteld via een draadjumper.

Afbeelding 1: Draadbrug tussen de aansluitingen
Sluit de aansluitingen aan zoals hierboven getoond.
Omdat de on-board LED is verbonden met GPIO 2, moet de pin hier worden verwijderd omdat de verbinding anders de waarde van de spanning op de X-as zou beïnvloeden.
Hetzelfde geldt voor pin D12, omdat deze het opstartproces verstoort en er dus niet opgestart kan worden met het shield aangesloten. De middelste knop van de joystick is verbonden met deze aansluiting en kan dus niet meer gebruikt worden. Als je dit toch wilt implementeren, moet het opnieuw verbonden worden met een vrije aansluiting.

Afbeelding 2: Schild met wijzigingen
De afscherming kan gewoon op de D1 R32 worden aangesloten. Zorg ervoor dat de kleine schakelaar in de linkerhoek is ingesteld op 3v3 Anders kan de ESP32 beschadigd raken door de te hoge spanning van 5V.
Uitbreiding weergeven
Omdat de controller de omgeving van het voertuig moet weergeven in de vorm van een radarscherm, zoals in veel films te zien is, is een display nodig.
Hier raden we de 1,3" OLED grafisch display (SH1106). Dit is niet alleen een groot, goed afleesbaar grafisch display, maar het heeft ook de juiste indeling voor de contactstrip van de HC05 module op het schild (rechtsboven). Dit betekent dat het display zonder grote aanpassingen kan worden ingeplugd.
Alleen de bovenste SMD-weerstand naast knop A moet worden verwijderd, omdat deze oorspronkelijk was ontworpen om de spanning op de RXD-pin van de HC05 te halveren, zodat de module niet beschadigd raakt wanneer deze wordt gebruikt met de UNO-microcontroller.
Afbeelding wijzigen
Aangezien de gebruikte microcontroller (ESP32) een logisch niveau van 3,3V heeft, zou communicatie met het display niet meer werken met de gehalveerde spanning.
Software
Voor de communicatie worden de gegevenspakketten uitgewisseld met UDP. Met dit communicatieprotocol worden de pakketten eenvoudig verzonden zonder te controleren of het pakket is ontvangen.
Hoewel dit de gegevensuitwisseling erg snel maakt, is het ook onveilig, omdat het niet mogelijk is om te bepalen of de ontvanger de gegevens daadwerkelijk ontvangt. Communicatie via een netwerk maakt ook een groter bereik mogelijk in vergelijking met ESPnow of Bluetooth, omdat het netwerk een groot gebied kan bestrijken met repeaters en toegangspunten.
In principe kunnen de twee apparaten met elkaar communiceren op elke locatie waar je ontvangst hebt met je smartphone.
De bibliotheek voor UDP-communicatie is al opgenomen in het uitgebreide bordpakket voor de ESP32.
Naast de UDP- en WiFi-bibliotheek zijn er nog andere externe bibliotheken nodig, die je nog moet installeren.
Deze kunnen worden gedownload van GitHub als een .zip-bestand via de volgende links en kunnen worden geopend in de Arduino IDE onder
Sketch > Bibliotheek opnemen > .zip-bibliotheek toevoegen ...
kunnen worden geselecteerd en geïnstalleerd.
De ESP32Servo, ultrasoon en voertuig Bibliotheken zijn al opgenomen in het .zip-bestand van de instructies. Deze zijn ook al geïnstalleerd in de instructies voor geavanceerde gebruikers.
Code smart auto
|
#include <vehicle.h> |
Uitleg:
Bij het opstarten maakt de ESP32 verbinding met het WLAN, opent een UDP-poort en initialiseert de motoren, ultrasone sensor en servo. In de hoofdlus wacht het op binnenkomende UDP-commando's en evalueert deze als tekstcommando's. Afhankelijk van het commando worden de motoren aangestuurd of speciale functies uitgevoerd. Afhankelijk van het commando worden de motoren aangestuurd of speciale functies uitgevoerd.
Met het BTN_A commando zwenkt de servo de ultrasone sensor in stappen, meet de afstand op elke positie en slaat de hoek en afstand op in een JSON array. Zodra de scan is voltooid, wordt de JSON geserialiseerd en via UDP teruggestuurd naar de zender, waarna de servo terugkeert naar de middelste positie.
Na elke uitgevoerde actie stuurt de ESP32 de feedback "RDY" om aan te geven dat hij klaar is voor de volgende opdracht.
U kunt de code hier download.
Zodra je het programma met de juiste WLAN-toegangsgegevens in de microcontroller hebt geladen, wordt het IP-adres van het apparaat weergegeven. Noteer dit omdat het nodig is voor de controller.
Code controller
|
#include <math.h> JsonDocument doc; |
Uitleg:
Na het opstarten maakt de ESP32 verbinding met het WLAN, initialiseert het OLED-display, kalibreert de joystick op zijn middenpositie en stelt de vereiste GPIO's in voor de knoppen. De assen van de joystick worden continu geanalyseerd in de hoofdlus. Als ze een drempelwaarde overschrijden, wordt een bewegingsrichting bepaald en via UDP als commando verzonden (bijv. vooruit, achteruit, links, rechts) of wordt de joystick gestopt als deze in de middenpositie staat. Daarnaast kunnen speciale commando's worden geactiveerd met de A-F-knoppen. Om meervoudige transmissies te voorkomen, wordt elk commando pas opnieuw verzonden na bevestiging of een time-out.
Inkomende UDP pakketten worden ook geanalyseerd. Als het antwoord "RDY" wordt ontvangen, geeft dit aan dat de ontvanger klaar is voor het volgende commando. Als het pakket in plaats daarvan een JSON object met meetgegevens bevat, wordt dit ontleed en weergegeven als een lijnweergave op de OLED. De hoek en afstand van de gemeten waarden stellen lijnen voor die vanuit het midden van het scherm beginnen. Dit creëert een eenvoudige grafische weergave van de omgeving die door de andere ESP32 is gedetecteerd.
De lijnen worden gemaakt met de functie drawLineAngle(). Hier worden de eindcoördinaten van de lijn berekend met behulp van de sinus en cosinus. Je kunt een gedetailleerde uitleg vinden in de blog Retro horloge met GC9A01A.
U kunt de code hier download.
Laad het programma met de juiste toegangsgegevens en het IP-adres van de ontvanger in de microcontroller.
Conclusie
Als je nu op knop A op de controller drukt, toont het display de omgeving in de volgende 60 cm grafisch als een lijn voor elke meting. Eén pixel komt overeen met ongeveer één centimeter. Als je een bredere weergaveradius wilt, kun je het besturingsprogramma dienovereenkomstig aanpassen, maar let wel op de maximale lengte van 60 pixels.
Natuurlijk legt dit project alleen de basis voor je eigen uitbreidingen en aanpassingen. Naast het scannen van de omgeving kunnen ook andere functies worden toegevoegd; de niet-toegewezen knoppen op het controller shield zijn hier beschikbaar.
Veel plezier met herbouwen :)






