9683浏览
查看: 9683|回复: 2

[项目] 与会唱歌的Arduino机器猫互动

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

与会唱歌的Arduino机器猫互动图1

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

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

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

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

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

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

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

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

与会唱歌的Arduino机器猫互动图7
上图中,模块的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位置,如图:

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

与会唱歌的Arduino机器猫互动图9

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”)

与会唱歌的Arduino机器猫互动图10
根据以上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汽车,有已经在火星工作了八年多的“机遇”号的五倍大。它搭载了包括相机、样本分析仪、探测器在内的一系列尖端仪器,将尽一切努力考察火星有没有水和有机分子存在的可能性,以及火星的环境是否适宜人类前往。

与会唱歌的Arduino机器猫互动图11
“好奇号”火星探测器 发射、着陆、探测过程3D模拟动画视频:


mickey  NPC

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

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

使用道具 举报

糖醋花生  高级技师

发表于 2022-6-13 13:50:15

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

NPC有什么权限的么,隐身怎么玩,,怎么获得NPC
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail