Arduino Mega 2560 LESSON:13 ジョイスティック

提供:yonewiki

Arduino Mega 2560に戻る。

概要

 ジョイスティックを接続するレッスンです。温度湿度計(DHT11)の値を読み取るより楽な構造ですね。


 アナログ読み込みの良さを知れる項目になっていますが、ジョイスディック内部ではアナログの傾きを可変抵抗器

//www.elegoo.com
//2016.12.09

// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(9600);
}

void loop() {
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  //Serial.print("\n");
  Serial.print(", X-axis: ");
  Serial.print(analogRead(X_pin));
  //Serial.print("\n");
  Serial.print(", Y-axis: ");
  Serial.println(analogRead(Y_pin));
  //Serial.print("\n\n");
  delay(500);
}


 出力

Switch:  1, X-axis: 496, Y-axis: 509
Switch:  1, X-axis: 496, Y-axis: 509
Switch:  1, X-axis: 496, Y-axis: 509
Switch:  1, X-axis: 496, Y-axis: 509
Switch:  1, X-axis: 496, Y-axis: 509
Switch:  1, X-axis: 496, Y-axis: 509


ジョイスティックとサーボが連動して動く接続をしてみましょう。この方が面白いよね。


完成図は以下のようになります。


完成図


PCB図は以下のようになります。


PCB図


3Dプレビュー図は以下のようになります。


3Dプレビュー図


コードは以下のようになります。


#include <Servo.h>

const int X_pin = A0;
const int SERVO_PIN = 9;

// ジョイスティックの補正値
const int MIN_X = 0;
const int CENTER_X = 496;
const int MAX_X = 1023;

// サーボの取り付け角度補正
const int SERVO_OFFSET = 20;  // 補正角度 R

Servo myServo;

void setup() {
  Serial.begin(9600);
  myServo.attach(SERVO_PIN);
}

void loop() {
  int x = analogRead(X_pin);
  int angle;

  // ジョイスティックの中央補正
  if (x < CENTER_X) {
    angle = map(x, MIN_X, CENTER_X, 0, 90);
  }
  else {
    angle = map(x, CENTER_X, MAX_X, 90, 180);
  }

  // サーボの取り付け位置を補正
  // 例:R=10なら使用範囲は10~180度
  int servoAngle = map(
    angle,
    0, 180,
    SERVO_OFFSET, 180
  );

  servoAngle = constrain(servoAngle, 0, 180);

  myServo.write(servoAngle);

  Serial.print("X = ");
  Serial.print(x);
  Serial.print("  Logical Angle = ");
  Serial.print(angle);
  Serial.print("  Servo Angle = ");
  Serial.println(servoAngle);

  delay(20);
}


constrain() の書き方


constrain(x, a, b);


3つの引数には、次の意味があります。


引数   意味
x      範囲を制限したい数値
a      最小値
b      最大値


map() の書き方


map(value, fromLow, fromHigh, toLow, toHigh);


map() には5つの引数があります。


引数       意味
value      変換したい数値
fromLow    変換前の範囲の開始値
fromHigh   変換前の範囲の終了値
toLow      変換後の範囲の開始値
toHigh     変換後の範囲の終了値


 という感じで、簡単にジョイスティックとサーボが連動できます。連動したら楽しいよね。楽しい操縦装置なので、その昔、戦闘機や航空機にとりつけられた際もジョイスティックという奇妙な名前を付けたのかもしれませんね。


 

Arduino Mega 2560に戻る。