/****************************************************** * 【 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年6月11日火曜日
[Elegoo:13] アナログ ジョイスティックモジュール
2019年5月30日木曜日
[Elegoo:12] DHT11 温度・湿度センサ
- 温度・湿度センサについて学ぶ
- DTH11から温度・湿度・データを取得してシリアルモニタに表示する
電子種別 | 電子部品 | 個数 |
マイコン | Elegoo UNO R3 マイコンボード | 1 |
USBケーブル | 1 | |
能動 | DHT11 デジタル温度・湿度センサ | 1 |
機構 | ジャンプワイヤ(緑)[オス-メス] | 1 |
ジャンプワイヤ(黒)[オス-メス] | 1 | |
ジャンプワイヤ(赤)[オス-メス] | 1 |
- 「DHT11 デジタル温度・湿度センサ」は温度と湿度の較正されたデジタル信号出力を含む複合センサ
- <較正>湿度・温度データに8Bitのチェックサムを付加し、データの送り手側が決められた計算方法によって算出した値と、受け手側が同一の計算方法によって算出した値が一致するかどうかを調べ、データの信頼性の向上を図ることができる
《データシート》 | |
精度(25℃) | 温度±2℃、湿度±5%RH |
サンプリング期間 | 2秒以上 |
《ピン》 | |
Vcc | 電源入力(5V or 3V) |
DATA | デジタルIO (プルアップ抵抗付) |
GND | GND |
書式 | 引数 | 説明 |
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] キーパッドでミュージックボックス
- キーパッド[メンブレン(膜)スイッチモジュール]について学ぶ
- ユーザーに押されたキー別にメロディを鳴らすミュージックボックスを作る
電子種別 | 電子部品 | 個数 |
マイコン | Elegoo UNO R3 マイコンボード | 1 |
USBケーブル | 1 | |
能動 | パッシブブザー | 1 |
機構 | 4×4マトリックス メンブレンキーパッド(#27899) |
1 |
ジャンプワイヤ(黒)[オス-メス] | 1 | |
ジャンプワイヤ(赤)[オス-メス] | 1 | |
ジャンプワイヤ(白)[オス-オス] | 2 | |
ジャンプワイヤ(青)[オス-オス] | 2 | |
ジャンプワイヤ(緑)[オス-オス] | 2 | |
ジャンプワイヤ(黄)[オス-オス] | 2 |
使用するキーパッドには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 → | 1 | 2 | 3 | A |
7 → | 4 | 5 | 6 | B |
6 → | 7 | 8 | 9 | C |
5 → | * | 0 | # | D |
書式 | 引数 | 説明 |
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() | 押されたキーを取得 |
/************************************************* * 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】 メロディ リスト * [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] 超音波センサモジュールで
楽器(テルミン)を作る
- 超音波センサについて学ぶ
- 超音波センサモジュールで楽器(テルミン)を作る
電子種別 | 電子部品 | 個数 |
マイコン | Elegoo UNO R3 マイコンボード | 1 |
USBケーブル | 1 | |
能動 | 超音波センサモジュール | 1 |
パッシブブザー | 1 | |
機構 | ジャンプワイヤ(赤)[オス-メス] | 1 |
ジャンプワイヤ(黒)[オス-メス] | 2 | |
ジャンプワイヤ(青)[オス-メス] | 1 | |
ジャンプワイヤ(緑)[オス-メス] | 1 | |
ジャンプワイヤ(黄)[オス-メス] | 1 |
超音波距離センサモジュールは、モジュールに2つ取り付けられているうちの超音波スピーカーから40kHzの周波数を出力し、 物体に反射された音をもう片方の超音波マイクで受信する
超音波は「音」なので超音波を出力してから受信するまでの時間に音速を掛けることで距離を求める(測距)
《データシート》 | |
動作電圧 | 5V |
測定可能距離 | 2~400cm(精度3mm) |
測定角度 | 15度以下 |
《端子》 | |
Vcc | 電源入力 (5V) |
Trig | 超音波スピーカー:超音波信号を送信 |
Echo | 超音波マイク:超音波信号を受信 (デジタルINPUT-距離を測定するPWNピン) |
GND | GND |
《測距の流れ》 |
(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] |
拡大 全体
書式 | 引数 | 説明 |
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]
/*************************************************/ /* 音階(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] サーボモータ
ポテンショメータでモータのシャフト(角度)を制御する
- サーボモータについて学ぶ
- ポテンショメータでサーボモータのシャフト(角度)を制御する
電子種別 | 電子部品 | 個数 |
マイコン | Elegoo UNO R3 マイコンボード | 1 |
USBケーブル | 1 | |
能動 | サーボモータ | 1 |
機構 | ポテンショメータ | 1 |
ブレッドボード | 1 | |
ジャンプワイヤ(赤)[オス-オス] | 3 | |
ジャンプワイヤ(黒)[オス-オス] | 3 | |
ジャンプワイヤ(黄)[オス-オス] | 2 |
"サーボ"とは、指示した位置や速度にすばやく追従させる制御をおこなう装置。
サーボモータは精密に制御できるギア(歯車)とシャフト(軸)を統合したモータで、 電気を入れたら回る、回りっぱなしのモーターではなく、
検出器がモーターの状態(速度や回転角度)をフィードバックしながら
回転の速度や位置を制御するドライバーと組み合わせて使用する
《データシート》 | |
コネクタ | 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グラム |
《端子》 | |
ServoMotor | Pin |
Brown | GND |
Red | 5V |
Orange | Digital (PWM) 9 or 10 |
- 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] 傾斜センサ
チルトボールスイッチで傾きを検出する
- 傾斜センサについて学ぶ
- 傾きを検出してボード上のLEDを点灯する
- 傾斜センサで動き(ON・OFF)や方向や傾きを検出できる
- 筒状の本体の中に2つの接点と、固定されていない導電体のボールが入っている
- ピンを下にして立つ状態だと導電体が接点に触れて通電(ON)し、
逆さにすると切れる(OFF)
電子種別 | 電子部品 | 個数 |
マイコン | Elegoo UNO R3 マイコンボード | 1 |
USBケーブル | 1 | |
能動 | チルトボールスイッチ | 1 |
機構 | ジャンプワイヤ(黄)[オス-メス] | 1 |
ジャンプワイヤ(黒)[オス-メス] | 1 |
- チルトボールスイッチは傾きでON・OFFが切り替わるスイッチ
- ピンを下にして立つ状態だと導電体が接点に触れて通電(ON)し、
逆さにすると切れる(OFF)
- 無し
/****************************************************/ /* 【 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を点灯 } }
2018年10月5日金曜日
[Elegoo: 6-7] ブザーで電子音・音階・メロディを鳴らす
- ブザーの鳴らし方について学ぶ
- ブザー音・音階(ドレミファソラシド)・メロディを鳴らす
- 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の出力を止める |
電子種別 | 電子部品 | 個数 |
マイコン | Elegoo UNO R3 マイコンボード | 1 |
USBケーブル | 1 | |
能動 | アクティブブザー | 1 |
パッシブブザー | 1 | |
機構 | プッシュボタン | 3 |
ブレッドボード | 1 | |
ジャンプワイヤ(赤)[オス-メス] | 1 | |
ジャンプワイヤ(黒)[オス-メス] | 1 | |
ジャンプワイヤ(青)[オス-オス] | 1 | |
ジャンプワイヤ(黄)[オス-オス] | 1 | |
ジャンプワイヤ(緑)[オス-オス] | 1 | |
ジャンプワイヤ(黒)[オス-オス] | 4 |
- 電子ブザーはDC電源で集積回路を備えている。
- PCやプリンタ、アラームや電子玩具、車載電子機器、電話機、タイマ及び音声デバイス用の電子製品に広く使用されている
- ピンを上に向けて、黒色のテープで囲まれているのがアクティブ(能動的)ブザー、緑色の回路基板を持つのがパッシブ(受動的)ブザー
- アクティブブザーは発振器内臓で、決まった直流電圧を掛けると決まった音程のブザー音(BEEP音)が鳴る。また周波数(2k~5k)にて音程を変えたり、メロディーを流すことも可能
- パッシブブザーは周波数にて音程を変えたり、メロディーを流すことができる
- 【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音)は鳴らない
登録:
投稿 (Atom)