Close

Functions before Form

A project log for Cyberpunk UV-5R

Hacking a Baofeng UV-5R to turn it into a cyberpunk “Arduino sdr”

taylor-hayTaylor Hay 07/13/2023 at 08:220 Comments

So I've gotten the multitude of wires finally wired up, from the radio to the analog switches, to the Arduino Mega. I mapped all of the pins to their various functions (I decided to forgo trying to remember which trigger pin triggered which of the 4 switches on which of the 4 IC's, so I just wired it up, and then made a simple Arduino sketch to test each digital pin and see what function it performed. The findings were as follows.

pinMode(16, OUTPUT); // Keypad 5
pinMode(17, OUTPUT); // Keypad 9
pinMode(18, OUTPUT); // Keypad 6
pinMode(19, OUTPUT); // Keypad 8
pinMode(20, OUTPUT); // Keypad 0
pinMode(21, OUTPUT); // Keypad 7
pinMode(22, OUTPUT); // Keypad 4
pinMode(23, OUTPUT); // UNUSED BROWN WIRE
pinMode(24, OUTPUT); // DOWN
pinMode(25, OUTPUT); // Keypad 3
pinMode(26, OUTPUT); // UP
pinMode(27, OUTPUT); // Keypad 2
pinMode(28, OUTPUT); // EXIT
pinMode(29, OUTPUT); // SCAN
pinMode(30, OUTPUT); // MENU
pinMode(31, OUTPUT); // Keypad 1

(Unused brown wire is a spare, and I'm trying to decide if I use it for A/B switch [which switches the radio between two settable frequencies] or the channel / frequency modes, or the FM mode, if I want to enable the FM tuner. A/B or FM makes most sense to me.)

Oddly enough, the rotary encode stopped working unless I commented out the pinMode declaration for the pin 16. I moved the encoder switch button from pin 6 to pin 12, and it works fine. So for some reason, pin 6 and pin 16 interfered somehow... But once the encoder was moved to pin 12, it all worked perfectly!

Scrolling through UHF Channels and the radio tuning to the correct frequency.

The scan function also works, tonight I'm going to build more functions to pack this out! 

The tune functions look like this

void CALLBACK_FUNCTION UHFCH01(int id) {
    Serial.println("Tune to UHF 1");
    key_exit(); // press exit key
    key_num(4); // press passed number key
    key_num(7); // press passed number key
    key_num(6); // press passed number key
    key_num(4); // press passed number key
    key_num(2); // press passed number key
    key_num(5); // press passed number key
}


void CALLBACK_FUNCTION UHFCH02(int id) {
    Serial.println("Tune to UHF 2");
    key_exit(); // press exit key
    key_num(4); // press passed number key
    key_num(7); // press passed number key
    key_num(6); // press passed number key
    key_num(4); // press passed number key
    key_num(5); // press passed number key
    key_num(0); // press passed number key
}

 And the key_num(x) function, and other key functions look like this 

void key_num(int x) {
    switch (x) {
    case 0: 
        digitalWrite(20, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(20, LOW);   // release button
        delay(delayTime);
        Serial.println("0");
      break;
    case 1:  
        digitalWrite(31, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(31, LOW);   // release button
        delay(delayTime);
        Serial.println("1");
      break;
    case 2:  
        digitalWrite(27, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(27, LOW);   // release button
        delay(delayTime);
        Serial.println("2");
      break;
    case 3: 
        digitalWrite(25, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(25, LOW);   // release button
        delay(delayTime);
        Serial.println("3");
      break;
    case 4: 
        digitalWrite(22, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(22, LOW);   // release button
        delay(delayTime);
        Serial.println("4");
      break;
    case 5:  
        digitalWrite(16, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(16, LOW);   // release button
        delay(delayTime);              // pause
        Serial.println("5");
      break;
    case 6:  
        digitalWrite(18, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(18, LOW);   // release button
        delay(delayTime);              // pause
        Serial.println("6");
      break;
    case 7: 
        digitalWrite(21, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(21, LOW);   // release button
        delay(delayTime);              // pause
        Serial.println("7");
      break;
    case 8: 
        digitalWrite(19, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(19, LOW);   // release button
        delay(delayTime);              // pause
        Serial.println("8");
      break;
    case 9:  
        digitalWrite(17, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(17, LOW);   // release button
        delay(delayTime);              // pause
        Serial.println("9");
      break;
  }
}

void key_menu(){
        digitalWrite(30, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(30, LOW);   // release button
        delay(delayTime);
        Serial.println("menu");
}
void key_up(){
        digitalWrite(26, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(26, LOW);   // release button
        delay(delayTime);
        Serial.println("up");
}
void key_down(){
        digitalWrite(24, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(24, LOW);   // release button
        delay(delayTime);
        Serial.println("down");
}
void key_exit(){
        digitalWrite(28, HIGH);  // press button
        delay(delayTime);              // pause
        digitalWrite(28, LOW);   // release button
        delay(delayTime);
        Serial.println("exit");
}
void key_scan(){
        digitalWrite(29, HIGH);  // press button
        delay(2100);              // pause
        digitalWrite(29, LOW);   // release button
        delay(delayTime);
        Serial.println("scan");
}

Could they be done more efficiently? Yep! Do I care? Nope! I have tons of ram on the Mega, and enough IO pins to do this the lazy way, so that's the way I'm doing it. There's a contest deadline, and I haven't even started on the housing yet...

Discussions