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