View on GitHub

Arduino projekty pro děti

Zápisky z našich domácích Arduino projektů

← zpět na zápisky z Arduino projektů

Touchduino

Tak pojmenovaly tento projekt děti. Naše domácí verze mnohem slavnějšího Makey Makey. Jde o jednoduchý obvod s detekcí uzavřené smyčky a generováním kláves v počítači.

Bohužel, běžná Arduina se nechovají jako HID (Human Interface Device), to umí jen méně časté verze jako třeba Leonardo, Micro či Due. Taková se nám doma neválí, tedy jsme si museli nějak poradit.

Co je potřeba umět

Určitě je výhodou se alespoň trochu orientovat v Pythonu, hlavně v instalaci knihoven.

Foto

První pokusy Tady už řádí děti

Video

Hardware

Jak to funguje

Propojili jsme Arduino Uno (ale lze vzít jakýkoli kontroler, který neumí HID) přes seriové rozhraní s počítačem, kde na něj čeká Python skript. Ten následně generuje klávesy v systému, jako by byly stisknuty na klávesnici. Klávesy pak lze zachytit v libovolném programu, např. ve Scratchi, ve kterém se děti často učí programovat a mohou si tak vyhrát např. se zvuky. Výsledek jsme otestovali na Windows tak i na Linuxu. Jako “tlačítka” děti použily modelínu.

Schéma zapojení

touchduino.fzz

Touchduino

Program Arduino

Hodnota 900 pro uzavřenou smyčku byla zjištěna experimentálně.

touchduino.ino

byte pins[6] = {A0, A1, A2, A3, A4, A5};

void setup() {
  // nastartuj seriovo ulinku
  Serial.begin(9600);
  // budeme cist z analogovych pinu
  for (byte i = 0; i < 6; i++) {
    pinMode(pins[i], INPUT);
  }
}

// osetri uzavrenou smycku
void handle(byte pin, char* command) {
  // posli prikaz na seriovou linku
  Serial.print(command);
  int value = 0;
  // dokud se smycka nerozpoji, tak cekej
  while (value < 900) {
    value = analogRead(pins[pin]);
    delay(10);
  }
}

void loop() {
   for (byte i = 0; i < 6; i++) {
    int value = analogRead(pins[i]);
    // pokud je smycka uzavrena
    if (value < 900) {
      //Serial.print(value);
      //Serial.print("\n");
      switch (i) {
        case 0: handle(i, "KEY_SPACE\n"); break;
        case 1: handle(i, "KEY_LEFT\n"); break;
        case 2: handle(i, "KEY_RIGHT\n"); break;
        case 3: handle(i, "KEY_UP\n"); break;
        case 4: handle(i, "KEY_DOWN\n"); break;
        case 5: handle(i, "KEY_ENTER\n"); break;
      }
    }
   }
   delay(10);
}

Python simulátor klávesnice

Protože Arduino Uno neumí samo simulovat klávecnici (není HID), napsal jsem jednoduchý skript v jazyce Python, který se připojí na seriovou linku na zadaném portu, čte příkazy poslané Arduinem a následně simuluje stisknuté klávesy.

Prerekvizity

  1. Nainstalován Python 3

    Verzi Pythonu lze zjistit

     python --version
     Python 3.6.0
    

    Další podrobnosti k instalaci třeba v tomto pěkném manuálu. Někdy běží souběžně verze 2.x i 3.x, pak je potřeba pouštět python 3 např. jako ; python3.

  2. Na Linuxu postačí nainstalovat knihovny PySerial a PyUserInput:

     pip install pyserial
     pip install pyuserinput
    
  3. Na Windows je potřeba trochu více, protože knihovna PyUserInput pro Windows vyžaduje dále PyHook a PySerial vyžaduje pro přístup k portům Pypiwin32.

    PyHook se mi podařilo nainstalovat z balíčku wheel (pozor, až budete tento návod číst, může být již novější verze).

     pip install pyHook-1.5.1-cp27-none-win32.whl
    

    Pypiwin32 pak standardní cestou.

     pip install pypiwin32
    

    Co se mi však nedařilo pro nekompatibilitu verzí Python, byla instalace samotného PyUserInput na Windows, nakonec jsem stáhl přímo zip (clone or download, download zip) a po rozbalení provedl ruční instalaci.

     python setup.py install
    

Program Python simulující stisky kláves

arduino_keyboard.py

import sys
import serial
from pykeyboard import PyKeyboard

keyboard = PyKeyboard()

KEYS = {
    b"KEY_UP\n": keyboard.up_key,
    b"KEY_DOWN\n": keyboard.down_key,
    b"KEY_RIGHT\n": keyboard.right_key,
    b"KEY_LEFT\n": keyboard.left_key,
    b"KEY_SPACE\n": keyboard.space_key,
    #b"KEY_ENTER\n": keyboard.enter_key,
    b"KEY_ENTER\n": 'a',
}

print("Arduino UNO R3 Keyboard simulator")

if len(sys.argv) < 2:
    print("Schazi port, na kterem mam poslouchat Arduino")
    print("priklad Windows: python arduino_keyboard.py COM1")
    print("priklad Linux: python arduino_keyboard.py /dev/ttyusb0")
    sys.exit(1)

port = sys.argv[1]
print("Nasloucham na portu: {}".format(port))
print("Pro ukonceni stiskni Ctrl+C\n")

ser = serial.Serial(port, 9600)
while True:
    line = ser.readline()
    print("Arduino poslalo: {}".format(line))
    for k, v in KEYS.items():
        if line == k:
            keyboard.tap_key(v)
            print('Mackam klavesu: {}'.format(k))
            break

Jak to pustit

Python simulátor klávesnice pustíme z příkazové řádky, očekává jediný parametr a tím je označení portu, na kterém si bude s Arduinem povídat.

Postup, jak zjistit, na jakém portu se ním Arduino usídlilo, se liší podle operačního systému.

Linux

ls -l /dev/tty*

nebo ještě lépe

dmesg | tail

Vlastní spuštění pak vypadá takto:

python arduino_keyboard.py /dev/ttyACM0

Windows

Control panels, Device Manager, Ports (COM & LPT)

Vlastní spuštění pak vypadá takto:

python arduino_keyboard.py COM26

Skript čte ze zadaného sériového portu, kam mu Arduino posílá příkazy. Co přichází, vypisuje na konzoli, pokud něčemu porozumí, píše, jaké klávesy generuje. Ukončit jej lze např. pomocí Ctrl+C.

Pozor, upravili jsme Python skript tak, aby místo klávesy Enter posílal klávesu a. Scratch si s klávesou Enter neporadí a neumí ji zpracovat.

Program Scratch

Ve chvíli, kdy nám Arduino “generuje” klávesy na počítači, pro zbytek zábavy postačí Scratch, ve kterém si děti už nějaký program samy vymyslí. Čím hlasitější, tím lepší.

touchduino.sb2

po stisku klávesy [a]
hraj zvuk [chomp] až do konce

po stisku klávesy [mezerník]
hraj zvuk [pop] až do konce

po stisku klávesy [šipka vlevo]
hraj zvuk [snap] až do konce

po stisku klávesy [šipka dolů]
hraj zvuk [meow] až do konce

po stisku klávesy [šipka vpravo]
hraj zvuk [hand clap] až do konce

po stisku klávesy [šipka nahoru]
hraj zvuk [boing] až do konce

Možná vylepšení

Poznatky