adding CTCSS and example
This commit is contained in:
		
							parent
							
								
									73f8cb3d93
								
							
						
					
					
						commit
						96d02c3bd9
					
				| 
						 | 
					@ -0,0 +1,174 @@
 | 
				
			||||||
 | 
					/* Hamshield
 | 
				
			||||||
 | 
					 * Example: CTCSS
 | 
				
			||||||
 | 
					 * This is a simple example to demonstrate HamShield receive
 | 
				
			||||||
 | 
					 * and transmit functionality using CTCSS. The HamShield will
 | 
				
			||||||
 | 
					 * have audio output muted until it receives the correct
 | 
				
			||||||
 | 
					 * sub-audible tone. It does this by polling a tone detection
 | 
				
			||||||
 | 
					 * flag on the HamShield, but it's also possible to do this
 | 
				
			||||||
 | 
					 * using interrupts if you connect GPIO0 from the HamShield
 | 
				
			||||||
 | 
					 * to your Arduino (code for that not provided).
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Setup:
 | 
				
			||||||
 | 
					 * 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. Set the CTCSS tone that you
 | 
				
			||||||
 | 
					 * want to use in the setup() function below.
 | 
				
			||||||
 | 
					 * After uploading this program to your Arduino, open the 
 | 
				
			||||||
 | 
					 * Serial Monitor. Press the button on the HamShield to begin 
 | 
				
			||||||
 | 
					 * setup. The sketch then works exactly like the HandyTalkie
 | 
				
			||||||
 | 
					 * example, with the exception that only valid CTCSS coded
 | 
				
			||||||
 | 
					 * receptions are put out to the headset.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <HamShield.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// create object for radio
 | 
				
			||||||
 | 
					HamShield radio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LED_PIN 13
 | 
				
			||||||
 | 
					#define RSSI_REPORT_RATE_MS 5000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PWM_PIN 3
 | 
				
			||||||
 | 
					#define RESET_PIN A3
 | 
				
			||||||
 | 
					#define SWITCH_PIN 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool currently_tx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t freq;
 | 
				
			||||||
 | 
					float ctcss_tone;
 | 
				
			||||||
 | 
					bool muted;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned long rssi_timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					  delay(5); // wait for device to come up
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  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("changing frequency");
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  radio.setSQOff();
 | 
				
			||||||
 | 
					  freq = 446000;
 | 
				
			||||||
 | 
					  radio.frequency(freq);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // set to receive
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  radio.setModeReceive();
 | 
				
			||||||
 | 
					  currently_tx = false;
 | 
				
			||||||
 | 
					  Serial.print("config register is: ");
 | 
				
			||||||
 | 
					  Serial.println(radio.readCtlReg());
 | 
				
			||||||
 | 
					  Serial.println(radio.readRSSI());
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					  radio.setRfPower(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // CTCSS Setup code
 | 
				
			||||||
 | 
					  ctcss_tone = 103.5;
 | 
				
			||||||
 | 
					  radio.setCtcss(ctcss_tone);
 | 
				
			||||||
 | 
					  radio.enableCtcss();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // mute audio until we get a CTCSS tone
 | 
				
			||||||
 | 
					  radio.setMute();
 | 
				
			||||||
 | 
					  muted = true;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  // configure Arduino LED for
 | 
				
			||||||
 | 
					  pinMode(LED_PIN, OUTPUT);
 | 
				
			||||||
 | 
					  rssi_timeout = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loop() {  
 | 
				
			||||||
 | 
					  // handle CTCSS tone detection
 | 
				
			||||||
 | 
					  if (!currently_tx) {
 | 
				
			||||||
 | 
					    // check for CTCSS tone
 | 
				
			||||||
 | 
					    if (radio.getCtcssToneDetected()) {
 | 
				
			||||||
 | 
					      if (muted) {
 | 
				
			||||||
 | 
					        muted = false;
 | 
				
			||||||
 | 
					        radio.setUnmute();
 | 
				
			||||||
 | 
					        Serial.println("tone");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      if (!muted) {
 | 
				
			||||||
 | 
					        muted = true;
 | 
				
			||||||
 | 
					        radio.setMute();
 | 
				
			||||||
 | 
					        Serial.println("no tone");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // handle manual transmit
 | 
				
			||||||
 | 
					  if (!digitalRead(SWITCH_PIN))
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (!currently_tx) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      currently_tx = true;
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      // set to transmit
 | 
				
			||||||
 | 
					      radio.setModeTransmit();
 | 
				
			||||||
 | 
					      Serial.println("Tx");
 | 
				
			||||||
 | 
					      //radio.setTxSourceMic();
 | 
				
			||||||
 | 
					      //radio.setRfPower(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else if (currently_tx) {
 | 
				
			||||||
 | 
					    radio.setModeReceive();
 | 
				
			||||||
 | 
					    currently_tx = false;
 | 
				
			||||||
 | 
					    Serial.println("Rx");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // handle serial commands
 | 
				
			||||||
 | 
					  if (Serial.available()) {
 | 
				
			||||||
 | 
					    if (Serial.peek() == 'r') {
 | 
				
			||||||
 | 
					      Serial.read();
 | 
				
			||||||
 | 
					      digitalWrite(RESET_PIN, LOW);
 | 
				
			||||||
 | 
					      delay(1000);
 | 
				
			||||||
 | 
					      digitalWrite(RESET_PIN, HIGH);
 | 
				
			||||||
 | 
					      radio.initialize(); // initializes automatically for UHF 12.5kHz channel
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      Serial.setTimeout(40);
 | 
				
			||||||
 | 
					      freq = Serial.parseInt();
 | 
				
			||||||
 | 
					      Serial.flush();
 | 
				
			||||||
 | 
					      radio.frequency(freq);
 | 
				
			||||||
 | 
					      Serial.print("set frequency: ");
 | 
				
			||||||
 | 
					      Serial.println(freq);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // periodically read RSSI and print to screen
 | 
				
			||||||
 | 
					  if (!currently_tx && (millis() - rssi_timeout) > RSSI_REPORT_RATE_MS)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    Serial.println(radio.readRSSI());
 | 
				
			||||||
 | 
					    rssi_timeout = millis();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -827,7 +827,10 @@ uint8_t HamShield::getCtcssDetThreshOut() {
 | 
				
			||||||
	return (uint8_t) radio_i2c_buf[0];
 | 
						return (uint8_t) radio_i2c_buf[0];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool HamShield::getCtcssToneDetected() {
 | 
				
			||||||
 | 
						HSreadBitW(devAddr, A1846S_FLAG_REG, A1846S_CTCSS1_FLAG_BIT, radio_i2c_buf);
 | 
				
			||||||
 | 
						return (radio_i2c_buf[0] != 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// cdcss codes
 | 
					// cdcss codes
 | 
				
			||||||
void HamShield::setCdcssCode(uint16_t code) {
 | 
					void HamShield::setCdcssCode(uint16_t code) {
 | 
				
			||||||
| 
						 | 
					@ -1133,6 +1136,13 @@ uint16_t HamShield::getFMCssDeviation(){
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RX voice range
 | 
					// RX voice range
 | 
				
			||||||
 | 
					void HamShield::setMute() {
 | 
				
			||||||
 | 
						HSwriteBitW(devAddr, A1846S_CTL_REG, A1846S_MUTE_BIT, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void HamShield::setUnmute() {
 | 
				
			||||||
 | 
						HSwriteBitW(devAddr, A1846S_CTL_REG, A1846S_MUTE_BIT, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void HamShield::setVolume1(uint16_t volume){
 | 
					void HamShield::setVolume1(uint16_t volume){
 | 
				
			||||||
    HSwriteBitsW(devAddr, A1846S_RX_VOLUME_REG, A1846S_RX_VOL_1_BIT, A1846S_RX_VOL_1_LENGTH, volume);
 | 
					    HSwriteBitsW(devAddr, A1846S_RX_VOLUME_REG, A1846S_RX_VOL_1_BIT, A1846S_RX_VOL_1_LENGTH, volume);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,6 @@
 | 
				
			||||||
#define A1846S_SQ_OUT_SEL_REG       0x54    // see sq
 | 
					#define A1846S_SQ_OUT_SEL_REG       0x54    // see sq
 | 
				
			||||||
#define A1846S_FILTER_REG      0x58
 | 
					#define A1846S_FILTER_REG      0x58
 | 
				
			||||||
#define A1846S_CTCSS_THRESH_REG     0x5B
 | 
					#define A1846S_CTCSS_THRESH_REG     0x5B
 | 
				
			||||||
#define A1846S_FLAG_REG             0x5C    // holds flags for different statuses
 | 
					 | 
				
			||||||
#define A1846S_RSSI_REG             0x1B    // holds RSSI (unit 1dB)
 | 
					#define A1846S_RSSI_REG             0x1B    // holds RSSI (unit 1dB)
 | 
				
			||||||
#define A1846S_VSSI_REG             0x1A    // holds VSSI (unit mV)
 | 
					#define A1846S_VSSI_REG             0x1A    // holds VSSI (unit mV)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,8 +170,8 @@
 | 
				
			||||||
#define A1846S_CTCSS_FILTER_BYPASS   3
 | 
					#define A1846S_CTCSS_FILTER_BYPASS   3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bitfields for A1846S_FLAG_REG
 | 
					// Bitfields for A1846S_FLAG_REG
 | 
				
			||||||
#define A1846S_RXON_RF_FLAG_BIT   10  // 1 when rxon is enabled
 | 
					#define A1846S_CTCSS1_FLAG_BIT     9  // 1 when rxon is enabled
 | 
				
			||||||
#define A1846S_TXON_RF_FLAG_BIT    9  // 1 when txon is enabled
 | 
					#define A1846S_CTCSS2_FLAG_BIT     8  // 1 when txon is enabled
 | 
				
			||||||
#define A1846S_INVERT_DET_FLAG_BIT 7  // ctcss phase shift detect
 | 
					#define A1846S_INVERT_DET_FLAG_BIT 7  // ctcss phase shift detect
 | 
				
			||||||
#define A1846S_CSS_CMP_FLAG_BIT    2  // ctcss/cdcss compared
 | 
					#define A1846S_CSS_CMP_FLAG_BIT    2  // ctcss/cdcss compared
 | 
				
			||||||
#define A1846S_SQ_FLAG_BIT         1  // sq final signal out from dsp
 | 
					#define A1846S_SQ_FLAG_BIT         1  // sq final signal out from dsp
 | 
				
			||||||
| 
						 | 
					@ -310,6 +309,7 @@ class HamShield {
 | 
				
			||||||
		uint8_t getCtcssDetThreshIn();
 | 
							uint8_t getCtcssDetThreshIn();
 | 
				
			||||||
		void setCtcssDetThreshOut(uint8_t thresh);
 | 
							void setCtcssDetThreshOut(uint8_t thresh);
 | 
				
			||||||
		uint8_t getCtcssDetThreshOut();
 | 
							uint8_t getCtcssDetThreshOut();
 | 
				
			||||||
 | 
							bool getCtcssToneDetected();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//   Ctcss_sel
 | 
							//   Ctcss_sel
 | 
				
			||||||
		//      1 = ctcss_cmp/cdcss_cmp out via gpio
 | 
							//      1 = ctcss_cmp/cdcss_cmp out via gpio
 | 
				
			||||||
| 
						 | 
					@ -413,6 +413,8 @@ class HamShield {
 | 
				
			||||||
		uint16_t getFMCssDeviation();
 | 
							uint16_t getFMCssDeviation();
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// RX voice range
 | 
							// RX voice range
 | 
				
			||||||
 | 
							void setMute();
 | 
				
			||||||
 | 
							void setUnmute();
 | 
				
			||||||
		void setVolume1(uint16_t volume);
 | 
							void setVolume1(uint16_t volume);
 | 
				
			||||||
		uint16_t getVolume1();
 | 
							uint16_t getVolume1();
 | 
				
			||||||
		void setVolume2(uint16_t volume);
 | 
							void setVolume2(uint16_t volume);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue