Светильник на Attiny13
- Войдите на сайт для отправки комментариев
Хочу сделать светодиодный двухцветный светильник на 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
Возможно я ошибаюсь, но у Вас нет ни одного пина на OUTPUT в сетапе. Может проблема в этом?
Кроме того - попытайтесь для проверки написать совсем простенькую программу типа кнопка и светодиод и залейте в контроллер. Залейте hex файл сторонним программой. Проверьте в Протеусе. Вариантов куча.
mykaida, спасибо за внимание к теме. Вообще при использовании ШИМа не обязательно настраивать соответствующие порты на выход, но я, на всякий случай, пробовал и так, изменений не было. Пробовал заливать скетч, чтобы проверить сможет ли МК одновременно два разных ШИМа генерировать. Один выход на 10%, второй на 90, через 5 сек. оба по 50%, затем первый на 90%, второй на 10%. Результать проверил осциллографом, всё ок было.
вот пример http://arduino.ru/Reference/AnalogWrite
сорри, а что именно не работает?
wdrakula, некоторое время назад проблема была в том, что один канал все время светил в половину мощности, а другой регулировался при этом любым потенциометром. Думал, что проблема в ШИМ, но тестовый код, работу которого я описал выше, показал, что МК без проблем выдаёт одновременно два разных ШИМа. Одна лента зажигалась тускло, другая ярко, затем одинаково, затем ярко и тускло. Потом не было времени заниматься, забросил, сейчас достал, залил этот же скетч и на двух МК у меня один канал совсем не работает, а другой работает как и было задумано - потенциометр задаёт его яркость. Что характерно, тот же код, которым я тестировал ШИМ тоже перестал работать как должен. Цепи прозвонил, обрывов и коротышей нет, но возможные проблемы с аппаратной частью я не исключаю, появится ещё немного времени - соберу всё на макетке и посмотрю как там заработает, может мосфет козлит, хотя не должен. Пока просто хотелось, чтобы кто-то с опытом программирования Attiny13 именно через среду Arduino IDE посмотрел код. Он простейший, конечно, но может я неправильно обозначил выводы, или ещё что-то проморгал.
Ещё, кстати, момент интересный, но не совсем по теме вопроса. Изначально я не хотел просто делить значение потенциометра на 4, чтобы оно влазило в диапазон ШИМ, тем более, что по задумке в крайних положениях потенциометра, лента не должна ни полностью гаснуть, ни светить наполную. Функция map наглухо забивала память контроллера, а тем более их нужно две, поэтому я просто взял её исходный код и подставил нужные мне числа, математика там простая.
Когда я решил посмотреть, как работает программа, то обнаружил, что за весь диапазон вращения потенциометра, свеодиод полностью аснет и зажигается 4 раза, начиная со средней яркости и заканчивая примерно ею же. При том, что когда вручную на бумаге считал, значение "мапилось" как положено.
Всё-же вывод одного из потенциометров я неправильно подписал, нужно не 4, а 2. Но ШИМ по прежнему почему-то только один работает, а другой вывод "молчит" :(
Проверил спаянную плату, подключив вместо Attiny13 обычную Arduino Nano, в коде выставил соответствующие ей порты, всё работает как задумано. Проблема, скорее всего с софтом на Attiny для Arduino IDE. Нет здесь кого-нибудь, кто так же извращался, закидывая прошивку в этот МК через IDE?
ну, код з первого поста выгоядит ОК. Макетку-то спаяли?
Проблема оказалась все же в коде :) в setup нужно было дописать конфигурацию шим-пинов.
В справочнике по командам написано, что если используется ШИМ, то конфигурацию этих пинов можно не прописывать, но вот для Attiny13 (если используются оба ШИМа) необходимо, иначе будет работать только один, как в моем случае, а второй будет молчать.
Товарищ mykaida оказался прав, зря я его сразу не послушал :)