Sunday, June 21, 2020

DIY NES to Atari Controller Adapter

I wanted to use my favorite NES controller with my controller-less Atari 65XE and 130XE. The NES controller uses a shift register, while the Atari expects 5 simple buttons. I wrote a simple Arduino program to convert one to the other. Using an Arduino mini, it fits in this little inline enclosure.






#define strobe 3 //PORTD
#define clk 4
#define data 2
void setup() {
DDRD = 1 | (1<<strobe) | (1<<clk); // NES outputs
}
void pulse_pin(byte pin, byte del) {
PORTD |= (1<<pin); //set
delayMicroseconds(del);
PORTD &= ~(1<<pin); //clear
delayMicroseconds(del);
}
void loop() {
byte btns = 0;
pulse_pin(strobe, 10); //latch the controller
for(int i = 0; i < 8; i++) { //read 8 bits
btns = btns << 1 | !(PIND & (1<<data));
pulse_pin(clk, 10); //clock next bit
}
// atari output d12-d8, open collector
DDRB = (btns & 0xf) | (!!(btns & 0xc0) << 4); // dpad + A||B
}

Thursday, June 11, 2020

DIY 1702a Programmer

I've resumed working on the PAiA 8700 computer. It uses some very old, and hard to program EPROMs: 1702As. They require +37V, +47V, +59V and ground to program.

I've come up with a relatively easy to build DIY programmer. It doesn't require a parallel port, or dozens of transistors. It's Arduino based, and uses mostly common parts.
Here's what it looks like:


And here's a schematic:


A boost converter daughter board is used to generate a high voltage, over 60V. It then gets regulated down to the various voltages needed. IC1 (TL783) has to be calibrated to +47V, then the other voltages will fall into place.
An Arduino nano is able to manipulate the high voltages through three ULN2003 transistor arrays, and one IRF520 MOSFET.

Right now the code is very crude, but functional. It's on pastebin here. The binary for the 1702A is included in the Arduino program. On power up/reset the programming sequence begins. It's finished when the pin 13 led stops flashing.

Pollard Syndrum Schematic Redraw

The original Syndrum schematic isn't the most legible in terms of quality or layout.
I redrew it so that it made more sense to me. Here it is:

Friday, May 22, 2020

Boss DR-110 Clap Pulse Generator (trigger adapter)

Here's a circuit I came up with a while back. I had a DR-110 with a dead digital board. The digital board is responsible for generating all the triggers in the system, and it generates some very specific triggers for the clap circuit. 

CPI is three 1ms long pulses, every 10ms (100hz).
CPII is a separate pulse also 1ms long, that falls 10ms later.

I re-implemented this in the following circuit.
Traces from top to bottom are CPI, CPII, and Trigger in.


The traces are from a simulation of the circuit, that you can play with in real time here.

Breaking down the circuit, we start at C8 and R11. These form a hipass filter for the incoming trigger. This ensures that long triggers will be handled the same way as short triggers.

IC6A & B are schmitt NAND gates and they form an SR latch. It is set by an incoming trigger, and is reset by the CPII pulse. The output is used to enable the generation of the CPI signal.

IC6C is the core of an oscillator that can be enable/disabled from pin 8. It works by charging and discharging C9.
R14 sets the charging rate of C9, and determines the low time between pulses.
R15 and D4 set the discharge rate, and determine the length of the pulses.
R12 & R13 help bias C9 near the threshold voltage of IC6C. This ensures that the first pulse will be close in length to the following pulses. If C8 had to charge all the way up from ground, the first pulse would be much longer.

IC7 is a counter, and is keeping track of how many pulses have been seen on CPI.
Once the end of the third pulse is counted, output QC goes high. This resets the SR latch, disabling the oscillator, and very quickly stopping the fourth trigger.
Output QC is also used as our CPII signal. To limit it to 1ms in length, we use it to charge C7 through R9. After about 1ms, C7 has charged enough to trigger the CLR pin of the counter. This causes output QC to go low again and discharge C7.

So, with some simple tweaking, this circuit can generate different lengths, rates, and numbers of pulses.


Thursday, May 7, 2020

Korg Monotron Delay PCB Component Labels

Even though it's old-hat, I'd like to try modifying the Korg Monotron Delay.
Korg was nice enough to share their schematic, but not the board layout. Also, the board itself isn't labeled.
I need to know what I'm working with, so I used a multimeter, and some educated guesses to draw the following. I labeled the rough sections of the circuit, so that it's a little easier to find what you're looking for. Be warned that it's not perfect, but should be a decent starting point.

Wednesday, April 22, 2020

Arduino LTC1660 Octal DAC demo

I was looking for a breadboard friendly DAC with lots of outputs, and decent resolution.
I found the LTC1660. It can be had for under $10, features 8 outputs, and 10 bit resolution. This should be good enough to control VCOs over a handful of octaves.

There seems to be a single example of how to use it with an arduino, but it doesn't spell out the SPI connections. Without SPI, you're limited to slow, CPU intensive communication. With SPI, I was able to get an example program to output at around 180kHz. This will be much slower in practice, but it shows the potential of the chip.

Below are the connections and code:


#include <SPI.h>
#include <stdint.h>
const int pinCSLD = 3;
const int pinCLR = 9;
 
void setup() {  
  pinMode(pinCSLD, OUTPUT);
  pinMode(pinCLR, OUTPUT);
   
  digitalWrite(pinCLR, HIGH);
  digitalWrite(pinCSLD, HIGH);
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV2);
}

void loop(){
  for (int i = 0; i < 1024; i++) setDAC(1, i);
}

void setDAC(uint16_t address, uint16_t value) {
    uint16_t h = address << 4 | value >> 6;
    uint16_t l = value << 2;
    PORTD &= ~(1 << pinCSLD); //LOW
    SPI.transfer(h);
    SPI.transfer(l);
    PORTD |= (1 << pinCSLD); //HIGH 
}

Saturday, April 11, 2020

Korg KR-55 Recap Guide

I'm repairing my second Korg KR-55 drum machine. They both had a ton of failing electrolytic capacitors that needed replacing. In the first machine, the capacitors had leaked and damaged the board. In the second, one had failed and shorted, causing the snare, hihats, and cowbell to not work.

Recommending "recaping" as a general fix, is something of meme now. It's no joke on the Korgs though. I advise replacing all the electrolytics in them, so I made a the following images and lists to help.

The logic board only has a few capacitors. The 470u are the large, axial type, and don't seem to be an issue. They're listed for completeness.
Name Value Voltage
C21 .33u 50V
C1 10u 16V
C22 470u 25V
C23 470u 25V

Here are the relevant capacitors on the sound board. They're color coded by value.
Red = 1u / 50V
Org = 10u / 16V
Ylw = 100u / 16V
Grn = other

Here are the footprints on the bottom, to help with desoldering. These are not coded, because they should all be removed.

Here are the types and totals of capacitors:
Value Voltage Total
.15u 50V 2
.22u 50V 2
100u 16V 5
10u 16V 14
1u 50V 14
47u 16V 1

Here are the individual capacitors, and their function in the circuit. This can be helpful for debugging.
Name Value Voltage Role
C59 .15u 50V Low Conga
C60 .15u 50V Hi Conga
C49 .22u 50V HiHat
C61 .22u 50V Tom Noise Audio
C50 100u 16V Cymbal Power
C52 100u 16V Hat Power
C106 100u 16V Power
C107 100u 16V Power
C123 100u 16V Metal Power
C20 10u 16V Bd, Sn Power
C21 10u 16V Bd, Sn Power
C51 10u 16V Cymbal Power
C71 10u 16V Tom/Conga Audio
C72 10u 16V Tom/Conga Power
C73 10u 16V Tom/Conga Power
C98 10u 16V RS/Clav/CB Audio
C99 10u 16V RS/Clav/CB Power
C100 10u 16V RS/Clav/CB Power
C101 10u 16V RS/Clav/CB Power
C103 10u 16V Mix Audio
C105 (C05) 10u 16V Power
C112 10u 16V Noise
C114 10u 16V Noise Power
C2 1u 50v Bd Trigger
C5 1u 50v Bd Audio
C10 1u 50V Sn
C13 1u 50V Sn Audio
C16 1u 50V Sn Body Audio
C18 1u 50V Sn Audio
C54 1u 50V Low Conga
C55 1u 50V Low Conga
C64 1u 50V Hi Conga
C65 1u 50V Hi Conga
C90 1u 50V Claves Audio
C95 1u 50V Cowbell
C108 1u 50V Noise
C111 1u 50V Noise
C19 47u 16V Bd, Sn Power