Close
0%
0%

Pano-Bot

multi megapixel Spherical HDR Panorama Robot

Similar projects worth following
multi megapixel Spherical HDR Panorama Robot

This Pano-bot was built before we could buy single shot 360 cameras..
but it still significantly exceeds the quality of stitched panoramas

Robot Hardware

Arduino nano
Stepper motor driver
Stepper motor for Azimuth
Servo motor for Elevation
Lithium-ion Charger circuit
Mechanical bits,Buttons, LED's, and a photo transistor


the Camera is a Canon PowerShot ELPH 110HS  16.1 megapixel
for this design a Canon camera is critical here,  as it is running CHDK and my Lua scripts.

Software
the key point to this design, is to achieve "very high" panorama sequence speeds. 
for this I need to take the Exposure and move the robot as quickly as possible to the next location.. 
however critically..  not prior to the exposure having finished.   
so a simple "delay" will not work here.     with the different exposure times etc.   
the Arduino and Camera need to "talk"

to accomplice this. I implemented a fairly crude "two way" link between the Arduino and the camera  
I had plans for a slow serial protocol. for setting up the Arduino with various parameters.
(number of Elevations / Azimuth steps etc.) but did not end up implementing this

Simply put.
when the sequence is started on the hardware buttons. 
the Arduino triggers the Camera by connecting 5V to the USB plug on the camera.  (HIGH)
this is detected by CHDK, as "Shutter" and the Lua script on the camera starts the exposure(s).

then when the Exposure is done, the Lua script Blinks the Amber focus light on the front of the camera.   
the Arduino detects this with a Photo transistor built in to the epoxy "dock" right on top of it.

The Arduino now starts moving the camera to the next position,
all while the camera is still busy saving the picture to the SD-card.  thus saving a lot of time.  

this is done dynamically regardless of the cameras exposure period and number of exposures
Panorama speed is essentially limited by the exposure period. the Camera and SD-card write speed.
and not so much by the Robot mechanical movement.

Sequences.
the number of pictures, and number of exposure steps, AV, TV  for HDR etc.
is all set up using a CHDK / Lua based menu system.
 
the Arduino itself remains a fairly "dumb" motor controller and is controlled by the the Camera.

here is a short YouTube clip showing the Pano-Bot doing a "3 elevation"  1/3 overlap 
Single exposure "fast sequence"

YouTube Clip of Spherical Panorama Robot

  • Arduino Code

    Rune Kyndal06/12/2020 at 15:12 0 comments

    Arduino Code.

    I cant seem to find the Arduino code at the moment.  its been a few years.
    i will post here if i do come across it
    but there is nothing special here and it will depend on the hardware used.

    Left + Right  buttons   pans the robot a few steps left or right to set the start frame.
    as well as choosing the direction of the panorama sequence 

    Center button is the "start" button  and if in the middle of a sequence "pause"
    and LED's indicate condition

    when started. the robot runs a set sequence. 
    in this case  3 elevations (servo motor)  with adequate picture overlap
    and stepper motor for azimuth also with adequate picture overlap

    the robot positions the camera, pulses the camera USB 5V when its arrived to
    request an exposure.  then looks for the camera to respond with a "blink" 

    move to next position.  repeat.
    finishing the sequence with a Zenith (straight up)  and Nadir (straight down) frame
    and at the end of the sequence it "rewinds"  to start  position (cable management)


  • Lua script description

    Rune Kyndal06/12/2020 at 14:26 0 comments

    Lua Script

    when the Lua script is started on the camera,  
    it activates the cameras "half press"  to focus and AF lock the camera.   
    this half press is "held" throughout the whole sequence 
    to keep the focus from changing between exposures. 

    the script then waits for the Arduino to pulse the USB "HIGH",
    which is received as a trigger event from CHDK.

    the script initiates the exposure by having the camera go  "full press" and back to "half press"   
    half press is not released until the end the exposure sequence.

    the camera must be set to fixed exposure(s), to avoid the picture changing,
    with varying light conditions as it pans around.

    blinking the LED is done by poking directly to the Cameras hardware registers, 
    specific to the camera type.  for the 110HS  its 0xC0220164 and 0xC022C028

    I forget the details now. but I believe I based my Lua script on the  HDR Fast Shooter script
    adding a few things, menus,  detection of finished exposure, and of-course the LED blink function.

    --[[
    --s 96
      @title HDR Panorama Robot
      @param m Number of HDR steps +/-
      @default m 0
      @values m S -S+ --S++ ---S+++
      @param t tV step size
      @default t 2 
      @values  t 0 0.5 1 1.5 2 2.5 3
      @param d shot delay 5
      @default d 0 
      @param b blink delay 3
      @default b 0
    
      --]]
     
      -- release AF lock on exit
      function restore()
         set_aflock(0)
      end
    
      
    function blink_led()
    status = poke(0xC0220164, 0x46, 1)  --Turn LED ON
    status = poke(0xC022C028, 0x46, 1)  --Turn LED ON
    sleep(( b*100))
    status = poke(0xC0220164, 0x44, 1)  --Turn LED OFF
    status = poke(0xC022C028, 0x44, 1)  --Turn LED OFF
    end 
      
     
      -- setup 
        
      --n=m
      n=((m*2)+1)
      s=(t*(96/2))
      set_console_layout(10, 0, 40, 14)
      props=require("propcase")
      propset=get_propset()
      pTV=props.TV
      if( propset > 3) then pTV2=props.TV2 end
     print("** PANO BOT SCRIPT ***")
     print("**** MAKE SURE *******")
     print("**********************")
     print("* NOT CONTIOUS SHOOT *")
     print("**********************")
     
     
      -- focus and get exposure
      press("shoot_half")
      repeat
          sleep(50)
      until get_shooting() == true 
      set_aflock(1)     
     -- tv96val=get_tv96()-(n*(s/2))
      tv96val=(get_tv96()-((n-1)*(s/2)))    --
      origtvval=tv96val -- reset original TV start Value
     
     
     
     repeat
      if ((is_pressed("remote")) or (is_pressed("video")))  then 
        tv96val=origtvval
        ecnt=get_exp_count()
      -- take the shots as fast as possible
      for i=1, n, 1 do
         print("step=", i, "tv96=", tv96val)
         ecnt=get_exp_count()
    
         set_prop(pTV,tv96val)
         if( propset > 3) then set_prop(pTV2,tv96val) end
         press("shoot_full_only")
         repeat
          sleep(20)
         until(get_exp_count()~=ecnt)
         release("shoot_full_only")
         tv96val = tv96val+s
      end
    
    repeat
          sleep(20)
    until(get_exp_count()~=ecnt)
    sleep((d*100))
    blink_led()
    end
    
    until ( false )
    restore()
    
    

  • Pano-bot Videos

    Rune Kyndal06/12/2020 at 07:34 0 comments

    A video i did for a Nikon Competition.

    its an early version.  early software. buggy as is apparent.   
    I did not have the camera control implemented yet.  (only the Arduino to Camera trigger) 
    but it shows the Robot and its sub-parts if nothing else.

    Nikon Competition Video

    another older video..  description says "faster firmware" 
    well it got much faster since then

    "not so "faster" Robot firmware video"

View all 3 project logs

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates