Светильник на Attiny13

Technoid91
Offline
Зарегистрирован: 20.05.2016

Хочу сделать светодиодный двухцветный светильник на Attiny13 с регулировкой яркости. Понадобилось два отрезка светодиодной ленты (белая - основной свет, красная - подсветка), два мосфета с резисторами, два потенциометра и стабилизатор L7805 с конденсаторами. Всё это дововльно компактно разместилось на плате, но с кодом просто какая-то беда.

/*
     РАСПИНОВКА ATTINY13
            _______
   reset  <|  \_/  |>  5V input
  A3  D3  <|       |>  D2  A1
  A2  D4  <|       |>  D1  PWM
   GND    <|_______|>  D0  PWM
*/

const int regPinWhite = 3; // пин крутилки основного света
const int regPinRed = 4; // пин крутилки подсветки
const int outPinWhite = 1; // пин на ленту основного света
const int outPinRed = 0; // пин на ленту подсветки
const int trigPin = 2; // пин для авто-включения подсветки

int whiteState = 0; // переменная значения крутилки основного света
int redState = 0;   // переменная значения крутилики подсветки
int trigState = 0;  // переменная значения пина авто-включения
byte pwmWhite = 0;   // переменная значения ШИМа основного света
byte pwmRed = 0;     // переменная значения ШИМа подсветки

void setup() {
  pinMode(trigPin, INPUT);
  pinMode(regPinWhite, INPUT);
  pinMode(regPinRed, INPUT);
}

void loop() {
  /*  trigState = digitalRead(trigPin);

    if (trigState == 1) {
      analogWrite(outPinWhite, 0);
      analogWrite(outPinRed, 80);
    }

    else {*/
  whiteState = analogRead(regPinWhite);
  redState = analogRead(regPinRed);

  pwmWhite = whiteState / 4;
  if (pwmWhite > 240) {
    pwmWhite = 245;
  }
  else if (pwmWhite < 25) {
    pwmWhite = 20;
  }
  pwmRed = redState / 4;
  if (pwmRed > 240) {
    pwmRed = 245;
  }
  else if (pwmRed < 25) {
    pwmRed = 20;
  }
  analogWrite(outPinWhite, pwmWhite);
  analogWrite(outPinRed, pwmRed);
}

Не хотелось использовать для такой простой задачи целую Arduino, но тинька оказалась не так проста, как я думал.

Пин Reset подтянут к 5v резистором. Потенциометры 10кОм подключены средними выводами к А2 и А3, крайними - к 5v и gnd. выводы D0 и D1 должны формировать ШИМ для управления яркостью лент через мосфеты. На пин D2 была мысль повесить в будущем PIR-датчик, чтобы включать только подсветку при движении, но это-то как раз работает. Я подозреваю, что либо мне попалось несколько глючных МК, либо косячно прошивается скетч. Для прошивки использую arduino nano в качестве SPI-программатора. Может быть я порты неправильно обозвал, или Arduino IDE в принципе не особо подходит для Attiny13?
Может быть это имеет значение - если нажать в IDE "загрузить через программатор" - вылетит ошибка, затем нажимаю "записать загрузчик" (в случае с Attiny13 по идее просто настройка фьюз-битов), он пишется нормально, затем снова "загрузить через программатор" и скет заливается как положено. Если наоборот - сразу нажать "записать загрузчик" - опять таки вылетит ошибка записи, после этого нажимаю "загрузить через программатор" и скетч опять-таки нормально заливается. Есть подозрение на битый архив от Attiny13

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Возможно я ошибаюсь, но у Вас нет ни одного пина на OUTPUT в сетапе. Может проблема в этом?

Кроме того - попытайтесь для проверки написать совсем простенькую программу типа кнопка и светодиод и залейте в контроллер. Залейте hex файл сторонним программой. Проверьте в Протеусе. Вариантов куча.

Technoid91
Offline
Зарегистрирован: 20.05.2016

mykaida, спасибо за внимание к теме. Вообще при использовании ШИМа не обязательно настраивать соответствующие порты на выход, но я, на всякий случай, пробовал и так, изменений не было. Пробовал заливать скетч, чтобы проверить сможет ли МК одновременно два разных ШИМа генерировать. Один выход на 10%, второй на 90, через 5 сек. оба по 50%, затем первый на 90%, второй на 10%. Результать проверил осциллографом, всё ок было. 

Novice User
Offline
Зарегистрирован: 25.09.2017
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

сорри, а что именно не работает?

Technoid91
Offline
Зарегистрирован: 20.05.2016

wdrakula, некоторое время назад проблема была в том, что один канал все время светил в половину мощности, а другой регулировался при этом любым потенциометром. Думал, что проблема в ШИМ, но тестовый код, работу которого я описал выше, показал, что МК без проблем выдаёт одновременно два разных ШИМа. Одна лента зажигалась тускло, другая ярко, затем одинаково, затем ярко и тускло. Потом не было времени заниматься, забросил, сейчас достал, залил этот же скетч и на двух МК у меня один канал совсем не работает, а другой работает как и было задумано - потенциометр задаёт его яркость. Что характерно, тот же код, которым я тестировал ШИМ тоже перестал работать как должен. Цепи прозвонил, обрывов и коротышей нет, но возможные проблемы с аппаратной частью я не исключаю, появится ещё немного времени - соберу всё на макетке и посмотрю как там заработает, может мосфет козлит, хотя не должен. Пока просто хотелось, чтобы кто-то с опытом программирования Attiny13 именно через среду Arduino IDE посмотрел код. Он простейший, конечно, но может я неправильно обозначил выводы, или ещё что-то проморгал. 

Ещё, кстати, момент интересный, но не совсем по теме вопроса. Изначально я не хотел просто делить значение потенциометра на 4, чтобы оно влазило в диапазон ШИМ, тем более, что по задумке в крайних положениях потенциометра, лента не должна ни полностью гаснуть, ни светить наполную. Функция map наглухо забивала память контроллера, а тем более их нужно две, поэтому я просто взял её исходный код и подставил нужные мне числа, математика там простая.

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Когда я решил посмотреть, как работает программа, то обнаружил, что за весь диапазон вращения потенциометра, свеодиод полностью аснет и зажигается 4 раза, начиная со средней яркости и заканчивая примерно ею же. При том, что когда вручную на бумаге считал, значение "мапилось" как положено.

Technoid91
Offline
Зарегистрирован: 20.05.2016

Всё-же вывод одного из потенциометров я неправильно подписал, нужно не 4, а 2. Но ШИМ по прежнему почему-то только один работает, а другой вывод "молчит" :(

Technoid91
Offline
Зарегистрирован: 20.05.2016

Проверил спаянную плату, подключив вместо Attiny13 обычную Arduino Nano, в коде выставил соответствующие ей порты, всё работает как задумано. Проблема, скорее всего с софтом на Attiny для Arduino IDE. Нет здесь кого-нибудь, кто так же извращался, закидывая прошивку в этот МК через IDE?

asam
Offline
Зарегистрирован: 12.12.2018

ну, код  з первого поста выгоядит ОК. Макетку-то спаяли?

Technoid91
Offline
Зарегистрирован: 20.05.2016

Проблема оказалась все же в коде :) в setup нужно было дописать конфигурацию шим-пинов.

pinMode(outPinWhite, OUTPUT);
pinMode(outPinRed, OUTPUT);

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

Товарищ mykaida оказался прав, зря я его сразу не послушал :)