← zpět na zápisky z Arduino projektů
Touchduino
- Co je potřeba umět
- Foto
- Video
- Hardware
- Jak to funguje
- Schéma zapojení
- Program Arduino
- Python simulátor klávesnice
- Program Scratch
- Možná vylepšení
- Poznatky
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
- 6× 2 MΩ rezistor (Arduino Uno má 6 analogových pinů)
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í
Program Arduino
Hodnota 900
pro uzavřenou smyčku byla zjištěna experimentálně.
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
-
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
. -
Na Linuxu postačí nainstalovat knihovny
PySerial
aPyUserInput
:pip install pyserial pip install pyuserinput
-
Na Windows je potřeba trochu více, protože knihovna
PyUserInput
pro Windows vyžaduje dálePyHook
aPySerial
vyžaduje pro přístup k portůmPypiwin32
.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
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ávesua
. Scratch si s klávesouEnter
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ší.
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í
- Samozřejmě hlavním vylepšením jsou “krokodýlci”, které ale zatím doma nemáme, časem.
- Je možné vyzkoušet různé hry, kdy je potřeba na něco či někoho sáhnout.
- Hra na modelínové piano.
- Pokud má váš kontroler více analogových pinů, lze udělat více vstupů.
- Lze si zkusit přidat další vstupy pomocí multiplexeru, např. pěkného 16 kanálového CD74HC4067.
Poznatky
- Pokud sedím na zemi, jsem více uzemněn a může se tak stát, že k tomu, aby Arduino detekovalo uzavřenou smyčku, nebude potřebovat své
GND
, postačí mu má sedací plocha. - Notebook napájený ze sítě je více uzemněn než notebook provozovaný na baterii.
- Experimentovali jsme i s různým ovocem, banány, jablka…