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

[电子电路] #DFRobot2018 特效电子琴 自制电子琴

[复制链接]
以按键电子琴为基础进行的作品设计,旋钮可以辅助控制节拍,根据音调与节拍的不同会有不同的灯光效果。
download.png
作品链接:https://www.tinkercad.com/things/2jJF7ReEkCg
作       者:@王界平 @跳跳熊

       在Tinkercad的Circuits板块中,我们可以在线进行简单的电子电路设计以及对应的程序验证,既可以用来尝试新想法新创意,也可以用来给已完成的作品制作示意图和展示图。平台中既有现在流行的Arduino系列单片机及常规的传感器和输出设备,也有更进一步的集成电路、逻辑电路,以及万用表、电源、函数生成器和示波器模块。编程可以通过模块也可以通过语言,适合各阶段用户根据自身进行选择。平台还很贴心的准备了大多数常用器件的范例电路和程序。
       我们通过七个按钮和蜂鸣器通过Arduino UNO实现电子琴的基础功能,既按下按钮蜂鸣器发出对应的音调。
       D7——NOTE_C5——523;D6——NOTE_D5——587;D5——NOTE_E5——659;D4——NOTE_F5——698;D3——NOTE_G5——784;D2——NOTE_A5——880;D1——NOTE_B5——988
       在此基础上加入旋钮接入A5,通过旋钮的当前挡位可以控制音调的持续时间,也就是控制节奏。程序中以旋钮中值512为界限分为4拍和8拍。
       通过Neo Pixel Ring 12实现灯光特效,4拍对应流水灯,8拍对应闪烁灯,灯光颜色与对应按钮导线颜色一致。若较长时间没有按键操作,会呈现彩虹灯作为待机模式,按下任意按钮进入工作状态。

  1. //4拍节奏对应灯效
  2. void colorWipe(uint32_t c, uint8_t wait) {
  3.   for(uint16_t i=0; i<strip.numPixels(); i++) {
  4.     strip.setPixelColor(i, c);
  5.     strip.show();
  6.     delay(wait);
  7.   }
  8. }
  9. //8拍节奏对应灯效
  10. void theaterChase(uint32_t c, uint8_t wait) {
  11.   for (int j=0; j<3; j++) {
  12.     for (int q=0; q < 3; q++) {
  13.       for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
  14.         strip.setPixelColor(i+q, c);
  15.       }
  16.       strip.show();
  17.       delay(wait);
  18.       for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
  19.         strip.setPixelColor(i+q, 0);
  20.       }
  21.     }
  22.   }
  23. }
  24. //待机灯效
  25. uint32_t Wheel(byte WheelPos) {
  26.   WheelPos = 255 - WheelPos;
  27.   if(WheelPos < 85) {
  28.     return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  29.   }
  30.   if(WheelPos < 170) {
  31.     WheelPos -= 85;
  32.     return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  33.   }
  34.   WheelPos -= 170;
  35.   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  36. }
  37. //清除灯效
  38. void close() {
  39.   for(uint16_t i=0; i<strip.numPixels(); i++) {
  40.     strip.setPixelColor(i, 0);
  41.   }
  42.   strip.show();
  43. }      
  44. //待机控制
  45. void rainbow(uint8_t wait) {
  46.   uint16_t i, j;
  47.   for(j=0; j<256; j++) {
  48.     for(i=0; i<strip.numPixels(); i++) {
  49.       strip.setPixelColor(i, Wheel((i+j) & 255));
  50.     }
  51.     strip.show();
  52.     delay(wait);
  53.     if(digitalRead(7)==LOW){
  54.       break;
  55.     }
  56.     if(digitalRead(6)==LOW){
  57.       break;
  58.     }
  59.     if(digitalRead(5)==LOW){
  60.       break;
  61.     }
  62.     if(digitalRead(4)==LOW){
  63.       break;
  64.     }
  65.     if(digitalRead(3)==LOW){
  66.       break;
  67.     }
  68.     if(digitalRead(2)==LOW){
  69.       break;
  70.     }
  71.     if(digitalRead(1)==LOW){
  72.       break;
  73.     }   
  74.   }
  75. }
  76. //核心功能
  77. void musicAndLed(int note, uint32_t c){
  78.   if(analogRead(A5)<512){
  79.     tone(11, note, 250);
  80.     colorWipe(c, 250*1.3/LED);
  81.     close(); // Close
  82.     noTone(11);
  83.   }
  84.   else{
  85.     tone(11, note, 125);
  86.     theaterChase(c, 125*1.3/9);
  87.     close(); // Close
  88.     noTone(11);   
  89.   }
  90.   noTone(11);
  91.   time=millis();
  92. }
  93. //逻辑主体
  94. Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED, PIN, NEO_GRB + NEO_KHZ800);
  95. int time;
  96. void setup() {
  97.   #if defined (__AVR_ATtiny85__)
  98.     if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  99.   #endif
  100.   strip.begin();
  101.   strip.show();
  102. }
  103. void loop() {
  104.   close(); // Close
  105.   noTone(11);
  106.   if(digitalRead(7)==LOW){
  107.     musicAndLed(NOTE_C5, strip.Color(255, 97, 0));
  108.     while(digitalRead(7)==LOW){ }
  109.   }
  110.   if(digitalRead(6)==LOW){
  111.     musicAndLed(NOTE_D5, strip.Color(255, 215, 0));
  112.     while(digitalRead(6)==LOW){ }
  113.   }
  114.   if(digitalRead(5)==LOW){
  115.     musicAndLed(NOTE_E5, strip.Color(34, 139, 34));
  116.     while(digitalRead(5)==LOW){ }
  117.   }
  118.   if(digitalRead(4)==LOW){
  119.     musicAndLed(NOTE_F5, strip.Color(64, 224, 208));
  120.     while(digitalRead(4)==LOW){ }
  121.   }
  122.   if(digitalRead(3)==LOW){
  123.     musicAndLed(NOTE_G5, strip.Color(0, 0, 255));
  124.     while(digitalRead(3)==LOW){ }
  125.   }
  126.   if(digitalRead(2)==LOW){
  127.     musicAndLed(NOTE_A5, strip.Color(153, 51, 250));
  128.     while(digitalRead(2)==LOW){ }
  129.   }
  130.   if(digitalRead(1)==LOW){
  131.     musicAndLed(NOTE_B5, strip.Color(115, 74, 18));
  132.     while(digitalRead(1)==LOW){ }
  133.   }
  134.   if(millis()-time>2000){
  135.     rainbow(20);
  136.   }
  137. }
复制代码







gray6666  初级技神

发表于 2019-1-17 07:37:21

好赞。。。。
回复

使用道具 举报

hnyzcj  版主

发表于 2019-1-12 10:20:22

这个有意思
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail