Bionic Spider Controller - Teil 1 - AZ-Delivery

In de Bionic Spider Robot Kit heb je al geleerd hoe de bionische spin werkt en heb je er al een aantal projecten mee uitgevoerd. Recentelijk is de besturing van de robot via een smartphone-app toegevoegd.

Omdat de bediening via het touchdisplay niet bijzonder prettig is, presenteert deze blogpost een alternatieve bediening met een joystick.

 

Hardware

Er zijn twee versies beschikbaar als joystick, één kan KY-023 module kan worden gebruikt. Omdat hier echter veel bekabeling nodig zou zijn, is dit wel aan te raden PS2-joystickschild, die ook rechtstreeks is aangesloten op een microcontroller Uno Lay-out kan worden ingevoegd.

Omdat de microcontroller met de robot moet communiceren, is een microcontroller met WiFi-functionaliteit vereist. Bovendien zijn voor elk van de X- en Y-assen twee ADC's nodig, daarom moet hier een ESP32 worden gebruikt.

(De ESP8266 heeft slechts één ADC-ingang.)

 

Om het project te realiseren heeft u nodig:

ESP32 KnooppuntMCU D1 R32

PS2-joystickschild

(optioneel) 9V blokbatterij+ Batterijclip

en natuurlijk een gemonteerde Bionische Spider Robotkit

 

Omdat de analoge ingangen van de twee joystickassen zich op GPIO 2 en 4 bevinden, die zijn aangesloten op de ADC2, kunnen ze niet tegelijkertijd met de WLAN-module worden gebruikt. De aansluitingen IO 34 en IO35 (ADC1) bevinden zich direct ernaast, zodat functionaliteit eenvoudig tot stand kan worden gebracht met behulp van een draadbrug.

Figuur 1: Draadbrug tussen de verbindingen

Sluit de connectoren aan zoals hierboven weergegeven.
Omdat de ingebouwde LED op GPIO 2 is aangesloten, moet de pin hier worden verwijderd, omdat de verbinding anders de waarde van de X-asspanning zou beïnvloeden.

Hetzelfde geldt voor pin D12, omdat dit het opstartproces verstoort en daarom niet mogelijk is om op te starten met het schild eraan bevestigd. Op deze aansluiting bevindt zich de middelste knop van de joystick, waardoor deze niet meer te gebruiken is. Als u het toch wilt implementeren, moet het opnieuw worden aangesloten op een vrije poort.

 

Figuur 2: Schild met aanpassingen

 

De afscherming kan eenvoudig op de D1 R32 worden gestoken. Zorg ervoor dat de kleine schakelaar in de linkerhoek aan staat 3v3 anders kan de ESP32 beschadigd raken door de te hoge spanning van 5V.

Software

Als dit de eerste keer is dat u een ESP32/ESP8266 in de Arduino IDE programmeert, kopieert u de volgende URL's in de Arduino IDE onder: Bestand->Voorkeuren->URL's voor extra kaartenbeheer:  https://dl.espressif.com/dl/package_esp32_index.json

http://arduino.esp8266.com/stable/package_esp8266com_index.json

 

en installeer de ESP32- en ESP8266-pakketten in het bordbeheer.


 

Het ESPNOW-protocol, dat eenvoudig te gebruiken is dankzij de geïntegreerde bibliotheek, is geschikt voor de gegevensoverdracht tussen de microcontrollers.

Het voordeel van dit protocol is dat de datapakketten ook zonder server en WLAN kunnen worden verzonden, waardoor communicatie op elke locatie en zonder extra hardware mogelijk is.

Bovendien worden de pakketten eenvoudig verzonden, zonder ingewikkelde authenticatie zoals bij WLAN, wat betekent dat een zeer snelle transmissie in vrijwel realtime kan worden bereikt.

 

Voor de communicatie zijn de hardwareadressen, de zogenaamde MAC-adressen (Media Access Control), van de twee apparaten nodig. Deze bevinden zich in een beschermd deel van het geheugen en kunnen duidelijk aan een apparaat worden toegewezen.

Hiermee kunnen de pakketten naar de juiste ontvanger worden verzonden.

 

1 Bepaal de MAC-adressen

Omdat de adressen zich in een beveiligd geheugen bevinden, kunnen ze ook met een apart kort programma worden uitgelezen, aangezien dit niet verandert als het geheugen wordt herschreven.

 

Laad het programma op de twee microcontrollers:

#ifdef ESP32
  #
include <WiFi.h>
#
endif
#
ifdef ESP8266
  #
include <ESP8266WiFi.h>
#
endif

void setup() {
  
WiFi.mode(WIFI_STA);
  
Serial.begin(115200);
  
delay(2000);
  
Serial.println();
}

void loop() {
  
Serial.print("Mac Adress:");
  
Serial.println(WiFi.macAddress());
  
delay(5000);
}

 

Je kunt de code krijgen hier (macAdres.ino) downloaden.

 

Nadat de programma's op de microcontroller zijn geladen, wordt nu het bijbehorende MAC-adres op de seriële monitor weergegeven (baudrate: 115200). Schrijf deze op voor het volgende programma.

 

2 codecontrollers

De joystickmodule heeft 6 individuele knoppen en een joystick met twee assen en een geïntegreerde knop.

Om het project zo eenvoudig mogelijk te houden, worden alleen de bewegingsrichting of de ingedrukte knoppen als volgt als string verzonden:

Joystick omhoog: CMD_FWD

Joystick omlaag: CMD_BWD

Joystick naar rechts: CMD_RGT

Joystick naar links: CMD_LFT

 

Knop A: BTN_A

Knop B: BTN_B

enz...

 

Om ervoor te zorgen dat een nieuw commando pas kan worden verzonden als het vorige is uitgevoerd, wordt door de ontvanger een ontvangstbevestiging verzonden. Pas als deze is ontvangen kan een nieuw commando worden verzonden.
Om ervoor te zorgen dat de communicatie bij een fout niet volledig wordt geblokkeerd, is feedback pas nodig na een succesvolle gegevensoverdracht naar de ontvanger. Bovendien wordt de status na 10 seconden automatisch gereset als er geen bevestiging is verzonden.

 

Code:
Om de duidelijkheid te behouden worden hier ter toelichting slechts fragmenten weergegeven. De volledige code kan aan het einde worden gedownload.

#define X 34
#
define Y 35

#
define A 26
#
define B 25
#
define C 17
#
define D 16
#
define E 27
#
define F 14

uint8_t receiverAddress[] = {0xA40xCF0x120xDC0xCF0x3A};

int calibY, calibX;
bool status = true;
long sentTime;

In het begin worden de GPIO-pinnen van de betreffende knop-/joystick-assen gedefinieerd, zodat ze later in het programma gemakkelijker en duidelijker kunnen worden gebruikt.
Vervolgens wordt het MAC-adres van de ontvanger gedefinieerd; dit moet in het hexadecimale formaat zijn, weergegeven met 0x als voorvoegsel:
A4:CF:... -> 0xA4, 0xCF,...

De volgende variabelen worden gebruikt voor kalibratie en controle om de opdrachten alleen te verzenden als de vorige al is uitgevoerd.

void onDataRecv(const esp_now_recv_info_t *info, const uint8_t *data, int data_len) {
  
char dataTemp[data_len];
  memcpy(dataTemp, data, data_len);
//Copy data bytes in char Array
  
Serial.println(dataTemp);

  
if(String(dataTemp).indexOf("RDY") >= 0) {//data contains RDY
    
Serial.println("RST");
    status = true;
  }
}

void onDataSent(const wifi_tx_info_t *tx_info, esp_now_send_status_t sendStatus)
{
    
Serial.print("Sendestatus: ");
    
Serial.println(sendStatus == ESP_NOW_SEND_SUCCESS ? "Success" : "Error");
    
if(sendStatus == ESP_NOW_SEND_SUCCESS) {
      status = false; 
//marking sent
      sentTime = 
millis(); //store time for limitation
    }
}

Deze twee methoden zijn de terugbelmethoden voor het ontvangen en verzenden via ESPNOW.

De gegevens ontvangen van de ontvangstfunctie worden eerst opgeslagen in a verkoold Array gekopieerd om vervolgens de inhoud van het trefwoord te controleren. Als deze wordt ontvangen, wordt de status hersteld waar ingesteld en er kunnen opnieuw opdrachten worden verzonden.

De send callback-functie controleert de status van de verzending en stelt de statusvariabele in false.false, zodat er niet direct daarna opnieuw een commando wordt verzonden. Bovendien wordt de huidige programmalooptijd met de functie millis() gebufferd, omdat de status na 10 seconden moet worden gereset.

 

In setup() worden alleen de configuratieopdrachten van de ESPNOW-bibliotheek aangeroepen, gevolgd door de kalibratie van de joystickassen en de GPIO-configuratie.

In loop() worden de waarden van de joystickassen gemeten en wordt de status na 10 seconden gereset.

De volgende logica evalueert de positie van de joystickassen:

if(status) {
    
if(valX < -50 || valY < -50 || valX > 50 || valY > 50) {
      
Serial.println("trig");
      
if(abs(valX) > abs(valY)) {
        
if(valX < 0) {
          
Serial.println("LEFT");
          
String msg = "CMD_LFT";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
        
else {
          
Serial.println("Right");
          
String msg = "CMD_RGT";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
      }
      
else {
        
if(valY < 0) {
          
Serial.println("BWD");
          
String msg = "CMD_BWD";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
        
else {
          
Serial.println("FWD");
          
String msg = "CMD_FWD";
          esp_now_send(receiverAddress, (uint8_t *)msg.c_str(), msg.length());
        }
      }
    }

Eerst wordt gecontroleerd of de waarden van de assen een grenswaarde van 50 overschrijden. Dit is nodig omdat zowel de potentiometers waarmee de positie van de assen wordt uitgelezen als de analoog-digitaalomzetter (ADC) minimaal rond de nulwaarde bewegen (zogenaamde drift), zelfs in de nulpositie.

Als een as boven de drempelwaarde ligt, worden de waarden van de grootte van de twee assen met elkaar vergeleken. Op deze manier kan de as worden bepaald die het meest is verplaatst en dus indicatief is.

Na het selecteren van de as hoeft u alleen maar te controleren of de waarde positief of negatief is om de exacte richtingsinstructie te geven ESPNOW te kunnen sturen.

 

Je kunt het volledige programma zien hier (Controller.ino) Download en laad het op de ESP32 door het juiste bord en de juiste poort te selecteren.

3 coderobots

De basisstructuur en in het bijzonder de ESPNOW Callback-methoden zijn vrijwel gelijk aan het vorige controllerprogramma.
Het belangrijkste verschil hier is dat bij de ontvangst-callback-methode de gegevens niet rechtstreeks worden vergeleken, maar in een string worden opgeslagen

cmd = String(dataTemp);

en vervolgens geëvalueerd in lus().

 

In setup() worden ook de servomotoren geïnitialiseerd en op de nulpositie gezet.

 

De evaluatie volgt dan in de lus() cmd Snaren:

if(cmd.length() > 0) {
    
if(cmd.indexOf("CMD_FWD") >= 0) {
      
Serial.println("FWD");
      forward();
    }
    
else if(cmd.indexOf("CMD_BWD") >= 0) {
      
Serial.println("BWD");
      back();
    }
    
else if(cmd.indexOf("CMD_RGT") >= 0) {
      
Serial.println("RGT");
      rightmove();
    }
    
else if(cmd.indexOf("CMD_LFT") >= 0) {
      
Serial.println("LFT");
      leftmove();
    }

    
else if(cmd.indexOf("BTN_A") >= 0) {
      
Serial.println("A");
      dance1();
    }
    
else if(cmd.indexOf("BTN_B") >= 0) {
      
Serial.println("B");
      dance2();
    }
    
else if(cmd.indexOf("BTN_C") >= 0) {
      
Serial.println("C");
      hello();
    }
    
else if(cmd.indexOf("BTN_D") >= 0) {
      
Serial.println("D");
      pushup();
    }
    
else if(cmd.indexOf("BTN_E") >= 0) {
      
Serial.println("D");
      turnright();
    }
    
else if(cmd.indexOf("BTN_F") >= 0) {
      
Serial.println("D");
      turnleft();
    }
   

    cmd = 
"";
    
const char* ack = "RDY";
    esp_now_send(senderAddress, (uint8_t*)ack, strlen(ack));
    
Serial.println("ACK gesendet");
  }

Als de lengte van de string groter is dan 0, betekent dit dat er een nieuw commando in de string is geschreven. Vervolgens wordt de inhoud opnieuw vergeleken met het betreffende commando en wordt de bijbehorende functie van de robot uitgevoerd.

Na de evaluatie wordt de bevestiging teruggestuurd naar de controller.

 

In het bijzonder kunnen de functies van de 6 knoppen aan alle functies van de robot worden toegewezen.

 

De bewegingsmethoden van de bionische robot staan in een apart bestand van de laatste robotles. Je kunt dit doen hier (Commands.h) Download het en kopieer het vervolgens naar de projectmap.

 

Je kunt het volledige programma zien hier (Spider.ino) Download en laad het op de ESP8266 door het juiste bord en de juiste poort te selecteren. Vergeet niet het hierboven genoemde robotbewegingsbestand naar de map te kopiëren

 

Conclusie

In deze blogpost werden het joystickschild en een ESP32 D1 R32 een volledig functionele controller voor de Bionische spin gebouwd, die via WiFi met ESPNOW commando’s naar de robot kan sturen.

Het project biedt ook veel mogelijkheden voor een eigen herontwerp. Zo kunnen met de afzonderlijke knoppen andere commando's worden uitgevoerd, maar kunnen ook geprogrammeerde bewegingspatronen met een druk op de knop worden uitgevoerd.

Veel plezier met het repliceren :)

Esp32Esp8266Projekte für anfänger

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery