привет. первый раз провожу время с ардуино. сразу возникает несколько вопросов, наверное простых, но они должны развеять мое непонимание у меня arduino leonardo. пытаюсь отправлять миди-сообщения. прошиваю стандартный пример Midi (то есть в коде ошибки быть не может) http://arduino.cc/en/Tutorial/Midi?from=Tutorial.MIDI схема тоже примитивная и ошибки быть не может - целый день танцевал с тестером и сто раз все проверил. но по выходу ноль. теперь вопросы которые возникают: запускаю serial monitor - там сыпятся Р"Р#EР#Р$EР$Р%EР%Р&EР&Р'EР'Р(EР(Р)EР)Р* при этом начинает гореть tx индикатор 1) почему он начинает гореть только когда я включаю сериал монитор? я так понимаю, что посылаются миди-сообщения постоянно (каждые 100 мс). 2) что вообще значит факт, что я получаю сообщения по usb? arduino отправляет их на tx или нет? 3) есть какой то способ отладить выход серийного порта не имея осциллографа? какие то может есть глобальные вещи или же, наобот, тонкости, которых я не пониманию? буду рад слышать спасибо за помощь.
1. Смотрим схематику: http://arduino.cc/en/uploads/Main/arduino-leonardo-schematic_3b.pdf И видим там, что светодиоды софтовые, а не напрямую на линиях rx/tx 2. Отправляет 3. Монитор на 31250 бод настроен?
А Вы знаете, скорее всего у Вас все работает. И то что Вы видите в мониторе - это и есть ноты, которые играются. Поэтому если у вас этот код выдаст "Hello World", то все нормально: Код (Text): void setup() { // Set MIDI baud rate: Serial.begin(31250); } void loop() { Serial.write(“Hello World ”); delay(1000); }
А вы подключаете какой-то синтезатор к выходу 1 leonardo и ничего не работает? Так как на рисунке здесь? http://arduino.cc/en/Tutorial/Midi?from=Tutorial.MIDI Просто фишка Leonardo в том, что у него 2 последовательных порта. Один - виртуальный USB-UART, который подключается к компьютеру. Serial в коде - это он. Второй - железный, который сидит на пинах 0 (rx) и 1 (tx). С ним нужно работать через Serial1 . Сейчас все миди-сообщения посылаются в компьютер - тут ANV прав. То есть, если вы хотите, чтобы все работало как по схеме из http://arduino.cc/en/Tutorial/Midi?from=Tutorial.MIDI , то код должен быть таким: Код (Text): void setup() { // Set MIDI baud rate: Serial1.begin(31250); } void loop() { // play notes from F#-0 (0x1E) to F#-5 (0x5A): for (int note = 0x1E; note < 0x5A; note ++) { //Note on channel 1 (0x90), some note value (note), middle velocity (0x45): noteOn(0x90, note, 0x45); delay(100); //Note on channel 1 (0x90), some note value (note), silent velocity (0x00): noteOn(0x90, note, 0x00); delay(100); } } // plays a MIDI note. Doesn't check to see that // cmd is greater than 127, or that data values are less than 127: void noteOn(int cmd, int pitch, int velocity) { Serial1.write(cmd); Serial1.write(pitch); Serial1.write(velocity); } Просто меняете все Serial на Serial1
acos, вау! вот мое спасение. добавление единички и все получилось. я и подозревал тут подвох, задавая вопрос 2. Как оказалось, если я вижу значения в serial monitor, они не отправляются на аппаратный порт. Спасибо большое всем за ответы. Пару вопросов на будущее. Такая ситуация только с леонардо? Я так понял, можно на пин Vin подать напряжение 12 В и таким образом запитать плату?
Такая ситуация со всеми платами Arduino, которые на контроллере Atmega32u4. Если USB на отдельном контроллере, то пины 1 и 0 это последовательный порт связанный с этим контроллером, как в Arduino Uno например. У него то что на пинах 1 и 0 - то и в мониторе на компьютере. Ну и если на плате несколько последовательных портов, как в Arduino Mega , то тот, который не смотрит в компьютер имеет цифру: Serial1, Serial2. У Меги есть отдельный контроллер для связи - поэтому его Serial это и USB и пины 1, 0.