Re: DSLR Scanner: Camera Supports and Positioning
That's pretty good, and you could always lap the top surface if needed.
An inexpensive solution is terrific. Not only would it allow more people to make one of these, but it could also be a bench mark to see what gains, if any, are gotten by using a more expensive system.
We've been focusing on 1:1, but for many people that would be overkill with large format. (For years I only enlarged 4x5" to fit on an 8x10" sheet of photo paper with 1" boarders.) Using 1:2 or less would lead to much more depth of field and require less tiles. In addition, most 50-65mm standard macros are optimized for less magnification than 1:1.
Re: DSLR Scanner: Camera Supports and Positioning
For me 1:1 isn't overkill because I want the option of printing quite large if I so choose. BTW, rather than a DSLR what about an outdated low resolution MF back? I'm thinking of buying a 16Mp MF back and using a 2:1 (2x life size on sensor) micro lens.
Re: DSLR Scanner: Camera Supports and Positioning
I have experience with H20 and H25 Phase backs, and to be honest, I was never thrilled with them. They were clunky, finicky and prone to moire. Certainly there are much newer backs with better performance. The advantages for our purposes would be less required tiles, a significant advantage. The disadvantage would be much more cost, larger and heavier equipment, older technology ... The sensor market has made huge advances very quickly in the dslr and smaller segment. For instance, the D800 has better resolution, dynamic range, color depth...than the older phase backs in spite of having a smaller sensor size.
Ideally, we want the highest performing lens at the desired magnification with a pixel density on the chip that'll allow as much of the performance of the lens to come through as possible. According to some of the knowledgeable macro folks, the best performing lenses at 1:1 tend to be shorter focal length lenses; and the best ones out resolve a 16mp dx sensor.
Now if one has a MF system for other uses, then giving it a try would certainly be interesting, but I wouldn't recommend buying one specifically for this purpose. At those prices, a used drum scanner would probably be a much better investment.
Re: DSLR Scanner: Camera Supports and Positioning
Also the older digital backs arent that much larger, a h20 is 36.9 x 36.9mm and a 5d is 36 × 24 mm the 25s are a bit larger at 48.9 x 36.7 but still I think it is not worth it.
Re: DSLR Scanner: Camera Supports and Positioning
I didn't realize the older MF sensors were so small. I assumed they were all 6x6cm or larger. Silly me for assuming. :)
Re: DSLR Scanner: Camera Supports and Positioning
Here's a neat robotic camera system: http://www.youtube.com/watch?v=9eED6Uot0Yw
On another note, OpenMoCo has a new board available:
http://www.openmoco.org/nanoMoCo
Re: DSLR Scanner: Camera Supports and Positioning
Quote:
Originally Posted by
Peter J. De Smidt
positioning hack:
http://www.shumatech.com/support/chinese_scales.htm
4 Attachment(s)
Re: DSLR Scanner: Camera Supports and Positioning
Finally got some time to finish the machining on the second axis on the stage and got all the parts for building the electronics. Here are some pictures of my first run. The two rotary encoders are for positioning the stage starting point. Then with a push of a button it goes through a hardcoded array of positions and fire the camera once on each location. It would of course be possible to have a more fancy interface with a LDC and menus with more possibilities but I will just go for a few buttons that do preconfigured arrays. I will probably have one for preview scanning just moving in x and scanning a filmstrip with one exposure per picture. And one at 1:1 with 6 exposures made for 6x6 and 6x7.
Next is to make the lightsource, finish that negative holder and build a nice box for all that cable mess!
Attachment 78360Attachment 78361Attachment 78362Attachment 78363
4 Attachment(s)
Re: DSLR Scanner: Camera Supports and Positioning
Re: DSLR Scanner: Camera Supports and Positioning
Here is the code running in this demo.
#include <AccelStepper.h>
#include <Encoder.h>
// Define a stepper and the pins it will use
AccelStepper stepper1(1, 6, 7);
AccelStepper stepper2(1, 8, 9);
Encoder myEnc1(3, 4);
Encoder myEnc2(0, 2);
const int buttonPin = 10; // the number of the pushbutton pin
const int ledPin = 12; // the number of the LED pin
int ledState = LOW; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
int i;
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
int pos = 0;
void setup()
{
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("TwoKnobs Encoder Test:");
stepper1.setMaxSpeed(5000);
stepper1.setAcceleration(1000);
stepper2.setMaxSpeed(5000);
stepper2.setAcceleration(1000);
}
long oldPosition1 = -999;
long oldPosition2 = -999;
void loop()
{
long newPosition1 = myEnc1.read();
long newPosition2 = myEnc2.read();
long newPosition100 = (newPosition1 * 1);
long newPosition200 = (newPosition2 * 1);
if (newPosition1 != oldPosition1) {
oldPosition1 = newPosition1;
Serial.println(newPosition100);}
if (newPosition2 != oldPosition2) {
oldPosition2 = newPosition2;
Serial.println(newPosition200);}
if (stepper1.distanceToGo() == 0);
{
stepper1.moveTo(newPosition100);
}
{
stepper2.moveTo(newPosition200);
}
stepper1.run();
stepper2.run();
int reading = digitalRead(buttonPin);
// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
// this is all that's new to the code
// toggles the ledState variable each time the button is pressed
if (buttonState == HIGH) {
ledState = !ledState;
Serial.println(ledState);
}
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonState = reading;
}
// set the LED using the state of the button:
// digitalWrite(ledPin, ledState);
if (ledState == HIGH) {
stepper1.runToNewPosition(newPosition100 + 500);
stepper2.runToNewPosition(newPosition200 + 500);
digitalWrite(ledPin, HIGH); // This LOW to HIGH change is what creates the
delay(3000);
digitalWrite(ledPin, LOW); // "Rising Edge" so the easydriver knows to when to step.
delay(30); // This delay time is close to top speed for this
stepper1.runToNewPosition(newPosition100 - 1000);
stepper2.runToNewPosition(newPosition200 - 1000);
digitalWrite(ledPin, HIGH); // This LOW to HIGH change is what creates the
delay(3000);
digitalWrite(ledPin, LOW); // "Rising Edge" so the easydriver knows to when to step.
delay(30); // This delay time is close to top speed for this
stepper1.runToNewPosition(newPosition100 + 500);
stepper2.runToNewPosition(newPosition200 + 500);
digitalWrite(ledPin, HIGH); // This LOW to HIGH change is what creates the
delay(3000);
digitalWrite(ledPin, LOW); // "Rising Edge" so the easydriver knows to when to step.
delay(30); // This delay time is close to top speed for this
ledState = LOW;
}
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonState = reading;
}