LED RGB светлинни ефекти с PIC12F629

Проектът представлява малка схема за контрол на група трицветни светодиоди с общ анод или групирани едноцветни светодиоди (каквито са ползвани в случая) чрез ШИМ регулатор. За да бъде наистина проста схемата, са използвани минимално количество компоненти и микроконтролер от нисък клас на компанията Microchip. Ето защо не мисля, че би била проблем за сглобяване и от начинаещи. Не се използват екзотични компоненти, които не се намират лесно.

Този проект се базира на идеята, че най-простите неща обикновено са и най-сполучливи. Микроконтролерът, управляващ работата на светодиодите е PIC12F629. Той е 8-краков от нисък клас и съответно има ниска цена (0,70$ в сайта на производителя). Изборът на режим на работа става с помощта на един единствен бутон.Контролерът работи като модифициран ШИМ (широчинно-импулсна модулация) регулатор, който създава усещането за плавна смяна на цвета и интензитета на излъчената светлина. Ниският клас на устройството означава, че то не притежава вграден ШИМ модул, поради което е изграден такъв посредством програмен код. В допълнение не се използва и външен генератор или резонатор. Това ограничава тактовата честота до 4 MHz или 1 млн. операции за секунда. Вземайки предвид и малката памет на този микроконтролер се налагат някои ограничения. Най-съществените от тях са ниска честота на ШИМ генератора (от порядъка на 400 Hz) и липса на ръчно задаване коефициентите на запълване за трите генератора (по един за всеки основен цвят).

На чертежите по-долу са представени принципните схеми на системата за светлинни ефекти.

led-rgb-pic12f629-control

Принципът на работа на схемата е следният. При подаване на захранващо напрежение микроконтролерът се самонастройва за работа и зарежда последно запаметеният режим на работа. Изводи 5, 6 и 7 подават сигнал към транзисторите Q1, Q2 и Q3, които захранват светодиодните групи. Нуждата от използването на транзистори произлиза от това, че контролерът може да пропуска максимум 25 мА ток през изводите си (препоръчително 20 мА), а това е напълно недостатъчно, защото един единствен светодиод работи при приблизително 20 мА ток. Захранващият източник трябва да осигурява две линии – 5V и 12V с обща маса. Не е проблем разбира се да се използва и 12V източник и 5V стабилизатор за захранване на контролера. Бутонът SW1 служи за смяна на режимите, които ще бъдат изредени по-късно. Използвайки вградената функция за повдигане нивата на изводите, конфигурирани като входове, не се налага свързването на външен резистор. Базовите резистори R1, R2 и R3 са избрани със стойност 1кΩ, като е препоръчително да бъдат дори с по-голяма стойност (например 10кΩ), за да се ограничи токът през транзисторите в случай, че бъдат претоварени по погрешка. Избраните транзистори са BC547C, който имат коефициент на предаване 500. Това увеличава енергийната ефективност на схемата. По същата причина е използвано напрежение 12V за захранване на светодиодите. Както се вижда на долната схема са използвани диоди от трите основни цвята. Свързани са в 4 блока по 3 групи от 3 светодиода. Казано по ясно, могат да се отделят 4 платки, съдържащи по 3 светодиода от всеки цвят. Резисторите, свързани за ограничаване на тока, са ориентировъчни и зависят от самите светодиоди (падът на напрежение върху тях и номиналният им работен ток).  В случай, че решите да сглобявате тази схема, трябва да изберете сами подходящите резистори. Червените светодиоди се произвеждат от полупроводник с нисък пад върху PN-прехода, поради което се “палят” при по-ниско напрежение. Заради това резисторите за този цвят са с по-голяма стойност от останалите.

Транзисторите са в състояние да осигурят до 100мА ток или 0,5W, което е по-голямо. Трябва да се измери токът през блоковете, които ще се свържат към схемата, за да не се получи претоварване. Те разбира се могат да бъдат заменени с по-мощни, като се съблюдава базовият им ток, за да не се претоварят изходите на микроконтролера. Възможно е и използването на MOSFET транзистори, способни да работят с ТТЛ нива на напрежението на гейта. Последните имат значително по-висока цена (до 10 пъти, а понякога и повече). Поради тази причина те не са предпочетени в този проект.

Спецификация на използваните компоненти няма нужда да бъде давана, защото броят компоненти е малък и те нямат специфични характеристики.

Обобщено контролната схема предлага следните функции:

  • 14 режима на светене
  • запаметяване на избран режим и зареждането му автоматично при стартиране (става чрез задържане на бутона за минимум 2 секунди, докато е активен желаният режим)
  • 3 изхода от тип отворен колектор с максимален ток 100мА и напрежение колектор-емитер 45V

Списък на режимите на светене:

  1. всички изходи са спрени
  2. постоянно светене на всички светодиоди (бяло)
  3. постоянно светене на червените светодиоди
  4. постоянно светене на зелените светодиоди
  5. постоянно светене на сините светодиоди
  6. постоянно светене на червените и зелените светодиоди
  7. постоянно светене на червените и сините светодиоди
  8. постоянно светене на зелените и сините светодиоди
  9. плавна смяна на цветовете с преливане между трите основни цвята
  10. плавна смяна на трите основни цвята без преливане (плавно увеличаване от минимум до максимум и обратно до минимум за всеки цвят под ред)
  11. плавно пулсиране на червените светодиоди (от минимум до максимум до минимум до …)
  12. плавно пулсиране на зелените светодиоди (от минимум до максимум до минимум до …)
  13. плавно пулсиране на сините светодиоди (от минимум до максимум до минимум до …)
  14. плавна смяна на трите основни цвята с преливане последвана от плавна смяна на смесени цветове (двойки от цветове) завършваща с бяло

За да работи схемата със сигурност ще се нуждаете и от програмното осигуряване на микроконтролера. Можете да използвате компилиран HEX файл публикуван на следващата страница от статията. За целта се убедете, че сте копирали цялото съдържание. Отворете нов прозорец на Notepad и поставете кода в него. Запишете файла с произволно име без празни места и разширение HEX. Кодировката трябва да бъде от тип ANSI. Задължително се оставя един празен ред в края на файла. Стартирайте използваният от вас софтуерен продукт за програмиране на микроконтролери, изберете PIC12F629 като устройство за програмиране и заредете HEX файла. Програмирайте чипа и той е готов за използване.

Компилиран софтуер за създаване на HEX файл:

Копирайте всичко между редовете със знака =

=========================================
:020000000B28CB
:10000800FF0003088312A4000A08A500432BDA01A5
:10001800DB01DC01DD01DE018316FF239000830193
:1000280015289123322885013228CE233228C2236D
:100038003228CA233228C6233228B6233228BA23C4
:100048003228BE2332283E2232289E213228D3224B
:1000580032280B2332289B2232285E205F08003A80
:1000680003191728013A03191928033A03191B28F9
:10007800013A03191D28073A03191F28013A0319E1
:100088002128033A03192328013A031925280F3A8E
:1000980003192728013A03192928033A03192B2899
:1000A800013A03192D28073A03192F28013A031991
:1000B80031283228013085000A30DA00DA080319BD
:1000C80071288230A100DD30A000A00B6928A10BA7
:1000D80069286E288312DA0B6528DE018A28043025
:1000E800DA00DA0803198A285E08DD00DC018628B0
:1000F800DD080319832885100514DD038528851478
:100108000510DC0A5C0F7C28DA037528DE0B7328DF
:10011800051085140A30DA00DA0803199F2882309E
:10012800A100DD30A000A00B9728A10B97289C28E0
:100138008312DA0B9328DE01B8280430DA00DA08D3
:100148000319B8285E08DD00DC01B428DD080319AE
:10015800B12805118514DD03B32805158510DC0ABF
:100168005C0FAA28DA03A328DE0BA1288510051541
:100178000A30DA00DA080319CD288230A100DD3010
:10018800A000A00BC528A10BC528CA288312DA0B2A
:10019800C128DE01E8280430DA00DA080319E82863
:1001A8005E08DD00DC01E428DD080319E02885107D
:1001B80005100515DD03E328851405140511DC0A6F
:1001C8005C0FD828DA03D128DE0BCF280511851457
:1001D80005140A30DA00DA080319FE288230A10073
:1001E800DD30A000A00BF628A10BF628FB2883120F
:1001F800DA0BF228DE0117290430DA00DA080319CD
:1002080017295E08DD00DC011329DD080319102910
:1002180005110514DD03122905150510DC0A5C0F0C
:100228000929DA030229DE0B0029051085140515B2
:100238000A30DA00DA0803192D298230A100DD30EE
:10024800A000A00B2529A10B25292A298312DA0B46
:100258002129DE0146290430DA00DA080319462983
:100268005E08DD00DC014229DD0803193F2905107D
:100278008514DD03412905148510DC0A5C0F382933
:10028800DA033129DE0B2F298510051405150A30EC
:10029800DA00DA0803195C298230A100DD30A000F9
:1002A800A00B5429A10B542959298312DA0B502980
:1002B800DE01DE03031975290430DA00DA080319B0
:1002C8005D295E08DD00DC017129DD0803196F294D
:1002D8008510DD0370298514DC0A5C0F6929DA03AF
:1002E800622985148230A100DD30A000A00B7A2994
:1002F800A10B7A297F298312DE0199290330DA00BC
:10030800DA08031999295E08DD00DC019529DD0862
:100318000319922905158514DD0394290511851003
:10032800DC0A5C0F8B29DA038429DE0B8229013071
:10033800850008008501DE01DE0BA329BA290430F7
:10034800DA00DA080319B8295E08DD00DC01B429EF
:10035800DD080319B2290510DD03B3290514DC0AE9
:100368005C0FAC29DA03A529DE0BA3290514DE01ED
:10037800D2290430DA00DA080319D2295E08DD0030
:10038800DC01CE29DD080319CC290514DD03CD29AC
:100398000510DC0A5C0FC629DA03BF29DE0BBD296C
:1003A8000510DE01EC290430DA00DA080319EC291B
:1003B8005E08DD00DC01E829DD080319E62985105F
:1003C800DD03E7298514DC0A5C0FE029DA03D92963
:1003D800DE0BD7298514DE01062A0430DA00DA0894
:1003E8000319062A5E08DD00DC01022ADD0803196C
:1003F800002A8514DD03012A8510DC0A5C0FFA291E
:10040800DA03F329DE0BF1298510DE01202A0430F6
:10041800DA00DA080319202A5E08DD00DC011C2A4C
:10042800DD0803191A2A0511DD031B2A0515DC0A44
:100438005C0F142ADA030D2ADE0B0B2A0515DE01E0
:100448003A2A0430DA00DA0803193A2A5E08DD008D
:10045800DC01362ADD080319342A0515DD03352A9F
:100468000511DC0A5C0F2E2ADA03272ADE0B252A5F
:1004780005110800051085100515DE01DE0B452A5B
:100488005E2A0430DA00DA0803195C2A5E08DD0007
:10049800DC01582ADD080319552A05100515DD0366
:1004A800572A05140511DC0A5C0F4E2ADA03472A7D
:1004B800DE0B452A05110514DE01792A0430DA001D
:1004C800DA080319792A5E08DD00DC01752ADD08DF
:1004D8000319722A85100514DD03742A8514051082
:1004E800DC0A5C0F6B2ADA03642ADE0B622A051029
:1004F8008514DE01962A0430DA00DA080319962AF0
:100508005E08DD00DC01922ADD0803198F2A051137
:100518008514DD03912A05158510DC0A5C0F882AED
:10052800DA03812ADE0B7F2A85100515080085016C
:10053800DE01DE0BA02AB72A0330DA00DA08031935
:10054800B52A5E08DD00DC01B12ADD080319AF2AEF
:100558000511DD03B02A0515DC0A5C0FA92ADA03A8
:10056800A22ADE0BA02A0515DE01CF2A0330DA0005
:10057800DA080319CF2A5E08DD00DC01CB2ADD0882
:100588000319C92A0515DD03CA2A0511DC0A5C0FFF
:10059800C32ADA03BC2ADE0BBA2A05110800850132
:1005A800DE01DE0BD82AEF2A0330DA00DA08031955
:1005B800ED2A5E08DD00DC01E92ADD080319E72AD7
:1005C8000510DD03E82A0514DC0A5C0FE12ADA03CA
:1005D800DA2ADE0BD82A0514DE01072B0330DA00ED
:1005E800DA080319072B5E08DD00DC01032BDD08A0
:1005F8000319012B0514DD03022B0510DC0A5C0F1F
:10060800FB2ADA03F42ADE0BF22A0510080085011A
:10061800DE01DE0B102B272B0330DA00DA08031972
:10062800252B5E08DD00DC01212BDD0803191F2BBB
:100638008510DD03202B8514DC0A5C0F192BDA03E7
:10064800122BDE0B102B8514DE013F2B0330DA0052
:10065800DA0803193F2B5E08DD00DC013B2BDD08BF
:100668000319392B8514DD033A2B8510DC0A5C0F3E
:10067800332BDA032C2BDE0B2A2B851008008B1367
:100688000B1C682B0B10851A682BDB01851A582B5D
:100698008230A300DD30A200A20B502BA30B502BFD
:1006A800552B8312DB0A4A2B14305B020318642B88
:1006B8000D305F020318622BDF0A682BDF01682BFD
:1006C8005F08A6000001712383128B1725088A0092
:1006D80024088300FF0E7F0E0900A70083169C18CC
:1006E800722B83122708831383169B008312260814
:1006F80083169A009C13031083128B1B03148B130D
:1007080083161C1555309D00AA309D009C141C11A1
:10071800031C080083128B170800383083168500E5
:10072800831285010730990083168113C83083121C
:100738008B00831696160001A9238312DF000E3062
:100748005F02031C0800DF0108008312A0009C1848
:10075800AB2B83122008831383169B009C131C1455
:100768001A08080085140514051108000515051454
:1007780085100800051585140510080005140511D5
:100788008510080005158510051008008514051149
:0E07980005100800FF308500080085010800EC
:02400E00843FED
:00000001FF

=========================================

21 thoughts on “LED RGB светлинни ефекти с PIC12F629

  1. Като гледам и у нас има интерес към тази схема – форума на eshop.bg. Изглежда все още има запалени по електрониката ученици в България.

    Само без комерсиални цели. Предоставените в този сайт материали са за свободно ползване. Лицензът вече се вижда на всяка страница.

  2. Особая благодарность автору конструкции!

    Хороший проект, а главное бесплатный, большое спасибо за ваши труды!

  3. Здравей,
    би ли споделил кода и в програмен език?

  4. Публикувах hex файла, за да е сигурно, че който сглоби схемата, няма да има проблеми. Аз лично ползвам варианта с PIC16F870 от друг проект в сайта. Програмата, която съм публикувал за PIC12F629 съм я променял допълнително след това и вече не е същата (сензорен бутон, различни ефекти и други подобни). Вече и схемата е друга. Затова няма да публикувам програмния код тук. Ако се интересуваш как е постигнато нещо в програмата, бих могъл да публикувам фрагменти от кода, за да помогна по някакъв начин. Имал съм вече питания за това как работи софтуерният ШИМ например. Предполагам, че и твоят интерес е към нещо специфично, а не към цялата програма. Пиши какво те интересува по-конкретно, за да помогна ако мога.

    П.П.
    Освен всичко останало не съм споменал и това, че ползваният компилатор не е на Microchip.

    1. Общо взето не съм мн. навътре с миктоконтролерите.
      Единствения ми контакт с тях за момента е 1ва част на книгата от Млад Конструктор. Интересуват ме командите за подготвяне на пик-а и ШИМ-а също, както и управлението на изходите.
      На какъв език си пишеш програмите?

    2. Програмите след един момент започнах да пиша на С, защото станаха по-сложни и нямах време да пиша на асемблер. Бях направил програма за контролера от този проект, която управлява светодиоди, закачени на метализиран вентилатор за процесор. Можеше да изглежда сякаш се върти бавно, дори наобратно или пък като че си сменя посоката на въртене, даже да изглежда почти спрял. На асемблер това ми отне близо две седмици, но тогава още се учех. После минах на С и нещата придобиха друг вид. Вместо да пишеш 20 реда, пишеш 1 команда. Понякога пак се налага да се ползва и асемблер за по-голяма ефективност на програмата.

      Книгата която четеш е едно страхотно начало. И аз започнах с нея. Също и втора част. В момента работя заедно с автора й в една фирма. Той вече проектира цифровата част на интегрални схеми. Честно казано не съм попадал на по-добри материали за PIC. Въпреки, че излязоха нови серии с нови възможности, тези книги все още са една чудесна основа за начинаещите.

      Подготвянето на чипа става не особено трудно. В компилатора се пише един ред с команди, които указват как да бъде конфигуриран при програмиране. Примерно: __CONFIG(UNPROTECT & PWRTEN & BORDIS & MCLRDIS & WDTDIS & INTIO); Това изглежда така в С компилатора HiTech C, както и в този на Майкрочип, също и в асемблер. Има малки разлики в командите, но има списък с тях в хедъра за съответния чип. Кодът по-горе указва да няма защита на кода, пуска ресет при стартиране на захранването, активира ресет при ниско захранване, изключва MasterClear пина, спира watchdog таймера и пуска вътрешния осцилатор да работи без да изкарва сигнала му на съответния пин. Има и още команди, но не е задължително да се включват всичките. Те са специфични за всеки контролер. Завият от възможностите му. Трябва да напишеш в началото нещо от сорта на #include , което е файлът с опциите за чипа, за да може компилаторът да генерира hex файл. Тези файлове се намират някъде в програмната директория на компилатора.

      Следва реалното подготвяне на чипа. Добре е да конфигурираш цялата периферия, но не е задължително. Най-добре е да провериш в какво състояние се стартира всеки модул и да прецениш дали те устройва или трябва да го пренастроиш. Важно е да конфигурираш добре прекъсванията, за да стават случайни прекъсвания от някой свободен пин или пък да са забранени, а програмата ти да разчита на тях.

      Управлението на пиновете също е различно при различните серии контролери. За 12-та е следното:
      TRISIO = 0b00111000; конфигурира входове и изходи (0 изход, 1 вход, първи пин на порта е най-десният бит)
      GPIO = 0x00; прави всички пинове на порта да имат логическо ниво нула
      Този чип има само един порт, но по-големите имат по няколко и там вече си имат номера.

      ШИМ-а?! Хм, тук вече става по-сложно. Не ползвам периферия на контролера, защото в този точно няма ШИМ. Програмата ми постоянно проверява какво състояние трябва да има даденият пин и го обновява с висока скорост. Една променлива служи за брояч и постоянно увеличава стойността си (може и да я намалява според вкуса на програмиста🙂 ). Променлива от един байт има 256 стойности. Ако броим бързо от 0 до 256 и в същото време броим друга променлива например от 128 до 0 и тогава сменим състоянието на пина, то ще имаме още 128 стойности на другия брояч. После пак обръщаме състоянието на пина и връщаме стойностите и на двата (256 и 128) и отново броим по същия начи и обръщаме пина. Така получаваме ШИМ с 50% коефициент на запълване. Сменяйки едната променлива, сменяме този коефициент. В програмата за светлинните ефекти съм ползвал плавно преминаване от светнато в изгасено положение на светодиодите. Там използвам много подобен алгоритъм. Кодът изглежда в общи линии ето така:
      void mode9 (void)
      {
      GPIO = 0x00;
      for (cnt1 = 255; cnt1 > 0; cnt1–) // PWM00)
      {
      cnt2 = cnt1;
      for (cnt0 = 0; cnt0 0)
      {
      GPIO0 = 0;
      cnt2–;
      }
      else
      {
      GPIO0 = 1;
      }
      }
      c–;
      }
      }
      GPIO0 = 1;
      for (cnt1 = 255; cnt1 > 0; cnt1–) // PWM0>
      {
      c = 3; // slowing down the fading routine
      while (c>0)
      {
      cnt2 = cnt1;
      for (cnt0 = 0; cnt0 0)
      {
      GPIO0 = 1;
      cnt2–;
      }
      else
      {
      GPIO0 = 0;
      }
      }
      c–;
      }
      }
      GPIO0 = 0;
      }

      За съжаление нямам време да го обяснявам подробно. Вижда се, че проверявам за натиснат бутон по време на цикъла. GPIO0 е пин 0 от порта. PWM0> и PWM0< показват съответно намаляване и увеличаване силата на светене на диода, свързан към този пин.

  5. би ли ми препоръчал нещо за четене на български за програмирането на пик-ове на C?

    1. Трудна работа. Не съм намирал нищо на тази тема, което да ми се стори добро и да е на български. Имах някаква книжка на английски в pdf формат, но нямам представа къде е в момента и дали не съм я изтрил. Реално С за контролери си е същото С като за компютри. Просто имаш ограничения откъм памет, скорост и нямаш толкова готови функции на разположение (все пак има библиотеки с математически и други полезни функции). Ако се разровиш с Гугъл ще намериш много полезна информация.

  6. @Penoff – можеш ли да ми помогнеш с намирането на заместител/и на BC547C защото не мога да го намеря. Не съм много навътре с нещата, затова иначе имам програмиран чип и ми трябват само някакви транзистори.

    1. Този не мисля, че е труден за намиране. Аз си го купих от Комет. BC547 без С също ще свърши работа. Други варианти са BC237, ВС546, ВС182 и изобщо всичко друго с напрежение емитер-база поне 6V и колектор-база и колектор-емитер поне 30V. Само не слагай мощни транзистори (над 0,5W, за да не се повреди контролера от базовия ток).

  7. Направих схемата но светодиодите светят постоянно и нямат ефекти. Като натисна бутана изгасват, а като го задържа за 2 сек., след това светят отново. Да не би да не е програмиран чипа както трябва. Сега забелязах че в кода и 2 празни реда отдоло, това проблем ли е?

    1. Ако схемата е наситена правилно, което смятам, че не е трудно, то вероятно проблемът е с контролера. След последния ред код (:00000001FF) трябва да има само един празен ред, а не два. Може програмирането да е объркано от това. Зависи от програмата. Добре е след програмиране да се направи и проверка на записания в микроконтролера код. Щом диодите светват, значи транзисторите са наред. Бих дал съвет да се погледнат изходите на контролера с осцилоскоп, но в домашни условия това рядко е възможно по разбираеми причини. Поне няколко човека са правили тази схема с кода, копиран от сайта, така че би трябвало да се получи. За съжаление без да имам възможност да погледна схемата, не мога да бъда от много голяма помощ. Пробвай няколко пъти да програмираш контролера и да провериш записа в него. Ако не се получава, а кодът е вярно записан, не е зле отново да прегледаш схемата, за да изключиш грешка при насищането.

    1. 12F629 и 12F675 имат обща документация, така че предполагам би могло да се направи такава замяна. В кода не ползвам специфична периферия, тоест не би трябвало да има проблем с конфигурацията при инициализация. ШИМ генераторът е софтуерен, не се ползват и таймери или прекъсвания. Все пак не съм пробвал и не мога да гарантирам на 100%, че ще работи и с двата чипа. Може би ще се наложи прекомпилация на HEX файла за 12F675.

  8. Бос съм с ‘кодовете” та как да направя прекомпилацията за 12f675?

    1. Опитах да направя прекомпилация с необходимите за този контролер корекции. За съжаление се оказа невъзможно да се компилира този код, защото никой от наличните компилатори нямаше достатъчно добра оптимизация и паметта на контролера не е достатъчна и за двата модела (675 и 683). В оригиналния HEX файл остават няколко свободни байта, а той е генериран с професионална пробна версия на компилатор, с който вече не разполагам. Нямам време да се занивам повече с този проект, защото е доста стар и не го използвам. Кодът може да бъде оптимизира, за да се побере в паметта и с безплатния компилатор, но това иска време с което не разполагам в момента.

    1. Успех с разработката. Един съвет. Проверете документацията на драйвера, за да не се окаже, че му подавате ШИМ сигнал с голяма честота, която той не може да възприеме правилно. По принцип мощните драйвери работят в режим на постоянен изходен ток при по-висока честота на ШИМ сигнала. В този случай обаче не могат да се достигат ниски коефициенти на запълване (слабо светене). Тогава е нужна по-ниска честота при което изходният ток става изпулсен (достига до нула). Това може да е проблез за захранващия източник и също така при големи токове води до зашумяване на захранващото напрежение (или мрежата директно).

Your comment:

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s