コンテンツにスキップ

チュートリアル:アナログCO2センサー

最も短い完全なプログラマブルセンサー:400〜5000 ppmのスライダー、ピン上の電圧、そしてそれを読み取るArduino。最初から最後まで10分で完了し、今後すべてのアナログセンサーでコピーする形です。

[ CO2センサーチップ ] [ Arduino Uno ]
VCC o------------------------o 5V
GND o------------------------o GND
OUT o------------------------o A0
スライダー 400..5000 ppm -> OUT 0..5 V -> analogRead(A0)

エディタのファイルエクスプローラーからカスタムチップを追加します。ダイアログには組み込みテンプレートとStart from blankが表示されます。チュートリアルに沿って進めるには、空白のものを選択してください。どちらの場合も、マニフェスト(chip.json)とソース(chip.c)の2つのファイルが作成されます。

3つのピン、1つの属性、1つのコントロール。コントロールのidと属性のnameは一致している必要があります。それがそれらを結び付けます。

chip.json
{
"schema": "velxio-chip/v1",
"name": "CO2 Sensor",
"description": "Analog CO2 sensor with a live ppm slider. OUT maps 400-5000 ppm to 0-5 V.",
"pins": ["VCC", "GND", "OUT"],
"attributes": [
{ "name": "ppm", "label": "CO2 (ppm)", "type": "int",
"default": 1000, "min": 400, "max": 5000, "step": 10 }
],
"controls": [
{ "id": "ppm", "label": "CO2 (ppm)", "type": "range",
"min": 400, "max": 5000, "step": 10, "unit": "ppm" }
]
}

繰り返しタイマーがppmをボルトに変換してピンを駆動します。vx_attr_readがコールバック内にあることに注目してください。これにより、毎回のティックでスライダーの現在位置を確認できます。

chip.c
#include "velxio-chip.h"
#define PPM_MIN 400.0
#define PPM_MAX 5000.0
#define VOLTS_MAX 5.0
typedef struct {
vx_pin out;
vx_attr ppm;
vx_timer timer;
} chip_state_t;
static chip_state_t S;
static void on_tick(void *user_data) {
(void)user_data;
double ppm = vx_attr_read(S.ppm); /* ライブスライダー値 */
if (ppm < PPM_MIN) ppm = PPM_MIN;
if (ppm > PPM_MAX) ppm = PPM_MAX;
double volts = (ppm - PPM_MIN) / (PPM_MAX - PPM_MIN) * VOLTS_MAX;
vx_pin_dac_write(S.out, volts);
}
void chip_setup(void) {
S.out = vx_pin_register("OUT", VX_ANALOG);
S.ppm = vx_attr_register("ppm", 1000);
S.timer = vx_timer_create(on_tick, 0);
vx_timer_start(S.timer, 50000000ULL, true); /* 50 ms、ナノ秒単位 */
on_tick(0); /* 初期レベルを駆動 */
vx_log("co2 sensor ready");
}

重要な3つの詳細:

  • ピン上のVX_ANALOG。デジタルピンは中間電圧を伝送できず、vx_pin_dac_writeを実行しても意図した動作になりません。
  • vx_timer_startはナノ秒を受け取ります。50000000ULLは50 msです。これは最初のチップで最も一般的なタイプミスです。
  • 戻る前の裸のon_tick(0)。これがないと、最初のタイマーが発火するまでピンは0 Vのままで、高速なスケッチはそれを誤った400 ppmとして読み取ります。

Compileを押します。

Arduino Unoの隣のキャンバスにチップをドロップし、VCCを5Vに、GNDをGNDに、OUTをA0に接続します。

Arduino Unoに配線されたCO2センサーチップ:VCCから5V、GNDからGND、OUTからA0

sketch.ino
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(A0);
float volts = raw * (5.0f / 1023.0f);
float ppm = 400.0f + volts / 5.0f * 4600.0f;
Serial.print("raw="); Serial.print(raw);
Serial.print(" ppm="); Serial.println(ppm, 0);
delay(500);
}

ステップ6:実行してドラッグする

Section titled “ステップ6:実行してドラッグする”

Runを押し、チップをクリックします。スライダーパネルが開きます:

シミュレーション実行中のチップのライブパネル:ppm単位のCO2スライダー

ドラッグすると、シリアル出力が1つのdelay(500)以内で追従します:

スライダーを追跡するシリアルモニター:ppm読み取り値が1000から3000にジャンプ

これが全体のループです:スライダーが属性を書き込み、タイマーが毎秒20回それを読み取り、ピン電圧が変化し、analogReadがそれを確認します。

表示される内容 ほぼ確実な原因
チップをクリックしても何も開かない シミュレーションが停止している:パネルは実行中のみ開きます
スライダーは表示されるが読み取り値が動かない vx_attr_readがchip_setup()内で呼び出されてキャッシュされ、on_tick内で呼び出されていない
analogReadが0または1023のみを返す ピンがVX_ANALOGではなくデジタルモードとして登録されている
値が一度更新されてフリーズする vx_timer_startがrepeat falseで呼び出されたか、間隔がミリ秒で記述されたため次のティックが50000秒後になっている
シリアルが最初の瞬間に400 ppmを表示する 初期のon_tick(0)呼び出しが欠落している