Startseite bisherige Projekte Tools/Snippets Bücherempfehlungen Publikationen Impressum Datenschutzerklärung

microbit, espruino und die Morsetastatur

im Juni 2023



Toll, noch ein kleines Board.
Kann man daraus etwas lustiges Bauen? Mit Bluetooth? Eine Morsetastatur?
Meine Versuche mit makecode und python waren nicht zufriedenstellend. Makecode reagiert zu langsam, möglicherweise ist hier der Debounce-Zeitraum für den Knopf zu groß.


Neben makecode und python kann der micro:bit auch Dank espruino mit JavaScript programmiert werden: https://www.espruino.com/MicroBit
Das klappt besser.


Bei meinen Versuchen hat die Tonausgabe erst mit espruino v2.08 geklappt: https://www.espruino.com/Download#microbit2


Die hex-Datei mit espruino auf das micro:bit Laufwerk kopieren, danach spricht das Modul JavaScript und kann per Chrome über WebBluetooth programmiert werden:
https://www.espruino.com/ide/
Vorsicht, wenn der micro:bit später als Bluetooth-Tastatur verbunden ist klappt die Verbindung mit der IDE per Bluetooth unter Windows nicht mehr. Dann den micro:bit in den Windows-Bluetooth-Einstellungen trennen.
Alternativ ist eine Verbindung über WebSerial möglich, aber langsamer und die Übertragung des kompletten Programms klappt nicht.


Folgendes Programm macht den micro:bit dann zur Bluetooth-Tastatur:

// Modified from original Python code from here: https://microbit-micropython.readthedocs.io/en/stable/tutorials/network.html

// To create a DOT you need to hold the button for less than 250ms.
const DOT_THRESHOLD = 250;

// To create a DASH you need to hold the button for less than 500ms.
const DASH_THRESHOLD = 500;

var kb = require("ble_hid_keyboard");

// bluetooth initialized marker
var bluettoothInited = false;

// set to true if Button A is currently pressed
var btnAPressed = false;

// contains the time when Button A was pressed
var btnAPressedTime = 0;

// The timeout for the currently entered morse input
var timeOutChar = null;

// A lookup table of morse codes and associated characters.
var morseDict = {
  ".-": "A",
  "-...": "B",
  "-.-.": "C",
  "-..": "D",
  ".": "E",
  "..-.": "F",
  "--.": "G",
  "....": "H",
  "..": "I",
  ".---": "J",
  "-.-": "K",
  ".-..": "L",
  "--": "M",
  "-.": "N",
  "---": "O",
  ".--.": "P",
  "--.-": "Q",
  ".-.": "R",
  "...": "S",
  "-": "T",
  "..-": "U",
  "...-": "V",
  ".--": "W",
  "-..-": "X",
  "-.--": "Y",
  "--..": "Z",
  ".----": "1",
  "..---": "2",
  "...--": "3",
  "....-": "4",
  ".....": "5",
  "-....": "6",
  "--...": "7",
  "---..": "8",
  "----.": "9",
  "-----": "0"
};

// Holds the incoming Morse signals.
var buffer = "";

g = Graphics.createArrayBuffer(5, 5, 1);
g.flip = function() {
  show(this.buffer);
};

// for sound generation
b = [];
for (i = 0; i < 10; i++) {
  b.push(255);
  b.push(0);
}


// if Button A is pressed, plays a short tune repeatedly
function playTune() {
  if (btnAPressed) {
    Microbit.play(b, 4000, playTune);
  }
}

// initialize bluetooth 
function btnPressedInit() {

  // disconnect the BT console (if connected)
  E.setConsole("Serial1");

  if (!bluettoothInited) {
    // bluetooth not yet inited, do it now.
    NRF.setServices(undefined, {
      hid: kb.report
    });
    bluettoothInited = true;
    show("1   1\n" +
      "  1  \n" +
      "  1  \n" +
      "1   1\n" +
      " 111 \n");
  }
}

// Button A was pressesd
function btnPressed() {

  if (timeOutChar) {
    clearTimeout(timeOutChar);
  }

  btnAPressed = true;
  btnAPressedTime = new Date().getTime();
  playTune();
}

// Button A was released
function btnReleased() {
  btnAPressed = false;
  handleMorseReleased();
}

// Button was released.
function handleMorseReleased() {

  if (timeOutChar) {
    clearTimeout(timeOutChar);
  }
  if (!btnAPressedTime) {
    return;
  }

  // Get the current time
  var btnAReleasedTime = new Date().getTime();

  // work out for how long it was pressed.
  var duration = btnAReleasedTime - btnAPressedTime;

  if (duration < DOT_THRESHOLD) {
    // If the duration is less than the max length for a "dot" press...
    // ... then add a dot to the buffer containing incoming Morse codes
    // and display a dot on the display.
    buffer += '.';
    show("     \n" +
      "     \n" +
      "  1  \n" +
      "     \n" +
      "     \n");
  } else if (duration < DASH_THRESHOLD) {
    // Else, if the duration is less than the max length for a "dash"
    // ress... (but longer than that for a DOT ~ handled above)
    // then add a dash to the buffer and display a dash.
    buffer += '-';
    show("     \n" +
      "     \n" +
      " 111 \n" +
      "     \n" +
      "     \n");
  } else {
    //Otherwise, any other sort of keypress duration is ignored (this isn't
    // needed, but added for "understandability").
  }
  timeOutChar = setTimeout(handleCharEnd, DASH_THRESHOLD);
}

// called when a button was released longer than DASH_THRESHOLD ago. End current morse character
function handleCharEnd() {
  btnAPressedTime = 0;
  var character = morseDict[buffer];
  if (character) {
    // draw character
    g.clear();
    g.drawString(character, 0);
    g.flip();
    // send keycode via bluetooth
    var keycode = kb.KEY[character];
    if (keycode) {
      try {
        kb.tap(keycode, 0);
      } catch (eror) {
        show("1   1\n" +
          "  1  \n" +
          "  1  \n" +
          " 111 \n" +
          "1   1\n");
      }
    }
  } else {
    // draw a ?
    g.clear();
    g.drawString("?", 0);
    g.flip();
  }
  buffer = "";
}


// trigger btnPressed whenever the button 1 is pressed
setWatch(btnPressed, BTN1, {
  edge: "rising",
  repeat: true,
  debounce: 50
});
// trigger btnReleased whenever the button 1 is released
setWatch(btnReleased, BTN1, {
  edge: "falling",
  repeat: true,
  debounce: 10
});
// trigger btnPressedInit whenever the button 2 is pressed
setWatch(btnPressedInit, BTN2, {
  edge: "rising",
  repeat: true,
  debounce: 50
});


Über die IDE aufspielen und danach die Verbindung zu WebBluetooth trennen.


Knopf B drücken, damit wird die Bluetooth-Verbindung gestartet. Jetzt kann das Gerät über Bluetooth als Tastatur hinzugefügt werden:


Anschließend kann losgemorst werden. Jeder Buchstabe wird über als Tastatenanschlag über Bluetooth an Windows gesendet.
Was noch fehlt: Eine Leertaste wäre noch schön gewesen.


Viel Spaß beim Morsecode lernen...





Impressum - Datenschutzerklärung