差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:6:2_dfplayer_uart [2024/06/16 19:15] – [サンプルコード解説] matsuhachigimmickkouza:electronic_basic:6:2_dfplayer_uart [2024/06/21 18:34] (現在) lutamesta
行 2: 行 2:
 「ライブラリ」を使いこなせば、「シリアル通信」で部品とArduino間でデータのやり取りを行う、高機能な電子部品を動かすことができるようになります。 「ライブラリ」を使いこなせば、「シリアル通信」で部品とArduino間でデータのやり取りを行う、高機能な電子部品を動かすことができるようになります。
 本項より順に、「UART」・「I2C」・「SPI」の3種類のシリアル通信について説明します。 本項より順に、「UART」・「I2C」・「SPI」の3種類のシリアル通信について説明します。
 +  
 ===== 本項で使用する電子部品 ===== ===== 本項で使用する電子部品 =====
 ==== DFPlayerモジュール ==== ==== DFPlayerモジュール ====
行 17: 行 17:
  正規品、海外品、DFPlayer miniを比べてみた(ど素人電子工作):  正規品、海外品、DFPlayer miniを比べてみた(ど素人電子工作):
  https://toccho.net/2023/01/03/dfplayer-mini/  https://toccho.net/2023/01/03/dfplayer-mini/
 +  
 ==== スピーカー ==== ==== スピーカー ====
 {{:gimmickkouza:electronic_basic:6:6-9.png?300|}} {{:gimmickkouza:electronic_basic:6:6-9.png?300|}}
行 77: 行 77:
 検索結果をスクロールし、__ライブラリ名が「DFRobotDFPlayerMini」開発者が「by DFRobot」のもの__をインストールしてください。 検索結果をスクロールし、__ライブラリ名が「DFRobotDFPlayerMini」開発者が「by DFRobot」のもの__をインストールしてください。
 __このライブラリがインストールされていないと本資料のサンプルコードは動きませんのでご注意ください。__ __このライブラリがインストールされていないと本資料のサンプルコードは動きませんのでご注意ください。__
-<alert type="danger">バージョンは最新版で大丈夫とか一言あってもよさそう</alert>+ 
 +ライブラリのバージョンは最新版で大丈夫です。 
 +(万が一、最新版のライブラリを使ってエラーが出る場合は、講師が使った1.0.6にダウングレードしてみてください) 
 +/*<alert type="danger">バージョンは最新版で大丈夫とか一言あってもよさそう</alert>*/
  
 == 手順4:公式のライブラリを見つけてインストールする == == 手順4:公式のライブラリを見つけてインストールする ==
行 214: 行 217:
 そんなわけでようやく配線図です。 そんなわけでようやく配線図です。
 DFPlayerのRXとArduinoのTXの間には、先述の通り1kΩの抵抗を入れてください。 DFPlayerのRXとArduinoのTXの間には、先述の通り1kΩの抵抗を入れてください。
-<alert type="danger">使う部品欲し</alert>+__こ図ではパッと見DFPlayerの向きわかりにくいのですが、SDカードの挿入口が右側にある状態です。__ 
 +**また先述の通り、RXとTXは互い違いになるように(つまりDFPlayerのRXはArduinoのTX(D1)に、DFPlayerのTXはArduinoのRX(D0)に)繋いでくださ。**
  
 +今回ArduinoののD0とD1はデジタル入出力ではなく、UART(RX/TX)として使います。
 +[[gimmickkouza:electronic_basic:5:4_stepup#5-4-2_CdS_with_LED|]]で「D0とD1はデジタル入出力には使わない方が無難!」と書いていますが、今回はUARTとして使うので大丈夫です。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| DFPlayer | 1個   |
 +| 抵抗器(1kΩ) | 1個   |
 +| ブレッドボード用スピーカー | 1個   |
 +
 +/*<alert type="danger">使う部品の表が欲しい</alert>
 <alert type="danger">下の注意、の部分でもいいんですが、 <alert type="danger">下の注意、の部分でもいいんですが、
 注意ポイントとして、DFplayerの向きと、TXRXの配線の確認をお願いしたいです。 注意ポイントとして、DFplayerの向きと、TXRXの配線の確認をお願いしたいです。
-ほぼ絶対逆にする。私も逆にしました。</alert>+ほぼ絶対逆にする。私も逆にしました。</alert>*/
  
 == ⚠注意⚠ == == ⚠注意⚠ ==
 こちらの配線図及びサンプルコード6-2-1には、Arduino Uno R4シリーズでしか動作しない固有の仕様が含まれています。 こちらの配線図及びサンプルコード6-2-1には、Arduino Uno R4シリーズでしか動作しない固有の仕様が含まれています。
 なので、Arduino Uno R3(及び、R4シリーズではない他のArduino)で上の図の配線及び6-2-1を実行しようとすると、エラーが出て動作しません! なので、Arduino Uno R3(及び、R4シリーズではない他のArduino)で上の図の配線及び6-2-1を実行しようとすると、エラーが出て動作しません!
-Uno R4シリーズ以外のArduinoをお使いの方は、6-2-1の説明は目を通すだけにして、実際のコードはR4以外対応版となるサンプルコード6-2-2をご利用ください。+__Uno R4シリーズ以外のArduinoをお使いの方は、6-2-1の説明は目を通すだけにして、実際のコードはR4以外対応版となるサンプルコード6-2-2をご利用ください。__
  
 ちなみに6-2-2では「R4シリーズ以外のArduinoで2つ以上のUARTを同時に使いたい時」のやり方を履修できます。 ちなみに6-2-2では「R4シリーズ以外のArduinoで2つ以上のUARTを同時に使いたい時」のやり方を履修できます。
行 270: 行 284:
 今回「DFRobotDFPlayerMini」ライブラリ用のサンプルコード(スケッチ例)を召喚したところ、この#include "Arduino.h"が明示されていたため、これはそのまま生かしておくことにしました。 今回「DFRobotDFPlayerMini」ライブラリ用のサンプルコード(スケッチ例)を召喚したところ、この#include "Arduino.h"が明示されていたため、これはそのまま生かしておくことにしました。
  
-<alert type="danger">多分ESP32とか向けのインクルードなのでなくていいです</alert>+<panel type="info" title="まつはちさんからのアドバイス">多分ESP32向けのインクルードだと思います。今回はなくてもOKです</panel>
  
 == 2行目 == == 2行目 ==
行 312: 行 326:
 R4シリーズでは~と書いてある通り、この部分はR4独自の仕様となっています。 R4シリーズでは~と書いてある通り、この部分はR4独自の仕様となっています。
 **R4以外のArduinoを使う場合は、このシリアルの使い方が異なります**(詳細は6-2-2で!) **R4以外のArduinoを使う場合は、このシリアルの使い方が異なります**(詳細は6-2-2で!)
-<alert type="danger">気になる人は、前回繋いじゃいけないピンって言ってなかった?ってなるかもですね...UART用途で使うからOKなのですが</alert>+/*<alert type="danger">気になる人は、前回繋いじゃいけないピンって言ってなかった?ってなるかもですね...UART用途で使うからOKなのですが</alert>*/
  
 == 10行目 == == 10行目 ==
行 365: 行 379:
 なので、__myDFP.play(1);の命令をした後は、再生時間の間delay等を使ってプログラムの進行を止めておく必要があります。__ なので、__myDFP.play(1);の命令をした後は、再生時間の間delay等を使ってプログラムの進行を止めておく必要があります。__
  
-しかし、delay(187000);とするのはまったく現実的ではありません。+しかし、delay(187000);とするのはまったく現実的ではありません。(そもそも無理です。下記参照)
 また、どれだけの時間delayで止めるべきかはファイルの再生時間によって変わります。 また、どれだけの時間delayで止めるべきかはファイルの再生時間によって変わります。
 もしファイルを入れ替える場合や、再生したいファイルが複数ある場合に、ファイルごとに個別にdelayを設定するのはあまり賢い方法とは言えません。 もしファイルを入れ替える場合や、再生したいファイルが複数ある場合に、ファイルごとに個別にdelayを設定するのはあまり賢い方法とは言えません。
行 375: 行 389:
 MP3ファイルの再生が終わると、loop文の先頭に戻りもう一度ファイルの再生が始まります。 MP3ファイルの再生が終わると、loop文の先頭に戻りもう一度ファイルの再生が始まります。
      
 +<panel type="info" title="まつはちさんからのアドバイス">ちなみにdelayには限界があって、32767msが最大値です</panel>
      
 ===== 6-2-2_DFPlayer_UART_SoftwareSerial ===== ===== 6-2-2_DFPlayer_UART_SoftwareSerial =====
 なぜ6-2-1のコードは、R3系などのArduinoでは使えないのでしょうか。 なぜ6-2-1のコードは、R3系などのArduinoでは使えないのでしょうか。
 R3系等のArduinoで同じ処理をするにあたっては、Arduinoが持っているシリアル通信の"種類"の違いについて知る必要があります。 R3系等のArduinoで同じ処理をするにあたっては、Arduinoが持っているシリアル通信の"種類"の違いについて知る必要があります。
 +  
 ==== 「ハードウェアシリアル」と「ソフトウェアシリアル」について ==== ==== 「ハードウェアシリアル」と「ソフトウェアシリアル」について ====
 ArduinoのRX・TX、それからUSBは、Arduinoの脳みそともいえるマイコンチップに繋がっており、チップに内蔵されたUARTの機能を使って通信を行っています。 ArduinoのRX・TX、それからUSBは、Arduinoの脳みそともいえるマイコンチップに繋がっており、チップに内蔵されたUARTの機能を使って通信を行っています。
行 390: 行 405:
 サンプルコード6-2-1をR3等のArduinoで使えないのは、ずばりこれが原因です。 サンプルコード6-2-1をR3等のArduinoで使えないのは、ずばりこれが原因です。
 (逆にハードウェアシリアルを4つ搭載したArduino Mega 2560なんてのもあります) (逆にハードウェアシリアルを4つ搭載したArduino Mega 2560なんてのもあります)
 +  
 +こちらのページも参考に!:[[gimmickkouza:electronic_basic:7:3-r3-r4|]]
      
 で、このようなハードウェアシリアルの数以上にUARTを繋ぎたいシーンで役に立つのが「ソフトウェアシリアル(Software Serial)」です。 で、このようなハードウェアシリアルの数以上にUARTを繋ぎたいシーンで役に立つのが「ソフトウェアシリアル(Software Serial)」です。
 **「ソフトウェアシリアル」は、ハードウェアシリアルの機能をプログラムで"模倣"することで、機能的には同じように使えるようにしたもの**です。 **「ソフトウェアシリアル」は、ハードウェアシリアルの機能をプログラムで"模倣"することで、機能的には同じように使えるようにしたもの**です。
 +  
 +<panel type="info" title="まつはちさんからのアドバイス">ソフトウェアシリアル、複数使えるしピンの制限もないしめっちゃ便利じゃん!と思いそうですが、なんとハードウェアシリアルよりも通信速度が遅いのです。
 +最大115200 bps。ソフトウェア内での処理が重いと9600でもキツい…。</panel>
 +/*<alert type="danger">ソフトウェアシリアル、複数使えるしピンの制限もないしめっちゃ便利じゃん!と思いそうですが、なんとハードウェアシリアルよりも通信速度が遅いのです。最大115200 bps。ソフトウェア内での処理が重いと9600でもキツい…。</alert>*/
      
 ==== 配線図 ==== ==== 配線図 ====
行 401: 行 422:
 Uno R4では、TXはほとんどのソケットが指定できます(とはいえ、DかAのどれかにするのが無難です)が、RXはD0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5のどれかにする必要があります。 Uno R4では、TXはほとんどのソケットが指定できます(とはいえ、DかAのどれかにするのが無難です)が、RXはD0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5のどれかにする必要があります。
 なので今回はD3をRX、D4をTXとして使用することにします。 なので今回はD3をRX、D4をTXとして使用することにします。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| DFPlayer | 1個   |
 +| 抵抗器(1kΩ) | 1個   |
 +| ブレッドボード用スピーカー | 1個   |
 +/*<alert type="danger">使う部品の表が欲しい</alert>*/
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
行 470: 行 498:
          
 ===== 6-2-3_DFPlayer_SoundPlayer_for_fursuit ===== ===== 6-2-3_DFPlayer_SoundPlayer_for_fursuit =====
 +{{youtube>XUJsuB6To_c?large}}
 +  
 仮にも"きぐるみギミック"制作講座を標榜しているので、きぐるみのギミックとして実際に役立ちそうな、或いはそのヒントになりそうな作例もお届けしていこうかなと思います。 仮にも"きぐるみギミック"制作講座を標榜しているので、きぐるみのギミックとして実際に役立ちそうな、或いはそのヒントになりそうな作例もお届けしていこうかなと思います。
  
 とりあえず、DFPlayerで音を鳴らせるようになったので、タクトスイッチと組み合わせて好きなタイミングで任意のサウンドを鳴らせる、簡易サウンドプレイヤーを作ってみました。 とりあえず、DFPlayerで音を鳴らせるようになったので、タクトスイッチと組み合わせて好きなタイミングで任意のサウンドを鳴らせる、簡易サウンドプレイヤーを作ってみました。
 <text background="success"> なおこのコーナーはオマケ的な存在ですので飛ばしてもらってもOKです**(でもたのしいよ…)** </text> <text background="success"> なおこのコーナーはオマケ的な存在ですので飛ばしてもらってもOKです**(でもたのしいよ…)** </text>
 +  
  
  
行 507: 行 538:
      
 何のひねりもない配線図です。 何のひねりもない配線図です。
-  + 
 +===使う部品リスト=== 
 +^ 部品                                                                  ^ 個数 
 +| DFPlayer | 1個   | 
 +| 抵抗器(1kΩ) | 1個   | 
 +| ブレッドボード用スピーカー | 1個   | 
 +| タクトスイッチ | 2個   | 
 +    
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード6-2-3_DFPlayer_SoundPlayer_for_fursuitを開いてください。 サンプルコード6-2-3_DFPlayer_SoundPlayer_for_fursuitを開いてください。
 +/*<alert type="danger">使う部品の表が欲しい
 +
 +コピーしてみたら全角スペースいたので貼り変えてもいいかも
 +{{:gimmickkouza:electronic_basic:6:pasted:20240616-193823.png}}
 +
 +</alert>*/
 +
 <code> <code>
 #include "Arduino.h"//ライブラリをインクルードします #include "Arduino.h"//ライブラリをインクルードします
行 552: 行 597:
     CURRENT_FILE = 1;//トリガーが押されたので曲選択は初期値に戻す     CURRENT_FILE = 1;//トリガーが押されたので曲選択は初期値に戻す
     while(digitalRead(busy_PIN) == LOW){     while(digitalRead(busy_PIN) == LOW){
-      //BusyピンがLOW(ファイル再生中)ならdelayを無限ループして再生を続ける +    //BusyピンがLOW(ファイル再生中)ならdelayを無限ループして再生を続ける 
-      delay(100); +      delay(100); 
-      if(digitalRead(TRIGGER_PIN) == LOW){ +      if(digitalRead(TRIGGER_PIN) == LOW){ 
-        break; +       break; 
-      }+      }
     }     }
     while (digitalRead(TRIGGER_PIN) == LOW) {     while (digitalRead(TRIGGER_PIN) == LOW) {