I am a Senior Software Developer at Adobe Inc.
I was Research Director of UC Berkeley's Center for New Music and Audio Technologies (CNMAT)
I tested this CMOS 555 breadboard version.
This informed suggested improvements to Textilo to Martin who came up with a textile layout which we used to teach during the audio workshop of e-textile Spring Break: http://youtube.com/HdMsk6c3WGw
Alex blogged a great student perspective of this workshop.
I also brought along some PCB's which can be sewed to or pressed on Lego baseboards.
To address the need for more interaction room for the fingers I suggested to Martin to look at a radiating octagonal design. He prototyped this at the camp in copper:
Nicole Messier also picked up on this design pattern and made a 555 oscillator based FM Radio transmitter:
A walk through the schematic may be helpful.
Now what makes things productively confusing is the absence of resistors in the story. These are provided by your fingers or additional LDRs or piezoresistive fabrics. The layout is designed to give you room to put fingers in the useful places for the two popular ways of making the 555 timer oscillator. One way creates square waves. The other makes controllable pulse waves. I capture these possibilities on the following schematic which has a special notation for where you add variable resistance:
Rectangular grids are dominant forms in electronics and textiles. Triaxial grids have not been explored in e-textile work so this breadboard is offered to begin these explorations. Triaxial grids sample the plane with higher density and the availability of whug connections as well as warp and woof simplifies circuits by providing a natural power/ground/signal triple.
The basic 3x3x3 configuration is made by sticking conductive copper tape on strips of basket-weaving reed. This is intended to evoke the thousands of year old traditions of basket weaving and invite 3-d explorations.
Card stock is easier to procure and stick the tape to. The idea is to use a substrate that won’t burn when you solder to the tape. Substitute fabric ribbons if you are going to sew to the breadboard instead.
I used pins to lock down two of parallel rows of 3 strips and then slid in the final row, guiding them over and under as required. The example has charlieplexed LED’s soldered on but this is just to start you thinking about how you might use such a dense array of available conductors.
Consider replacing a central strip with one with copper tape on both sides. Work out which conductors are then connected. Now consider sandwiching piezoresistive fabric between intersecting conductors. Can you use this to read an array of pressures sensors?
References/Inspirations:
core memory beading
triaxial textiles
basket weaving
multitouch
Materials: Cane, copper tape
Techniques: Weaving
The provided swatches will just be the breadboard. Illustrated are some LED’s controlled by Charlieplexing.
Circuit Diagram:
http://www.pcbheaven.com/wikipages/Charlieplexing/
Overhand knot in a strip of carbon-loaded paper becomes an FSR that can be easily connected to your favorite microcontroller (in this case a teensy running with the Arduino C++ tool chain).
This is part of my Fingerphone instrument.
How many interactions/games can you think of with this platform?
There are 3 in the video:
Hand in the air: flashes (because at a party you want to signal that you want someone to talk to?).
Horizontal hand: always illuminates the top LED's whatever rotation your arm has ("smart flashlight")
Spins of the wrist: a blob spins around in the same direction and slows to a stop.
For a commercially produced inertial-sensing band keep an eye out on getymyo
/* * OSCuino Rough * Copyright 2009 Adrian Freed. All Rights Reserved * Read and send the state of the Arduino pins to a host * using the recommended Open Sound Control (OSC) serial wrapping: slip * * version 0.95 tested on teensy 2.0, teensy++ 1.0, lilypad, basic 168 Arduino lilypad. The Arduino Mega works if you build with the latest release candidate Arduino. * */ #include <avr/pgmspace.h> // The following OSC API is temporary. Although it generates valid OSC packets // it does not use OSC best practices or provide complete OSC features // In particular there are no time tags (no standard clock on Arduino) // or bundles and this api only provides for vectors of the same OSC type // these issues will be addressed in a C++ library const byte eot = 0300; const byte slipesc = 0333; const byte slipescend = 0334; const byte slipescesc = 0335; void oscoutbyte(byte b) { if(b==eot){ Serial.print(slipesc); Serial.print(slipescend); } else if(b==slipesc) { Serial.print(slipesc); Serial.print(slipescesc); } else Serial.print(b, BYTE); } void oscout10b(unsigned int b) { Serial.print(0, BYTE); Serial.print(0, BYTE); oscoutbyte((b>>2)); oscoutbyte((b<<6)); } void oscoutword( int b) { Serial.print(0, BYTE); Serial.print(0, BYTE); // Serial.print(2); oscoutbyte((b>>8)); oscoutbyte((b>>0)); } void oscoutlong(unsigned long b) { oscoutbyte((b>>24)); oscoutbyte((b>>16)); oscoutbyte((b>>8)); oscoutbyte((b>>0)); } void oscoutfloat(float f) { union { float f; unsigned long l; } x; x.f = f; oscoutlong(x.l); } void sendOSCempty(char *name, char *s) { Serial.print(eot,BYTE); Serial.print(name); int n =0; while( *name++) ++n; n %= 4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); Serial.print(","); n = 1; while(*s) Serial.print(*s++), ++n; n %= 4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); Serial.print(eot,BYTE); } void sendOSCints(char *name, int *integers, int length) { Serial.print(eot,BYTE); Serial.print(name); int n =0; while( *name++) ++n; n %= 4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); Serial.print(","); for(int i=0;i<length;++i) { Serial.print("i"); } n = (length+1 )%4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); for(int i=0;i<length;++i) oscoutword(integers[i]); Serial.print(eot,BYTE); } void sendOSCfloats(char *name, float *floats, int length) { sendOSCthings( name, 'f', (uint32_t *) floats, length); } void sendOSCthings(char *name, char type, uint32_t *data, int length) { Serial.print(eot,BYTE); Serial.print(name); int n =0; while( *name++) ++n; n %= 4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); Serial.print(","); for(int i=0;i<length;++i) { Serial.print(type); } n = (length+1 )%4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); for(int i=0;i<length;++i) oscoutlong(data[i]); Serial.print(eot,BYTE); } static inline void sendOSClongs(char *name, long *longs, int length) { sendOSCthings(name,'i', (uint32_t *)longs, length); } void sendOSCbits(char *name, boolean *bits, int length) { Serial.print(eot,BYTE); Serial.print(name); int n =0; while( *name++) ++n; n %= 4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); Serial.print(","); n = 1; for(int i=0;i<length;++i) Serial.print(bits[i]?'T':'F'),++n; n %= 4; n = 4-n; //Serial.print(n); while(n--) Serial.print(0,BYTE); Serial.print(eot,BYTE); } static PROGMEM float floattable[1024] = { 0.000000, 0.000978, 0.001955, 0.002933, 0.003910, 0.004888, 0.005865, 0.006843, 0.007820, 0.008798, 0.009775, 0.010753, 0.011730, 0.012708, 0.013685, 0.014663, 0.015640, 0.016618, 0.017595, 0.018573, 0.019550, 0.020528, 0.021505, 0.022483, 0.023460, 0.024438, 0.025415, 0.026393, 0.027370, 0.028348, 0.029326, 0.030303, 0.031281, 0.032258, 0.033236, 0.034213, 0.035191, 0.036168, 0.037146, 0.038123, 0.039101, 0.040078, 0.041056, 0.042033, 0.043011, 0.043988, 0.044966, 0.045943, 0.046921, 0.047898, 0.048876, 0.049853, 0.050831, 0.051808, 0.052786, 0.053763, 0.054741, 0.055718, 0.056696, 0.057674, 0.058651, 0.059629, 0.060606, 0.061584, 0.062561, 0.063539, 0.064516, 0.065494, 0.066471, 0.067449, 0.068426, 0.069404, 0.070381, 0.071359, 0.072336, 0.073314, 0.074291, 0.075269, 0.076246, 0.077224, 0.078201, 0.079179, 0.080156, 0.081134, 0.082111, 0.083089, 0.084066, 0.085044, 0.086022, 0.086999, 0.087977, 0.088954, 0.089932, 0.090909, 0.091887, 0.092864, 0.093842, 0.094819, 0.095797, 0.096774, 0.097752, 0.098729, 0.099707, 0.100684, 0.101662, 0.102639, 0.103617, 0.104594, 0.105572, 0.106549, 0.107527, 0.108504, 0.109482, 0.110459, 0.111437, 0.112414, 0.113392, 0.114370, 0.115347, 0.116325, 0.117302, 0.118280, 0.119257, 0.120235, 0.121212, 0.122190, 0.123167, 0.124145, 0.125122, 0.126100, 0.127077, 0.128055, 0.129032, 0.130010, 0.130987, 0.131965, 0.132942, 0.133920, 0.134897, 0.135875, 0.136852, 0.137830, 0.138807, 0.139785, 0.140762, 0.141740, 0.142717, 0.143695, 0.144673, 0.145650, 0.146628, 0.147605, 0.148583, 0.149560, 0.150538, 0.151515, 0.152493, 0.153470, 0.154448, 0.155425, 0.156403, 0.157380, 0.158358, 0.159335, 0.160313, 0.161290, 0.162268, 0.163245, 0.164223, 0.165200, 0.166178, 0.167155, 0.168133, 0.169110, 0.170088, 0.171065, 0.172043, 0.173021, 0.173998, 0.174976, 0.175953, 0.176931, 0.177908, 0.178886, 0.179863, 0.180841, 0.181818, 0.182796, 0.183773, 0.184751, 0.185728, 0.186706, 0.187683, 0.188661, 0.189638, 0.190616, 0.191593, 0.192571, 0.193548, 0.194526, 0.195503, 0.196481, 0.197458, 0.198436, 0.199413, 0.200391, 0.201369, 0.202346, 0.203324, 0.204301, 0.205279, 0.206256, 0.207234, 0.208211, 0.209189, 0.210166, 0.211144, 0.212121, 0.213099, 0.214076, 0.215054, 0.216031, 0.217009, 0.217986, 0.218964, 0.219941, 0.220919, 0.221896, 0.222874, 0.223851, 0.224829, 0.225806, 0.226784, 0.227761, 0.228739, 0.229717, 0.230694, 0.231672, 0.232649, 0.233627, 0.234604, 0.235582, 0.236559, 0.237537, 0.238514, 0.239492, 0.240469, 0.241447, 0.242424, 0.243402, 0.244379, 0.245357, 0.246334, 0.247312, 0.248289, 0.249267, 0.250244, 0.251222, 0.252199, 0.253177, 0.254154, 0.255132, 0.256109, 0.257087, 0.258065, 0.259042, 0.260020, 0.260997, 0.261975, 0.262952, 0.263930, 0.264907, 0.265885, 0.266862, 0.267840, 0.268817, 0.269795, 0.270772, 0.271750, 0.272727, 0.273705, 0.274682, 0.275660, 0.276637, 0.277615, 0.278592, 0.279570, 0.280547, 0.281525, 0.282502, 0.283480, 0.284457, 0.285435, 0.286413, 0.287390, 0.288368, 0.289345, 0.290323, 0.291300, 0.292278, 0.293255, 0.294233, 0.295210, 0.296188, 0.297165, 0.298143, 0.299120, 0.300098, 0.301075, 0.302053, 0.303030, 0.304008, 0.304985, 0.305963, 0.306940, 0.307918, 0.308895, 0.309873, 0.310850, 0.311828, 0.312805, 0.313783, 0.314761, 0.315738, 0.316716, 0.317693, 0.318671, 0.319648, 0.320626, 0.321603, 0.322581, 0.323558, 0.324536, 0.325513, 0.326491, 0.327468, 0.328446, 0.329423, 0.330401, 0.331378, 0.332356, 0.333333, 0.334311, 0.335288, 0.336266, 0.337243, 0.338221, 0.339198, 0.340176, 0.341153, 0.342131, 0.343109, 0.344086, 0.345064, 0.346041, 0.347019, 0.347996, 0.348974, 0.349951, 0.350929, 0.351906, 0.352884, 0.353861, 0.354839, 0.355816, 0.356794, 0.357771, 0.358749, 0.359726, 0.360704, 0.361681, 0.362659, 0.363636, 0.364614, 0.365591, 0.366569, 0.367546, 0.368524, 0.369501, 0.370479, 0.371457, 0.372434, 0.373412, 0.374389, 0.375367, 0.376344, 0.377322, 0.378299, 0.379277, 0.380254, 0.381232, 0.382209, 0.383187, 0.384164, 0.385142, 0.386119, 0.387097, 0.388074, 0.389052, 0.390029, 0.391007, 0.391984, 0.392962, 0.393939, 0.394917, 0.395894, 0.396872, 0.397849, 0.398827, 0.399804, 0.400782, 0.401760, 0.402737, 0.403715, 0.404692, 0.405670, 0.406647, 0.407625, 0.408602, 0.409580, 0.410557, 0.411535, 0.412512, 0.413490, 0.414467, 0.415445, 0.416422, 0.417400, 0.418377, 0.419355, 0.420332, 0.421310, 0.422287, 0.423265, 0.424242, 0.425220, 0.426197, 0.427175, 0.428152, 0.429130, 0.430108, 0.431085, 0.432063, 0.433040, 0.434018, 0.434995, 0.435973, 0.436950, 0.437928, 0.438905, 0.439883, 0.440860, 0.441838, 0.442815, 0.443793, 0.444770, 0.445748, 0.446725, 0.447703, 0.448680, 0.449658, 0.450635, 0.451613, 0.452590, 0.453568, 0.454545, 0.455523, 0.456500, 0.457478, 0.458456, 0.459433, 0.460411, 0.461388, 0.462366, 0.463343, 0.464321, 0.465298, 0.466276, 0.467253, 0.468231, 0.469208, 0.470186, 0.471163, 0.472141, 0.473118, 0.474096, 0.475073, 0.476051, 0.477028, 0.478006, 0.478983, 0.479961, 0.480938, 0.481916, 0.482893, 0.483871, 0.484848, 0.485826, 0.486804, 0.487781, 0.488759, 0.489736, 0.490714, 0.491691, 0.492669, 0.493646, 0.494624, 0.495601, 0.496579, 0.497556, 0.498534, 0.499511, 0.500489, 0.501466, 0.502444, 0.503421, 0.504399, 0.505376, 0.506354, 0.507331, 0.508309, 0.509286, 0.510264, 0.511241, 0.512219, 0.513196, 0.514174, 0.515152, 0.516129, 0.517107, 0.518084, 0.519062, 0.520039, 0.521017, 0.521994, 0.522972, 0.523949, 0.524927, 0.525904, 0.526882, 0.527859, 0.528837, 0.529814, 0.530792, 0.531769, 0.532747, 0.533724, 0.534702, 0.535679, 0.536657, 0.537634, 0.538612, 0.539589, 0.540567, 0.541544, 0.542522, 0.543500, 0.544477, 0.545455, 0.546432, 0.547410, 0.548387, 0.549365, 0.550342, 0.551320, 0.552297, 0.553275, 0.554252, 0.555230, 0.556207, 0.557185, 0.558162, 0.559140, 0.560117, 0.561095, 0.562072, 0.563050, 0.564027, 0.565005, 0.565982, 0.566960, 0.567937, 0.568915, 0.569892, 0.570870, 0.571848, 0.572825, 0.573803, 0.574780, 0.575758, 0.576735, 0.577713, 0.578690, 0.579668, 0.580645, 0.581623, 0.582600, 0.583578, 0.584555, 0.585533, 0.586510, 0.587488, 0.588465, 0.589443, 0.590420, 0.591398, 0.592375, 0.593353, 0.594330, 0.595308, 0.596285, 0.597263, 0.598240, 0.599218, 0.600196, 0.601173, 0.602151, 0.603128, 0.604106, 0.605083, 0.606061, 0.607038, 0.608016, 0.608993, 0.609971, 0.610948, 0.611926, 0.612903, 0.613881, 0.614858, 0.615836, 0.616813, 0.617791, 0.618768, 0.619746, 0.620723, 0.621701, 0.622678, 0.623656, 0.624633, 0.625611, 0.626588, 0.627566, 0.628543, 0.629521, 0.630499, 0.631476, 0.632454, 0.633431, 0.634409, 0.635386, 0.636364, 0.637341, 0.638319, 0.639296, 0.640274, 0.641251, 0.642229, 0.643206, 0.644184, 0.645161, 0.646139, 0.647116, 0.648094, 0.649071, 0.650049, 0.651026, 0.652004, 0.652981, 0.653959, 0.654936, 0.655914, 0.656891, 0.657869, 0.658847, 0.659824, 0.660802, 0.661779, 0.662757, 0.663734, 0.664712, 0.665689, 0.666667, 0.667644, 0.668622, 0.669599, 0.670577, 0.671554, 0.672532, 0.673509, 0.674487, 0.675464, 0.676442, 0.677419, 0.678397, 0.679374, 0.680352, 0.681329, 0.682307, 0.683284, 0.684262, 0.685239, 0.686217, 0.687195, 0.688172, 0.689150, 0.690127, 0.691105, 0.692082, 0.693060, 0.694037, 0.695015, 0.695992, 0.696970, 0.697947, 0.698925, 0.699902, 0.700880, 0.701857, 0.702835, 0.703812, 0.704790, 0.705767, 0.706745, 0.707722, 0.708700, 0.709677, 0.710655, 0.711632, 0.712610, 0.713587, 0.714565, 0.715543, 0.716520, 0.717498, 0.718475, 0.719453, 0.720430, 0.721408, 0.722385, 0.723363, 0.724340, 0.725318, 0.726295, 0.727273, 0.728250, 0.729228, 0.730205, 0.731183, 0.732160, 0.733138, 0.734115, 0.735093, 0.736070, 0.737048, 0.738025, 0.739003, 0.739980, 0.740958, 0.741935, 0.742913, 0.743891, 0.744868, 0.745846, 0.746823, 0.747801, 0.748778, 0.749756, 0.750733, 0.751711, 0.752688, 0.753666, 0.754643, 0.755621, 0.756598, 0.757576, 0.758553, 0.759531, 0.760508, 0.761486, 0.762463, 0.763441, 0.764418, 0.765396, 0.766373, 0.767351, 0.768328, 0.769306, 0.770283, 0.771261, 0.772239, 0.773216, 0.774194, 0.775171, 0.776149, 0.777126, 0.778104, 0.779081, 0.780059, 0.781036, 0.782014, 0.782991, 0.783969, 0.784946, 0.785924, 0.786901, 0.787879, 0.788856, 0.789834, 0.790811, 0.791789, 0.792766, 0.793744, 0.794721, 0.795699, 0.796676, 0.797654, 0.798631, 0.799609, 0.800587, 0.801564, 0.802542, 0.803519, 0.804497, 0.805474, 0.806452, 0.807429, 0.808407, 0.809384, 0.810362, 0.811339, 0.812317, 0.813294, 0.814272, 0.815249, 0.816227, 0.817204, 0.818182, 0.819159, 0.820137, 0.821114, 0.822092, 0.823069, 0.824047, 0.825024, 0.826002, 0.826979, 0.827957, 0.828935, 0.829912, 0.830890, 0.831867, 0.832845, 0.833822, 0.834800, 0.835777, 0.836755, 0.837732, 0.838710, 0.839687, 0.840665, 0.841642, 0.842620, 0.843597, 0.844575, 0.845552, 0.846530, 0.847507, 0.848485, 0.849462, 0.850440, 0.851417, 0.852395, 0.853372, 0.854350, 0.855327, 0.856305, 0.857283, 0.858260, 0.859238, 0.860215, 0.861193, 0.862170, 0.863148, 0.864125, 0.865103, 0.866080, 0.867058, 0.868035, 0.869013, 0.869990, 0.870968, 0.871945, 0.872923, 0.873900, 0.874878, 0.875855, 0.876833, 0.877810, 0.878788, 0.879765, 0.880743, 0.881720, 0.882698, 0.883675, 0.884653, 0.885630, 0.886608, 0.887586, 0.888563, 0.889541, 0.890518, 0.891496, 0.892473, 0.893451, 0.894428, 0.895406, 0.896383, 0.897361, 0.898338, 0.899316, 0.900293, 0.901271, 0.902248, 0.903226, 0.904203, 0.905181, 0.906158, 0.907136, 0.908113, 0.909091, 0.910068, 0.911046, 0.912023, 0.913001, 0.913978, 0.914956, 0.915934, 0.916911, 0.917889, 0.918866, 0.919844, 0.920821, 0.921799, 0.922776, 0.923754, 0.924731, 0.925709, 0.926686, 0.927664, 0.928641, 0.929619, 0.930596, 0.931574, 0.932551, 0.933529, 0.934506, 0.935484, 0.936461, 0.937439, 0.938416, 0.939394, 0.940371, 0.941349, 0.942326, 0.943304, 0.944282, 0.945259, 0.946237, 0.947214, 0.948192, 0.949169, 0.950147, 0.951124, 0.952102, 0.953079, 0.954057, 0.955034, 0.956012, 0.956989, 0.957967, 0.958944, 0.959922, 0.960899, 0.961877, 0.962854, 0.963832, 0.964809, 0.965787, 0.966764, 0.967742, 0.968719, 0.969697, 0.970674, 0.971652, 0.972630, 0.973607, 0.974585, 0.975562, 0.976540, 0.977517, 0.978495, 0.979472, 0.980450, 0.981427, 0.982405, 0.983382, 0.984360, 0.985337, 0.986315, 0.987292, 0.988270, 0.989247, 0.990225, 0.991202, 0.992180, 0.993157, 0.994135, 0.995112, 0.996090, 0.997067, 0.998045, 0.999022, 1.000000, }; static inline float floatfrom10bitint(int n) { return pgm_read_float(floattable+constrain(n,0,1023)); } inline void digitalPullup(byte pin, boolean b) { pinMode(pin, INPUT); digitalWrite(pin, b?HIGH:LOW); } #if defined(__AVR_ATmega1280__) #define MAXADC 16 const int numberOfArduinoDigitalPins=54; inline void analogPullup(byte pin, boolean b) { digitalPullup(pin+54,b); } inline void analogOutWrite(byte pin, byte b) { pinMode(pin+54, OUTPUT); digitalWrite(pin+54,b); } #else // teensy++ #if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) #define MAXADC 8 const int numberOfArduinoDigitalPins=38; inline void analogPullup(byte pin, boolean b) { pinMode(38+pin,b?INPUT_PULLUP: INPUT); } inline void analogOutWrite(byte pin, byte b) { pinMode(38+pin, OUTPUT); // change directions of an analog pin digitalWrite(38+pin,b); } #else //AT90USB1286 teensy++ #if defined(__AVR_ATmega32U4__) //teensy 2.0 #define MAXADC 12 const int numberOfArduinoDigitalPins=11; // actually the teensy 2.0 has two more non contiguously addressed (22 and 23) inline void analogPullup(byte pin, boolean b) { if(pin==11) pin = -1; // ouch read the diagram carefully! http://www.pjrc.com/teensy/pinout.html pinMode(21-pin,b?INPUT_PULLUP: INPUT); } typedef enum { endOfpinlist=-1, a0=14,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15 } pinnames; inline void analogOutWrite(byte pin, byte b) { if(pin==11) pin = -1; // ouch pinMode(21-pin, OUTPUT); // change directions of an analog pin digitalWrite(21-pin,b); } #else //6 or 8 depending #define MAXADC 8 const int numberOfArduinoDigitalPins=13; inline void analogPullup(byte pin, boolean b) { digitalPullup(pin+14,b?HIGH:LOW); } inline void analogOutWrite(byte pin, byte b) { pinMode(pin+14, OUTPUT); // change directions of an analog pin digitalWrite(pin+14,b); } #endif #endif #endif const boolean debugging = false; // send the processed data over serial console for debugging instead of OSC const boolean fulldebugging = false; // turn this on to get all the raw data in a form you can read on the serial console void setup() { Serial.begin(debugging?9600:57600); } const int dtime=0; #define BANDGAPREF 14 // special indicator that we want to measure the bandgap void loop(){ // analog inputs int adcs[MAXADC]; float fbuf[MAXADC]; int i; for(i=0;i<MAXADC;++i) analogPullup(i,false); for(i=0;i<MAXADC;++i) adcs[i] = analogRead(i); for(i=0;i<MAXADC;++i) fbuf[i] = floatfrom10bitint(adcs[i]); sendOSCfloats("/analog", fbuf, MAXADC); for(i=0;i<MAXADC;++i) analogPullup(i,true); for(i=0;i<MAXADC;++i) adcs[i] = analogRead(i); for(i=0;i<MAXADC;++i) fbuf[i] = floatfrom10bitint(adcs[i]); sendOSCfloats("/up/analog", fbuf, MAXADC); // temperature // power supply voltage // (clock rate) //digital pins boolean arduinodigitalpins[numberOfArduinoDigitalPins]; for(i=0;i<numberOfArduinoDigitalPins;++i) digitalPullup(i,false); for(i=0;i<numberOfArduinoDigitalPins;++i) arduinodigitalpins[i] = digitalRead(i); sendOSCbits("/digital", arduinodigitalpins, numberOfArduinoDigitalPins); for(i=0;i<numberOfArduinoDigitalPins;++i) digitalPullup(i,true); for(i=0;i<numberOfArduinoDigitalPins;++i) arduinodigitalpins[i] = digitalRead(i); sendOSCbits("/up/digital", arduinodigitalpins, numberOfArduinoDigitalPins); #if defined(__AVR_ATmega32U4__) Serial.send_now(); #endif #if !defined(__AVR_ATmega8__) // temperature and power supply measurement on some Arduinos // powersupply int result; // Read 1.1V reference against AVcc #if defined(__AVR_ATmega32U4__) ADMUX = 0x40 | _BV(MUX4)| _BV(MUX3) | _BV(MUX2) | _BV(MUX1); ADCSRB = 0; // ADCSRB = DEFAULT_ADCSRB | (1<<MUX5); #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega1280__) ADMUX = 0x40| _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) ; ADCSRB = 0; #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delayMicroseconds(300); // wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; #endif // analogReference(EXTERNAL); float supplyvoltage = 1.1264 *1023 / result; sendOSCfloats("/power", &supplyvoltage, 1); #if defined(__AVR_ATmega32U4__) || (!defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega8__) && !defined(__AVR_AT90USB646__) && !defined(__AVR_AT90USB1286__)) // temperature #if defined(__AVR_ATmega32U4__) ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); ADCSRB = _BV(MUX5); #else ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); #endif delayMicroseconds(200); // wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; float temp= result/1023.0; sendOSCfloats("/temperature", &temp, 1); analogReference(DEFAULT); #endif long l=micros(); sendOSClongs("/microseconds",&l,1); #if defined(__AVR_ATmega32U4__) Serial.send_now(); #endif }