QuickLogic FeatherにAD変換器「ADS1015」を接続し、入力した電圧をデジタル変換します。AD変換器「ADS1015」は、「Raspberry Pi 3にAD変換器「ADS1015」とDA変換器「MCP4725」を接続」で使用したAD変換器を使用します。また、Quickfeather development kitにAD変換器「ADS1015」を接続する方法は、「SparkFun ADS1015 Example」に従って行います。変更の対象は、「QuickfeatherによるSimple Streamingプロトコル」で作成したソースコード「Quickfeather Simple Streaming Interface AI Application Project」です。

Quickfeather development kitとAD変換器「ADS1015」との接続

Quickfeather development kitとAD変換器「ADS1015」間で、I2 CのSDAとSCLを次のように接続します。

ADS1015 Quickfeather
SCL J2.11
SDA J2.12
GND J8.16
Vcc J8.15

なお、測定したい電圧は「A3」ピンに入力します。今回は抵抗による分圧により、入力電圧を与えています。

Quickfeather development kitとAD変換器「ADS1015」との接続画像を次に示します。

AD変換器「ADS1015」のプログラム作成

AD変換器「ADS1015」のプログラムは、 Arduino用のプログラム「SparkFun ADS1015 Arduino Library」を次の手順で変更して作成します。変更したソースコードは「Quickfeather Simple Streaming Interface AI Application Project」のフォルダ「qf_ssi_ai_app/src」に置きます。

Quickfeather development kitではI2 Cのインタフェースを持つモジュールを以下に示す変更を加えるだけで接続できるように考慮されているようです。

  1. 次のようにヘッダファイルを追加します。
  2. SparkFun_ADS1015_Arduino_Library.c

    ...
    #include   "Fw_global_config.h"
    #include   "FreeRTOS.h"
    #include   "task.h"
    extern "C" void HAL_DelayUSec(uint32_t usecs);
    ...
    

    SparkFun_ADS1015_Arduino_Library.h

    ...
    #else
    // tomo #include "WProgram.h"
    #include "Wire.h"
    #endif
    ...
    
  3. 次のようにdelay関数を追加します。
  4. SparkFun_ADS1015_Arduino_Library.c

    ...
    void delay(unsigned long ms)
    {
    	HAL_DelayUSec(ms*1000);
    }
    ...
    

    今回は使用しないのですが、次の関数「millis」も示しておきます。

    unsigned log millis()
    {
    	TickType_t ticks;
    	ticks = xTaskGetTicCount();
    	return (unsigned log) ticks;
    }
    
  5. 「SparkFun_ADS1015_Arduino_Library.c」と「SparkFun_ADS1015_Arduino_Library.h」の次のデータ型を変更します。
  6. boolean → bool
    byte →  uint8_t
    
  7. 「SparkFun_ADS1015_Arduino_Library.h」のデータ型はコメントにします。
  8. Stream 
    

Quickfeather development kitへのAD変換器「ADS1015」の組み込み

「Quickfeather Simple Streaming Interface AI Application Project」のフォルダ「sensor_ssss.h」 「sensor_ssss.cpp」次のように変更します。

  • 3行目でチャンネル数を1個増やします。

sensor_ssss.h

...
 #define SENSOR_SSSS_SAMPLE_RATE_HZ       (100) // sensor sample rate per channel in Hz
#define SENSOR_SSSS_CHANNELS_PER_SAMPLE  ( 4)  // Number of channels
#define SENSOR_SSSS_LATENCY              (20)  // process samples every 20ms
...

  • 5行目でヘッダファイルを読み込み、13行目で「ADS1015」クラスのインスタンスを生成します。
  • 17行目で「ADS1015」クラスを初期化し、21行目でサンプルレートを設定します。18-19行目でデバッグ文をコメントにしていますが、これを有効にするとプログラムの実行が停止します。
  • 28行目で「A3」ピンからの入力電圧をAD変換します。31行目でAD変換したデジタル値を表示します。

sensor_ssss.cpp

...
#include "mc3635_wire.h"
#include "sml_recognition_run.h"

#include "SparkFun_ADS1015_Arduino_Library.h"  //**tomo

// When enabled, GPIO (configured in pincfg_table.c) is toggled whenever a

...
/* This section defines MACROs that may be user modified */

MC3635  qorc_ssi_accel;
ADS1015 qorc_ssi_adc ;  //**tomo

...
	//**tomo
	uint8_t ret = qorc_ssi_adc.begin();
//	dbg_str_int("adc.begin", ret);
//	dbg_str("adc.begin\n");

	qorc_ssi_adc.setSampleRate(sensor_ssss_config.rate_hz);
		
  /*--- END of User modifiable section ---*/
...
    p_dest += 6; // advance datablock pointer to retrieve and store next sensor data

	//**tomo
	int16_t adc_data = qorc_ssi_adc.getSingleEnded(3);
	*p_dest = adc_data;
//	p_dest += 1; // advance datablock pointer to retrieve and store next sensor data
	dbg_str_int("audio", adc_data);
...

AD変換器「ADS1015」からのデジタル変換値の入力

プログラムを実行すると次の値がシリアル端末に表示されます。

...
audio: 1644
audio: 1644
audio: 1645
audio: 1645
audio: 1645
audio: 1645
audio: 1644
audio: 1644
audio: 1644
audio: 1644
audio: 1644
...

抵抗による分圧により、入力電圧を変更して値を取得した結果を次に示します。デジタル変換値のLSBは約「0.0010012」Vになっていました。

入力電圧 デジタル変換値
0V 0
1.66V 1658
0.58V 582
3.3V 2047