ШИМ и analogReference(INTERNAL)

RocktorT
Offline
Зарегистрирован: 08.09.2021

Всем привет! Имеется китайская pro micro. Пин 5 работает как ШИМ. Параллельно измеряется напряжение на А0 и А1. При переключении  на  analogReference(INTERNAL) ШИМ перестает работать)) Может, так и должно быть?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скетча не будет? И схемы, заодно - что там и как подключено к пинам 5 и A0/A1

RocktorT
Offline
Зарегистрирован: 08.09.2021

Сейчас, почищу от левых коментов и выложу скетч.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И, заодно, от левых действий. Вы говорите, что проблема в переключении референса. Вот и сделайте скетч в котором есть только analoWrite и переключение. Скетч выкладывайте целиком, чтобы его можно было просто запустить у себя. И не забудьте про правила выкладывания скетча .

Кстати, схема тоже не помешает.

RocktorT
Offline
Зарегистрирован: 08.09.2021

В общем, скетч создавался на 99% копипастой, поэтому названия переменных схеме не соответствует. Но все, как ни странно, работает.

#include <USB-MIDI.h>
#include <MIDI.h>
#include <MIDI_Controller.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"


RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно


byte recieved_data[2]; // массив принятых данных
byte relay = 2; // реле на 2 цифровом
byte mosfet = 5; // мосфет на 5 цифровом (ТУТ ЕСТЬ ШИМ!!!)
const uint8_t velocity = 0b1111111; // Maximum velocity (0b1111111 = 0x7F = 127)
const uint8_t C4 = 60;              // Note number 60 is defined as middle C in the MIDI specification

const uint8_t E4 = 64;              // Note number 64 is defined as middle E in the MIDI specification

const uint8_t G4 = 67;              // Note number 67 is defined as middle G in the MIDI specification

Digital button[] = {
    {6, C4, 1, velocity}, // Create a new instance of the class 'Digital', called 'button', on pin 6, 7, 8, that sends MIDI messages with note 'C4' (60), E4 (64), G4 (67) on channel 1, with velocity 127
    {7, E4, 1, velocity},
    {8, G4, 1, velocity},
};
// Create a new instance of the class 'AnalogHiRes', called 'potentiometer', on pin A0, 
// that sends MIDI Pitch Bend messages on channel 1
AnalogHiRes potentiometer(A0, 1);

// Create a new instance of the class 'Analog', called 'potentiometerA1', on pin A1, 
// that sends MIDI messages with controller 7 (channel volume) on channel 1
Analog potentiometerA1(A1, MIDI_CC::Channel_Volume, 1);

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
  analogReference(INTERNAL);
 
  Serial.begin(31250); //открываем порт для связи с ПК

  ::pinMode(relay, OUTPUT); // настроить пин реле как выход
  ::pinMode(mosfet, OUTPUT); // настроить пин мосфета как выход

  //myservo.attach(servo);

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(115);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MIN); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &recieved_data, sizeof(recieved_data) );         // читаем входящий сигнал
    ::digitalWrite(relay, recieved_data[0]); // подать на реле сигнал с 0 места массива
    //то бишь 0 или 1
        analogWrite(mosfet, recieved_data[1]); // подать на мосфет ШИМ сигнал
    // в соответствии с принятыми данными со 2 места массива, диапазон 0...255
  }
  MIDI_Controller.refresh();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы не поняли. Я же Вам написал

ЕвгенийП пишет:

Вы говорите, что проблема в переключении референса. Вот и сделайте скетч в котором есть только analoWrite и переключение. 

Что в Вашем скетче делают NRF и MIDI?

Я хочу запустить скетч у себя, увидеть проблему и попытаться Вам помочь, но городить схему с миди и нрф - через чур, тем более, что миди у меня нет.

Давайте, Вы сократите скетч до минимального, показывающего проблему. Чтобы мне не так трудно было его запустить и увидеть Вашу беду.

RocktorT
Offline
Зарегистрирован: 08.09.2021

 Извините, я задавал вопрос в расчете на то, что, может, кто сталкивался с проблемой. Специально собирать макет и моделировать мою ситуацию, по-моему, чересчур трудоемко... 
Задам вопрос по-другому. Можно было бы вообще отказаться от ШИМ, если б данные, полученные от nRF24L01 преобразовать в MIIDI и отправить на USB. Дело в том, что я в программировании профан, понимаю, что задача не такая уж сложная, но куда копать - не знаю(( Или создать новую тему, конкретно по nRF24L01 -> MIDI?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если для Вас решать СВОЮ проблему

RocktorT пишет:

чересчур трудоемко

то каково, по Вашему мнению, для других решать ЧУЖУЮ проблему?

Удачи Вам!

RocktorT
Offline
Зарегистрирован: 08.09.2021

Переключения в скетче нет, просто ШИМ работает, когда я заливаю скетч с референсом по умолчанию, и не работает, когда в сетап добавляю analogReference(INTERNAL).

RocktorT
Offline
Зарегистрирован: 08.09.2021

Конечно же, я имел в виду, трудоемко для вас.

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

Неужели сложно в пустой скетч закопипастить analogWrite и analogReference?

RocktorT
Offline
Зарегистрирован: 08.09.2021

sadman41, попробую.

b707
Онлайн
Зарегистрирован: 26.05.2017

RocktorT - не пойму. а нафига вы вообще трогаете AnalogReference() ? - у вас в коде нет чтения аналоговых портов, поэтому референс ни на что не влияет.

и еще интересны строчки 42, 43. 69... они вообще компилиются?

RocktorT
Offline
Зарегистрирован: 08.09.2021

b707 пишет:

RocktorT - не пойму. а нафига вы вообще трогаете AnalogReference() ? - у вас в коде нет чтения аналоговых портов, поэтому референс ни на что не влияет.

и еще интересны строчки 42, 43. 69... они вообще компилиются?

AnalogHiRes potentiometer(A0, 1) и

Analog potentiometerA1(A1, MIDI_CC::Channel_Volume, 1) -

ф-ции из б-ки MIDI_Controller.h - читают А0 и А1

Компиляция проходит без вопросов.

RocktorT
Offline
Зарегистрирован: 08.09.2021

Проверил на другой Pro Micro, из той же партии, минимальный скетч работает как с  analogReference(INTERNAL); так и без
 

void setup() {
  analogReference(INTERNAL);
 
  pinMode(5, OUTPUT);   // D5 как выход
}
void loop() {
  // ШИМ на 5 пин, 1023/4 = 255 - перевели диапазон
  analogWrite(5, analogRead(0) / 4);
  delay(10);
}

 

void setup() {
  pinMode(5, OUTPUT);   // D5 как выход
}
void loop() {
  // ШИМ на 5 пин, 1023/4 = 255 - перевели диапазон
  analogWrite(5, analogRead(0) / 4);
  delay(10);
}

Значит, дело в чем-то другом. Понимаю, что в моем коде черт ногу сломит, потому, думаю тему можно закрыть. Прошу пардону за отнятое время на базар.

b707
Онлайн
Зарегистрирован: 26.05.2017

RocktorT пишет:

Понимаю, что в моем коде черт ногу сломит, потому, думаю тему можно закрыть. Прошу пардону за отнятое время на базар.

проверяйте по частям. Для начала я бы выкинул все, связанное с NRF, так как скорее всего оно не причем. Удаляйте радио и смотрите - пропадет проблема или нет. Думаю. дело в Миди

RocktorT
Offline
Зарегистрирован: 08.09.2021

b707 пишет:

проверяйте по частям. Для начала я бы выкинул все, связанное с NRF, так как скорее всего оно не причем. Удаляйте радио и смотрите - пропадет проблема или нет. Думаю. дело в Миди

Не-не, радио работает, с него данные передаются на 5 пин как шим. Короче, оставляю все как есть, хотел повысить стабильность, не судьба.

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

Явной связки АЦП и PWM я не припоминаю. Возможно, что в библиотеках накручено. Хотя, опять же - что? Только если таймеры переназначаются. Я бы перекинул функционал на другой пин с другим таймером для быстротеста.

b707
Онлайн
Зарегистрирован: 26.05.2017

RocktorT пишет:

Не-не, радио работает, с него данные передаются на 5 пин как шим.

я правильно догадался, что пин 5 и пин А0 (или А1) у вас соединены перемычкой? с радио вы передаете данные на пин 5 как ШИМ, а потом читаете этот сигнал как аналоговый для передачи в Миди?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

я правильно догадался

Неправильно! Правильно было в постах #1 и #3

ЕвгенийП пишет:
И схемы, заодно - что там и как подключено к пинам 5 и A0/A1
ЕвгенийП пишет:
Кстати, схема тоже не помешает.

Но, для ТС, как выяснилось, это

RocktorT пишет:

чересчур трудоемко

:-(

b707
Онлайн
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Но, для ТС, как выяснилось, это чересчур трудоемко

есть подозрение-  ему просто стыдно показывать свою схему :)

RocktorT
Offline
Зарегистрирован: 08.09.2021

b707 пишет:

ЕвгенийП пишет:

Но, для ТС, как выяснилось, это чересчур трудоемко

есть подозрение-  ему просто стыдно показывать свою схему :)

Ну, есть такое дело))
Там не перемычка (шим же интегрировать надо), а оптрон "лампа>транзистор"
Это, конечно же, доставание левого уха правой ногой, но работает. Проще было бы, как я писал, напрямую передать данные на USB, как МИДИ, но не знаю, как.

RocktorT
Offline
Зарегистрирован: 08.09.2021

В MIDI_Controller.h такой ф-ции не предусмотрено, а MIDI.h - сильно сложная, не с моими программерскими способностями там разбираться.

b707
Онлайн
Зарегистрирован: 26.05.2017

RocktorT пишет:

Проще было бы, как я писал, напрямую передать данные на USB, как МИДИ, но не знаю, как.

посмотреть исходники классов

AnalogHiRes и Analog

из библиотеки MIDI_Controller.h - не предлагать?

RocktorT
Offline
Зарегистрирован: 08.09.2021

b707 пишет:

посмотреть исходники классов

AnalogHiRes и Analog

из библиотеки MIDI_Controller.h - не предлагать?


Ну вот, началось)))