Wir nutzen Cookies, um das allgemeine Benutzerelebnis zu verbessern. Mit der Nutzung unseres Wikis stimmst du der Nutzung von Cookies zu.

Scratch Extensions

Erweiterungsblöcke zum Ansteueren der LEGO-WeDo-Hardware. Der grüne Punkt rechts oben zeigt an dass die WeDo-Hardware angeschlossen ist und die Kommunikation funktioniert

Scratch Extensions (Erweiterungen) erweitern Scratch um mit externer Hardware (wie zum Beispiel Lego-WeDo oder das PicoBoard) oder mit Online-Ressourcen zu kommunizieren. Erweiterungen fügen üblicherweise zusätzliche Blöcke ein die das Zusammenspiel mit der externen Ressource ermöglichen. Wenn eine Erweiterung aktiviert ist, erscheinen die zusätzlichen Blöcke in der Kategorie Weitere Blöcke.

Um eine Erweiterung hinzuzufügen, klicke auf die Kategorie Weitere Blöcke und danach auf die Schaltfläche "Erweiterung hinzufügen".

Schaltfläche "Erweiterung hinzufügen" in Scratch 2.0.

ScratchX

Die Seite ScratchX bietet einen Online-Editor welcher die Ausführung von experimentielle Erweiterungen ermöglicht. Experimentielle Erweiterungen sind von der Scratch Community programmierte Erweiterungen welche im normalen Scratch Editor nicht verfügbar sind.

Um experimentielle Erweiterungen zu verwenden muss der ScratchX Player mit der URL der Erweiterung aufgerufen werden. Alternativ kann man die Erweiterung auch manuell im ScratchX Editor laden.

Die Seite http://scratchx.org bietet eine Sammlung von Experimentielle Erweiterungen zum Download sowie eine Anleitung zum Erstellen eigener Erweiterungen. Entwickler von Erweiterungen können diese über GitHub hochladen und den Link auf ScratchX hochladen und veröffentlichen.

Programmieren einer Erweiterung für ScratchX

Ein neuer Block wird dazu als Javascript-Funktion implementiert, welche den Block über eine Registrierungsfunktion "ScratchExtensions.register(..." an Scratch übergibt. So ist es möglich, Kopf-Blöcke, Stapel-Blöcke, blockierende Stapel-Blöcke und Wert-Blöcke mit eigener Funktionalität zu implementieren. Die Dateiendung einer Extension ist üblicherweise ".js".

Beispiel für die Implementierung und Registrierung einer Erweiterung mit einem Kopf-Block und einem Stapel-Block:

 (function(ext) {
     var alarm_went_off = false; // This becomes true after the alarm goes off
 
     // Cleanup function when the extension is unloaded
     ext._shutdown = function() {};
 
     // Status reporting code
     // Use this to report missing hardware, plugin or unsupported browser
     ext._getStatus = function() {
         return {status: 2, msg: 'Ready'};
     };
 
     ext.set_alarm = function(time) {
        window.setTimeout(function() {
            alarm_went_off = true;
        }, time*1000);
     };
 
     ext.when_alarm = function() {
        // Reset alarm_went_off if it is true, and return true
        // otherwise, return false.
        if (alarm_went_off === true) {
            alarm_went_off = false;
            return true;
        }
 
        return false;
     };
 
     // Block and block menu descriptions
     var descriptor = {
         blocks: [
             [, 'run alarm after %n seconds', 'set_alarm', '2'],
             ['h', 'when alarm goes off', 'when_alarm'],
         ]
     };
 
     // Register the extension
     ScratchExtensions.register('Alarm extension', descriptor, ext);
 })({});

Namen und Typ der Blöcke werden im "extension descriptor" ("descriptor" in obigem Beispiel) beschieben. Der Descriptor kann neben Blocknamen auch Menüpunkte der Erweiertung beschreiben, zum Beispiel:

 var descriptor = {
     blocks: [
         ['w', 'turn motor on for %n secs',             'motorOnFor', 1],
         [' ', 'turn motor on',                         'allMotorsOn'],
         [' ', 'turn motor off',                        'allMotorsOff'],
         [' ', 'set motor power %n',                    'startMotorPower', 100],
         [' ', 'set motor direction %m.motorDirection', 'setMotorDirection', 'this way'],
         ['h', 'when distance %m.lessMore %n',          'whenDistance', '<', 20],
         ['h', 'when tilt %m.eNe %n',                   'whenTilt', '=', 1],
         ['r', 'distance',                              'getDistance'],
         ['r', 'tilt',                                  'getTilt']
     ],
     menus: {
         motorDirection: ['this way', 'that way', 'reverse'],
         lessMore: ['<', '>'],
         eNe: ['=','not =']
     },
     url: 'http://info.scratch.mit.edu/WeDo'
 };

Hardwarezugriff

Für die Kommunikation mit Hardware bietet Scratch eine eigene Programmierschnittstelle für den Zugriff auf

  • Seriell angesteurte Geräte wie zum Beispiel das PicoBoard
  • USB Geräte welche als Eingabegerät (Human Interface Device (HID)) angesteuert werden. Dazu zählt zum Beispiel Lego-WeDo
Laden einer experimentiellen http-Erweiterung. Der Menüpunkt erscheint nur im Scratch 2 Offline Editor durch Halten der Umschalttaste während man auf Datei klickt

Erweiterungen für den Scratch Offline Editor

Erweiterungen im .s2e-Format können im Scratch 2 Offline Editor geladen werden. Diese Erweiterungen bestehen aus einer Definition der Blöcke und einer Helferapplikation, welche unabhängig von Scratch läuft und lokal über einen Netzwerkport kommuniziert.

Für Entwickler gibt es ein Dokument Creating Scratch 2.0 Extensions von John Maloney (Stand: September 2013), welches Dateiformat und Protokoll zwischen Erweiterungsbeschreibung und der Helferapplikation beschreibt. Diese Spezifikation ist noch vorläufig und können sich ändern.

See Also