yichangzhang 发表于 2012-8-9 18:05:32

与会唱歌的Arduino机器猫互动

机器猫傻傻的眼睛看着您,准备为您唱首歌,只不过这次的歌声不是从她的嘴巴里唱出的,而是从她肚子上的喇叭中传出的。那么我是如何与她互动,请她唱出我们爱听的儿歌。互动设备是她前面放着的PS2蓝牙遥控器,摇动PS2摇杆,向她点歌。



视频:https://v.youku.com/v_show/id_XNDM2NDU4MTEy.html

这个作品应该属于互动媒体范畴。我们这一代人为了符合高考的要求,青少年时就很少接触乐理知识和美术实践,这为电子与艺术的结合带来了不少难以逾越的障碍,但是不管谁,总是能从自身角度出发去欣赏艺术和体验艺术,而Arduino的两个主要应用就是机器人和互动媒体,于是也想做这方面的尝试。比如我的博客文章《 **Processing互动之光敏电阻与莫奈油画** 》就介绍了如何通过光敏电阻的反馈使PC机屏幕里的莫奈油画光影效果发生变化,文章网址: https://www.eefocus.com/zhang700309/blog/11-12/236514_6b541.html 。

国外创客爱好者制作了一个木琴,它使用Arduino Mega检测琴键下的压电元件敲击信号,并用蜂鸣器发出MIDI音乐。


我也做一个与音乐有关的作品,通过DFRobot公司出品的Arduino控制器、PS2游戏杆扩展板、蓝牙模块和**mp3模块**,来控制音乐,让机器猫为我们唱歌。**在游戏杆扩展板上,左右摇动PS2摇杆可以确定播放mp3播放顺序,按下红色按钮B暂停播放音乐,而按下蓝色按钮C又继续播放音乐,还有一个按钮,就在PS2摇杆上,直接点压PS2摇杆端部,PS2按钮就会按下,这个按钮A可以点播您指定文件名的mp3音频文件,看看上文我的视频里,mp3模块的SD卡里我存放了6首歌,这个按钮选取的歌是哪首,这首歌很不专业,但是我认为它最可能是机器猫唱出的歌。**


Arduino微控制器是一种简易计算机,可以轻松地完成各种稀奇古怪的事情,比如植物需要浇水时会发送微博,用激光做成的竖琴,画板电子闹钟,兼具酒精测试器功能的话筒,以及可以显示你骑车速度的背心等等。Arduino控制器已经在国外发达国家流行起来,2011年销售量达20万套,现在Arduino原厂出品UNO板子的价格已经降至了148元(人民币),中国代理商网址:www.dfrobot.com.cn。这样的品牌知名度和几乎与国内厂家价格靠近的价格,必然使Arduino原厂板子在2012年大卖。未来有一天会不会,人们像买iphone一样选购Arduino设备。下图是在**2012美国旧金山湾区Maker Faire展会**中Arduino公司的卖场照片。


Arduino为什么这么红,我认为它与iphone的特质是一样的,它到底满足了科技男内心怎样的需求,我想无非是三点:1、这个产品能不能让我们更懒;2、这个产品能不能让我们更爽;3、这个产品能不能让我们更“拽”,更强大。这三方面的需求Arduino都能满足我们,它的软件易学、硬件积木化,还有大量的网络共享资源,让我们能够轻松快速地创意自己的作品。其实我们是懒人,只不过利用Arduino软硬件资源放大了自己的能力,制作出的作品也相当炫目,让人感觉自己是科技宅男,很爽,很“拽”,而这一切过程,对于别人是一个“谜”。

会唱歌的机器猫作品用到的Arduino电控设备组成如下图:(双击图片,都可以放大观看!)


上图Arduino设备中,主角是DFRobot公司出品的mp3播放模块,这个模块设计初衷是为了让您的机器人会说话。如果机器人能与人进行简单交流的话,那么机器人就会显得更加智能,同时也增加了不少可玩性。模块具有立体声输出,可与有源音箱连接;2路功放输出,每路最大3W,可直接接喇叭;支持两种通讯模式,I2C模式和TTL串口模式,方便与各种Arduino、单片机以及电脑连接。这次mp3模块应用,我采用的是I2C模式。DFRduino mp3通过一个ATMEGA168芯片进行处理,尽量不占用Arduino或其他控制器上的资源,只需要将语音文件放置在SD卡中,Arduino或其他控制器通过通讯发送文件名信息即可播放相应的语音文件。

DFRduino mp3模块各端口分布与功能图:


上图中,模块的MODE跳针用于选择串口(UART)或者I2C模式(蓝色框标注),使用前请先设置模式。

模块的MONO跳针短路就切换为单声道(如果你只使用一个喇叭时,可以将两个声道音频用一个喇叭放音,短路该跳针即可作为单声道输出),当MONO跳针断开时,2根针分别可作为左右声道立体声输出,可直接接有源音箱。(绿色框标注)

在使用模块时,要保证电源电压为5V,电流最好大于1000毫安,如果电流不够需需要将音量调小或者使用单个喇叭播放。这次我用了一块“骐源”9V锂电池供电,在淘宝买的。

您将SD卡插到USB适配器里,再插到PC电脑的USB插槽里,格式化为FAT格式,然后新建一个sound文件夹,从酷狗音乐下载的音频文件放在sound文件夹内。然后,再把SD卡插到mp3模块电路板下方的Micro SD卡插槽里。注意:SD卡需要Micro SD卡,容量不能超过2G,我用的就是从电脑城买的2G容量SD卡。

如果您采用I2C主从机模式通信,先把语音播放器模块的MODE跳线帽插在I2C位置,如图:


再将mp3模块的数据线接到XBEE V5传感器扩展板的I2C插针上,模块的DI接扩展板SCL上,模块DO接扩展板SDA上,模块+5V接和扩展板的5V,模块GND接扩展板的GND。最后将喇叭接到mp3模块的功放输出端,如图:



Arduno硬件设备设置和联机完成后,剩下的事就是编写Arduino遥控器和接收器的程序了。

Arduino遥控器程序任务:采集遥控器的游戏杆扩展板上的PS摇杆和A、B、C按键信息,处理后,通过蓝牙串口,向Arduino接收器发送字符控制命令,这些命令分别控制mp3文件的播放顺序和暂停播放、继续播放以及指定文件名的mp3播放。

**Arduino遥控器程序:**

```
//向ps2摇杆X轴,左右摇动来确定播放mp3播放顺序
int JoyStick_X = 1; //游戏杆扩展板的PS摇杆X轴连在Arduino模拟端口1
//A按键控制播放文件名为star的mp3文件
//B按键控制播放下一个mp3文件
//C按键控制播放上一个mp3文件
int button_A = 5; //游戏杆扩展板的摇杆A按键连在Arduino数字端口5
int button_B =3;   //红色B按键连在数字端口3
int button_C =4;//蓝色C按键连在数字端口4
int A, B,C;//存储游戏杆扩展板的开关量按键的当前读取值
int x;//存储游戏杆扩展板的模拟量PS摇杆X轴的当前读取值
char flag;//存储Arduino遥控器向Arduino接收器发送的单“字符”命令
//初始化
void setup()
{
//把游戏杆扩展板上三个按键设置为开关量输入模式
pinMode(button_A, INPUT);
pinMode(button_B, INPUT);
pinMode(button_C, INPUT);
//启动串行通信
Serial.begin(115200);//设置串行通信的波特率为115200b/s
}
//主程序
void loop()
{
   x=analogRead(JoyStick_X);//读取PS摇杆X轴的模拟量信息
   //读取游戏杆扩展板上三个按键“是否按下”的状态
   B= digitalRead(button_B);
   C= digitalRead(button_C);
   A=digitalRead(button_A);      
   //如果B按键为按下状态,同时C按键为松开状态
    if((B ==LOW)&&(C==HIGH))
    {
      //向Arduino接收器发送“暂停播放”命令
      flag='p';
      Serial.print(flag);
    }
    //如果C按键为按下状态,同时B按键为松开状态
   else if((C==LOW)&&(B==HIGH))
    {
      //向Arduino接收器发送“继续播放”命令
      flag='s';
      Serial.print(flag);
    }
    //如果A按键为按下状态
    else if(A==LOW)
    {         
      //向Arduino接收器发送“播放指定文件名mp3文件”命令
      flag='m';
      Serial.print(flag);
    }
   //如果PS摇杆向X轴右方摇动
   else if(x<212)
    {
       //向Arduino接收器发送“播放下一个mp3文件”命令
       flag='n';
       Serial.print(flag);
    }
    //如果PS摇杆向X轴左向摇动
    else if(x>812)
    {
       //向Arduino接收器发送“播放上一个mp3文件”命令
       flag='u';
       Serial.print(flag);
    }
   //否则,不执行任何操作   
    else
    {flag='h';
       Serial.print(flag);
    }
    delay(200);//延时,等待数据发送成功      
}
```

Arduino遥控器与Arduino接收器通信方式是“平等”的RS232串行通信。而Arduino接收器与mp3模块通信方式是主从机模式的I2C通信。Arduino接收器是I2C总线中的主机,mp3模块是I2C总线中的从机,从机地址为0x35。I2C通讯指令使用字符串形式。

mp3模块操作指令列表:(例如暂停播放,指令字符串为**“\\:p\r\n”**)


根据以上mp3模块的I2C通信协议,编写I2C总线主机程序,即,Arduino接收器程序。

Arduino接收器程序任务:接受Arduino遥控器发来的字符命令,根据命令字符,执行各种mp3文件的操作,如:播放上一个mp3文件;播放下一件mp3文件;播放指定文件名的mp3;以及暂停播放、继续播放。

**Arduino接收器程序:**

```
//I2C接线方式所占用的Arduino UNO硬件资源
//Arduino    MP3
//模拟口4    DO
//模拟口5    DI
//5V         +5V
//GND      GND

#include "Wire.h" //申明I2C库文件
#include "stdlib.h"
#define ArduinoPlayer_address 0x35//定义mp3模块I2C从机地址
void TwiSend(const char*cmd)//定义“发送mp3操作命令”的函数
{   
char len = 0;   
len = strlen(cmd); //计算字符串长度   
//发送I2C数据到地址为0x35的mp3从机
   Wire.beginTransmission(ArduinoPlayer_address);   
   while(len--)
{   
   Wire.send(*(cmd++));//发送mp3操作字符串命令
}   
Wire.endTransmission();//停止I2C数据发送
}
//初始化
void setup()
{   
    Wire.begin(); // 把Arduino接受器作为主机,加入到I2C总线中   
    Serial.begin(115200); // 启动Arduino接受器的RS232串行通信
    delay(2000);//等待2秒钟播放器初始化完成   
    // 把mp3模块的音量设置最大,数字 0-255 数字越大音量越大
    TwiSend("\\:v 255\r\n");   
}
//主程序
void loop()
{   
    //接收Arduino遥控器的串口命令字符,执行相应mp3操作
    int val;   
    //如果Arduino接收器串口缓冲区接收到遥控器发来的数据
    if(Serial.available() > 0)
    {   
   val=Serial.read();//读取Arduino接收器串口缓冲区的字符
   switch(val)   
   {   
       case 'p':      // 暂停播放
      TwiSend("\\:p\r\n");      
       break;
       case 's':   // 继续播放
      TwiSend("\\:s\r\n");      
       break;
       case'n':
       TwiSend("\\:n\r\n");// 播放下一个mp3文件
       break;
       case 'u':
       TwiSend("\\:u\r\n"); // 播放上一个mp3文件      
       break;
       case'm':      //播放文件名为star的mp3文件   
       TwiSend("\\star\r\n");
       break;
       default:
       break;
      }
   }
}

```

美国宇航局耗资25亿美元打造的“好奇”号火星探测器2012年8月6日成功登陆火星(这篇机器猫的文章发表于8月9日)。它将展开为期两年的任务,“好奇”号火星车体积类似于一辆小型SUV汽车,有已经在火星工作了八年多的“机遇”号的五倍大。它搭载了包括相机、样本分析仪、探测器在内的一系列尖端仪器,将尽一切努力考察火星有没有水和有机分子存在的可能性,以及火星的环境是否适宜人类前往。


“好奇号”火星探测器 发射、着陆、探测过程3D模拟动画视频:

mickey 发表于 2012-8-9 18:34:12

哈哈,不错的蓝牙无线点歌机。

糖醋花生 发表于 2022-6-13 13:50:15

mickey 发表于 2012-8-9 18:34
哈哈,不错的蓝牙无线点歌机。

NPC有什么权限的么,隐身怎么玩,,怎么获得NPC
页: [1]
查看完整版本: 与会唱歌的Arduino机器猫互动