TinkerForge: Einstieg mit Master Brick 2.1, WIFI Master Extension 2.0 und Voltage/Current Bricklet 2.0

TinkerForge ist eine deutsche Firma aus Schloß Holte-Stukenbrock, die sich seit 2011 bemüht, die Arbeit mit eingebetteten Systemen zu vereinfachen. Ein Stecksystem erübrigt den Griff zum Lötkolben und  detaillierte Kenntnisse in Elektronik werden überflüssig. In diesem Artikel möchte ich testen, in wie weit dies gelungen ist und meine persönliche Erfahrung beschreiben.

Einführung

TinkerForge setzt konsequent auf den Open Source Gedanken und veröffentlicht den Quellcode und weitere Informationen zu den einzelnen Produkten im Firmenaccount auf Github in aktuell 178 Repositories.

Um das Ziel der Vereinfachung zu erreichen, setzt TinkerForge auf ein Baukastensystem aus Bricks, Bricklets und Master Extensions.

Bricks und Master Extensions besitzen eine einheitliche Grundfläche von 4x4cm und werden über den Stack Connector zu Stapeln verbunden. Der wichtigste Brick ist dabei der Master Brick, dieser erfüllt mehrere Aufgaben. Zum einen ermöglicht er den Anschluss von bis zu 4 Bricklets,  bietet die direkte Kommunikation via USB zu einem PC und dienst als Master der Kontrolle des Stapels (nur der Master Brick, um unteren Ende des Stapels dient als tatsächlicher Master, die anderen bieten dann nur  den Anschluss von weiteren maximal 4  Bricklets). Weitere Bricks erlauben den direkten Anschluss von Gleichstrommotoren, Modellbauservos und Schrittmotoren oder dienen als 9-Achsen Lagesensor (IMU Brick). In der Dokumentation findet sich eine Liste der Bricks neben einer Liste der Master Extension.

Bei den Bricklets wird bewusst auf ein einheitliches Format verzichtet, da so ganz unterschiedliche Sensoren, Aktoren, Konverter zu anderen Bussystemen und verschiedenen Mensch-Maschine-Schnittstellen verbunden werden können. Eine vollumfängliche Liste der Bricklets findet man sich in der Bricklet-Dokumentation. Verbunden werden die Bricklets mit vorkonfektionierten Kabeln unterschiedlicher Längen von 6cm bis zu 2m.

Allen Modulen gemein ist ein Raster der Befestigungslöcher von 5mm, zur Befestigung bietet Tinkerforge Montageplatten für den schnellen Aufbau auf dem Schreibtisch an.

Tinkerforge bietet aktuell für 14 Sprachen (davon 3 als spezielle Ausprägungen für mobile Geräte) fertig APIs an. Diese basieren alle auf dem TCP/IP Protokoll, deshalb sollte eine Adaption für weitere Sprachen durchführbar sein (Swift fehlt zum Beispiel in der Liste der unterstützten Sprachen bisher).

Persönliche Erfahrung

Für den Einstieg entschied ich mich für folgende 3 Module:

Das Ziel ist die kombinierte Messung der von einer Solarzelle gelieferten Spannungs- und Stromwerte und der Transfer in ein Grafana.

Bestellt habe ich direkt bei TinkerForge, geliefert wurde ohne Aufschlag bereits am nächsten Tag.

Installation des Brick Daemon (brickd)

Der Brick Daemon abstrahiert als Systemdienst die Kommunikation zwischen den APIs und dem Master Brick über USB. Den Quellcode findet man im brickd-Repository und Pakete für Debian-artige Distributionen zum Download auf tinkerforge.com.

Allerdings ist die Standardkonfiguration des suboptimal, da auf allen IP Adressen des Rechners ohne Authentifizierung gelauscht wird. Hier sollte man sich doch eher auf localhost 127.0.0.1 beschränken. Dies kann nachträglich in der Datei /etc/brickd.conf mit der Option listen.address angepasst werden. Zusaetzlich habe ich einen Pull-Request erstellt, der das Default anpasst.

Nach der Einrichtung der WIFI Master Extension kann jedoch direkt deren IP Verbindung genutzt werden und der brickd wird obsolet.

Installation des Brick Viewer (brickv)

Der Brick Viewer ermöglicht den Zugriff auf auf lokal angeschlossene Bricks über USB und auch per IP auf entfernte Bricks. Auch hier ist der Quellcode im entsprechenden brickv-Repository zu finden, deb-Pakete finden sich als Downloads auf tinkerforge.com.

Leerer Master Brick
Setup-Reiter eines Master Brick ohne weitere Module

Der Brick Viewer zeigt bei einem einzelnen Master Brick natürlich noch nicht viele Informationen an:

Update Dialog
Dialog zum Aktualisieren der Firmwares

Allerdings ist schon jetzt eine Verbindung via USB möglich und es kann zum Beispiel ein Update der Firmware vorgenommen werden (Changelog).

Schließt man nun den Voltage/Current Bricklet 2.0 an einen beliebigen Port des Master Bricks an, so wird dieser automatisch erkannt.

Master Brick mit Voltage/Current Bricklet 2.0
Setup-Reiter eines Master Brick mit angeschlossenem Voltage/Current Bricklet 2.0

Hat man nun der Beschriftung des Bricklets entsprechend die Stromquelle und den Verbraucher angeschlossen, so kann man auf dem entsprechendem Reiter sofort mit der Messung beginnen.

Erste Messung
Einfache Graphen im Brick Viewer

Über die Funktion “Data Logger” im Setup-Reiter kann bereits jetzt mit einer dauerhaften Aufzeichnung von Daten in eine CSV-Datei begonnen werden. Allerdings ist eine USB Verbindung für eine Messung am Fenster (mit der Solarzelle) nicht praktikabel.

Eine Möglichkeit wäre eine der vielen Bastelplatinen mit USB und WLAN zu verwenden oder man greift zur WIFI Master Extension 2.0. Diese ersetzt die USB-Verbindung und den lokalen Brick Daemon durch ein WLAN Modul.

Aufbau des Stapels

Die Bricks und Master Extensions werden über die mitbestellten Befestigungskits verschraubt, nachdem die Module korrekt ausgerichtet worden (man beachte die weiß markierten Ecken!).

Master Brick und WIFI Master Extension 2.0
Stapel aus Master Brick und WIFI Master Extension 2.0

Auch die WIFI Master Extension wird direkt im Brick Viewer erkannt:

WIFI Konfiguration
Konfiguration der WIFI Master Extension 2.0 im Brick Viewer

Nach der Konfiguration als WLAN-Client (General und Mode) muss noch das richtige WLAN ausgewählt werden. Anschließend kann über “Show Status” geprüft werden, ob die WLAN Einrichtung erfolgreich war und welche IP der Stapel bekommen hat. Die kann man dann zur Kommunikation zwischen Brick Viewer und dem Stapel verwenden.

Nutzung der Python API

Das Modul installiert man einfach mit pip:

pip install --user tinkerforge

Folgendes Skript öffnet zunächst eine IPConnection zu dem aufgebauten Stapel über die WIFI Master Extension. Anschließend wird auf das angeschlossene Bricklet zugegriffen und sekündlich die Werte für Spannung, Stromstärke und Leistung ausgegeben.

HOST = "192.168.178.203"
PORT = 4223
UID = "FKC"

from tinkerforge.ip_connection \
    import IPConnection
from tinkerforge.bricklet_voltage_current_v2 \
    import BrickletVoltageCurrentV2
from time import sleep

if __name__ == "__main__":
    ipcon = IPConnection() 
    ipcon.connect(HOST, PORT) 

    vc = BrickletVoltageCurrentV2(UID, ipcon) 

    while True:
        voltage = vc.get_voltage()/1000.
        current = vc.get_current()/1000.
        power = vc.get_power()/1000.

        print(str(voltage) + " V " + \
              str(current) + " A " + \
              str(power) + " W")
        sleep(1)

Weitere Dokumentation zur API findet sich auf der Webseite von Tinkerforge.

Fazit

Mit den Bricks und Bricklets von TinkerForge erhält man ein einfach zu verwendendes Modulsystem. Die Verarbeitung der Module wirkt qualitativ hochwertig. Dies und die einfache Handhabung durch die unterstützende Software rechtfertig in meinen Augen den leicht höheren Preis. Auch die Auswahl der bereits jetzt existierenden Module lädt zu weiteren Experimenten ein.

FPGA: Eingabe über Schalter

Als weiterer Schritt mit dem FPGA Board nach der 7-Segment Anzeige soll die Möglichkeit darstellen ein Byte  über Schalter einzugeben. Zusätzlich soll noch ein Taster verwendet werden, um eine Eingabe gezielt vornehmen zu können. Auch hier gilt, dass auf teureren Boards wie dem Terasic Cyclone V GX Starter Kit entsprechende Hardware bereits vorhanden ist.

Hardware

Auf dieser Webseite wird beschrieben, wie Taster und Schalter einen einen Spartan-3A FPGA angebunden werden. Eine Adaption dieser Schaltung, bei der auch der Taster active low und zusätzlich mit einem Kondensator beschaltet ist, findet man hier:

Aufgebaut auf der üblichen Lochrasterplatine sieht die Platine dann so aus (hier wären die Schalter eine Nummer größer besser gewesen):

Die Pins auf der oberen Seite besitzen folgende Bedeutung:

PIN NummerBedeutung
Pin 0 (links)Switch 1 (Bit 7)
Pin 1 Switch 2 (Bit 6)
Pin 2 Switch 3 (Bit 5)
Pin 3Switch 4 (Bit 4)
Pin 4Switch 5 (Bit 3)
Pin 5Switch 6 (Bit 2)
Pin 6Switch 7 (Bit 1)
Pin 7Switch 8 (Bit 0)
Pin 8Taste
Pin 9VCC
Pin 10 (rechts)GNG

Ansteuerung

Leider sind real existierende Schalter und Taster aufgrund ihrer Bauform nicht frei von Prellen. In der Wikipedia wird Prellen als “mechanisch ausgelöster Störeffekt bei elektromechanischen Schaltern und Tastern bezeichnet: Statt des sofortigen elektrischen Kontakts ruft die Betätigung des Schalters kurzzeitig ein mehrfaches Schließen und Öffnen des Kontakts hervor.”

Exemplarisch zeigt das folgende Bild das Prellen des verwendeten Tasters:

Bilder, die die Situation noch besser verdeutlichen, finden sich im oben verlinkten Wikipedia-Artikel.

Das Entprellen des Tasters habe ich nicht selbst implementiert sondern eine Implementierung von eewiki.net verwendet. Die Theorie ist, dass geprüft wird, ob der zu entprellende Eingang über einen definierten Zeitraum konstant bleibt. In dieser Implementierung wird über einen 19 bit Zähler ein Zeitraum von 10.5 ms bei 50 MHz verwendet. Somit wird erst nach 10.5 ms der Wert des Eingangs weiter gegeben.

Nachdem der Taster zum Einlesen der Werte nun entprellt wurde, ist der VHDL Code nur noch wenige Zeilen lang:

library IEEE;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity byte_input is
  PORT(
    clk:      in std_logic;
    switches: in std_logic_vector(7 downto 0);
    button:   in std_logic;
    data:     out std_logic_vector(7 downto 0);
    act:      out std_logic
  );
end byte_input;

architecture sim of byte_input is
  signal s_button: std_logic;
begin
  act < = s_button;

  debouncer: entity work.debounce
    port map (
      clk => clk,
      button => not button,
      result => s_button
    );
	
  process(clk)
  begin
    if rising_edge(clk) and s_button = '1' then
      data < = switches;
    end if;
  end process;
end sim;

Es wird zu jedem Clock-Cycle überprüft, ob die Taste gedrückt wurde und wenn ja, der Eingang der Schalter als std_logic_vector(7 downto 0) ausgegeben.

Im GIT findest sich ein kleines Demo-Repository, welches die eingetasteten Werte auf den 2 Siebensegmentanzeigen ausgibt.

FPGA: 7 Segmentanzeige

Als Fortsetzung zu meinen ersten Gehversuchen mit VHDL und FPGAs soll nun ein 1-Byte-Display aus 2 Siebensegmentanzeigen entstehen. So etwas ist auf besseren FPGA-Boards meist bereits integriert, nicht jedoch auf dem preiswerten Basisboard. In diesem Artikel wird z.B. beschrieben, wie auf einem Digilent Basys 3 Artix-7 FPGA Board diese Anzeige aufgebaut ist und wie man sie in Verilog anspricht. Hier werden nun leichte Abwandlungen davon vorgenommen.

Hardware

Auf dem Basys 3 Board werden Siebensegmentanzeigen mit gemeinsamer Anode und PNP-Transistoren verwendet. In meiner Bastelkiste fanden sich aber nur 2 Siebensegmentanzeigen und NPN-Transistoren (BC 337-16). Zusätzlich benötigt man die passenden Vorwiderstände. Die Vorwiderstände für die LED Segmente ergeben sich R = U/I = 3.3 V / 0.002 A = 150 Ohm (die LEDs benötigen 20mA zum Leuchten). Für die Transistoren verwende ich einen Vorwiderstand von jeweils 4k7 Ohm (Hilfe bei den Berechnungen hatte ich von Dr. Kilian). Die vorgestellte Schaltung skaliert natürlich auch für mehr als 2 Siebensegmentanzeigen.

Fertig aufgebaut auf Lochraster sieht das dann so aus. Ja, 20mm Siebensegmentanzeigen sind eigentlich zu groß:

Aufgebaute Schaltung

Die Pins auf der linken Seite besitzen folgende Bedeutung:

PIN NummerBedeutung
Pin 0 / GND (oben)Anschluss für Masse
Pin 1 / S0Für die Auswahl der rechten Siebensegmentanzeige auf High
Pin 2 / S1Für die Auswahl der linken Siebensegmentanzeige auf High
Pin 3 / AAktiviert Segment A der ausgewählten Siebensegmentanzeige
Pin 4 / BAktiviert Segment B der ausgewählten Siebensegmentanzeige
Pin 5 / CAktiviert Segment C der ausgewählten Siebensegmentanzeige
Pin 6 / DAktiviert Segment D der ausgewählten Siebensegmentanzeige
Pin 7 / EAktiviert Segment E der ausgewählten Siebensegmentanzeige
Pin 8 / FAktiviert Segment F der ausgewählten Siebensegmentanzeige
Pin 9 / GAktiviert Segment G der ausgewählten Siebensegmentanzeige
Pin 10 / DP (unten)Aktiviert den Punkt der ausgewählten Siebensegmentanzeige

Zuordnung der Segmente A bis G und DP auf der Siebensegmentanzeige:

Zuordnung der LEDs

Ansteuerung

Die Trägheit des Auges wird bei dieser Schaltung ausgenutzt, da die beiden Siebensegmentanzeigen jeweils abwechselnd aktiviert werden (mit ca. 1 kHz).

Folgende VHDL Entity soll implementiert werden:

Entity byte_display Is
  Port (
    clk      : In std_logic;
    enable   : In std_logic;
    data     : In std_logic_vector(7 Downto 0);
    segments : Out std_logic_vector(1 Downto 0);
    leds     : Out std_logic_vector(6 Downto 0)
  );
End byte_display;

Der clk-Eingang wird dem globalen Clock-Signal verbunden und wird für die Umschaltung der einzelnen Siebensegmentanzeige verwendet. Der Wert data wird intern gespeichert, wenn enable eine steigende Flanke hat und bleibt solange angezeigt, bis ein neuer Wert gesetzt wird. Die beiden ausgehenden Bits in segments aktivieren jeweils mit high-Werten eine der beiden Siebensegmentanzeigen und die Bits aus leds jeweils die entsprechende LED.

Eine Siebensegmentanzeige kann hexadezimal ein Nibble (also ein halbes Byte oder 4 Bit) darstellen. Die Umsetzung dieser 4 Bit in die 7 LEDs der Anzeige wird in einer eigenen VHDL-Prozedur durchgeführt:

PROCEDURE display_digit(
    SIGNAL digit : IN std_logic_vector (3 DOWNTO 0);
    SIGNAL leds : OUT std_logic_vector(6 DOWNTO 0)
  ) IS
BEGIN
 CASE digit IS          -- GFEDCBA
   WHEN "0000" => leds <= "0111111"; -- 0 ABCDEF
   WHEN "0001" => leds <= "0000110"; -- 1 BC
   WHEN "0010" => leds <= "1011011"; -- 2 ABDEG
   WHEN "0011" => leds <= "1001111"; -- 3 ABCDG
   WHEN "0100" => leds <= "1100110"; -- 4 BCFG
   WHEN "0101" => leds <= "1101101"; -- 5 ACDFG
   WHEN "0110" => leds <= "1111101"; -- 6 ACDEFG
   WHEN "0111" => leds <= "0000111"; -- 7 ABC
   WHEN "1000" => leds <= "1111111"; -- 8 ABCDEFG
   WHEN "1001" => leds <= "1101111"; -- 9 ABCDFG
   WHEN "1010" => leds <= "1110111"; -- A ABCEFG
   WHEN "1011" => leds <= "1111100"; -- B CDEFG
   WHEN "1100" => leds <= "1011000"; -- C DEG
   WHEN "1101" => leds <= "1011110"; -- D BCDEG
   WHEN "1110" => leds <= "1111001"; -- E ADEFG
   WHEN "1111" => leds <= "1110001"; -- F AEFG
 END CASE;
END display_digit;

Hier werden jeweils ein Eingangs- und ein Ausgangssignal  mit einem VHDL-Case-When umgesetzt. Es sind sicher noch andere Schreibweisen vorstellbar.

Die Übernahme des Eingabebytes data bei steigendem enable-Bit wird durch einen eigenen Prozess umgesetzt:

PROCESS (enable)
BEGIN
  IF rising_edge(enable) THEN
    FOR i IN 0 TO 1 LOOP
      -- digits sind ein internes Signal
      digits(i) <= data(((4 * i) + 3) DOWNTO (4 * i));
    END LOOP;
  END IF;
END PROCESS;

Steigt hier das enable-Signal an, so teilt die For-Schleife das anliegende data-Signal in die beiden internen digits auf. Dabei hilft die gleichzeitige Zuordnung mehrerer Signale mit der DOWNTO Schreibweise.

Ein paralleler Prozess wechselt mit 1 kHz zwischen beiden Siebensegmentanzeigen hin und her und zeigt dort jeweils das aktuelle Nibble an:

PROCESS (clk)
  VARIABLE digit_cntr : INTEGER := 0;
  VARIABLE digit : INTEGER := 0;
BEGIN
  -- select proper digit
  IF rising_edge(clk) THEN
    digit_cntr := digit_cntr + 1;
    IF (digit_cntr > 50000) THEN
      digit_cntr := 0;
      digit := digit + 1;
      IF (digit > 1) THEN
        digit := 0;
      END IF;
    END IF;
  END IF;
 
 -- display the nibble
  IF (digit = 0) THEN
    segments <= "01";
    display_digit(digits(0), leds);
  ELSE
    segments <= "10";
    display_digit(digits(1), leds);
  END IF;
END PROCESS;

Den vollständigen Code inkl. Zählerbeispiel findet man in byte_display.zip (den Code zum Entprellen des Tasters habe ich dem eewiki entnommen, vielen Dank für den verständlichen Artikel). In den FPGA übertragen und korrekt verkabelt ergibt das folgendes:

Viel Erfolg und Spass beim Nachvollziehen!

Update 26.02.2018
Jetzt auch im GIT: https://git.lusiardi.de/jlusiardi/vhdl_7seg

FPGA: Erste Schritte

Um mal wieder über den berühmten Tellerrand zu blicken will ich mich mal mit etwas neuem beschäftigen. Die Wahl fiel auf FPGAs. Während des Studiums habe ich mich leider durch Wahl eines alternativen Praktikums um eine erste Erfahrung gebracht.

Für einen ersten Einstieg benötigt man nur Software, keine Hardware. Die Software (zumindest von Intel/Altera kann man gratis herunterladen. Dazu unten mehr. Da ich das am Anfang nicht wusste, habe ich über Amazon die im Folgenden genannten Produkte erworben.

Einkauf

Gesamtkosten: keine 30€, da der Klon deutlich günstiger als das Original mit fast 400€ ist.

Erste Erfahrungen

Zunächst sollen einige wichtige Erkenntnisse aufgeführt werden. Zu den beiden genannten Softwarepaketen:

  1. Der Cyclone II wird bis maximal Quartus II Web Edition 13.0sp1  unterstützt. Diese kann kostenlos mit einem myAltera-Account heruntergeladen werden (4.8GB). Nach der Installation sind es ca. 16 GB, wobei man hier beim Installationsumfang sicher sparen kann. Neuere Versionen unterstützen nur neuere FPGAs. Gestartet wird das Programm auf 64-bit Systemen über ./bin/quartus –64bit aus dem Installationsverzeichnis.
  2. JTAG einrichten: unter Ubuntu 17.10 benötigt man zusätzliche udev-Regeln (Datei /etc/udev/rules.d/usbblaster.rules):
    SUBSYSTEM=="usb",ATTR{idVendor}=="09fb",ATTR{idProduct}=="6001",MODE="0666"
    SUBSYSTEM=="usb",ATTR{idVendor}=="09fb",ATTR{idProduct}=="6002",MODE="0666"
    SUBSYSTEM=="usb",ATTR{idVendor}=="09fb",ATTR{idProduct}=="6003",MODE="0666"
    SUBSYSTEM=="usb",ATTR{idVendor}=="09fb",ATTR{idProduct}=="6010",MODE="0666"
    SUBSYSTEM=="usb",ATTR{idVendor}=="09fb",ATTR{idProduct}=="6810",MODE="0666"

    Diese ermöglichen den Zugriff auf für nicht root Nutzer. Anschließend kopiert man die Board-Descriptions nach /etc/jtagd:

    cp $INSTALLDIR/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
    

    Weiter Informationen findet man unter bitsnbites.eu.

  3. Mit ModelSim-Intel FPGA Edition 10.5c kann man auch im myAltera-Account herunterladen (3.1GB). Nach der Installation sind es ca. 7 GB. Vor dem Starten wird noch die Bibliothek freetype in Version 2.4.12 benötigt. Hinweise zur Installation liefert das Armadeus Project Wiki und ein Blog. Gestartet wird anschließend mit ./bin/vsim aus dem Installationsverzeichnis.

Spezifisch zu dem Basisboard gibt es noch folgendes zu sagen:

  1. Das Basisboard muss mit 5V über den entsprechenden Anschluss versorgt werden, sonst wird es nicht über den USB Blaster beim JTAG Scan erkannt. Hierbei liegen die 5V innen an! Es handelt sich um einen 2.1mm/5.5mm Hohlstecker. Update: Die Stromversorgung ist auch über P8 möglich, hier ist der 5V Pin weiter in Richtung Platinenmitte und GND Richtung Rand platziert.
  2. Wichtige Pins sind wie folgt belegt:
    Pin-NummerPin-Funktion
    Pin 3D2 (LED, Output)
    Pin 7D4 (LED, Output)
    Pin 9D5 (LED, Output)
    Pin 17CLK (50 MHz, Input)
    Pin 144Taster (Input)
    Pin 7310uF nach GND, 10K an Vcc
    Pin 26an 1.2V VCC angeschlossen
    Pin 27an GND angeschlossen
    Pin 80an GND angeschlossen
    Pin 81an 1.2V VCC angeschlossen
    Hier ist beim Anschluss von an weiterer Hardware entsprechend Vorsicht geboten.
  3. Der Schaltplan des Basisboards befindet sich u.a. hier:

    Schaltplan des Basisboards (Quelle: http://artofcircuits.com)

Erstes Projekt

Wir starten Quartus II und wählen den “New Project Wizard“. Zunächst wird das Projekt benannt:

Erster Schritt des Wizards

Anschließend kann man bereits existierende Dateien hinzufügen (wir haben allerdings noch keine):

Schritt 2 des Wizards

Die Auswahl des FPGAs (hier die Selektion für den FPGA auf dem Basisboard):

Schritt 3 des Wizards

Einige Informationen über den vorhandenen FPGA werden hier auch aufgezählt:

  • 8256 LEs (Logic Elements) sind die Basisbausteine, im Detail beschrieben auf Seite 2-2 im Cyclone II Architecture Dokument. Jeweils 16 davon werden zu einem LAB (logic array block) zusammengefasst (516 sind vorhanden).
  • 85 User I/Os (Ein/Ausgänge, die für den Entwickler verfügbar sind)
  • 165888 Bit Speicher in 36 M4K Blöcken
  • 36 9×9-Bit Mulitplizierwerke oder alternativ 18 18×18 Multiplizierwerke
  • 2 PLLs
  • 8 globale Takte

Nun hat man ein leere Projekt erzeugt. Mit  “File” und “New” erstellt man eine neue VHDL Datei.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
entity vhdl_example_1 is
 port( 
  clk: in std_logic;
  led: out std_logic
 );
end vhdl_example_1;
  
architecture bhv of vhdl_example_1 is
 signal count: integer := 1;
 signal tmp: std_logic := '0'; 
begin
 process(clk) begin
  if(clk'event and clk = '1') then
   count <= count + 1;
   if (count = 25000000 ) then
    tmp <= NOT tmp;
    count <= 1;
   end if;
  end if;
  led <= tmp;
 end process;
end bhv;

Diese speichert man unter dem Namen vhdl_example_1.vhd ab. Mit Processing und Start Compilation kann man das Übersetzen starten. Unter Assigments und Pin Planner starten wir die Zuordnung der unter Port definierten Ein-/Ausgänge. Folgende Zuordnung muss vorgenommen werden:

  • clk auf Location PIN 17
  • led auf Location PIN 3
Ausschnitt der konfigurierten Pins

Als letzten Schritt muss der FPGA noch ueber den JTAG Anschluss programmiert werden. Dazu verwendet man den unter Tools den Programmer. Zunächst wählt man unter Hardware Setup den USB-Blaster aus. Als Datei fügt man  output_files/vhdl_example_1.sof hinzu und als Device den FPGA des Basisboards. Anschließend kann man mit Start die Programmierung starten.

Einstellungen im Programmer

Sollte dies nicht (mehr) funktionieren, kann es helfen den USB-Blaster kurz vom USB zu trennen.

Hat alles funktioniert, sollte die LED D2 mit 1Hz blinken:

Update 2. März 2018 zum Thema alternative Stromversorgung.

Update 31. März 2018 zum Thema JTAG einrichten

Brother DCP-9017CDW und Linux

Das alte Faxgerät meines Vater ging leider kaputt und wurde zuletzt eh nur noch als Kopierer verwendet. Als Ersatz wurde ein Brother DCP-9017CDW auserkoren, da dieses Gerät:

  1. ein duplexfähigen Farblaser zur Ausgabe verwendet (trocknet einfach nicht ein),
  2. einen moderaten Anschaffungspreis besitzt,
  3. per WLAN auch mit Linux als Drucker verwendet werden kann und
  4. über ein einfaches Touch Display bedient werden kann.

Kurz um, das Gerät scheint das richtige zu sein, zumal auch eine Funktion “Scan2Email” auf der Funktionsliste steht. Leider sagt das Kleingedruckte “Benötigt Brother-Software” und verweist auf einen optionalen kostenlosen Download für Linux aus dem Brother Solutions Center. Ebenso leider existiert dann kein Download für Linux im Brother Solutions Center (Stand 25.12.2017). Ergo kein offizieller Weg für Scan2Email. Na danke.

Ohne Brother Software kann das Gerät allerdings auf (lokale) FTP-Server scannen. Lokal deshalb, da FTP als unsicher einzustufen ist (Link, Link, …).

Die Idee ist nun: vom Brother DCP-9017CDW wird in ein FTP-Verzeichnis pro Email-Adresse gescannt. Auf dem FTP-Server wird auf eingehende Dateien reagiert und diese per Mail versendet.

Folgende Software wurde ausgewählt:

  • vsftpd als FTP-Server,
  • mpack zum Versand der Dateien als Anhang,
  • exim4 mit Smarthost zum Versand der Mails und
  • incron zum Reagieren auf neue Dateien.

Zunächst erlaubt man dem vsftpd in seiner Konfiguration das Schreiben von Dateien (write_enable=YES) sowie lokale User (local_enable=YES). Somit kann auf dem DCP-9017CDW testweise auf den FTP-Server gescannt werden.

Anschließend exim so einrichten, dass er Mails nach außen versenden kann. Das passiert in diesem Szenario mit einem Smarthost. Dann sollte man testen, ob mpack auch Anhänge versenden kann:

mpack -s SUBJECT /PATH/TO/FILE MAILADRESSE

Kurz danach sollte die Datei als Anhang eintreffen.

Abschließend noch incron konfigurieren, damit auf neue Dateien reagiert werden kann:

  • den Nutzernamen, unter dem per FTP die Dateien abgelegt werden, in der Datei /etc/incron.allow vermerken
  • mit incrontab -e pro Verzeichnis bzw. Email Adresse eine Zeile der Form
    $PFAD IN_CLOSE_WRITE $Script $@/$# $MAIL

    eintragen

Das Script übergibt mpack die Datei und die Mailadresse und löscht die Datei nach dem Versand.

Et voilà, Scan2Mail funktioniert doch.

Wärmeleitpaste für ein 10 Jahre altes MacBook und weitere Mods

Das ist für viele sicher eigentlich keinen Blog-Eintrag wert, ich will es trotzdem kurz niederschreiben. Die Erneuerung der Wärmeleitpaste ist zwar aufwändig, kann aber sehr positive Effekte hervorrufen.

Demontage des Macbooks ist laut ifixit schwierig aber machbar. Wärmeleitpaste in einer Spritze mit Spatel kann bei einem bekannten Versandhändler von CoolerMaster für wenige Euros bekommen.

Als Ergebnis ist das MacBook subjektiv deutlich leiser und wohl auch kühler (an der CPU) da die Wärme schneller abgeleitet wird.

Fazit: Mit Anleitung machbar und bringt viel.

SanDisk iXpand 128 GB

Ich bin iPhone-User und kann mich an Android einfach nicht gewöhnen. Allerdings bin ich auch preisbewusst und habe mich dieses Jahr erstmals für ein neues iPhone SE mit 32GB entschieden. Der Speicherplatz ist eigentlich ausreichend.

Eigentlich…

Im Urlaub fallen ja dann mal doch mehr Bilder und Videos an, da können 32GB schon mal knapp werden. Alles in die Cloud? Laptop mit Windows oder OS X mitnehmen? Kann man sich dank des SanDisk iXpand 128 GB sparen. Dank iOS-App kann man u.a. Bilder und Videos vom iPhone auf den Stick sichern. Nach einem Backup lassen sich die gesicherten Dateien automatisch aus der App heraus löschen. Ein weiterer Vorteil: auch Linux-User kommen so an die Bilder und Videos des iPhones.

Fazit: gute, einfache Möglichkeit schnell Bilder und Videos vom iPhone zu sichern.

Sun Type 6 Keyboard (ohne USB) an modernen PCs (mit USB)

In meinem Keller befand sich noch eine Sun Type 6 Tastatur in der Variante mini-DIN Anschluss. Später hat Sun die Type 6 noch mit USB angeboten, aber so eine habe ich leider nicht.

Was kann man heute mit so einer Tastatur anfangen?

Direkt nicht viel, aber die SPARC Keyboard Specification Version 1 sagt, daß diese Tastaturen ein serielles Protokoll mit negativer Logik mit 1200 Baud sprechen. Ein Test mit einem Arduino ergab, dass die SoftwareSerial-Bibliothek dies unterstützt. Entsprechend kann man mit der Tastaturelektronik sprechen. Richtung PC hilft einem eine serielle Schnittstelle nicht viel, da PCs zunächst einen AT Anschluss, später dann PS/2 und schlussendlich USB für Tastaturen nutzen.

USB ist der aktuelle Standard für den Anschluss von Tastaturen an PCs. Also benutzen wir einen Arduino, der nativer USB Client und platzsparend  ist. Der Vorschlag: ein ATmega32u4 basierter Arduino Micro (oder ein kleinerer Klon).

Die Verkabelung ist einfach:

  • GND der Tastatur (Pin ganz recht) wird mit einen GND Anschluss des Arduinos verbunden
  • VCC der Tastatur (2. Pin von rechts) an den VCC des Arduinos anschließen (5V sind ok)
  • den RX Pin der Tastatur (4. von rechts) an den SoftwareSerial TX Pin (im Code ist dies Pin 15)
  • den TX Pin der Tastatur (5. von rechts) an den SoftwareSerial RX Pin (im Code ist dies Pin 14)

Für einfache Aufgaben reicht die Keyboard und Maus Bibliothek von Arduino. Allerdings nimmt diese intern bereits ein Mapping auf ASCII vor (“Note: Not every possible ASCII character, particularly the non-printing ones, can be sent with the Keyboard library.”). Dies bereitet dann prompt Probleme beim Umsetzen der kompletten Tastatur mit einem Arduino. Ebenso lässt sich die Kommunikation des Hosts mit der Tastatur (Schalten der LEDs) nicht abbilden. Dies wird durch Nico Hood’s HID Projekt (Version von Commit 3c5000c4b606b85054150a201f0c6229a9148068) ermöglicht.

Den Code des Sketches findet sich im GitHub Repository: sun-type6-to-USB

Nach dem Flashen des Sketches in den Arduino ist es möglich einen Text wie diesen auf einer Sun Type 6 an einem modernen PC zu schreiben.

ioBroker: Ergänzung zu Open Source Hausautomatisierung im Vergleich

Im Artikel zu Open Source Hausautomatisierungslösungen wurden bereits einige Lösungen verglichen. Auf der diesjährigen 17. Gulaschprogrammiernacht  hat Bluefox ein weiteres System vorgestellt: ioBroker

ioBroker soll nun an den gleichen Kriterien wie die anderen 7 Systeme gemessen werden:

  1. Die Software muss quell-offen und frei sein (OpenSource)
  2. Dokumentation auf Englisch bzw. Deutsch und in ausreichenden Qualität und Detailtiefe vorhanden (Dokumentation)
  3. Größe der Community
  4. Support für Komponenten von eQ-3 für Homematic und Homematic IP (Hardware-Unterstützung), da diese bereits vorhanden ist.
  5. Apps für iOS bzw. Android (Apps)
  6. Verwendete Programmiersprachen & Technologien (Technologie)
  7. Die Software muss Graphen zur historischen Analyse von Messwerten bieten (Graphen)
  8. Die Software muss über Regeln erweiterbar sein, z.B. Verknüpfung von Schalter, Reaktion aufs Verlassen der Wohnung (Regeln)

ioBroker ist ein bei Github gehostetes OpenSource-Projekt unter MIT-Lizenz und basiert auf Node.js, einer Server-seitigen Implementierung von JavaScript.

Anleitungen zur Installation sind auf Deutsch, Englisch und Russisch vorhanden. Allerdings sollten die Autoren hier noch etwas Zeit investieren und Fehler ausbessern, da diese den Lesefluss beeinflussen.

Laut dem Vortrag von Bluefox (Videomitschnitt exisitiert) wächst die Community von ioBroker rasant an. Dazu trägt sicher auch bei, dass bereits eine Integration für Amazon Alexa existiert, was das Gesamtsystem deutlich smarter erscheinen lässt.

Homematic und Homematic-IP werden laut Forum unterstützt. Auch scheint Anwesenheitserkennung über Fritz!Box und das Steuern von Samsung TV Geräten unterstützt zu werden.

Wichtig sind natürlich auch Apps für:

Da ioBroker auf Node.js basiert kann beim Entwickeln sowohl Front- als auch Backend  in einer Sprache entwickelt werden. Daten werden sowohl in relationalen Datenbanken (MySQL, PostgreSQL oder SQLite) als auch in InfluxDB für zeitbasierte Daten abgelegt. Die transparenten Verbindungen über TCP erlauben es hierbei, Teile der Software modular auf mehreren Hosts zu betreiben.

Zur Visualisierung bietet ioBroker einen Editor, der komplett im Browser läuft. Hierbei werden unterschiedliche Darstellungen für Zielgeräte angeboten.  Diese Funktionalität wird über den VIS-Adapter bereit gestellt. Graphen stellt das System hierbei über den Flot-Adapter dar.

Zur Eigentlichen Automatisierung bietet ioBroker das Definieren von Szenen über den Szenen-Adapter aber auch das Erstellen komplexer über Adapter für Blockly und node-red.

Zusätzlich zu den, für den Vergleich wichtigen, Punkten bietet eine Integration in Apples Homekit. Diese ist ebenso ein Pluspunkt wie auch der optionalen Clound-Zusatz, der einen Zugriff aus der Ferne auch ohne eigenes VPN ermöglicht.

Alles in Allem ist ioBroker eine weitere Software mit guten Ansätzen, die ich aber aus Zeitgründen und da ich weder mit Node.js noch Javascript besonders viel Erfahrung besitze, nicht weiter betrachten werde.

Mounten von Partitionen aus Image-Dateien

Ist das Backup einer SD-Karte nur als Image-Datei vorhanden und keine Zeit erst wieder auf SD-Karte zu schreiben? Dateimanager kann Image-Dateien nicht direkt einbinden? Hier die Lösung:

  1. Auslesen der Partitionen und ihrer Startsektoren:
    fdisk -l ${QUELLDATEI}

    (Hier in der Spalte Start nach dem Anfang der Partition suchen, unter Units steht die Größe der Sektoren)

  2. Einbinden der gewählten Partition:
    mount ${QUELLDATEI} /mnt -o offset=$((${ANFANGSSEKTOR}*${SEKTORGRÖßE}
  3. Und fertig!