Dies ein Artikel der Animatronic WorkBench Dokumentation
In komplexeren animatronischen Projekten kann es attraktiv sein, benutzerdefinierten Code zu schreiben, statt das Verhalten direkt über die Animatronic WorkBench (AWB) zu konfigurieren. Dies kann beispielsweise das Timeline-unabhängige Steuern von Servos oder das Implementieren von übergreifender Logik sein.
Dieser Code wird in die Datei CustomCode\CustomCode.cpp
geschrieben, die sich im Ordner src
des Projekts befindet.
Die zugehörige Header-Datei ist CustomCode.h
. Diese Dateien können nach dem Export das PlattformID Projekts in Visual Studio Code bearbeitet werden.
Eigener Code sollte immer zwischen den Kommentaren cc-start
und cc-end
geschrieben werden, damit er bei kommenden Updated nicht überschrieben wird. Die AWB wird diese Dateien bei Bedarf aktualisieren, aber der benutzerdefinierte Code bleibt erhalten.
Für den Fall, dass dabei etwas schiefgeht, wird im Projektordner im Unterordner custom_code_backup
bei jedem Export automatisch eine Sicherungskopie der Dateien erstellt.
Custom Code Beispiel für das Projekt "Animatronic Nix"
Hier wird im Setup der Schwanz-Servo gesucht und in der Variable _tailServo
gespeichert.
Im Loop wird dann alle 4 Sekunden eine zufällige Position zwischen dem Minimum und Maximum des Servos gesetzt. Damit wird der Schwanz des Animatronic Nix unabhängig von Timelines animiert.
#include <Arduino.h> #include "CustomCode.h" #include "../AwbDataImport/ProjectData.h" #include <Actuators/NeopixelManager.h> /* Enter your custom code in this cpp file and the corresponding header file. Only write code beween the cc-start and cc-end comments, otherwise it will be overwritten and lost. */ /* cc-start-include - insert your include code here before the end-protected comment: */ /* cc-end-include - insert your include code here before the end-protected comment: */ void CustomCode::setup() { /* cc-start-setup - insert your setup code here before the end-setup comment: */ // take the servo with Id 10 as tail servo for (int i = 0; i < this->_projectData->stsServos->size(); i++) { // get a pointer to the current servo StsScsServo *servo = &this->_projectData->stsServos->at(i); if (servo->title == "Tail") { _tailServo = servo; break; } } if (_tailServo == nullptr) { _errorOccured("No tail servo found with Id 10. Please check your project data."); } /* cc-end-setup */ } void CustomCode::loop(String actualTimelineName, int actualTimelineStateId) { /* cc-start-loop - insert your loop code here before the end-loop comment: */ auto _msTillLastTailUpdate = millis() - _lastTailUpdate; if (_msTillLastTailUpdate > 4000) { auto max = _tailServo->maxValue; auto min = _tailServo->minValue; // get a random value between min and max auto randomValue = random(min, max); // set the target value of the tail servo to the random value _stSerialServoManager->writePosition(_tailServo->channel, randomValue); _lastTailUpdate = millis(); } /* cc-end-loop */ } /* cc-start-functions - insert your functions here before the end-functions comment: */ /* cc-end-functions */
Weitere Dateien / Klassen im Ordner CustomCode
Das Projekt "PIP Droid" ist ein komplexeres Beispiel für die Verwendung von benutzerdefiniertem Code in der Animatronic WorkBench. Dort werden die Touch-Buttons und die Neopixel-Steuerung des PIP Droid verwendet, um verschiedene Aktionen auszuführen. Der Code implementiert eine einfache Logik, um den PIP Droid zu steuern, einschließlich der Reaktion auf Tastenanschläge und das Abspielen von Soundeffekten.
Besonders an diesem Projekt "PIP Droid" ist, dass weitere Custom Code Dateien eingebunden werden, die sich im Ordner CustomCode
befinden.
Diese Dateien können angelegt werden, um weitere Funktionen zu implementieren.
Dadurch kann der Code modular erweitert werden, ohne dass die Hauptdatei CustomCode.cpp
zu unübersichtlich wird.
In diesem Projekt sind zusätzlich die Dateien folgenden C++-Klassen als Dateien im Ordner CustomCode
enthalten: