Проблемы с запуском нескольких Arduino от одного контакта HC-05 Tx

TL;DR: Несколько Arduino, слушающих одну последовательную шину, сжигают TX-контакт моего HC-05. Arduino пропускают напряжение на сигнальную шину. Как мне это остановить или изолировать, чтобы не сжечь TX-контакт Bluetooth?

Я пытаюсь построить светодиодный трековый светильник, который использует HC-05 для связи с 8 Arduinos для управления в общей сложности 16 светодиодами. Каждый Arduino может управлять только 2 светодиодами из-за формы и форм-фактора проекта.

Трасса имеет 3 рельса, 12 В, заземление и сигнал, и все Arduino используют одни и те же рельсы. Надеюсь, схема ниже хорошо это объясняет.

Все Arduino имеют общую землю, 12 В и линию данных

К моей проблеме. Изначально я получал почти 5 В с моего контакта 7 (контакт SoftwareSerial) на Arduinos, что тихо портило контакт TX на моем HC-05. Я снизил его примерно до 1 В после использования pinMode(bluetoothTx, INPUT);, что хорошо, но недостаточно. Это напряжение начинает накапливаться по мере того, как я добавляю все больше и больше Arduinos в общую установку.

Мое решение в теории — добавить диоды к контакту 7 на Arduino, чтобы они не могли подавать напряжение на сигнальную шину. Это падает на 0,7 В, исходя из того, что я читал, что, скорее всего, и является причиной того, что Arduino сейчас не считывают сигнал, потому что это падает ниже требуемого логического уровня, поскольку HC-05 выдает только 3v3. Поэтому я думаю, что если добавить преобразователь уровня на HC-05, чтобы поднять сигнал до 5 В, то падение напряжения на диоде не должно иметь значения, верно? Смотрите схему ниже.

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

Мое решение кажется излишне запутанным, и я даже не знаю, сработает ли оно. Чем больше я читаю, не переспрашивая информацию у других, тем больше запутываюсь. Теперь, после того как я час переформатировал этот пост, я думаю о разделительном конденсаторе между выводом и землей... Даст ли это тот эффект, который я ищу?

Я также рассматривал возможность использования резистора pulldown, но из всего, что я видел (и из первого курса по электронике, который я прошел), это кажется неподходящим решением. В примерах, которые я видел, обычно используется переключатель, что имеет смысл, но для моего приложения я защищаю вывод TX на моем HC-05, поэтому я думаю, что это не даст нужного мне эффекта (отключение линии между резистором и выводом не изолирует напряжение, а отключение после резистора закоротит сигнал на землю).

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

#include <EEPROM.h>
#include <SoftwareSerial.h>

byte address = 1; //change this to change light address
byte lightno = (address + 1); // variable to print light number
int addressShifter= ((address)*500); //This number will be subtracted from input
int bluetoothTx = 7; //btTX to pin 7 //input from HC-05
int bluetoothRx = 8; //btRX to pin 8 //not used
int led1 = 3; // the PWM pin LED1 is attached to
int led2 = 5; // the PWM pin LED2 is attached to
int brightness1 = EEPROM.read(0); //Recalling previous setting
int brightness2 = EEPROM.read(1); //Recalling previous setting
int thismodMin = (0 + addressShifter); //min two-byte looked for
int thismodMax = (499 + addressShifter); //max two-byte looked for

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); //naming it bluetooth and assigning it to the variables shown

void setup() {
    pinMode(led1, OUTPUT); // sets the pin as output
    pinMode(led2, OUTPUT); // sets the pin as output
    pinMode(bluetoothTx, INPUT); // sets the pin as input
    //Setup usb serial connection to computer
    Serial.begin(9600);
    //Setup Bluetooth serial connection to android
    bluetooth.begin(9600);
    analogWrite(led1, brightness1); //Set Led brightness from stored values
    analogWrite(led2, brightness2); //Set Led brightness from stored values
    Serial.println("SETUP COMPLETE, I am Light #"); //Identify self
    Serial.println(lightno);
    Serial.println("expecting Min "); //Min value listened for
    Serial.println(thismodMin);
    Serial.println("expecting Max "); //Max value listened for
    Serial.println(thismodMax);
}

void loop() {
    //---------Serial Communication---------
    if(bluetooth.available()>= 2) {
        unsigned int blu1 = bluetooth.read();
        unsigned int blu2 = bluetooth.read();
        unsigned int blueinput = (blu2 *256) + blu1;
        //I don't know why any of the above is neccesary but it will not read correctly without this conversion
        //Serial.println("blueinput = "); Not used
        //Serial.println(blueinput);  Not used
        if (((blueinput) >= (thismodMin)) && ((blueinput) < (thismodMax))){
            //If this blueinput is within this modules adress range, convert signal to PWM
            int thisMod = ((blueinput) - (addressShifter));
            //Convert blueinput to a value this module will work with (0-500)
            //-----------Lights---------
            if (((thisMod) >= 0) && ((thisMod) < 100)){ //0=off 1-100=on-Bright
                brightness1 = ((thisMod)*2.55); //converts percentage brightness to PWM value
                analogWrite(led1, brightness1); //apply brightness
                //      Serial.println("brightness1: "); //diagnostics
                //      Serial.println(brightness1); //diagnostics
                delay(10);
            } else if (((thisMod) >= 101) && ((thisMod) < 201)){ //101=off 102-201=on-Bright
                brightness2 = (((thisMod)-101)*2.55); //subtract starting value and then convert percentage brightness to PWM value
                analogWrite(led2, brightness2); //apply brightness
                //      Serial.println("brightness2: "); //diagnostics
                //      Serial.println(brightness2); //diagnostics
                delay(10);
            } else if ((thisMod) == (399)){ //if specific code recieved
                EEPROM.write(0, brightness1); //store brightness setting for light 1
                Serial.println("Epprom1 written");
            } else if ((thisMod) == (424)){
                EEPROM.write(1, brightness2); //store brightness setting for light 2
                Serial.println("Epprom2 written");
            } else{}
        }
    }
}

, 👍4


1 ответ


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

2

Прежде всего, просто чтобы прояснить некоторые вещи.

Библиотека softwareSerial устанавливает PinMode для объявленных контактов rx, tx внутренне, поэтому это не должно оказывать никакого влияния на измеряемые вами напряжения, если вы включите pinMode(bluetoothTx, INPUT);, и если это происходит, как вы описываете, это указывает на проблему.

контакт, объявленный как ВХОД, находится в состоянии высокого импеданса, что означает, что он (в общем случае) не будет влиять на сигналы, подключенные к нему.

контакт RX по умолчанию подтянут, что означает, что когда к нему ничего не подключено, вы должны измерить 5 В, а когда вы подключаете его к GND, вы должны увидеть 0 В.


Я попытался воспроизвести вашу проблему, реализовав вашу первую схему, используя 3 Arduino в качестве приемников, с той разницей, что вместо HC-05 я использовал еще одну Arduino в качестве передатчика и использовал упрощенную версию вашей программы (см. ее ниже). Я не смог это воспроизвести. Также я подозреваю, что проблема может быть в параллельных подтягивающих резисторах от ~8 ардуино, поэтому я бы предложил:

  • убедитесь, что связь между HC-05 и только одной платой Arduino работает.
  • попробуйте подключить HC-05 к двум Arduino и посмотрите, смогут ли обе Arduino считывать входящие данные.
  • продолжайте добавлять Arduino и проверять, может ли каждый Arduino считывать входящие данные.

Также попробуйте использовать другой Arduino в качестве передатчика вместо HC-05, если проблема все еще существует, и опубликуйте результаты, чтобы мы могли продолжить исследование.

#include <SoftwareSerial.h>


int bluetoothTx = 7;    //btTX к контакту 7 //вход от HC-05
int bluetoothRx = 8;    //btRX к контакту 8 //не используется

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);  //называем его bluetooth и назначаем его показанным переменным

void setup()
{
        //Настройка последовательного USB-подключения к компьютеру
        Serial.begin(9600);

        //Настройка последовательного соединения Bluetooth с Android
        bluetooth.begin(9600);

        Serial.println("SETUP COMPLETE, I am Light #");  //Идентифицирую себя
}

void loop()
{
        //---------Последовательная связь------
        if(bluetooth.available() )
        {
             Serial.print(bluetooth.read(),HEX );
        }

}
,