LoginSignup
0
0

More than 3 years have passed since last update.

距離センサとDFPlayerMiniを組み合わせて、センサにモノを近づけた時にカウントしつつ音を鳴らす装置を作成する

Last updated at Posted at 2020-01-05

目的

距離センサとDFPlayerMiniを組み合わせて、センサにモノを近づけた時にカウントしつつ音を鳴らす装置を作成した際の備忘録です。

準備

Arduino Uno
DFPlayerMini
VL53L0X Time-of-Flight 距離センサモジュール
MAX7219 8×8ドットマトリックスモジュール

マイクロSDカードへ音楽ファイルを保存します。(ArduinoにDFPlayerMiniを繋いでmp3音楽再生をするの通り準備します)

回路図

以下をジャンパーピンで接続すれば良い。

Arduino側 - 距離センサ側
SCL - SCL
SDA - SDA
VCC - VCC
GND - GND

DFPlayerMiniの接続は、ArduinoにDFPlayerMiniを繋いでmp3音楽再生をするを参照します。

Arduino - Max7219
PIN10 - CLK
PIN9 - CS
PIN8 - DIN
GND - GND
5V - VCC

コード

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define BUSY_PINNO 7

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

SoftwareSerial mySoftwareSerial(10, 11); // (TX, RX)
//SoftwareSerial mySoftwareSerial(3, 2); // (TX, RX)
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

 unsigned char i;
 unsigned char j; 
 int g_cnt = 0;
/*port definition*/
int Max7219_pinCLK = 6;
int Max7219_pinCS = 5;
int Max7219_pinDIN = 4;

unsigned char disp1[38][8]={
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0
{0x10,0x18,0x14,0x10,0x10,0x10,0x10,0x10},//1
{0x7E,0x2,0x2,0x7E,0x40,0x40,0x40,0x7E},//2
{0x3E,0x2,0x2,0x3E,0x2,0x2,0x3E,0x0},//3
{0x8,0x18,0x28,0x48,0xFE,0x8,0x8,0x8},//4
{0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C,0x0},//5
{0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C,0x0},//6
{0x3E,0x22,0x4,0x8,0x8,0x8,0x8,0x8},//7
{0x0,0x3E,0x22,0x22,0x3E,0x22,0x22,0x3E},//8
{0x3E,0x22,0x22,0x3E,0x2,0x2,0x2,0x3E},//9
{0x8,0x14,0x22,0x3E,0x22,0x22,0x22,0x22},//A
{0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B
{0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0},//C
{0x7C,0x42,0x42,0x42,0x42,0x42,0x7C,0x0},//D
{0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C},//E
{0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x40},//F
{0x3C,0x40,0x40,0x40,0x40,0x44,0x44,0x3C},//G
{0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44},//H
{0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x7C},//I
{0x3C,0x8,0x8,0x8,0x8,0x8,0x48,0x30},//J
{0x0,0x24,0x28,0x30,0x20,0x30,0x28,0x24},//K
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C},//L
{0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81},//M
{0x0,0x42,0x62,0x52,0x4A,0x46,0x42,0x0},//N
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//O
{0x3C,0x22,0x22,0x22,0x3C,0x20,0x20,0x20},//P
{0x1C,0x22,0x22,0x22,0x22,0x26,0x22,0x1D},//Q
{0x3C,0x22,0x22,0x22,0x3C,0x24,0x22,0x21},//R
{0x0,0x1E,0x20,0x20,0x3E,0x2,0x2,0x3C},//S
{0x0,0x3E,0x8,0x8,0x8,0x8,0x8,0x8},//T
{0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1C},//U
{0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18},//V
{0x0,0x49,0x49,0x49,0x49,0x2A,0x1C,0x0},//W
{0x0,0x41,0x22,0x14,0x8,0x14,0x22,0x41},//X
{0x41,0x22,0x14,0x8,0x8,0x8,0x8,0x8},//Y
{0x0,0x7F,0x2,0x4,0x8,0x10,0x20,0x7F},//Z
{0x8,0x7F,0x49,0x49,0x7F,0x8,0x8,0x8},//Chinese character
{0xFE,0xBA,0x92,0xBA,0x92,0x9A,0xBA,0xFE},//Chinese character
};


void Write_Max7219_byte(unsigned char DATA) 
{   
            unsigned char i;
      digitalWrite(Max7219_pinCS,LOW);    
      for(i=8;i>=1;i--)
          {     
             digitalWrite(Max7219_pinCLK,LOW);
             digitalWrite(Max7219_pinDIN,DATA&0x80);//Obtain the MSB of the data
             DATA = DATA<<1;
             digitalWrite(Max7219_pinCLK,HIGH);
           }                                 
}


void Write_Max7219(unsigned char address,unsigned char dat)
{
        digitalWrite(Max7219_pinCS,LOW);
        Write_Max7219_byte(address);           //
        Write_Max7219_byte(dat);               //
        digitalWrite(Max7219_pinCS,HIGH);
}

void Init_MAX7219(void)
{
 Write_Max7219(0x09, 0x00);       //decode: BCD
 Write_Max7219(0x0a, 0x03);       //Brightness
 Write_Max7219(0x0b, 0x07);       //
 Write_Max7219(0x0c, 0x01);       //
 Write_Max7219(0x0f, 0x00);       //
}

void setup()
{
  Serial.begin(9600);  

  // software serial init
  mySoftwareSerial.begin(9600);
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }

  // init DFMiniPlayer
  // BUSY_PINNO init
  pinMode(BUSY_PINNO, INPUT);

  // DFPlayer Init
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms  
  myDFPlayer.volume(25);  //Set volume value (0~30).
  // myDFPlayer.volumeUp(); //Volume Up
  // myDFPlayer.volumeDown(); //Volume Down  
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);    
  //myDFPlayer.play(1);  //Play the first mp3

  // init distance sensor
  Wire.begin();

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

  // Start continuous back-to-back mode (take readings as
  // fast as possible).  To use continuous timed mode
  // instead, provide a desired inter-measurement period in
  // ms (e.g. sensor.startContinuous(100)).
  sensor.startContinuous();

  // init DotMatrix Module
  pinMode(Max7219_pinCLK,OUTPUT);
  pinMode(Max7219_pinCS,OUTPUT);
  pinMode(Max7219_pinDIN,OUTPUT);
  delay(50);
  Init_MAX7219();

  for(i=1;i<9;i++) {
    Write_Max7219(i,disp1[g_cnt][i-1]);
  }
}

void PLAYBACK_MP3_MUSIC(void) {
  int isBusy = digitalRead(BUSY_PINNO); // 0:playing, 1:not playing (refer website)
  Serial.println(isBusy);
  //if (isBusy == 1) {
    myDFPlayer.next();  //Play next mp3 every 3 second.
  //}
}

void loop()
{
  int val;
  val = sensor.readRangeContinuousMillimeters();
  Serial.print(val);
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();

  if( val < 180 ) {
    PLAYBACK_MP3_MUSIC();
    g_cnt++;
    for(i=1;i<9;i++) {
      Write_Max7219(i,disp1[g_cnt][i-1]);
    }
    delay(2000);
  }
}

テスト

モノを近づけた時にカウントしつつ音が再生されればOKです

飛んできたピンポン玉を距離センサで検知して、ドラクエのレベルが上がった音を再生することも可能。
距離センサのしきい値(=val)を最適な値に調整すると良いです。

CodingError対策

DFPlayer Miniの電源(5V)は、電源から直接供給したほうがよさそうです
(arduinoからでは電流がたりない?)

  • Note: You have to separate DFPlayer Mini Module power from Arduino power or you will hear very loud noises (It took me two days to figure out this!)

参考

DFPlayerMini
VL53L0X Time-of-Flight 距離センサモジュール
ArduinoにDFPlayerMiniを繋いでmp3音楽再生をする
距離センサモジュールVL53L0Xをarduinoを使って距離を測る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0