我刚接触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, 0, 1);
}
buttonAvalueOld = buttonAvalueNew;
}
if (buttonBvalueNew != buttonBvalueOld) {
if (buttonBvalueNew == LOW) {
MIDI.sendNoteOn(64, 127, 1);
} else {
MIDI.sendNoteOff(64, 0, 1);
}
buttonBvalueOld = buttonBvalueNew;
}
if (buttonCvalueNew != buttonCvalueOld) {
if (buttonCvalueNew == LOW) {
MIDI.sendNoteOn(65, 127, 1);
} else {
MIDI.sendNoteOff(65, 0, 1);
}
buttonCvalueOld = buttonCvalueNew;
}
int slide = analogRead(A8);
int analogslideNew = analogRead(A8);
if (analogslideNew - analogslideOld >= 35 || analogslideOld - analogslideNew >= 35) {
analogslideOld = analogslideNew;
analogslideNew = (map(analogslideNew, 1023, 0, 0, 120));
analogslideNew = (constrain(analogslideNew, 0, 120));
MIDI.sendControlChange(analogslideCC, analogslideNew, 1);
}
delay(25);
}发布于 2020-11-29 08:00:35
硬件
注意您的电路板电源总线(顶部的两个条纹)。红色和蓝色的线条之间有一个间隙,这意味着你必须用一些电线将它们连接起来。在其当前电路状态下,红色按钮和电位器处于浮动状态,即未连接到接地和/或VCC。
此外,请密切关注Joel提到的有关电压的内容。切勿超过3.3V连接到您的模拟引脚(数字引脚是5V tolerant -请阅读Paul Stoffregen的解释-),否则您可能会损坏单片机。我将使用3.3V输出为按钮和电位器供电,而不是将GND跳到GND,VCC跳到VCC,从底部到顶部导轨(作为预防措施,以防您想要添加更多项目)
固件
关于主loop()的这一部分
static bool buttonAvalueOld = HIGH;
static bool buttonBvalueOld = HIGH;
static bool buttonCvalueOld = HIGH;为什么要在循环中声明和初始化这些变量?您试图保留旧值,但每次迭代都会丢失旧值。将它们放在外部,并将它们的值更新到它们各自的条件中
类似于这些vars::
bool buttonAvalueNew = digitalRead(buttonApin);
bool buttonBvalueNew = digitalRead(buttonBpin);
bool buttonCvalueNew = digitalRead(buttonCpin);在外部声明它们,并在循环内更新它们。
最后,您的代码没有任何去抖动或chattering消除的方法。为了克服这个问题,我强烈建议您使用Bounce library,它非常有用。
https://stackoverflow.com/questions/63984339
复制相似问题