The contents of this page derive from tinkering, poking, tracing, and other low-assurance methods of engineering! Please do not depend on any of the contents seriously.


If you are in any way responsible for the construction of this device, write to me and I will buy you several beverages of your choosing; seriously, this thing is amazing.

What little information exists about this device online can be found at http://www.kodak.com/TW/en/business/dsCd.shtml ; the CDL144 I have is the larger of the two products of the family, the other being the CDL54. Mine came configured with 4 SCSI CD-ROM drives and 6 magazines (for a capacity of 108 CDs). I have subsequently replaced the drives with bluray capable SATA devices and put an embedded computer in some free space in the device. I will get pictures up eventually.

Software Library

Based on the effort described on this page, I have started writing software to actually make use of the robot through its debugging interface. See the README .

Hardware Description

Central logic board

Major ICs on the Kodak logic board include:

  • Motorola MC68332ACFC16 CPU; datasheet http://www.nxp.com/files/microcontrollers/doc/data_sheet/MC68332TS.pdf

  • Symbios Logic 53CF92 SCSI bridge

  • AMD AM29F040 FLASH (512Kx8)

  • Toshiba TC551001BFL-70L memory (128Kx8 SRAM)

  • ST M48Z08-100PC1 nonvolatile memory (8Kx8)

  • max708 supervisory circuit

  • PBL 3770A motor controllers (x2 for one stepper)

  • lmd18245t motor controllers (x2 for one stepper)


  • Every header is uniquely sized, so there’s no possibility of confusion, other than J2/J18. The stepper goes in J18.

  • J1 is power. I’ll get a pinout later.

  • J2 is clearly a debugging header of some form, as the wires chase off to the 68Ks debugging pins. Does not appear to be JTAG.

  • J4 is a serial interface for debugging and commanding the robot. Pin 1 is +5V power, then RX then TX, then ground. Due to the JST connector, it may be tempting to grab ground from nearby on J5. Don’t do that; it yields a lot of bitflips for reasons unknown.

  • J5 is unknown, but it looks like board-edge-side is all ground pins and board-internal-side is logic lines pulled high. Some kind of configuration jumpers?

  • J10 interfaces to the supervisory circuit, possibly to be a reset button?

  • J11 connects to the mailbox circuitry

  • J16 connects to the top sensor board

  • J20 connects to terminator power on the SCSI bus. It appears that the device is held in some kind of very early RESET state (it doesn’t even get as far as printing out the welcome message on the serial port) if there isn’t external teriminator power… Jumping J20 solves that problem, but still requires that there be a terminator on the SCSI line.


The picker itself contains a few sensors (the barcode scanner, a photo slot interruptor to measure tray arm position, and another photo slot interruptor to detect CD presence), but is mostly gears.

Bottom Sensor Board

Contains three presumably-IR LEDs and attaches to a membrane contact sensor used to detect picker zero position.

Top Sensor Board

Contains three OPL821 IR sensors from Optek (http://optekinc.com/datasheets/OPL820.PDF) and a Sharp GP1A70R photointerruptor sensor (http://media.digikey.com/pdf/Data%20Sheets/Sharp%20PDFs/GP1A70R_71R.pdf). The former stare into beam channels from the bottom sensor board and form the receiving end of the Drawer, Tray, and CD sensors. The latter is used as part of a disk encoder for the picker position.

Serial Interface

Connecting at 9600 8n1 to J4 and powering up the machine yields:

(C)1996 KODAK AG Technik, Muehlhausen/Germany

Lynx PM Firmware Version:  1.41 (Jul 18 1997)
Lynx PM Download Version 1.01 (Jul 21 1997)
KAGOS68K Version: V1.01 (May 20 1997)
FLASH Checksum is OK: 01097577
Lynx Model: 144P

Selftest of SCSI Controller successfully passed
Status #0: IDLE: no errors.

Asking for help yields:

Command (Abbr.) |  Description
AddOffset (A)   | add a offset to a location.
Barcode (B)     | read barcode of a magazine.
CWHEEL  (C)     | read codewheel count.
CLS             | clear screen.
DL              | download a Lynx firmware.
Drive   (D)     | open/close drive drawer.
EX              | display # of exceptions.
GetCount        | get the current SW actuation counter value.
GetLogs         | get the event logs or error logs.
Help    (H)     | this menu.
Init            | initialize the robotics.
Inv             | initiate an inventory of magazines.
LED             | turn on/off/flash red and greed LED.
Lift    (L)     | position the picker at an element.
Loc             | get/set the position of the elements.
Mailbox (MB)    | open/close mailbox.
Move    (M)     | transportation of CD.
MoveMag (MM)    | transportation of all CDs of a magazine.
ParBar          | get/set barcode system parameters.
ParLift         | get/set lift system parameters.
ParMB           | get/set mailbox system parameters.
ParTray         | get/set tray system parameters.
Pattern (PAT)   | get/set the pattern of the stepper motors.
Pick    (P)     | pick a CD out of tray.
PickRel (PR)    | pick and release a CD.
Queue   (Q)     | display msg queue status.
Ramp            | modify the lift and tray motor ramp.
Release (R)     | release a CD into tray.
Reset           | reset the system.
SCSI            | view/change robotics SCSI-parameters
Sensor  (S)     | get status of the sensors.
Setbaud         | change the RS232 interface baudrate.
Status  (ST)    | get status of the robotics.
Task            | get the ready task queue.
Tray    (T)     | open/close tray.
Ver             | display current version and Lynx model.

Unfortunately, many commands seem to take parameters and there doesn’t seem to be a way to find out what they are in all cases.

Occasionally, the unit will complain about a ERROR #82: Clear Path error. and refuse to move the robotics. I assume this means that it thinks something has gotten in the way. A reset, with a full inventory, should suffice to clear the error; I wish there were a less obtrusive way.

Hexadecimal Lift Positions

Most of the time, the robot refers to things in a kind of logically named scheme: drives are dN, magazines are mN, slots within magazines are mNsN and the mailbox is mb.

The robot does, however, have some curious ideas about names for things in different contexts; the Drivehome status field, the Picker Home status field, and the Lift command refer to “lift element positions” (which are denoted in hex) and appear to behave as follows:

  • mb is element 100

  • d1 through d4 are 200 through 203 in order

  • m2s1 starts us off at 1000 and we count up from there; m5s1 is 1036, m5s5 is 103a, m5s18 is 1047, m6s1 is 1048, m6s18 is 1059, m7s1 is 105a, etc.

  • Everything else (intermediate positions or no home) are indicated by ffff (-1).

In tabular form:

Human mnemonic

Numeric (hex)



200 - 203


m2, m3, …



m2s1, m6s7, …

1000 and up

Slots within magazines




Tray Positions

For use with “t” commands; integer approximations are accepted at the command line.





Tray fully closed



Tray extended, picker on initial descent


Tray extended, picker almost fully inserted



Tray extended, picker near center range


Tray extended, picker retracting with CD

near RI


Tray extended, picker almost fully retracted


Tray fully retracted, picker has CD


Drive Status Codes

The “status” command will give single letters for drive status: “D1=?” where “?” is apparently one of…











The o and x have similar meanings for magazine information. Magazines can also display b if you permit the machine to inventory and forget to close the door lever. (Grinds a lot of gears, try to avoid it.)