Beim MAX78000FTHR von Maxim Integrated handelt es sich um ein kleines, auf der MCU MAX78000 basierendes Board. Diese MCU wurde speziell für KI-Anwendungen optimiert. Künstlichen Intelligenz (KI) ab, die am Rande des Systems laufen. Die KI läuft dann gewissermaßen vor Ort, etwa als Peripherie-Modul eines anderen Systems, nicht aber irgendwo weit weg in einem Rechenzentrum oder so. Mit dieser Lösung können Sie also KI auch in Ihrem Haus oder in Ihrem Auto oder sogar in einem mobilen Gerät realisieren. Eine solche KI-Anwendung erledigt ihre Arbeit genau dort quasi „nebenbei“, ohne die aufwändigen Berechnungen an eine Cloud zu vergeben. Dazu benötigt die KI-Einheit viel Rechenleistung, weshalb ein MAX78000 eine ARM Cortex-M4-MCU mit einer FPU, einem CNN-Beschleuniger (Convolutional Neural Network) und einen RISC-V-Kern in einem einzigen Chip kombiniert.

Außerdem sollen solche Zusatzeinheiten nicht viel Energie verbrauchen, weshalb der MAX78000 für den Ultra-Low-Power-Betrieb konzipiert wurde. Da ein MAX78000 energieeffizient und dennoch leistungsfähig ist, kann er laut Hersteller KI-Inferenzen (d.h. die Beantwortung von Fragen wie „Wer ist auf diesem Bild?“ oder „Welches Geräusch war das?") mit weniger als einem Hundertstel der Energie anderer Embedded-Lösungen durchführen.

Ein Convolutional Neural Network

Ein CNN ist eine spezielle Art von neuronalem Netzwerk, das sich an biologische Prozesse anlehnt. Eine Faltung ist eine mathematische Operation, die häufig in der Bild- und Signalverarbeitung anzutreffen ist, und man kann sie sich als eine Art (angepasste) Filterung vorstellen. Ein CNN ist ein Satz von Filtern, die das Eingangssignal auf bestimmte Merkmale hin untersuchen. CNNs sind besonders in der Ton- und Bildverarbeitung nützlich. Daher ist es nicht verwunderlich, dass im MAX78000 auch ein Kamera-Interface und I2S für Audio-Streaming integriert sind. Sein CNN ist für 1D- (Ton) und 2D-Verarbeitung (Bild und Video) optimiert.

Neben den bereits erwähnten Modulen und Peripheriegeräten enthält ein MAX78000 die meisten gängigen Peripheriefunktionen, die typischerweise in einem Mikrocontroller zu finden sind. Hinzu kommen einige spezielle Funktionen, die mit IoT-Sicherheit zu tun haben, wie einen Zufallszahlengenerator (RNG) und eine AES-Verschlüsselungs-Engine (Bild 1).
 
Peripherals and processor cores inside the MAX78000
Bild 1: Das vereinfachte Blockdiagramm zeigt Peripherie und Prozessorkerne des MAX78000.

Was ist an Board?

Der MAX78000FTHR (Bild 2) ist ein kleines Modul mit nur 66 × 23 mm Kantenlänge. Bestückt ist es mit einem MAX78000, einer winzigen VGA-Kamera, einem digitalen Mikrofon, Stereo-Audio-I/O, einem microSD-Kartenslot, 1 MB QSPI-RAM, einem SWD-Debugger/Programmer-Port via USB und einem LiPo-Lader. Außerdem gibt es zwei frei verwendbare RGB-LEDs und zwei Taster sowie Erweiterungsanschlüsse, die mit dem Feather-Formfaktor von Adafruit kompatibel sind. Ein separater JTAG-Anschluss ist für die Programmierung und das Debugging des RISC-V-Kerns gedacht.

The MAX78000FTHR board
Bild 2: Das MAX78000FTHR verfügt über zwei Erweiterungsanschlüsse. Die winzige Kamera befindet sich rechts neben den GPIO-Pins P0_5 sowie P0_6 und der microSD-Kartenanschluss befindet sich auf der Rückseite des Boards.
Wenn das Board an einen Computer angeschlossen ist, wird es als Composite-USB-Gerät erkannt, das einen DAP-Link plus CMSIS DAP WebUSB, einen Massenspeicher und eine serielle Schnittstelle umfasst. Auf der Karte ist eine Demo für Audio Keyword Spotting (KWS) vorinstalliert. Wenn Sie ein serielles Terminal starten und es mit der seriellen Schnittstelle des Boards verbinden, erhalten Sie Anweisungen zur Verwendung der Demo.

Was kann man damit machen?

Standardmäßig erkennt die Demo die englischen Wörter „Zero“ bis „Nine“, „Go“, „Stop“, „Left“, „Right“, „Up“, „Down“, „On“ und „Off“. Wenn es das Wort „Go“ erkennt, geht das Demo in den Zahlenerkennungsmodus über, in dem es eine LED so oft blinken lässt, wie das vom Sprecher befohlen wird. Mit anderen Worten: Wenn Sie „Six“ sagen, blinkt die LED sechs Mal. Mit „Stop“ kehrt es in den normalen Modus zurück. Der serielle Monitor gibt Informationen darüber, wie sicher sich die Demo ist.

Um über die vorinstallierte Demo-Anwendung hinauszugehen (z.B. um eine Systemsteuerung zu implementieren, wie das Umschalten eines GPIOs oder das Übertragen von Daten über eine andere Schnittstelle), ist eine Entwicklungsumgebung erforderlich. Hierfür hat Maxim das Micros SDK vorbereitet, das Sie kostenlos von dieser Website herunterladen können.

Das SDK besteht aus einer Eclipse-basierten Toolchain, die auch mit anderen ARM-basierten MCUs von Maxim verwendet werden kann. Es enthält die Eclipse IDE, MinGW, GCC-Toolchains für ARM- und RISC-V-Prozessoren, OpenOCD und einige andere Utilities. Darüber hinaus enthält das SDK Bibliotheken, Beispiele und Dokumentation. Mit anderen Worten: Es ist alles dabei, was Sie brauchen, um unter Windows loszulegen.

Los geht's

Starten Sie Eclipse MaximSDK und wählen oder definieren Sie einen Arbeitsbereich. Stellen Sie sicher, dass der Pfad keine Leerzeichen enthält. Wenn dies der Fall ist, kann Eclipse entweder keine Projekte kompilieren oder Ihr Workspace befindet sich nicht dort, wo er sein sollte.
 
Wenn sich die IDE öffnet, sehen Sie einen Begrüungsbildschirm, den Sie ignorieren und schließen können. Sie können nun entweder ein neues Projekt erstellen oder ein bestehendes Projekt importieren.
 
Um ein neues Projekt zu erstellen, erweitern Sie die Zeile C/C++ und wählen Sie den Maxim Microcontrollers Wizard, klicken Sie auf Next und geben Sie einen Namen für das Projekt ein. Klicken Sie erneut auf Next und stellen Sie in dem sich öffnenden Dialog den Chip type auf MAX78000, den Board typeauf FTHR_RevA und den Adapter type auf CMSIS-DAP ein. Wählen Sie als Beispieltyp etwas, das dem, was Sie vorhaben, am ähnlichsten ist, und klicken Sie auf Finish, um das Projekt zu erstellen (Bild 3).

A wizzard for creating projects
Bild 3: Ein Assistent hilft bei der Erstellung neuer Projekte. Allerdings müssen Sie die richtigen Werte eingeben.

Das richtige Board wählen

Nun müssen Sie zunächst das Projekt korrigieren, denn obwohl Sie das Board MAX78000FTHR ausgewählt haben, wird sonst das Projekt für das MAX78000EVKIT erstellt. Dies sollten Sie wirklich beachten, da fast alles im SDK auf dieses Kit voreingestellt ist. Es gibt zwei Möglichkeiten zur Auswahl des richtigen Boards (Sie können sogar beides machen, aber es wird dadurch nicht besser):
 

  • Im Abschnitt Specify the board used des Makefiles das Board FTHR_RevA und EvKit_V1 auskommentieren (Bild 4). Anschließend die Datei speichern.
 
The makefile defaults to the MAX78000EVKIT and must be edited.
Bild 4: Das Makefile ist auf MAX78000EVKIT voreingestellt und muss bearbeitet werden, bevor es mit dem MAX78000FTHR verwendet werden kann.
  • Editieren Sie den Build-Befehl, erreichbar über den Properties-Dialog des Projekts im Abschnitt C/C++ Build. Fügen Sie BOARD=FTHR_RevA in das Feld für den Build-Befehl ein (Bild 5) und klicken Sie auf die Schaltfläche Apply and Close.
     
    Build command
    Bild 5: Wenn Sie das Makefile lieber unangetastet lassen wollen, fügen Sie die MAX78000FTHR-Boarddefinition zum Build-Befehl des Projekts hinzu.

Zur Sicherheit sollten Sie das Projekt bereinigen, bevor Sie fortfahren. Clean ist über das Projektmenü oder per rechtm Mausklick auf das Projekt im Fenster Project Explorer verfügbar.
 
Erstellen Sie nun das Projekt und führen Sie es aus oder testen Sie es. Wenn Sie auf run (der grüne Punkt mit dem weißen Dreieck) oder debug (den kleine Bug) klicken, wird möglicherweise ein Fenster mit dem Titel Create, manage and run configurations angezeigt. In diesem Fall erweitern Sie die Zeile GDB OpenOCD Debugging und wählen Sie Ihr Projekt aus, bevor Sie fortfahren.
 
Wenn Sie im Debug-Modus gestartet haben, wird das Programm am Anfang von main angehalten. Verwenden Sie die im Menü Run verfügbaren Befehle, um das Programm zu durchlaufen und Variablen zu überprüfen.
 

Importieren eines Beispiels

Klicken Sie im Menü Datei auf Import... um ein Beispiel zu importieren. Expandieren Sie die erste Zeile General und wählen Sie den Wizard Existing Projects into Workspace. Geben Sie das Stammverzeichnis ein. Für die SDK-Beispiele ist dies MaximSDK\Examples\MAX78000. Daraufhin erhalten Sie eine Liste von Beispielen, aus der Sie die zu importierenden auswählen können. Sie können sogar alle Beispiele importieren, wenn Sie möchten.
 
Um die vorhin begonnene Reise rund um Keywords wieder aufzunehmen, wählen Sie Deselect All und markieren dann kws20_demo. Aktivieren Sie außerdem Copy projects into workspace, da das Beispiel modifiziert werden und das Original erhalten bleiben soll.
 
Es gibt ein paar Projekte, die Dateien benötigen, die sich nicht in ihrem enthaltenen Ordner befinden. Diese Dateien werden nicht kopiert, wenn Sie ein Projekt kopieren, und die Kompilierung schlägt daher fehl. Sie müssen diese Dateien entweder selbst kopieren oder das Makefile bearbeiten, um den Pfad zu diesen Dateien zu reparieren. Das Projekt cats-dogs_demo zum Beispiel benötigt den Ordner Common - also kopieren Sie auch diesen Ordner (anstatt das Originalbeispiel zu verwenden oder noch schlimmer: den Beispielordner zu Ihrem Arbeitsbereich zu machen).
 
Nachdem dem Import des Beispielprojekts ändern Sie dessen Target-Board wie oben beschrieben. Dann kommt ein Build des Beispiels und Sie können es ausprobieren. Wenn alles gut funktioniert, können Sie es modifizieren.
 
Ich habe die KWS-Demo so verändert, dass es den Pin P2.3 high macht, wenn es das Wort „On“ hört und den Pin löscht, wenn es das Wort „Off“ erkennt. Je nach Wort leuchtet die LED entweder grün (Ein) oder rot (Aus). Wenn ein anderes Schlüsselwort erkannt wurde, leuchtet die LED blau, aber der Pin ändert seinen Zustand nicht. Pin P2.4 zeigt die Konfidenz an. Wenn die Inferenzkonfidenz zu niedrig ist (≤95%), geht dieser Pin auf Low.
 
Schließlich habe ich UART2 zum Mix hinzugefügt. Diese serielle Schnittstelle ist auf den Erweiterungs-Header verfügbar und kann so mit einem anderen System verbunden werden, um auf die Daten zu reagieren, die über diese Verbindung eingehen. Alle Keywords, die mit einer Wahrscheinlichkeit von mehr als 95% erkannt werden, werden über diese Verbindung gesendet. Den Schlüsselwörtern „On“ und „Off“  wird ein „Y,“ vorangestellt, die anderen Schlüsselwörter beginnen mit „N,“. Bei geringer Konfidenz beginnt die Zeichenkette mit „?,“.Dieses willkürliche Kodierungsschema können Sie nach Belieben ändern.
 
Sie können mein Projekt von GitHub herunterladen. Dort finden Sie auch eine Pin-toggelnde Version der Katzen/Hunde-Detektor-Demo, die zusätzliche Daten auf UART2 ausgibt.
 

Bei MAX78000FTHR wichtig

Wenn Sie mit dem MAX78000FTHR zu arbeiten wollen, sollten Sie die folgenden Aspekte beachten:
 

  • Der Spannungspegel an den I/O-Ports ist standardmäßig auf 1,8 V eingestellt. Sie können dies pro Pin ändern, indem Sie das Feld vssel der Struktur mxc_gpio_cfg_t ausfüllen, wenn der Pin mit der Funktion MXC_GPIO_Config konfiguriert wird. Für 3,3 V benötigen Sie MXC_GPIO_VSSEL_VDDIOH(Standard ist MXC_GPIO_VSSEL_VDDIO, ohne das „H“ am Ende).
  • Das Problem der Spannungspegel gilt auch für die alternativen Pin-Funktionen wie TX und RX von UART2. Allerdings sind deren Pin-Konfigurationsstrukturen schreibgeschützt, so dass Sie das Feld vssel nicht ändern können. Als Workaround können Sie zuerst die Struktur kopieren und die Kopie modifizieren, um den Pin wie jeden anderen Pin zu (re)konfigurieren. Wenn Sie einen besseren Weg kennen, lassen Sie es mich bitte wissen.
  • Die Funktion MXC_GPIO_OutPut ließ mich den Wert eines Pins nicht setzen, ich musste stattdessen MXC_GPIO_OutSet und MXC_GPIO_OutClr verwenden. Die Ursache scheint der übergebene Pin-Wert zu sein. „0“ funktioniert wie erwartet, aber nicht „1“. Damit es funktioniert, übergeben Sie ihn als „-1“ (minus eins, d.h. 0xffffffff)...
  • Maxim hat Repositories für die MAX78000-Boards und -Tools auf GitHub eingerichtet, wo Sie die neuesten Versionen von allem finden können, einschließlich Tutorials und Beispiele.
  • Das SDK kommt mit MinGW als Alternative zu Eclipse. Wenn Sie also eine Konsole statt einer IDE bevorzugen, sind Sie ebenfalls bestens gerüstet.
  • Auf der winzigen Kamera des MAX78000FTHR befindet sich möglicherweise eine Schutzfolie (Bild 6). Entfernen Sie diese unbedingt, bevor Sie kamerabasierte Anwendungen ausprobieren.
     
    Remove the protective film from the camera module
    Bild 6: Die Bildverarbeitung funktioniert viel besser, wenn die Schutzfolie vom Kameramodul entfernt wurde.

Experimentieren

Nun können Sie mit maschinellem Lernen und künstlicher Intelligenz auf dem MAX78000FTHR-Board experimentieren. In diesem Beitrag wurde nur an der Oberfläche dieses leistungsfähigen Boards gekratzt, und es werden noch einige tiefer gehende Artikel folgen. Sie haben gesehen, wie man die Entwicklungsumgebung einrichtet und einige Beispiele modifiziert, um die vortrainierten KI-Beispiele in eigenen Anwendungen nutzen zu können.
 
Eines der nicht angesprochenen Themen ist das KI-Training. Obwohl es eine zeit- und ressourcenaufwändige Aufgabe ist, muss es durchgeführt werden, wenn Sie möchten, dass die KI-App mit Ihren eigenen Daten arbeitet. Weitere Informationen dazu finden Sie in den Maxim-Repositories auf GitHub.


Übersetzung: Dr. Thomas Scherer


Sind Sie bereit, innovative Lösungen für künstliche Intelligenz (KI) zu entwickeln?
Dann setzen Sie den Ultra-Low-Power-Mikrocontroller MAX78000 von Maxim in einer aufregenden neuen Anwendung ein und nehmen am MAX78000-AI-Design-Wettbewerb (powered by Elektor) teil.
Maxim Integrated MAX78000 AI Design Contest (powered by Elektor)