27 Steps
This is a traveling peace pavilion in honor of Nelson Mandela's 27 years in prison. It is a walk for peace. The pavilion consists of 2 pyramid forms that are parted to allow for a central walkway - the 27 Steps. Accompanying them is a music soundtrack, lights, and a people counter.
This was originally constructed for the 2016 Market Street Prototyping Festival (sponsored by SF City Planning and Yerba Buena Center for the Arts). We hope you join us on this journey and continue the steps to peace in other cities.
Estimated Building Time:
3 months (2-3 people)
Step 1 - Materials (Basic Structure)
Pyramid Frame:
- Stainless Steel threaded rods (3/4" in diameter)
- (6) 8'-0" long rods
- (6) 11'-3" long rods
- (12) Stainless Steel Nyloc Nut (Interior Diameter ¾”)
- (12) Hex Nut
- (8) Stainless Steel Custom Connection Plate ¼” thick
- (6) A Stainless Steel Custom Steel Plate- Type A, see diagram above
- (2) A Stainless Steel Custom Steel Plate- Type B, see diagram above
Fishing Line:
combination of -
- 1 (large) spool: 60 Gauge
- 1 (large) spool: 50 Gauge
- 12 (small) spool: 40 Gauge
Total Fishing Line: Approx. 3 miles
Step 2 - Materials (Technology)
Lights:
- (2) LED Flood Lights (10W RGB w/ remote control)
- (54) LED pixels 27 on each vertical 8’-0” stainless steel rod
- 63’-0” length of 10 gauge black cable
- 20’-0” length of 20 black gauge cable
Processors:
- Processor for the LED Pixels:
- (1) Arduino Uno
- (4) screw terminals
- (4) 3-pin cables
- custom 3-pin connectors attached to arduino (see image above) - this in place of the breadboard for ease of connections
·
- Processor for the People Counter
- (1) Raspberry Pi
Sensors:
-
(1) PIR Sensor for the LED Lights (with a 4-pin terminal)
-
(1) Infra-Red Sensor for the Ticker
Step 3: Materials (Sound)
Sound:
- (1) Speakers
- (1) Auxiliary cable (~12” or less)
- (1) Auxiliary cable (25’)
- (1) Earphone splitter
- (1) Music Player*
- (1) Hotspot*
*hotspot and music player can be through one smart phone.
Step 4: Tools
You may need the following tools along the way.
- (1) Wrench
- (1) Small screwdriver (sensors)
- (1) Scissors
- (1) Power strip (min. 4-5 plugs)
- (1) 3-prong extension cord (total of 25')
- (1) soldering iron and filament
- (1) wire stripper
Step 5: Process (Building Structure)
Pyramid structure:
- Place Connection Type B in position:
- Roll (1) Hex Nut on an 8’-0” Threaded Stainless Steel Rod.
- Insert (1) 8’-0” Threaded Stainless Steel Rod in Connection B at Vertical.
- Fasten Nylock Bolt at the Bottom with Wrench.
- Roll (1) Hex Nut on an 8’-0” Threaded Stainless Steel Rod.
- Insert (1) 8’-0” Threaded Stainless Steel Rod in Connection B at Horizontal.
- Fasten Nylock Bolt at the Bottom with Wrench
- Roll (1) Hex Nut on an 8’-0” Threaded Stainless Steel Rod.
- Insert (1) 8’-0” Threaded Stainless Steel Rod in Connection B at Horizontal.
- Fasten Nylock Bolt at the Bottom with Wrench.
·
- Place Connection Type A in position:
- Roll (1) Hex Nut on an 8’-0” Threaded Stainless Steel Rod
- Insert (1) 11’-3” Threaded Stainless Steel Rod in Connection B at angle.
- Fasten Nylock Bolt at the Bottom with Wrench.
- Roll (1) Hex Nut on an 8’-0” Threaded Stainless Steel Rod.
- Insert (1) 8’-0” Threaded Stainless Steel Rod in Connection B at Horizontal.
- Fasten Nylock Bolt at the Bottom with Wrench.
- Roll (1) Hex Nut on an 8’-0” Threaded Stainless Steel Rod.
- Insert (1) 11’’-3” Threaded Stainless Steel Rod in Connection B at Horizontal.
- Fasten Nylock Bolt at the Bottom with Wrench.
-
Repeat Connection Type A at other locations.
Step 6: Weave + Lights
Weave:
- Weave Fishing Line over Pyramid Steel Frame.
- The internal pattern is woven in straight lines.
- The external pattern is intentionally kept random.
- The density of the pattern is kept at about 70%.
Lights:
- One LED Purple flood light is mounted on the floor at Connection Type A at Pyramid 1 and connected to power source.
- One LED Purple flood light is mounted on the floor at Connection Type B at Pyramid 2 and connected to power source.
Step 7: Interactive Components (moving LED)
LED pixels:
- cut 162 segments of 20-guage cables (3" in length)
- solder three 3-inch 20-gauge cable to the LED pixels at the designated connections (ground, data, power)
- continue until a chain of 27 are attached together
- 27 LED Pixel String is mounted on 8’-0” tall vertical rods, 3” apart at Pyramid 1.
- cut (3) 10-gauge cables at lengths of 8'-6"
- align the 8’-6” cable along the bottom leg of Pyramid 1.
- on one end, solder the connection between the 20-gauge cable to the 10-gauge cable (make sure to label the ground, data, power)
- on the other end, screw 10-gauge cables to the respective slots in a screw terminal (ground, data, power)
- plug the 3-pin cable to the designated slot on screw terminal
- solder another string of 27 LED pixels (repeat above steps for Pyramid 2)
- connect the last LED pixel to three more 20-gauge cables
- screw these cables into their respective slots in another screw terminal
- connect one 3-pin cable from the first string of LEDs to terminal D5 on the arduino
- connect the other 3-pin cable from the second string of LEDs to terminal D6 on the arduino
- screw 20-gauge cables to infrared sensor's screw terminal
- secure 3 cables between infrared screw terminal and a 3-pin cable
- connect the 3-pin cable to terminal A1 on the Arduino
- connect arduino to computer
- install necessary program for arduino to run
- copy/paste the code (shown on next step) and send data to Arduino (See below)
- Unplug Arduino from computer and connect it to the power source.
Step 8: Interactive Components (moving LED Lights)
Interactive LED code:
copy/paste the following code for the lights to work (make sure the LED pixels are protected and not in contact with any other metal, otherwise it will short-circuit)
// 27 Steps &
Purple Rain
#include
#ifdef __AVR__
#include
#endif
// Connect LEDs to pins. You can choose. We chose 5 and 6.
#define PIN1 5
#define PIN2 6
// How many NeoPixels are attached to one LED strand
#define NUM_PIXELS 27
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
// We will set up three of these, one for each strand of lights
Adafruit_NeoPixel pyr1(NUM_PIXELS, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pyr2(NUM_PIXELS, PIN2, NEO_GRB + NEO_KHZ800);
// Other global variables
int lastZone = 0;
int lightIndex = -1; // the currently lit pixel; -1 means none
bool raining = false;
// This runs once on startup
void setup() {
pyr1.begin();
pyr2.begin();
Serial.begin(9600); // Listen on analog at 9600
}
// This runs repeatedly
void loop() {
// PART 1: sensing
readSensor();
// PART 2: drawing
drawPixels();
// sleep a bit
delay(10);
}
// Increases the lit LED by one position and makes purple rain when it reaches the top.
void stepUp() {
// step up: turn on next LED
if (lightIndex < NUM_PIXELS) {
lightIndex += 1;
// last step: do raining
} else {
raining = true;
for (lightIndex = NUM_PIXELS - 1; lightIndex >= 0; lightIndex--) {
drawPixels();
delay(50);
}
raining = false;
lightIndex = -1; //set back to all off
drawPixels();
}
}
// read the sonar sensor if the trigger is in the near zone advance a step
void readSensor() {
int anVolt = analogRead(0);
float inches = anVolt*5.0*1000*0.1/1023.0; //converting to inches 10mV per inch
int zone = 1;
if (inches > 8 * 4) { // this is the threshold for making a step
zone = 2;
}
Serial.print("sensor: ");
Serial.print(inches);
Serial.print(", zone: ");
Serial.println(zone);
if (zone == 1 && zone != lastZone) { // step up if moved into near zone from far zone
stepUp();
}
lastZone = zone; // remember the zone for next time
}
// make all pixels black except lightIndex (active pixel)
Step 9: Interactive Component (People Counter)
People Counter Code (raspberry pi)
- connect the PIR sensor to a 3-pin cable
- connect 3-pin cable to raspberry pi
(code execution is similar process to arduino, but with raspberry pi)
// OnOff handles io
between the Raspberry Pi's GPIO (general purpose input/output) and Node
var gpio = require('onoff').Gpio;
var request = require('request');
var low = require('lowdb')
// Initialize a local database
const db = low('db.json')
db.defaults({ count: [] }).value();
// Select the output of the Parralax infared sensor.
var pin = 17;
var sensor = new gpio(pin, 'in', 'both');
last_steps = [];
interval = 1 * 60 * 1000; // update every 5 mins
// Listen to the sensor GPIO input. If the value is 1, then movement has been sensed.
sensor.watch(function(err, value) {
if (value == 1) {
update_counter();
}
});
function update_counter() {
var count = db.get('count').value();
var steps = count.length;
var time = new Date().getTime();
var record = {};
record[time] = steps;
db.get('count')
.push(record)
.value()
// Update the database with the latest count
last_steps.push(record);
}
// Send the latest statistics to a Heroku server every
setInterval(function(){
request({
url: 'http://take27steps.herokuapp.com/set',
method: "POST",
headers: { "content-type": "application/json" },
json: {"count": last_steps}
}, function (error, resp, body) {
if (!error && resp.statusCode == 200) {
console.log("Successful response: ", body);
last_steps = [];
} else {
console.log("Error sending response: ", error);
}
})
}, interval);
Step 10: Sound
Sound:
- One Speaker is placed at connection A at Pyramid 1 and connected to power source.
- One Speaker is placed at connection B at Pyramid 2 and connected to power source.
- Speaker at Pyramid 2 is hard wired to speaker at Pyramid 1.
- Speaker at Pyramid 1 is connected to music player.
Step 11: Overall Layout
Overall Plan Layout of all Components.