注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く楽しみましょう。
参加する理由
専門的なサポート: 購入後の問題や技術的課題を、コミュニティやチームが解決します。
学びと共有: ヒントや作例を共有してスキルを向上させます。
限定先行情報: 新製品発表やプレビューをいち早く入手できます。
特別割引: 最新製品の特別割引を利用できます。
季節イベントとプレゼント企画: イベントやプレゼント企画に参加できます。
👉 一緒に創造と探求の旅に出かけましょう。[ここ] をクリックして今すぐ参加!
2.1.4 可変抵抗器(MCP3008)
はじめに
ADC(アナログ-デジタル変換)機能は、アナログ信号をデジタル値に変換します。 この実験では MCP3008 ADC チップを使って変換を行います。 可変抵抗器は可変電圧を発生させ、それに応じて物理量が変化します。 MCP3008 はこのアナログ電圧をデジタル値に変換し、Raspberry Pi で読み取り・処理できるようにします。
必要な部品
このプロジェクトで使用する部品は以下の通りです。
回路図
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 potentionmeter-2.js
コードを実行した後、可変抵抗器のつまみを回すと LED の明るさが変化します。
コード
const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');
// Open MCP3008 channel 0 (analog input CH0)
const adc = mcpadc.openMcp3008(0, { speedHz: 1000000 }, (err) => {
if (err) {
console.error("Failed to open ADC channel:", err);
process.exit(1);
}
console.log("MCP3008 channel 0 opened successfully.");
// Initialize LED on GPIO22 with PWM output mode
const led = new Gpio(22, { mode: Gpio.OUTPUT });
// Read ADC value every 100ms and update LED brightness
setInterval(() => {
adc.read((err, reading) => {
if (err) {
console.error("Error reading ADC:", err);
return;
}
// Convert floating-point value (0.0鈥?.0) to PWM range (0鈥?55)
const pwmVal = Math.round(reading.value * 255);
console.log(`Current analogVal: ${pwmVal}`);
// Update LED brightness using PWM
led.pwmWrite(pwmVal);
});
}, 100);
});
コード解説
const Gpio = require('pigpio').Gpio;
pigpio モジュールを読み込み、Raspberry Pi の GPIO 制御と高精度 PWM 制御を可能にします。
const mcpadc = require('mcp-spi-adc');
mcp-spi-adc ライブラリを読み込み、SPI インターフェース経由で MCP3008 と通信できるようにします。
const adc = mcpadc.openMcp3008(0, { speedHz: 1000000 }, (err) => {
if (err) {
console.error("Failed to open ADC channel:", err);
process.exit(1);
}
});
MCP3008 のアナログ入力チャンネル0を初期化します。SPI 通信速度を 1MHz に設定します。 初期化に失敗した場合はエラーを表示して終了します。
const led = new Gpio(22, { mode: Gpio.OUTPUT });
GPIO22 を出力モードで設定し、PWM によって LED の明るさを制御します。
setInterval(() => {
adc.read((err, reading) => {
if (err) {
console.error("Error reading ADC:", err);
return;
}
const pwmVal = Math.round(reading.value * 255);
console.log(`Current analogVal: ${pwmVal}`);
led.pwmWrite(pwmVal);
});
}, 100);
100ミリ秒ごとに MCP3008 のチャンネル0からアナログ値を読み取ります。
読み取った値(0.0~1.0)を 0~255 の範囲に変換し、 pwmWrite() で LED の明るさを調整します。
同時に PWM 値をコンソールに出力します。