写真引き伸ばし機のRGBカラーLED改造
カラー暗室を作ろう!
モノクロ引き伸ばしLPL 7700の光源をRGBカラーLEDに改造することで、カラー写真の引き伸ばしに挑戦します。
モノクロ引き伸ばし機でカラープリントをする場合、一般にCMYのカラープリントフィルターフィルターを入れてカラーバランスを調整します。フィルターは昔ビックカメラで売っていたような気がしますが、今ではなかなか手に入らないのではないでしょうか。そこで、モノクロ用引き伸ばし機をRGBフルカラーLED光源に改造してカラープリントを行いました。
改造の元になるモノクロ引き伸ばし機はLPL 7700 PROです。
・LED 光源RGBの出力調整
・タイマ機能
この二つの機能はArduinoで実現します。
Arduinoというのは電子工作で使われるマイコンボードのことです。
設計を考える
LEDをPWM対応LEDドライバで駆動します。
RGB値と時間はロータリエンコーダで入力し、その値をLCDに表示します。
ロッカスイッチでモード切替(タイマー⇔フォーカス)を行います。
必要な部品は?
主要な部品は秋月電子通商で揃います。
【部品】
・モノクロ引き伸ばし機 LPL 7700 PRO
・Arduino UNO R3
・放熱基板付6WフルカラーRGBLED OSTCXBEAC1S
・PWM調光機能付き定電流LEDドライバ NJW4617DL3 ×3個
・TO-252-5 SIP変換基板 ×3個
・ロータリーエンコーダ ×4個
・カラーつまみ(ノブ) 13 mm(赤青緑黄)
・LCDモジュール 16×2行 白色バックライト付 白文字 黒背景 AQM1602Y-NLW-FBW
・Arduino用ユニバーサル プロトシールド基板 ガラスコンポジット 金フラッシュ基板 または ブレッドボードBB-801
・ピンヘッダ
・ユニバーサル基板
・ACアダプタ 5V2A [秋葉原エレクトリックパーツ]
・DCジャック [山本無線 電材店]
・抵抗 0.56 Ω, 3 Ω, 12 Ω [千石電商]
・抵抗 10 kΩ, 220 Ω
・コンデンサ 0.1 μF, 0.01 μF
・リード線
・押しボタンスイッチ
・ロッカスイッチ
・ヒートシンク
・シリコングリス, 熱伝導シート
・六角スペーサ [西川電子部品]
・乳半アクリル板 [萩原電材株式会社]
・ケース [100円ショップ]
【工具】
・穴あけドリル
・ハンダ
・半田ごて
・ねじ切りタップ
・アクリルカッタ, ホットカッタ
回路図
LEDやロータリエンコーダについているデカップリングコンデンサは無くても動きました。
プログラムを書く
Arduinoのスケッチはこんなふうにしました。まだまだ改善の余地はありそう・・・。
#include <Wire.h>
#include <ST7032.h> // LCD
ST7032 lcd;
// ロータリーエンコーダー
#include <Encoder.h>
Encoder myEncR(A0, A1); // A0, A1ピンからRを入力
Encoder myEncG(A2, A3); // A2, A3ピンからGを入力
Encoder myEncB(0, 1); // 0, 1ピンからBを入力(SDA/SCL・A4/A5ピンは繋がっています、だからSDA/SCLでI2Cをして、A4/A5でアナログはダメ)
Encoder myEncS(2, 3); // 2, 3ピンからTimeを入力
int SWfocus = 7; // 7ピンをフォーカススイッチに
// タイマー
#include <MsTimer2.h> // タイマー割り込みを利用する為に必要なヘッダファイル MsTimer2を使うとtone( )関数が利用できません、また3番ピンと11番ピンからのPWM出力(analogWrite( )関数)もできません。
#define LED_R 6 // LED_Rと記述されている部分がすべて6という値に置き換えられる
#define LED_G 9 // analogWrite(pin, value)ピン5と6のPWM出力はデューティ比が高めになります(?)。
#define LED_B 10
int SWtime = 4; // 4ピンをタイマースイッチに
int x = 1; // フォーカススイッチスイッチoffでLEDを消灯してしまうのを防ぐ 1/5
void led() { // MsTimer2で割り込み時に処理される関数
analogWrite(LED_R, LOW); // LED_Rを消灯
analogWrite(LED_G, LOW); // LED_Gを消灯
analogWrite(LED_B, LOW); // LED_Bを消灯
x = 1; // フォーカススイッチスイッチoffでLEDを消灯してしまうのを防ぐ 2/5
}
// ヘッダここまで
// 電源起動時とリセットの時だけのみ処理される関数(初期化と設定処理)
void setup() {
lcd.begin(16, 2); // LCD表示領域設定(16桁, 2行)
lcd.setContrast(10); // コントラスト設定(0〜63)
//LCD表示(1桁,1行目)
lcd.setCursor(0, 0);
lcd.print("R/c G/m B/y s");
//LCD表示(R1桁,2行目)
lcd.setCursor(0, 1);
lcd.print("0");
//LCD表示(G4桁,2行目)
lcd.setCursor(4, 1);
lcd.print("0");
//LCD表示(B8桁,2行目)
lcd.setCursor(8, 1);
lcd.print("0");
//LCD表示(s12桁,2行目)
lcd.setCursor(12, 1);
lcd.print("00.0");
//ロータリーエンコーダー
pinMode(A0, INPUT_PULLUP); // A0ピンを入力に設定.プルアップ抵抗を有効
pinMode(A1, INPUT_PULLUP);
pinMode(A2, INPUT_PULLUP);
pinMode(A3, INPUT_PULLUP);
pinMode(0, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
// フォーカス
pinMode(SWfocus, INPUT_PULLUP); // スイッチピンを入力に設定.プルアップ抵抗を有効
// タイマー
pinMode(LED_R, OUTPUT); // 9番ピンを出力に設定(9番ピンにLEDが接続されている為)
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(SWtime, INPUT_PULLUP); // スイッチピンを入力に設定.プルアップ抵抗を有効
}
// setupここまで
long oldPositionR = -999; // ロータリーエンコーダー初期値
long oldPositionG = -999;
long oldPositionB = -999;
long oldPositionS = -999;
// 繰り返し実行される処理の関数(メインの処理)
void loop() {
//ロータリーエンコーダーRGBs
long newPositionR = myEncR.read();
if (newPositionR != oldPositionR) { // !は否定を意味する
oldPositionR = newPositionR;
}
long newPositionG = myEncG.read();
if (newPositionG != oldPositionG) {
oldPositionG = newPositionG;
}
long newPositionB = myEncB.read();
if (newPositionB != oldPositionB) {
oldPositionB = newPositionB;
}
long newPositionS = myEncS.read();
if (newPositionS != oldPositionS) {
oldPositionS = newPositionS;
}
// LCD表示(R0桁,2行目)
char s[16];
byte valR = newPositionR;
dtostrf(valR, 3, 0, s); // 右詰
lcd.setCursor(0, 1);
lcd.print(s);
// LCD表示(G4桁,2行目)
byte valG = newPositionG;
dtostrf(valG, 3, 0, s); // 右詰
lcd.setCursor(4, 1);
lcd.print(s);
// LCD表示(B8桁,2行目)
byte valB = newPositionB;
dtostrf(valB, 3, 0, s); // 右詰
lcd.setCursor(8, 1);
lcd.print(s);
// LCD表示(s12桁,2行目)
word valS = newPositionS;
dtostrf(valS, 2, 1, s);
lcd.setCursor(12, 1);
lcd.print((float)valS/10);
// フォーカススイッチonのとき
if (digitalRead(SWfocus) == LOW){
analogWrite(LED_R, valR); // LED_RをvalRに減光して点灯
analogWrite(LED_G, valG);
analogWrite(LED_B, valB);
}
// タイマー
else if (digitalRead(SWtime) == LOW){ // タイマースイッチonのとき
MsTimer2::set(valS*100, led); // newPositionSミリ秒毎にled( )割込み関数を呼び出す様に設定
while (digitalRead(SWtime) == LOW){} // スイッチが離れるのを待つ
x = 0; // フォーカススイッチスイッチoffでLEDを消灯してしまうのを防ぐ 3/5
MsTimer2::start(); // タイマー割り込み開始
do {
analogWrite(LED_R, valR); // LED_RをvalRtに減光して点灯
analogWrite(LED_G, valG);
analogWrite(LED_B, valB);
} while (x == 0); // do {実行される文} while (条件式); x == 0の間は{}中をループ。フォーカススイッチスイッチoffでLEDを消灯してしまうのを防ぐ 4/5
}
// フォーカススイッチスイッチoffでLEDを消灯してしまうのを防ぐ 5/5
if (digitalRead(SWfocus) == HIGH){
analogWrite(LED_R, 0); // LED_Rを消灯
analogWrite(LED_G, 0);
analogWrite(LED_B, 0);
}
}
LEDを取り付ける
ヒートシンクにねじを切って固定しています。熱がこもるようならファンを付けようと思います。
コントローラ
プラスチックケースはチープだけど加工しやすいです。
プリント
プリントできました!
film:FUJIFILM フジカラー SUPERIA PREMIUM 400
paper:FUJIFILM フジカラープロフェッショナルペーパー Pro-L
モノクロ多諧調印画紙
もちろんモノクロプリントもできます。
多諧調印画紙を使用する場合、Gを小さくすると硬調になり、Bを小さくすると軟調になります。Rには感光しません。
film:efke KB100
paper:ORIENTAL イーグル VCRP-R