15509| 16
|
[项目] 【FireBeetle】MatrixEW-将电磁波可视化 |
本帖最后由 nicho 于 2017-6-22 10:00 编辑 MatrixEW是瞎起的名字,分别由Matrix+Electromagnetic+Wave,看起来酷一点 中心主题就是使用电子元件将现实中的各种电磁波捕捉,并通过FireBeetle的LEDMatrix将其可视化 视频~ [flash]static.hdslb.com/miniloader.swf?aid=11516619&page=1[/flash] 1.在视频中忘了解释了,中间的杂音就是电磁波的声音,(靠近不同的物体,声音会发生变化),使用的时候,将耳机插入装置的3.5mm的音频接口就可以听到了~ 2.LEDMatrix上的LED数量体现的是不同的电磁波的收集情况,每条光柱(竖直)代表一种电磁波 这个就是成品图啦~,用FireBeetle的原型板制作 材料清单: FireBeetle主控板 FireBeetle I/O拓展版 FireBeetle 原型拓展版1 FireBeetle 原型拓展版2 FireBeetle MatrixLED阵列板 电阻100k*2 电阻390k*1 电阻1k*1 瓷片电容2.2uf*2 电解电容100uf*2 直插电感4.7mH*1(大小不同效果不同,酌情而定) 音频运放NE5532 8PinIC座 3.5mm音频插座 9V电池(withDC05插头) 排针排母若干 ----------------------------------------------------------------------- 按照电路图焊接好电路,然后就可以插上耳机测试啦~ 确认可以听到电磁波之后,就可以进行下一步了(靠近不同的电子设备声音会变化) 和FireBeetle主控板连接 如图所示叠起来(注意方向) 使用完整图示 1.使用USB给FireBeetle主控板供电 2.使用9V电池给运放供电 3.插上耳机,就可以听到电磁波的声音啦 ------------------------------------------------ 来分析一下为什么会有这种现象吧~ 关键的是电路中的电感 将导线绕成螺旋状的线圈便可形成一个电感: 当电流流经线圈时,会在线圈内形成磁场。 若是电流随着时间发生改变,则线圈内的磁场也会因而发生变化。 当线圈内的磁通量 将 发生变化前,便会在线圈上形成感应电动势(未卜先知?) (感应电动势 = 沿着线圈感应电场与路径向量内积 的总和)。 感应电动势的产生,是由于自然界(空间)的另外一种『惯性』:不希望 磁通量 发生变化的特性。 因此当 磁通量将会有较最大的变化量时,也会产生较大的 感应电动势,想要抵销磁通量的变化。 简单的说 感应电动势 正比于 磁通量的变化量。 电感 等于 单位时间内 想有单位电流的变化时,所产生的感应电动势。 好厉害!当线圈的电流将要发生改变前,电感便会形成感应电动势来减缓电流的变化。 可不是电流已经发生改变了以后,才形成感应电动势来减缓其变化。 因此 我们说 电感两端电压的变化 超前电流的变化。 对于 交流正弦的磁通量变化,所产生的 感应电动势 也会是 正弦函数,不过相差了 90度 相角(馀弦)。 至于感应电动势(电场) 的方向如何决定呢?它的存在是为了想要阻止电感上的电流发生变化,因此必然与电感上原来的电动势方向相反。 如此与原有外加的电动势相加,才能造成抵销的效果。 电磁波通过电感之后,已经变成了电流信号(并且是反向的) 下一步就是通过运算放大器,这里我们使用了NE5532,是一款应用十分广泛的音频运放IC,我们使用电阻电容等元件做出反向差分放大电路 电流信号经过这里再次被反向,并且被放大,放大倍数取决于RI和Rf 经过运放后的信号已经足够推动耳机,所以插上耳机,接入到GND和运放的Vo即可~ ------------------------------------------------- 运放的输出Vo和GND之间接入一个3v的稳压管,控制电压,避免烧坏MCU 维基百科关于齐纳二极管(稳压管) ------------------------------------------------- 整体图 运放输出Vo连接到FireBeetle的A0,GND(运放的正向输入端)接到GND,然后就开始码代码吧~ [mw_shl_code=c,true]#include "DFRobot_HT1632C.h" #if defined( ESP_PLATFORM ) || defined( Arduino_ARCH_FIREBEETLE8266 ) //FireBeetle-ESP32 FireBeetle-ESP8266 #define DATA D6 #define CS D2 #define WR D7 //#define RD D8 #else #define DATA 6 #define CS 2 #define WR 7 //#define RD 8 #endif DFRobot_HT1632C ht1632c = DFRobot_HT1632C(DATA, WR, CS); int analogVal = 0; int level1 = 0; int level2 = 0; int level3 = 0; int level4 = 0; int level5 = 0; int level6 = 0; int level7 = 0; int change = 0; int threshold1 = 1; int threshold2 = 100; int threshold3 = 200; int threshold4 = 300; int threshold5 = 400; int threshold6 = 500; int threshold7 = 600; int threshold8 = 700; uint8_t l1, l2, l3, l4, l5, l6, l7; void setup() { ht1632c.begin(); ht1632c.isLedOn(true); ht1632c.clearScreen(); pinMode(A0, INPUT); Serial.begin(115200); pinMode(LED_BUILTIN,OUTPUT); digitalWrite(LED_BUILTIN,HIGH); delay(500); } void loop() { delay(2); analogVal = analogRead(A0); delay(5); if (analogVal >= threshold1 && analogVal < threshold2) { level1++; change = 1; } else if (analogVal >= threshold2 && analogVal < threshold3) { level2++; change = 1; } else if (analogVal >= threshold3 && analogVal < threshold4) { level3++; change = 1; } else if (analogVal >= threshold4 && analogVal < threshold5) { level4++; change = 1; } else if (analogVal >= threshold5 && analogVal < threshold6) { level5++; change = 1; } else if (analogVal >= threshold6 && analogVal < threshold7) { level6++; change = 1; } else if (analogVal >= threshold7 && analogVal < threshold8) { level7++; change = 1; } else { //Serial.println(analogVal); } if (change == 1) { change = 0; updateMatrix(); // Serial.println(analogVal); // Serial.print(level1); // Serial.print(","); // Serial.print(level2); // Serial.print(","); // Serial.print(level3); // Serial.print(","); // Serial.print(level4); // Serial.print(","); // Serial.print(level5); // Serial.print(","); // Serial.print(level6); // Serial.print(","); // Serial.print(level7); // Serial.println(","); } } int updateMatrix() { l1 = map(level1, 0, 9999, 0, 24); l2 = map(level2, 0, 100, 0, 24); l3 = map(level3, 0, 100, 0, 24); l4 = map(level4, 0, 100, 0, 24); l5 = map(level5, 0, 100, 0, 24); l6 = map(level6, 0, 100, 0, 24); l7 = map(level7, 0, 100, 0, 24); // Serial.print(l1); // Serial.print(","); // Serial.println(level1); if (l1 >= 24) l1 = 23; if (l2 >= 24) l2 = 23; if (l3 >= 24) l3 = 23; if (l4 >= 24) l4 = 23; if (l5 >= 24) l5 = 23; if (l6 >= 24) l6 = 23; if (l7 >= 24) l7 = 23; ht1632c.setPixel(l1 - 1, 0); ht1632c.writeScreen(); ht1632c.setPixel(l2 - 1, 1); ht1632c.writeScreen(); ht1632c.setPixel(l3 - 1, 2); ht1632c.writeScreen(); ht1632c.setPixel(l4 - 1, 3); ht1632c.writeScreen(); ht1632c.setPixel(l5 - 1, 4); ht1632c.writeScreen(); ht1632c.setPixel(l6 - 1, 5); ht1632c.writeScreen(); ht1632c.setPixel(l7 - 1, 6); ht1632c.writeScreen(); //test(); delay(3); } [/mw_shl_code] 注意:程序中的level可能会因为电感,电容,电阻的选值,甚至是耳机的阻抗(耳机相当于电感)有关,并且也和外部环境,供电环境有关,适当调整即可~ 最后再来一张~ 一些文件: MatrixEW(Multisim13仿真文件).zip MatrixEW物料表(excel表格).zip |
Nana 发表于 2017-6-23 17:23 电感是一个线圈,会阻止电流的变化,因此电流滞后电压,又叫电压超前电流。 http://www.phy.ntnu.edu.tw/demolab/phpBB/viewtopic.php?topic=8511 上面这个的讨论很有意思~~ |
Nana 发表于 2017-6-23 17:23 电感是一个线圈,会阻止电流的变化,因此电流滞后电压,又叫电压超前电流。 http://www.phy.ntnu.edu.tw/demolab/phpBB/viewtopic.php?topic=8511 上面这个的讨论很有意思~~ |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed