这个作品应该属于互动媒体范畴。我们这一代人为了符合高考的要求,青少年时就很少接触乐理知识和美术实践,这为电子与艺术的结合带来了不少难以逾越的障碍,但是不管谁,总是能从自身角度出发去欣赏艺术和体验艺术,而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模拟动画视频: