|
@@ -0,0 +1,83 @@
|
|
1
|
+This folder contains the _picadae_ control code.
|
|
2
|
+
|
|
3
|
+The _picadae_ control program consists of three parts:
|
|
4
|
+
|
|
5
|
+- _tiny_ : Keyboard solenoid driver
|
|
6
|
+- _ctrl_ : Keyboard central controller
|
|
7
|
+- _app_ : Monitor and command utility.
|
|
8
|
+
|
|
9
|
+# Architecture
|
|
10
|
+
|
|
11
|
+The keyboard control hardware consists of 8 driver boards
|
|
12
|
+mounted above the solenoids on the keyboard assembly.
|
|
13
|
+Each driver board has 11 key driver circuits and can
|
|
14
|
+therefore control 11 piano keys. Each key driver
|
|
15
|
+circuit consists of an ATtiny85 microcontroller
|
|
16
|
+which controls a set of power transistors
|
|
17
|
+which in turn control the state of the solenoid.
|
|
18
|
+The solenoid can be in one of three states:
|
|
19
|
+
|
|
20
|
+- off
|
|
21
|
+- attack
|
|
22
|
+- hold
|
|
23
|
+
|
|
24
|
+The attack state is triggered by pulsing the
|
|
25
|
+the solenoid with a fast (250 microsecond to
|
|
26
|
+30 millisecond) 36 volt pulse. The duration
|
|
27
|
+of the pulse determines the attack dynamic.
|
|
28
|
+The hold state then holds the key down
|
|
29
|
+during the sustain portion of the note.
|
|
30
|
+
|
|
31
|
+All 88 ATtiny85 microncontrollers are attached
|
|
32
|
+to a single I2C bus which is shared with
|
|
33
|
+an Arduino Uno. The application computer
|
|
34
|
+communicate with the Uno via
|
|
35
|
+a serial connection. The Uno in turn
|
|
36
|
+translates messages between the
|
|
37
|
+ATtiny85 channel computers and the
|
|
38
|
+application computer.
|
|
39
|
+
|
|
40
|
+# Keyboard central controller : Arduino Uno Serial Interface
|
|
41
|
+
|
|
42
|
+Read a register value of `<count>` bytes from channel `<i2c-addr>`
|
|
43
|
+
|
|
44
|
+ 'r' <i2c-addr> <register> <count>
|
|
45
|
+
|
|
46
|
+Write a register value of `<count>` bytes from channel `<i2c-addr>`
|
|
47
|
+
|
|
48
|
+ 'w' <i2c-addr> <register> <count> <value-0> <value-1> ... <value-n>
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+# Keyboard solenoid driver : ATtiny85 Firmware
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+PWM counter frequency and period.
|
|
55
|
+for each possible `div` setting
|
|
56
|
+with 16 Mhz system clock.
|
|
57
|
+
|
|
58
|
+Value | Div | Frequency | Period
|
|
59
|
+------|------|-------------|-------
|
|
60
|
+ 1 | 1 | 16 M | 62.5 n
|
|
61
|
+ 2 | 2 | 8 M | 125 n
|
|
62
|
+ 3 | 4 | 4 M | 250 n
|
|
63
|
+ 4 | 8 | 2 M | 500 n
|
|
64
|
+ 5 | 16 | 1 M | 1 u
|
|
65
|
+ 6 | 32 | 500 K | 2 u
|
|
66
|
+ 7 | 64 | 250 K | 4 u
|
|
67
|
+ 8 | 128 | 125 K | 8 u
|
|
68
|
+ 9 | 256 | 62500 Hz | 16 u
|
|
69
|
+10 | 512 | 31250 Hz | 32 u
|
|
70
|
+11 | 1024 | 15625 Hz | 64 u
|
|
71
|
+12 | 2048 | 7812.5 Hz | 128 u
|
|
72
|
+13 | 4096 | 3906.25 Hz | 256 u
|
|
73
|
+14 | 8192 | 1953.125 Hz | 512 u
|
|
74
|
+15 |16384 | 976.6625 Hz | 1024 u
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+# Monitor and command utility : Python Utility
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|