adding in HandyTalkie_nrf52840
This commit is contained in:
		
							parent
							
								
									f83b547de4
								
							
						
					
					
						commit
						7941388980
					
				| 
						 | 
				
			
			@ -0,0 +1,282 @@
 | 
			
		|||
/* Hamshield
 | 
			
		||||
 * Example: HandyTalkie_nRF52840
 | 
			
		||||
 * This is a simple example to demonstrate the HamShield working 
 | 
			
		||||
 * with an Adafruit Feather nRF52840 Express
 | 
			
		||||
 * 
 | 
			
		||||
 * HamShield to Feather Connections:
 | 
			
		||||
 *  SPKR - Feather A0
 | 
			
		||||
 *  MIC - Feather D11
 | 
			
		||||
 *  CLK - Feather D5
 | 
			
		||||
 *  nCS - Feather D6
 | 
			
		||||
 *  DAT - Feather D9
 | 
			
		||||
 *  GND - Feather GND
 | 
			
		||||
 *  VCC - Feather 3.3V
 | 
			
		||||
 *  
 | 
			
		||||
 * Connect the HamShield to your Feather as above. 
 | 
			
		||||
 * Screw the antenna into the HamShield RF jack. Plug a pair 
 | 
			
		||||
 * of headphones into the HamShield.
 | 
			
		||||
 * 
 | 
			
		||||
 * Connect the Feather nRF52840 Express to your computer via 
 | 
			
		||||
 * a USB Micro B cable. After uploading this program to 
 | 
			
		||||
 * your Feather, open the Serial Monitor. You should see some
 | 
			
		||||
 * text displayed that documents the setup process.
 | 
			
		||||
 * 
 | 
			
		||||
 * Once the Feather is set up and talking to the HamShield,
 | 
			
		||||
 * you can control it over USB-Serial or BLE-Serial(UART).
 | 
			
		||||
 * 
 | 
			
		||||
 * Try using Adafruit's Bluefruit app to connect to the Feather.
 | 
			
		||||
 * Once you're connected, you can control the HamShield using
 | 
			
		||||
 * the same commands you'd use over USB-Serial. The response to
 | 
			
		||||
 * all commands will be echoed to both USB-Serial and BLE-Serial(UART).
 | 
			
		||||
 * 
 | 
			
		||||
 * Serial UART commands:
 | 
			
		||||
 * t - change from Tx to Rx (or vice versa)
 | 
			
		||||
 * F123400 - set frequency to 123400 kHz
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <bluefruit.h>
 | 
			
		||||
 | 
			
		||||
// BLE Service
 | 
			
		||||
BLEDis  bledis;  // device information
 | 
			
		||||
BLEUart bleuart; // uart over ble
 | 
			
		||||
BLEBas  blebas;  // battery
 | 
			
		||||
 | 
			
		||||
#include <HamShield.h>
 | 
			
		||||
// create object for radio
 | 
			
		||||
HamShield radio(9,5,6);
 | 
			
		||||
// To use non-standard pins, use the following initialization
 | 
			
		||||
//HamShield radio(ncs_pin, clk_pin, dat_pin);
 | 
			
		||||
 | 
			
		||||
#define LED_PIN 3
 | 
			
		||||
#define RSSI_REPORT_RATE_MS 5000
 | 
			
		||||
 | 
			
		||||
#define MIC_PIN A1
 | 
			
		||||
 | 
			
		||||
bool blinkState = false;
 | 
			
		||||
bool currently_tx;
 | 
			
		||||
 | 
			
		||||
uint32_t freq;
 | 
			
		||||
 | 
			
		||||
unsigned long rssi_timeout;
 | 
			
		||||
 | 
			
		||||
void setup() {
 | 
			
		||||
 | 
			
		||||
  // NOTE: if not using PWM out, it should be held low to avoid tx noise
 | 
			
		||||
  pinMode(MIC_PIN, OUTPUT);
 | 
			
		||||
  digitalWrite(MIC_PIN, LOW);
 | 
			
		||||
  
 | 
			
		||||
  // initialize serial communication
 | 
			
		||||
  Serial.begin(115200);
 | 
			
		||||
  while (!Serial) delay(10);
 | 
			
		||||
  Serial.println("Setting up BLE");
 | 
			
		||||
 | 
			
		||||
  // Setup the BLE LED to be enabled on CONNECT
 | 
			
		||||
  // Note: This is actually the default behaviour, but provided
 | 
			
		||||
  // here in case you want to control this LED manually via PIN 19
 | 
			
		||||
  Bluefruit.autoConnLed(true);
 | 
			
		||||
 | 
			
		||||
  // Config the peripheral connection with maximum bandwidth 
 | 
			
		||||
  // more SRAM required by SoftDevice
 | 
			
		||||
  // Note: All config***() function must be called before begin()
 | 
			
		||||
  Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
 | 
			
		||||
 | 
			
		||||
  Bluefruit.begin();
 | 
			
		||||
  // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
 | 
			
		||||
  Bluefruit.setTxPower(4);
 | 
			
		||||
  Bluefruit.setName("MyBlueHam");
 | 
			
		||||
  //Bluefruit.setName(getMcuUniqueID()); // useful testing with multiple central connections
 | 
			
		||||
  Bluefruit.setConnectCallback(connect_callback);
 | 
			
		||||
  Bluefruit.setDisconnectCallback(disconnect_callback);
 | 
			
		||||
 | 
			
		||||
  // Configure and Start Device Information Service
 | 
			
		||||
  bledis.setManufacturer("Enhanced Radio Devices");
 | 
			
		||||
  bledis.setModel("BlueHam");
 | 
			
		||||
  bledis.begin();
 | 
			
		||||
 | 
			
		||||
  // Configure and Start BLE Uart Service
 | 
			
		||||
  bleuart.begin();
 | 
			
		||||
 | 
			
		||||
  // Start BLE Battery Service
 | 
			
		||||
  blebas.begin();
 | 
			
		||||
  blebas.write(100);
 | 
			
		||||
 | 
			
		||||
  // Set up and start advertising
 | 
			
		||||
  startAdv();
 | 
			
		||||
    
 | 
			
		||||
  delay(100);  
 | 
			
		||||
 | 
			
		||||
  Serial.println("beginning Ham radio setup");
 | 
			
		||||
 | 
			
		||||
  // verify connection
 | 
			
		||||
  Serial.println("Testing device connections...");
 | 
			
		||||
  if (radio.testConnection()) {
 | 
			
		||||
    Serial.println("HamShield connection successful");
 | 
			
		||||
  } else {
 | 
			
		||||
    Serial.print("HamShield connection failed");
 | 
			
		||||
    while(1) delay(100);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // initialize device
 | 
			
		||||
  Serial.println("Initializing I2C devices...");
 | 
			
		||||
  radio.initialize(); // initializes automatically for UHF 12.5kHz channel
 | 
			
		||||
 | 
			
		||||
  Serial.println("setting default Radio configuration");
 | 
			
		||||
 | 
			
		||||
  // 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());
 | 
			
		||||
  
 | 
			
		||||
/*
 | 
			
		||||
  // set to transmit
 | 
			
		||||
  radio.setModeTransmit();
 | 
			
		||||
  // maybe set PA bias voltage
 | 
			
		||||
  Serial.println("configured for transmit");
 | 
			
		||||
  radio.setTxSourceMic();
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
  */  
 | 
			
		||||
  radio.setRfPower(0);
 | 
			
		||||
    
 | 
			
		||||
  // configure Arduino LED for
 | 
			
		||||
  pinMode(LED_PIN, OUTPUT);
 | 
			
		||||
  digitalWrite(LED_PIN, HIGH);
 | 
			
		||||
  rssi_timeout = 0;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void startAdv(void)
 | 
			
		||||
{
 | 
			
		||||
  // Advertising packet
 | 
			
		||||
  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
 | 
			
		||||
  Bluefruit.Advertising.addTxPower();
 | 
			
		||||
 | 
			
		||||
  // Include bleuart 128-bit uuid
 | 
			
		||||
  Bluefruit.Advertising.addService(bleuart);
 | 
			
		||||
 | 
			
		||||
  // Secondary Scan Response packet (optional)
 | 
			
		||||
  // Since there is no room for 'Name' in Advertising packet
 | 
			
		||||
  Bluefruit.ScanResponse.addName();
 | 
			
		||||
  
 | 
			
		||||
  /* Start Advertising
 | 
			
		||||
   * - Enable auto advertising if disconnected
 | 
			
		||||
   * - Interval:  fast mode = 20 ms, slow mode = 152.5 ms
 | 
			
		||||
   * - Timeout for fast mode is 30 seconds
 | 
			
		||||
   * - Start(timeout) with timeout = 0 will advertise forever (until connected)
 | 
			
		||||
   * 
 | 
			
		||||
   * For recommended advertising interval
 | 
			
		||||
   * https://developer.apple.com/library/content/qa/qa1931/_index.html   
 | 
			
		||||
   */
 | 
			
		||||
  Bluefruit.Advertising.restartOnDisconnect(true);
 | 
			
		||||
  Bluefruit.Advertising.setInterval(32, 244);    // in unit of 0.625 ms
 | 
			
		||||
  Bluefruit.Advertising.setFastTimeout(30);      // number of seconds in fast mode
 | 
			
		||||
  Bluefruit.Advertising.start(0);                // 0 = Don't stop advertising after n seconds  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define TEXT_BUF_LEN 64
 | 
			
		||||
char text_buf[TEXT_BUF_LEN];
 | 
			
		||||
void loop() {  
 | 
			
		||||
 | 
			
		||||
  char c = 0;
 | 
			
		||||
  bool ble_serial = false;
 | 
			
		||||
  if (Serial.available()) {
 | 
			
		||||
    Serial.readBytes(&c, 1);
 | 
			
		||||
  } else if (bleuart.available()) {
 | 
			
		||||
    c = (char) bleuart.read();
 | 
			
		||||
    ble_serial = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (c != 0) {
 | 
			
		||||
    if (c == 't')
 | 
			
		||||
    {
 | 
			
		||||
      if (!currently_tx) 
 | 
			
		||||
      {
 | 
			
		||||
        currently_tx = true;
 | 
			
		||||
        
 | 
			
		||||
        // set to transmit
 | 
			
		||||
        radio.setModeTransmit();
 | 
			
		||||
 | 
			
		||||
        Serial.println("Tx");
 | 
			
		||||
        int str_len = snprintf(text_buf, TEXT_BUF_LEN, "Tx\n");
 | 
			
		||||
        bleuart.write(text_buf, str_len);
 | 
			
		||||
        //radio.setTxSourceMic();
 | 
			
		||||
        //radio.setRfPower(1);
 | 
			
		||||
      } else {
 | 
			
		||||
        radio.setModeReceive();
 | 
			
		||||
        currently_tx = false;
 | 
			
		||||
        Serial.println("Rx");
 | 
			
		||||
        int str_len = snprintf(text_buf, TEXT_BUF_LEN, "Rx\n");
 | 
			
		||||
        bleuart.write(text_buf, str_len);
 | 
			
		||||
      }
 | 
			
		||||
    } else if (c == 'F') {
 | 
			
		||||
      if (ble_serial == false) {
 | 
			
		||||
        Serial.setTimeout(40);
 | 
			
		||||
        freq = Serial.parseInt();
 | 
			
		||||
        Serial.flush();
 | 
			
		||||
      } else {
 | 
			
		||||
        int idx = 0;
 | 
			
		||||
        while (bleuart.available() && 
 | 
			
		||||
          bleuart.peek() >= '0' && 
 | 
			
		||||
          bleuart.peek() <= '9' &&
 | 
			
		||||
          idx < TEXT_BUF_LEN) {
 | 
			
		||||
 | 
			
		||||
          text_buf[idx] = bleuart.read();
 | 
			
		||||
          idx++;
 | 
			
		||||
        }
 | 
			
		||||
        text_buf[idx] = 0; // null terminate
 | 
			
		||||
        freq = atoi(text_buf);
 | 
			
		||||
      }
 | 
			
		||||
      radio.frequency(freq);
 | 
			
		||||
      Serial.print("set frequency: ");
 | 
			
		||||
      Serial.println(freq);
 | 
			
		||||
      int str_len = snprintf(text_buf, TEXT_BUF_LEN, "set frequency: %d\n", freq);
 | 
			
		||||
      bleuart.write(text_buf, str_len);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (!currently_tx && (millis() - rssi_timeout) > RSSI_REPORT_RATE_MS)
 | 
			
		||||
  {
 | 
			
		||||
    int rssi = radio.readRSSI();
 | 
			
		||||
    Serial.println(rssi);
 | 
			
		||||
    int str_len = snprintf(text_buf, TEXT_BUF_LEN, "rssi: %d\n", rssi);
 | 
			
		||||
    bleuart.write(text_buf, str_len);
 | 
			
		||||
    rssi_timeout = millis();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// callback invoked when central connects
 | 
			
		||||
void connect_callback(uint16_t conn_handle)
 | 
			
		||||
{
 | 
			
		||||
  char central_name[32] = { 0 };
 | 
			
		||||
  Bluefruit.Gap.getPeerName(conn_handle, central_name, sizeof(central_name));
 | 
			
		||||
 | 
			
		||||
  Serial.print("Connected to ");
 | 
			
		||||
  Serial.println(central_name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Callback invoked when a connection is dropped
 | 
			
		||||
 * @param conn_handle connection where this event happens
 | 
			
		||||
 * @param reason is a BLE_HCI_STATUS_CODE which can be found in ble_hci.h
 | 
			
		||||
 * https://github.com/adafruit/Adafruit_nRF52_Arduino/blob/master/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/ble_hci.h
 | 
			
		||||
 */
 | 
			
		||||
void disconnect_callback(uint16_t conn_handle, uint8_t reason)
 | 
			
		||||
{
 | 
			
		||||
  (void) conn_handle;
 | 
			
		||||
  (void) reason;
 | 
			
		||||
 | 
			
		||||
  Serial.println();
 | 
			
		||||
  Serial.println("Disconnected");
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue