Дык ШИМ же.. установить нужную яркость...они слишком яркие и слишком много потребляют энергии
Последнее редактирование:
Дык ШИМ же.. установить нужную яркость...они слишком яркие и слишком много потребляют энергии
Ну давайте, пройдите испытания для Эзернета опираясь исключительно на схемотехнику.Ну давайте, пройдите испытания
Очень любите повторять данную фразу.Рекомендовано во всех учебниках и даташитах
Так, шашечки, или ехать?весьма дорогая стрельба
С завтрашнего дня беру отпуск за свой счёт и сажусь за поиск!не судьба поискать?
Вадим!резистор дает бОльший диапазон работоспособных напряжений за счет обратной связи
Как же не ставят?не ставят там обычные оптопары
Речь, если я правильно понял, об адресных светодиодах.Дык ШИМ же
Ну давайте, пройдите испытания для Эзернета опираясь исключительно на схемотехнику.
Плиз, конкретные ссылки?
А как?) Я про управление яркостью.Там всё малость не так.
Наверное, имя файла длинное или содержит запрещённые символы.@Astranome, Ваш подход мне очень нравится)) с STM немного поигрался, очень классно, кроме библиотек или умения их искать. Исключительно инертность заставляет меня клепать приборы по старинке на Ардуинках. Ну и гуру наверное мне нужен... Может все же начну портацию, и попрошу помощи. Удачи и развития!
Ваш проект в IDE не открывается. Правда, у меня не стоит поддержка плат STM, но это же не имеет значения.
///// https://github.com/astranome/MIDI-Controller-on-STM32 /////
#include <Arduino.h>
#include <USBComposite.h>
#include <Wire.h>
#include <LiquidCrystal_I2C_STM32.h> // https://github.com/lightcalamar/LiquidCrystal_I2C_STM32
LiquidCrystal_I2C_STM32 lcd(0x3E, 16, 2); // Устанавливаем дисплей
USBMIDI midi;
// Pin Definitions //
/////////////////////////////////
const uint8 pot_pin = 5;
const uint8 pot_pin0 = 0;
const uint8 pot_pin1 = 1;
const uint8 pot_pin2 = 2;
const uint8 pot_pin3 = 3;
const uint8 pot_pin4 = 4;
const int selectPins[3] = {9, 6, 7}; // S0~PA9, S1~PA6, S2~PA7
const uint8 zInput = PB1; //A11; // Connect common (Z) to B1 (analog input)
const uint8 BUTTON1 = PB3; //1
const uint8 BUTTON2 = PB4; //2
const uint8 BUTTON3 = PB5; //3
unsigned int Val = 0;
unsigned int Val_7 = 0;
unsigned int Val_6 = 0;
int buttonState1 = LOW;
int buttonState2 = LOW;
int buttonState3 = LOW;
int buttonPrevState1 = LOW;
int buttonPrevState2 = LOW;
int buttonPrevState3 = LOW;
const uint8 threshold = 2;
const unsigned int midi_channel =6; // this might show up as channel 6 depending on start index
const unsigned int midi_channel0 = 1;
const unsigned int midi_channel1 = 2;
const unsigned int midi_channel2 = 3;
const unsigned int midi_channel3 = 4;
const unsigned int midi_channel4 = 5;
const unsigned int cc_command = 7; // bank select command 0
const unsigned int cc_command6 = 71; // bank select command 0
const unsigned int cc_command7 = 74; // bank select command 0
unsigned int old_value = 0;
unsigned int new_value = 0;
unsigned int old_value0 = 0;
unsigned int new_value0 = 0;
unsigned int old_value1 = 0;
unsigned int new_value1 = 0;
unsigned int old_value2 = 0;
unsigned int new_value2 = 0;
unsigned int old_value3 = 0;
unsigned int new_value3 = 0;
unsigned int old_value4 = 0;
unsigned int new_value4 = 0;
unsigned int old_valMux6 = 0;
unsigned int new_valMux6 = 0;
unsigned int old_valMux7 = 0;
unsigned int new_valMux7 = 0;
void setup() {
Serial.begin(9600); // Initialize the serial port
// product id taken from library example
USBComposite.setProductId(0x0031);
pinMode(pot_pin, INPUT);
pinMode(pot_pin0, INPUT);
pinMode(pot_pin1, INPUT);
pinMode(pot_pin2, INPUT);
pinMode(pot_pin3, INPUT);
pinMode(pot_pin4, INPUT);
pinMode(BUTTON1, INPUT_PULLUP);
pinMode(BUTTON2, INPUT_PULLUP);
pinMode(BUTTON3, INPUT_PULLUP);
// Set up the select pins as outputs:
for (int i=0; i<3; i++)
{
pinMode(selectPins, OUTPUT);
digitalWrite(selectPins, HIGH);
}
pinMode(zInput, INPUT); // Set up Z as an input
midi.begin();
delay(1000);
//-------------- Init display ----------------
lcd.begin();
lcd.backlight();// Включаем подсветку дисплея
lcd.print(" MIDI Controller ");
lcd.setCursor(0, 1);
lcd.print(" LCD 1602 ");
delay(1500);
lcd.noBacklight();// Выключаем подсветку дисплея
delay(100);
lcd.backlight();// Включаем подсветку дисплея
}
void loop() {
int temp = analogRead(pot_pin); // a value between 0-4095
int temp0 = analogRead(pot_pin0);
int temp1 = analogRead(pot_pin1); // a value between 0-4095
int temp2 = analogRead(pot_pin2);
int temp3 = analogRead(pot_pin3); // a value between 0-4095
int temp4 = analogRead(pot_pin4);
buttonState1 = digitalRead(BUTTON1);
buttonState2 = digitalRead(BUTTON2);
buttonState3 = digitalRead(BUTTON3);
new_value = temp / 32; // convert to a value between 0-127
new_value0 = temp0 / 32;
new_value1 = temp1 / 32; // convert to a value between 0-127
new_value2 = temp2 / 32;
new_value3 = temp3 / 32; // convert to a value between 0-127
new_value4 = temp4 / 32;
////////////////////////////////////////////////////////////////////////////////
if (buttonState1 != buttonPrevState1) {
button1Handler(); ///////////// Detecting pressing or releasing the button
}
if (buttonState2 != buttonPrevState2){
button2Handler();
}
if (buttonState3 != buttonPrevState3){
button3Handler();
}
////////////////////////////////////////////////////////////////////////////////////
///////////// reading values on multiplexed inputs ------------
selectMuxPin(7); // Select one at a time
int inputValue = analogRead(zInput); // and read Z
new_valMux7 = inputValue / 32;
// Serial.print("7 = ");
//Serial.println(Val_7);
selectMuxPin(6); // Select one at a time
int inputValue6 = analogRead(zInput); // and read Z
new_valMux6 = inputValue6 / 32;
////////////////////////////////////////////////////////////////////////////////////////////////
// If difference between new_value and old_value is grater than threshold mux 666666666666666
if (new_valMux6 > old_valMux6 && new_valMux6 - old_valMux6 > threshold ||
new_valMux6 < old_valMux6 && old_valMux6 - new_valMux6 > threshold) {
/////------------ sending a midi CC command ----------------
midi.sendControlChange(midi_channel0, cc_command6, new_valMux6);
lcd.clear();
lcd.print("CH00 CC");
lcd.print(cc_command6);
lcd.print(" val ");
lcd.print(new_valMux6);
//------------ Update old_value---------
old_valMux6 = new_valMux6;
}
// If difference between new_value and old_value is grater than threshold mux 77777777777
if (new_valMux7 > old_valMux7 && new_valMux7 - old_valMux7 > threshold ||
new_valMux7 < old_valMux7 && old_valMux7 - new_valMux7 > threshold) {
/////------------ sending a midi CC command ----------------
midi.sendControlChange(midi_channel0, cc_command7, new_valMux7);
lcd.clear();
lcd.print("CH00 CC");
lcd.print(cc_command7);
lcd.print(" val ");
lcd.print(new_valMux7);
//----------- Update old_value --------------
old_valMux7 = new_valMux7;
}
// If difference between new_value and old_value is grater than threshold
if (new_value > old_value && new_value - old_value > threshold ||
new_value < old_value && old_value - new_value > threshold) {
/////------------ sending a midi CC command ----------------
midi.sendControlChange(midi_channel, cc_command, new_value);
lcd.clear();
lcd.print("CH06 CC");
lcd.print(cc_command);
lcd.print(" val ");
lcd.print(new_value);
// Update old_value
old_value = new_value;
}
// 00000 If difference between new_value6 and old_value6 is grater than threshold
if (new_value0 > old_value0 && new_value0 - old_value0 > threshold ||
new_value0 < old_value0 && old_value0 - new_value0 > threshold) {
midi.sendControlChange(midi_channel0, cc_command, new_value0);
lcd.clear();
lcd.print("CH01 CC");
lcd.print(cc_command);
lcd.print(" val ");
lcd.print(new_value0);
// Update old_value
old_value0 = new_value0;
}
// 1111 If difference between new_value1 and old_value1 is grater than threshold
if (new_value1 > old_value1 && new_value1 - old_value1 > threshold ||
new_value1 < old_value1 && old_value1 - new_value1 > threshold) {
midi.sendControlChange(midi_channel1, cc_command, new_value1);
lcd.clear();
lcd.print("CH02 CC");
lcd.print(cc_command);
lcd.print(" val ");
lcd.print(new_value1);
// Update old_value
old_value1 = new_value1;
}
// 2222 If difference between new_value2 and old_value2 is grater than threshold
if (new_value2 > old_value2 && new_value2 - old_value2 > threshold ||
new_value2 < old_value2 && old_value2 - new_value2 > threshold) {
midi.sendControlChange(midi_channel2, cc_command, new_value2);
lcd.clear();
lcd.print("CH03 CC");
lcd.print(cc_command);
lcd.print(" val ");
lcd.print(new_value3);
// Update old_value
old_value2 = new_value2;
}
// 3333 If difference between new_value3 and old_value3 is grater than threshold
if (new_value3 > old_value3 && new_value3 - old_value3 > threshold ||
new_value3 < old_value3 && old_value3 - new_value3 > threshold) {
midi.sendControlChange(midi_channel3, cc_command, new_value3);
lcd.clear();
lcd.print("CH04 CC");
lcd.print(cc_command);
lcd.print(" val ");
lcd.print(new_value3);
// Update old_value
old_value3 = new_value3;
}
// 4444 If difference between new_value4 and old_value4 is grater than threshold
if (new_value4 > old_value4 && new_value4 - old_value4 > threshold ||
new_value4 < old_value4 && old_value4 - new_value4 > threshold) {
midi.sendControlChange(midi_channel4, cc_command, new_value4);
lcd.clear();
lcd.print("CH05 CC");
lcd.print(cc_command);
lcd.print(" val ");
lcd.print(new_value4);
// Update old_value
old_value4 = new_value4;
}
// Wait 50ms before reading the pin again
delay(50);
}
// The selectMuxPin function sets the S0, S1, and S2 pins
// accordingly, given a pin from 0-7.
void selectMuxPin(byte pin)
{
for (int i=0; i<3; i++)
{
if (pin & (1<<i))
digitalWrite(selectPins, HIGH);
else
digitalWrite(selectPins, LOW);
}
}
/////------------ this function handles events that have occurred with buttons ----------------
void button1Handler() {
buttonPrevState1 = buttonState1;
//digitalWrite(LED1, buttonState1);
if (buttonState1 == HIGH) {
//Serial.println("Button 1 is pressed");
//-------- Sending Realtime category messages -----------
midi.sendStart();
lcd.clear();
lcd.print("Start");
}
}
void button2Handler() {
buttonPrevState2 = buttonState2;
//digitalWrite(LED1, buttonState2);
if (buttonState2 == HIGH) {
//Serial.println("Button 2 is pressed");
midi.sendStop();
lcd.clear();
lcd.print("Stop");
}
}
void button3Handler() {
buttonPrevState3 = buttonState3;
//digitalWrite(LED1, buttonState3);
if (buttonState3 == HIGH) {
//Serial.println("Button 3 is pressed");
//-------- Sending Realtime category messages -----------
midi.sendContinue();
lcd.clear();
lcd.print("Cont");
}
}
Не совсем понятно, какое именно устройство проектируете. Если это микшерский пульт, то кольцевые огоньки, несомненно, добавляют неповторимый антураж изделию, но смотреть на экран, где изображен пульт очень даже удобно, там еще и индикаторы уровня красиво прыгают и , самое главное, назначения крутилок подписано, не надо писать на полоске бумаги и приклеивать под крутилкой-энкодером.Я вот думаю, может проще отображение состояния контролов сделать только на экране? Экран божно взять достаточно большой. Или это будет неудобно для считывания глазом?
Мы тоже проходили, "особо не заморачиваясь", а потом повезли в гейопу, где не попали даже в промышленные допуски, после чего стали всё-таки заморачиваться.проходил все, не особо морочась с разводкой
Сейчас не могу добраться до своего бумажного издания, но допустим, что опечаток нет.табличка из банального Х-Х
"Не подходи ко мне! Я обиделась!"отвечать не буду
Там каждый светодиод, как отдельное адресное управляемое устройство.А как?
Затем перешли на 5V АТМегу, которую надо подключать исключительно через HCT (хотя даже приведённая Вами таблица указывает обратное).
буфер питается от 5В. Если питание процессора 3.3В, то порог буфера должен быть примерно 1.6В, что соответствует TTL-порогу, а значит - нужен именно HCT. А вот если процессор тоже пятивольтовый, то нужен порог у буфера в районе 2.5В, что соответствует HC.
"Не подходи ко мне! Я обиделась!"
Но меня-то больше интересовали как-раз даташиты
работаю с какими-то подобными адресными на индикации. в софте преобразование HSV-RGBНо такие кольца явно избыточны: не вижу, для чего можно использовать RGB-многоцветие, а главное, такие адресные диоды WS2812
слишком мощные и много потребляют. Они скорее осветительные, чем индикаторные.
Я знаю как работаю эти светодиоды Много чего ваял с ws28xx. Яркостью там управляет ШИМ, в каждом чипе. Поэтому энергопотребление, о чём переживает ТС, можно в расчет не брать. Только это хотел сказать.Там каждый светодиод,
Кстати, могли бы и Сами понять, что описка, а не корчить обиженного.
Затем перешли на 5V АТМегу, которую надо подключать исключительно через HCT (хотя даже приведённая Вами таблица указывает обратное).
"Где бы что ни говорили, всё одно сведёт на баб".заведомо ложное высказывание
Это типа, я теперь могу про Вас всякие гадости писАть, а Вы их даже видеть не будете?В игноре
Затем, чтобы поделиться своей наработкой, возможно кому то полезной. Но нарвался на хамство вкаждойбочкезатыкателя. Понял, учту, что здесь офтопы , флудерство и прочий срач в почёте.Так зачем Вы тогда здесь постите?
Вот это и есть хамство-указывать , куда идти. А мой пост был строго по теме.И шли бы на форум автолюбителей.
Разумеется, напомнить, что существуют правила форума и просто хорошего тона, это - хамство, а забабахать листинг на пару сотен строк - норма.Вот это и есть хамство
А чтобы не было вообще закороченных гальванических соединений между устройствами. На всякий случай. В принципе, действительно не так важно. На входе все равно полностью изолированный светодиод оптрона, причем, еще с одним резистором 220. Видимо, исходится из того, что не всегда это аккуратно соблюдается.Но, зачем ДВА резистора?
Эта тема называется "Самодельный MIDI Controller" , а не "какие сомнения возникают лично у Gregory" и не "сколько у Gregory медалек" , поэтому ваши рассуждения здесь - неуместны, оффтоп , флуд и никому не интересны. И ковырять мой листинг я никого не просил. А то, что начнёте тут трясти регалиями, это было очевидно.P.S.: Вот лично у меня,
Можно ещё применить гальваноразвязку на ADUM 1201 , к примеру. Держит 3000 Вольт, если что. Имеется позитивный опыт применения.А чтобы не было вообще закороченных гальванических соединений между устройствами
Ребята, валяется в ящике arduino uno r3 новая, есть здесь экспериментаторы, кто делал на похожих платах миди-контроллеры?
интересует что тот несложное, в духе настругал из дерева/пластика/оргстекла коробку - воткнул в нее штук 20 потенциометров (или бесконечных энкодеров), навесил midi плату с входом/выходом на ардуину и вперед линкую с vst)
можно что нибудь посложнее, к примеру чтобы энкодеры запоминали позицию/значение параметра vst (как это реализовано в novation zero sl к примеру)
вобщем если кто заморачивался подобным, или даст конкретные ссылки на рабочие проекты со скетчами к ардуине (чтобы не expensive бюджет конечно сжирали детали для этого контроллера) - буду премного благодарен
Я "заморачиваюсь" . Сразу скажу - без мультиплексора не обойтись - у Ардуино УНО не так много "аналоговых" ног, чтобы хватило на "штук 20 потенциометров" . По поводу энкодеров , да ещё 20, сам чешу репу. Ибо для их обслуживания используют прерывания, а выводов у УНО, поддерживающих прерывания, (а их надо хотя бы по одному на каждый энкодер) и того меньше. Выход - или мультиплексировать эти выводы (сомневаюсь, что это возможно), или вовсе отказаться от прерываний (но я пока не нашел таких библиотек). Вот держите ссылочку на рабочий и простой в повторении проект.Тыцостался без ответа
Это можно сделать, если запоминать "свои" значения - несложно, а если надо запоминать значения из DAW, то надо научиться запрашивать-получать их из ПО, а это уже зависит уже от конкретного ПО (DAW)чтобы энкодеры запоминали позицию/значение параметра vst
Рад помочь. Если по этой ссылке и по этой делать в точности, как показано, то всё сразу получится, без изысканий и бубнов.@Astranome, вот тут во втором примере - как раз на мультиплексерах сделан контроллер
10 MIDI Controllers You Can Build With an Arduino
This mega list covers some of the coolest Arduino MIDI controllers you can build right now.www.makeuseof.com
спасибо за направление мыслей - будем делать)
Вадим, Вы всё время хотите нарушить протокол, и постоянно спрашиваете, как это лучше сделать?приборы с настоящим фантомным питанием
До тех пор, пока на приёмной стороне не начинают лепить отсебятину.действительно не так важно
Было бы интересно взглянуть на этот вариант применения, а также узнать стоимость такой гальваноразвязки и стоимость самого девайса, в котором она была применена.применить гальваноразвязку на ADUM 1201
Вообще-то здесь форум (пока, вроде, демократичный).никому не интересны
Ну-ка, ну-ка, ткните пальцем, где (хоть посмотрю, что за регалии такие у меня появились)?начнёте тут трясти регалиями