Arduino Uno — внешнее питание работает неправильно
Я новичок в Arduino и создал свой первый проект. В проекте используется датчик ближнего действия Sharp и плата светодиода 7 сегментов (http://embedded-lab.com/blog/new-version-of-max7219-based-4-digit-serial-seven-segment-led-display/) для подсчета объектов.
Все работает нормально, когда я подключаю USB к компьютеру или использую сетевой адаптер 5 В 1 А с USB-кабелем. Проблема возникает, когда я использую внешний адаптер питания или источник постоянного тока к Vin. Плата включается, и я измерил выходное напряжение на выводе 5 В, и оно составляет около 4,8 В.
Датчик Sharp подключен к аналоговому входу A0, и я вижу колебания напряжения при прохождении объекта, но светодиод не отображает значение при внешнем питании. Дисплей подключен к GRD, 5v, где контакты DIN, CLK и LOAD дисплея подключены к контактам 7, 6 и 5, как указано в инструкции.
Я попробовал две разные платы Arduino и несколько разных адаптеров питания переменного тока в постоянный в диапазоне от 9 В до 12 В, а также использовал источник питания постоянного тока для Vin, и результаты были такими же.
Код ниже довольно прост (хотя я уверен, что есть способ сделать это гораздо лучше, но это мой первый проект на языке C, так что не судите строго, да и функция для цифр взята с веб-сайта, а не написана мной).
Если вам поможет фотография проекта, я могу ее загрузить.
Есть идеи или мысли? Спасибо, Стив
#include "LedControl.h"
#include <stdio.h>
#include <math.h>
// Arduino Pin 7 к DIN, 6 к Clk, 5 к LOAD, количество устройств равно 1
LedControl lc = LedControl(7, 6, 5, 1);
int sensorpin = 0; // аналоговый вывод, используемый для подключения датчика резкости
int val = 0; // переменная для хранения значений с датчика (изначально ноль)
int cnt = 1;
void setup()
{
// Инициализируем устройство MAX7219
lc.shutdown(0, false); // Включить дисплей
lc.setIntensity(0, 10); // Установить уровень яркости (0 — минимум, 15 — максимум)
lc.clearDisplay(0); // Очистить регистр дисплея
}
void loop()
{
val = analogRead(sensorpin); // считывает значение датчика sharp
if (val >= 650)
{
//записать значения в светодиод
if (cnt<=9)
{
lc.setDigit(0, 0, cnt, false); // Отображение 4 в цифрах 1-9, " "
}
if (cnt >= 10 && cnt <= 99)
{
lc.setDigit(0, 0, getDigitFromNum(cnt,0), false); // Отображение 4 в цифрах 1-9, " "
lc.setDigit(0, 1, getDigitFromNum(cnt, 1), false); // Отображение 3 в цифрах 1-9, " "
}
if (cnt >=100)
{
lc.setDigit(0, 0, getDigitFromNum(cnt, 0), false); // Отображение 4 в цифрах 1-9, " "
lc.setDigit(0, 1, getDigitFromNum(cnt, 1), false); // Отображение 3 в цифрах 1-9, " "
lc.setDigit(0, 2, getDigitFromNum(cnt, 2), false); // Отображение 2 в цифрах 1-9, " "
}
delay(400);
cnt++;
}
}
// Функция: getDigitFromNum возвращает цифру по заданному индексу целого числа.
// Идет справа налево с начальным индексом 0.
int getDigitFromNum(int num, int digit) {
num /= pow(10, digit);
return num % 10;
}
// Функция: getDigitFromDec возвращает цифру по заданному индексу числа double.
// Идет слева направо с начальным индексом 0.
int getDigitFromDec(double dec, int digit) {
dec *= pow(10, digit);
return (int)dec % 10;
}
// Функция: getDigitFromNum возвращает десятичные значения числа двойной точности.
double getDecimals(double dec) {
return dec - (int)dec;
}
@, 👍2
Обсуждение1 ответ
Единственное различие между питанием от USB и питанием через гнездо типа «баррель» заключается в том, что напряжение снижается до 5 В с помощью регулятора напряжения с малым падением напряжения (LDO). Обычно это клон популярного LM1113-50, а его пропускная способность варьируется от 500 мА до 1 А.
Я заметил, что ваша плата не является подлинной Arduino, поэтому используемые компоненты могут быть из более дешевого диапазона. Поэтому мы предположим, что низкосортный LDO, который обрабатывает только 500 мА до перехода в режим теплового отключения с хорошим теплоотводом. Поскольку на этих платах его нет, мы предположим, что максимум 400 мА, прежде чем он станет слишком горячим. Вероятно, несколько консервативно.
Таким образом, если вся ваша схема потребляет более 400 мА, вы можете ожидать, что регулятор отключится или, по крайней мере, снизит доступный ток и/или напряжение.
Тот факт, что вы видите 4,8 В вместо 5 В, может быть признаком того, что происходит падение напряжения, т. е. регулятор не может обеспечить достаточный ток, поэтому напряжение падает. Это будет сопровождаться сильным нагревом регулятора.
Регулятор — это устройство с 3 штырьками на правой стороне и одной защелкой слева, прямо над гнездом для бочкообразного разъема. Посмотрите, как жарко становится.
Как правило, если вы можете держать на нем палец и не плакать в течение 10 секунд, значит, он не слишком горячий.
Еще одна вещь, которую вы можете сделать, это сократить вашу схему до минимума. Отключите абсолютно все и загрузите пример скетча Blink. Подключите его к внешнему источнику постоянного тока и посмотрите, мигает ли светодиод. Если это так, то блок питания работает нормально. Затем вы можете добавлять периферийные устройства по одному, чтобы увидеть, когда он выйдет из строя.
Если он не мигает, значит, с поставкой что-то изначально не так.
Одной из возможностей является то, что LDO колеблется из-за недостаточных или неправильных входных и выходных конденсаторов. По сути, это означает, что напряжение "5 В", которое он выдает, на самом деле дико колеблется между, скажем, 4,5 В и 5 В или 4,75 В и 5,25 В, что действительно сбивает с толку микроконтроллер. Дешевые LDO часто более чувствительны к конденсаторам, с которыми они соединены, и могут страдать от такого рода проблем.
Чтобы диагностировать такую проблему, вам действительно понадобится доступ к осциллографу для анализа напряжения.
Если он колеблется, керамический конденсатор емкостью 10 мкФ, подключенный между двумя нижними контактами LDO (как показано на вашей картинке — это Vout и GND), может вылечить это. Конденсатор поверхностного монтажа 1206 хорошо подходит к этим контактам и его довольно легко припаять вручную. Вы также можете попробовать сквозной конденсатор (снова керамический) между 5 В и GND на разъеме питания, но вы действительно хотите, чтобы он был как можно ближе к LDO, поэтому лучше всего припаять его напрямую к контактам LDO.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Может быть, слишком много шума или нагрузки на 5-вольтовый регулятор? Сколько энергии вы потребляете? И что плохого в том, чтобы просто использовать USB-блок питания? Они дешевые и их легко найти., @cde
А хорошая, ясная картинка и схема всегда помогают., @cde
Достаточно ли у вас тока? Что делать, если ваши блоки питания просто слишком слабы по току - не могут работать должным образом, потому что arduino не может получить достаточно тока для питания всего? Просто попробуйте (если у вас есть) что-то с 12 В и 1 А. Этого должно быть более чем достаточно, но... по крайней мере, попробуйте., @Jakey
Хорошо. А что если (я знаю, что это не рекомендуется, но) вы подключите +5 В к выводу 5 В на arduino? Просто попробуйте. С другой стороны: Почему бы вам (в этом случае) просто не запитать Arduino от USB-зарядного устройства телефона? Просто подключите кабель usb A -> usb B, и все готово., @Jakey
Контакт 5 В — это выход напряжения. Но если вы подключите питание 5 В к этому контакту, arduino должен включиться. Это нехорошо для 7805, но если вы попробуете это в течение 3 секунд, это не принесет никакого вреда. О внешнем напряжении: попробуйте подключить аккумулятор (или зарядное устройство) к разъему постоянного тока слева от разъема USB (соблюдайте полярность!). Сообщите результаты позже. Это не должно сильно отличаться, но в этом случае мы просто дадим пинка в темноте. PS: Просто измерьте напряжение батареи/блока питания (НЕ USB!) для уверенности. Просто чтобы убедиться, что он выдает столько, сколько должен (или хотя бы 7 В, но лучше больше 9 В)., @Jakey
@Jakey
Это нехорошо для 7805, но если вы попробуете это в течение 3 секунд, это не принесет никакого вреда.
Вы несете чушь. Во-первых, нет никакого "7805", а во-вторых, LDO, который там есть, не дает ни малейшего повода для беспокойства. Питание не имеет понятия "вход" или "выход" - оно просто существует. Единственная возможная опасность - если вы питаете через 5 В и пытаетесь вытянуть ток из VIN для питания чего-либо - тогда он может течь обратно через регулятор. Кроме этого, питание через 5 В совершенно допустимо., @Majenko