Skip to content

Commit 849df23

Browse files
committed
microphone
1 parent edf6d3a commit 849df23

File tree

3 files changed

+90
-9
lines changed

3 files changed

+90
-9
lines changed

Diff for: src/Arduino_ScienceKitCarrier.cpp

+59-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919

2020
#include "Arduino_ScienceKitCarrier.h"
2121

22+
// static members must be initialized externally the class definition
23+
short ScienceKitCarrier::sampleBuffer[MICROPHONE_BUFFER_SIZE];
24+
volatile int ScienceKitCarrier::samplesRead;
25+
2226

2327
ScienceKitCarrier::ScienceKitCarrier(){
2428
round_robin_index=0;
@@ -77,7 +81,10 @@ ScienceKitCarrier::ScienceKitCarrier(){
7781
external_temperature=EXTERNAL_TEMPERATURE_DISABLED;
7882
external_temperature_is_connected=false;
7983

80-
round_robin_index = 0;
84+
microphone_rms=0;
85+
rms=0;
86+
87+
round_robin_index=0;
8188

8289
thread_activity_led = new rtos::Thread();
8390
thread_update_bme = new rtos::Thread();
@@ -140,6 +147,10 @@ int ScienceKitCarrier::begin(const uint8_t auxiliary_threads){
140147
return ERR_BEGIN_ULTRASONIC;
141148
}
142149

150+
// let's start microphone (PDM on Arduino Nano RP2040 Connect)
151+
if (beginMicrophone()!=0){
152+
return ERR_BEGIN_MICROPHONE;
153+
}
143154

144155
// let's start bme688 and external ds18b20 probe
145156
startAuxiliaryThreads(auxiliary_threads);
@@ -154,6 +165,7 @@ int ScienceKitCarrier::begin(const uint8_t auxiliary_threads){
154165
/********************************************************************/
155166

156167
void ScienceKitCarrier::update(const bool roundrobin){
168+
updateMicrophone(); // about 1ms when MICROPHONE_BUFFER_SIZE is 512
157169
if (!roundrobin){
158170
updateAnalogInput();
159171
updateAPDS();
@@ -608,6 +620,8 @@ void ScienceKitCarrier::setActivityLed(const int led_state){
608620
activity_led_state=led_state;
609621
}
610622

623+
624+
611625
/********************************************************************/
612626
/* Function Generator Controller */
613627
/********************************************************************/
@@ -646,6 +660,8 @@ uint8_t ScienceKitCarrier::getRange2(){
646660
return range2;
647661
}
648662

663+
664+
649665
/********************************************************************/
650666
/* Ultrasonic Sensor */
651667
/********************************************************************/
@@ -678,6 +694,8 @@ bool ScienceKitCarrier::getUltrasonicIsConnected(){
678694
return ultrasonic_is_connected;
679695
}
680696

697+
698+
681699
/********************************************************************/
682700
/* External Temperature Probe */
683701
/********************************************************************/
@@ -691,13 +709,13 @@ int ScienceKitCarrier::beginExternalTemperature(){
691709
void ScienceKitCarrier::updateExternalTemperature(){
692710
float temperature;
693711
pinMode(OW_PIN,INPUT);
712+
694713
DSTherm drv(ow);
695-
696-
drv.convertTempAll(DSTherm::MAX_CONV_TIME, false);
714+
drv.convertTempAll(DSTherm::MAX_CONV_TIME, false);
697715

698716
static Placeholder<DSTherm::Scratchpad> scrpd;
699-
700717
OneWireNg::ErrorCode ec = drv.readScratchpadSingle(scrpd);
718+
701719
if (ec == OneWireNg::EC_SUCCESS) {
702720
if (scrpd->getAddr()!=15){
703721
external_temperature_is_connected=false;
@@ -717,7 +735,6 @@ void ScienceKitCarrier::updateExternalTemperature(){
717735
}
718736
}
719737

720-
721738
float ScienceKitCarrier::getExternalTemperature(){
722739
return external_temperature;
723740
}
@@ -729,7 +746,6 @@ bool ScienceKitCarrier::getExternalTemperatureIsConnected(){
729746
void ScienceKitCarrier::threadExternalTemperature(){
730747
beginExternalTemperature();
731748
while(1){
732-
//updateAnalogInput(UPDATE_INPUT_A);
733749
updateExternalTemperature();
734750
updateAnalogInput(UPDATE_INPUT_A);
735751
rtos::ThisThread::sleep_for(1000);
@@ -738,6 +754,43 @@ void ScienceKitCarrier::threadExternalTemperature(){
738754

739755

740756

757+
/********************************************************************/
758+
/* Microphone */
759+
/********************************************************************/
760+
761+
int ScienceKitCarrier::beginMicrophone(){
762+
PDM.setGain(50);
763+
PDM.onReceive(updateMicrophoneDataBuffer);
764+
if(!PDM.begin(channels, frequency)){
765+
return ERR_BEGIN_MICROPHONE;
766+
}
767+
return 0;
768+
}
769+
770+
void ScienceKitCarrier::updateMicrophone(){
771+
if (samplesRead) {
772+
// Calculate the RMS of data buffer
773+
rms=0;
774+
for (int i=0; i<samplesRead; i++){
775+
rms=rms+(sampleBuffer[i]*sampleBuffer[i]);
776+
}
777+
rms=rms/samplesRead;
778+
microphone_rms=sqrt(rms);
779+
samplesRead = 0;
780+
}
781+
}
782+
783+
void ScienceKitCarrier::updateMicrophoneDataBuffer(){
784+
int bytesAvailable = PDM.available();
785+
PDM.read(sampleBuffer, bytesAvailable);
786+
samplesRead = bytesAvailable / 2;
787+
}
788+
789+
uint ScienceKitCarrier::getMicrophoneRMS(){
790+
return microphone_rms;
791+
}
792+
793+
741794

742795

743796
/********************************************************************/

Diff for: src/Arduino_ScienceKitCarrier.h

+25-3
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
#include "bsec.h"
3131
#include "Arduino_BMI270_BMM150.h"
3232
#include "Arduino_GroveI2C_Ultrasonic.h"
33+
#include <PDM.h>
3334

34-
//#include "OneWireNg_CurrentPlatform.h"
35-
#include "../../OneWireNg/src/platform/OneWireNg_PicoRP2040.h"
35+
#include "../../OneWireNg/src/platform/OneWireNg_PicoRP2040.h" // forces to use gpio insted PIO hw
3636
#define OneWireNg_CurrentPlatform OneWireNg_PicoRP2040
3737
#include "drivers/DSTherm.h"
3838
#include "utils/Placeholder.h"
@@ -78,12 +78,16 @@ class ScienceKitCarrier{
7878
float distance, travel_time;
7979
bool ultrasonic_is_connected;
8080

81-
8281
bool external_temperature_is_connected;
8382
float external_temperature;
8483

8584

8685

86+
uint microphone_rms, rms;
87+
static const char channels = MICROPHONE_CHANNELS;
88+
static const int frequency = MICROPHONE_FREQUENCY;
89+
90+
8791
rtos::Thread * thread_activity_led;
8892
rtos::Thread * thread_update_bme;
8993
rtos::Thread * thread_external_temperature;
@@ -209,8 +213,26 @@ class ScienceKitCarrier{
209213
bool getExternalTemperatureIsConnected();
210214
void threadExternalTemperature();
211215

216+
217+
218+
/* Microphone - onboard PDM */
219+
int beginMicrophone();
220+
void updateMicrophone();
221+
static void updateMicrophoneDataBuffer(); // interrupt function
222+
uint getMicrophoneRMS();
223+
224+
static short sampleBuffer[MICROPHONE_BUFFER_SIZE]; //must be public
225+
static volatile int samplesRead;
226+
227+
212228
};
213229

230+
/*
231+
// static members must be initialized externally the class definition
232+
short ScienceKitCarrier::sampleBuffer[MICROPHONE_BUFFER_SIZE];
233+
volatile int ScienceKitCarrier::samplesRead;
234+
*/
235+
214236

215237

216238

Diff for: src/utils/Arduino_ScienceKitCarrier_definitions.h

+6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ const uint16_t MAXIMUM_AMPS{1}; // 1A
5252
#define OW_PIN digitalPinToPinName(INPUTA_PIN)
5353
#define EXTERNAL_TEMPERATURE_DISABLED -273.0; // absolute zero xD
5454

55+
// Microphone - PDM on Arduino Nano RP2040 Connect
56+
#define MICROPHONE_BUFFER_SIZE 512
57+
#define MICROPHONE_CHANNELS 1
58+
#define MICROPHONE_FREQUENCY 16000
59+
5560

5661
// Errors
5762
#define ERR_BEGIN_APDS -3
@@ -62,6 +67,7 @@ const uint16_t MAXIMUM_AMPS{1}; // 1A
6267
#define ERR_BEGIN_FUNCTION_GENERATOR_CONTROLLER -8
6368
#define ERR_BEGIN_ULTRASONIC -9
6469
#define ERR_BEGIN_EXTERNAL_TEMPERATURE -10
70+
#define ERR_BEGIN_MICROPHONE -11
6571

6672

6773

0 commit comments

Comments
 (0)