Электротранспорт

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск    

Новости:

Страницы: 123 ... 26>>Вниз

Автор Тема: Моргалка на Arduino. Этюды для начинающих.  (Прочитано 11797 раз)

0 Пользователи и 1 Гость просматривают эту тему.

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
          Предлагаю вариант моргалки для зарядки и восстановления аккумуляторов. Разработана на ардуино нано. В качестве ключа использован транзистор IRL3713 (30В, 260А, 3 мОм).

         Возможности: регулируемый цикл заряд пауза (в секундах) и несущей частотой (1-350 Гц). При достижении напряжения отсечки (14,4В) происходит уход в паузу отсечки на настраиваемое время.

Что нужно:
1. Ардуино
Я использовал самую дешевую, программируюмую непосредственно через microUSB. Стоимость - 200 руб., доставка 20 дней до России.


2. Программа для загрузки программ в ардуино с сайта arduino.cc - она стандартна и незамысловата, ничего сложного нет.
    Вкладка Software - Download the Arduino IDE.

3. Драйвер для работы с платой ардуино
В моем случае это CH340 - устанавливаем один раз.

Скрытый текст
* DRIVER-CH340G.rar (69.58 кБ - загружено 37 раз.)


Название загрузчика, для которого устанавливается драйвер обычно пишут в описании к ардуино.



4. Программа моргалки:

Скрытый текст

// Общие настройки - Несущая частота
float freq = 35.00; // частота в Гц (от 1 до 350)
float skv1 = 50.00; // коэффициент заполнения (от 1 до 99)

// 1 этап Модулирующие импульсы
long zar1 = 30; // время заряда в сек (от 1 сек)
long pauseosn1 = 10; // время паузы в сек (от 1 сек)

// 2 этап работа отсечки
float Uots = 14.40; // напряжение отсечки
long pauseots1 = 30; // время паузы в сек (от 1 сек)
float koeffU = 0.0276391555; //коэффициент делителя напряжения - подобрать опытным путем, чтобы отсечка срабатывала при Uots

float Uots1 = Uots/koeffU*10;
float impnes1 = 0.00;
float pausenes1 = 0.00;
long previousMillis = 0;
float Utek = 0.00;

void setup()
{
   pinMode(13, OUTPUT); // используем 13 выход для управления ключом, на нем также висит синий светодиод, располагающийся на плате, для наглядности
   pinMode(10, OUTPUT); // внешний светодиод
   impnes1 = 10 * skv1 / freq; // расчет импульса заряда несущей частоты
   pausenes1 = 10 * (100 - skv1) / freq; // расчет паузы несущей частоты
}
void loop()
{
label2:
// расчет основного цикла заряд/пауза
unsigned long currentMillis = millis();
 if (currentMillis - previousMillis > zar1*1000) // если время заряда истекло
 {
    digitalWrite(13, LOW); // выключаем ключ
    digitalWrite(10, LOW); // выключаем внешний светодиод
    delay (pauseosn1*1000); // пауза основного цикла
    currentMillis = millis();
    previousMillis = currentMillis;
 }
// работа импульсов несущей частоты
  digitalWrite(10, HIGH); // включаем внешний светодиод
  digitalWrite(13, HIGH); // включаем ключ
  delay(impnes1 );                     
  Utek=0;
  for (int i = 0; i <10; i ++)  Utek+=analogRead(A3); // измеряем напряжение на входе А3 10 раз подряд и прибавляем друг к другу
  if (Utek > Uots1) // если измеренное напряжение больше напряжения отсечки
{
goto label1; // перейти на паузу отсечки
}
  digitalWrite(13, LOW); // отключаем ключ
  delay( pausenes1 );
  goto label2; // пропустить паузу отсечки
label1:
    digitalWrite(13, LOW); // выключаем ключ
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (200);
    digitalWrite(10, HIGH); // включаем внешний светодиод
    delay (200);
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (200);
    digitalWrite(10, HIGH); // включаем внешний светодиод
    delay (200);
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (200);
    digitalWrite(10, HIGH); // включаем внешний светодиод
    delay (200);
    digitalWrite(10, LOW); // отключаем внешний светодиод
    delay (pauseots1*1000-1200); //пауза после отсечки минус 1,2 сек (мигание светодиода)
    currentMillis = millis();
    previousMillis = currentMillis;
}

Первые семь строк - настройка программы.
Программа проверена, работает.

5. Схема.
Ключ заряда (порт D13), ключ разряда (порт D4), делитель напряжения (порт А3), внешний светодиод (порт D10).
Внешний светодиод - горит при заряде постоянно.
При достижении напряжения отсечки - мигает три раза и выключается.
Порты А4 и А5 остаются свободными для подключения в будущем устройств по i2c шине, например, двухстрочного экрана. В ардуино нано порт А4 - SDA, порт А5 - SCL.
Кнопка и разрядный ключ тоже пока не используются.

Скрытый текст

* прсхема080417.rar (81.52 кБ - загружено 38 раз.)


6. Печатная плата (45х65 мм).

Скрытый текст

* ПП Моргалка ардуино 080417.rar (11.98 кБ - загружено 40 раз.)


Т.о. в моем примере время заряда - 30 сек, паузы 10 сек, несущая частота 35Гц с коэффициентом заполнения 50%. При достижении напряжения 14,4В на АКБ происходит уход в паузу на 30 сек.



Еще один вариант моргалки от
« Последнее редактирование: 01 Ноя 2017 в 14:12 от Яков93 »

UriBas

  • Местный
  • ****
  • Репутация:
    +6/-0
  • :
    234
    353
  • Сообщений: 924
  • Украина, Ровно
  • Ездю на батарейках!
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #1 : 19 Мар 2017 в 20:07 »
, хорошая идея - реализовать на Ардуино моргалку", - ОТКРЫТЫЙ ПРОЕКТ которая уже давно летает" тут в воздухе" и видимо созрела.. 
На всяк случай продублирую (некоторые) наработки на 7апр2017 всего 20стр
Схема - Ответ #295 : 30 Мар 2017 стр 18 http://electrotransport.ru/ussr/index.php?msg=1052002
Скрытый текст
Плата - Ответ #340    стр 19  Печ плата версия со светодиодом  Размер платы 45 х 65 мм  http://electrotransport.ru/ussr/index.php?msg=1056894 
Скрытый текст
Скетч - Ответ #122 : 25 Мар 2017 стр 7  http://electrotransport.ru/ussr/index.php?msg=1047258
Скрытый текст
// Общие настройки - Несущая частота
float freq = 35.00; // частота в Гц (от 1 до 350)
float skv1 = 50.00; // коэффициент заполнения (от 1 до 99)

// 1 этап Модулирующие импульсы
long zar1 = 30; // время заряда в сек (от 1 сек)
long pauseosn1 = 10; // время паузы в сек (от 1 сек)

// 2 этап работа отсечки
float Uots = 14.40; // напряжение отсечки
long pauseots1 = 30; // время паузы в сек (от 1 сек)
float koeffU = 0.0276391555; //коэффициент делителя напряжения - подобрать опытным путем, чтобы отсечка срабатывала при Uots

float Uots1 = Uots/koeffU*10;
float impnes1 = 0.00;
float pausenes1 = 0.00;
long previousMillis = 0;
float Utek = 0.00;

void setup()
{
   pinMode(13, OUTPUT); // используем 13 выход для управления ключом, на нем также висит синий светодиод, располагающийся на плате, для наглядности
   pinMode(10, OUTPUT); // светодиод отсечка
   pinMode(12, OUTPUT); // светодиод заряд
   pinMode(0, INPUT); // вход A0 с делителя напряжения
   impnes1 = 10 * skv1 / freq; // расчет импульса заряда несущей частоты
   pausenes1 = 10 * (100 - skv1) / freq; // расчет паузы несущей частоты
}
void loop()
{
label2:
// расчет основного цикла заряд/пауза
unsigned long currentMillis = millis();
 if (currentMillis - previousMillis > zar1*1000) // если время заряда истекло
 {
    digitalWrite(13, LOW); // выключаем ключ
    digitalWrite(12, LOW); // выключаем светодиод заряд
    delay (pauseosn1*1000); // пауза основного цикла
    currentMillis = millis();
    previousMillis = currentMillis;
 }
// работа импульсов несущей частоты
  digitalWrite(12, HIGH); // включаем светодиод заряд
  digitalWrite(13, HIGH); // включаем ключ
  delay(impnes1 );                     
  Utek=0;
  for (int i = 0; i <10; i ++)  Utek+=analogRead(A0); // измеряем напряжение на входе А0 10 раз подряд и прибавляем друг к другу
  if (Utek > Uots1) // если измеренное напряжение больше напряжения отсечки
{
goto label1; // перейти на паузу отсечки
}
  digitalWrite(13, LOW); // отключаем ключ
  delay( pausenes1 );
  goto label2; // пропустить паузу отсечки
label1:
    digitalWrite(13, LOW); // выключаем ключ
    digitalWrite(12, LOW); // отключаем светодиод заряд
    digitalWrite(10, HIGH); // включаем светодиод отсечка
    delay (200);
    digitalWrite(10, LOW); // отключаем светодиод отсечка
    delay (200);
    digitalWrite(10, HIGH); // включаем светодиод отсечка
    delay (200);
    digitalWrite(10, LOW); // отключаем светодиод отсечка
    delay (200);
    digitalWrite(10, HIGH); // включаем светодиод отсечка
    delay (200);
    digitalWrite(10, LOW); // отключаем светодиод отсечка
    delay (pauseots1*1000-1000); //пауза после отсечки минус 1 сек (мигание светодиода отсечка)
    currentMillis = millis();
    previousMillis = currentMillis;
}
« Последнее редактирование: 18 Авг 2017 в 09:49 от UriBas »

mr.Dream

  • Старожил
  • *****
  • Репутация:
    +105/-2
  • :
    166
    633
  • Сообщений: 2660
  • Ternopil, Ukraine
  • Ездю на лифере :)
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #2 : 19 Мар 2017 в 20:19 »
Только не скважность, а коэфициент заполнения автор имел ввиду.
Скважность 50,00 это 1/50 времени периода, то есть 2%.
Если все таки имелось ввиду действительно скважность, прошу прощения. Просто часто замечаю подмену этих понятий, что приводит к путанице.

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #3 : 19 Мар 2017 в 20:30 »
Чтобы можно было потом разобраться что к чему.   Было бы хорошо в самом скетче, в заголовке, указывать последнюю дату обновления и описание алгоритма или ссылку..   
Отличное предложение, сейчас поправлю. Вообще моя версия, думаю это начало начал. Нужно дорабатывать ее, чтобы и измеритель напряжения был , например для остановки по верхней границе напряжения или по скорости изменения напряжения.

Только не скважность, а коэфициент заполнения автор имел ввиду.
Да, когда читал формулу, все перепутал, конечно коэффициент заполнения.

UriBas

  • Местный
  • ****
  • Репутация:
    +6/-0
  • :
    234
    353
  • Сообщений: 924
  • Украина, Ровно
  • Ездю на батарейках!
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #4 : 19 Мар 2017 в 20:52 »
  .. Вообще моя версия, думаю это начало начал.
Так и есть, вообще надо чтобы было несколько готовых версий, от очень простой (разумно) до ... скажем с наворотами, поэтому надо определится со стратегией.  1) Делаем минимально упрощенную версию, чтобы даже начинающий первоклашка или не электронщик (как в теме и указано) мог легко повторить...  поэтому надо максимально комментировать схему, алгоритм, скетч..  и прочее.   Далее уже по мере сложности..  но нужно сразу поставить цель с переспективой, что к примеру Вы хотели бы видеть в конечном варианте?
   Нужно дорабатывать ее, чтобы и измеритель напряжения был , например для остановки по верхней границе напряжения или по скорости изменения напряжения ...    Да, когда читал формулу, все перепутал, конечно коэффициент заполнения.
Да, будем говорить о коэф. заполнения, а не о скважности.   Конечно, без привязки к напряжению моргалка становится слишком уж ущербной и неоправданно дорогой..  т.е. типа получаем обычное реле, но только при наворотах с полевиками, с Мегой 328 с переходниками и пр.. 

« Последнее редактирование: 19 Мар 2017 в 21:05 от UriBas »

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #5 : 19 Мар 2017 в 21:10 »
В перспективе вижу добавить только делитель напряжения. Получается ардуино + выходной ключ и делитель напряжения. Больше ничего. Скорее всего предложат добавить второй ключ для разряда, логгер, wi-fi и т.д. Затем добавить пылесос, кофеварку и настольную лампу (простите за каламбур). Так обычно бывает на форумах, ищешь в интернете схему простой сигнализации, а получаешь, то, что будешь собирать 5 лет и не настроишь в конечном итоге, такие схемы я не рассматриваю. Поэтому хотел бы видеть простую, универсальную моргалку, легкую для повторения и с простыми пояснениями изменений настроек. Сложные, готовые и более эффективные устройства здесь на форуме уже есть.

UriBas

  • Местный
  • ****
  • Репутация:
    +6/-0
  • :
    234
    353
  • Сообщений: 924
  • Украина, Ровно
  • Ездю на батарейках!
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #6 : 19 Мар 2017 в 21:34 »
  В перспективе вижу добавить только делитель напряжения. ... Поэтому хотел бы видеть простую, универсальную моргалку, легкую для повторения и с простыми пояснениями изменений настроек. Сложные, готовые и более эффективные устройства здесь на форуме уже есть.
Понятно, в принципе на форуме есть уже подобные простые схемы, только на других процессорах (Тини13, Пики", ) Можно взять за основу
1) Схема только с делителем напр.
Скрытый текст
2) Схема с делителем и  разрядом
Скрытый текст
А как собираетесь выводить информацию?

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #7 : 19 Мар 2017 в 21:40 »
Спасибо за схемы.
А как собираетесь выводить информацию?
Можно на двухстрочный дисплей, с ними я работал, но т.к. я взят курс на максимальное упрощение, то скорее всего на светодиоды (заряд и отсечка по верхнему напряжению в перспективе).

Яков93

  • Модератор
  • Старожил
  • *
  • Репутация:
    +40/-16
  • :
    598
    889
  • Сообщений: 1426
  • Россия, Анапа
  • Питаюсь солнышком
  • Онлайн Онлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #8 : 19 Мар 2017 в 22:15 »
, если не ошибаюсь программа работает так
Заряд в течение 14 млс. (impnes1 = 10 * skv1 / freq;)
Отключение заряда в течение 14 млс. (pausenes1 = 10 * (100 - skv1) / freq;)
Получается частота действительно 35 Гц с заполнением 50%.

Каждые 30 секунд заряд отключается на 10 секунд.

Алгоритм мне кажется очень затяжной получается, может я и не прав.

По скетчу.
Скрытый текст
Вы используете много излишне тяжелых переменных - long и float где это не нужно. Единственное место где нужен long  в "previousMillis" и "currentMillis". В остальных местах можно использовать "int" или вообще "byte", они занимают в памяти МК меньше места. Float вообще для значений с запятой до фиг знает какого знака, а у Вас таких значений нет. Сейчас конечно проблем нет, т.к. скетч очень простой, Но если захотите в будущем приделать пылесос и кофеварку на все может не хватить памяти.

Плюс совсем не обязательно в цикле каждый раз проводить тяжелые вычисления деления/умножения чисел с плавающей точкой
impnes1 = 10 * skv1 / freq; // расчет импульса заряда
pausenes1 = 10 * (100 - skv1) / freq; // расчет паузы
Поставьте эти вычисления в самое начало, там где переменные объявляете. Они же все равно за время работы скетча не меняются, в самом начале программы они вычислятся один раз и этого хватит.

Да, и использовать delay() для таких огромных пауз как 10 секунд неправильно. Особенно если захотите прикрутить вольтметр нужно будет постоянное измерение как можно чаще. Вы же пользуетесь таймером
if (currentMillis - previousMillis > zar1*1000)
Такие же таймеры надо ставить и вместо этих могучих delay(10000).

Это конечно не требования, но пожелания.

Я тоже делаю подобные моргалки на свои ИБП.

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #9 : 19 Мар 2017 в 22:32 »
Отличные замечания! Вообще отказаться от delay - первостепенная задача, только я еще не разбирался. Оказывается еще можно и переменные упростить.

ihor

  • Старожил
  • *****
  • Репутация:
    +37/-2
  • :
    223
    591
  • Сообщений: 1234
  • LVIV-利沃夫
  • ТОП-4 рулит
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #10 : 20 Мар 2017 в 09:21 »
Тема хорошая и нужная :wow:, но только для "рукастых самодельщиков".
Почему? Навесным не сделаешь, травить паять.
                БП, абы какой не пойдет, проверено.
                "Плюшками"обрастет и к бабке не ходи...
З.Ы. Навеяло...где-то уже такое было...поискал, таки да, Сорока ранее такого типа тоже делал и более ранняя версия на светодиодах без БП была, но с егоной программой.

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #11 : 20 Мар 2017 в 10:13 »
Намечу первоначальный курс, чтобы не уходить в сторону.
Алгоритм
При включении моргалки 1 этап: настраиваемые времена заряд/пауза с несущей частотой.
При достижении напряжения на аккумуляторе 14,4В (это напряжение можно менять в настройках) - переход на 2 этап.
2 этап: при достижении 14,4В - отключение заряда на паузу, время которой можно установить в настройках.
По истечении паузы - опять заряд с несущей частотой до 14,4В.
Т.о. получается настраиваемые независимые времена для 1 и 2 этапов.
Думаю пока хватит.

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #12 : 20 Мар 2017 в 10:37 »
Настройки:

Общие
несущая частота
коэффициент заполнения

1 этап
время заряда
время паузы

2 этап
напряжение отсечки
время паузы

Добавлено 20 Мар 2017 в 10:42
Светодиоды:
Зеленый - горит во время заряда,
Красный - загорается на 1 сек. при достижении напряжения отсечки.

Попытаюсь написать программу и нарисовать схему для этого алгоритма, нужно немного времени.

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #13 : 20 Мар 2017 в 12:18 »
Цитата: UstAlexei
Предлагаю сразу же рассмотреть вопрос о выводе информации и изменении уставок напряжений / скважности и т.п. через терминал.
Сначала бы просто программу написать, потом будем дополнять
Цитата
И зачем в цикле вычислять то что и так постоянно (Ton / Toff) ?
Это замечание высказали уже, перенесу в начало программы

Яков93

  • Модератор
  • Старожил
  • *
  • Репутация:
    +40/-16
  • :
    598
    889
  • Сообщений: 1426
  • Россия, Анапа
  • Питаюсь солнышком
  • Онлайн Онлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #14 : 20 Мар 2017 в 14:12 »
          Предлагаю вариант моргалки для зарядки и восстановления аккумуляторов. Разработана на ардуино нано, можно использовать любую ардуино. В качестве ключа использована TLP250 и два транзистора IRL3713 (30В, 260А, 3 мОм).
Скетч дали, а схемку? Зачем, к примеру, там мосфеты аж на 260А, - где такой источник тока взять? И почему их сразу два?
Может также и драйвер TLP250 не нужен, это же IRL мосфеты, они и без драйвера просто от 4,5-5В полностью откроются

Просто подключаете затвор прямо к выходу ардуино через резистор 100 Ом и все должно работать. Гигантских напряжений на мосфете нет чтобы ардуино пробить, т.е. функция оптопары тоже не нужна.

Не скажу что в Вашем варианте делать невозможно, но можно ведь и еще проще и дешевле.
« Последнее редактирование: 20 Мар 2017 в 14:39 от Яков93 »

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #15 : 20 Мар 2017 в 14:48 »
IRL3713 с запасом взяты, можно и по-проще. Будем экспериментировать, вроде как TLP250 более резкий фронт делает.

Dunkel

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    25
    13
  • Сообщений: 129
  • Россия, Санкт-Петербург
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #16 : 21 Мар 2017 в 14:21 »
Начал делать примерно такую же штуку, только вместо ардуины взял digispark, но это не принципиально. Подключил к выходу затвор IRF2807 через 100 Ом - работает, светодиодом моргает. Теперь встал вопрос - а чем моргать-то?
Есть китайская понижайка CC/CV, заряжаю ей упсовые АКБ 7А/ч.
Подключить мосфет между ее выходом и АКБ?
Или так не получиться?

Dkin

  • Неравнодушный
  • **
  • Репутация:
    +0/-0
  • :
    43
    44
  • Сообщений: 206
  • Россия
  • Оффлайн Оффлайн
    • Награды
Моргалка на Arduino. Этюды для начинающих.
« Ответ #17 : 21 Мар 2017 в 14:41 »
Получится. Напряжение на ней должно быть не меньше 17-18 вольт, чтобы ток при напряжении на АКБ 14,4В не снижался.
Я мигаю Кулоном 715А, напряжение поднял до 17В, ток он до 20А дает в импульсе.
« Последнее редактирование: 21 Мар 2017 в 14:57 от Dkin »

Страницы: 123 ... 26>>Вверх