2019年6月11日火曜日

[Elegoo:13] アナログ ジョイスティックモジュール




概要 (Overview)
  • アナログ ジョイスティックについて学ぶ
  • XY軸の位置データと押し込んだ状態をシリアルモニタに表示する



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 アナログ ジョイスティック1
機構 ジャンプワイヤ(黄)[オス-メス]1
ジャンプワイヤ(緑)[オス-メス]1
ジャンプワイヤ(青)[オス-メス]1
ジャンプワイヤ(赤)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]1




電子部品について (Component Introduction)

アナログ ジョイスティック


  • アナログ ジョイスティックはX/Y二軸のポテンショメータと、SWのプッシュボタンの組み合わせ
  • X/Y軸:ジョイスティックが中立位置にあるときアナログ値[512]を、
    ジョイスティックを倒したX/Y方向にアナログ値[0-1024]を返す
  • SW:ジョイスティックを押し込むとデジタル値[LOW]を返す
  • SWピンから安定した読み取るため、Arduinoデジタルピンに内蔵されたプルアップ抵抗を介してVCCに接続する

《ピン》
GNDGND
Vcc電源入力(5V or 3V)
VRxアナログIN [0-1024]
VRyアナログIN [0-1024]
SWデジタルIN (プルアップ抵抗付)プッシュ時[LOW]



電子回路 (Electronic Circuit)

回路図 (Schematic)


実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)


スケッチ
/******************************************************
 * 【 Elegoo:13 】ジョイスティックモジュール
 *    X/Yからデータを読み取るためにアナログPINを使用し、
 *    Switchを読むためにデジタルピンを使用する
 *****************************************************/

// ピン
#define PIN_SW 2  // スイッチ[D2]
#define PIN_X  0  // X軸    [A0]
#define PIN_Y  1  // Y軸    [A1]

/*********/
/* setup */
/*********/
void setup() {
  // --------------------------------------------------
  //Digital PIN (Switch)の設定
  pinMode(PIN_SW, INPUT);
  digitalWrite(PIN_SW, HIGH);   //初期化

  // --------------------------------------------------
  // シリアルモニタ開始
  Serial.begin(9600);
}

/********/
/* loop */
/********/
void loop() {

  // --------------------------------------------------
  //Switch
  Serial.print("Switch[");
  Serial.print(digitalRead(PIN_SW));
  Serial.print("] ");
  // --------------------------------------------------
  //X
  Serial.print("X-axis[");
  Serial.print(analogRead(PIN_X));
  Serial.print("] ");
  // --------------------------------------------------
  //Y
  Serial.print("Y-axis[");
  Serial.print(analogRead(PIN_Y));
  Serial.println("]");

  delay(500);
}

結果(動画)・モニタリング


ジョイスティックの状態をシリアルモニタに表示する

2019年5月30日木曜日

[Elegoo:12] DHT11 温度・湿度センサ




概要 (Overview)
  • 温度・湿度センサについて学ぶ
  • DTH11から温度・湿度・データを取得してシリアルモニタに表示する



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 DHT11 デジタル温度・湿度センサ1
機構 ジャンプワイヤ(緑)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]1
ジャンプワイヤ(赤)[オス-メス]1



電子部品について (Component Introduction)

DHT11 温度・湿度センサ


  • 「DHT11 デジタル温度・湿度センサ」は温度と湿度の較正されたデジタル信号出力を含む複合センサ
  • <較正>湿度・温度データに8Bitのチェックサムを付加し、データの送り手側が決められた計算方法によって算出した値と、受け手側が同一の計算方法によって算出した値が一致するかどうかを調べ、データの信頼性の向上を図ることができる
《データシート》
精度(25℃)温度±2℃、湿度±5%RH
サンプリング期間2秒以上

《ピン》
Vcc電源入力(5V or 3V)
DATAデジタルIO (プルアップ抵抗付)
GNDGND



電子回路 (Electronic Circuit)

回路図 (Schematic)



実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

SimpleDHT11ライブラリ
書式引数説明
int SimpleDHT11::read(int pin,
 byte* ptemperature,
 byte* phumidity,
 byte pdata[40])
int pin:ピンNO
byte* ptemperature:温度
byte* phumidity:湿度
byte pdata[40]:取得データ
温度・湿度・データを取得する

スケッチ
/*************************************************
 * 【 Elegoo:12 】DHT11 温度・湿度センサー
 *    温度・湿度をシリアルモニタに表示する
 *************************************************/
/*--------------------------------------------*/
/* SimpleDHT11ライブラリ                       */
/*--------------------------------------------*/
#include <simpledht.h>

// SimpleDHT11オブジェクトを作成
SimpleDHT11 objDHT11;

// ピン
#define PIN_DHT11  2

/********/
/* loop */
/********/
void loop() {
  Serial.println("=================================");
  Serial.println("DHT11 サンプリング中...");
  
  byte byteTemperature = 0;   //温度
  byte    byteHumidity = 0;   //湿度
  byte    byteData[40] = {0}; //取得データ

  // --------------------------------------------------
  // DTH11から温度・湿度・データを取得する
  // --------------------------------------------------
  if (objDHT11.read(PIN_DHT11, &byteTemperature, &byteHumidity, byteData)) {
    // 取得 失敗
    Serial.print("Read DHT11 failed");
    return;
  }

  // --------------------------------------------------
  // 取得した温度・湿度・データをシリアルモニタに表示する
  // --------------------------------------------------
  Serial.print("Read DHT11 OK : ");
  // --------------------------------------------------
  // 温度
  Serial.print((int)byteTemperature); Serial.print(" *C, ");
  // --------------------------------------------------
  // 湿度
  Serial.print((int)byteHumidity); Serial.println(" %");
  // --------------------------------------------------
  // データ
  // [湿度(整数)8Bit][湿度(小数)8Bit][温度(整数)8Bit][温度(小数)8Bit][チェックサム8bit]
  // チェックサム=温度・湿度のByteDataを足した下位8Bit
  Serial.print("RAW Bits: ");
  for (int i = 0; i < 40; i++) {
    Serial.print((int)byteData[i]);
    if (i > 0 && ((i + 1) % 4) == 0) {
      Serial.print(' ');
    }
  }
  Serial.println("");

  
  // サンプリング:2秒以上
  delay(2000);
}

/*********/
/* setup */
/*********/
void setup() {
  // シリアルモニタ開始
  Serial.begin(9600);
}

結果(動画)・モニタリング


温度・湿度・データをシリアルモニタに表示する

2019年5月19日日曜日

[Elegoo:11] キーパッドでミュージックボックス



概要 (Overview)
  • キーパッド[メンブレン(膜)スイッチモジュール]について学ぶ
  • ユーザーに押されたキー別にメロディを鳴らすミュージックボックスを作る



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 パッシブブザー1
機構 4×4マトリックス
メンブレンキーパッド(#27899)
1
ジャンプワイヤ(黒)[オス-メス]1
ジャンプワイヤ(赤)[オス-メス]1
ジャンプワイヤ(白)[オス-オス]2
ジャンプワイヤ(青)[オス-オス]2
ジャンプワイヤ(緑)[オス-オス]2
ジャンプワイヤ(黄)[オス-オス]2



電子部品について (Component Introduction)

マトリクスキーパッド


使用するキーパッドには16個のキー(0-9, A-D, *, #)がある。
リニアキーパッドではキー総数分とグランドピン1本の出力ピンが必要だが
マトリクス不等号化式キーパッドは、行列各4ピンの計8ピンと配線が少なくて済む。
まずは4列(ピン1〜4)を一度にローまたはハイにしてから、4行(ピン5〜8)の状態をポーリングして 列の状態に応じて押されたキーを認識する

《データシート》
最大定格24VDC/30mA
インターフェース4×4マトリックスへの8ピンアクセス
使用温度0〜50℃

《端子とキー配列》
白/黒4 ↓3 ↓2 ↓1 ↓
8 →123A
7 →456B
6 →789C
5 →*0#D




電子回路 (Electronic Circuit)
回路図 (Schematic)


実体配線図 (Wiring Diagram)




実践 (To Practice)
配線写真 (Example Picture)


プログラム (Code)

KeyPadライブラリ
書式引数説明
Keypad::Keypad(char userKeymap,
 byte rowPins, byte colPins,
 byte rows, byte cols)
userKeymap:キー配列
rowPins:行ピンNo配列
colPins:列ピンNo配列
rows:行数
cols:列数
KeyPadオブジェクトを作成し、
ピンを割り当てる
Keypad::makeKeymap(char hexKeymap) hexKeymap:キー配列 キーマップ作成
char Keypad::getKey()
押されたキーを取得

音階の周波数(Hz)
pitches.h

/*************************************************
 * pitches.h : 音階(NOTE_B0 - DS8)の周波数(Hz)を定義
 * https://www.arduino.cc/en/Tutorial/ToneMelody
 * Public Constants 
 *************************************************/

#define NOTE_B0    31
#define NOTE_C1    33
#define NOTE_CS1  35
       …

#define NOTE_CS8  4435
#define NOTE_D8    4699
#define NOTE_DS8  4978

メロディ リスト
melodyList.h

/*************************************************
 * 【melodyList.h】 メロディ リスト
 *    [0] 音階     [ NOTE_xx, 0:休符 ]
 *    [1] 音の長さ[ 4:四分音符, 8:八分音符 ]
 *-------------------------------------------------
 *      ①ドレミの歌 [ドレミファソラシド]
 *      ②きらきらぼし
 *      ③ゆかいな牧場
 *      ④にんげんっていいな
 *      ⑤おもちゃのチャチャチャ
 ************************************************/

// 音階の周波数(Hz)
#include "pitches.h"

#define NOTE      0       // 音階
#define DURATIONS 1       // 音の長さ

//-------------------------------------------------
// ドレミの歌
//-------------------------------------------------
// ド[C]
int aryMelodyC[][7] = {
  { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_C4, NOTE_E4 },
  { 2, 4, 2, 4, 2, 2, 2 }
};
// レ[D]
int aryMelodyD[][7] = {
  { NOTE_D4, NOTE_E4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_F4 },
  { 2, 4, 2, 4, 2, 2, 2 }
};
// ミ[E]
int aryMelodyE[][7] = {
  { NOTE_E4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_G4, NOTE_E4, NOTE_G4 },
  { 2, 4, 2, 4, 2, 2, 2 }
};
// ファ[F]
int aryMelodyF[][7] = {
  { NOTE_F4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_A4 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// ソ[G]
int aryMelodyG[][7] = {
  { NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// ラ[A]
int aryMelodyA[][7] = {
  { NOTE_A4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// シ[B]
int aryMelodyB[][7] = {
  { NOTE_B4, NOTE_E4, NOTE_FS4, NOTE_GS4, NOTE_A4, NOTE_B4, NOTE_C5 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// ド[C5]
int aryMelodyC5[][7] = {
  { NOTE_B4, NOTE_B4, NOTE_A4, NOTE_F4, NOTE_B4, NOTE_G4, NOTE_C5 },
  { 8, 8, 4, 4, 4, 4, 2 }
};
// C4 -> C5
int aryMelodyC4_C5[][8] = {
  { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 },
  { 4, 4, 4, 4, 4, 4, 4, 4 }
};
// C5 -> C4
int aryMelodyC5_C4[][8] = {
  { NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4 },
  { 4, 4, 4, 4, 4, 4, 4, 4 }
};

//-------------------------------------------------
// きらきらぼし
//-------------------------------------------------
int aryMelodyStar[][14] = {
  { NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, 
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4},
  { 4, 4, 4, 4, 4, 4, 2,
    4, 4, 4, 4, 4, 4, 2 }
};

//-------------------------------------------------
// ゆかいな牧場
//-------------------------------------------------
int aryMelodyCow[][13] = {
  { NOTE_G4, NOTE_G4, NOTE_G4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4,
    0,       NOTE_B4, NOTE_B4, NOTE_A4, NOTE_A4, NOTE_G4 },
  { 8, 8, 8, 8, 8, 8, 2,
    8, 8, 8, 8, 8, 2 }
};

//-------------------------------------------------
// にんげんっていいな
//-------------------------------------------------
int aryMelodyHuman[][14] = {
  { NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_D4, NOTE_C4, 0,
    NOTE_E4, NOTE_E4, 0,       NOTE_G4, NOTE_F4, NOTE_D4, NOTE_E4 },
  { 4, 4,  4, 4, 4, 4, 8,
    2, 4, 16, 8, 4, 4, 4 }
};

//-------------------------------------------------
// おもちゃのチャチャチャ
//-------------------------------------------------
int aryMelodyCha[][24] = {
  { NOTE_C4, NOTE_C4, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_A4, NOTE_A4,
    NOTE_D4, NOTE_D4, NOTE_D4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
    NOTE_G4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_GS4,
    NOTE_G4, NOTE_B4, NOTE_C5 },
  { 8, 8, 8, 8, 8, 8, 2,
    8, 8, 8, 8, 8, 8, 2,
    8, 8, 8, 8, 8, 8, 8,
    8, 8, 8 }
};

スケッチ
/**************************************************
 * 【 Elegoo:11 】膜(メンブレイン)スイッチモジュール
 *    キーパッドでミュージックボックス
 *************************************************/

/*--------------------------------------------*/
/* Keypadライブラリ                            */
/*--------------------------------------------*/
#include <keypad .h>
// 行列数
const byte bytRows = 4;                  // 行数
const byte bytCols = 4;                  // 列数
// 行列ピンNo
byte aryRowPins[bytRows] = {9, 8, 7, 6}; // 行ピンNo
byte aryColPins[bytCols] = {5, 4, 3, 2}; // 列ピンNo
// キー配列
char hexKeymap[bytRows][bytCols] = {     
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
// Keypadオブジェクトを作成
Keypad objKeypad = Keypad( makeKeymap(hexKeymap),   // キーマップ作成
                           aryRowPins, aryColPins,  // 行列ピンNo
                           bytRows, bytCols         // 行列数
                          );

/*--------------------------------------------*/
/* ブザー                                     */
/*--------------------------------------------*/
// ピンの定義
#define BUZZER    12      // D12

/*--------------------------------------------*/
/* メロディ                                   */
/*--------------------------------------------*/
#include "pitches.h"      // 音階の周波数(Hz)
#include "melodyList.h"   // メロディリスト

/*****************************************/
/* 関数名:メロディ 出力                   */
/*  引数:rAryNote      [音階   ]        */
/*      :rAryDurations [音の長さ]        */
/*      :rBytNoteNum   [音階総数]        */
/*****************************************/
void outputMelody( int *rAryNote, int *rAryDurations, byte rBytNoteNum){

  // --------------------------------------------------
  //  音階数の周波数を音の長さだけ出力する 
  // --------------------------------------------------
  for( int i = 0; i < rBytNoteNum; i++){
    tone( BUZZER, rAryNote[i],( 1000 / rAryDurations[i] ) );
    delay( 500 );   //演奏速度
  }

  // --------------------------------------------------
  // 周波数の出力を停止する
  // --------------------------------------------------
  noTone( BUZZER );
  delay( 500 );
}


/********/
/* loop */
/********/
void loop() {
  byte bytNoteNum;    // 音階総数

   // 押されたキーを取得する
  char chrKey = objKeypad.getKey();

  // --------------------------------------------------
  // 押されたキー別にメロディを出力する
  //    メロディ[0] 音階
  //    メロディ[1] 音の長さ
  // --------------------------------------------------
  if (chrKey){
    switch(chrKey){
      // --------------------------------------------------
      // 1:ド
      case '1':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC[NOTE] ) / sizeof( aryMelodyC[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC[NOTE], aryMelodyC[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 2:レ
      case '2':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyD[NOTE] ) / sizeof( aryMelodyD[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyD[NOTE], aryMelodyD[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 3:ミ
      case '3':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyE[NOTE] ) / sizeof( aryMelodyE[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyE[NOTE], aryMelodyE[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 4:ファ
      case '4':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyF[NOTE] ) / sizeof( aryMelodyF[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyF[NOTE], aryMelodyF[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 5:ソ
      case '5':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyG[NOTE] ) / sizeof( aryMelodyG[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyG[NOTE], aryMelodyG[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 6:ラ
      case '6':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyA[NOTE] ) / sizeof( aryMelodyA[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyA[NOTE], aryMelodyA[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 7:シ
      case '7':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyB[NOTE] ) / sizeof( aryMelodyB[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyB[NOTE], aryMelodyB[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 8:ド
      case '8':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC5[NOTE] ) / sizeof( aryMelodyC5[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC5[NOTE], aryMelodyC5[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 9:ド[C4 -> C5]
      case '9':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC4_C5[NOTE] ) / sizeof( aryMelodyC4_C5[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC4_C5[NOTE], aryMelodyC4_C5[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 0:ド[C5 -> C4]
      case '0':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC5_C4[NOTE] ) / sizeof( aryMelodyC5_C4[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC5_C4[NOTE], aryMelodyC5_C4[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // A:きらきらぼし
      case 'A':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyStar[NOTE] ) / sizeof( aryMelodyStar[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyStar[NOTE], aryMelodyStar[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // B:ゆかいな牧場
      case 'B':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyCow[NOTE] ) / sizeof( aryMelodyCow[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyCow[NOTE], aryMelodyCow[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // C:にんげんっていいな
      case 'C':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyHuman[NOTE] ) / sizeof( aryMelodyHuman[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyHuman[NOTE], aryMelodyHuman[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // D:おもちゃのチャチャチャ
      case 'D':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyCha[NOTE] ) / sizeof( aryMelodyCha[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyCha[NOTE], aryMelodyCha[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // その他:シリアルモニタに表示
      default:
        Serial.println(chrKey);
    }
  }
}


/*********/
/* setup */
/*********/
void setup(){
  // pinの設定
  pinMode( BUZZER, OUTPUT );  // BUZZER : 出力用

  // シリアルモニタ開始
  Serial.begin( 9600 );
}

結果(動画)・モニタリング

動画


ドレミの歌
ボタン1→2→3→4:ド→レ→ミ→ファ


 ボタンA:きらきらぼし
ボタンB:ゆかいな牧場
ボタンD:おもちゃのチャチャチャ

2019年3月7日木曜日

[Elegoo:10] 超音波センサモジュールで
楽器(テルミン)を作る


概要 (Overview)
  • 超音波センサについて学ぶ
  • 超音波センサモジュールで楽器(テルミン)を作る



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 超音波センサモジュール1
パッシブブザー1
機構 ジャンプワイヤ(赤)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]2
ジャンプワイヤ(青)[オス-メス]1
ジャンプワイヤ(緑)[オス-メス]1
ジャンプワイヤ(黄)[オス-メス]1



電子部品について (Component Introduction)

超音波センサモジュール HC-SR04


超音波距離センサモジュールは、モジュールに2つ取り付けられているうちの超音波スピーカーから40kHzの周波数を出力し、 物体に反射された音をもう片方の超音波マイクで受信する
超音波は「音」なので超音波を出力してから受信するまでの時間に音速を掛けることで距離を求める(測距)

《データシート》
動作電圧5V
測定可能距離2~400cm(精度3mm)
測定角度15度以下

《端子》
Vcc電源入力 (5V)
Trig超音波スピーカー:超音波信号を送信
Echo超音波マイク:超音波信号を受信
(デジタルINPUT-距離を測定するPWNピン)
GNDGND

《測距の流れ》
(1) 超音波スピーカーのTrigピンを10μs以上Highにする
(2) モジュールが自動的にTrigピンからパルス(40kHzの信号を8回)を送信する
(3) モジュールが測定物から反射したパルス信号を超音波マイクに受信する
(4) パルス信号の送信~受信までに掛かった時間分だけEchoピンがHighになる
(5) EchoピンがHighになった時間をμs単位で測定し、音速を掛けて距離を計算する

《測距の計算》
(HR-SR04ライブラリのDistance関数)
片道の距離[cm] = 時間[μs→msec→sec] × 音速[m/sec→cm/sec] ÷ 2[片道]
空気中の音速は公式「331.5 + 0.6 t (m/sec) tは摂氏温度」:一般的に340(m/sec)

片道の距離[cm] = (パルス送受信時間[μs] ÷ 1,000,000[μs→msec→sec])
                              × (340[m/s] × 100[m/s→cm/s])
                              ÷ 2[片道]
  => 片道の距離(cm)=パルス送受信時間[μs] × 0.017
 マイコンは小数計算しないほうが良いので 0.017=1/59 とすることもある
  => 片道の距離(cm)=パルス送受信時間[μs] ÷ 59[cm/μs]




電子回路 (Electronic Circuit)
回路図 (Schematic)





実体配線図 (Wiring Diagram)





実践 (To Practice)
配線写真 (Example Picture)

拡大           全体

プログラム (Code)

HR-SR04ライブラリ
書式引数説明
SR04::SR04(int echoPin, int triggerPin) echoPin:超音波を受信
triggerPin:超音波を送信
SR04にピンに割り当てる
long SR04::Distance() 対象物までの距離を測る(cm)
long SR04::DistanceAvg(int wait, int count) wait :待機遅延  [ms]
count:計測回数 []
指定計測回数分計数を行い、
平均を計算する(cm)

HR-SR04ライブラリを使用しない場合は《測距の流れ》に従って
①直接Trigピンから10μs間超音波を出力し
②PulseIn関数でechoピンのHIGH→LOWのパルスの長さ(パルス送受信時間)を受信して
③測距の計算を行う
《測距の計算》片道の距離(cm)=パルス送受信時間[μs] ÷ 59[cm/μs]

音階(ドレミ)の周波数(Hz)
pitches.h


/*************************************************/
/* 音階(NOTE_B0 - DS8)の周波数(Hz)を定義           */
/* https://www.arduino.cc/en/Tutorial/ToneMelody */
/*************************************************/

#define NOTE_B0    31
#define NOTE_C1    33
#define NOTE_CS1   35
    …
#define NOTE_CS8   4435
#define NOTE_D8    4699
#define NOTE_DS8   4978

スケッチ
/**********************************************/
/* 【 Elegoo:10 】超音波センサモジュール       */
/*    超音波センサモジュールで                  */
/*    楽器のテルミンを作る                     */
/* ※※ 音階の周波数と間隔距離(cm)を任意で設定   */
/**********************************************/

/*--------------------------------------------*/
/* SR04ライブラリの作成                        */
/*--------------------------------------------*/
#include <SR04.h>
#define PIN_TRIG    12  // D12 : 超音波スピーカー
#define PIN_ECHO    11  // D11 : 超音波マイク

// SR04オブジェクトの作成
SR04 objSr04 = SR04( PIN_ECHO, PIN_TRIG );

/*-------------------------------------------*/
/* ブザーと音階                               */
/*-------------------------------------------*/
#define PIN_BUZZER  13  // D13 : ブザー

// 音階(ドレミ)の周波数(Hz):NOTE_B0 - DS8     ※※
#include "pitches.h"
int aryNote[] = {
    NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
    NOTE_G4, NOTE_A4, NOTE_B4, 
    NOTE_C5
};
#define NOTE_STEP    3  // 音階の間隔距離(cm)  ※※
int intNoteCM;          // 音階全長(cm)


/*********/
/* setup */
/*********/
void setup() {

  // --------------------------------------------------
  // ブザーpinの設定
  // --------------------------------------------------
  pinMode( PIN_BUZZER,  OUTPUT );

  // --------------------------------------------------
  // 音階の数と間隔距離から音階全長を設定
  // --------------------------------------------------
  intNoteCM = ( sizeof(aryNote) / sizeof(aryNote[0]) ) * NOTE_STEP;

  // --------------------------------------------------
  // シリアルモニタ開始
  // --------------------------------------------------
  Serial.begin( 9600 );

  delay( 1000 );
}

/********/
/* loop */
/********/
void loop() {

  // 対象物までの距離を測る(cm)
  // 不安定解消のため、計数後(ms, 回数)平均を算出
  long lngDistance = objSr04.DistanceAvg( 10, 10 );   

  // --------------------------------------------------
  // 測定可能距離の範囲内:2~400cm(精度3mm)
  // --------------------------------------------------
  if( 2 <= lngDistance && lngDistance <= 402 ){

    // 対象物までの距離 - 測定可能開始距離(2cm)
    lngDistance -= 2;

    // --------------------------------------------------
    // 対象物までの距離別にブザーから音(周波数)を出力
    // --------------------------------------------------
    // 音階全長(cm)以内
    if( lngDistance <  intNoteCM ) {

      // 出力する音の決定
      int intCnt = lngDistance / NOTE_STEP; 

      // シリアルモニタに表示
      Serial.print( lngDistance ); Serial.print("cm : ");
      Serial.println( intCnt );

      // 音の周波数を出力
      tone( PIN_BUZZER, aryNote[intCnt] );

    // 音階全長(cm)以外
    } else {
      // 周波数の出力を停止
      noTone( PIN_BUZZER );
    }

  // --------------------------------------------------
  // 測定可能距離の範囲外
  // --------------------------------------------------
  }else{
      // 周波数の出力を停止
      noTone( PIN_BUZZER );
  }

  delay( 100 ); 
}

結果(動画)・モニタリング

動画

モニタリング

2018年12月18日火曜日

[Elegoo: 9] サーボモータ
ポテンショメータでモータのシャフト(角度)を制御する




概要 (Overview)
  • サーボモータについて学ぶ
  • ポテンショメータでサーボモータのシャフト(角度)を制御する




使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 サーボモータ1
機構 ポテンショメータ1
ブレッドボード1
ジャンプワイヤ(赤)[オス-オス]3
ジャンプワイヤ(黒)[オス-オス]3
ジャンプワイヤ(黄)[オス-オス]2



電子部品について (Component Introduction)

サーボモータ SG90


"サーボ"とは、指示した位置や速度にすばやく追従させる制御をおこなう装置。
サーボモータは精密に制御できるギア(歯車)とシャフト(軸)を統合したモータで、 電気を入れたら回る、回りっぱなしのモーターではなく、
検出器がモーターの状態(速度や回転角度)をフィードバックしながら
回転の速度や位置を制御するドライバーと組み合わせて使用する

《データシート》
コネクタJR/FP
動作速度0.12秒/60度(4.8V)、0.10秒/60度(6.0V)
停動トルク(4.8V)1.6kg/cm
温度-30〜60℃
デッドバンド幅5us
使用電圧3.5 - 6V
寸法3.2cm×3cm×1.2cm
重量134グラム

《端子》
ServoMotorPin
BrownGND
Red5V
OrangeDigital (PWM) 9 or 10



電子回路 (Electronic Circuit)

回路図 (Schematic)


実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

サーボライブラリ
  • Arduinoボードからシャフトの角度である電気パルスを送信してモータを制御する
  • サーボは精密に制御できるギア(歯車)とシャフト(軸)を統合したモータで、 一般的なサーボはシャフトを様々な角度(0~180度)にすることができる
  • 殆どのボードで12個のサーボオブジェクトを作成可能だが、
    多くのサーボを制御する場合はArduinoの5Vピンではなく、
    外部から電源を供給する
    ※ この場合必ずArduinoと外部電源のアースを接続する
書式引数説明
uint8_t Servo::attach(int pin)
uint8_t Servo::attach(int pin, int min, int max)
pin:デジタルピン番号
min:最小値
max:最大値
サーボにピンに割り当て
0~180度のパルス幅を
マイクロ秒で指定
※9,10ピンのPWM機能⇒不可
※省略時:min[544],max[2400]
(一部:min[700],max[2300])
void Servo::write(int value) value:角度(0-180) サーボに角度を書き込み
シャフトを制御する
void Servo::writeMicroseconds(int value) value:角度(0-180) サーボに角度のパルス幅を
マイクロ秒単位で書き込み、
シャフトを制御する
int Servo::read() サーボの現在位置(0-180)の
角度を戻す
bool Servo::attached() サーボ変数がピンに
割り当てられているかを
戻す
void Servo::detach() サーボ変数をピンから
切り離す
※9,10ピンのPWM機能⇒可

スケッチ
/**********************************************/
/* 【 Elegoo:9 】サーボモータ                  */
/*    ポテンショメータで                        */
/*    サーボモータのシャフト(角度)を制御する     */
/**********************************************/

/*----------------------------*/
/* サーボ ライブラリ
/*----------------------------*/
#include <Servo.h>


// サーボオブジェクトの作成
Servo objServo;

// シャフトの角度
int intAngle = 0;

/*----------------------------*/
// ポテンショメータ(10K)使用
/*----------------------------*/
#define METER 

/*----------------------------*/
// ピンの定義
/*----------------------------*/
#define PIN_SERVO 9   // D9:サーボモータ
#define PIN_METER 0   // A0:ポテンショメータ(角度)


/*********/
/* setup */
/*********/
void setup(){

  // --------------------------------------------------
  // サーボモータにピンに割り当て,
  // 0~180度のパルス幅をマイクロ秒で指定
  // --------------------------------------------------
  objServo.attach(PIN_SERVO, 700, 2300);

  // --------------------------------------------------
  // シャフト位置の初期化
  // --------------------------------------------------
  objServo.write(0);  // サーボに角度を書き込む
  delay(500);         // シャフトがその位置に達するのを待つ

}

/********/
/* loop */
/********/
void loop(){

// --------------------------------------------------
// ポテンショメータでシャフトを制御する
// --------------------------------------------------
#ifdef METER
  // ポテンショメータから角度(0-180)を読み込む
  intAngle = map(analogRead(PIN_METER), 0,1023,0,180);
  objServo.write(intAngle); // サーボに角度を書き込む
  delay(10);                // シャフトがその位置に達するのを待つ

// --------------------------------------------------
// 角度:0⇔180度でシャフトを制御する
// --------------------------------------------------
#else

  // 角度:0 → 180度
  for (intAngle = 0; intAngle <= 180; intAngle += 1){ 
    objServo.write(intAngle);   // サーボに角度を書き込む
    delay(10);                  // シャフトがその位置に達するのを待つ
  }

  // 角度:180 → 0度
  for (intAngle = 180; 0 <= intAngle; intAngle -= 1){ 
    objServo.write(intAngle);   // サーボに角度を書き込む
    delay(10);                  // シャフトがその位置に達するのを待つ
  }

#endif
}

結果(動画)・モニタリング


サーボモータのシャフト(角度)を制御する


ポテンショメータでサーボモータのシャフト(角度)を制御する

2018年10月9日火曜日

[Elegoo: 8] 傾斜センサ
チルトボールスイッチで傾きを検出する




概要 (Overview)
  • 傾斜センサについて学ぶ
  • 傾きを検出してボード上のLEDを点灯する



参照 (Reference)
傾斜センサ
  • 傾斜センサで動き(ON・OFF)や方向や傾きを検出できる
  • 筒状の本体の中に2つの接点と、固定されていない導電体のボールが入っている
  • ピンを下にして立つ状態だと導電体が接点に触れて通電(ON)し、
    逆さにすると切れる(OFF)



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 チルトボールスイッチ1
機構 ジャンプワイヤ(黄)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]1



電子部品について (Component Introduction)

チルトボールスイッチ


  • チルトボールスイッチは傾きでON・OFFが切り替わるスイッチ
  • ピンを下にして立つ状態だと導電体が接点に触れて通電(ON)し、
    逆さにすると切れる(OFF)



電子回路 (Electronic Circuit)

回路図 (Schematic)


実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

ライブラリ
  • 無し

スケッチ
/****************************************************/
/* 【 Elegoo:8 】傾斜センサ                         */
/*    チルトボールスイッチで傾きを検出して             */
/*    ボード上のLEDを点灯する                        */
/****************************************************/

// ピンの定義
#define SW_BALL 2    // D2:チルトボールスイッチ


/*********/
/* setup */
/*********/
void setup(){

  // --------------------------------------------------
  // デジタルピンを設定
  // --------------------------------------------------
  pinMode( LED_BUILTIN, OUTPUT );   // ボード上のLED( D13 )
  pinMode( SW_BALL, INPUT );

  // --------------------------------------------------
  // チルトボールスイッチを初期化( OFF )
  // --------------------------------------------------
  digitalWrite( SW_BALL, HIGH );
} 


/********/
/* loop */
/********/
void loop(){

  // --------------------------------------------------
  // チルトボールスイッチ : OFF ( HIGH )
  // --------------------------------------------------
  if(digitalRead(SW_BALL) == HIGH){
    digitalWrite(LED_BUILTIN,LOW);    // LEDを消灯

  // --------------------------------------------------
  // チルトボールスイッチ : ON ( LOW )
  // --------------------------------------------------
  } else {
    digitalWrite(LED_BUILTIN,HIGH);   // LEDを点灯

  }
}

結果(動画)・モニタリング


傾きを検出してボード上のLEDを点灯する

2018年10月5日金曜日

[Elegoo: 6-7] ブザーで電子音・音階・メロディを鳴らす




概要 (Overview)
  • ブザーの鳴らし方について学ぶ
  • ブザー音・音階(ドレミファソラシド)・メロディを鳴らす



参照 (Reference)

tone関数
(周波数指定型PWM 出力)

  • PWM出力はLEDの明るさを変更できる。PWMの周波数はLEDの明るさや光の波長には無関係だが、PWMの周波数が関係する素子もある。その一つが電圧の振動で音波を生じる電圧スピーカー
  • 電圧の周波数と発生する音波の高さ(音の高さ)が一致するので、PWMの周波数が固定されていると音の高さを変えることができないが、Arduinoには指定した周波数(31Hz~65KHz[最大81KHz])の矩形波(50%デューティ)を出力するtone関数が用意されている
  • PWM出力に利用するタイマと同じタイマ(タイマ/カウンタ2)を利用するためデジタルピンの3番と11番へのPWM出力を妨げるので注意する
書式引数説明
void tone( [byte]pin, [unsigned int]frequency )            
void tone( [byte]pin, [unsigned int]frequency,
                 [long]durations )
pin:デジタルピン番号
frequency:
音の高さの周波数(Hz)
durations:   ※オプション
出力時間(ms)
pinにfrequencyを
(durations時間)
出力し続ける
void noTone( [byte]pin ) pin:デジタルピン番号 pinの出力を止める




使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動アクティブブザー1
パッシブブザー1
機構プッシュボタン3
ブレッドボード1
ジャンプワイヤ(赤)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]1
ジャンプワイヤ(青)[オス-オス]1
ジャンプワイヤ(黄)[オス-オス]1
ジャンプワイヤ(緑)[オス-オス]1
ジャンプワイヤ(黒)[オス-オス]4




電子部品について (Component Introduction)

ブザー

  • 電子ブザーはDC電源で集積回路を備えている。
  • PCやプリンタ、アラームや電子玩具、車載電子機器、電話機、タイマ及び音声デバイス用の電子製品に広く使用されている
  • ピンを上に向けて、黒色のテープで囲まれているのがアクティブ(能動的)ブザー、緑色の回路基板を持つのがパッシブ(受動的)ブザー
  • アクティブブザーは発振器内臓で、決まった直流電圧を掛けると決まった音程のブザー音(BEEP音)が鳴る。また周波数(2k~5k)にて音程を変えたり、メロディーを流すことも可能
  • パッシブブザーは周波数にて音程を変えたり、メロディーを流すことができる





電子回路 (Electronic Circuit)

回路図 (Schematic)



実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

ライブラリ
  • 【pitches】音階の周波数を宣言

スケッチ
/*****************************************/
/* 【 Elegoo: 6-7 】 ブザー              */
/*    電子音・音階・メロディを鳴らす        */
/*****************************************/

// pitchesライブラリ:音階の周波数(Hz)を宣言
#include "pitches.h"

// ピンの定義
#define BUZZER    5   // D5 : BUZZER
#define SW_BEEP   7   // D7 : Switch 電子音(BEEP)
#define SW_TONE   8   // D8 : Switch 音階
#define SW_MELODY 9   // D9 : Switch メロディ

/*-------------------------*/
/* 音階                    */
/*    "pitches.h"より      */
/*-------------------------*/
int aryFrequency[] = {
    NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
    NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
};

/*-------------------------*/
/* メロディ : きらきらぼし   */
/*    "pitches.h"より      */
/*-------------------------*/
int aryMelody[] = {
    NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, 
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4, 
    NOTE_G4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
    NOTE_G4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
    NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4
};
// 音の長さ
int aryMelodyDurations[] = {
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2,
    4,4,4,4,4,4,2, 
    4,4,4,4,4,4,2
};

/*-------------------------*/
/* 音階総数                */
/*-------------------------*/
int noteNum; 


/*********/
/* setup */
/*********/
void setup(){
  // pinの設定
  pinMode( BUZZER,    OUTPUT );       // BUZZER : 出力用
  pinMode( SW_BEEP,   INPUT_PULLUP ); // Switch : プルアップ時に発動
  pinMode( SW_TONE,   INPUT_PULLUP ); // Switch : プルアップ時に発動
  pinMode( SW_MELODY, INPUT_PULLUP ); // Switch : プルアップ時に発動
}

/********/
/* loop */
/********/
void loop(){
  // --------------------------------------------------
  // Switch 電子音(BEEP) ==> BEEP音 出力
  // --------------------------------------------------
  if( digitalRead( SW_BEEP ) == LOW ) outputBeep();

  // --------------------------------------------------
  // Switch 音階 ==> 音階 出力
  // --------------------------------------------------
  if( digitalRead( SW_TONE ) == LOW ) outputTone();

  // --------------------------------------------------
  // Switch メロディ ==> メロディ 出力
  // --------------------------------------------------
  if( digitalRead( SW_MELODY ) == LOW ) outputMelody();
}


/********************************/
/* BEEP音 出力                  */
/********************************/
void outputBeep(){
  int i, j;

  // --------------------------------------------------
  // 音の長さ
  // --------------------------------------------------
  for( j = 0; j <= 600; j += 150 ){

    // --------------------------------------------------
    // 演奏回数
    // --------------------------------------------------
    for( i = 0; i < 5; i++ ){
      digitalWrite( BUZZER, HIGH );
      delay( j );
      digitalWrite( BUZZER, LOW );
      delay( j );
    }
  }
}


/********************************/
/* 音階 出力                    */
/********************************/
void outputTone(){
  // --------------------------------------------------
  // 音階総数の設定
  // --------------------------------------------------
  noteNum = sizeof aryFrequency / sizeof aryFrequency[0];

  // --------------------------------------------------
  // 音階数の周波数を出力する 
  // --------------------------------------------------
  for( int i = 0; i < noteNum; i++ ){
    tone( BUZZER, aryFrequency[i] );
    delay( 500 );   // 演奏速度
  }

  // --------------------------------------------------
  // 周波数の出力を停止する
  // --------------------------------------------------
  noTone( BUZZER );
  delay( 500 );
}


/********************************/
/* メロディ 出力                */
/********************************/
void outputMelody(){
  // --------------------------------------------------
  // 音階総数の設定
  // --------------------------------------------------
  noteNum = sizeof aryMelody / sizeof aryMelody[0];

  // --------------------------------------------------
  //  音階数の周波数を音の長さだけ出力する 
  // --------------------------------------------------
  for( int i = 0; i < noteNum; i++){
    tone( BUZZER, aryMelody[i],( 1000 / aryMelodyDurations[i] ) );
    delay( 500 );   //演奏速度
  }

  // --------------------------------------------------
  // 周波数の出力を停止する
  // --------------------------------------------------
  noTone( BUZZER );
  delay( 500 );
}


結果(動画)・モニタリング

アクティブブザー

BEEP音

音階

メロディ[ きらきらぼし ]


パッシブブザー

BEEP音
※ 発振器が内臓されていないため、
電圧を掛けてもブザー音(BEEP音)は鳴らない

音階

メロディ[ きらきらぼし ]