README.md 9.25 KB
Newer Older
Jake Read's avatar
Jake Read committed
1
# Squid Works: Distributed Dataflow Machine Controllers
Jake Read's avatar
1st  
Jake Read committed
2

Jake Read's avatar
typo    
Jake Read committed
3
![explainer](video/squidcut-july2019-explainer-1m30s-enc.mp4)
Jake Read's avatar
Jake Read committed
4

Jake Read's avatar
planner    
Jake Read committed
5
6
7
8
**Status 2019/11/13**

![works](2019-11-13_saturn-works.mp4)

Jake Read's avatar
Jake Read committed
9
**Status 2019/07/18**
Jake Read's avatar
1st  
Jake Read committed
10

Jake Read's avatar
Jake Read committed
11
The project is ongoing. Managers exist and run dataflow programs in Node, in the Brower, and in Embedded CPP. Each manager is now essentially complete. Network serialization algorithms are written, as is a scheme for program description via sequential messaging.
Jake Read's avatar
Jake Read committed
12

Jake Read's avatar
Jake Read committed
13
Largely, work is ongoing in application development, and in completing cuttlefish's heirarchichal tools like route building and system restore / save. Work is also ongoing in networking, and many serialization types remain unwritten, but will be filled in as applications call for them...
Jake Read's avatar
Jake Read committed
14

Jake Read's avatar
doc jog    
Jake Read committed
15
16
**Jogging for One Motor via direct USB**

Jake Read's avatar
Jake Read committed
17
![motors](video/squidworks-2019-07-18-motors.mp4)
Jake Read's avatar
1st  
Jake Read committed
18

Jake Read's avatar
doc jog    
Jake Read committed
19
That's great, and here's a screenshot and video of running this system through a 2nd link (browser -websocket-> node -usb-> embedded (router) -rj45uart-> embedded (motor))
Jake Read's avatar
Jake Read committed
20
21
22
23
24

![L4 Graph](images/2019-07-19-systemone.png)

![L4 Video](video/2019-07-18-systemone.mp4)

Jake Read's avatar
doc jog    
Jake Read committed
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
**Jogging 3DOF w/ 4 Motors**

![3dofjog](video/squidworks-2019-07-21-4axjog.mp4)

The program runs keystroke events from the browser (that pink box, a collector), down through a websocket to node.js (nautilus), where they are used to run three jogging hunks. Each jogging hunk runs an output / input loop, sending moves to each motor designating how many steps are to be taken during each time interval. Steppers run clocked interrupt intervals (in this case, at 20ms per clock) and execute as many steps in each interval, returning those increments back upstream once they're complete.

*L1*

![l1](images/2019-07-21-l1.png)

*L2*

![l1](images/2019-07-21-l1.png)

*L3*

![l1](images/2019-07-21-l3.png)

*L4*

![l1](images/2019-07-21-l4.png)

Jake Read's avatar
Jake Read committed
47
48
## What it Is

Jake Read's avatar
Jake Read committed
49
The **Squid Works** project is a bundle of modular hardware and software resources for the development of Distributed Dataflow Machine Controllers: a class of controllers that use dataflow programming across network links to orchestrate global control across heterogeneous computing.
Jake Read's avatar
Jake Read committed
50

Jake Read's avatar
Jake Read committed
51
This means that *adding and removing hardware to a system is easy, and possible.* It also means that *re-writing machine controllers,* to accept new inputs, or deliver new outputs (material, or feedback) is easy. Machine controllers are transparent: their operating principles are obvious to their users, and so intelligent intervention (and modification!) of controllers is possible. We can re-use algorithms and processes that we have developed across many machine instantiations, and we can build custom systems with less overhead. Digital tools are pliable again (soon), and under our control.
Jake Read's avatar
Jake Read committed
52
53

![atkapi](images/machine-with-atkapi.jpg)
Jake Read's avatar
1st  
Jake Read committed
54

Jake Read's avatar
Jake Read committed
55
### Contexts
Jake Read's avatar
Jake Read committed
56

Jake Read's avatar
Jake Read committed
57
Each of the computers participating in the control of these machines runs a *context* - contexts, while written in different languages and running on different platforms, share a set of messages they can use to describe their internals to one another - and they run the same *execution model* internally. This is the (simple) reconfiguration that allows us to build controllers whose execution can be understood (and modified) cohesively, despite their operation across a network, in physical space.
Jake Read's avatar
Jake Read committed
58

Jake Read's avatar
Jake Read committed
59
[Cuttlefish](https://gitlab.cba.mit.edu/squidworks/cuttlefish), for the browser, also serves visual representations of its own dataflow graphs, as well as dataflow across a network. This allows us to visualize, interact with, and build and edit distributed programs.
Jake Read's avatar
Jake Read committed
60

Jake Read's avatar
Jake Read committed
61
[Nautilus](https://gitlab.cba.mit.edu/squidworks/nautilus), for node.js, can run on servers and on local hardware. This is especially handy when we need to hook up to hardware resources like usb ports, etc. Its internals are directly scraped from cuttlefish.
Jake Read's avatar
Jake Read committed
62

Jake Read's avatar
Jake Read committed
63
[Ponyo](https://gitlab.cba.mit.edu/squidworks/ponyo), the smallest fish (and queen of the sea), runs dataflow graphs on embedded microcontrollers. At the moment this is limited to the ATSAMD51J19, a 120MHz Arm M4F. It connects to nautilus via usb links, and to other fishes via a very-fast-uart link that includes a synchronization line. Ponyo is very much under development.
Jake Read's avatar
Jake Read committed
64

Jake Read's avatar
Jake Read committed
65
### Circuits
Jake Read's avatar
Jake Read committed
66

Jake Read's avatar
Jake Read committed
67
At the end of the day, current moves through coils, voltages are read and delivered, etc. These machines aren't going to operate themselves (or, ) - so these are the hardware tools we use to make them dance.
Jake Read's avatar
1st  
Jake Read committed
68

Jake Read's avatar
Jake Read committed
69
![endpoints](images/endpoints.jpg)
Jake Read's avatar
Jake Read committed
70

Jake Read's avatar
Jake Read committed
71
[ATSAMD51 Motherboard](https://gitlab.cba.mit.edu/squidworks/motherboard-atsamd51) is a host to Ponyo, boasting a 40-pin (30 IO, GND, 5V and 3V3 lines) GPIO 'port'. This connects to daughter boards;
Jake Read's avatar
1st  
Jake Read committed
72

Jake Read's avatar
Jake Read committed
73
[Stepper Motor Daughterboard](https://gitlab.cba.mit.edu/squidworks/daughterboard-stepper) uses a TMC262 gate driver to drive two discrete H-Bridges, current chopping excited stepper motor coils. Spins those motors. Includes a home for an AS5047 encoder if I ever find time to close that loop.
Jake Read's avatar
Jake Read committed
74

Jake Read's avatar
Jake Read committed
75
76
[H-Bridge Daughterboard](https://gitlab.cba.mit.edu/squidworks/daughterboard-hbridge) uses an A4955 gate driver to drive one discrete H-Bridge, with a sense resistor for closed loop current control, or optional hardware current chopping. The board can also be used to drive one or two heavy dc loads, like heating elements. Includes an SPI breakout port for an encoder, or fancy thermometer, etc.

Jake Read's avatar
Jake Read committed
77
[Router Daughterboard](https://gitlab.cba.mit.edu/squidworks/daughterboard-router) adds four (4) very-fast-uart (codename VFP) links to the motherboard, establishing system hubs, etc. These can be chained / etc - there is no graph size limit.
Jake Read's avatar
Jake Read committed
78

Jake Read's avatar
Jake Read committed
79
80
81
[Power Distribution Boards](https://gitlab.cba.mit.edu/squidworks/pdbs) are handy circuits for bussing power (separate from network) around a machine.

[SPI Daughters](https://gitlab.cba.mit.edu/squidworks/spies) are small circuits used to locate sensors off board, i.e. the encoder for brushless servos and spindles.
Jake Read's avatar
Jake Read committed
82

Jake Read's avatar
Jake Read committed
83
**Planned Endpoints** include a DC motor driver and BLDC motor driver, both exist in revisions for earlier architectures. Also including an Ultrasonic driver. Many of these boards are just variations on the h-bridge, so there will be some attempt to anneal towards generic power control for i.e. heating, melting, solenoid switching, etc. Sensing is another topic.
Jake Read's avatar
Jake Read committed
84

Jake Read's avatar
Jake Read committed
85
## Machines Running DDMCs
Jake Read's avatar
Jake Read committed
86

Jake Read's avatar
Jake Read committed
87
88
89
90
91
92
93
 - [Little Rascal](https://gitlab.cba.mit.edu/jakeread/littlerascal)
 - [Mother Mother: a Machine Generalist](https://gitlab.cba.mit.edu/jakeread/mothermother)
 - [Small Stress and Strain Machine (uSSM)](https://gitlab.cba.mit.edu/jakeread/ussm)
 - [*A Machine* for playing *Music for Pieces of Wood* by Steve Reich by Jake Read](https://gitlab.cba.mit.edu/jakeread/reich)
 - [MPVMachine](https://gitlab.cba.mit.edu/jakeread/mpvmachine)
 - [SmallGantries](https://gitlab.cba.mit.edu/jakeread/smallgantries)
 - [ClayStacker](https://gitlab.cba.mit.edu/jakeread/claystack)
Jake Read's avatar
1st  
Jake Read committed
94

Jake Read's avatar
Jake Read committed
95
(Most of these machines are built with parametric designs for their constituent components, that project is here: [RCT Gantries](https://gitlab.cba.mit.edu/jakeread/rctgantries)).
Jake Read's avatar
1st  
Jake Read committed
96

Jake Read's avatar
doc    
Jake Read committed
97
# Usage
Jake Read's avatar
Jake Read committed
98

Jake Read's avatar
doc    
Jake Read committed
99
100
## Wiring

Jake Read's avatar
Jake Read committed
101
### Powering Distribution
Jake Read's avatar
Jake Read committed
102

Jake Read's avatar
Jake Read committed
103
The network cables don't carry any power, just four pairs of differential signals. So each board needs a power connection as well. I am becoming partial to XT30 connectors, and the power-top board [in here](https://gitlab.cba.mit.edu/squidworks/pdbs) has one of those included, but there are no rules.
Jake Read's avatar
Jake Read committed
104

Jake Read's avatar
Jake Read committed
105
106
I have a small set of power distribution boards:

Jake Read's avatar
Jake Read committed
107
[PDBs](https://gitlab.cba.mit.edu/squidworks/pdbs)
Jake Read's avatar
Jake Read committed
108
109
110

I hook these up end-to-end to make blocks of just-the-kind of power splitter, etc, that I want.

Jake Read's avatar
Jake Read committed
111
The boards should all share a ground, but can run on different voltages of input power. Most will take 24v on two M3 screw-mounts - I use eye terminals soldered to 18ga wire to deliver power.
Jake Read's avatar
Jake Read committed
112

Jake Read's avatar
Jake Read committed
113
The router can also accept power from a USB device. If you're powering it over USB, *do not* also power it via 24v.
Jake Read's avatar
Jake Read committed
114
115
116

Last thing, don't power your supply on before you go to screw power connections onto the boards. Wire them up, and then switch on.

Jake Read's avatar
Jake Read committed
117
### Network Cables
Jake Read's avatar
Jake Read committed
118

Jake Read's avatar
Jake Read committed
119
At a bare minimum, you're going to be hooking these things up to power, and to each other (network).
Jake Read's avatar
doc    
Jake Read committed
120

Jake Read's avatar
Jake Read committed
121
122
 - network cables can be made two ways: only one is correct - *rj45 tabs should be on the same side of the ribbon cable* i.e. the cable is a 'straight through' type, not a crossover. this means that tx meets rx, etc.
 - the transmit / receive ports are RS-485 Differential Driven, meaning there is no common gnd connection between boards besides the power bus.
Jake Read's avatar
doc    
Jake Read committed
123
124
125
126
127
128

The connectors I use are called 'RJ45' Jacks and Plugs. These are standard for Ethernet, but also 'generally useful'. This is not ethernet, but these *are* RJ45. It's 8 wires, and in our case that's four differential pairs - two duplex lines on each side.

One cool thing about RJ45 is the modularity of the cables. We can use commodity crimping tools to make our own lengths:
 - one side cuts, one side strips. use both at the same time to get the right length of stripped wire
 - use the '8p' crimp, note the tab direction in the crimp
Jake Read's avatar
Jake Read committed
129
 - pinch! the plug has a plastic tab inside that should come down to meet the wire jacket
Jake Read's avatar
doc    
Jake Read committed
130
131
132

![rj45 video](images/rj45-assembly.mp4)

Jake Read's avatar
Jake Read committed
133
134
135
```
make sure those tabs are on the same side of the flat cable
```
Jake Read's avatar
doc    
Jake Read committed
136
137
138

![rj45](images/rj45-tabs.jpg)

Jake Read's avatar
Jake Read committed
139
## Software
140

Jake Read's avatar
Jake Read committed
141
Very in-flux, pls check back soon.
142

Jake Read's avatar
doc    
Jake Read committed
143
## [Firmware -> XMEGAs](reproduction/firmware.md)
Jake Read's avatar
Jake Read committed
144

Jake Read's avatar
doc    
Jake Read committed
145
## [Circuit Reference](reproduction/circuits.md)