Питание, vin-порт, энкодер, native USB

pahuchiy
Offline
Зарегистрирован: 04.03.2018

схема подключения http://prntscr.com/ixmxg8

Код ниже работает с левой схемой подключения, но не работает с правой.

/*
 * MIDIUSB_test.ino
 *
 * Created: 4/6/2015 10:47:08 AM
 * Author: gurbrinder grewal
 * Modified by Arduino LLC (2015)
 */ 

#include "MIDIUSB.h"

// First parameter is the event type (0x09 = note on, 0x08 = note off).
// Second parameter is note-on/note-off, combined with the channel.
// Channel can be anything between 0-15. Typically reported to the user as 1-16.
// Third parameter is the note number (48 = middle C).
// Fourth parameter is the velocity (64 = normal, 127 = fastest).

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}

void setup() {
  Serial.begin(115200);
}

// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

void loop() {
  Serial.println("Sending note on");
  noteOn(0, 48, 64);   // Channel 0, middle C, normal velocity
  MidiUSB.flush();
  delay(500);
  Serial.println("Sending note off");
  noteOff(0, 48, 64);  // Channel 0, middle C, normal velocity
  MidiUSB.flush();
  delay(1500);

  // controlChange(0, 10, 65); // Set the value of controller 10 on channel 0 to 65
}

Код ниже не работает с левой схемой подключения, но работает с правой.

/*
   Простой скетч с отработкой энкодера. Поворот увеличивает и уменьшает значение переменной counter.
   Вся отработка уместилась в функции encoderTick(). Отработка осуществляется БЕЗ ПРЕРЫВАНИЙ, 
   поэтому для внедрения в проект нужно обеспечить максимальную прозрачность кода 
   (боже упаси delay и безвыходные циклы).
   AlexGyver Technologies http://alexgyver.ru/
*/
//--ПИНЫ ЭНКОДЕРА--
#define CLK 2
#define DT 3
#define SW 4
long counter = 0;
boolean DT_now, DT_last;
void setup() {
  Serial.begin (9600);
  pinMode (CLK, INPUT);
  pinMode (DT, INPUT);
  DT_last = digitalRead(CLK);         // читаем начальное положение CLK
}
void loop() {
  encoderTick();                      // ФУНКЦИЯ ОТРАБОТКИ ЭНКОДЕРА! СМОТРИ, ВОТ ОНА!
}
void encoderTick() {
  DT_now = digitalRead(CLK);          // читаем текущее положение CLK
  if (DT_now != DT_last) {            // если предыдущее и текущее положение CLK разные, значит был поворот
    if (digitalRead(DT) != DT_now) {  // если состояние DT отличается от CLK, значит крутим по часовой стрелке
      counter ++;                     // прибавить счётчик
    } else {                          // если совпадают, значит против часовой
      counter --;                     // убавить счётчик
    }
    Serial.print("Position: ");
    Serial.println(counter);
  }
  DT_last = DT_now;                   // обновить значение
}

Мне нужно чтобы оба скетча работали, и при этом не нужно было менять схему подключения.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вопрос №1 - вы знаете, как устроен энкодер, какие сигналы он выдает?

pahuchiy
Offline
Зарегистрирован: 04.03.2018

нет, мало что в этом понимаю

sadman41
Offline
Зарегистрирован: 19.10.2016

Плохо дело. Энкодер - это считайте три кнопки. А если кнопку подключить одним контактом на вход ардуины, а вторым - никуда, то что будет? 

Вобщем, питание с ардуины на модуль подайте, а не с левого разъема.

pahuchiy
Offline
Зарегистрирован: 04.03.2018

sadman41 пишет:

Плохо дело. Энкодер - это считайте три кнопки. А если кнопку подключить одним контактом на вход ардуины, а вторым - никуда, то что будет? 

Вобщем, питание с ардуины на модуль подайте, а не с левого разъема.

спасибо. Подскажите, как можно отказаться от запитывания энкодера с ардуинки. Мне нужно будет очень много чего подключать, а +5 вольт на ней тольуо один. Сори за пионерские вопросы))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Поставьте отдельный стабилизатор на 5 В.

sadman41
Offline
Зарегистрирован: 19.10.2016

pahuchiy пишет:

спасибо. Подскажите, как можно отказаться от запитывания энкодера с ардуинки. Мне нужно будет очень много чего подключать, а +5 вольт на ней тольуо один. Сори за пионерские вопросы))))

Так я же написал, что ваш механический энкодер - это практически кнопки. Они по 300 ампер не потребляют. Ваша драгоценная ардуина не похудеет и от десятка энкодеров.

А если уж прямо спать не можете и хотите отдельное питание - хотя бы gnd посторонней шины питания соедените с ардуиновским.

pahuchiy
Offline
Зарегистрирован: 04.03.2018

andriano пишет:

Поставьте отдельный стабилизатор на 5 В.

http://prntscr.com/ixogeg

так? объяснитепожалуйста, зачем это нужно?

pahuchiy
Offline
Зарегистрирован: 04.03.2018

sadman41 пишет:

gnd посторонней шины питания соедените с ардуиновским.

http://prntscr.com/ixoix6 

так?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

pahuchiy пишет:

andriano пишет:

Поставьте отдельный стабилизатор на 5 В.

http://prntscr.com/ixogeg

так? объяснитепожалуйста, зачем это нужно?

Вы же сами пишете:

pahuchiy пишет:

Подскажите, как можно отказаться от запитывания энкодера с ардуинки. Мне нужно будет очень много чего подключать, а +5 вольт на ней тольуо один. Сори за пионерские вопросы))))

По поводу схемы: я не знаю, к каким контактам модуля энкодера что подходит. Чтобы понимать принцип работы, нужне принципиальная схема, а не монтажная.

Но следует иметь в виду, что ни на какой из пинов Дуэ нельзя подавать 5 В, поэтому энкодер тоже следует питать от 3.3В, а не от 5.

 

pahuchiy
Offline
Зарегистрирован: 04.03.2018

ну это же обычный китайский ky-040.  Вот так покрупнее http://prntscr.com/ixtk1g

pahuchiy
Offline
Зарегистрирован: 04.03.2018

так ничего и не понял. На всякий случай, ещё раз про то чего я добиваюсь: ардуину хочу питать от USB а всю переферию (5 вольт) от внешнего питания. Такое возможно? Если нет, то подойдет вариант питания ардуины тоже от внешнего источника, но при подключёном native USB

тоесть как правильно сделать? так https://prnt.sc/ixtk1g или так https://prnt.sc/ixoix6 или так http://prntscr.com/ixwslf ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Понять, как функционирует схема можно только по принципиальной схеме, монтажная схема для этого не подходит. Поэтому что-то обсуждать возможно только если опубликована принципиальная схема. Если ее нет, то варианта всего два: либо перерисовывать для себя монтажную схему в принципиальную, либо проигнорировать как монтажную схему, так и вопрос. Второе - легче. Поэтому разумно, что работу по преобразованию монтажной схемы в принципиальную будет выполнять спрашивающий.

2. Повторюсь: ни на какой контакт контроллера Arduino Due нельзя подавать напряжение больше 3.3 В. В том числе и с подключенных датчиков. Поэтому следует либо питать датчики от 3.3В (разумеется, если они такое допускают. Энкодеры, например, - допускают), либо ставить между Ардуино и датчиками конверторы уровней.

Что там наворочено в модуле, я не знаю, сам пользуют только такими:

Чаще всего используют схемы, такую:

либо такую: 

Но обе эти схемы не очень хороши. Правильная схема должна быть такой:

pahuchiy
Offline
Зарегистрирован: 04.03.2018

спасибо, поизучаю......сложно мне пока с принципиальными схемами(((...спрошу так: если я gnd посторонней шины питания (5 вольт) соеденю с ардуиновским https://prnt.sc/ixoix6 как советовал sadman41 ардуинке ничего не будет?

pahuchiy
Offline
Зарегистрирован: 04.03.2018

не стал дожидаться ответа - объединил земли - всё заработало

pahuchiy
Offline
Зарегистрирован: 04.03.2018

ошибочка вышла. оказывается я забыл убрать питание от ардуины на бредборд. тоесть когда я написал что заработало - вот так было: Без названия (2).png 

Если питание идущее от ардуины на бредборд убрать (а оставить только землю) то энкодер опять не читается.

причём ведёт себя энкодер так: поворачиваю на одно деление - он работает (ардуина выводит значение на единичку больше или меньше предыдущего), поворачиваю дальше - значения побежали (ну тоесть не работает)....поворачиваю дальше - опять встал (работает, ждёт нового поворота). И так делее.

pahuchiy
Offline
Зарегистрирован: 04.03.2018

andriano пишет:

 

Чаще всего используют схемы, такую:

 

хочу начать с этой схемы, как с самой простой. Ну и все компоненты у меня есть в наличии. Но у меня есть питание только 5 вольт. Вы писали что больше 3 нельзя подавать на ардуину....Тоесть, в моём случае - не вариант? Сейчас разобрался в правильной схеме - там же тоже пины с питанием нужно соединять....Или через резисторы это можно? 10 кОм подойдут для схемы на этой картинке?

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Притяните выводы А и В к земле резисторами по 20К при R1,2 равным 10К.

А почему не берете 3.3В с самой платы на энкодер?

pahuchiy
Offline
Зарегистрирован: 04.03.2018

суммарное потребление периферии будет больше 800мА. 

pahuchiy
Offline
Зарегистрирован: 04.03.2018

toxikaciya пишет:

Притяните выводы А и В к земле резисторами по 20К при R1,2 равным 10К.

по какой формуле это расчитывается?

sadman41
Offline
Зарегистрирован: 19.10.2016

Какое потребление у вашего энкодера? Посчитайте по закону Ома.

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Периферию Вы можете запитывать от внешнего питания, как предполагалось ранее. Энкодер же можно питать непосредственно от платы, где есть готовые 3.3В, а не городить дополнительную обвязку из резисторов. Формула расчетов проста, загуглите резистивный делитель напряжения. И, кстати, 800ма - это по линии 5В, по 3.3В будет только 180ма.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

pahuchiy пишет:

andriano пишет:

 

Чаще всего используют схемы, такую:

 

хочу начать с этой схемы, как с самой простой. Ну и все компоненты у меня есть в наличии. Но у меня есть питание только 5 вольт. Вы писали что больше 3 нельзя подавать на ардуину....Тоесть, в моём случае - не вариант? Сейчас разобрался в правильной схеме - там же тоже пины с питанием нужно соединять....Или через резисторы это можно? 10 кОм подойдут для схемы на этой картинке?

У этой схемы нет аппаратного подавления дребезга контактов. Мне кажется, лучше делать то, что надежнее, а не то, что проще. Тем более, что дребезг усиливается в процессе эксплуатации - может оказаться, что пока вы отлаживаете макет, дребезг не будет серьезно мешать, а потом, когда устройство будет закончено, распаяно, помещено в корпус, начнет проявляться дребезг. Кстати, Вы бы для начала выяснили, что там реально распаяно на плате модуля.

По поводу 3.3 В на ножках - можно, как совеовали выше, поставить дополнительные резисторы на землю. Можно запитать энкодер от стабилизатора Ардуины (тем более, что остальная периферия у Вас питается от 5 В). Если ток потребления хотя бы приближается к 800 мА (я бы сказал, порядка половины от этой величины), однозначно нудно переходить на питание от внешнего стабилизатора (а не испытывать судьбу).

pahuchiy
Offline
Зарегистрирован: 04.03.2018

Насчёт того чем запитывать энкодер (ардуиновским питанием или внешним) : да может в итоге я и остановлюсь на ардуиновском. Дело не в этом. Мне сейчас нужно научиться запитываться внешним питанием. А энкодер это будет или светодиодная матрица - не так важно. Подавление дребезга на данном этапе - задача не особо актуальная, это уже, скажем так, финишная шлифовка. Хотя, безусловно, по возможности воспользуюсь правильной схемой. 

Так? https://prnt.sc/iyobbd

 

pahuchiy
Offline
Зарегистрирован: 04.03.2018

      

sadman41
Offline
Зарегистрирован: 19.10.2016

В общем случае - если вы подключаете к одному устройству другое, взаимодействующее с первым, устройство, то соединяйте их земли. Далее уже частности - согласование уровней, чтобы одно устройство не спалило другое. Или полная развязка, чтобы не завалило помехами по земле.

pahuchiy
Offline
Зарегистрирован: 04.03.2018

почти заработало. Подключил так https://prnt.sc/iyobbd

энкодер такой http://prntscr.com/iyxzjr (там уже свои резисторы стоят, моя схема это не учитывает)

Против часовой кручу - всё работает как надо. По часовой - энкодер прыгает на месте (плс/минус одно значение) Что это может быть?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

pahuchiy пишет:

Насчёт того чем запитывать энкодер (ардуиновским питанием или внешним) : да может в итоге я и остановлюсь на ардуиновском. Дело не в этом. Мне сейчас нужно научиться запитываться внешним питанием. А энкодер это будет или светодиодная матрица - не так важно. Подавление дребезга на данном этапе - задача не особо актуальная, это уже, скажем так, финишная шлифовка. Хотя, безусловно, по возможности воспользуюсь правильной схемой. 

Так? https://prnt.sc/iyobbd

1. Есть определенные правила. Если их придерживаться, можно считать, что есть гарантии, что все будет работать нормально. Кроме того, обычно предусматривается некоторое количество защит, благодаря которым в некоторых случаях нарушение правил не приводит к выходу устройства из строя. В общем, если бы этих защит не существовало, свой контроллер Вы бы уже спалили. 

Тем не менее, правил следует придерживаться. Иначе рано или поздно, возможно, при совершенно незначительном изменении условий (в конкретном случае, например, при изменении номиналов резисторов) схнма перестанет работать. Притом, - необратимо.

Поэтому запомните и никогдла не нарушайте: не следует подавать ни на какой пин контроллера напряжение выше 3.3 В. Т.е. схему нужно переделывать: либо существующую схему питать от 3.3В, либо добавлять еще пару резисторов на землю, как рекомендовали выше.

2. На Вашем модуле уже, скорее всего, распаяна пара резисторов. Не знаю, учли ли Вы это в своей схеме.

3. Насчет финишной шлифовки - я бы не был столь категоричным. При условии, что Вам нужна хоть какая-то работоспособность. Т.е. для защиты от дребезга необходимо предпринимать какие-то меры. Здесь возможны варианты, в частности несколько вариантов программного подавления дребезга. Т.е. работоспособность схемы зависит от того, как программно осуществляется взаимодействие с ней. Если же схема аппаратно подавляет дребезг, то выбор допустимых программных решений существенно расширяется. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

pahuchiy пишет:

почти заработало. Подключил так https://prnt.sc/iyobbd

энкодер такой http://prntscr.com/iyxzjr (там уже свои резисторы стоят, моя схема это не учитывает)

Против часовой кручу - всё работает как надо. По часовой - энкодер прыгает на месте (плс/минус одно значение) Что это может быть?

Вполне возможно, тот самый дребезг, который для Вас пока неактуален.

pahuchiy
Offline
Зарегистрирован: 04.03.2018

заработало наконец-то))), всем спасибо. 

pahuchiy
Offline
Зарегистрирован: 04.03.2018

часть изначальной проблемы осталась: при подключении SD-модуля к SPI, Native USB перестаёт работать (перестаёт определяться виндой) Hot-Selling-Micro-SD-Storage-Board-Micro

от модуля все провода(кроме CS) тяну в spi в центре ардуины 

Нашёл тему http://forum.arduino.cc/index.php?topic=172631.0 которая натолкнула на мысль что по native usb передаётся spi. И чтобы задействовать нужное устройство нужно переключить на нужное spi устройство в коде. Что-то типо такого SPI.setDataMode(SPI_MODE1); Я прав?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Судя по рисунку, у Вас 5-вольтовый модуль. Т.е. для SD-карты нужны сигналы и питание 3.3В, поэтому для сопряжения с 5-вольтовыми контроллерами там куча дополнительной обвязки, которая дл 3.3-вольтовой логики не нужна.

Но, на самом деле, ситуация намного хуже. Не знаю, как конкретно Ваш модуль, но у китайцев часто попадаются неправильно сделанные модули. Неправильность заключается в том, что преобразователи уровня никогда не отключаются от шины (хотя должны). Поэтому хотя сама карта, вроде работает, подключить более ни одного устройства SPI не получается.

Выход простой - использовать либо 3.3-вольтовый модуль без всяких дополнительных преобразователей, либо вообще использовать не модуль, а вместо него переходник, скажем, с micro-SD на SD, и к нему просто подпаивать провода. Естественно, это допустимо только с 3.3-вольтовым контроллером, каковым и является Ардуино Дуе.

pahuchiy
Offline
Зарегистрирован: 04.03.2018

++++ сделал как на картинке - всё работает. спасибо