问题描述
我是Arduino和电子产品的新手,最近我购买了Teensy 3.2来制作MIDI控制器。我将三个按钮和一个滑锅连接到Teensy的面包板上。在线修改一些代码;并且已经将USB类型更改为MIDI,并将端口更改为Teensy。但是我的产品没有任何反应。我可以问我的错误在哪里吗?非常感谢!!!
这是我的代码与电路板的连接:
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
int buttonApin = 1;
int buttonBpin = 2;
int buttonCpin = 3;
int analogslide = A8;
int analogslideOld = 0;
int analogslideNew = 0;
#define analogslideCC 54
void setup() {
MIDI.begin ();
pinMode(buttonApin,INPUT_PULLUP);
pinMode(buttonBpin,INPUT_PULLUP);
pinMode(buttonCpin,INPUT_PULLUP);
pinMode(analogslide,INPUT);
Serial.begin(9600);
}
void loop() {
static bool buttonAvalueOld = HIGH;
static bool buttonBvalueOld = HIGH;
static bool buttonCvalueOld = HIGH;
bool buttonAvalueNew = digitalRead(buttonApin);
bool buttonBvalueNew = digitalRead(buttonBpin);
bool buttonCvalueNew = digitalRead(buttonCpin);
if (buttonAvalueNew != buttonAvalueOld) {
if (buttonAvalueNew == LOW) {
MIDI.sendNoteOn(60,127,1);
} else {
MIDI.sendNoteOff(60,1);
}
buttonAvalueOld = buttonAvalueNew;
}
if (buttonBvalueNew != buttonBvalueOld) {
if (buttonBvalueNew == LOW) {
MIDI.sendNoteOn(64,1);
} else {
MIDI.sendNoteOff(64,1);
}
buttonBvalueOld = buttonBvalueNew;
}
if (buttonCvalueNew != buttonCvalueOld) {
if (buttonCvalueNew == LOW) {
MIDI.sendNoteOn(65,1);
} else {
MIDI.sendNoteOff(65,1);
}
buttonCvalueOld = buttonCvalueNew;
}
int slide = analogRead(A8);
int analogslideNew = analogRead(A8);
if (analogslideNew - analogslideOld >= 35 || analogslideOld - analogslideNew >= 35) {
analogslideOld = analogslideNew;
analogslideNew = (map(analogslideNew,1023,120));
analogslideNew = (constrain(analogslideNew,120));
MIDI.sendControlChange(analogslideCC,analogslideNew,1);
}
delay(25);
}
解决方法
硬件:
请注意面包板电源总线(顶部两个条纹)。红线和蓝线之间有缝隙,这意味着您必须用一些电线将它们连接起来。在其当前电路状态下,红色按钮和电位器处于浮动状态,即未连接到地面和/或VCC。
此外,请特别注意Joel提到的有关电压的内容。切勿将超过3.3V的电压连接到Teensy 模拟引脚(数字引脚为5V tolerant-请阅读Paul Stoffregen的说明-),否则可能损坏MCU。我会使用3.3V来为按钮和电位器供电 我会从底部到顶部将GND跳到GND,将VCC跳到VCC(以防万一,如果您想添加更多项目)
固件:
关于主要loop()
的这一部分:
static bool buttonAvalueOld = HIGH;
static bool buttonBvalueOld = HIGH;
static bool buttonCvalueOld = HIGH;
为什么要在循环中声明和初始化这些变量?您试图保留旧值,但是每次迭代都会丢失它。在外部并在各自的条件内更新其值
与这些变量类似::
bool buttonAvalueNew = digitalRead(buttonApin);
bool buttonBvalueNew = digitalRead(buttonBpin);
bool buttonCvalueNew = digitalRead(buttonCpin);
在外部声明它们并在循环内部更新它们。
最后,您的代码没有任何反跳或chattering消除的方式。为了克服这个问题,我强烈建议您使用Bounce library,它非常有用。