Jump to content

Josh Gladstone

Basic Member
  • Posts

    330
  • Joined

  • Last visited

Everything posted by Josh Gladstone

  1. Yes, you can use it as standard 16 by framing for regular 16 and cropping in post. I don't actually have an ultra-16 camera, but as I understand it, the only reason you need to send it to certain labs that process ultra-16 is because there is image area in between the perfs, so in order to get a clean image all the way across, their processors have to run without sprockets. If you get film processed anywhere else, there will still be image in that area, it just may be dirty / scratched / processed unevenly / etc
  2. Just wanted to add that today is Eadweard Muybridge's birthday! He was born in 1830. Interesting guy, he was convinced his son was another man's (even though the kid apparently grew up to look just like him), and murdered the man in cold blood. At trial, he pled not guilty by reason of mental illness, but the jury rejected that and, ignoring the judge's orders, acquitted him on grounds of justifiable homicide.
  3. Their student rates are significantly discounted. I think the real rate is something like 12 or 14 cents a foot. And I'm pretty sure there's tax, too. Not to mention the over $4000 5400' of raw stock is going to cost from Kodak. Don't get me wrong, I love film and I wholeheartedly support your decision to shoot it, but I would struggle to call it incredibly cheap.
  4. Oh yeah, just in looking at the code to post it here, the nested if statements definitely stuck out to me too. And the startbyte stuff I stole appropriated from somewhere else and once it worked I never looked back. But yes, very good suggestions! And absolutely feel free to use all or none or any part of my code! Happy to post photos of my breadboard when I get home. I also recently took the Uno out of my 16mm scanner to use it to burn a bootloader onto an off-brand Mini Plus, so I still have to wire that guy back up. I can make a video, if it would be helpful.
  5. Let me just add that I got a pretty great deal on a Sony XCD-U100 on ebay a year or two ago when I got it for $250. It outputs 1200x1600 at 10bits per pixel. So It's worked pretty great, considering the price, but I certainly see its limitations. Especially when trying to scan anything not 4x3. Recently though, I stumbled across USB microscope cameras and was intrigued because of their massive resolutions for exceedingly low costs. I posted in a thread on another forum, but never really got a response, but maybe someone here has some experience? So basically, here are some cameras: http://www.amazon.com/Summit-SK2-14X-Compatible-Digital-Microscope/dp/B00NFQI080 http://www.amazon.com/AmScope-Microscope-Magnification-Reduction-Software/dp/B00C2JGOC0 http://www.amazon.com/C-MOUNT-DIGITAL-MICROSCOPE-EYEPIECE-MEGAPIXEL/dp/B00IQR0TJG/ Okay correct me if I'm wrong, but they all look pretty incredible for the price. And they claim to be TWAIN compliant. I mean, that's a standard, right? So theoretically, they could be made to work with some open source driver. However, the little bit I can find out about any of them is that they're pretty much unsupported, and the software that they do use is proprietary and not very good, (especially in OSX where you can barely get an image off of it). So basically they are either amazing, affordable, and easy to work with cross-platform, or they are limited, unsupported, and totally impossible to work with. Has anyone looked into or used cameras like these?
  6. Those are very good questions, and honestly I've thought about them a lot. I'm not sure which is better, start and stop or continuous run. Start and stop is much slower, but it guarantees that you'll get the steadiest, clearest, and most flicker free image possible from your little projector. It also allows you to have other options, like longer exposures, and multiple exposures (either for separate rgb captures, or for HDR. Or both!). But that said, the fastest I can get my scanner to go is about 1 fps. So I've often thought about trying a continuous drive system. Capturing multiple frames per second would be lovely. I chose steppers when I was first getting into Arduinos and I'm not really sure why. I didn't know anything about anything and they were cheap? But they've also worked well enough for me that I've never really tried anything else, so I can't really speak to servo vs stepper vs dc motor, unfortunately.
  7. Wow perry, that thing is a beast! As for name, how about the obvious? Imagicarduino
  8. Also this. Seriously. I didn't know how to do any of this stuff about a year and a half ago, and now I've got a million ideas for projects to tinker with.
  9. That's super cool Perry. I like that you can tell it to go to a certain frame and it'll drive to that point. Where'd you get the imigica from? I've always wanted to build something less projector-y. The Mueller HM was the initial inspiration for me to get into building a scanner in the first place, so ideally I'd love to make something multiformat with a simple film path. But first I still need to perfect what I have so far. Some day! Yeah, OpenCV handles all the image processing, debayering, writing to disc, even talking to the camera and setting exposure. (Basically for inverting 8-bit images, you just set each pixel to 255-its current value. So if it was 255, now it's 0, and if it's 0, now it's 255. For 16-bit images you'd do 65535-current value.) For the orange hue, I actually have a small cyan filter in front of the lamp. I always have some diffusion in there, but for color negative, I add a cyan filter. Works pretty great.
  10. So I'm just going to copy/paste the code at the bottom of this. Keep in mind, I'm really really not a programmer, I taught myself all this stuff, and pretty recently, so it's very hacky. Also, my 16mm version has a couple features the super8 version doesn't, so there's some leftover code. Namely, there's a sonar sensor to detect rollout, and an RGB led in the front that changes colors depending on whether or not it's capturing, has an error, etc. So pretty much ignore anything pertaining to setting colors or rollouts. I'll sort of briefly walk through the code here, and then I'll paste it below. The first part is all setting up pins and variables. Below that is a section that's commented "USEFUL VARIABLES". This is where you can change the stepper speed, which might be higher or lower depending on the size/power/torque of your stepper motor. The lower the number, the faster the motor will go. Too low and the motor won't spin. Shutter Offset is how many times you want the light sensor to count a low/high pass before one it triggers a capture (i.e. how many blades the shutter has). Sensor Offset would be used if the light sensor setup stops the shutter so that the shutter is covering the frame. This offset would add a few steps (whatever number you put) to move the shutter out of the way. Sensor threshold is the the amount that the light sensor needs to count it as uncovered. Speaking of the light sensor, the next bit down, and then a bit below Void Setup has to do with that. The light sensor take a few milliseconds to poll, so you don't want to be doing that after every step of the motor. That would slow it down a lot. And you don't want to do it every now and then because that would be less accurate. So the best way to do it is to run it as an interrupt. So that's what the ISR and adcReading bits are for. The "startbyte==" stuff is all about communicating with the python application, toggling LEDs, stepping the motor forward on keypress, etc. So I guess you can more or less ignore this part. AdvanceMotor sets the motor in motion until the interrupt counts three shutter passes (or however many you set), and then stops and prints a "99", which is what the python software is watching for to know that the stepper is done advancing. The software then captures a frame and advances the motor again. And so on. I think that'll get you going. Feel free to ask questions. Again, apologies at the messy code. Just looking at some of it breifly, I already see stuff that could easily be cleaned up, but this is sort of a work in progress. //ArduinoStepCaptureControl some old code may remain from: //ArduinoStepperControlv5.0 //2012-04-14 jdreyer //Stepper motor control program int stepsToMoveNeg; int StartByte; int i; int userInput[3]; int digitalVal; int dir; int steps; int previous=0; int val; char direction; int negVal; int StepperPosition=0; int byte1; int byte2; float Version=5.0; const int buttonPin = A0; int buttonState = 0; long startTime; long timeDifference; int startStop=0; const int DirectionPin=6; const int StepPin=7; const int LedPin=4; const int Led2Pin=5; const int workLedPin=12; const int redPin = 9; const int greenPin = 10; const int bluePin = 11; const int trigPin = 3; const int echoPin = 2; int sensorCount = 1; int stepsTweak = 20; int sensorState = 0; int lastsensorState = 0; int motorGo = 0; int indicatorLEDToggle = 3; int sensorOffsetCount = 0; int delayTime = 1000; // USEFUL VARIABLES // ESPIECIALLY WHEN YOU CHANGE PROJECTORS const int stepSpeed= 200; // The speed of the stepper motor (Default: 200) int shutterOffset = 3; // The number of blades in the shutter (Default: 3) int sensorOffset = 0; // If the sensor doesn't cause the shutter to stop in the correct position (Default: 0) int sensorThreshold = 220; // Brightness threshold for shutter light sensor (Default: 80) // // #define COMMON_ANODE const byte adcPin = 0; volatile int adcReading; volatile boolean adcDone; boolean adcStarted; void setup() { Serial.begin(115200); pinMode(LedPin, OUTPUT); pinMode(Led2Pin, OUTPUT); pinMode(workLedPin, OUTPUT); pinMode(DirectionPin, OUTPUT); pinMode(StepPin, OUTPUT); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); // setColor(0, 0, 0); digitalWrite(DirectionPin, LOW); delay(10); digitalWrite(workLedPin, HIGH); ADMUX = bit (REFS0) | (adcPin & 0x07); } ISR (ADC_vect) { byte low, high; low = ADCL; high = ADCH; adcReading = (high << 8) | low; adcDone = true; } // end of ADC_vect void loop() { /////////////////////////// if (adcDone) { adcStarted = false; if (adcReading > sensorThreshold) { sensorState= 1; } else { sensorState = 0; } /////////////////////////// if ((lastsensorState == 0) && (lastsensorState != sensorState)) { sensorCount += 1; } if (Serial.available() > 2) { StartByte = Serial.read(); if (StartByte == 5) { Serial.println(StepperPosition); } if (StartByte == 118) { Serial.println(Version); } if (StartByte == 70) { digitalWrite(LedPin, HIGH); delayMicroseconds(10); } if (StartByte == 69) { digitalWrite(LedPin, LOW); delayMicroseconds(10); } if (StartByte == 72) { digitalWrite(Led2Pin, HIGH); delayMicroseconds(10); } if (StartByte == 71) { digitalWrite(Led2Pin, LOW); delayMicroseconds(10); } if (StartByte == 75) { digitalWrite(workLedPin, HIGH); delayMicroseconds(500); } if (StartByte == 74) { digitalWrite(workLedPin, LOW); delayMicroseconds(500); } if (StartByte == 100) { Serial.println("99"); } if (StartByte == 120) { // One full rotation forward motorGo=1; } if (StartByte == 121) { // One full rotation backward motorGo=2; } if (StartByte == 122) { // Partial rotation forwards motorGo=3; } if (StartByte == 123) { // Partial rotation backwards motorGo=4; } if (StartByte == 125) { MotorStartup(); } if (StartByte == 40) { // Indicator LED Red // setColor(255, 0, 0); } if (StartByte == 41) { // Indicator LED Red Low // setColor(1, 0, 0); } if (StartByte == 42) { // Indicator LED Green // setColor(0, 255, 0); } if (StartByte == 43) { // Indicator LED Green Low // setColor(0, 1, 0); } if (StartByte == 44) { // Indicator LED Blue // setColor(0, 0, 255); } if (StartByte == 45) { // Indicator LED Blue Low // setColor(0, 0, 1); } if (StartByte == 46) { // Indicator LED White // setColor(255, 255, 255); } if (StartByte == 47) { // Indicator LED White Low // setColor(1, 1, 1); } if (StartByte == 48) { // Indicator LED Off // setColor(0, 0, 0); } if (StartByte == 49) { // Indicator LED Toggle if (indicatorLEDToggle == 0) { indicatorLEDToggle = 3; } else { indicatorLEDToggle -= 1; } // setColor(0, 255, 0); } if (StartByte == 255) { for (i=0;i<2;i++) { userInput = Serial.read(); } byte1 = userInput[0]; byte2 = userInput[1]; val = (byte2<<8) | byte1; delayTime=val; // Serial.println(delayTime); } } /////////////////////////// adcDone = false; } if (!adcStarted) { adcStarted = true; ADCSRA |= bit (ADSC) | bit (ADIE); } /////////////////////////// whatToDo(); lastsensorState = sensorState; } void whatToDo() { if (motorGo == 1) { AdvanceMotor(); } else if (motorGo == 2) { RetreatMotor(); } else if (motorGo == 3) { AdvanceALittle(); } else if (motorGo == 4) { RetreatALittle(); } } void AdvanceMotor() { if (sensorCount >= shutterOffset) { if (sensorOffset > 0) { SensorOffsetMovement(); } sensorCount=0; motorGo=0; // setColor(0,255,0); delay(delayTime); Serial.println("99"); // rolloutCheck(); } else { digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } } void RetreatMotor() { if (digitalRead(DirectionPin) == 0) { digitalWrite(DirectionPin, HIGH); delay(50); } if (sensorCount > (shutterOffset+1)) { sensorCount=0; motorGo=0; // setColor(0,255,0); delay(50); digitalWrite(DirectionPin, LOW); delay(50); motorGo=3; } else { digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } } void AdvanceALittle() { if (sensorCount >= 1) { if (sensorOffset > 0) { SensorOffsetMovement(); } delay(10); sensorCount=0; motorGo=0; // setColor(0,255,0); } else { digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } } void RetreatALittle() { if (digitalRead(DirectionPin) == 0) { digitalWrite(DirectionPin, HIGH); } if (sensorCount >= 1) { sensorCount=0; motorGo=0; // setColor(0,255,0); digitalWrite(DirectionPin, LOW); } else { digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } } void SensorOffsetMovement() { delay(50); while (sensorOffsetCount < sensorOffset) { digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(350); sensorOffsetCount += 1; } sensorOffsetCount = 0; } void MotorStartup() { if (buttonState < sensorThreshold) { digitalWrite(DirectionPin, HIGH); while (buttonState > sensorThreshold) { buttonState = analogRead(buttonPin); digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } delay(100); digitalWrite(DirectionPin, LOW); while (buttonState < sensorThreshold) { buttonState = analogRead(buttonPin); digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } } if (buttonState > sensorThreshold) { digitalWrite(DirectionPin, HIGH); while (buttonState > sensorThreshold) { buttonState = analogRead(buttonPin); digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); // Serial.println(buttonState); } delay(500); digitalWrite(DirectionPin, LOW); while (buttonState < sensorThreshold) { buttonState = analogRead(buttonPin); digitalWrite(StepPin, LOW); digitalWrite(StepPin, HIGH); delayMicroseconds(stepSpeed); } } } void setColor(int red, int green, int blue) { if (indicatorLEDToggle == 2) { if (red > 0) { red = 30; } if (green > 0) { green = 30; } if (blue > 0) { blue = 30; } } else if (indicatorLEDToggle == 1) { if (red > 0) { red = 1; } if (green > 0) { green = 1; } if (blue > 0) { blue = 1; } } else if (indicatorLEDToggle == 0) { red = 0; green = 0; blue = 0; } #ifdef COMMON_ANODE red = 255 - red; green = 255 - green; blue = 255 - blue; #endif analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); } void rolloutCheck () { long duration, inches, cm; pinMode(trigPin, OUTPUT); digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); if (duration>1000) { Serial.println("666"); } else { Serial.println("333"); } }
  11. Here's the video. For some reason I forgot to describe the shutter sensor on the back of the projector, but basically I drilled a hole in the shutter housing and taped a light dependent resistor to the back side of the hole. Then on the front side, in front of the shutter, there's a large LED pointed right at it (clearly visible in the video). So that LDR senses the light levels as the shutter passes between it and the LED, allowing the Arduino to sense thirds of a rotation.
  12. But what is "any software you need"? What are you going to use to display the images / capture the frames? Normally, you'd use Final Cut Pro or DaVinci, or whatever, but if you go that route, how do you actually trigger it to capture a frame and write it to a hard drive at the proper moment? So In my case, I decided to write a python program and used OpenCV to handle all the image displaying and writing stuff. That worked out of the box with and HDV camera, but needed a driver and totally different capture code to work with the uncompressed data coming off the vision camera. So, it's possible OpenCV would also work with an Intensity Pro, and it's also possible that's frame capturing is feature of Resolve, or possibly someone else has already written software to do just that, but since i've never tried any of those things, I can't really say.
  13. Right, but physically connecting is one thing, and actually pulling bits out of the camera is another. My machine vision camera uses a standard, so I'm using pyDC1394, an open source driver to communicate with it. But I have never tried to get data from anything over HDMI or SDI. I'd imagine once you get into graphics card drivers, things get complicated, but I really have no idea. Maybe OpenCV reads that stuff out of the box like it did with hdv.
  14. You could capture one frame from a stream of video. My very first setup was with a sony hdv camera over firewire, and much to my surprise at the time, OpenCV handled it out of the box. I'm not sure about 4k over HDMI. I mean, I know it's possible, I have a 4k tv hooked up via hdmi, but I have no idea about capturing it. Theoretically it's possible though. Why not? So yes, I'm sure you could make a DSLR work with my setup in a variety of ways. Of course I've never tried it, so I can't vouch a DSLR's lifespan or reliability or what have you. But yes, it should be able to work. That said, I do have a Sony 720p firewire machine vision camera sitting around somewhere. I've been meaning to sell it on ebay for over a year, but I'm too lazy to ever get around to it. I think I'd sell it for like $200 if anyone is interested. I can dig it out and give you more specs and test it out if there's interest. If not, I'll put it on ebay. Eventually... edit: video and code coming real soon I promise.
  15. Awesome! I'm absolutely happy to help! It should totally be modifiable for DSLR use, you'd just have to remove the machine vision capture code and replace it with code to fire your solenoid / trigger capture however you're doing it, and then maybe add a delay to ensure your frame was captured and advance to the next frame. Should be very doable. Just a quick word of caution about the DSLR route, though. Most DSLRs are have a lifespan on the shutter of something like 50,000-100,000 exposures. So, when each roll of super 8 film has somewhere around 3,400 frames, you might find that you're wearing your DSLR out very quickly. That's one of the reasons why I went the machine vision route. Anyhow, I'm about to replace the belt in my super 8 scanner, so I'll make you a video overview of how all the hardware and software work. And I'll upload all the code somewhere too. I can show you my 16mm scanner also, if you're interested. It's pretty much exactly the same but larger.
  16. Or what about cross processing Vision film in b/w chemistry? No clue what the result would be, but it's a thought.
  17. I bought one a while back because it was cheap and the black version which is kinda neat in its own way. But yeah it was also out of focus, and severely misaligned too! There are a couple places that referbish and sell them, but I wasn't going pay a lot of money, so I spent a night taking it apart and cleaning it and trying to figure out how it worked so I could fix the problems. I was eventually able to sort of figure it out. I say sort of because I remember it being pretty confusing (this was like a year and a half ago, so excuse me for being vague), and I could only ever get so far with it. I mean, I got it to where it was usable, but the image is still a little crooked, and some of my friends have moviscops that are MUCH sharper. So, I've been meaning to open mine up and see if I can't get it back to perfect working order anyway. If I get some free time some weekend and I figure anything out, I'll post pictures on here so you can maybe fix yours too.
  18. That was from a years ago. Then they went bankrupt. Clearly nothing happened with that. It's safe to say there is no longer any R&D going on into photographic film at Kodak. Edit: With the POSSIBLE exception of digital archiving film.
  19. Oh I was absolutely not saying that was a good deal, I'm sorry if it seemed like I was. Just that it had an unusual motor and 3 200' mags. Just for reference, the ACL I purchased recently was super16 with 3 400' mags, an AZ Spectrum crystal speed controller/selector in the base, an AZ Spectrum b/w video tap, angienieux orientable viewfinder, custom rails, top handle, run/stop custom handgrip, 3x4 mattebox, 4 batteries (which I had re-celled), a cameflex mount, pl mount, and an arri b -> cameflex adapter. And to top it off, an old Preston wired remote follow focus, a great pelican case with wheels, and a couple of changing bags. No lenses though, but all that for the low low price of $850. Unbelievable! And it was local, so not even any shipping. How could I say no?
  20. PM Patrick Tong (http://www.cinematography.com/index.php?showuser=6849), he had 2 200' mags for sale a few months ago for a reasonable price. I was going to purchase one, but I just picked one up on ebay for pretty cheap. Incidentally, this is listed on ebay right now: http://www.ebay.com/itm/ACL-ECLAIR-16mm-Camera-Package-3-200ft-Mags-Hafflex-HD-Motor-Arri-Mount-/271805099391. Probably not what you're looking for/more than you want to spend. But it does have 3 200' mags, and this "hafflex" motor, which I couldn't find much out about other than that it's exceedingly rare, and capable of many sync speeds if you have an external speed controller. I think. Anyhow, if you're interested in making an offer on that, I'd be happy to throw in $50 for the Arri lens mount adapter (assuming you don't want it of course).
  21. I did a rack aperture shot on an arri s for a student film once. I had some lighting on a dimmer getting brighter while I racked the aperture closed a stop or two. Worked pretty well.
  22. And don't forget that you're going to have to rack the aperture open a stop simultaneously to keep the exposure correct. Or adjust the lighting simultaneously. Unless of course you want it to get a stop darker during the speed ramp.
×
×
  • Create New...