注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好家コミュニティ(Facebook)へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く楽しみましょう。

参加する理由

  • 専門的なサポート: 購入後の問題や技術的課題を、コミュニティやチームが解決します。

  • 学びと共有: ヒントや作例を共有してスキルを向上させます。

  • 限定先行情報: 新製品発表やプレビューをいち早く入手できます。

  • 特別割引: 最新製品の特別割引を利用できます。

  • 季節イベントとプレゼント企画: イベントやプレゼント企画に参加できます。

👉 一緒に創造と探求の旅に出かけましょう。[ここ] をクリックして今すぐ参加!

2.1.6 ジョイスティック(MCP3008)

注釈

../_images/mcp3008_and_adc0834.jpg

使用しているキットによって ADC0834 または MCP3008 のどちらかを確認し、該当する説明に進んでください。

はじめに

このプロジェクトでは、ジョイスティックの仕組みを学びます。 ジョイスティックを操作し、その結果を画面に表示します。

必要な部品

このプロジェクトで使用する部品は以下の通りです。

../_images/image317-copy.png

回路図

ジョイスティックのデータを読み取る際、軸ごとに違いがあります。 X軸とY軸のデータはアナログ信号のため、MCP3008 を使ってアナログ値をデジタル値に変換する必要があります。 Z軸(ボタン)のデータはデジタル信号のため、GPIO から直接読み取ることも、ADC を経由して読み取ることもできます。

../_images/schematic_2.1.9_joystick_mcp3008_js.png

実験手順

手順1: 回路を組み立てます。

../_images/2.1.9_Joystick_js.png

手順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 が返ります。 これらの値はすべてコンソールに表示されます。