Random Notes 2

Hiseq 2000 TDI

Serial number from one module: C10000-515, 661675.

aslver.exe dump from my cameras:

1: AS-PHX-D48CL-PE1
Grabber HW Version    9.10.00
Grabber SW Version    5.58.24
Library FW Version    9.10.00
Grabber Connection    PCIe x1
Camera Connected    Unknown
Camera Name    C10000-515
Camera S/N    S/N: 661694
Camera Version    INF 2.01-F20-R02

1x PCIe card appears to work. 4x PCIe doesn’t show up on aslver.exe as yet.

Trigger was plugged into SMA port on board, driven by function generator 5V input.

Cameralink cable plugged into top port (furthest from motherboard) on the PCIe cameralink acquisition board.

HP C6602


http://nicholasclewis.com/projects/inkshield/

LinearCCDs


https://oceanoptics.com/wp-content/uploads/SONY-ILX511A.pdf

http://www.advancedmems.com/pdf/AMEMS_LineSensorArraySummary_v1.pdf

S11639 CMOS made by Hamamatsu

ILX511:

LSH6008-CA10A

Same as in Epson printers?

Stuff from, https://twitter.com/steubens7/status/1179848585636126720

nope, this little shoulder is the black level / zero value, iirc there was another 3 volts or so before saturation.

top trace is analog output, second trace is the trigger, bottom trace is the clock that cycles samples out after trigger, the short pulses on the trigger line were sample every 32 elements in the scan head or something:
https://gist.github.com/ohsix/4f518a2080dc913f880273fc80e04f52

#include <Arduino.h>
#include <ports.h>
#include <base.h>
#include <DirectIO.h>
#include <Adafruit_NeoPixel.h>
#include <TimerOne.h>
#define CLKPIN TIMER1_A_PIN
#define TRGPIN 4
#define DEBUGPIN 6
#define FIRSTFIELD 7
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
Output<TRGPIN> trg;
Output<CLKPIN> clk;
Output<6> dbg;
Output<FIRSTFIELD> ff;
#define NUMPIXELS 8
#define NEO_PIN 8
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, NEO_PIN, NEO_RGB + NEO_KHZ800);
const uint8_t PROGMEM gamma8[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5,
5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10,
10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
void setup() {
analogReference(EXTERNAL);
pinMode(CLKPIN, OUTPUT);
//pinMode(DEBUGPIN, OUTPUT);
Timer1.initialize(1); // ~1mhz
Timer1.pwm(CLKPIN, 512); // 50% duty cycle
Timer1.stop();
pinMode(TRGPIN, OUTPUT);
pinMode(A0, INPUT);
pinMode(ledToPin(0), OUTPUT);
pinMode(ledToPin(1), OUTPUT);
pinMode(ledToPin(2), OUTPUT);
Serial.begin(115200);
cbi(ADCSRA, ADPS0);
cbi(ADCSRA, ADPS1);
cbi(ADCSRA, ADPS2);
sbi(ADCSRA, ADPS1);
// Serial.print("prescaler = ");
// Serial.println(ADCSRA & 0xE0);
pixels.begin();
}
int avgRead(int port, int samples)
{
int i;
long reading = 0;
for(i = 0; i < samples; i++)
{
reading += analogRead(port);
}
reading /= samples;
return reading;
}
void clockCycle(int pin, int count)
{
while(count–)
{
digitalWrite(pin, HIGH);
digitalWrite(pin, LOW);
}
}
int ledToPin(int color)
{
switch(color)
{
case 0: // red
return 2;
break;
case 1: // green
return 3;
break;
case 2: // blue
return 5;
break;
}
}
void ledOn(int color)
{
digitalWrite(ledToPin(color), LOW);
}
void ledOff(int color)
{
digitalWrite(ledToPin(color), HIGH);
}
void ledsOn()
{
for(int i = 0; i <= 2; i++)
ledOn(i);
}
void ledsOff()
{
for(int i = 0; i <= 2; i++)
ledOff(i);
}
// returns n samples from start of readback to end of readback
void readLine(byte* output, int samples)
{
int zeroLevel;
int blackLevel;
int clocks;
int i;
int samplePos = 2593 / samples;
int currSample = 0;
shiftOut(TRGPIN, CLKPIN, MSBFIRST, 0xF0); // trigger pulse and slow clock
// lock step through front porch with slow clock in order to capture reference levels without unpredictable jitter
clockCycle(CLKPIN, 4);
// sample black level
for(i=0; i < 3; i++)
{
clocks=5; while(clocks–)
{
clk=1;
clk=0;
}
blackLevel += avgRead(A0, 3);
}
blackLevel /= 3;
// Serial.print("blackLevel = ");
// Serial.println(blackLevel);
// 65 more clock cycles until analog goodies
clocks = 65; while(clocks–)
{
clk=1;
clk=0;
}
#define ANALOG_CLOCKS (12 * 216 + 1)
int stepSpacing = ANALOG_CLOCKS / samples;
int nextSample = 0;
// go through analog bins
for(i = 0; i < 12 * 216 + 1; i++)
{
clk = 1;
if(nextSample– == 0)
{
dbg=1;
nextSample = stepSpacing;
// output[currSample++] = map(avgRead(A0, 5), blackLevel, 1024, 0, 255);
output[currSample++] = map(analogRead(A0), blackLevel, 1024, 0, 255);
dbg=0;
}
clk = 0;
}
#if 0
for(i = 0; i < 2593; i++)
{
clk =1;
clk =0;
}
#endif
}
void loop() {
int led = 0;
byte samples[64];
byte redSamples[NUMPIXELS];
byte greenSamples[NUMPIXELS];
byte blueSamples[NUMPIXELS];
int i;
ff=1;
ff=0;
#if 1
ledOn(0);
readLine(redSamples, NUMPIXELS);
ledsOff();
ledOn(1);
readLine(greenSamples, NUMPIXELS);
ledsOff();
ledOn(2);
readLine(blueSamples, NUMPIXELS);
ledsOff();
#endif
#if 0
for(led = 0; led < 0; led++){
ledOn(led);
readLine(samples, 4);
ledOff(led);
}
ledsOff();
#endif
for(i = 0; i < NUMPIXELS; i++)
{
#if 0
Serial.print("sample[");
Serial.print(i);
Serial.println("] = ");
Serial.print("red ");
Serial.println(redSamples[i]);
Serial.print("green ");
Serial.println(greenSamples[i]);
Serial.print("blue ");
Serial.println(blueSamples[i]);
#endif
pixels.setPixelColor(i, pixels.Color(pgm_read_byte(&gamma8[greenSamples[i]]), pgm_read_byte(&gamma8[redSamples[i]]), pgm_read_byte(&gamma8[blueSamples[i]])));
// pixels.setPixelColor(i, pixels.Color(0, 0, 0));
// pixels.setPixelColor(i, pixels.Color(redSamples[i], greenSamples[i], blueSamples[i]));
// pixels.setPixelColor(i, pixels.Color(pgm_read_byte(&gamma8[redSamples[i]]), pgm_read_byte(&gamma8[greenSamples[i]]), pgm_read_byte(&gamma8[blueSamples[i]])));
// pixels.setPixelColor(i, pixels.Color(pgm_read_byte(&gamma8[redSamples[i]]), pgm_read_byte(&gamma8[redSamples[i]]), pgm_read_byte(&gamma8[redSamples[i]])));
pixels.show(); // This sends the updated pixel color to the hardware.
}
// delay(100);
//delayMicroseconds(100);
}
void old_loop() {
int bin;
int i;
int samples[12];
int clocks;
int zeroLevel;
int blackLevel;
static int led=0;
//shiftOut(TRGPIN, CLKPIN, MSBFIRST, 0);
dbg=1;
zeroLevel = avgRead(A0, 5);
// zeroLevel = analogRead(A0);
dbg=0;
dbg=1;
shiftOut(TRGPIN, CLKPIN, MSBFIRST, 0xF0); // trigger pulse and slow clock
dbg=0;
// lock step through front porch with slow clock in order to capture reference levels without unpredictable jitter
dbg=1;
clockCycle(CLKPIN, 4);
dbg=0;
dbg=1;
for(i=0; i < 3; i++)
{
clocks=5; while(clocks–)
{
clk=1;
clk=0;
}
blackLevel += avgRead(A0, 3);
}
blackLevel /= 4;
// Serial.print("blackLevel = ");
// Serial.println(blackLevel);
dbg=0;
if(led == 0){
ff = 1;
ff = 0;
}
ledOn(led);
//ledsOn();
dbg=1;
clocks = 40; while(clocks–)
{
clk=1;
clk=0;
}
dbg=0;
for(i = 0; i < 350*8; i++)
{
clk =1;
clk =0;
}
dbg =1;
dbg=0;
// Timer1.pwm(CLKPIN, 512); // fast clock
/* dbg=1;
for(i = 0; i < 300; i++)
{
samples[i] = analogRead(A0);
//delayMicroseconds(2000);
}
dbg=0;
*/
// sample front porch reference level 2 clocks later, for 80 hs clocks
// sample bins 83 clocks after fast start
// bins seem to be 215 clocks wide, 12 bins, 1 clock per pixel
//delayMicroseconds(1);
#if 0
dbg=1;
noInterrupts();
while(analogRead(A0) -5 < zeroLevel)
;
interrupts();
// wait for voltage to increase to follow clock jitter
dbg=0;
#endif
dbg = 1;
blackLevel = avgRead(A0, 5);
// blackLevel = analogRead(A0);
dbg = 0;
#if 0
noInterrupts();
while(analogRead(A0) -10< blackLevel)
{
dbg=1;
delayMicroseconds(0);
dbg=0;
}
;
interrupts();
#endif
dbg = 1;
delayMicroseconds(1);
dbg = 0;
/*
delayMicroseconds(100);
dbg=1;
bin= analogRead(A0);
dbg=0;
*/
// delayMicroseconds(2670);
Timer1.stop();
digitalWrite(CLKPIN, LOW);
/*
Serial.print("zeroLevel = ");
Serial.println(zeroLevel);
Serial.print("blackLevel = ");
Serial.println(blackLevel);
/* Serial.print("bin = ");
Serial.println(bin);
*/
//delay(50);
#if 1
ledOff(led);
// switch LED
if(++led > 2)
led = 0;
#endif
//ledsOff();
// Serial.println(led);
// Serial.print("normalized = ");
// Serial.println(map(bin – blackLevel, zeroLevel, 1024, 0, 255));
//delay(10); // inter line delay
delayMicroseconds(100);
}
view raw sketch hosted with ❤ by GitHub
the scan head expects a trigger, then a clock, analog values come out on one of the pins during the clocking
the first few elements are from dark elements so you can use them as a reference
sketch reads the 3 full color fields and renders them on a ws2812b strip
these are supposed to be in close contact with paper or something, but it works ok to about 4 inches (can resolve space between fingers)
view raw what hosted with ❤ by GitHub


Magnetic Tape

DLT IV Fujifilm: ~10um.
3490E: 18um.