注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く楽しみましょう。
参加する理由
専門的なサポート: 購入後の問題や技術的課題を、コミュニティやチームが解決します。
学びと共有: ヒントや作例を共有してスキルを向上させます。
限定先行情報: 新製品発表やプレビューをいち早く入手できます。
特別割引: 最新製品の特別割引を利用できます。
季節イベントとプレゼント企画: イベントやプレゼント企画に参加できます。
👉 一緒に創造と探求の旅に出かけましょう。[ここ] をクリックして今すぐ参加!
2.1.6 ジョイスティック(MCP3008)
はじめに
このプロジェクトでは、ジョイスティックの仕組みを学びます。 ジョイスティックを操作し、その結果を画面に表示します。
必要な部品
このプロジェクトで使用する部品は以下の通りです。
回路図
ジョイスティックのデータを読み取る際、軸ごとに違いがあります。 X軸とY軸のデータはアナログ信号のため、MCP3008 を使ってアナログ値をデジタル値に変換する必要があります。 Z軸(ボタン)のデータはデジタル信号のため、GPIO から直接読み取ることも、ADC を経由して読み取ることもできます。
実験手順
手順1: 回路を組み立てます。
手順2: コードのフォルダに移動します。
cd ~/davinci-kit-for-raspberry-pi/nodejs/
手順3: コードを実行します。
sudo node joystick-2.js
コードを実行したら、ジョイスティックを動かすと、 x、y、Btn の値が画面に表示されます。
コード
const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');
// チャンネル1(X軸)を開く
const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, (err) => {
if (err) {
console.error('X チャンネルを開けません:', err);
process.exit(1);
}
});
// チャンネル2(Y軸)を開く
const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, (err) => {
if (err) {
console.error('Y チャンネルを開けません:', err);
process.exit(1);
}
});
// GPIO22 をプルアップ入力で設定(ボタン用)
const btn = new Gpio(22, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
// 読み取りループ
setInterval(() => {
xChannel.read((errX, xReading) => {
if (errX) {
console.error('X チャンネル読み取りエラー:', errX);
return;
}
yChannel.read((errY, yReading) => {
if (errY) {
console.error('Y チャンネル読み取りエラー:', errY);
return;
}
const x_val = Math.round(xReading.value * 1023);
const y_val = Math.round(yReading.value * 1023);
const btn_val = btn.digitalRead();
console.log(`x = ${x_val}, y = ${y_val}, btn = ${btn_val}\n`);
});
});
}, 100);
コード解説
const mcpadc = require('mcp-spi-adc');
mcp-spi-adc モジュールを読み込み、Raspberry Pi のハードウェア SPI を使って MCP3008 と通信できるようにします。
const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, ...);
const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, ...);
MCP3008 のアナログ入力チャンネル1(X軸)とチャンネル2(Y軸)を開きます。 SPI 通信速度は 1.35 MHz に設定しています。
const btn = new Gpio(22, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
GPIO22 をデジタル入力として設定し、内部プルアップ抵抗を有効化します。 このピンでプッシュボタンの状態を読み取ります。
setInterval(() => {
xChannel.read(...);
yChannel.read(...);
}, 100);
100ミリ秒ごとに、MCP3008 のチャンネル1とチャンネル2から X軸・Y軸の値を読み取ります。 取得した値(0.0〜1.0の範囲)は 0〜1023 の10ビット整数に変換されます。 また、GPIO22 からボタンの状態を読み取り、押されているときは 0、離されているときは 1 が返ります。 これらの値はすべてコンソールに表示されます。