Switched to SSD1306 OLED. Now HiFiLOGIX.

master
Jay 4 years ago
parent de5dabe862
commit 2cc0f562f7

@ -1,5 +1,18 @@
CHANGELOG:
Version 0.1.4:
Main:
Project is now called HiFiLOGIX
Hardware:
Tied ULN2003/2803 ground to 595's enable line
Replaced 1602 display with SSD1306 128x32 OLED
Software:
Added code to drive OLED display.
Removed 1602 display code.
Version 0.1.3:
Hardware:

@ -1,4 +1,5 @@
Denon PMA-770 (and others) Arduino Control
![HiFiLOGIX](images/logo.jpg "HiFiLOGIX")
Arduino Control for Your Vintage Stereo
# History
@ -9,11 +10,18 @@ Denon PMA-770 (and others) Arduino Control
30-Dec-2019: Version 0.1.2 - Controls ShiftReset and OutputEnable on 595 to prevent random start-up state.
30-Dec-2019: Version 0.1.3 - Removed ShiftReset function. Replaced with reset circuit onboard.
01-Jan-2020: Added license, media, and proper README.
04-Jan-2020: Version 0.1.4 - Changed project name. Removed 1602 display code. Added 128x32 OLED code
````
# About
HiFiLOGIX is an Arduino Sketch to add modern logic control to vintage analog stereo systems. It is being
built and developed around my own personal vintage amplifier; the Denon PMA-770. It is written by a guy
who knows a lot about analog audio circuits and virtually nothing about Arduino.
# About the PMA-770 & Why This Exists
The Denon PMA-770 is a high-end integrated amplfier from the early 80's capable of the usual 100 watts into
8 ohms; and somewhere in the neighborhood of 120 to 140 in to a 4 ohm load. It's a DC coupled amplifier of
"Direct-A" topology. It's got 3 pairs of output transistors, no capacitors in the audio path, and it sounds
@ -38,7 +46,7 @@ remote control function.
# Hardware
The basic idea is parallel the actuator contacts of 5 DPDT (or DPST) relays and flip them on one at a time (two
The basic idea is parallel the actuator contacts of DPDT (or DPST) relays and flip them on one at a time (two
for phono).
[![Schematic of hardware](/images/schematicsmall.png)](/images/schematic.png)
@ -67,22 +75,26 @@ the phono-stage.
An 1838 IR sensor is used for remote control function. An additional utility may be written to help with this going forward
but it's possible I may wind up writing a routine for "self-programming".
Currently I am using an I2C 1602 display just for development purposes. This will be replaced with a 128x32 I2C OLED display
in the future. This display is just a little larger than the display in the Denon; so it shouldn't be any issue to mount it
and format everything to appear in the actual visible space. It is not shown on the schematic; however it is just connected
to 5V, GND, SDA, and SCL lines.
As of Version 0.1.4 we now support the SSD1306 based 128x32 OLED Display.
In the future I will be adding some kind of NVRam storage. This will facilitate actually storing configuration options, remote
programming codes, and to store the last-used input. I may also use this to store graphic data for the OLED display to
emulate the original segmented font display of the Denon.
# Software
This sketch requires the following libaries:
- IRRemote (https://github.com/z3t0/Arduino-IRremote)
- U8G2 Display Driver (https://github.com/olikraus/u8g2)
Please install them via Library Manager or however you install libaries. Check indvidual project pages for LICENSE info.
# Media
[![Picture of prototype rig](/images/prototype.jpg "Prototype")*Prototype & Development Build*
This is a previous revision of the hardware before the power-on reset circuit was added to the 74HC595. The parallel data is
represented by the standard arrangement of LEDs with current-limiting resistors. This is literally all that's required during
development since I'm already very familiar with the 2803 as a driver.
This is the most current prototype featuring a 128x32 OLED and a ULN2003 driving actual relays. It is known as hardware
revision 1.3.
I'm horrible at making videos in general...but I still made an attempt to show things off. Youtube embedding is apparently
broken and I don't feel like putting a gig worth of video in the repository, so you'll just have to use links.
@ -91,6 +103,8 @@ broken and I don't feel like putting a gig worth of video in the repository, so
[Now I've Got A Remote Control](https://www.youtube.com/watch?v=I30OaMii4l4)
[OLED, Relay Control, and HiFiLOGIX] (https://youtu.be/vn3nhpWjckw)
# License
Copyright 2020 Jay Moore

@ -1,28 +1,45 @@
/*
PMA770Relay 0.1.3
HiFiLOGIX 0.1.4
dewdude@gmail.com - 30-12-2019
dewdude@gmail.com - 04-JAN-2020
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <U8g2lib.h>
#include <IRremote.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
// const char *inputs[] = {"TAPE-2","TAPE-1","AUX","TUNER","PHONO-2","PHONO-1"};
// int i = 0;
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
int IRin = 7;
int srEnable = 5;
int matrix = A0;
byte out = 0;
int mx = 0;
IRrecv remote(IRin);
decode_results ircode;
LiquidCrystal_I2C lcd(0x27,16,2);
void logo() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_fewture_tr);
u8g2.drawStr(15,14,"HiFiLOGIX");
u8g2.setFont(u8g2_font_freedoomr10_tu);
u8g2.drawStr(14,30,"DENON PMA-770");
u8g2.sendBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
}
/* void inputdisp() {
u8g2.clearBuffer();
u8g2.drawStr(x,30,inputs[i]);
u8g2.sendBuffer();
}
*/
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
@ -40,57 +57,63 @@ void DontCrossTheStreams()
void setTape2()
{
DontCrossTheStreams();
bitSet(out,7);
bitSet(out,6);
updateShiftRegister();
lcd.setCursor(7, 1);
lcd.print("TAPE-2 ");
u8g2.clearBuffer();
u8g2.drawStr(10,30,"TAPE-2");
u8g2.sendBuffer();
}
void setTape1()
{
DontCrossTheStreams();
bitSet(out,6);
bitSet(out,5);
updateShiftRegister();
lcd.setCursor(7, 1);
lcd.print("TAPE-1 ");
u8g2.clearBuffer();
u8g2.drawStr(10,30,"TAPE-1");
u8g2.sendBuffer();
}
void setAUX()
{
DontCrossTheStreams();
bitSet(out,5);
bitSet(out,4);
updateShiftRegister();
lcd.setCursor(7, 1);
lcd.print("AUX ");
u8g2.clearBuffer();
u8g2.drawStr(32,30,"AUX");
u8g2.sendBuffer();
}
void setTune()
{
DontCrossTheStreams();
bitSet(out,4);
bitSet(out,3);
updateShiftRegister();
lcd.setCursor(7, 1);
lcd.print("TUNER ");
u8g2.clearBuffer();
u8g2.drawStr(18,30,"TUNER");
u8g2.sendBuffer();
}
void setPh1()
{
DontCrossTheStreams();
bitSet(out,3);
bitSet(out,0);
bitSet(out,2);
bitSet(out,1);
updateShiftRegister();
lcd.setCursor(7, 1);
lcd.print("PHONO-1 ");
u8g2.clearBuffer();
u8g2.drawStr(1,30,"PHONO-2");
u8g2.sendBuffer();
}
void setPh2()
{
DontCrossTheStreams();
bitSet(out,3);
bitSet(out,1);
bitSet(out,2);
bitSet(out,0);
updateShiftRegister();
lcd.setCursor(7, 1);
lcd.print("PHONO-2 ");
u8g2.clearBuffer();
u8g2.drawStr(1,30,"PHONO-1");
u8g2.sendBuffer();
}
void setup()
@ -99,16 +122,11 @@ void setup()
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(srEnable, OUTPUT);
u8g2.begin();
remote.enableIRIn();
bitSet(out,5);
lcd.init();
lcd.backlight();
lcd.home();
lcd.setCursor(0, 0);
lcd.print("Denon PMA-770");
lcd.setCursor(0, 1);
lcd.print("Input: AUX");
updateShiftRegister();
logo();
delay(2000);
setAUX();
digitalWrite(srEnable,LOW);
}
@ -144,4 +162,4 @@ if (remote.decode(&ircode)) {
remote.resume();
}
delay(200);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 266 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Loading…
Cancel
Save