注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く楽しみましょう。
参加する理由
専門的なサポート: 購入後の問題や技術的課題を、コミュニティやチームが解決します。
学びと共有: ヒントや作例を共有してスキルを向上させます。
限定先行情報: 新製品発表やプレビューをいち早く入手できます。
特別割引: 最新製品の特別割引を利用できます。
季節イベントとプレゼント企画: イベントやプレゼント企画に参加できます。
👉 一緒に創造と探求の旅に出かけましょう。[ここ] をクリックして今すぐ参加!
2.2.1 フォトレジスタ(MCP3008)
はじめに
フォトレジスタは、生活の中で周囲の明るさを検知するためによく使われる部品です。 コントローラが昼と夜を判別し、ナイトランプなどの明かり制御機能を実現できます。 このプロジェクトは可変抵抗器を使う実験と非常によく似ており、電圧の変化を光の強さの検知に置き換えたものです。
必要な部品
このプロジェクトで使用する部品は以下の通りです。
回路図
T-Board 名 |
物理ピン |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
実験手順
手順1: 回路を組み立てます。
手順2: コードのフォルダに移動します。
cd ~/davinci-kit-for-raspberry-pi/nodejs/
手順3: コードを実行します。
sudo node photoresistor-2.js
コード
const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');
// MCP3008 のチャンネル0(アナログ入力 CH0)を開く
const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => {
if (err) {
console.error("MCP3008 を開けません:", err);
process.exit(1);
}
console.log("MCP3008 が SPI0/CE0 に初期化されました。");
// GPIO22 の LED を初期化(PWM 出力対応)
const led = new Gpio(22, { mode: Gpio.OUTPUT });
// 100ms ごとに ADC を読み取り LED の明るさを更新
const interval = setInterval(() => {
adc.read((err, reading) => {
if (err) {
console.error("ADC 読み取りエラー:", err);
return;
}
const adcValue = reading.value; // 0.0〜1.0 の浮動小数点
const pwmValue = Math.round(adcValue * 255); // 0〜255 に変換
console.log(`ADC = ${adcValue.toFixed(4)}, PWM = ${pwmValue}`);
led.pwmWrite(pwmValue); // LED の明るさを更新
});
}, 100);
// Ctrl+C (SIGINT) を処理して終了
process.on('SIGINT', () => {
console.log('\n正常に終了します...');
clearInterval(interval); // ループを停止
led.digitalWrite(0); // LED を消灯
process.exit(0);
});
});
コード解説
const Gpio = require('pigpio').Gpio;
pigpio モジュールを読み込みます。これは Raspberry Pi の GPIO ピン制御用で、LED の調光に必要な PWM 出力をサポートします。
const mcpadc = require('mcp-spi-adc');
mcp-spi-adc ライブラリを読み込みます。これにより、Raspberry Pi のハードウェア SPI を使って MCP3008 アナログ-デジタル変換器と通信できます。
const adc = mcpadc.openMcp3008(0, { speedHz: 1350000 }, (err) => { ... });
MCP3008 のアナログ入力チャンネル0を開きます。SPI クロック速度は 1.35 MHz に設定されています。 チャンネルを開く際にエラーが発生した場合は、ログを出力して終了します。
const led = new Gpio(22, { mode: Gpio.OUTPUT });
GPIO22 を出力モードで初期化します。 pigpio を通して PWM を使い、LED の明るさを制御します。
setInterval(() => {
adc.read((err, reading) => {
...
});
}, 100);
100ミリ秒ごとに MCP3008 のチャンネル0からアナログ値を読み取ります。 結果は 0.0〜1.0 の浮動小数点で、入力電圧と基準電圧の比率を表します。
const pwmValue = Math.round(adcValue * 255);
led.pwmWrite(pwmValue);
アナログ値を 0〜255 の8ビット PWM 値に変換し、GPIO22 に出力して LED の明るさを比例的に制御します。
process.on('SIGINT', () => {
clearInterval(interval);
led.digitalWrite(0);
process.exit(0);
});
Ctrl+C が押されたときにプログラムを正常終了させるシグナルハンドラを追加します。
ループを停止し、LED を消灯して、クリーンに終了します。