PROTOTYPING

Digital Model - Attuner and Depositor on the geomorphology table

Systems Diagram - Feedback Loop of the sensing and actuation machines (Attuner; and Section Cutter-an iteration of Depositor)

extracted real-time contoured surfaces

Contoured surface from a live-digital scan

scanned_surface By Leif Es Modelo »

ROBOTIC STUDY #1

Depositor conceptual and algorithmic logic

ROBOTIC STUDY #2

PROCESS

The following are images and videos showing the process of designing, building, and testing of the robotic device:

Sketch: Initial prototyping sketch

Sketch: Initial prototyping sketch

Attuner, rendered digital model

Early Stages: Building and assembling the rows of robotic piles

Early Stages: Building and assembling the rows of robotic piles

333: 3 power supplies: 5V @ 5 Amps, powering the 3 Arduino Uno Processing Boards with 3 Adafruit 16-Channel 12-bit PWM/Servo Shield - I2C interface

333: 3 power supplies: 5V @ 5 Amps, powering the 3 Arduino Uno Processing Boards with 3 Adafruit 16-Channel 12-bit PWM/Servo Shield - I2C interface

 

Below is the code used for the actuation of the live model, Attuner.  It is a modified version provided by Adafruit. Original code written by Limor Fried/Ladyada for Adafruit Industries; altered and modified specifically for the project by Leif Estrada:  

Download .ino code

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>


#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  510 // this is the 'maximum' pulse length count (out of 4096)


uint8_t servomax = 14;

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  yield();
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period"); 
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit"); 
  pulse *= 1000;
  pulse /= pulselength;
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void loop() {
  // Drive each servo one at a time
  for (int servonum = 0; servonum < servomax; ++servonum) {
    for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen+= 2) {
      pwm.setPWM(servonum, 0, pulselen);
    }
    Serial.println("moved motor" + servonum);
    delay(1);
  }

  delay(45000);
  for (int servonum = 0; servonum < servomax; ++servonum) {
    for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen-= 2) {
      pwm.setPWM(servonum, 0, pulselen);
    }
    delay(1);
  }

  delay(500);

//  servonum ++;
//  if (servonum > 7) servonum = 0;
}

--

Previous: Proliferation Analyses  |  Next: Experimentation