Modification of the Wolverine Pro Film Scanner

Modification of the Wolverine Pro Film Scanner

The Wolverine Scanner (also sold as Reflecta, Somikon, Winait or similar) for Super 8 and Regular 8 Film fills a gap in the market because it is affordable. Unfortunately, however, its quality also leaves some things to be desired – above all, it is criticized that it scratches films during scanning.

After I purchased such a device (the Pro version, which also holds 120m reels), the inadequacies left me no peace, and I have made some improvements that I would like to share here. Imitation is desired and recommended 🙂

The main problem with the mechanical inadequacies is that the film is potentially heavily scratched in many places: for example, the device has five “rollers”, which are not rollers at all, but rigid bolts. Also, the film is pressed far too much by skids in the film path. The presumed reason for this construction is probably that the take-up reel of the scanner exerts far too much traction (more on that below).

1. Modification: Film Guidance

The rigid deflection bolts scratch the film reliably and on both sides, especially since the film is pulled with extremely strong torque. I have removed all these bolts and replaced them with three mounted deflection rollers, which touch the film only on the edges and also lead exactly horizontally through the film path, so the edges of the film path are no longer a source of vertical scratches.

The five screws still show where the rigid film scratches were once located, and how absurdly the film was led around them.

The sprocket roll is also retrofitted (and ball-beared) – it is used to detect whether the film is being transported. Here’s more on that below.

The film is now exactly aligned with the film path and no longer needs to be pulled over the hard edge

2. Modification: Film Pressure

Another modification is less visible: the contact pressure of the terrible film skids has been massively reduced. The film is not pressed down with a metal plate or plastic plate, no, four sharp-edged metal skids and two plastic skids do that:

Reliable filmscratchers

These skids press on the carrier side, and not at the filim edge, but in the middle of the visible image area. Close to the gate, there are two further plastic skids. Well, and the pressure seems a bit high — my measurement device measures 250g, which are needed to pull the film through the closed film path! However, the Film is not pulled at all, but pushed — by the single-toothed, sharp-edged claw, which is positioned somewhere at +5 or so. So there are at least 250g on the inner edge of the small sprocket hole, before the film gets moving.

The skids were polished by me and the contact pressure was massively reduced. now only 30g of force is needed at the perforation hole edge to transport the film.

3. Modification: Take-up pull

I wondered, of course, why the pressure is so high. The reason is probably that the take-up motor pulls way too hard, and the pressure was needed to grant good image registration. It has a primitive slip clutch, but it is far too firm and, of course, not adjustable. When the enormous contact pressure was still not sufficient, the Winait designers probably screwed on the five deflection bolts. And since the friction of these five bolts apparently still did not slow down enough, the lower ones were further covered with shrink tube. (Unfortunately, even this friction is not enough: A common tip among Wolverine users is to block the take-up reel during scanning or to simply run the film into a cardboard box so that the image registration is acceptable…)

The problem with the too strong film pull could be solved very easily and elegantly: With a resistor and a spindle pot (in series), the motor current can now be controlled smoothly.

Here, the take-up reel can be slowed down so that the film is still being wound without being dragged through the film path.

4. Modification: Automatic Shutdown

Another problem with the Wolverine scanner is that it can hardly be operated unattended. Not only does it tend to hang due to any small perf damage, scanning the same frame again and again for hours, it also does not notice the end of the film andkeeps tacking on for hours.

To mend this deficit, I installed the procket roll, with a sector disc mounted on it’s back:

Inside the scanner, this disc now rotates synchronously with the film

When the film is transported, this disk continuously generates impulses, which are optically detected and sent to an Arduino:

The reflex sensor, which looks at the sector disc, is mounted on the brass spacer bolt

The Arduino is mounted in the corner and “watches” the flm transport. If a terminated film transport is detected, the Arduino switches off the scanner cleanly via simulated key strokes, so that the film file is still closed cleanly.

Last but not least, the Arduino controls a three-color LED, so that you can see the device status at any time (red: scanner switched off, blue: scanner switched on but not yet on scanning, green: scanner is on and scanning.

The code for the Arduino is at the bottom.

Results

This is what the scan results look like without any editing — at least the scratches are gone, and the image registration is much better than before, although still not very good:

However, the bad image registration can be reliably corrected with one click in Davinci Resolve (free), the whole thing then looks like this:

And last but not least, the modified device in action…

The code for the Arduino:

/* 

Turn off the crappy Wolverine Scanner when it stops moving 

*/

#define impDetectorPin  3
#define buzzerPin       5
#define relaisPin       12

#define blueLedPin      10 
#define greenLedPin     11
#define redLedPin       13

#define SCANNER_RUNNING          1
#define SCANNER_GETTING_LOADED   2
#define SCAN_FINISHED            3

uint8_t myState;
uint8_t prevState;
unsigned long millisNow = 0;
unsigned long lastMillis = 0;
volatile unsigned long impCounter = 0;
unsigned long lastFrameCount = 0;

bool scannerEverRan = false; // Don't beep right away

float lastFreq;

void setup() {
  pinMode(impDetectorPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(relaisPin, OUTPUT);
  pinMode(redLedPin, OUTPUT);
  pinMode(blueLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  
  Serial.begin(115200);
  tone(buzzerPin, 6000, 200); // Hello!
  delay(250);

  digitalWrite(relaisPin, LOW);
  redLight();
  
  attachInterrupt(digitalPinToInterrupt(impDetectorPin), countISR, CHANGE);

}

void loop() {
  measureScannerFreq(10); // measure speed over 10 seconds
  if ((lastFreq <= 1.7) || (lastFreq >= 2.3)) {
    if (lastFreq == 0.0) {
      if (scannerEverRan) {
        myState = SCAN_FINISHED;
      }
    } else {
      myState = SCANNER_GETTING_LOADED;
    }
  } else {
    myState = SCANNER_RUNNING;
    scannerEverRan = true;
  }

  if (prevState != myState) {
    switch (myState) {
      case SCANNER_RUNNING:
        greenLight();
        Serial.println("Scan läuft.");
        break;
      case SCANNER_GETTING_LOADED:
        blueLight();
        Serial.println("Scanner wird geladen.");
        break;
      case SCAN_FINISHED:
        Serial.println("Scan ist fertig.");
        redLight();
        powerOff();
        scannerEverRan = false;
        myState = 0;
        break;
      default:
      break;
    }
    prevState = myState;
  }
}

void measureScannerFreq(int checkIntervalSec) {
  millisNow = millis();
  if (((millisNow % (checkIntervalSec * 1000)) == 0) && (lastMillis != millisNow)) {
    lastFreq = float((impCounter - lastFrameCount)) / checkIntervalSec;
    lastFrameCount = impCounter;
    lastMillis = millisNow;
    Serial.print(lastFreq);
    Serial.println(" B/s");
    Serial.println("");
  }
}

void redLight() {
  digitalWrite(redLedPin, HIGH);
  digitalWrite(greenLedPin, LOW);
  digitalWrite(blueLedPin, LOW);
}

void greenLight() {
  digitalWrite(redLedPin, LOW);
  digitalWrite(greenLedPin, HIGH);
  digitalWrite(blueLedPin, LOW);
}

void blueLight() {
  digitalWrite(redLedPin, LOW);
  digitalWrite(greenLedPin, LOW);
  digitalWrite(blueLedPin, HIGH);
}

void yellowLight() {
  digitalWrite(redLedPin, HIGH);
  digitalWrite(greenLedPin, HIGH);
  digitalWrite(blueLedPin, LOW);
}


void countISR() {
  impCounter++;
}

void powerOff() {
  digitalWrite(relaisPin, HIGH);
  delay(3000);
  digitalWrite(relaisPin, LOW);
  
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  tone(buzzerPin, 6000, 1000); // Hello!
  delay(2000);
  
}
Avatar
Friedemann Wachsmuth

Schmalfilmer, Dunkelkammerad, Selbermacher, Zerleger, Reparierer und guter Freund des Assistenten Zufalls. Nimmt sich immer viel zu viele Projekte vor.

Leave a Reply

%d bloggers like this: