Click to return to the page

Take 360 panoramics on iPhone

DIY panoramic photos on iPhone

iphone360.ilyatitov.com

DIY Panoramic Bracket for iPhone

newUpdate:
I've redesigned the mechanics (transmission via gear as opposed to having motor as an axis) for smoother movement, added a beeper for some audio feedback including an alarm that goes off once the panoramic is done as a reminer to swith the pano head off. The body has been redesigned and 3d printed with batteries positioned to balance the weight of the phone. Overall the new version is more sturdy and precise. The 3d printed mast is more rigid compared to the flexible plastic used in the first version.

Electronics

 
This really takes the 360 photography to the new level. Press the button and then watch the phone snap away. I can also do a full spherical panorama by running this 3 times with phone at different angles to cover the zenith, horizon and nadir.


Motor and electronics inside
Electronics inside

Gears

3D Printing the body
3D printing the body



Focus, exposure and white balance hold are achieved by tapping and holding on the desired focus point, after that the iphone will indicate the focus is locked. Additional control can be achieved with other apps allowing manual white balance and exposure adjustments.

Bits involved

 


Microcontroller program
int stepDelay = 120;
int motor1Step = 0;
int stepSequence1[] = {1,0,0,1};
int stepSequence2[] = {1,1,0,0};
int stepSequence3[] = {0,1,1,0};
int stepSequence4[] = {0,0,1,1};
int stepsInTurn = 48;
int currentStep = 0;

int turnStatus = 1;

void setup() {
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
moveBy(-1);
delay(1600);
digitalWrite(0,HIGH);
delay(400);
digitalWrite(0,LOW);
}

void loop() {

if (turnStatus != -1){
delay(200);
digitalWrite(0,LOW);
while (turnStatus == 1 && currentStep
moveBy(1);

if (0 == (currentStep+1)%((stepsInTurn/16)-(stepsInTurn%16))){
delay(60);
moveBy(-1);
delay(30);
moveBy(1);
delay(1000);
digitalWrite(0,HIGH);
delay(400);
digitalWrite(0,LOW);
delay(400);
}
delay(stepDelay);
digitalWrite(0,LOW);
}
digitalWrite(0,LOW);
turnStatus = -1;
currentStep = 0;
}
}

void moveBy(int dir){
motor1Step += dir;
currentStep += dir;
if (motor1Step >= 4){motor1Step = 0;}
if (motor1Step < 0){motor1Step = 3;}
digitalWrite(1,stepSequence1[motor1Step]);
digitalWrite(2,stepSequence2[motor1Step]);
digitalWrite(3,stepSequence3[motor1Step]);
digitalWrite(4,stepSequence4[motor1Step]);
}