picadae/control/README.md
2020-10-24 13:56:06 -04:00

84 lines
2.3 KiB
Markdown

This folder contains the _picadae_ control code.
The _picadae_ control program consists of three parts:
- _tiny_ : Keyboard solenoid driver
- _ctrl_ : Keyboard central controller
- _app_ : Monitor and command utility.
# Architecture
The keyboard control hardware consists of 8 driver boards
mounted above the solenoids on the keyboard assembly.
Each driver board has 11 key driver circuits and can
therefore control 11 piano keys. Each key driver
circuit consists of an ATtiny85 microcontroller
which controls a set of power transistors
which in turn control the state of the solenoid.
The solenoid can be in one of three states:
- off
- attack
- hold
The attack state is triggered by pulsing the
the solenoid with a fast (250 microsecond to
30 millisecond) 36 volt pulse. The duration
of the pulse determines the attack dynamic.
The hold state then holds the key down
during the sustain portion of the note.
All 88 ATtiny85 microncontrollers are attached
to a single I2C bus which is shared with
an Arduino Uno. The application computer
communicate with the Uno via
a serial connection. The Uno in turn
translates messages between the
ATtiny85 channel computers and the
application computer.
# Keyboard central controller : Arduino Uno Serial Interface
Read a register value of `<count>` bytes from channel `<i2c-addr>`
'r' <i2c-addr> <register> <count>
Write a register value of `<count>` bytes from channel `<i2c-addr>`
'w' <i2c-addr> <register> <count> <value-0> <value-1> ... <value-n>
# Keyboard solenoid driver : ATtiny85 Firmware
PWM counter frequency and period.
for each possible `div` setting
with 16 Mhz system clock.
Value | Div | Frequency | Period
------|------|-------------|-------
1 | 1 | 16 M | 62.5 n
2 | 2 | 8 M | 125 n
3 | 4 | 4 M | 250 n
4 | 8 | 2 M | 500 n
5 | 16 | 1 M | 1 u
6 | 32 | 500 K | 2 u
7 | 64 | 250 K | 4 u
8 | 128 | 125 K | 8 u
9 | 256 | 62500 Hz | 16 u
10 | 512 | 31250 Hz | 32 u
11 | 1024 | 15625 Hz | 64 u
12 | 2048 | 7812.5 Hz | 128 u
13 | 4096 | 3906.25 Hz | 256 u
14 | 8192 | 1953.125 Hz | 512 u
15 |16384 | 976.6625 Hz | 1024 u
# Monitor and command utility : Python Utility