retrocmp

Main Menu

  • Home
  • Stories
  • Tools
  • How-To's
  • Articles
  • Projects
  1. You are here:  
  2. Home
  3. Projects
  4. BlinkenBone physical panels

BlinkenBone physical panels

Beside simulated Java panels, also REAL panels can be connected to BlinkenBone client programs (speak: "SimH").

Standard method is with a BeagleBone micro system, to which special hardware is connected.

blinkenbone vcfb2015 detail

Also the PiDP8 replica made by Oscar Vermeulen can be made into a BlinkenBone component.

 

 

PDP-15 console panel on BlinkenBone

Details
Written by: Administrator
Parent Category: Projects
Category: BlinkenBone physical panels

"In trying to limit [PDP-15] console cabling, a time division multiplex communication
scheme was designed to get the signals to the lights and from the switches.
In
this scheme, a number of signals were transmitted on the same wires on a timeshared basis,
and the console lamp filaments were used as storage elements.

While this scheme was clever enough to gain the PDP-15's only patent, it was generelly unsatisfactory.
It made the console logic so complex that when it
failed, it was harder to fix than the processor."

From Bell, Mudge, McNamara: "Computer Engineering", page 160

 

Here comes an original PDP-15 console connected to BlinkenBone. This allows to operate a simulated SimH-PDP-15 through the original "blinkenlight" panel.

blinkenbone frontal
blinkenbone side

blinkenbone back

Isn't it nice? Seems to be a late PDP-15/40 "XVM" model, because it has a BANK MODE switch. A date stamp shows: build in 1970.

* * *

I got this panel donated from a member of my computer club C-C-G. Sadly he deceased before completion of the project.

* * *

The PDP-15 BlinkenBone box assembly consists of two parts: the ancient panel, and behind a separate metal case with simulation and interface electronics. Both are mounted onto a black plate.

 

panel pdp15 back panel pdp15 boards

The PDP-15 panel is in fact made of two separate units, each with individual power and data cables: "Indicator Board" with lamps, and the "Switch Board".

The orignal flat cables were cut off, I had to solder new ones onto the boards.

pdp 15 cable original pdp 15 cable new

Very narrow! It took a while until my circuit tester was silent.

  blinkenbone open

The BlinkenBone electronics consists of

  • A "Rittal 1505.510" case, dimensions 50x20x12 cm.
  • BeagleBone credit-card sized micro Linux system
  • BlinkenCape (adapter board with UARTs)
  • BlinkenBoard (parallel I/O)
  • auxilliary ATmega micro controller
  • two power supplies

 

"Blinkenbonizing" the physical PDP-15 console panel

Connecting the PDP-15 to BlinkenBone was quite an adventure.
The "normal" PDP-11 panels are just a bunch of LEDs and switches, each having its own wire with TTL signals. To connect to the BlinkenBoard almost nothing has to be done: just sort the wires!

Even the PDP-10 KI10 was not this different. Sure, the lamps are driven with +12 V, and every button had a lamp in it. But all in all only the wire count was challenging.

The PDP-15 is special:

  • lamp ("Indicator") Board and Switch Board are totally separated, so in fact two units to connect.
  • it has lightbulbs instead of LEDs, which all were soldered in. All must be replaced and they produce heat.
  • the electronic is designed to consume -6V, +5V, +10V and +30V ... do you really need 4 power supplies?
  • switches and lamps are arranged in a multiplex array: in a circular fashion only one of 3 lamp or switch rows is accessed by software at given time. On a plus side, this reduces the wire count. But signal generation is complicated.

blinkenbone cables

Voltages

I realized I could not generate all needed voltages with a PC power supply as usual. I had to deal with these voltages:

+10V on the Indicator Board: Luckily, the +10V are only needed to generate +5V for the TTL chips:
DEC routes 10V over a big 10 watt resistor so the TTLs draw power down to almost +5V, fine regulation is made with a small Zener diode.

indicator board +10vSo no +10V are needed, just bypass the resistor.

 

-6V on the Switch Board: I tried to generate the -6V from the PC power supplies -12V over an 7906 regulator.  Normally -12V on PC power supllies is rated with 300mA, but I found a small TSX 250W part with -12V rated at -800mA.
So no problem? Oh well: When the needed 400mA were drawn the power supply switched off. What about the proposed 800mA? A research indicated that my power supply was the only one on earth with more than 300 mA rating!
Perhaps some China guy scanned a datasheet and the OCR converted a "300" to an "800".

What to do? The schematic for the switch board is a bit strange, but the -6V are just needed to give some switching transistors a slightly negative bias. I wired -6V to GND and bypassed some diodes and resistors, everything is fine now.

PDP 15 Systems Maintenance Manual Engineering Drawings Volume 2  (Dec 1979, DEC 15 H2BB D) switch board modified small(Click for full modified Switch Board schematic)


+30V: is needed on the Switch Board and on the Indicator Board.

  • On the Switch Board it feeds a closed switch with "High" level and is then reduced to TTL level via diodes and resistors. So why all this hazzle ??
  • On the Indicator Board the +30V drives the lamps, about 2 amps are needed. I added a 2nd power supply .

 

Light bulbs: the power supply.

Getting the lamp array operable was quite a journey!

first light on

At first I bought a 30V power supply as rated. The lamp voltage is so high because of multiplexing: each lamps is ON only a fraction of time, and must be driven with overvoltage to get their normal light level on average.
+30V is a bit unusal, but I found a sealed power supply offered as replacement for LCD monitors.

Lamp rating and replacement:

Still open question: Are these light bulbs driven with 14V or 24V or what?
I tested the lamps and found some dead and lighting level generally quite different.
So I replaced them all. The light bulbs are "T-13/4 Bi-Pin". In the PDP-15 schematic the type is indicated as "#2335".
You can by a type "2335" from CML still today, it is rated at 14V nominal.
Stupidely I FIRST bought compatibles 14V bulbs from Mouser, THEN checked the original PDP-15 bulbs again: They need in fact 24V instead of 14V! The usual DEC documentation error, change of type rating of years, or heavily aged bulbs?

lightbulbs old+new

Anyhow, now I had a bunch of 14V bulbs, and a 30V power supply.

After first shock there was a cheap solution: since the lamps are multiplexed, the software can inject some idle cycles to reduce average power.

Later I changed the power supply to a 15..23 V type, and the mulitplexer introduces no idle cycles anymore.

Lightbulb overvoltage MUX watchdog

Since the lamps are multiplexed, they are only ON 1/3 of time. This is the reason they're driven with overvoltage.
The multiplexing lamp driver runs in the BlinkenBone server on the BeagleBone. Backdraw is: on any software error, or if the Linux decides to kill or stop the task, MUXing stops and a whole row of lamps will quickly burn out.
Also debugging the MUX server logic would be impossibly without destroying my lamps.

mux light row bright(Lamp row: 14V bulbs driven with +30V, about to burn)

To protect against this, I added an ATmega88 micro controller.
He just monitors the MUXing inputs to the Indicator Board, and drives a relay switching the +30V.
If any row signal remains constant too long, lamp power is switched off. Cool.

blinkenbone atmega

 


Aged transistors
After having finished the Blinkenlight API server and the multiplexing software, I found the lamps lighting levels still very uneven. Reason was not clear at first, since all bulbs were replaced with fresh ones already.


Cause were the switching transistors on the Indicator Board: there's one transistor per lamp, acting as matrix node, and there are more powerful switchers for a block of every 6 lamps driven by the "row select" signal.

indicator mux node schematic
After 40 years the current gain of these has gone quite bad!

I replaced all 12 power switches 2N2219A, and situation became much better. I measured all 2N2219A's: the original 1970 ones had a current amplification hFE of 88..130, generation 2016 has about hFE=250. Then for the 10 darkest bulbs I also replaced the matrix node transistors ... looks quite good now!


The heat is on

The step from LEDs to light bulbs means one thing: HEAT.
The whole panel has about 70 lamps, each dissipating about 1 watt. And the switching transistors add their part too.

lightbulbs heating

After 15 Minutes of run with all lamps on, temperature was so hot I couldn't touch the light guiding board with my hands, and the acryl board began to warp!

First design for the case was a neat closed outfit. I had to rework it to have gaps for venting. Technically a good solution, but now the ugly stuff inside can be seen.

Reduced lamp voltage

And I replaced the 30V power supply by one with adjustable power levels (a universal notebook power supply with 15,19,22,24 V), to have some freedom to experiment with.
At 30V the multiplexer process drove each lamp with 1/6 duty cycle; at 20V the same brightness is achieved with 1/3 duty cycle.
Also the watchdog ATMega had to be reprogrammed.

Now the panel feels not too hot if 60% of the lamps are on for hours. Lamp voltage is 22V, which can be reduced to 19V if things start to smell again.

The reduced lamp voltage level has one further advantage: On system load the Linux scheduler may stop the muxing process for a period.
Muxing stoppes shortly for about 100ms, this caused visible flicker with the +30V (a whole row "flashes up").
With 20V the lamps are not so overloaded and the flicker is much less visible.

Shining

And yet another problem: if many lights are ON, they shine backward throught their printed circuit board (PCB) and into the room behind panel and electronic case. LEDs don't do this!
In the original PDP-15, there was only air behind the panel, but my design put a white wall there. This forms a light box which gets very bright inside.
Now also lamps which are OFF get light from behind, contrast between ON and OFF lamps is poor.

Blinkenbone lightbox black

Situtation could be improved a bit by painting everything behind the panel to black. I was temped to blacken also the indicator PCB, but it's original and should not be touched.

The power/repeat rate knob

Remember those old radio amplifiers, where Power and Volume were both functions of the same knob?
The PDP-15 is switched ON exactly this way, by operating the rotational "REPEAT_RATE " knob.

knob frontal repeat rate pos06 knob repeat rate schematic

 

The two "POWER ON" signals are connected to GROUND and the green "PS ON" ("Power Supply ON") wire of the PC power supply.

The lamp voltage is controlled by the ATmega watchdog and only powered ON, if the Blinkenlight API server produces proper multiplexing signals.

And the value of the "repeat rate" potentiometer is digitized to an 8bit value range of 0..255 by the ATmega AD converter.

 

Ports

These I/O ports are routed to the outside:

  • BeagleBone's Ethernet
  • BeagleBone's USB (for a WLAN stick outside the metal cage)
  • The 4 RS232 ports from the BlinkenCape

blinkenbone ports

The RS232 can be used for additional terminal session to the BeagleBone's Angstrom Linux.

But much better: SimH 4.x can connect simulated serial ports to physical ones (earlier version could only connect Telnet ports to simulated ports). So several VT-terminals can be connected to the PDP-15 and operated under a multi-user operating system like XVM/RSX.

If the Linux devices for the UARTs are

/dev/ttyS1
...
/dev/ttyS4

then SimH connects with a statement like

sim>attach dz Line=1,connect=/dev/ttyS1
...
sim>attach dz Line=2,connect=/dev/ttyS4

 

Software

To be of any use, the PDP-15 BlinkenBone box must implement the "Blinkenlight API server interface".

blinkenlightd a

So a C command line program was written, which

  • defines the logical "controls" of the PDP-15 panel ("Register lamp field", "Data switches" etc),
  • makes the panel accessible over the API interface with Remote Procedure Call (RPC),
  • transforms logical switch and lamp values into bit patterns,
  • and multiplexes those bitpatterns over the BlinkenBus interface "/dev/blinkenbus" to the BlinkenBoard I/Os.

The server is called "pdp15_blinkenlightd" and runs only on the BeagleBone. It is started automatically on Linux boot.

Since Indicator and Switch Board are controlled independently, I could use different multiplexing frequencies:

  • Lamps are multiplexed with 1kHz (do be flicker-free),
  • the switches are sampled with just 10 Hz (to supress contact bouncing on some keys).

 

blinkenlightd b

Running your own panel

Finally, there's a virtual version of this PDP-15 panel! So you can play with it, without the hazzle of mounting your own hardware.

And it's free, you don't have to steal a PDP-15 in the next museum.

PiDP8 as BlinkenBone panel

Details
Written by: Administrator
Parent Category: Projects
Category: BlinkenBone physical panels

Oscar Vermeulen made a cute PDP-8/I replica. People love it, the web is full of images and stories.

Offical web presence is here: http://obsolescence.wix.com/obsolescence#!pidp-8/cbie

It's called "PiDP8" because a RaspberryPi is build in.

See it here together with a REAL PDP-8/I and a monitor with the Java panel simulation:

Three PDP8I's: DEC original, BlinkenBone Java simulation, PiDP8

Choose your '8/I ! (click to enlarge)

 

Use the PiDP8 with REALCONS SimH

On GitHub there is a "rpi" distribution. This contains all binaries to run on the RaspberryPi, among others the special BlinkenLight API server for the PiDP8.

Quick start:

  1. Make an network connection to the RPi,
  2. copy the panelsim_rpi.tgz over,
  3. login with ssh and unzip with "tar xzf panelsim_rpi.tgz". It will need 1.3 GB, since all simulated machines with their disk images are installed !
  4. execute ./pidp8.sh

Then ADVENTURE is started on OS/8, the lights on the PiDP8 begin to blink. Now SimH can be operated over the PiDP8 replica switches.

If you execute ./pdp8i.sh instead of ./pidp8.sh, you start the Java panel simulation. You need to connect a monitor on the HDMI port then.

 

Tired of ADVENT?

Everything written for the simulated PDP8 Java panel applies to the PiDP8. See here how to build and toggle-in own assembler programs.

 

Why a 2nd SimH implementation for the PiDP8 ?

Why not ?

The PiDP8 comes ready-to-use with a modified SimH, so connecting to BlinkenBone is really not necessary.  But I liked to play with it! As test case for later projects I made an Blinkenlight API server for the PiDP8, so it's now part of the BlinkenBone world.

You can easily switch from the Java PDP-8/I simulation to the PiDP8 as front end, without leaving the BlinkenBone environment.

If you connected on your desktop to the Java panel with

sim> set realcons host=localhost panel=PDP8I connect

then switch to the Rpi (after starting rpcbind and the server there!) with:

sim> set realcons host=raspberrypi panel=PiDP8 connect

The PiDP8 server contains a anti-flicker low-pass and simulates slow lightbulb with the LEDs.

 

That "Deposit" switch again

As on all DEC panels, the "Deposit" switch has a reverse polarity, to prevent accidental memory change.

For the PiDP8 replica only bi-stable switches could be found (and that was hard enough!), so the mechanical "Off" position must be set by hand.

Compare with the physical PDP-8/I panel:

blinkenbone pdp8i deposit blinkenbone pidp8 deposit

The default SimH of Oscar doesn't implement the Deposit as inverted. So Oscar's SimH and my PiDP8 server behave different here.

 

Physical PDP-10 KI10 console panel

Details
Written by: Administrator
Parent Category: Projects
Category: BlinkenBone physical panels

My PDP-10 KI10 panel lay around for almost 1 1/2 years, until it was shown on the VCB 2014 in Berlin.

pdp10 ki10 all lamps

 

It kept me busy over half a year. The story describing this adventure is found here.

Meanwhile there's an article on HACK A DAY about it.

BlinkenBone - "blinkenlightd": patch field decoding and console panel simulator

Details
Written by: Administrator
Parent Category: Projects
Category: BlinkenBone physical panels

"blinkenlightd" is a background service ("daemon") written for the BeagleBone. It publishes the attached console panels to Blinkenlight API clients. It normally does not talk to users, but communicates over these other interfaces:

  • It provides a BlinkenLight API server interface for clients, see the "Blinkenlight API" page.
  • It converts the digital signals connected to the BlinkenBoards to usable "control values". The information how to do this is read from a configuration file.
  • It uses the file interface "/dev/blinkenbus" to control the BlinkenBoards.

Connecting panels to BlinkenBoards

If you connected the wires from a vintage panel to the I/O chips on the BlinkenBoard, you typically

  • solder some kind of connectors onto the patch field
  • and route wires from the connectors to the terminals of the input or output register chips.

It doesn't always looks nice, if a programmer tries to solder:

blinkenbone blinkenboard wirewrap

The assignment between console panel functions and I/O register bit positions must be evaluated by software then.

Problem: decoding/encoding bit patterns into control values

Translating raw digital I/O signals to useful application data involves lot of bit masking and bit shifting. This is usually done in program code which is specialized for the hardware in use.

Example 1:

The 11/40 console panel has a 18 bit switch row for data entry, it is labled "SR" by DEC (for "Switch Register). Let's say the wires coming from SR are connected to the BlinkenBoard with address 1 as follows:

Panel  BlinkenBoard
signal board address
register bits
SR0..SR7 #1 IN0 0..7
SR8..SR15 #1 IN1 0..7
SR16,SR17 #1 IN2 0..1

 To get the 18 bit data value for the Blinkenlight API control object, you would use C code like this:

SR_value = get_board_register_data(1, 0)
| ( get_board_register_data(1, 1) << 8)
| ( get_board_register_data(1, 2) << 16) ;

Example 2:

The LED "VIRTUAL" is connected to bit 6 of output register 2 on board #1.

To set the LED, this code would be necessary:

tmpval = cached_OUT2_value ;
if (led_virtual)
tmpval |= 0x40 ; // set bit 6
else
tmpval &= ~0x40 ; // clear bit 6
set_board_register_data(1, 2, tmpval ) ;
cached_OUT2_value = tmpval ;

 So for each connection schema, specialized decoding logic must be programmed.

Solution: generic logic and a configuration file

The program code of blinkenlightd does not contain any special code for a certain console panel.
Instead actual wiring is read from a configuration file. If wires are changed on the patch field of a BlinkenBoard, only the configuration file must be changed accordingly.

Bit masking and shifting is done by fixed generic logic in blinkenlightd.

This diagram illustrates how raw digital I/O data from the panel is mapped to proper "control" values:

blinkenlightd configuration file small

(click image to enlarge)

The configuration file is also a good documentation about what you've done on the patch field!

The name of the configuration file is normally "/etc/blinkenlightd.conf", since it is the setup file for a Linux service.

In the attachement you find two files:

  • the grammar of the configuration files (I used the wunderful "ANTLR" parser generator).
  • the full configuration file for the PDP-11/40 panel.

FULL configuration file entry for Example 1:

 control =
        {
                // 18 switches, for data and address input
                name = "SR",  // "Switch register"
                type = SWITCH,
                encoding = BINARY,
                blinkenbus_wiring =
                {
                        // 18 wires, connected to board 1, input register chips 0, 1 and 2
                        register_wiring =
                        {
                                value_bit_offset = 0, // define bits 0..7 of value
                                board = 0x01,
                                register = IN0,
                                bits = 0..7, // lsb on register = lsb in value!
                                levels = active_high // is default
                        }, //
                        register_wiring =
                        {
                                value_bit_offset = 8, // define bits 8..15 of value
                                board = 0x01,
                                register = IN1,
                                bits = 0..7  // lsb on register = lsb in value!
                        }, //
                        register_wiring =
                        {
                                value_bit_offset = 16, // define bits 16..17 of value
                                board = 0x01,
                                register = IN2,
                                bits = 0..1// only 2 lsb bits  for addr 16 & 17
                        }
                }
        },

FULL configuration file entry FOR EXAMPLE 2:

 control =
        {
                name = "VIRTUAL",
                type = LAMP,
                encoding = BINARY,
                blinkenbus_wiring =
                {
                        register_wiring =
                        {
                                value_bit_offset = 0,
                                board = 0x01,
                                register = OUT2,
                                bits = 6
                        }
                }
        }     


 

*  *  *  *  *

Normally blinkenlightd runs without user interaction. But it has two interactive modes:

Using blinkenlightd to test the configuration file

blinkenlightd can check the configuration file for logical errors. Call it with these options:

 blinkenlightd -c configuration_file_name -t

Using blinkenlightd to simulate the console panel defined in the configuration file

This is tricky. If you call blinkenlightd like this

 blinkenlightd -c configuration_file_name -s

it goes into interactive simulation mode.

It does not access the real console panel over "/dev/blinkenbus" anymore, instead it shows a crude text simulation of the panel described in the configuration file:

blinkenlightd simulation

 

The function is simple:

  • A list of the output controls and input controls with their current values is shown.
  • If a client sets an output control value over Blinkenlight API, the display is updated.
  • The value of an input control (a simulated switch) can be set by the user. A Blinkenlight API client gets the new input value on the next call to blinkenlightd.

In simulation mode, blinkenlight does not access any hardware over /dev/blinkenbus. So it can run on any platform, it is not bound to the BeagleBone.

If you like to impress people on an exhibition, you must write an graphical console panel simulator. But blinkenlightd in simulation mode is a valuable tool to develop or debug machine simulation clients without access to a physical BeagleBone/BlinkenBus/BlinkenBoard/panel installation.

blinkenlight_panel_config.g -- ANTLR grammar definition for blinkenlightd configuration file

pdp11-40.conf -- blinkenlightd config file for PDP-11/40 panel

BlinkenBone - "/dev/blinkenbus": accessing low level I/O data

Details
Written by: Administrator
Parent Category: Projects
Category: BlinkenBone physical panels

The Linux file interface for BlinkenBoards: /dev/blinkenbus

BlinkenBus address space.

Over BlinkenBus up to 32 BlinkenBoards can be connected, each occupying an address space of 16 bytes. In the board address space, 11 output registers and 5 input registers are located on overlapping addresses, byte address 15 gives access to the read/write board control register (see "BlinkenBus specification" attachement on the hardware page). The absolute 9-bit address of a certain register chip is given by the formula:

<absolute addr> := 16 * <board_address> + <register_address_on_board>

Over these registers you can read and write raw digital I/O data from the connected blinkenlight panel.

Accessing the BlinkenBus address space as a file

User applications can access I/O registers on the BlinkenBus very easy over a file interface.

The 512 register addresses are arranged as a file of 512 bytes. Reading certain positions in the file accesses the input registers, writing sets the output registers. This file is a simple character device file node, named "/dev/blinkenbus".

The translation between BlinkenBus signal patterns and the device file is done by a Linux kernel mode driver. On access to "bytes in the file" he creates the BlinkenBus signals patterns by toggeling with GPIO (general purpose IO) pins of the ARM cpu.

Example "read":

To get the signals on input register 4 on a board with address switched to hex 0xb (decimal 11), global address 11*16+4 =>180 must be read. This is done by opening "/dev/blinkenbus", moving the read pointer to byte 180, and reading it.

In a C program you would use these Linux system calls:

fbb = open("/dev/blinkenbus", O_RDWR | O_SYNC) ;
lseek(fbb, 180, SEEK_SET) ;
read(fbb, &your_byte_buffer, 1) ;

You can even do this from the shell prompt with the user command "dd", which is used for block read/write on files:

$ dd if=/dev/blinkenbus bs=1 seek=180 count=1 of=your_file 

The byte value of register 4 on board 11 is written to the file named "your_file". Don't let the output go to terminal screen ... or prepare for some strange characters appearing.

Speed

A Linux system calls like "read()" is much slower than an access cycle to the BlinkenBus in the driver.

Tests indicate that BeagleBone can perform about 10.000 system calls per second. Even unoptimized driver code generate 250.000 BlinkenBus access cycles per second.  So it's good practice to bundle read or write accesses to BlinkenBus registers into few block read/write transactions whenever possible.

Protection against hardware changes

There is one big benefits to have "/dev/blinkenbus" as interface: The underlying hardware (BlinkenBus, BlinkenBoards) can be modified or replaced by something totally different without impact to the overall system.

For example, there may be needs to change BlinkenBus from parallel to SPI or I2C or CAN bus. Or the BeagleBone itself is replaced by some other embedded Linux  hardware with an incompatible GPIO system.

In any case, as long as the driver for the new hardware implements "/dev/blinkenbus" as defined, no application needs to be changed.

Who else needs this?

Well, accessing device data over pseudo files is the BIG standard under Linux: "Everything is a file"

You can open the file and access BlinkenBoard I/O from any programming environment, including

  • the hot web app builder Cloud9 for node.js and bonescript
  • script languages like Python
  • Java
  • classic C/C++

And you are not limited to Blinkenlight applications.

If you need massive digital I/O for the BeagleBone, think about using BlinkenBoards!

  1. BlinkenBone - hardware components

Page 1 of 2

  • 1
  • 2

New articles

  • UniBone - BlinkenBone Programmer's Reference
  • UniBone - BlinkenBone Panels
  • QProbe2023 - More Idle Patterns in RSX11M+ and 2.11BSD
  • uTracer11 - The Message Protocol
  • uTracer11 - Simulators
  • uTracer11 - GUI UNIBUS and Memory
  • uTracer11 - GUI CPU Visualization
  • uTracer11 - GUI Overview
  • uTracer11 - M93X2 in PDP-11/34
  • uTracer11- FAQ

Contact

  • Impressum
  • Become an author