Nach “längerer” Sommerpause hat mich das Bastelfieber wieder gepackt und baue nun an meinem Hermes SDR weiter.
Leider existiert das Unterforum Hermes nicht mehr, deshalb setze ich das mal unter Apache Labs rein.
Ich hatte ja vor das Hermes Board mit einer FT857 PA Unit zu verbinden und auch zu steuern.
Nach verschiedenen, größtenteils erfolglosen Versuchen mit herkömmlichen BCD Adaptern und viel Recherchearbeit bin ich durch Zufall auf das Arduino Projekt von UA1NER gestoßen welcher einen FT857 mit fehlerhaftem Mainprozessor hatte und dieser die PA Unit nicht mehr steuern konnte. Anatoly hat mit Hilfe eines anderen OM ein Arduinosketch erstellt welches die Steuerung der PA Unit übernimmt. Anatoly hat mir das Sketch freundlicherweise zur Verfügung gestellt. Nach kurzer Augenscheinnahme war klar, das müsste auch für mein Projekt passen.
Und na ja was soll ich sagen, es funktioniert nach anpassen der PINS auf Anhieb.
Ich habe das ganze zuerst einmal auf dem Breadboard mit Shiftregistern und LED’s aufgebaut um nicht gleich die PA Unit zu himmeln.
Nachdem es ohne Probleme funktionierte, habe ich die auf dem Breadboard vorhandenen
Shiftregister einfach parallel zu denen auf der PA Unit angeschlossen (um über die LED’s informiert zu werden was gerade so los ist). Hatte aber eigentlich nicht damit gerechnet dass es so funktionieren würde, was es aber tat.
Am Hermes J16 Connector sind die Open Collector Anschlüsse OC1 – OC4 mit den Arduino Pin’s A0 – A3 verbunden. PTT Out Pin 25 am Hermes mit Pin 4 am Arduino.
Die Anschlüsse Data, Latch und Clock vom Arduino sind mit den Shift Registern auf der 857 PA Unit verbunden.
Hier nun das Sketch. Leider ist darin so gut wie nichts dokumentiert, was mir das Verstehen der Funktionen sehr erschwert, ich kann ja nicht programmieren.
Das wenige war dann auch noch Russisch wurde aber durch Google übersetzt.
Die restlichen Anmerkungen stammen von mir.
Code: Alles auswählen
// Thanks to UA1NER
// This sketch is simulating the PA handling part of FT857 Mainprocessor.
// FT857 PA to be used and controlled with Hermes or any other Anan Radio. J16 connectors having various pin descriptions, take care of it.
// Configuration via PowerSDR mrx PS, Thetis, etc. (Hermes ctrl).
// todo: cleaning up code,
// add fan control via FT857 PA NTC.,
#define pin_D A3 // Hermes J16 Pin 26 Nano
#define pin_C A2 // Hermes J16 Pin 25 Nano
#define pin_B A1 // Hermes J16 Pin 24 Nano
#define pin_A A0 // Hermes J16 Pin 23 Nano
#define buttonMinusPin 2 // not used by Hermes. Should be removed
#define buttonPlusPin 3 // not used by Hermes. Should be removed
#define buttonTXPin 4 // Hermes J16 Pin 25 PTT Output
struct BandReg {
byte first;
byte second;
};
struct BandCode {
byte DCBA;
byte bandRegNum;
};
// the lower 4 bits of the 1st byte is a DCBA combination from PDF, (translated from russian language)
// 2nd byte - range number from the next TX / RX array (translated from russian language)
BandCode bandCode[13] = {
B0001, 0, //160
B0010, 1, //80
B0011, 2, //60 ?
B0011, 2, //40
B0100, 3, //30
B0101, 3, //20
B0110, 4, //17
B0111, 4, //15
B1000, 5, //12
B1001, 5, //10
B1010, 6, //6
B1011, 7, //2
B1100, 8 //0.7
};
BandReg bandReg[2][9] = {
//TX
B00001100, B10001110, //1.8 MHz
B00101000, B10001110, //3.6
B00011000, B10001110, //7.0
B10001000, B10001110, //10/14
B00001001, B10001110, //18/21
B00001010, B10001110, //24/28
B01001000, B10001110, //50
B00000000, B10001000, //VHF
B00000000, B10000100, //UHF
//RX
B00000100, B00011110, //1.8 MHz
B00100000, B00011110, //3.6
B00010000, B00011110, //7.0
B10000000, B00011110, //10/14
B00000001, B00011110, //18/21
B00000010, B00011110, //24/28
B01000000, B00011111, //50
B00000000, B00101110, //VHF
B00000000, B01001110 //UHF
};
int dataPin = 16; // MOSI Pin is connected to DATA input Pin 2 > BU4094 = Pin10 Yaesu Connector
int latchPin = 15; // SCLK Pin is connected to STB input Pin 1 > BU4094 = Pin 9 Yaesu Connector
int clockPin = 14; // MISO Pin is connected to CLK input Pin 3 > BU4094 = Pin 8 Yaesu Connector
int xStateButtonMinus = HIGH; //not used by Hermes. Should be removed
int xStateButtonPlus = HIGH; //not used by Hermes. Should be removed
int xStateButtonTX = HIGH;
int xcDCBAState = 0;
int band = 0;
int txrx = 0;
void setup() {
// set the OUTPUT mode
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(buttonMinusPin, INPUT_PULLUP); // not used by Hermes. Should be removed
pinMode(buttonPlusPin, INPUT_PULLUP); // not used by Hermes. Should be removed
pinMode(buttonTXPin, INPUT_PULLUP);
pinMode(pin_A, INPUT_PULLUP);
pinMode(pin_B, INPUT_PULLUP);
pinMode(pin_C, INPUT_PULLUP);
pinMode(pin_D, INPUT_PULLUP);
txrx = 1; // originally RX mode
updateReg();
//Serial.begin(9600);
}
void updateReg() {
digitalWrite(latchPin, HIGH); // set the latch synchronization to HIGH
// start "pushing" the data along the chain of registers, starting from the last (translated from russian language)
shiftOut(dataPin, clockPin, LSBFIRST, bandReg[txrx][band].first); // pass sequentially to dataPin - in the first register, the value is B01001100
shiftOut(dataPin, clockPin, LSBFIRST, bandReg[txrx][band].second); // "push" the data into the following register - in the first register B10000111, in the second - B01001100
// etc. by the number of registers (translated from russian language)
digitalWrite(latchPin, LOW); // "click" the register, thereby setting the values at the outputs
}
void loop() {
int cButtonState;
int cDCBAState;
int i;
delay(50);
cDCBAState = (digitalRead(pin_D) << 3) |
(digitalRead(pin_C) << 2) |
(digitalRead(pin_B) << 1) |
(digitalRead(pin_A) << 0);
//Serial.println(cDCBAState, BIN);
// if all 0 or 1 - ignore
if ((cDCBAState != B0000)&&(cDCBAState != B1111)) {
i = 0;
while ((i < 13)&&(bandCode[i].DCBA != cDCBAState)) i++;
if (i < 13) {
band = bandCode[i].bandRegNum;
if (xcDCBAState != cDCBAState) {
updateReg();
xcDCBAState = cDCBAState;
}
}
}
//Serial.println(band, DEC);
// RX/TX
cButtonState = digitalRead(buttonTXPin);
if (cButtonState != xStateButtonTX) {
//delay(20);
if (digitalRead(buttonTXPin) != xStateButtonTX) {
if (cButtonState == LOW) {
txrx = 0;
} else {
txrx = 1;
}
updateReg();
xStateButtonTX = cButtonState;
}
}
if (xcDCBAState == 0) {
cButtonState = digitalRead(buttonMinusPin);
if (cButtonState != xStateButtonMinus) {
delay(20);
if (digitalRead(buttonMinusPin) != xStateButtonMinus) {
if (cButtonState == LOW) {
if (band > 0) {
band -= 1;
updateReg();
}
}
xStateButtonMinus = cButtonState;
}
}
cButtonState = digitalRead(buttonPlusPin);
if (cButtonState != xStateButtonPlus) {
delay(20);
if (digitalRead(buttonPlusPin) != xStateButtonPlus) {
if (cButtonState == LOW) {
if (band < 8) {
band += 1;
updateReg();
}
}
xStateButtonPlus = cButtonState;
}
}
}
}
Und jetzt bin ich auf euer Wissen / Hilfe angewiesen.
Die einzige Funktion die leider nicht so klappt wie im FT 857 ist die Lüftersteuerung, bzw die Nachlaufzeit bis entsprechend herunter gekühlt wurde.
Die OM's sind den einfachen Weg gegangen und setzen bei TX ein Bit auf 1 und schon läuft der Lüfter, aber sobald auf RX geschaltet wird ist natürlich Ruhe.
Ich könnte nun dieses Bit auch beim Empfang auf 1 setzen, das gefällt mir aber nicht weil dann der Lüfter immer arbeitet.
BandReg bandReg[2][9] = {
//TX
B00001100, B10001110, //1.8 MHz
Ich habe mir jetzt folgendes gedacht.
Wenn man den auf der PA vorhandenen NTC mit dem Arduino auslesen würde, im Sketch einen Schwellwert in RX, bei dem der Lüfter abschaltet, definiert,
sollte das doch zu machen sein. Nur wie sag ich das meinem Arduino?
Ich denke das es nicht so trivial sein wird wie es sich für mich anhört.
Ach ja was mich noch ein wenig stört ist, dass wenn der Arduino bootet und die Ein/Ausgänge initialisiert, alle PIN'S kurz auf HIGH zieht und somit
die Steuerung/LPF/FAN als auch die LED's unkwillkürlich geschaltet werden. Soll sich aber mit einem externen Pulldown Widerstand ändern lassen, nur in welche Signalleitung soll ich den
reinmachen? Data, Latch oder Clock, oder bei allen dreien?
Ich würde mich sehr freuen wenn mir hierbei jemand (sehr) hilfreich unter die Arme greifen könnte.
Sorry für das lange Posting
