注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く学びましょう。
参加する理由
専門的なサポート: 販売後の問題や技術的な課題をコミュニティとチームで解決。
学びと共有: 技術やチュートリアルを交換し、スキルを向上。
限定プレビュー: 新製品発表や先行情報に早期アクセス。
特別割引: 新製品を特別価格で購入可能。
イベント・プレゼント企画: プレゼントや季節キャンペーンに参加。
👉 一緒に探求し、創造しましょう。今すぐ [ここ] をクリックして参加!
2.1.7 可変抵抗器 (MCP3008)
はじめに
ADC 機能はアナログ信号をデジタル値に変換するために使います。 この実験では MCP3008 ADC チップを使用して変換を行います。 可変抵抗器を使って電圧を変化させ、MCP3008 がそのアナログ電圧をデジタル値に変換し、Raspberry Pi で読み取ります。
必要な部品
このプロジェクトには以下の部品が必要です。
部品をまとめて購入するのが便利です。リンクはこちら:
名前 |
キット内数量 |
リンク |
|---|---|---|
Raphael Kit |
337 |
以下から個別に購入することもできます。
部品紹介 |
購入リンク |
|---|---|
- |
回路図
T-Board 名 |
physical |
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 ~/raphael-kit/c/2.1.7-2/
ステップ 3: コードをコンパイルします。
gcc 2.1.7_Potentiometer.c -lwiringPi
ステップ 4: 実行します。
sudo ./a.out
コードを実行すると、可変抵抗器のつまみを回すと LED の明るさが変化します。
注釈
実行しても動作しない、または「wiringPi.h: No such file or directory」というエラーが出た場合は WiringPiのインストールと確認 を参照してください。
コード
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <softPwm.h>
#define SPI_CHANNEL 0 // CE0
#define SPI_SPEED 1000000 // 1MHz
#define LedPin 3
int readADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // 開始ビット
buffer[1] = (8 + channel) << 4; // シングルエンドモード、チャンネル
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2];
return value;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("WiringPi init failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
softPwmCreate(LedPin, 0, 100);
while (1) {
int analogVal = readADC(0); // CH0
printf("ADC Value: %d\n", analogVal);
int pwmVal = analogVal * 100 / 1023; // 0–100 に正規化
softPwmWrite(LedPin, pwmVal);
delay(100);
}
return 0;
}
コード解説
#define SPI_CHANNEL 0 // CE0
#define SPI_SPEED 1000000 // 1MHz
#define LedPin 3
SPI チャンネルを CE0 に設定し、SPI 速度を 1MHz に設定、GPIO3 を LED ピンに割り当てます。
int readADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // 開始ビット
buffer[1] = (8 + channel) << 4; // シングルエンドモード、チャンネル選択
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2];
return value;
}
この関数は MCP3008 からアナログデータを読み取ります。
チャンネル番号が 0~7 の範囲か確認します。
3バイトの配列を初期化します:
buffer[0] = 1: MCP3008 通信用の開始ビット。buffer[1] = (8 + channel) << 4: シングルエンドモードでチャンネルを指定。buffer[2] = 0: 結果を受け取るプレースホルダ。
wiringPiSPIDataRWで SPI 通信を実行。10ビットの ADC 結果をビット演算で抽出して返します。
int main(void) {
if (wiringPiSetup() == -1) {
printf("WiringPi init failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
softPwmCreate(LedPin, 0, 100);
while (1) {
int analogVal = readADC(0); // CH0
printf("ADC Value: %d\n", analogVal);
int pwmVal = analogVal * 100 / 1023; // 0–100 に正規化
softPwmWrite(LedPin, pwmVal);
delay(100);
}
return 0;
}
main 関数の流れ
wiringPiSetup(): WiringPi ライブラリを初期化。wiringPiSPISetup(): SPI 通信をチャンネル 0、1MHz で初期化。softPwmCreate(): GPIO3 でソフトウェア PWM を 0~100 の範囲で生成。
無限ループ内で:
可変抵抗器が接続されたチャンネル 0 の ADC 値を読み取る。
その値をターミナルに表示。
10 ビットの ADC 値を PWM デューティ比 (0~100) に変換。
LED の明るさを可変抵抗器の位置に応じて変更。
delay(100) で 100 ミリ秒待機して次の処理に移ります。