Вывод TX остается горящим после снятия регулятора напряжения

Чтобы сэкономить электроэнергию, я снял линейный регулятор со своего клона Arduino Nano и запитал его через контакт 5 В от регулируемого источника (перезаряжаемого USB-зарядного устройства для телефона). Однако я заметил, что удаление линейного регулятора приводит к тому, что вывод TX остается включенным все время, что приводит к тому, что мой телефон не может взаимодействовать с модулем Bluetooth HC05, хотя он подключается нормально. Я проверил, что вывод TX не вызван Serial.print, и заметил такое же поведение на всех Nano, из которых я удалил линейные регуляторы. Nano, которые я тестировал с линейным регулятором, работают нормально, хотя они потребляют больше энергии, чем мне хотелось бы. Я пытался сбросить настройки устройства, но проблема не устранена.

Мне интересно, что является причиной этого? Разве питание через вывод 5 В не предполагает обхода регулятора? Итак, что может привести к тому, что отсутствующий регулятор повлияет на вывод TX? К сожалению, у меня недостаточно опыта, чтобы соединить точки с помощью схемы, поэтому я надеялся, что кто-нибудь сможет мне помочь.

Хотя я не уверен, поможет ли это, я включил свой скетч ниже. По сути, я использую ультразвуковой датчик для связи расстояния с моим телефоном по Bluetooth. Он также воспроизводит музыку, когда обнаруживает движение (с помощью датчика PIR). Поскольку приложение предназначено для использования на открытом воздухе, я питаюсь от аккумулятора и стараюсь свести к минимуму потребление энергии. Я снизил его до ~ 4 мА, сняв линейный регулятор.

#include <avr/sleep.h>

#define bluetoothIntPin 2
#define pirInterruptPin 3
volatile int state = 0;

int bt_pin = 9;
int pirPin = 8;
int stateData = 0;
int ultraPin = 10;
int trigPin = 11;    // Триггер
int echoPin = 12;    // Echo
int piezoPin = 5;
long duration, cm;
unsigned char inches;
unsigned long timer;
volatile bool signalReceived = false;
volatile bool pirSignalReceived = false;
bool toggle_pir = false;
int incomingByte = 0;
bool song_in_progress = false;
int song_type = 69;

int nokia_melody[] = {

  // Рингтон для Nokia 
  // Оценка доступна по адресу https://musescore.com/user/29944637/scores/5266155
  
  NOTE_E5, 8, NOTE_D5, 8, NOTE_FS4, 4, NOTE_GS4, 4, 
  NOTE_CS5, 8, NOTE_B4, 8, NOTE_D4, 4, NOTE_E4, 4, 
  NOTE_B4, 8, NOTE_A4, 8, NOTE_CS4, 4, NOTE_E4, 4,
  NOTE_A4, 2, 
};



void setup() {
  pinMode(13, OUTPUT); //установить вывод 13 в качестве выходного
  pinMode(ultraPin, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(pirPin, OUTPUT);
  pinMode(echoPin, INPUT);  
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(bt_pin, HIGH);
  digitalWrite(bluetoothIntPin, HIGH);
  digitalWrite(pirInterruptPin, HIGH);
  digitalWrite(ultraPin, LOW);
  digitalWrite(pirPin, LOW);
  Serial.begin(9600); // Скорость связи по умолчанию модуля Bluetooth
  attachInterrupt(digitalPinToInterrupt(bluetoothIntPin), bluetooth_interrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(pirInterruptPin), pir_interrupt, CHANGE);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_cpu();
}

void pir_interrupt(){
  // воспроизведение звукового эффекта
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(5000);
  digitalWrite(LED_BUILTIN, LOW); 
  pirSignalReceived = true;
}

void bluetooth_interrupt(){
  state = !state;
  signalReceived = true;
}

void play_song(int melody[], int notes){
      // sizeof задает количество байтов, каждое значение int состоит из двух байтов (16 бит).
    // для каждой ноты существует два значения (высота тона и длительность), поэтому для каждой ноты имеется четыре байта
    
    // при этом вычисляется длительность целой ноты в мс
    song_in_progress = true;
    int wholenote = (60000 * 4) / tempo;
    
    int divider = 0, noteDuration = 0;
    for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) {

    // вычисляет длительность каждой ноты
    divider = melody[thisNote + 1];
    if (divider > 0) {
      // обычное примечание, просто продолжайте
      noteDuration = (wholenote) / divider;
    } else if (divider < 0) {
      // пунктирные ноты представлены с отрицательной длительностью!!
      noteDuration = (wholenote) / abs(divider);
      noteDuration *= 1.5; // увеличивает длительность в два раза для точечных заметок
    }

    // мы воспроизводим ноту только 90% длительности, оставляя 10% в качестве паузы
    tone(piezoPin, melody[thisNote], noteDuration * 0.9);

    // Дождитесь заданной продолжительности, прежде чем играть следующую ноту.
    delay(noteDuration);

    // остановите генерацию сигнала перед следующей нотой.
    noTone(piezoPin);
  }
  song_in_progress = false;
}

void play_tone_once(){
  if (!song_in_progress){
     if (song_type==69){
      int notes = sizeof(nokia_melody) / sizeof(nokia_melody[0]) / 2;
      play_song(nokia_melody, notes);
    }
    if (song_type==79){
      int notes = sizeof(starwars_melody) / sizeof(starwars_melody[0]) / 2;
      play_song(starwars_melody, notes);
    } 
  }
}

void loop() {
  if (signalReceived){
    sleep_disable();
    Serial.write(50);
    delay(500);
    timer = millis();
    digitalWrite(ultraPin, HIGH);
    digitalWrite(pirPin, HIGH);
    while (true){
        digitalWrite(trigPin, LOW);
        delayMicroseconds(2);
        digitalWrite(trigPin, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigPin, LOW);
        pinMode(echoPin, INPUT);
        duration = pulseIn(echoPin, HIGH);
        cm = (duration / 2) / 29.1;   // Разделить на 29,1 или умножить на 0,0343
        inches = (duration / 2) / 74; // Разделить на 74 или умножить на 0,0135
        Serial.write(inches);
        delay(50);
        incomingByte = Serial.read();
        if (pirSignalReceived){
          play_tone_once();
          pirSignalReceived = false;
        }
        else if (incomingByte == 69){ // автоматический pir
          song_type = 69; //nokia
        }
        else if (incomingByte == 79){
          song_type = 79; // звездные войны
        }
        else if (incomingByte == 89){
          toggle_pir = !toggle_pir;
          if (toggle_pir){
            digitalWrite(pirPin, HIGH); // автоматизировать тон
          } else {
            digitalWrite(pirPin, LOW); 
          }
        }
        else if (incomingByte == 99){
          digitalWrite(pirPin, LOW); 
          play_tone_once();
        }
        if (incomingByte != 49 && incomingByte!=69 && incomingByte != 79 && incomingByte != 89 && incomingByte != 99){
          // получение от android
          unsigned long timeElapse = millis() - timer;
          if (timeElapse > 7000) {
            break; // выход и СОН
          } 
        }
        else {
            // сброс таймера
            timer = millis();
          }
  }
  digitalWrite(pirPin, LOW);
  digitalWrite(ultraPin, LOW);
  digitalWrite(LED_BUILTIN, LOW);
  signalReceived = false;
  sleep_enable();
  sleep_cpu();   
  }
}

, 👍0

Обсуждение

вы внесли аппаратные изменения в плату ... пожалуйста, предоставьте принципиальную схему платы, а не список программ, @jsotola


1 ответ


Лучший ответ:

1

Мой Нано-клон, похоже, той же марки, что и ваш. Конечно, его нижняя сторона выглядит идентично. На моем клоне, и я полагаю, на вашем, светодиод TX подключен следующим образом

5V -- RESISTOR -- LED -- TXD/D1

Узел 5V - это просто вывод 5V, на который подается напряжение шины USB через диод или с выхода регулятора напряжения AMS1117. Последовательный сигнал TX уровня TTL работает на холостом ходу на высоком уровне и пропускает ток через светодиод при передаче начального бита и младших битов данных. Кстати, светодиод RX подключен таким же образом. В отличие от этого, официальный Nano использует FTDI с выделенными светодиодными выводами.

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

,

Можно ли обойти регулятор, соединив входные и выходные контакты регулятора напряжения вместо того, чтобы полностью распаять его?, @I Like

Это своего рода новый вопрос, но я просто скажу вот что: если смысл в том, чтобы регулятор не использовал какой-либо ток, я не думаю, что это поможет. Возьмем, к примеру, все, что он использует внутри для определения опорного напряжения. Это каким-то образом связано с входом (и в сценарии, который вы также описали, с выходом) и gnd. Если вы можете найти схему платы, я бы добавил ее к вашему вопросу, как упоминал jsotola., @timemage

Спасибо. вы правы в том, что я, вероятно, перепутал схему. Я распаял только ножки регулятора (исключая радиатор) и избежал скрытых следов., @I Like

Я так понимаю, вы говорите это для того, чтобы показать, что таким образом добились определенного успеха., @timemage

в основном для подтверждения вашего ответа, но да, я действительно обошел регулятор, @I Like