Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

Sony Spresense packt erweiterte IoT-Funktionen auf eine winzige Platine

Main30_ab5a42ce339330e5d51be4846d983a9d3050ea84.jpg

Das kompakte Kraftpaket umfasst eine Kamera, GNSS und reichlich GPIO- und Arduino-Unterstützung.

Das Sprichwort besagt, dass man schnell, günstig oder gut haben kann — allerdings nur zwei davon. Die Sony Spresense kombiniert jedoch einen leistungsstarken, energiesparenden Multi-Core-Prozessor mit 8-MB-Flash, Kameraschnittstelle, GNSS und ausreichend E/A und kostet wenig mehr, als Sie allein für eine GNSS-Entwicklungsplatine bezahlen würden. Nicht nur das, sondern sie verfügt auch über volle Unterstützung für die Verwendung der Arduino-IDE oder alternativ ein SDK, das auf einer GNU-Toolchain aufbaut und ein aufNuttXRTOS basierendes Entwickler-Framework enthält.

Packaging_745c4442c8dd0cb2f49d11df025ce726bf2994da.jpg

In diesem Beitrag werfen wir einen Blick auf die Spresense-Haupt-, Erweiterungs- und Kameraplatinen, bevor wir mit einigen Beispielen fortfahren.

Sony CXD5602 als Herzstück

MainBoard_0c9a4c49030360074ef690fbe8d014c773d1d2eb.jpg

Die Spresense-Hauptplatine (178-3376) ist auf dem CXD6502 Mikrocontroller von Sony aufgebaut, der eine Vielzahl von Funktionen in einem IC-Gehäuse mit einer Größe von nur 6,5 x 6,5 mm integrieren kann.

MainBoardSignals_c9dfa2b619f40da7b42cc36fb08d1cc6281ba38c.jpg

Die MCU ist in FD-SOI-Technologie mit geringer Leistungsaufnahme implementiert, verfügt über eine Auswahl an Schlafmodi und ist in mehrere Leistungsdomänen unterteilt. Sie ist daher optimal für tief eingebettete IoT-Anwendungen mit geringem Energiebedarf geeignet.

MCU_BlockDiagram_dc252feacf2d0c598eae6006864df2b0937560ea.jpg

Die Anwendungsdomäne CX5602 wird von sechs ARM-Cortex-M4-Prozessoren mit 1,5 MB SRAM betrieben, wobei ein siebter den GNSS-Empfänger-DSP übernimmt. Der achte und letzte Kern ist ein Cortex-M0, der als System- und E/A-Prozessor konfiguriert ist. Weitere wichtige Funktionen:

  • Bildverarbeitungsdomäne mit Unterstützung verschiedener Formate und Erfassungssteuerung
  • Sensordomäne mit Dezimierung und digitaler Filterung sowie DMA-Controller und Schnittstellen mit:
    • I2C
    • SPI
    • ADC
    • PWM
  • Speicher/Konnektivität einschließlich eMMC und USB
  • Echtzeituhr (RTC)

Die Spresense-Hauptplatine hat darüber hinaus einen 8-MB-Flash, eine GNSS-Antenne, Micro-USB- und Kameraanschlüsse, LEDs und Tasten sowie einen High-Density-Steckverbinder für die Verbindung mit der Erweiterungsplatine oder einer benutzerdefinierten Platine.

Zusätzlich zu den oben genannten Funktionen verfügt die Hauptplatine auch über einen Sony CXD5247GF mit Energieverwaltung und einem Audio-Block. Letzterer bietet einen analogen 4-Kanal-Mikrofonverstärker mit programmierbarer Verstärkung und ADC sowie einen Klasse-D-Audio-Ausgangsverstärker für 8-Ohm-Lasten.

Arduino-Formfaktor

ExtensionBoardSignals1_a9e35adc53810083cf11e1483a6aed5dad43ca5b.jpg

So schön wie es ist, ein so kompaktes Modul zu haben, so ist es doch gut, in den frühen Stadien der Prototypenerstellung, wenn es um die Integration kundenspezifischer Hardware geht, etwas Größeres zu haben, mit vielleicht mehr E/As und, wenn möglich, Pegelverlagerungen und modularer Erweiterung.

ExpansionBoard1_55b37c2d328079117eacfbaf091953810cad10ea.jpg

Diese und weitere Funktionen werden von der Spresense-Erweiterungsplatine (178-3377) bereitgestellt, die das Modul in einen Arduino-Uno-Formfaktor mit Shield-Stiftleisten, 3,5-mm-Buchse, Micro-SD, zusätzlichem USB-Anschluss und einer Mikrofonstiftleiste verwandelt.

5-Megapixel-Kamera

Camera_2a58ebcf18af33ac30cfd3158c4ec31920d403f6.jpg

Die Kameraplatine (182-5720) kann über ein kurzes Flachkabel direkt mit der Hauptplatine verbunden werden und fügt eine 5-Megapixel-Kamera mit einer Empfindlichkeit von 40–800 ISO hinzu. Mit verschiedenen Belichtungs- und Fokussteuerungsmodi sowie Verschlusszeitenbereichen und Voreinstellungen für die Motivauswahl. HD-Motion-Format wird mit bis zu 30 Bildern/s bei einer Auflösung von 1080p und 60 Bildern/s bei 720p unterstützt.

Wie programmieren wir also die Spresense mit dieser Vielfalt an verfügbaren Hardware-Funktionen?

Arduino-IDE-Unterstützung

SSS_BoardsManager_d21da66a01d8a8552dd3e51e0a98c9054eb8d79e.jpg

Der einfachste Einstieg, wenn Sie kein erfahrener Embedded-Entwickler sind, ist die Nutzung der Arduino-Plattformunterstützung. Die Inbetriebnahme ist einfach und umfasst:

  1. Die Installation der Arduino-IDE (sofern noch nicht erfolgt)
  2. Hinzufügen einer neuen Boards-Manager-URL
  3. Suchen und Installieren der Unterstützung für Spresense-Platinen
  4. Aktualisieren des Spresense-Bootloaders

Weitere Einzelheiten finden Sie in der offiziellen Dokumentation.

SSS_LED_Test_87f08a7e3ec08499632ca81bd78c1d2b07d9c234.jpg

Der Sketch zur Überprüfung der Installationsverwendung verwendet ... richtig geraten, LEDs! Hier gibt es keine Überraschungen und nach dem Kompilieren und Hochladen leuchten die vier LEDs auf der Hauptplatine nacheinander auf.

Es ist gut zu wissen, dass die IDE, die Platinenunterstützung und die Hardware so funktionieren, wie es sein sollte. Es gibt jedoch viel spannendere Dinge, die wir tun können, als einfach nur einige LEDs blinken zu lassen. Sehen wir uns also die wichtigsten Teile aus dem bereitgestellten Kamerabeispiel an.

#include <SDHCI.h>
#include <stdio.h>  /* for sprintf */
#include <Camera.h>

SDClass  theSD;
int take_picture_count = 0;

void CamCB(CamImage img)
{

  /* Check the img instance is available or not. */

  if (img.isAvailable())
    {

      /* If you want RGB565 data, convert image data format to RGB565 */

      img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565);

      /* You can use image data directly by using getImgSize() and getImgBuff().
       * for displaying image to a display, etc. */
}

void setup()
{

  /* begin() without parameters means that
   * number of buffers = 1, 30FPS, QVGA, YUV 4:2:2 format */

  theCamera.begin();

  /* Start video stream.
   * If received video stream data from camera device,
   *  camera library call CamCB.
   */

  theCamera.startStreaming(true, CamCB);

  /* Auto white balance configuration */

  theCamera.setAutoWhiteBalanceMode(CAM_WHITE_BALANCE_DAYLIGHT);

  /* Set parameters about still picture.
   * In the following case, QUADVGA and JPEG.
   */

  theCamera.setStillPictureImageFormat(
     CAM_IMGSIZE_QUADVGA_H,
     CAM_IMGSIZE_QUADVGA_V,
     CAM_IMAGE_PIX_FMT_JPG);
}

/**
 * @brief Take picture with format JPEG per second
 */

void loop()
{
  sleep(1); /* wait for one second to take still picture. */

  /* This sample code can take 100 pictures in every one second from starting. */

  if (take_picture_count < 100)
    {

      /* Take still picture.
      * Unlike video stream(startStreaming) , this API wait to receive image data
      *  from camera device.
      */
  
      CamImage img = theCamera.takePicture();

      /* Check availability of the img instance. */
      /* If any error was occured, the img is not available. */

      if (img.isAvailable())
        {
          /* Create file name */
    
          char filename[16] = {0};
          sprintf(filename, "PICT%03d.JPG", take_picture_count);

          /* Save to SD card as the finename */
    
          File myFile = theSD.open(filename, FILE_WRITE);
          myFile.write(img.getImgBuff(), img.getImgSize());
          myFile.close();
        }

      take_picture_count++;
    }
}

Hier wurde das Debugging für den seriellen Anschluss entfernt, und es könnte nicht einfacher sein. Wir integrieren Bibliotheken für SD-Karten- und Kamera-Unterstützung, definieren eine Funktion, um zu prüfen, ob Bilddaten verfügbar sind, und konvertieren sie in RGB565. Anschließend richten wir einige grundlegende Parameter ein und beginnen mit der Aufnahme von Bildern.

CameraTest_9ce2400e11d79922891ec87c66f0c17f41325d26.jpg

Mit den Standardeinstellungen sind die Ergebnisse überhaupt nicht schlecht und können wahrscheinlich durch die Konfiguration des Weißabgleichs für fluoreszierende Innenbeleuchtung verbessert werden.

Weitere Arduino-Beispiele:

  • Audioaufnahme und -wiedergabe sowie MP3-Kodierung und -Dekodierung
  • Handschriftliche Zahlenerkennung über ein tiefes neuronales Netz (DNN)
  • GNSS-Tracking
  • Servo-Motorsteuerung

Spresense-SDK

SSS_SDK_9d9e469c4a92754e74c1d1851aede96136898d81.jpg

Ein umfassendes SDK ist ebenfalls verfügbar, was vor allem für erfahrene Embedded-Entwickler und für Entwickler mit komplexeren Anwendungsfällen interessanter ist. Die Inbetriebnahme auf Ubuntu Linux ist ganz einfach, wenn Sie über das Paketverwaltungssystem eine Toolchain von ARM installieren, ein Paket von NuttX erstellen und installieren und dann das Spresense-SDK selbst installieren. Das dauerte buchstäblich nur Minuten und ausführliche Informationen finden Sie in der offiziellen Dokumentation.

SSS_SDK_make_53ed3e9b189e134abc4a6fd0191fdad3f5f83f16.jpg

Nachdem das SDK installiert ist, haben wir ein paar Setup-Befehle und zwei Make-Befehle später ein NuttX-Image mit dem klassischen Beispiel „Hello, World“ erstellt. Es ist noch ein Befehl erforderlich, um dies auf die Platine zu übertragen. Anschließend können wir einen Terminalemulator starten, in diesem Fall Minicom, um eine Verbindung herzustellen.

SSS_SDK_hello_9306513d891f66bf3c244410581ecd279ff74388.jpg

Sobald die Platine bootet, wechseln wir in die NuttX-Shell und können von hier aus „hello“ eingeben, um unser Beispiel auszuführen.

SSS_SDK_shell_43d58b7d4ecd13d2f6a8f563d7d9704f40775c22.jpg

Wir können auch „help“ eingeben, um eine Liste der Befehle zu erhalten und ls und ps usw. ausführen, um Dateien und Prozesse aufzulisten. Ja, ein wirklich winziges Echtzeit-Betriebssystem läuft auf unserer Platine und es verfügt über eine interaktive Shell!

Beispiele für Spresense-SDK:

  • Decimator (Daten-Downsampling zur Reduzierung des Verarbeitungsaufwands) mit Unterstützung für Gyroskop, Beschleunigungsmesser und verschiedene Magnetometer
  • Geofence (z. B. das Halten von Drohnen innerhalb eines bestimmten Bereichs) mithilfe des integrierten GNSS
  • HTPP GET (z. B. API-Zugriff) über LTE über ein angeschlossenes Modem
  • ADC (analoge Sensoren, Audio)
  • PWM (Motor- und Lüfterdrehzahlsteuerung usw.)

Abschließende Worte

Die Spresense-Hardware ist besonders beeindruckend, und hier haben wir gerade mal ein wenig an der Oberfläche der Möglichkeiten gekratzt. Mit 6 ARM-Kernen, die mit bis zu 156 MHz arbeiten, ist die MCU in der Lage, einige ziemlich anspruchsvolle Anwendungen auszuführen. Die SDK-Unterstützung für Nachrichtenübermittlung und der gemeinsame Speicher sollte die Entwicklung dieser Kerne zur Nutzung der Hardware erheblich vereinfachen.

Neben der Rohleistung der MCU-Anwendungsdomäne profitiert die Spresense auch von hardwarebasierter Dezimierung und Filterung von Sensordaten sowie einem dedizierten System und E/A-Prozessor. Wenn all das mit einer Vielzahl von Schnittstellen und der NuttX-Echtzeit-Unterstützung kombiniert wird, ergibt dies eine leistungsstarke Kombination — die auch sehr gut für Anwendungen mit niedrigem Energieverbrauch geeignet ist und sich somit perfekt für fortgeschrittene IoT-Anwendungsfälle eignet.

Kurz gesagt, die Spresense ist ein vollgepacktes Kraftpaket von Platine mit hervorragenden Entwicklertools und hochwertiger Dokumentation, die einige ziemlich aufregende Anwendungen ermöglichen sollte.

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin