# Template Interface

# Overzicht

De template hardware interface is gemaakt voor het demonstreren van de werking van Aquastorm. De interface is gemaakt om studenten een zo breed mogelijke kijk te geven in wat mogelijk is met Aquastorm. De template interface kan gebruikt worden voor een enorm grote hoeveelheid verschillende componenten door zijn hoeveelheid IO types, waaronder PWM, UART en meer.

# Belankgrijkste features

  • Compact formaat (83mm x 77mm)
  • Modulair ontwerp voor een grote hoeveelheid toepassingen
  • Ontworpen om gemakkelijk te hergebruiken
  • Gebasseerd op de ESP32
  • Compatible met Arduino, MicroPython en ESP-IDF
  • Vervangbaar DIN-rail bevestigingsmechanisme
  • 1x Programmeerbare LED & 1x Programmeerbare knop
  • 2x Analoge ingang (MAX 3.3V) (beschermd)
  • 1x UART
  • 4x digtale uitgangen (0-3.3V) (waarvan twee met stroom voorziening)
  • Batterij stroomsensor
  • 1x Temperatuurssensor

# Pinout

De template hardware interface is opgebouwd uit twee printplaten. Een hardware interface en een connector interface. De hardware componenten worden aangesloten op de connector interface. De pin definities van de connectoren staan vermeld op de printplaat, zoals te zien is in het figuur hieronder.

Template hardware interface pinout
Template hardware interface pinout

Op dit figuur is ook te zien dat naast de connectoren die toegankelijk zijn er ook een plaats is voor een Adafruit Ultimate GPS module. Deze kan direct worden geïntegreerd op de printplaat. Dit betekend echter wel dat de UART connector dat naar buiten gaat niet te gebruiken is. De GPS module en de UART connectie maakt namelijk gebruik van dezelfde UART lijnen.

Daarnaast bevind zich aan de bovenkant van de printplaat twee analoge ingangen. Deze kunnen een maximaal voltage lezen van 3.3 volt. Het is dan ook niet de bedoeling dat hier een hoger voltage op wordt aangesloten. Mocht dit toch gebeuren, is de module hier tegen beveiligd.

Aan de onderkant van de printplaat bevinden zich twee digitale uitgangen dat gebruikt kan worden voor PWM. Daarnaast hebben deze ook een apparte 5 volt voedingslijn. De gecombineerde uitgangsstroom is gecombineerd niet meer dan 4.5 ampère.

# Schematische tekeningen

Schematic
template-hardware-interface.pdf 273KB

Enclosure
network-interface-template-hardware-interface-enclosure.f3d 6.18MB


# Technische specificaties

Microcontroller ESP32-PICO-D4
USB USB-C Type 2.0
WiFi 802.11 b/g/n (802.11n t/m 150 Mbps)
Bluetooth Bluetooth V4.2 BR/EDR & Bluetooth LE specification
LDO (Low Dropout Regulator) Vin = 5V / Vout = 3.3V
Spanningsregelaars (Switching regulators) 5V / 5A & 3.3V / 5A
Afmetingen 83mm x 77mm
Dikte (exclusief module interface connector) 42.03 mm

# Voorbeelden

In dit voorbeeld wordt er een 180° servo aangestuurd vanaf het netwerk. Dit voorbeeld leert je werken met PWM en ESP32

# Benodigdheden
  • Netwerk interface
  • 180° Servo
  • Voeding van minimaal 5V (maximaal 36V) en 2A
  • ESP-PROG of USB-C kabel (werkt niet op Prototype V1)
  • Arduino IDE (met ESP32 boards geïnstalleerd)
# Programmeren van de firmware
#include "AquaStorm.h"

// Set the serial connection to the hardware interface connector
AquaStorm::HardwareInterface iface(::Serial2);

// Setup the DSIS Protocol
AquaStorm::Platform platform("aquastorm");
AquaStorm::System eindmaas("eindmaas");
AquaStorm::Module io("io");
AquaStorm::Type::Integer btn("button", "user button"); // Add user button (as integer)
AquaStorm::Type::Integer led("led", "status led"); // Add status led (as integer)
DSIS::Data::Range on_off("0", "1"); // Create an on off range for button

//Add Servo Module
AquaStorm::Module servo("servo");
AquaStorm::Type::Integer pwm("pwm", "");
AquaStorm::Type::Integer speedSetPoint("pwm", "", 1500); //create field and add starting value
DSIS::Data::Range servo_range("500", "2500"); // Set servo range



void setup(){
    // Pin setup
    pinMode(34, INPUT); // User button input
    pinMode(2, OUTPUT); // Status led output

    ledcSetup(0, 50, 16); //Setup PWM functionality on ESP32 (channel, frequency(Hz), resolution(bits))
    ledcAttachPin(19, 0); //Attach PWM output(IO19) to the created channel(0)

    // Network interface connection
    Serial.begin(115200);
    iface.begin(115200, SERIAL_8N1, GPIO_NUM_14, GPIO_NUM_27); //Setup Serial Connection

    // Server connection
    iface.setServer(IPAddress(192, 168, 1, 92), 1883); //Setup MQTT Server
    iface.connect(); // Connect to MQTT Broker

    // Setup LED and Button
    io.addOutput(btn);
    io.addInput(led);
    led.type().setRange(on_off);
    btn.type().setRange(on_off);
    eindmaas.addModule(io);

    // Setup Servo
    servo.addInput(speedSetPoint);
    servo.addOutput(pwm);
    speed.type().setRange(servo_range);
    speedSetPoint.type().setRange(servo_range);
    eindmaas.addModule(servo);


    platform.addSystem(eindmaas);
    platform.setUpdateHandler([](std::string &topic, const char *data){
      delay(5);
      return iface.publish(topic.c_str(), (Mosquitto::payload_t) data, 0, 0, true); }
    );

    //This function executes when servo value has changed
    speedSetPoint.onChange([](int setPoint){
      setPulseWidth(0, setPoint); //set PWM channel to incomming value
      pwm = setPoint; // Update the pwm field
      ::Serial.println("Speed changed: " + String(setPoint)); // Print message to user serial (not the network interface serial!)
    });

    //Log message when packet has been received (debug reasons (not neccesary for workign of the module))
    iface.setOnPacket([](const char *topic, const char *data){
        int res = platform.update(topic, (char*)data, 0);
        Serial.println(res);
    });

    platform.init(); //initialize the created platform

    iface.subscribe("aquastorm/eindmaas/modules/servo/0/inputs/speed", 0); // Subscribe to created topic
    iface.subscribe("aquastorm/eindmaas/modules/io/0/inputs/led", 0); // Subscribe to created topic
}

void loop(){
    btn = digitalRead(34); //Update field with current status
    digitalWrite(2, led.get() == 1); //Update led when status is updated
}

void setPulseWidth(int ledChannel, float pulseWidth){
    uint32_t duty = (pulseWidth / 20000.0 * 65535.0);
    ledcWrite(ledChannel, duty);
}

De volledige firmware is te vinden op Gitlab.

servo-example
https://gitlab.projectsource.nl/aquabots/aquastorm/hardware/hardware-interface/firmware/servo-example

nog niet beschikbaar

nog niet beschikbaar

# Installeren van de ESP32 in de Arduino IDE

Om de hardware interface te kunnen programmeren moet eerst de ESP32 microcontrollers worden toegevoegd aan de Arduino IDE. Om dit te doen


# Garantie & Certificaties

Op dit moment is de template hardware module nog maar een prototype en worden alleen nog maar gebruikt voor het test- en onderzoeksdoeleinden. Om deze reden is er geen garantie of certificaties beschikbaar.