|
照片是凝固的时间,每一张照片背后都有独特的故事。这里我们制作一个能够讲述照片的相框,可以将影像和回忆一同存储在照片上。
基本原理是:在每一张照片下面有孔,通过判断是否有空来判断当前插入的照片是哪一张。我们使用 LED 来发光,特别注意,LED 需要串联电阻(理论上一些LED不需要,但是这次偏偏我遇到了,烧了2个LED后面还是乖乖串联限制电流吧)
穿好之后就插入事先准备好的,打着孔的板子上,背面如下
正面看起来就是这样
同样的,我们再做接收端,我们使用电阻来完成这个工作。当有光的时候,电阻会小,反之电阻会大。配合引脚设置为 PULL_UP ,内部有20K 的上拉。这样,无遮挡的时候,模拟口读取到的就是 130左右,遮挡之后读取的就是900。足够进行判定区分。
从上面也可以看到,我们有4个洞,这样理论上可以给 2^4-1 张照片进行编码,插入不同照片就可以播放不同的音频内容了。
接好之后效果如下,看起来好像八爪鱼。
组装起来,上面是发射,下面是接收,中间是插入照片的位置
找了一个纸盒 当作底座
贴上纸美化一下
负责播放音频的是一个 MP3 模块【参考1】,我们将实现录制好的音频存在SD 卡上即可。
Arduino代码如下,特别需要注意的有如下几点:
1. LED 不是同时亮,而是逐个亮,这样可以省电;
2. 模拟口取值之后就可以进行判断;
3. 按照时间,每隔一段会发送一下当前的状态,这是为了保证一定能够正常播放。比如:这一次的串口传输丢失了,那么过几秒还有一次,这样会让装置看起来稳定很多;
4. MP3 接口是串口,我们在代码中使用软串口即可完成控制播放;
5. MP3 播放使用的是序号,从0001 开始,特别注意这个序号是拷贝到SD卡中的文件顺序而不是文件名称(原理上说,拷贝一个文件的时候,会在FAT中创建一个文件入口,然后序号即是这个入口的编号)
完整的代码:
[kenrobot_code]#include <SoftwareSerial.h>
SoftwareSerial Mp3Serial(10, 8); // RX, TX
#define LEDTH 400
#define LEDNUM 4
byte led[LEDNUM]={12,11,7,4};
byte hole[LEDNUM]={A3,A2,A1,A0};
byte position[LEDNUM]={1,2,4,8};
int playing=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Mp3Serial.begin(9600);
for (int i=0;i<LEDNUM;i++) {
pinMode(hole,INPUT_PULLUP);
pinMode(led,OUTPUT);
digitalWrite(led,HIGH);
}
}
void loop() {
int signal=0;
byte LED=0;
for (int i=0;i<LEDNUM;i++)
{
digitalWrite(led,LOW);
delay(30);
signal=analogRead(hole);
if (signal<LEDTH) {
LED=LED|position;
}
digitalWrite(led,HIGH);
Serial.print(signal);
Serial.print(" ");
}
Serial.println(" ");
Serial.print("MU=");
Serial.println(LED);
if (LED!=playing) {
switch (LED)
{
case 1: Mp3Serial.println("play,0001,$"); break;
case 2: Mp3Serial.print("play,0002,$"); break;
case 3: Mp3Serial.print("play,0003,$"); break;
case 4: Mp3Serial.print("play,0004,$"); break;
case 5: Mp3Serial.print("play,0005,$"); break;
default: Serial.println("Menu item does not exist.");
}
playing=LED;
}
delay(3000);
}[/kenrobot_code]
本来这个作品打算用 KittenBot 提供的模块式编程来完成,但是在使用中发现不支持逻辑运算等等,最终值得放弃,不得不说是一个遗憾。
感谢成员小树林的大力支持
参考:
1. http://www.lab-z.com/mp3mod/
|
|