考慮到 Raspberry Pi 讀取模拟信号是很煩人的事情,更何況是在沒人玩的 Windows 10 IoT 下,是以準備正兒八經的寫點東西。
需求:使用 Raspberry Pi 讀取輸出模拟信号的 MQ 系列氣體傳感器。(GitHub:
https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/ADS1115)
由于 Raspberry Pi 3B 内部并沒有內建 ADC,是以需要外接 ADC 來進行模數轉換。外接 ADC 選用的是 ADS1115,淘寶到處都是,而且還不貴, I2C 的通訊方式實作起來相對容易些。
1. 過程分析
在 ADS1115 的資料手冊(GitHub項目中附帶了PDF)的第11頁中,官方給出了一個簡單的快速開始
(1)設定配置寄存器
(2)定位到轉換寄存器
(3)讀取轉換寄存器
2. 寄存器配置分析
了解了大概過程後接下來就是查寄存器的格式及配置方法了。
ADS1115 的 ADDR 接口的接法決定了位址。

按照第一點的過程分析,第一步我們要設定配置寄存器。配置寄存器分高八位和低八位,指針定位到配置寄存器後,需要分别寫入兩個 byte 的配置資料。詳細的比特位的功能可以查下資料手冊。在這裡隻介紹用的到的。
在14-12位,是 MUX 配置。簡單的說,這決定了 ADS1115 的 A0-A3 接口的測量方式。比如說,當設定為 0x04 時測量的為 A0-GND 的電壓,當設定為 0x00 時測量的為 A0-A1 間的電壓。
在第8位,是 ADS1115 的狀态配置。0x00 為測量模式,0x01 為休眠。
在第7-5位,是每秒采樣次數的配置。
以上是我們需要的配置位,其他的按照資料手冊上的預設即可。即高八位 0 100 001 0(0x42),低八位 100 0 0 0 11(0x83)。需要其他的功能,按照資料手冊上的更改即可。
配置完成後,讀取資料是非常簡單的,直接讀取即可。
3. 連線
VDD - 5V
GND - GND
SCL - SCL
SDA - SDA
ADDR - GND
A0 - MQ 傳感器的 A0
4. 部分代碼
詳細的代碼已經放在 GitHub 上了,這裡隻給出 ADS1115.cs 的簡單介紹。
/// <summary>
/// Constructor
/// </summary>
/// <param name="addr">ADS1115 Address</param>
/// <param name="mux">Input Multiplexer</param>
/// <param name="pga">Programmable Gain Amplifier</param>
/// <param name="rate">Data Rate </param>
public ADS1115(AddressSetting addr = AddressSetting.GND, InputMultiplexeConfig mux = InputMultiplexeConfig.AIN0, PgaConfig pga = PgaConfig.FS4096, DataRate rate = DataRate.SPS128);
/// <summary>
/// Initialize ADS1115
/// </summary>
/// <returns></returns>
public async Task InitializeAsync();
/// <summary>
/// Read Raw Data
/// </summary>
/// <returns>Raw Value</returns>
public short ReadRaw();
/// <summary>
/// Convert Raw Data to Voltage
/// </summary>
/// <param name="val">Raw Data</param>
/// <returns>Voltage</returns>
public double RawToVoltage(short val);
/// <summary>
/// Cleanup
/// </summary>
public void Dispose();
5. 如何使用
第一步,需要執行個體化 ADS1115,并調用 InitializeAsync()。
ADS1115 adc = new ADS1115(AddressSetting.GND, InputMultiplexeConfig.AIN0, PgaConfig.FS4096, DataRate.SPS860);
await adc.InitializeAsync();
第二步,讀取資料。
short raw = adc.ReadRaw();
double vol = adc.RawToVoltage(raw);
如果需要釋放,調用 adc.Dispose();
6. 運作圖