Arduino与Processing交互-旋转编码器控制播放音乐

Posted 村头陈师傅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino与Processing交互-旋转编码器控制播放音乐相关的知识,希望对你有一定的参考价值。

旋转编码器控制播放音乐

公众号:STCode

1-旋转编码器


1)旋转编码器是一种把角位移量转化为电信号的精密设备。如下图所示是我们所使用的旋转型编码器,它可以正反向无限旋转,将用户旋转角位移信息通过电信号传递给单片机处理。

image.png


2)旋转编码器跟旋转电位器之间的区别

旋转角度的大小不同

电位器:通过旋转改变阻值的输出

编码器:通过旋转改变脉冲输出


3)旋转编码器的应用

在生活中,能看到一些音响的调节音量旋钮怎么旋转都转不到头,用的就是这种旋转编码器,与电位器功能相似,但是精度比电位器要高。


4)模块介绍

模块的引脚从上到下依次是:

CLK:Clock(时钟)

DT:Date(数据)

SW:Switch(开关)

+:工作电压3.3V~5V电源正极

GND:接地

image.png

5)模块原理

如图为旋转编码器内部结构等效图,A(CLK)、B(DT)两个独立的输出实际上是两个触点,在转盘旋转的过程中,和公共端C接触时输出低电平,一旦脱离公共端,那么输出为高电平。

image.png

当旋转转盘时,A、B触点就会先后输出不同电平,以下是顺时针旋转编码器工作原理

image.png image.png image.png image.png image.png

旋转编码器的位置可以通过脉冲数来确定,旋转方向需要通过端口A和端口B的高低电平变化来进行判断,当顺时针旋转时,每次电平产生变化的时候,A端跟B端的电平是不相同的;当逆时针旋转时,当发生电平变化时,A端跟B端电平是相同的。

image.png image.png

由此我们便可以知道编码器旋转的位置和得出是顺时针旋转还是逆时针旋转。


6)电路连接

image.png

7)旋转编码器Arduino代码

以下代码将外部中断0连接在CLK上,通外部过中断来计数;DT引脚用于判断正反转;按压SW进行计数清零;旋转得到的数值通过串口输出。

const int interruptA =0;                   //中断InterruptA在0引脚上
int CLK =2;                                //连接D2的脉冲信号
int DT=3;                                  //连接D3的脉冲信号,用于判断
int SW =4;                                 //正转(前进)或者反转(后退)
int COUNT =0;                              //连接D4的开关信号

void setup()
{
  attachInterrupt(interruptA,RoteStateChanged,FALLING);//外部中断,高电平变为低电平触发,调用中断处理字函数RotestateChanged()
  pinMode(CLK,INPUT);
  digitalWrite(2,HIGH);
  pinMode(DT,INPUT);
  digitalWrite(3,HIGH);
  pinMode(SW,INPUT);
  digitalWrite(4,HIGH);
  Serial.begin(9600);
}
void loop()
{
  if(!(digitalRead(SW)))   //按下按钮
  {
    COUNT =0;              //计数清零
    Serial.println("STOP COUNT =0");//串口输出清零
    delay(2000);           //延迟2秒
  }
  Serial.println(COUNT);   //如果没有按钮,输出计数值
}
void RoteStateChanged()    //当CLK下降沿触发的时候,进入中断
{
  if(digitalRead(DT))      //当DT为高电平时,前进方向
  {
    COUNT++;               //计数器累加
    delay(20);
  }
  else
  {
    COUNT--;
    delay(20);
  }
}

2-Processing读取音乐文件

Processing中读取音乐等音频文件需要用到minim音频库。minim是一个在Processing开发工作下简单易用的音频库,它基于Tritonus、JavaSoundAPI和Javazoom的MP3SPI开发。它已经内置在Processing中。在使用minim音频的时候,要先把它导入程序中。

import ddf.minim.*;

要播放音频,首先要实例化一个Minim对象和音频播放器对象AudioPlayer。


 Minim minim; 
AudioPlayer player;

AudioPlayer类中有多种方法来控制音乐。

player():播放音乐

loop():循环播放音乐

pause():暂停播放音乐

setGain(floatvalue):设置增益效果,等同于设置音量

setBalance(floatvalue):设置平衡

将要播放的音频文件放入程序文件夹根目录的data文件夹中,如果没有data文件夹,则需要自己手动创建data文件夹。之后用minim类中的loadFile成员函数来为player读取音频文件。

minim=new Minim(this); //初始化minim

player =minim.loadFile("test.mp3"); //初始化player对象,读取音乐文件

读取完音乐文件之后就可以播放音乐,这里用play()来播放音乐。

player.play(); //播放音乐

当需要暂停的时候就需要用到pause()。

player.pause();

设置音量用setGain(float value).

player.setGain(volume)

当不再需要播放音乐时,需要用到close()函数。

void stop()//停止播放音乐 
{
    player.close();//关闭音乐
    minim.stop();//关闭minim
    super.stop();
}

3-Arduino与Processing联合互动

将旋转编码器和Arduino连接,将数据通过串口发送到Processing进行处理,就能让旋转编码器来控制音乐的播放或调节音量的大小。

Processing端

import processing.serial.*;                         //导入Serial和minim函数库
import ddf.minim.*;
Minim minim;                                        //实例化一个Minim对象
AudioPlayer song;                                   //实例化一个音乐播放器对象
Serial port =new Serial(this,"COM3",9600);
float volume =-40;                                  //初始音量大小

void setup()
{
  size(300,300);
  minim =new Minim(this);                           //初始化minim
  song =minim.loadFile("Michal.mp3");               //初始化song对象,读取音乐文件
  song.play();                                       //播放音乐
  song.loop();                                       //循环播放
}

void draw()
{
   background(125); 
   if(port.read()=='a')                             //如果Processing从串口读到字符a,增大音量
   {
     volume++;
   }
   if(port.read()=='b')                              //如果Processing从串口读到字符b,减小音量
   {
     volume--;
   }
   song.setGain(volume);
}

void stop()                                          //停止播放音乐
{
  song.close();                                      //关闭音乐
  minim.stop();
  super.stop();
}

Arduino端

const int interruptA =0;                   //中断InterruptA在0引脚上
int CLK =2;                                //连接D2的脉冲信号
int DT=3;                                  //连接D3的脉冲信号,用于判断
int SW =4;                                 //正转(前进)或者反转(后退)
int COUNT =0;                              //连接D4的开关信号

void setup()
{
  attachInterrupt(interruptA,RoteStateChanged,FALLING);//外部中断,高电平变为低电平触发,调用中断处理字函数RotestateChanged()
  pinMode(CLK,INPUT);
  digitalWrite(2,HIGH);
  pinMode(DT,INPUT);
  digitalWrite(3,HIGH);
  pinMode(SW,INPUT);
  digitalWrite(4,HIGH);
  Serial.begin(9600);
}
void loop()
{
  if(!(digitalRead(SW)))   //按下按钮
  {
    COUNT =0;              //计数清零
  }
}
void RoteStateChanged()    //当CLK下降沿触发的时候,进入中断
{
  if(digitalRead(DT))      //当DT为高电平时,前进方向
  {
    COUNT++;               //计数器累加
    Serial.println('a');
    delay(50);
  }
  else
  {
    COUNT--;
    delay(50);
    Serial.println('b');
  }
}

效果

运行程序后 转传感器的旋钮改变音量大小。

以上是关于Arduino与Processing交互-旋转编码器控制播放音乐的主要内容,如果未能解决你的问题,请参考以下文章

Processing与Arduino交互-光敏传感器

Processing与Arduino交互-光敏传感器

Arduino与Processing交互-超声波测距传感器的读取与显示

Arduino与Processing交互-超声波测距传感器的读取与显示

processing与arduino互动编程

Arduino旋转编码器测试