这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版 | |||
learing:examples:pitch_follower [2017/10/05 03:29] – 弘毅 | learing:examples:pitch_follower [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== Pitch follower using the tone() function (使用tone功能随输入量改变音高)====== | ||
+ | |||
+ | <WRAP left round info 65%> | ||
+ | 此例程演示了使用tone功能来产生一个随输入值变化的音高。 | ||
+ | </ | ||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== ALPHA MEGA328-U核心 ===== | ||
+ | ==== 硬件 ==== | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[[ocrobot: | ||
+ | ==== 搭建电路 ==== | ||
+ | |||
+ | - ALPHA MEGA328-U模块插入并行扩展板1号槽位。 | ||
+ | - ALPHA 蜂鸣器模块插入并行扩展版1号槽位堆叠于MEGA328-U上。 | ||
+ | - ALPHA 电位器模块插入并行扩展版2号槽位。 | ||
+ | - USB线连接计算机与ALPHA MEGA328-U。 | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | |||
+ | <code cpp>/* | ||
+ | Pitch follower | ||
+ | | ||
+ | */ | ||
+ | void setup() { | ||
+ | // 初始化通信速率(调试用): | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // 读取传感器值: | ||
+ | int sensorReading = analogRead(A0); | ||
+ | // 显示到串口 | ||
+ | Serial.println(sensorReading); | ||
+ | // 模拟输入变化范围 (这里, | ||
+ | // 输出范围(120 - 1500Hz) | ||
+ | // 基于传感器值变化范围改变输入最大最小输入值 | ||
+ | int thisPitch = map(sensorReading, | ||
+ | |||
+ | // 播放音符: | ||
+ | tone(9, thisPitch, 10); | ||
+ | delay(1); | ||
+ | }</ | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== ALPHA 8F328D-U核心 ===== | ||
+ | ==== 硬件 ==== | ||
+ | |||
+ | ==== 搭建电路 ==== | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | </ | ||
+ | |||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== MangoII ===== | ||
+ | |||
+ | ==== 硬件要求 ==== | ||
+ | |||
+ | |8欧姆阻抗扬声器| | ||
+ | |1个光敏电阻| | ||
+ | |4.7K欧姆电阻| | ||
+ | |100欧姆电阻| | ||
+ | |面包板| | ||
+ | |连接线| | ||
+ | |||
+ | ==== 电路图 ==== | ||
+ | |||
+ | 在扬声器的一端接100欧姆电阻到数字口9,另一端接地。给光敏电阻提供5v电源,并且用接地的4.7欧姆电阻连接到A0口。 | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | |||
+ | 代码很简单,读取模拟输入并且标定模拟值到一定范围的音高。人类可以听到20-20000hz频率的声音,但是这里我们用120-1500hz更合适。 | ||
+ | |||
+ | 你需要得到真实的模拟输入变化范围。电路图中可以知道模拟输入值大约在400-1000变化。改变map值来对比你的传感器的变化范围。 | ||
+ | |||
+ | <code cpp>/* | ||
+ | Pitch follower | ||
+ | | ||
+ | |||
+ | */ | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | // 初始化通信速率(调试用): | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | // 读取传感器值: | ||
+ | int sensorReading = analogRead(A0); | ||
+ | // 显示到串口 | ||
+ | Serial.println(sensorReading); | ||
+ | // 模拟输入变化范围 (这里, | ||
+ | // 输出范围(120 - 1500Hz) | ||
+ | // 基于传感器值变化范围改变输入最大最小输入值 | ||
+ | int thisPitch = map(sensorReading, | ||
+ | |||
+ | // 播放音符: | ||
+ | tone(9, thisPitch, 10); | ||
+ | delay(1); | ||
+ | }</ | ||
+ | </ | ||