Freeing up a pin on the arduino

Previously Don ND6T used pins D0 and D1 as a means of accessing two additional digital pins on the Raduino for other purposes. These are used in USB and serial communications and are mostly available for use (except when programming the arduino or using CAT).

Another interesting approach is to use another arduino nano as an i2c slave while at the same time functioning as a backpack to your 1602 display.

 Allison KB1GMX has come up with another way of reclaiming pins. 

Looking at the relay tree it is notable there are only 4 used states and one that is “don’t care”.  That “don’t care” state allowed me to remove C155, R151, and Q17. That is replaced with two diodes to the collector of both Q18 and Q19 (cathode to the collectors) and anodes to the formerQ17 collector.

What that does is any time Q18 or Q19 is active KT1 is activated.  If that seems odd the relays are a partial decoding tree so if we encode the controls correctly we get the needed result and one free IO pin. To make it work Relay KT1 must be activated when we leave the 20-30mhz region for 20/17M or lower. Since to go lower than 20mhz we must have a signal the TXC is used as that controls the 40/80M relay KT3 but means nothing unless KT2 is activated Using two diodes as a logical OR we can then use Q18 and Q19 to force KT1 to be active. So for 20M and down KT1 is active and the other three select what bands below that. I got the IO pin and the firmware got simpler.

The code changes from:
/**
* Select the properly tx harmonic filters
* The four harmonic filters use only three relays
* the four LPFs cover 30-21 Mhz, 18 – 14 Mhz, 7-10 MHz and 3.5 to 5 Mhz
* Briefly, it works like this,
* – When KT1 is OFF, the ‘off’ position routes the PA output through the 30 MHz LPF
* – When KT1 is ON, it routes the PA output to KT2. Which is why you will see that
* the KT1 is on for the three other cases.
* – When the KT1 is ON and KT2 is off, the off position of KT2 routes the PA output
* to 18 MHz LPF (That also works for 14 Mhz)
* – When KT1 is On, KT2 is On, it routes the PA output to KT3
* – KT3, when switched on selects the 7-10 Mhz filter
* – KT3 when switched off selects the 3.5-5 Mhz filter
* See the circuit to understand this
*/
void setTXFilters(unsigned long freq){
if (freq >= 21000000L){
digitalWrite(TX_LPF_A, 0);
digitalWrite(TX_LPF_B, 0);
digitalWrite(TX_LPF_C, 0);
}
else if (freq >= 14000000L){
digitalWrite(TX_LPF_A, 1);
digitalWrite(TX_LPF_B, 0);
digitalWrite(TX_LPF_C, 0);
}
else if (freq >= 7000000L){
digitalWrite(TX_LPF_A, 1);
digitalWrite(TX_LPF_B, 1);
digitalWrite(TX_LPF_C, 0);
}
else {
digitalWrite(TX_LPF_A, 1);
digitalWrite(TX_LPF_B, 1);
digitalWrite(TX_LPF_C, 1);
}
}

To this.

/**
* this version version uses two diodes to get rid of needing TX-A
* and takes advantage of TX_LPF_C having an meaningless state
* unless KT2 is active (TX_LPF_B=1).
* tx-b tx-c band
* 0 0 10m
* 0 1 20M we enable TX-A, and get 20m, KT2 is not active.
* 1 0 40m make KT2 active and KT3 selects 40 or 80m.
* 1 1 80m
*/
void setTXFilters(unsigned long freq){

if (freq >= 20000000L){
digitalWrite(TX_LPF_B, 0); // 10m
digitalWrite(TX_LPF_C, 0);
}
else if (freq >= 14000000L){
digitalWrite(TX_LPF_B, 0); // 20M
digitalWrite(TX_LPF_C, 1);
}
else if (freq >= 7000000L){
digitalWrite(TX_LPF_B, 1); // 40m
digitalWrite(TX_LPF_C, 0);
}
else {
digitalWrite(TX_LPF_B, 1); // 80m
digitalWrite(TX_LPF_C, 1);
}
}

Reference

Some great mods from PH2LB

 

Lex PH2LB  wrote to uBITx.net to tell us about a page on his website where he describes his uBitx (V3) mods.   This is a very nice build, and he has some good ideas.   Check his page out here

http://www.ph2lb.nl/blog/index.php?page=ubitx-mods

In particular Lex has developed some custom firmware that firmware geeks may be quite interested in …

“Second mod : custom firmware”

Originally based on the v2 software but merged to v4.3 and updated to code to have a lower RAM footprint (usage of F(…) macro and strcpy_P) with about 50%.

Source files can be found here : https://github.com/ph2lb/ubitx4

Over the last few months there have been a range of ideas to boost mic drive output or to add compression.  Here’s a mod designed to work with a dynamic microphone …

“Fourth mod : dynamic microphone amplifier.”

Because I like to work with dynamic microphones, I added a dynamic microphone amplifier based on the microphone preamp designed by Javier Solans Badia, EA3GCY for his ILER transceivers.

There are a whole bunch of ways to add buttons. KD8CEC does this through paralleling up buttons with different series resistor values on the encoder analogue port).   Lex has taken a different approach that will be of interest to some constructors.   He uses a PCF8574 I2C encoder (like the backpacks for a 16×2 or 20×4 LCD display) and uses the existing I2C bus…

“Fifth mod : again adding extra buttons.”

Using a PCF8574AP I2C IO Extender and hooked it up to the all-ready existing I2C bus on the Raduino for more direct menu buttons. Needs the custom firmware to direct switch between bands with a PA bandplan limitation (also has FULL option) and Step size up and down.

 

Something that a number of constructors have done is to remove the 7805  and supply 5v to the Raduio using a separate 5v supply.  Most are using buck or buck boost modules, but Lex has used a P-MOSFET.   There’s a good description of his approach on his website …

“Sixth mod : removing 7805 from Raduino and reverse power protection.”

Relocating the 7805 is a good idea, but adding a reversed voltage polarity to a uBitx is a must. I used a P-MOSFETs for that (also link to good video about using P-MOSFETS for reverse power protection).

Finally, you may be interested in Lex’s use of the Manhattan style technique for PCB layout.  It can look very professional as per this example:

An amazingly smart idea for extra I/O ports

Tom WB6B want to expand the number of digital and analog I/O pins available to him in adding enhancements to his uBITx.

He came up with an ingenious idea, by creating a Smart LCD Backpack to replace the commonly found ones on inexpensive 2×16 and 4×20 I2C displays found on eBay and Amazon.

He has uploaded a library to GitHub that allows you to program a Arduino Nano to emulate the common I2C to parallel backpack used on an I2C display (either size). The Smart I2C Backpack, additionally, allows you to read and write the analog and digital pins on the Smart I2C Display Backpack.

The package includes a interface library that you include in your code to interface with the Extended I/O functionally. Also included are two example sketches. One is the code you program into the smart backpack. The other is a demo/test program you program into another arduino and connected via the I2C bus to the Smart Backpack Display.

The Smart Display Backpack should work with firmware using standard I2C LiquidCrystal drivers such as the KD8CEC firmware.

The code uses libraries that are installable from the Arduino library manager,.  The GitHub URLs are just for reference.

The following libraries should be part of the base Arduino software install:

  • Wire
  • LiquidCrystal

Tom hopes that others will enjoy this new display and I/O expander.

And the link to the code …
https://github.com/mountaintom/SmartLCDandIOexpander_I2C

Reference