dart_periphery

SoC Programmierung mit Dart

dart_periphery
dart_periphery | Dart Package
dart_periphery is a Dart port of the native c-periphery library for Linux Peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO and Serial peripheral I/O).

... war mein erstes größeres Dart-Projekt auf pub.dev, die Portierung der Bibliothek c-periphery nach Dart.

GitHub - vsergeev/c-periphery: A C library for peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) in Linux.
A C library for peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) in Linux. - GitHub - vsergeev/c-periphery: A C library for peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) in Linux.

c-periphery ist eine Linux C-Bibliothek für den userpace zur Ansteuerung der diversen I/O-Schnittstellen: GPIO, LED, PWM, SPI, I2C, MMIO und Serielle.

Die Entstehungsgeschichte dieses Projekts hat ursprünglich mit einer CO2-Ampel für den Raspberry Pi in Java implementiert mit einem SGP30-CO2-Sensor, Leds für die Ampelschaltung und einem 4,2″ e-Paper aus Ausgabegerät begonnen. Den Zweck erfüllte dieses kleine Projekt, aber das Gefühl, dass die Umsetzung vom technischen Standpunkt etwas umständlich war, begleitete mich von Anfang an.

  • die GPIO-Anbindung der Leds für die Ampel wurde mit JNI/wiringpi umgesetzt.
  • der SGP30-Sensor wurde mit der Kombination JNI/Sensirion C-Bibliothek eingebunden.
  • das 4,2″ e-Paper von waveshare wurde per C-Bibliothek des Herstellers per JNI angesteuert.

Gezählte dreimal war der der Einsatz von JNI (Java Native Interface) von Nöten, um die gewünschte Hardware einzubinden.

Jetzt könnte der einer oder andere Leser überhaupt die Frage stellen, warum nicht Python die bevorzugte Sprache für Hardwarebastelein am Raspberry Pi zum Einsatz kam. Diese Entscheidung ist einfach meiner beruflichen Ausrichtung, die eines Java-Entwicklers geschuldet. Für Projekte in meiner Freizeit möchte ich nicht noch eine weitere Programmiersprache bemühen müssen. Meiner bescheidenen Meinung nach können Java und Python als gleichwertige Programmiersprachen betrachtet werden, mit der Einschränkung, dass sicherlich die eine oder andere Aufgabenstellungen von der jeweiligen Programmiersprache einfacher gelöst werden kann.

Das Einbinden von Hardware per C/C++ in die jeweilige Programmiersprache ist in meisten Fällen etwas fummelig, speziell unter JNI per javah automatisch erzeugte C/C++-Header-Dateien sind auf Grund der Überlänge eine mögliche Fehlerquelle.

/*
 * Class:     at_treedb_hardware_RaspberryPiBase
 * Method:    _i2c_readByte
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_at_treedb_hardware_RaspberryPiBase__1i2c_1readByte__I
  (JNIEnv *, jobject, jint);

/*
 * Class:     at_treedb_hardware_RaspberryPiBase
 * Method:    _i2c_readByte
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_at_treedb_hardware_RaspberryPiBase__1i2c_1readByte__II
  (JNIEnv *, jobject, jint, jint);

In der Nachbetrachtung des Projekts wurde ich dann durch längere Rechere auf folgende Projekte aufmerksam: Die am Anfang des Postings erwähnte c-periphery Bibliothek und das Projekt diozero,

diozero/diozero-core/src/main/java/com/diozero/devices at main · mattjlewis/diozero
Java Device I/O library that is portable across Single Board Computers. Tested with Raspberry Pi, Odroid C2, BeagleBone Black, Next Thing CHIP, Asus Tinker Board and Arduinos. Supports GPIO, I2C, S...

ein umfangreiches Java-Projekt, das für etliche Sensoren und Peripheriegeräte wertvolle Implementierungen liefert. Übersichtlicher Code, egal in welcher Programmiersprache, ist einfach Gold wert.

Zeitgleich zu diesem Hardwareprojekt war ich damit beschäftigt meine Flutter-Kenntnisse zu verbessern, und folgendes Projekt, flutter-pi,

GitHub - ardera/flutter-pi: A light-weight Flutter Engine Embedder for Raspberry Pi that runs without X.
A light-weight Flutter Engine Embedder for Raspberry Pi that runs without X. - GitHub - ardera/flutter-pi: A light-weight Flutter Engine Embedder for Raspberry Pi that runs without X.

war mir schon länger bekannt. flutter-pi ermöglicht es auf einem Raspberry Pi eine Flutter-Applikation auszuführen. Die verschienden Handlungstränge liesen in mir die Idee aufkommen die C02-Ampel mit einem moderen Userinterface, Flutter, neu zu implementieren. Was noch fehlte war ein entsprechner Dart-Port von c-periphery und die Portierung des SGP30-Sensor-Java-Codes nach Dart.

import 'package:dart_periphery/dart_periphery.dart';
import 'dart:io';

// https://wiki.seeedstudio.com/Grove-VOC_and_eCO2_Gas_Sensor-SGP30/
// The Grove-VOC and eCO2 Gas Sensor(SGP30) is an air quality detection sensor based on the SGP30 chip.
void main() {
  // Select the right I2C bus number /dev/i2c-?
  // 1 for Raspbery Pi, 0 for NanoPi (Armbian), 2 Banana Pi (Armbian)
  var s = SGP30(I2C(1));
  print('Serial number: ${s.getSerialId()}');
  print(s.getFeatureSetVersion());
  sleep(Duration(milliseconds: 1000));
  var count = 0;
  while (true) {
    s.measureIaq();
    print(s.measureRaw());
    sleep(Duration(milliseconds: 1000));
    ++count;
    if (count == 30) {
      count = 0;
      print(s.measureIaq());
    }
  }
}

In der nächsten Zeit werde ich ein Posting zum Projekt CO2-Ampel basierend auf flutter-pi und dart_periphery verfassen.