dtmf update
This commit is contained in:
		
							parent
							
								
									ac31e5e79e
								
							
						
					
					
						commit
						c340fef0b4
					
				| 
						 | 
					@ -0,0 +1,167 @@
 | 
				
			||||||
 | 
					/* Hamshield
 | 
				
			||||||
 | 
					 * Example: HandyTalkie
 | 
				
			||||||
 | 
					 * This is a simple example to demonstrate HamShield receive
 | 
				
			||||||
 | 
					 * and transmit functionality.
 | 
				
			||||||
 | 
					 * Connect the HamShield to your Arduino. Screw the antenna 
 | 
				
			||||||
 | 
					 * into the HamShield RF jack. Plug a pair of headphones into 
 | 
				
			||||||
 | 
					 * the HamShield. Connect the Arduino to wall power and then 
 | 
				
			||||||
 | 
					 * to your computer via USB. After uploading this program to 
 | 
				
			||||||
 | 
					 * your Arduino, open the Serial Monitor. Press the button on 
 | 
				
			||||||
 | 
					 * the HamShield to begin setup. After setup is complete, type 
 | 
				
			||||||
 | 
					 * your desired Tx/Rx frequency, in hertz, into the bar at the 
 | 
				
			||||||
 | 
					 * top of the Serial Monitor and click the "Send" button. 
 | 
				
			||||||
 | 
					 * To test with another HandyTalkie (HT), key up on your HT 
 | 
				
			||||||
 | 
					 * and make sure you can hear it through the headphones 
 | 
				
			||||||
 | 
					 * attached to the HamShield. Key up on the HamShield by 
 | 
				
			||||||
 | 
					 * holding the button.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <HamShield.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// create object for radio
 | 
				
			||||||
 | 
					HamShield radio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LED_PIN 13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PWM_PIN 3
 | 
				
			||||||
 | 
					#define RESET_PIN A3
 | 
				
			||||||
 | 
					#define SWITCH_PIN 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t freq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void setup() {
 | 
				
			||||||
 | 
					  // NOTE: if not using PWM out, it should be held low to avoid tx noise
 | 
				
			||||||
 | 
					  pinMode(PWM_PIN, OUTPUT);
 | 
				
			||||||
 | 
					  digitalWrite(PWM_PIN, LOW);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // prep the switch
 | 
				
			||||||
 | 
					  pinMode(SWITCH_PIN, INPUT_PULLUP);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // set up the reset control pin
 | 
				
			||||||
 | 
					  pinMode(RESET_PIN, OUTPUT);
 | 
				
			||||||
 | 
					  digitalWrite(RESET_PIN, LOW);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // initialize serial communication
 | 
				
			||||||
 | 
					  Serial.begin(9600);
 | 
				
			||||||
 | 
					  Serial.println("press the switch to begin...");
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  while (digitalRead(SWITCH_PIN));
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // let the AU ot of reset
 | 
				
			||||||
 | 
					  digitalWrite(RESET_PIN, HIGH);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  Serial.println("beginning radio setup");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // verify connection
 | 
				
			||||||
 | 
					  Serial.println("Testing device connections...");
 | 
				
			||||||
 | 
					  Serial.println(radio.testConnection() ? "RDA radio connection successful" : "RDA radio connection failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // initialize device
 | 
				
			||||||
 | 
					  Serial.println("Initializing I2C devices...");
 | 
				
			||||||
 | 
					  radio.initialize(); // initializes automatically for UHF 12.5kHz channel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Serial.println("setting default Radio configuration");
 | 
				
			||||||
 | 
					  radio.dangerMode();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // set frequency
 | 
				
			||||||
 | 
					  Serial.println("setting squelch");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  radio.setSQHiThresh(-10);
 | 
				
			||||||
 | 
					  radio.setSQLoThresh(-30);
 | 
				
			||||||
 | 
					  Serial.print("sq hi: ");
 | 
				
			||||||
 | 
					  Serial.println(radio.getSQHiThresh());
 | 
				
			||||||
 | 
					  Serial.print("sq lo: ");
 | 
				
			||||||
 | 
					  Serial.println(radio.getSQLoThresh());
 | 
				
			||||||
 | 
					  radio.setSQOn();
 | 
				
			||||||
 | 
					  //radio.setSQOff();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // set frequency
 | 
				
			||||||
 | 
					  Serial.println("changing frequency");
 | 
				
			||||||
 | 
					  freq = 415000;
 | 
				
			||||||
 | 
					  radio.frequency(freq);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // set RX volume to minimum to reduce false positives on DTMF rx
 | 
				
			||||||
 | 
					  radio.setVolume1(0);
 | 
				
			||||||
 | 
					  radio.setVolume2(0);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // set to receive
 | 
				
			||||||
 | 
					  radio.setModeReceive();
 | 
				
			||||||
 | 
					  Serial.print("config register is: ");
 | 
				
			||||||
 | 
					  Serial.println(radio.readCtlReg());
 | 
				
			||||||
 | 
					  Serial.println(radio.readRSSI());
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  radio.setRfPower(0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  // configure Arduino LED for
 | 
				
			||||||
 | 
					  pinMode(LED_PIN, OUTPUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // set up DTMF
 | 
				
			||||||
 | 
					  radio.enableDTMFReceive(); // enabled DTMF
 | 
				
			||||||
 | 
					  Serial.println("ready");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loop() {
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // look for tone
 | 
				
			||||||
 | 
					  if (radio.getDTMFSample() != 0) {
 | 
				
			||||||
 | 
					    uint16_t code = radio.getDTMFCode();
 | 
				
			||||||
 | 
					    if (code < 10) {
 | 
				
			||||||
 | 
					      Serial.println(code);
 | 
				
			||||||
 | 
					    } else if (code < 0xE) {
 | 
				
			||||||
 | 
					      Serial.println(code, HEX);
 | 
				
			||||||
 | 
					    } else if (code == 0xE) {
 | 
				
			||||||
 | 
					      Serial.println('*');
 | 
				
			||||||
 | 
					    } else if (code == 0xF) {
 | 
				
			||||||
 | 
					      Serial.println('#');
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      Serial.println('?'); // invalid code
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    while (radio.getDTMFSample() == 1) {
 | 
				
			||||||
 | 
					      // wait until this code is done
 | 
				
			||||||
 | 
					      delay(10);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Is it time to send tone?
 | 
				
			||||||
 | 
					  if (Serial.available()) {
 | 
				
			||||||
 | 
					    char c = Serial.read();
 | 
				
			||||||
 | 
					    uint8_t code;
 | 
				
			||||||
 | 
					    if (c == '#') {
 | 
				
			||||||
 | 
					      code = 0xF;
 | 
				
			||||||
 | 
					    } else if (c=='*') {
 | 
				
			||||||
 | 
					      code == 0xE;
 | 
				
			||||||
 | 
					    } else if (c >= 'A' && c <= 'D') {
 | 
				
			||||||
 | 
					      code = c - 'A' + 0xA;
 | 
				
			||||||
 | 
					    } else if (c >= '0' && c <= '9') {
 | 
				
			||||||
 | 
					      code = c - '0';
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      // invalid code, skip it
 | 
				
			||||||
 | 
					      Serial.println('?');
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // set tones
 | 
				
			||||||
 | 
					    radio.setDTMFCode(code);
 | 
				
			||||||
 | 
					    // start transmitting
 | 
				
			||||||
 | 
					    radio.setTxSourceTones();
 | 
				
			||||||
 | 
					    radio.setModeTransmit();
 | 
				
			||||||
 | 
					    // TODO: may need to set DTMF enable again
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // wait until done
 | 
				
			||||||
 | 
					    while (radio.getDTMFTxActive() != 1) {
 | 
				
			||||||
 | 
					      // wait until we're ready for a new code
 | 
				
			||||||
 | 
					      delay(10);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    radio.setDTMFCode(code);
 | 
				
			||||||
 | 
					    // TODO: fix timing
 | 
				
			||||||
 | 
					    //while (radio.getDTMFTxActive() != 0) {
 | 
				
			||||||
 | 
					      // wait until this code is done
 | 
				
			||||||
 | 
					      delay(1000);
 | 
				
			||||||
 | 
					    //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // done with tone
 | 
				
			||||||
 | 
					    radio.setModeReceive();
 | 
				
			||||||
 | 
					    radio.setTxSourceMic();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -22,13 +22,13 @@
 | 
				
			||||||
#include <HamShield.h>
 | 
					#include <HamShield.h>
 | 
				
			||||||
#include <KISS.h>
 | 
					#include <KISS.h>
 | 
				
			||||||
#include <DDS.h>
 | 
					#include <DDS.h>
 | 
				
			||||||
#include <packet.h>
 | 
					#include <AX25.h>
 | 
				
			||||||
#include <avr/wdt.h>
 | 
					#include <avr/wdt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HamShield radio;
 | 
					HamShield radio;
 | 
				
			||||||
DDS dds;
 | 
					DDS dds;
 | 
				
			||||||
AFSK afsk;
 | 
					AX25 ax25;
 | 
				
			||||||
KISS kiss(&Serial, &radio, &dds, &afsk);
 | 
					KISS kiss(&Serial, &radio, &dds, &ax25);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PWM_PIN 3
 | 
					#define PWM_PIN 3
 | 
				
			||||||
#define RESET_PIN A3
 | 
					#define RESET_PIN A3
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,7 @@ void setup() {
 | 
				
			||||||
  radio.frequency(144390);
 | 
					  radio.frequency(144390);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dds.start();
 | 
					  dds.start();
 | 
				
			||||||
  afsk.start(&dds);
 | 
					  ax25.start(&dds);
 | 
				
			||||||
  delay(100);
 | 
					  delay(100);
 | 
				
			||||||
  radio.setModeReceive();
 | 
					  radio.setModeReceive();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ ISR(ADC_vect) {
 | 
				
			||||||
  TIFR1 = _BV(ICF1); // Clear the timer flag
 | 
					  TIFR1 = _BV(ICF1); // Clear the timer flag
 | 
				
			||||||
  dds.clockTick();
 | 
					  dds.clockTick();
 | 
				
			||||||
  if(++tcnt == 1) {
 | 
					  if(++tcnt == 1) {
 | 
				
			||||||
    afsk.timer();
 | 
					    ax25.timer();
 | 
				
			||||||
    tcnt = 0;
 | 
					    tcnt = 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue