Bygga ett stort Piano (5 / 10 steg)
Steg 5: Vilka tangenter har pressats?
Människor har haft detta problem tidigare, och en gemensam lösning är matrix skanning. Den viktigaste insikten är att vi vill veta de viktiga staterna (upp/ned) men vi behöver inte känna dem på samma ögonblick. Genom att skanna nycklarna över tiden (om än mycket snabbt i mänskliga termer) kan vi minska mängden maskinvara behövs.
I vårt fall ordnade vi nycklarna i 4 rader (oktaver) och 7 kolumner (vit viktiga anteckningar). Vi Skanna kolumnerna (anteckningar) en i taget och se vilken av dessa anteckningar är aktiva inom oktaver. Efter att ha gjort 7 skanningar (för varje not) kommer vi att veta tillståndet för alla 28 nycklarna. Vi ange anteckningen ska skanna med 3 utgångar (8 möjligheter - vi behöver bara 7 noterar) och 4 ingångar (4 oktaver). Vi behöver 7 kablar för notes och 4 trådar för oktaver. Vi kan lösa problemet med 7 IO pinnar och 11 kablar. Detta är en stor förbättring.
Det finns några detaljer:
* Nyckel spökbilder: På grund av matrisen nyckeln ledningar det är möjligt för flera nycklar pressar tolkas felaktigt som att trycka på en tangent som inte är pressas. Genom att lägga till en diod varje switch vi förhindra nuvarande från att rinna baklänges i matrisen och stoppa detta från att hända.
* Kolumn/Obs urval: Vi behöver bara välja 1 Obs i taget (av 7) och vi har ont om IO pinnar, så det bästa sättet att hantera detta är att använda en 3:8-avkodare. Vi använde en 74LS138. Som har ett aktivt låg utgång, så kretsar är kanske mindre intuitivt än att ha en driven utgång 5V.
* Ingång kretsar: Ingångar på atmega328p kan konfigureras för att ha interna dra upp motstånd. Det är bra. Det sparar oss från att behöva tråd dem själva.
* Nyckel De studsar: Mekaniska nycklar Stäng eller öppna renlig. De studsar snabbt mellan öppna och slutna stater över en relativt lång tidsperiod (miiliseconds). Vi löste detta problem genom att filtrera de viktigaste händelserna i programvara. Sätt helt enkelt vi inte erkänner en nyckel upp/ner händelsen tills denna stat har bestått i växeln för vissa antal skanningar. Vi kan ställa det numret upp eller ned för att göra det viktiga mindre eller mer "känsligt".
Resurser:
En intressant diskussion om viktiga scanning och anslagsdynamiken sensing på kommersiella tangentbord.
http://www.openmusiclabs.com/Learning/Digital/Input-Matrix-scanning/keyboard/
Stora Piano Firmware. Tangentbord matris drivrutin.
https://github.com/Deadsy/bigpiano/BLOB/Master/src/Key.cpp
https://github.com/Deadsy/bigpiano/BLOB/Master/src/Key.h