Incarcator Arduino cu display. Măsurarea tensiunii folosind Arduino. Lucrări suplimentare la panoul frontal

"Redresoare" vechi și bun
încărcător B14"!
Ai fost mereu ca un salvator:
Ne-a ajutat, dragă!

În căldură și frig de iarnă
Bateria revigorată;
Chiar dacă sunt răcit
Ești ca un robot Terminator!

Nu s-a rupt, nu a cedat
Chiar și în cea mai grea oră;
Când a fost nevoie, m-am încordat,
Încarcă totul pentru noi.

Au trecut deja patruzeci de ani
Din vremurile bune de Brejnev,
Când corpul tău este ca un corp
A fost sigilat la fabrică.

Și de atunci ai servit bine.
Sunteți în beneficiul tuturor mașinilor,
Diferit de Uniune
Pentru că adevărul este indestructibil.

Dar este timpul să te schimbi
Aruncă povara grea a timpului,
Ca să te poți ridica,
Pentru ca Hawking să devină inteligent.

Dacă întreabă cineva în falsetto
"Cum pot face acest lucru?" -
Nu-ți face griji, eu vorbesc despre asta
În acest articol vă voi spune.

Un moment de dependență.

Salutări, dragi cititori! După o pauză de aproape patru luni, revin în afaceri și, ca raport al muncii depuse, consider că este necesar să scriu acest articol. M-am gândit multă vreme de unde să încep, ei bine, să nu postez a patra oară despre vizibilitate zero etc. - acest citat a funcționat deja pentru mine în mod regulat în ultimele trei articole, așa că este suficient pentru asta - lasă-l să meargă la o odihnă binemeritată! Ei bine, între timp, voi folosi un nou truc experimental, să-i spunem un „minut de dependență de droguri” - un moment atât de distractiv și relaxat de „bună ziua”, care duce fără probleme la ideea principală a articolului. . 🙄

Așadar, așa cum sa menționat deja în „minut”, astăzi vă voi spune despre cum am devenit vechi Încărcătorînceputul anilor șaptezeci la unul nou, modern, controlat de un microcontroler. Acest gând mi-a venit pentru că prietenul meu m-a invitat la o bere în timp ce bateria mea se încarca. Aș fi fost bucuros să plec, dar ghinion - încărcătorul trebuia monitorizat constant! Alergați la el o dată la jumătate de oră, sau chiar mai des, pentru a verifica tensiunea de pe baterie, iar dacă depășește maximul, reduceți puterea cu comutatorul corespunzător de pe panoul frontal. De acord, este incomod: ești în mod constant legat de o baterie de încărcare și nu te poți deplasa nicăieri, iar dacă pierdeți brusc momentul potrivit, bateria nu vă va mulțumi. Pe de altă parte, oricum nu o va spune: e un monument care nu știe să vorbească))))

Glume la o parte, de mult îmi doream să fac ceva serios pe Arduino, pe care l-am întâlnit în noiembrie, luând un pachet prețuit de la chinezi de la Aliexpress cu un microcontroler, scut și alte bunătăți prin poștă. Și iată-o, o oportunitate grozavă - luați-o și fă-o! Așa că am luat-o și am început să o fac direct!

Circuitul încărcător

În primul rând, vă voi oferi o diagramă foarte accesibilă a dispozitivului finit:

Lista componentelor principale

  • 8 condensatoare: 2 de 22 pF, 1 de 100 pF, câteva bucăți de 100 mF și pentru alimentare - unul mare de 6,3 volți și doi mari de 16, de exemplu, și respectiv 1500 mF (toate pot fie de 16 volți sau mai mult, nu contează).
  • Microcontroler programabil Atmega328 cu cuarț de 16 MHz și, de preferință, un scut pentru acesta (defilați prin câteva pagini până la primul scut, aceasta va fi cea mai ieftină opțiune) pentru a face clipirea convenabilă.
  • Din același motiv - prize de prindere pentru microcircuitul menționat mai sus. Deși te poți descurca cu cele obișnuite ca opțiune economică. Ei bine, sau lipiți firele la MK și flash-le cu un alt Arduino sau flasher - după cum preferați.
  • 9 tranzistoare KT315 și 1 KT815 (sau analogi) - nesudate de la orice echipament sovietic vechi.
  • 8 LED-uri difuze albe și 1 verde.
  • 9 relee cu bobine de 12 volți: unul pentru 220 V, patru pentru 12 V 16 A și patru mai mici pentru 12 V 12 A. Ultimele 8 trebuie să fie cât mai mici posibil.
  • 40 de rezistențe: 15 560 ohmi, 12 kilo ohmi, 8 ohmi, 2 10k și câte unul de 3k3, 4k7 și 30k.
  • Câteva diode pentru 12 volți: una pentru jumătate de amper, a doua cel puțin pentru un amper, o rezervă nu va strica. Este lipit de oriunde, de exemplu de la surse de alimentare moarte.
  • Un fel de bec, poate un LED cu o rezistență, care arde de la 220 de volți. De fapt, o fată neon ar arăta cool acolo!
  • Un ecran cu șaisprezece segmente de la o unitate de sistem veche pentru a afișa tensiunea curentă pe ea. Ei bine, sau trei cu șapte segmente. Sau chiar ciocan într-un șurub pentru a afișa tensiunea curentă: asta, la urma urmei, dispozitiv automat, controlează tensiunea în sine, nu trebuie să o cunoști, în cazuri extreme o poți măsura cu un tester. În loc de ecran, puteți pune doar câteva LED-uri, astfel încât arduino să clipească cu ele, spun ei, nu sunt înghețat, lucrez, totul este sub control! (Nu, nu am văzut niciodată un Arduino înghețat, dar cu toate acestea, trebuie să fii pregătit pentru orice.) 🙄
  • 3 registre de schimbare 74HC595
  • Ei bine, ceva de genul jumătăților unei plăci de circuite ca aceasta (am cumpărat 10 bucăți de pe eBay pentru un pahar de compot):

Aș dori să remarc că aproape toate componentele utilizate în acest proiect nu au evaluări exacte și pot fi înlocuite cu altele similare sau similare fie cu adaptarea minimă a circuitului și firmware-ului, fie fără nicio modificare. Am încercat să folosesc acele piese care erau literalmente la îndemâna mea: de exemplu, recent am lipit marea majoritate a rezistențelor și tranzistoarelor folosite aici de la un magnetofon Vilma antediluvian, ale cărui rămășițe, după dezlipire, au fost trimise în siguranță la o groapă de gunoi. Deci suma cheltuită pentru achiziționarea de piese pentru acest dispozitiv nu depășește 15 USD, iar cea mai mare parte a bugetului a fost cheltuită pe relee.

Versiune originală de încărcător

Din păcate, nu am avut o fotografie cu acest încărcător stare originala, așa că tot ce vă pot oferi este în această etapă- fotografie cu capacul deja scos, partea mecanică a comutatorului de alimentare deșurubat (în stânga) și mânerul acestui întrerupător (în dreapta). Partea sa electrică iese din partea de sus a dispozitivului. De asemenea, scos din orificiul original este comutatorul de tensiune (6 sau 12 volți):

După ce am efectuat manipulările de mai sus, am dezlipit și firul de alimentare de la siguranță și înfășurarea primară a transformatorului, deși încă se află în colțul din dreapta sus al următorului cadru. Dar nu te obișnuiește prea mult cu el - am găsit un înlocuitor excelent pentru el, așa că nu-l vei mai vedea.

Principiul de funcționare al dispozitivului original

Încărcătorul în sine este construit conform principiu simplu- 220 de volți sunt furnizați la înfășurarea primară a transformatorului, în consecință, tensiunea alternativă apare și pe înfășurarea secundară. Puterea poate fi controlată datorită faptului că există mai multe ieșiri din înfășurarea secundară (9 în total). Aceasta înseamnă că între primul și fiecare dintre următorii opt pini se obține totul. cantitate mare se rotește și cu cât se rotește mai multe, după cum știți, cu atât este mai mare tensiunea (adică curent sau putere - după cum doriți). Acești 8 pini merg la același comutator cu care selectați puterea curentă de încărcare a bateriei.

Se pare că între prima bornă a înfășurării secundare și ieșirea de la comutator avem tensiunea alternativă selectată de acest comutator. Dar încă nu pot încărca bateria, deoarece pentru a face acest lucru trebuie să fie transformată într-una permanentă, adică îndreptată. De aici și numele a acestui dispozitiv- redresor.

Pentru îndreptare Tensiune AC Acest încărcător folosește un lucru atât de simplu și de încredere ca o punte de diode, constând din patru diode D242 puternice montate pe radiatoare individuale și fixate pe un substrat dielectric. Deci, de la comutator, curentul curge mai întâi la intrarea punții de diode și apoi de la ieșirea sa prin ampermetru către baterie.

Selectarea unei metode de comutare a înfășurărilor secundare

Cel mai problema principala Acest proiect a fost alegerea metodei de comutare a terminalelor de înfășurare secundară menționate mai sus. Au fost multe opțiuni, dar am decis imediat să încerc cele mai nebunești și nesigure dintre ele, dar cele mai simple în ceea ce privește costurile forței de muncă - conectarea unui servomotor în loc să comutam manual poziția comutatorului:

Am atașat servomotorul la comutator, am scris rapid firmware-ul și am încercat să-l pornesc, dar, după cum s-a dovedit, nu era suficientă putere și uneori s-a blocat în cel mai critic loc, așa că această opțiune, din păcate, nu a făcut-o. nu functioneaza.

O da! Aproape am uitat! De fapt, nu erau 9, ci 10 terminale de la înfășurarea secundară, primele două au fost una pentru șase volți, cealaltă pentru doisprezece, ambele au mers la comutatorul basculant și abia apoi la puntea de diode:

Dar, din moment ce nu plănuiam să încărc bateriile la 6V, am refuzat această funcție, așa că am aruncat întrerupătorul (din design, nu în general) și am izolat firul pentru șase volți și am trecut firul de doisprezece volți. de la transformator direct la puntea de diode.

Deci cum mai faci naveta? Aici este fie tranzistoare, fie tiristoare, fie folosind relee. Și am ales ultima variantă, pentru că releele sunt mai mici decât tranzistoarele/tiristoarele și, spre deosebire de acestea, nu se încălzesc deloc dacă le iei cu rezervă de curent. Așa am făcut - am cumpărat 8 relee mici cu bobine pentru 12 volți, 4 bucăți pentru 16 amperi și 4 pentru 12 amperi spatiu liber in interiorul carcasei incarcatorului:

Algoritm de funcționare a dispozitivului

Și aici, după ce m-am hotărât în ​​sfârșit asupra metodei de comutare a ieșirilor înfășurării secundare, consider că este necesar să fac câteva „adăugiri literare” și să vorbesc despre algoritmul de funcționare a dispozitivului. Inițial, pentru a-l compila, am analizat pur și simplu acțiunile mele în timp ce încărcam bateria cu această mașină shaitan și, pe baza acesteia, am început să schițez primele lovituri ale unei noi schițe, pe care o puteți ridica. Voi cita adesea părți din el pentru a vă oferi o idee despre ce este, așa că dacă aș fi în locul dvs., l-aș deschide chiar acum și l-aș studia pe măsură ce merg.

Mai întâi, să introducem 3 cei mai importanți parametri:

// Tensiune maximă * 10
octet maxVoltageX10 = 148;

// Tensiune * 10, la care nu mai este posibilă creșterea puterii
byte powerUpMaxTreshold = 142;

// Tensiune * 10 la care puterea va fi forțată să crească
byte powerUpMinTreshold = 136;

Ele sunt înmulțite cu 10, în primul rând pentru că atunci când le calculăm este mai convenabil să folosiți numere întregi - fără rotunjire etc., în al doilea rând pentru că astfel de numere sunt de fapt afișate pe ecran, iar virgula este, parcă, virtuală, deci există nu este nevoie să faceți calcule inutile în cod și este clar că acestea sunt de 14,8, 14,2 și, respectiv, 13,6 volți.

Primul parametru spune programului tensiunea maximă admisă, dacă este depășită, puterea va fi redusă cu un nivel, iar dacă nu există unde să o reducă, încărcătorul ar trebui să se oprească pur și simplu.

Al doilea parametru va fi utilizat la începutul procesului de încărcare - după pornire, puterea va crește până când tensiunea bateriei este mai mică decât valoarea setată.

Al treilea parametru a fost introdus special pentru cazurile în care bateria conectată la mașină va fi încărcată. De exemplu, cineva a pornit radioul -> tensiunea a scăzut sub această valoare -> creștem puterea. Dar dacă sarcina care scade tensiunea la acest nivel este de scurtă durată (aprinderea farurilor sau a brichetei) sau periodică, cu o anumită frecvență (de exemplu, de la impactul unui subwoofer) și va ieși în așa fel încât de îndată ce creierul crește puterea, va fi necesar să se reducă imediat, apoi să crească imediat din nou etc.? Rezultatul va fi un cerc vicios, releele vor declanșa în mod constant, uzându-se, iar pentru baterie, poate, acest lucru nu va fi foarte util... Mai ales pentru asta, putem face ca sistemul nostru să se autoînvețe, așa cum ar fi, prin intrare parametru suplimentar:

// Dacă au trecut mai puțin de atâtea milisecunde între creșterea puterii prin powerUpMinTreshold și scăderea acesteia, atunci powerUpMinTreshold va scădea cu 1
unsigned int powerUpMinTresholdTimeout = 60000;

După cum puteți vedea din comentariu, datorită acestui parametru, powerUpMinTreshold va scădea cu o zecime de volt de fiecare dată când creierul scade puterea mai puțin decât powerUpMinTresholdTimeout în milisecunde după creșterea acesteia. Gata, problema este rezolvată: fac clic pe relee o dată, dau clic a doua oară, iar până a treia oară se vor gândi de 10 ori înainte de a face clic. Ha-ha-ha, au contactat persoanele greșite!

Ei bine, se pare că ne-am dat seama mai mult sau mai puțin de baza algoritmului, acum să trecem la detalii și nuanțe.

Am planificat imediat ca întregul sistem să fie alimentat de la baterie în sine, iar 220 de volți să fie conectați printr-un releu controlat de creier (adică Arduino), datorită căruia vom putea opri sursa de alimentare la dispozitiv în caz de urgență sau după ce bateria sa terminat de încărcat. Mai mult, vor exista mai puține scântei de la releu decât de la introducerea unui ștecher în priză, deci această opțiune este și mai fiabilă. Firește, legătura sa va fi scrisă mai jos, pentru că deocamdată discutăm doar probleme teoretice.

Procesul de comutare va avea loc după cum urmează: mai întâi va trebui să conectați ștecherul de alimentare la priză, după care, desigur, nu se va întâmpla nimic, apoi va trebui să conectați bateria în sine și dacă tensiunea este mai mare. de opt volți, întregul sistem va porni și începe să-l încarce. Dar aici intră în joc un alt parametru complicat:

// Întârziere în milisecunde înainte de începerea încărcării
unsigned int powerOnDelay = 2000;

Este necesar pentru, de exemplu, a reduce scânteile în blocul de relee, cu ajutorul căruia bornele înfășurării secundare a transformatorului vor fi comutate în dispozitivul final, deoarece pe primul releu al releului blochează curentul. va fi mai mare decât pe releul care furnizează putere transformatorului, în plus Dacă se întâmplă ceva, acest al doilea releu va fi mult mai ușor de înlocuit. Adică, atunci când bateria este conectată, puterea va crește mai întâi la unu, iar apoi, după această întârziere, releul de alimentare se va porni. Aceste patru linii de cod din procedura de creștere a puterii sunt responsabile pentru aceasta:

dacă (powerLevel == 1) (
întârziere (powerOnDelay);

}

În general, acest operator condiționat ar putea fi specificat astfel încât să fie executat o singură dată la prima pornire, dar, teoretic, dacă acest lucru se întâmplă mai târziu, când puterea scade la primul nivel de la cele mai înalte, nu se va schimba nimic, releul se va schimba. fie pornit oricum, așa că am decis să nu plantez o grădină suplimentară.

Apropo, există un parametru foarte interesant în cod:

// Nivel de putere (inițial)
byte powerLevel = 0;

El, după cum probabil ați ghicit, se instalează Primul nivel putere și a fost introdus într-un stadiu foarte incipient al dezvoltării firmware-ului și la acest moment este folosit acolo pur și simplu ca nivel curent. Lucrul curios este că dacă îl creșteți acum, atunci condiția descrisă în paragraful anterior nu va funcționa niciodată, adică 220 de volți nu vor ajunge niciodată la înfășurarea primară a transformatorului, ceea ce înseamnă că dispozitivul nu va încărca bateria. Pichalka.

Ei bine, bine, să nu vorbim despre lucruri triste. Să presupunem că am pornit dispozitivul și a început încărcarea. Totul este în regulă, dar nu uitați că, după creșterea curentului, tensiunea bateriei nu crește instantaneu, iar dacă nu faceți întârzieri înainte de a crește, atunci după pornire creierul va transfera instantaneu puterea la nivelul maxim, și acest lucru este greșit, motiv pentru care este introdus următorul parametru:

// Timp după care puterea poate fi mărită cu un nivel, în milisecunde
int powerUpTime = 5000;

Adică, între două creșteri de putere vor trebui să treacă cel puțin 5000 de milisecunde, timp în care tensiunea poate crește deja peste powerUpMaxTreshold și atunci nu va mai fi nevoie să creșteți puterea.

În ceea ce privește reducerea puterii, totul este în general simplu: programul verifică periodic dacă tensiunea curentă depășește maximul nivel admisibil, iar dacă depășește, puterea trebuie redusă:

// Putere scazuta
dacă (tensiuneX10 > maxVoltageX10) (

Dar dacă această condiție este îndeplinită, trebuie să existe două opțiuni pentru desfășurarea evenimentelor. Primul este atunci când nivelul curent de putere este mai mare de unu:

În acest caz, trebuie să setăm puterea la un nivel mai scăzut și să continuăm încărcarea. În caz contrar, când nivelul de putere era deja la cel mai scăzut nivel, pur și simplu oprim alimentarea și clipim ecranul. Zâmbim și facem semn cu mâna, pe scurt, bateria este încărcată complet!

În general, după cum a arătat practica, acele baterii pe care le-am încărcat puteau fi scoase în siguranță de la încărcare chiar și la al doilea nivel de putere, deoarece curentul deja a scăzut sub 500 mA. Cu toate acestea, nu trebuie să neglijați funcția de oprire automată - există diferite tipuri de baterii...

De asemenea, pentru reducerea puterii există un parametru de întârziere, similar cu parametrul powerUpTime pentru creștere:

//Pauză după reducerea puterii, în milisecunde
int powerDownPause = 500;

Adevărat, este implementat mai simplu, prin întârzierea obișnuită() după reducerea directă. M-am gândit că o jumătate de secundă nu este un interval atât de lung pentru a o folosi condiție suplimentarăîn declarația de selecție, dar fiecăruia al lui, așa că dacă unul dintre voi nu are ce face, în primul rând ați putea modifica această bucată de cod conform principiului powerUpTime.

Este uimitor cum am scris deja atât de multe și nu am spus de unde am de fapt tensiunea actuală. Corectarea:

void loop() (
ct=millis();

Se dovedește că la începutul fiecărei iterații a buclei, care, după cum știm, pur și simplu se repetă la nesfârșit după ce sistemul pornește, facem două lucruri. În primul rând, scriem timpul curent de când a început cipul, în milisecunde ct variabilă și apoi doar calculăm tensiunea curentă folosind procedura analogRead(), folosind numărul de intrare de monitorizare analogic specificat la începutul schiței:

// Intrare analogică pentru monitorizarea tensiunii
octet voltageInput = 5;

Și, de asemenea, 2 coeficienți, despre care voi vorbi în detaliu mai târziu:

// Coeficientul de calcul al tensiunii (împărțit la acesta)
float voltageX10Coeficient = 5,11;

// Compensarea calculului tensiunii (se adaugă)
int voltageX10Shift = 35;

Dar ar fi prea simplu dacă totul ar fi atât de simplu. Prin urmare, pentru a complica algoritmul, în cod au fost introduse încă 2 variabile:

boolean mergUp = adevărat, isUpAfter = fals;

Prima variabilă ne spune în ce stare se află în prezent procesul de încărcare. Valoarea sa este adevărată până când puterea scade pentru prima dată. Adică goingUp = true ne spune că am pornit încărcătorul nu de mult și încă încărcă bateria cu curentul maxim posibil, fără a-l reduce vreodată pentru a proteja împotriva supratensiunii.

Cu cel de-al doilea, totul este în sfârșit complicat - ne spune dacă creșterea puterii a avut loc după ce creșterea în sus a devenit falsă și este setată de următoarea bucată simplă de cod la sfârșitul procedurii de creștere a puterii:

if (goingUp == false) (isUpAfter = adevărat;)

Probabil că acum vă gândiți, de ce naiba sunt necesare toate astea? Îți explic chiar acum!

Motivul pentru adăugarea acestor două variabile a fost tocmai implementarea capacității de a încărca o baterie stând pe o mașină cu o baterie conectată la aceasta. sarcina variabila. Primul scop al funcției goingUp este de a determina parametrul prin care va funcționa creșterea puterii:

dacă ((nivel de putere<8) && (ct >powerTime + powerUpTime) && ((goingUp == adevărat && voltageX10< powerUpMaxTreshold) || (goingUp == false && voltageX10 < powerUpMinTreshold))) {

După cum puteți vedea, în prima fază de încărcare creștem puterea dacă tensiunea curentă este mai mică decât powerUpMaxTreshold, iar în a doua fază - dacă este mai mică decât powerUpMinTreshold: aceștia sunt aceiași parametri despre care am vorbit la început.

Dacă declarația condiționată scrisă mai sus este încă executată și aceeași creștere este falsă, atunci sistemul patentat intră în joc verificare suplimentară Voltaj:

boolean încăScăzut = adevărat;
dacă (în sus == fals) (
pentru (int x=0; x<= upCycles; x++){
voltageX10analogRead(voltageInput)+voltageX10Shift)/voltageX10Coeficient;
if (voltageX10 > powerUpMinTreshold) (totușiLow=fals; break;)
întârziere(1);
}
}
dacă (încă scăzut == adevărat) (

În care intră în scenă un nou personaj:

//Numărul de iterații în milisecunde ale verificării tensiunii înainte de a crește puterea
int upCycles = 5000;

Faptul este că atunci când există un semnal de creștere a puterii după ce urcarea a devenit falsă, cel mai probabil avem de-a face cu un fel de sarcină instabilă - același subwoofer, așa cum am presupus deja, sau un alt gunoi necunoscut. Și dacă da, atunci de ce nu, în loc să creștem prostește puterea, să facem din nou clic pe prețioasele noastre întrerupătoare și să riscăm să obținem tensiunea bateriei mai mare decât maximul specificat pentru o clipă simpla verificare: de 5 mii de ori (upCycles) cu un interval de o milisecundă, verificați tensiunea curentă, iar dacă măcar o dată, auziți, cel puțin o dată depășește putereaUpMinTreshold - asta este, Khan, nu va exista nicio creștere, opriți pescuitul lansete! O verificare simplă, dar eficientă.

isUpAfter, la rândul său, ne ajută să implementăm funcția de reducere powerUpMinTreshold (am vorbit despre asta la început), iată cum arată:

if ((isUpAfter == true) && (powerTime > ct - powerUpMinTresholdTimeout)) (powerUpMinTreshold = powerUpMinTreshold - 1;)

Aici powerTime este ora ultimei creșteri de putere în momentul curent.

Cert este că, pe lângă condiția powerUpMinTresholdTimeout menționată mai sus, trebuie să o reducem doar atunci când coborâm puterea după ce am ridicat-o prima dată după ce am început deja să o coborâm. Ți-am spus că asta isUpAfter este complicat!

Acesta este algoritmul, crezi sau nu. Voi vorbi despre celelalte detalii și subtilități ale sale în cursul poveștii ulterioare despre asamblarea efectivă a dispozitivului.

Pregătirea blocului de relee

Deci, după ce mi-am dat seama ce contacte ale releelor ​​sunt responsabile pentru ce și după ce am hotărât cu privire la plasarea lor unul față de celălalt, am început să lipesc:

Pentru a face acest lucru, am folosit „Momentul - Cristal” aflat în apropiere. Nu voi spune că acesta este un fel de lipici super-duper, dar proprietățile sale mi se potrivesc. Este mai bine, desigur, să folosești „Glue To Death” al lui Khaigirov, se usucă mai repede și, în general, se întărește la sfârșit, dar este de 2-3 ori mai puțin în tub și costă o dată și jumătate mai mult decât Moment. Prin urmare, așa cum a spus eroul unui bun desen animat sovietic, „Și așa va fi!”

Cât despre lipire, totul este simplu și scris pe tub - aplicați pe ambele suprafețe, așteptați 5-10 minute și strângeți bine (da, atât de tare încât cărbunele presat între role se transformă într-un diamant 😆):

Asta e tot, relyushki-urile sunt comprimate. După cum puteți vedea, contacte centrale Le-am așezat unul lângă celălalt, vor mai trebui să fie conectați unul la altul:

Am făcut același lucru cu releele mari, apoi am lipit aceste 2 blocuri rezultate împreună, după care am început să lipim firele la contacte. Firul galben gros este conectat la rândul său la toate releele - aceasta este magistrala de ieșire, care va merge apoi la puntea de diode, firele roșii sunt la primele 4 terminale de la înfășurarea secundară a transformatorului și firul galben mic. care trece pe rând prin toate releele este constantă bobine de +12 volți Și dezavantajele bobinelor, după cum probabil ați ghicit, sunt firele maro și albe, la care vom reveni în curând.

Același design, dar pe de altă parte, cu fire lipite noi pentru conectarea cablurilor de înfășurare secundară. Mai mult, cu relee mari există 2 fire per ieșire per ieșire - așa este realizat acest model de releu pentru o distribuție mai uniformă a sarcinii și, ca urmare, o generare mai mică de căldură:

Deoarece curentul consumat de bobine în astfel de relee (~100 mA) depășește cu mult curentul maxim care poate fi preluat de la Ieșiri Arduino(~40 mA) sau registru de deplasare 74HC595 (~25 mA), tranzistorii trebuie utilizați pentru a porni bobinele releului. Și vechiul portocaliu KT315 pare a fi făcut pentru asta!

Acestea sunt tranzistoare n-p-n, așa că în circuit, pentru a explica într-un mod simplu, curentul ar trebui să curgă de la plus la bobină, apoi de la acesta la colectorul tranzistorului și apoi de la emițătorul tranzistorului la minus. Acest tranzistor este deschis de curent de la bază la emițător, dar curentul necesar acolo este foarte mic, așa că conectăm bazele tranzistoarelor prin rezistențe de 1 kOhm (1000 Ohm):

Acum, tot ce rămâne este să lipiți firele scurte la rezistențe, fără a uita să izolați totul cu atenție și să-l puteți fixa - personal, am decis să lipesc tranzistoarele de partea laterală a releelor, astfel încât să nu se încurce și să nu vină nimic. oprit:

După cum puteți vedea în fotografie, tranzistoarele sunt amplasate perfect pe ambele părți ale blocului de relee, am umplut și contactele rămase cu adeziv pentru a fi sigur că nimic nu se va scurtcircuita sau arde nicăieri:

Tranzistoarele sunt lipite și blocul este aproape gata:

Acum ne confruntăm cu întrebarea - la ce ar trebui să conectăm tranzistoarele? La Arduino? Nu, atunci nu vor fi suficiente ieșiri pentru alte componente și, în astfel de situații, intră în joc cipul de economisire - registrul de deplasare 74HC595. S-au scris atât de multe despre asta pe Internet, așa că nu voi scrie aici 3 paragrafe, voi spune doar că, datorită unor astfel de microcircuite, puteți crește numărul de ieșiri Arduino, sacrificând doar trei pentru asta. Mai mult, ele pot fi conectate în serie într-un lanț. Există diferite versiuni ale unor astfel de microcircuite, de exemplu cu 16 ieșiri sau 8, în pachete diferite. În acest proiect, am decis să folosesc o opțiune cu 8 ieșiri într-un pachet mic SO-16. Deși lucrarea este rafinată, totul ocupă puțin spațiu, care deja lipsește din corpul compact al dispozitivului, care nu este proiectat pentru astfel de modificări:

Pentru a indica puterea curentă a dispozitivului, am decis să folosesc 8 LED-uri, câte unul pentru fiecare pereche tranzistor/releu, pentru aceasta am folosit un cablu cu opt fire, lipind fiecare miez la canalul de control corespunzător, dar nu direct la registru, dar la rezistențe, electric nu există nicio diferență, dar mecanic este mai fiabil, cred. După o verificare amănunțită (mai multe despre asta mai jos), am umplut microcircuitul cu același adeziv și am trecut din nou prin toate tranzistoarele cu el - acum acest sistem a devenit și mai „solid” și mai puternic:

Sistem de indicare a tensiunii

A sosit timpul pentru teste teoretice ale sistemului de afișare. Pentru a afișa tensiunea curentă a bateriei, am folosit un ecran de la o unitate de sistem veche din vremurile primelor Pentium. Nu există trucuri cu el, fiecare segment este un simplu LED verde care funcționează de la 2-2,1 volți. Singura excepție este unitatea - în ea 2 segmente sunt paralele și plasate pe un picior. Ecranul are 16 picioare în total: 1 plus și 15 minusuri. Adică, puterea este întotdeauna furnizată către plus, iar alimentarea cu pământ a unui anumit picior luminează segmentul de care avem nevoie - totul este extrem de simplu, dar cum să implementăm acest lucru? Pentru a face acest lucru, folosim din nou registre de deplasare, de data aceasta 2 piese. Pentru prototiparea pe o placă, am folosit același 74HC595, dar într-un pachet DIP-16, pentru că este mult mai convenabil să lucrezi cu ele. În imaginea următoare, după cum puteți vedea, sistemul este deja asamblat și funcționează:

Dar acest sistem foarte diferit de ceea ce a intrat în dispozitivul final. Să începem cu faptul că inițial am decis să folosesc un stabilizator pentru a alimenta ecranul, deși până la urmă l-am abandonat și am conectat fiecare picior al ecranului printr-o rezistență de 560 Ohm În al doilea rând, în această diagramă, LED-urile sunt alimentate printr-un altul stabilizatorul, în plus, alimentează și registrul de deplasare în sine. Dar în cele din urmă, în încărcătorul meu a rămas un singur stabilizator - KREN5V, fabricat înapoi în URSS, așa cum ați ghicit, 5 volți.

Cu toate acestea, în această etapă, metoda de alimentare a hardware-ului nu era atât de importantă - principalul lucru a fost să înveți cum să afișezi informații semnificative pe ecran, pentru care a fost necesar să aflăm cărui segment îi corespundea fiecare dintre pinii de registru și apoi creați două matrice în firmware - zeci și unități, în care, folosind unu și zerouri, introduceți masca dorită pentru fiecare număr afișat, adică 0-19 pentru primele două caractere ale ecranului și 0-9 pentru al treilea caracter:

// Șabloane pentru ecran
char* zeci=("10000001","10111011","01100001","00101001","00011011","00001101","00000101","10101011","00000001","00000001","000010","000",0","000","0","00", 10111010","01100000","00101000","00011010","00001100","00000100","10101010","00000000","00001000");
char* ones="10000010","10111110","10001001","10011000","10110100","11010000","11000000","10111010","10000000","10010000");

De asemenea, s-a schimbat ordinea de conectare a registrelor în procesul de muncă ulterioară - blocul de relee va fi primul din lanț și abia apoi ecranul, releele sunt încă mai importante, cu toate acestea, în acest moment nu este așa. semnificativ, pentru că ordinea nu contează semnificație deosebită- doar în firmware, în procedura de ieșire, trebuie să schimbați câteva linii și asta este tot.

Când sistemul a început să funcționeze, în locul celui de-al treilea registru de schimbare, am conectat la el un bloc de relee gata făcut. Și pentru ca releele să declanșeze, aveam nevoie de o sursă de alimentare de doisprezece volți (nu de la un comutator chinezesc, ci unul stabilizat, cu selecție lină a tensiunii). Dacă doriți să folosiți unul nestabilizat, folosiți unul de nouă volți, sau chiar 7,5 - vor avea 12 volți fără sarcină. Principalul lucru este să nu confundați constanta cu variabila! Următoarea fotografie arată cum sunt conectați 12 volți la duze cu două mufe cu fire în colțul din dreapta sus 🙄

Ecranul funcționează deja! Am scris o schiță care afișează alternativ numere de la zero la 199 pe ecran și reprezentarea lor binară pe LED-urile din dreapta. Ei bine, este distractiv!

Lucrul cu registrele de deplasare, așa cum am spus deja, se realizează pe trei fire. Numerele lor de contact sunt setate chiar la începutul schiței mele:

// Contact care este conectat la intrarea ST_CP a 74HC595
int latchPin = 8, voltageX10,voltageGuard,ons,dz,
// Contact care este conectat la intrarea SH_CP a 74HC595
clockPin = 12,
// Contact care este conectat la intrarea DS a 74HC595
dataPin = 11;

Când sistemul pornește, modul de funcționare al acestor contacte, ca și celelalte pe care le folosim, este setat la IEȘIRE:

void setup() (
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(releu220Pin, IEȘIRE);
pinMode(fanPin, OUTPUT);

Ei bine, ieșirea informațiilor către registre arată astfel:

digitalWrite(latchPin, LOW);



Mai mult, inițial shiftOut() ia ca intrare variabila de tip octet și, deoarece este mult mai clar pentru noi să scriem direct unu și zerouri în registre, codul folosește functie speciala bitseq(), care convertește modelele de mai sus în exact ceea ce shiftOut() vrea să facem:

octet bitseq (car s)(
octet ab=0;
pentru (octetul ba=0; ba<8; ba++){
dacă (s == "0") (bitWrite(ab,ba,0);) else (bitWrite(ab,ba,1);)
}
întoarcere ab;
}

Până atunci, desktopul meu arăta ceva ca următoarea fotografie. Nu vă băgați mintea întrebându-vă ce este o ambulanță. Mișto serial, îl văd deja pentru a doua oară. 🙄 Apropo, pentru a conecta circuite non-alimentare în dispozitivul meu, am folosit cablu torsadat, același din categoria 5e, doar că am o mulțime - nu arunc cabluri vechi de pe acoperiș, ci desfășuresc lor. Dar nu toate cablurile sunt bune pentru astfel de lucruri. Cele pe care le-am folosit nu sunt solide în interior, ci șuvițe, ceea ce le face foarte elastice și nu sunt casante și au și izolație de înaltă calitate. Dar nu aș folosi un cablu obișnuit cu perechi răsucite cu miezuri solide - se îndoaie foarte strâns (bine, relativ) și ar fi complet nerezonabil să-l lipim la microcircuite mici într-un pachet SO-16. Ce zici, ar fi trebuit să folosească DIP mikruhi? Ha, încă nu ați văzut ce fel de masochism va începe chiar acum, așa că să nu tragem pisica de coarne (da) - să mergem!

De fapt, nu este o idee atât de rea să plasați cipuri mici în interiorul indicatorului. La urma urmei, oricum nu există spațiu în carcasa veche, panoul frontal trebuia așezat pe distanțiere mici, iar dacă aș fi folosit registre în carcasele DIP - wow, nu știu cum s-ar potrivi totul acolo!

După cum am spus deja, în versiunea finală segmentele sunt conectate prin rezistențe, și nu direct, dar, cu toate acestea, am decis să arăt și prima opțiune: poate cuiva îi va plăcea mai mult. Deoarece acest ecran în sine este umplut cu ceva pe verso (ce lucruri dezgustătoare sunt aceste ecrane de umplere ale tale), iar suprafața acestei umpluturi este, de asemenea, concavă spre interior, am decupat o mică placă plată dintr-un card de plată din plastic, ghici care monopolist belarus în domeniul telecomunicațiilor, pe care l-am lipit direct pe ecran și apoi am lipit registrele în sine pe el, după ce am marcat în prealabil primul etapă pe spatele fiecăruia dintre ele (pentru că „Nu amesteca vederile, Kutuzau! ”).

După ce am lipit toate firele și, din nou, am verificat că totul funcționează, am umplut totul cu lipici. Pentru că o mișcare greșită și firul se va rupe din contact, scurtcircuita ceva și va fi o mizerie mare, mare. Dar acest lucru nu se va întâmpla cu lipici, totul este bine cu lipici. Lipici, pe scurt, reguli. Până când trebuie să-l rupi 😆 👿 Dar să nu vorbim despre lucruri triste, iată ce s-a întâmplat după aceste manipulări:

Așa că am conectat chiar și aceste două blocuri împreună (temporar, totuși), astfel încât să mă pot bucura din nou de numerele care clipesc și de comutatoarele care fac clic:

Din păcate, la combinarea ecranului cu registrele într-unul singur, a trebuit să schimb ușor ordinea în care picioarele lui erau conectate, așa că după ce am pornit întregul sistem, în loc de cifre arabe, am văzut câteva extraterestre:

Deși, de fapt, există puțin extraterestru în unu și nouă, doar în mijloc era un fel de gunoi, dar toate acestea sunt lucruri minore. Următorul pas a fost să înșurubați un voltmetru, adică să creați un senzor de tensiune, deoarece algoritmul de funcționare al încărcătorului meu ar trebui să depindă de tensiunea curentă.

Măsurarea tensiunii cu Arduino

Arduino este un lucru bun, inițial are intrări analogice pe care poți monitoriza tensiunea în timp real. Singura captură este că domeniul de măsurare al acestor intrări se extinde de la zero la doar cinci volți, dar tensiunile noastre vor fi de aproape 15, așa că această problemă trebuie rezolvată cumva. Și aici ne vine în ajutor un simplu divizor de tensiune folosind două rezistențe. De exemplu, pentru maximul absolut vom lua 20 de volți (bine, pentru orice eventualitate, astfel încât să nu se ardă nimic, dacă ceva), iar plafonul nostru este 5, adică un sfert din maxim, ceea ce înseamnă că trebuie să Împărțiți tensiunea cu 4. Pentru a face acest lucru, luați 2 rezistențe de astfel de valori încât valoarea primului este 1/4, iar valoarea celui de-al doilea este 3/4 din suma valorilor lor. De exemplu, 10 și 30 kOhm. Sau 5 și 15 kOhm, sau 2,5 și 7,5, ei bine, ați înțeles ideea. Nu merită să luați mai puțin, pentru că curentul acolo este mic. Ei bine, conectați conform diagramei: 10 între intrarea analogică și masă și 30 între intrarea analogică și ieșirea de încărcare a bateriei.

Dar nu este atât de simplu - procedura analogRead() vă va oferi o valoare de la 0 la 1024, unde zero este zero și 1024 este 5 volți pentru ea sau 20 volți pentru noi. Prin urmare, pentru a recalcula această valoare, trebuie să introducem un anumit coeficient, pe care îl vom seta ca constantă în antetul firmware-ului (float voltageX10Coefficient = 5,11;). Privind puțin înainte, voi spune că ulterior tensiunea pe care o vede Arduino, la un curent mare, a început să sară cu o răspândire de până la jumătate de volt, așa că a trebuit să ne conectăm senzorul improvizat printr-o diodă, după care am instalat un condensator de 16V 1000 mF și am conectat și un releu de 220 acolo B, dar mai multe despre asta la sfârșit. De ce vorbesc despre asta acum? Deoarece dioda, după cum știți, scade ușor tensiunea, așa că am introdus un al doilea coeficient pentru a compensa prezența acestei diode (int voltageX10Shift = 35;), adică mai întâi se adaugă al doilea coeficient la valoarea de ieșire și atunci ceea ce se întâmplă se împarte la primul .

Ca rezultat, monitorizarea tensiunii s-a dovedit a fi un succes - comparați citirile cu testerul (aceasta nu este o baterie conectată la dispozitiv, ci aceeași sursă de alimentare stabilizată de casă):

Panoul frontal al încărcătorului

Apoi, este timpul să lucrăm pe fața dispozitivului nostru. Inițial, m-am gândit să fac un nou panou și să-l lipesc acolo, dar după ce m-am gândit la asta, mi-am dat seama cum să folosesc vechile inscripții, așa că totul s-a dovedit destul de semnificativ. În locul regulatorului de curent, sunt găurite pentru LED-uri, iar săgeata de sus arată doar în ce direcție curentul va fi mai mare, cât de tare!

Acum LED-urile au fost deja montate, iar ecranul a fost introdus într-un loc nou și până și găurile rămase și-au găsit o utilizare: în orificiul de la regulatorul actual va fi un bec conectat la înfășurarea primară a transformatorul - se va aprinde atunci când încărcarea este în curs, adică atunci când transformatorul este alimentat cu 220 de volți. Și dacă încărcătorul pare că se încarcă, dar lumina nu se aprinde, atunci verificați dacă ați uitat să conectați ștecherul la priză! În orificiul de la întrerupătorul de 6-12 volți există o margine de plastic introdusă pentru un LED, care va fi conectat direct la baterie printr-un rezistor fără stabilizator și luminozitatea strălucirii acestuia va arăta cât de încărcată este bateria. Acest lucru este util dacă bateria este complet descărcată și nu există nici măcar cinci volți pe ea pentru a alimenta creierul - atunci dioda va străluci slab și nu vor fi întrebări, ca și cum poate dispozitivul este stricat. Deși, bineînțeles, îmi pun o scuză: dacă nu ar fi o gaură, nici nu m-aș gândi să introduc ceva acolo. Asta se întâmplă de obicei cu bărbații, dacă știi la ce mă refer.

Apropo, spuneți, unde ați văzut, Andryusha, bateriile de mașini descărcate la 5 volți? Ei bine, pe atunci nu le văzusem nicăieri, dar după ce am terminat lucrul la acest încărcător mi-au adus unul dintre acestea. 3 volți. Și chiar l-am încărcat și este chiar viu, deși, după cum cred, este sulfatat până la moarte. A fost al doilea într-o stare similară, dar nimic nu l-a putut salva 😆

Iată cum arăta partea din spate a botului la acel moment:

Și în fotografia următoare, desprind încet lipiciul și înlocuiesc firele cu rezistențe. Desigur, am amputat și stabilizatorul din colțul din stânga jos al fotografiei, deoarece nu era necesar. Și apropo, lipirea rezistențelor este mult mai ușoară decât cablarea - dacă aș face totul din nou acum, aș face-o imediat, cu rezistențe și aceste mici microcircuite.

Tot în această fotografie din colțul din stânga sus puteți vedea cum am conectat LED-urile. Au un minus comun, merge de-a lungul razei interioare și este conectat la minus general dispozitive printr-un rezistor de 3,3 kOhm - pe acesta l-am ales astfel încât să fie strălucitor și să nu orbească. Se pare că a ieșit corect. De ce există un singur rezistor? Pentru că în orice moment, cu excepția momentului în care sarcina este comutată între relee, pe afișaj se va aprinde un singur LED.

De ce cu excepția momentului comutării? Pentru că dacă un releu se oprește, iar al doilea apoi pornește - în momentul în care primul este oprit și în momentul în care al doilea este pornit, pe contactele lor va apărea o scânteie, din aceste scântei se vor forma depozite de carbon pe contacte, datorită cărora vor eșua în timp - dacă rezistența lor va crește, vor începe să se încălzească și asta este, memento sea! Așa că este corect să pornim mai întâi al doilea releu și, de îndată ce acesta pornește, îl oprim pe primul, apoi scăpăm de scântei și releele vor trăi fericiți pentru totdeauna! Apropo, pe comutatorul original totul se face exact așa, așa că nu, nu am venit cu asta, aplauze și flori în mașină sunt trimise în acest caz designerilor dispozitivului original și nu dvs. umil slujitor. Ei bine, nu totul este Maslenitsa pentru pisică. 🙄

Apropo, întârzierea de comutare între relee este setată de acest parametru:

// Durata tranziției între relee în milisecunde
byte relayTransition = 80;

Dar ce se va întâmpla dacă, într-un fel prin magie, două sau mai multe relee se pornesc în același timp pentru o perioadă mai mare decât timpul alocat pentru comutare, din cauza unui fel de defecțiune? Dar va fi foarte rău: vei scurtcircuita o secțiune a înfășurării secundare. Firele vor începe să se topească, va veni fum de la transformator și va avea loc în general Armaghedon. Același pe care l-a filmat Michael Bay.

Așadar, dragi domni, doamnelor și van-damms, mai ales în acest scop am venit cu un sistem de protecție împotriva unui astfel de Armaghedon. Un rezistor de 220 Ohm este conectat la pozitivul fiecărui LED. De ce 220? În primul rând, pentru că în acea zi Luna era în Saturn și, în al doilea rând, pentru că înainte de Anul Nou am avut ocazia să lipim câteva casetofone domestice, precum și un pian electronic la fel de domestic (sau un pian, nu Știu, dar nu un pian pe scurt), așa că de acolo am dezlipit o cutie întreagă din aceste rezistențe de 220 Ohm, trebuie să le pun undeva - deci, mare folos!

Pe de altă parte, toate aceste rezistențe sunt conectate și trase la masă printr-un rezistor de 4k7 (aceasta înseamnă 4,7 kOhm, este timpul să numim un pică!), din care am, de asemenea, un rahat și multe altele. Deci măsurăm tensiunea în acest punct G, unde toate aceste 9 rezistențe converg, adică conectăm acest punct la următoarea intrare analogică a Arduino, care este setată de următorul parametru:

// Intrare analogică pentru monitorizarea numărului de relee pornite
byte guardInput = 4;

Și de la această tensiune vedem imediat câte LED-uri sunt aprinse acolo în acest moment și, din moment ce sunt conectate direct la tranzistori, acesta este același lucru pe care îl vedem, câte relee sunt pornite în acest moment și asta este exact ce ne trebuie si este necesar in aceasta situatie! Adică, setăm un prag de tensiune, peste care în primul rând tăiem imediat 220 de volți folosind releul corespunzător și, în al doilea rând, încercăm să corectăm situația cu releele și, de îndată ce este corectată, pornim din nou 220 și continuăm. să lucreze de parcă nimic nu ar fi în neregulă s-a întâmplat. Totul este simplu și de încredere, l-am verificat!

Acest prag este stabilit aici:

// Valoarea guardInput maximă permisă
byte guardTreshold = 160;

Și procedura de verificare descrisă mai sus este efectuată în fiecare ciclu al buclei și arată astfel:

// Verificați numărul de comutatoare pornite și opriți automat - restaurați - porniți
dacă (voltageGuard > guardTreshold) (
digitalWrite (releu 220Pin, LOW);
în timp ce (voltageGuard > guardTreshold) (
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, bitseq(one));
shiftOut(dataPin, clockPin, MSBFIRST, bitseq(zeci));
shiftOut(dataPin, clockPin, MSBFIRST, bitseq(relee));
digitalWrite(latchPin, HIGH);
voltageGuard=analogRead(guardInput);
}
digitalWrite (releu220Pin, HIGH);
}

Și acum vă voi arăta în continuare fotografia pe care am promis-o cu 9 paragrafe în urmă, fie și doar de dragul decenței:

Și capacul scos ne arată tensiunea. Dragalasenie!

releu de alimentare AC

Cu toate acestea, trebuie să mergem mai departe. După cum puteți vedea, încărcătorul este asamblat treptat, firele sunt lungi treptat și două personaje noi apar pe scenă - același releu de 220 de volți și un mic răcitor de doisprezece volți - optzeci de la computer:

Relyukha este obișnuită, nu diferă de ceilalți. Trage 220 de volți la aproximativ 10 amperi. Dar nu avem nevoie de asta, avem o siguranță de 1 amper. Dar o rezervă în astfel de lucruri este bună, este fiabilitate. Bobina acestui releu funcționează la 12 volți, dar există altele asemănătoare pentru 5. Am cumpărat 25 dintre acestea deodată de pe Ali, ieftin. De ce am luat 12 si nu 5? Uite, indiferent unde l-am pornit, tot mi-ar trebui un tranzistor, nu? Chiar daca era de 5 volti. Dar dacă este la 5, trebuie să fie conectat printr-un ciot, prin care toate creierele sunt deja alimentate, s-ar încălzi și mai mult din asta - de ce naiba este atât de necesar? Puteți trage direct la 12, dar cel puțin 15 vor fi acolo - nu-i pasă, ea lucrează. Mai mult, pornind de la opt volți. Am conectat LED-ul la el pur și simplu pentru a fi indicat în timpul testării, de parcă dacă LED-ul se aprinde, înseamnă că funcționează și aproape 220 de volți au mers la transformator. Este conectat direct la ieșirea arduino, prin același KT315, la fel ca celelalte relee din același bloc. Și da, rezuk-ul este și de 1 kOhm, deși probabil 2 vor funcționa acolo, le puteți instala pe cele mai mari, dar rețineți că cu cât valoarea rezuk-ului este mai mică, cu atât mai mult curent va trece prin tranzistor. Pentru eficiența energetică generală, acești + - câțiva miliamperi nu contează, dar pentru ieșirile de curent scăzut ale Arduino și registre - nu chiar, așa că gata.

Pornirea acestui releu, așa cum probabil ați înțeles deja, are loc folosind

digitalWrite (releu220Pin, HIGH);

Și stingerea cu

digitalWrite (releu 220Pin, LOW);

Conectarea unui răcitor pentru a răci încărcătorul

Dar coolerul pare să consume 140 de miliamperi, judecând după autocolantul de pe el, așa că KT315 nu va funcționa aici, conform specificațiilor sunt doar până la o sută, așa că am luat KT815A. Se ridică la o mie și jumătate de miliamperi și va fi suficient. Există și alte opțiuni, doar încerc întotdeauna să folosesc ceea ce am o mulțime, poate că tu, de exemplu, vei avea un alt tranzistor pentru răcitor, dacă trage până la 20 de volți și până la 150 de miliamperi - pune-l, dacă n-p-n, apoi uitați-vă doar la pinout-ul picioarelor și, dacă este p-n-p, atunci trebuie să schimbați puțin circuitul, dar în acest caz, totul este neimportant. Dar mai este o nuanță aici...

Ai auzit vreodată un scârțâit mai rece? Nu, nu din rotație, doar scârțâit? Nici eu nu am auzit, dar am avut noroc aici. Și totul pentru că Arduino valori intermediare tensiunile de ieșire (mai mult de zero, dar mai puțin de cinci) sunt generate folosind PWM, adică acestea sunt fluctuații de tensiune rapid-rapide, modulatorul de lățime a impulsului însuși funcționează pe o anumită frecvență, iar tranzistoarele, după cum știți, știu și cum să funcționeze la frecvențe specificate, astfel încât aceste impulsuri sunt transmise prin tranzistor la răcitor și, datorită arhitecturii sale, începe să scârțâie. Nu voi intra în detalii, deoarece nu le cunosc eu însumi, dar toate acestea pot fi tratate prin conectarea unui conductor de 100 mF cu un plus pe bază și minusuri pe emițătorul acestui tranzistor. Tensiunea de acolo este de până la 5 volți, astfel încât condensatorul poate fi setat la cel puțin 6,3 volți. Gata, scârțâitul va dispărea și nu va fi nimic!

Numărul contactului PWM prin care este controlat răcitorul este setat de următorul parametru:

// Ieșire pentru controlul ventilatorului
octet fanPin = 6;

Vitezele sale de la zero (0V) la 255 (5V) cu referire la nivelurile de putere sunt stabilite de următoarea matrice:

// Setările vitezei ventilatorului
byte fanSpeeds=(0,0,80,90,100,110,120,180,255);

Și chiar setarea acestor viteze este prescrisă în procedurile de creștere și scădere a puterii:

analogWrite(fanPin,fanSpeeds);

Apropo, iată o privire mai atentă asupra releului cu răcitorul:

Lucrări suplimentare la panoul frontal

Dar să mergem mai departe. Aici am încercat deja siguranța în locul ei în carcasa nouă - cea veche ar fi avut mai multe tensiuni, deși, de fapt, a fost folosită doar una și s-a rupt o bucată din ea, iar aceasta este ca nouă, 220 de volți, din proviziile tatălui meu. Ei bine, am instalat același LED de jos și l-am lipit cu același adeziv.

În sfârșit, este timpul să asamblați și să puneți panoul frontal la loc! După cum puteți vedea, toate firele sunt deja lipite, chiar și Krenka de cinci volți iese din partea de jos a cadrului, distanțierele sunt înșurubate în corp pentru a muta puțin panoul (am vorbit deja despre asta), deoarece anterior a fost atașat aproape de corp. După cum puteți vedea, în multe locuri am introdus firele în carcase, astfel încât nimic să nu se rupe sau să se scurteze nicăieri. 12 volți la Krenka vin direct de la puntea de diode, cu un fir de o clasă mai mare decât o simplă pereche răsucită. Minusul este conectat direct la minusul comun, dar plusul se conectează printr-o diodă, altfel Vasya Pupkin va inversa polaritatea la conectarea bateriei și gata, finita la comedy, reface jumătate din componentele arse! Și astfel poți fi calm.

După ce mi-am dat seama de câteva ori cum vor merge firele între carcasă și panou, am decis să le lipesc în locurile potrivite, astfel încât să nu atârne sau să nu stea în cale, le-am apăsat cu obiecte improvizate pe deasupra, le-am fixat cu agrafe de rufe și le-a lăsat acolo peste noapte, astfel încât adezivul să se usuce:

Instalarea controlerului Atmega328P cu cablaj și alte elemente

Până atunci, pe jumătate din aceleași plăci de montare, montasem deja cea mai mare parte din componentele rămase - o priză pentru un microcircuit, cuarț, conductori, un tranzistor pentru un răcitor etc. și așa mai departe.:

Placa în sine trebuia tăiată pe o parte - era prea mare și nu se potrivea. Partea de jos, iar apoi am înfășurat totul cu bandă de hârtie, astfel încât să nu scurtcircuiteze nimic în timpul procesului.

Până la acel moment, panoul frontal fusese deja instalat în sfârșit la locul său de onoare, iar Krenka de cinci volți a fost înșurubat pe carcasă din spatele panoului printr-o garnitură izolatoare conducătoare de căldură și o inserție de plastic pentru șurub - datorită acestui lucru. , microcircuitul va fi răcit în mod fiabil prin carcasa metalică masivă, fără a fi conectat electric la acesta.

Configurarea finală a parametrilor dispozitivului

Aici puteți vedea deja cum funcționează sistemul semiasamblat, dar din nou, până acum doar de la sursa de alimentare, deoarece în designul meu priza pentru a porni bateria este conectată în ultimul moment. Ei bine, sa întâmplat, ce să faci...

După ce l-a pornit, s-a descoperit că la un curent mare, când ampermetrul iese din scară, încărcătorul vede o tensiune de 0,5-0,8 volți mai mult decât cea care este de fapt pe baterie în acest moment. Testul a arătat că s-a pierdut până la jumătate de volt pe fire, așa că le-am înlocuit cu altele mai bune, cu o secțiune transversală mai mare și le-am lipit la o mufă rece care era foarte potrivită pentru designul general al dispozitivului. Acest lucru a rezolvat problema, dar nu 100 la sută - la curenți mari a rămas o diferență. Dar m-am gândit că acesta nu este un bug, ci o caracteristică, pentru că nu are rost să încărcați bateria cu curenți atât de mari - lăsați-o să funcționeze ca un fel de factor limitator!

Aici, apropo, încărcarea bateriei tatălui este în plină desfășurare, asta se vede pe ampermetru. Adevărat, becul de 220 de volți s-a dovedit a fi destul de slab și în fotografii este aproape imposibil să vezi că este aprins. Dar arde, crede-mă!

Încărcătorul este gata!

Iată o vedere de jos a dispozitivului. Inițial, am plănuit să sigilez întregul spațiu dintre carcasă și panou, dar apoi m-am răzgândit - este mai bine să-l las să fie ventilat!

Vedere din partea stângă. Ei bine, sau din dreapta - depinde de cum te uiți la asta, scuză jocul de cuvinte.

Ei bine, asta e de sus. Aici puteți vedea că am lipit panoul de partea proeminentă a ampermetrului - s-a dovedit a fi un al treilea punct mare de sprijin, altfel panoul a stat cumva instabil. Și așa totul este grozav, de încredere și frumos! Apropo, imaginați-vă dacă în loc de un Cristal aș folosi un Moment obișnuit, iar prin gol ar fi vizibil toate aceste porcării galbene deschise. Fuuuuuck! 😳

Și, desigur, vederea din spate. Am atașat ventilatorului o grilă frumoasă care protejează degetele și alte membre ale oamenilor și animalelor de răni. Și aici puteți vedea noul cablu de alimentare, care după încărcare se înșurubează convenabil pe cooler și nu deranjează pe nimeni!

Apropo, după asamblarea și testarea dispozitivului, a trebuit să-l demontez din nou pentru a unge acest nenorocit de răcitor, de ce nu l-am uns imediat, a existat un astfel de gând???

Acesta este primul meu proiect pe un microcontroler programabil. Am petrecut aproape o lună lucrând la el seara. Mi-am luat chiar și o pauză de o săptămână pentru că m-am săturat de asta, munca asta e atât de plictisitoare sau ceva de genul ăsta. Dar sunt fericit. Sunt multumit de experienta, ma bucur ca am reusit sa termin aceasta treaba, ma bucur ca am acum un incarcator automat excelent din clasa „set it and forget it”. Și mă bucur că atunci când prietenii sau cunoscuții mei mă întreabă dacă am un încărcător pentru bateria lor, le voi înmâna și le voi spune cu mândrie că eu am fost cel care am făcut chestia asta cool!

În urmă cu câțiva ani, mi-am propus să dezvolt un set de dispozitive ieftine care să permită orbilor să se adapteze mai bine la lumea din jurul nostru. Până în prezent, împreună cu o echipă de oameni cu idei similare, am reușit să implementez mai multe proiecte.

În acest articol vreau să vorbesc despre atașamentul cu ultrasunete pe baston și despre cheiul cu ultrasunete - dispozitive cu drepturi depline care sunt asamblate din module ieftine, disponibile.

Un atașament pentru baston cu ultrasunete și o cheie cu ultrasunete sunt dispozitive pentru nevăzători care avertizează asupra obstacolelor situate deasupra nivelului la care pot fi detectate cu ajutorul unui baston obișnuit. Astfel de obstacole pot fi mașini înalte, bariere, garduri înalte. Atașamentul cu ultrasunete este atașat de un baston obișnuit, iar brelocul cu ultrasunete este atârnat de gât sau purtat în mână ca o lanternă.

Funcționarea dispozitivelor se bazează pe reflectarea undelor ultrasonice din obstacole. Măsurând diferența de timp dintre momentul generării impulsului și momentul recepționării semnalului de eco reflectat, se poate determina distanța până la obstacol.

Pentru a dezvolta dispozitive, este necesar să selectați un senzor pentru măsurarea distanței, o placă de control și un dispozitiv de semnalizare, selectați bateriile, o metodă de încărcare a acestora și carcase adecvate.

Senzor cu ultrasunete

Pentru a măsura distanța până la un obstacol, au fost testate două dispozitive:
  • Modul cu ultrasunete compatibil Arduino HC-SR04
  • Senzori de parcare auto HO 3800
Ambele dispozitive funcționează pe un principiu similar. Diferențele constau în modelul direcțional al senzorilor, raza maximă de detectare a obstacolelor și design.
Comparația parametrilor senzorului:

În timpul testelor, s-a dovedit că modulele HC-SR04 au o capacitate ceva mai slabă de a detecta obstacole și de a funcționa în condiții climatice dificile (reci).

Ambii senzori, în ciuda diferențelor lor, pot fi utilizați într-un atașament cu ultrasunete ca mijloc de măsurare a distanței până la un obstacol, astfel încât principalul parametru pentru noi atunci când alegem un senzor a fost prețul. Ne-am hotărât pe senzorul HC-SR04 mai ieftin.

Panou de control

Platforma Arduino a fost aleasă ca placă de control. În cazul nostru, cele mai aplicabile plăci sunt versiunile miniaturale: Arduino Mini, Arduino Nano sau Arduino Pro Mini. În general, orice alt controler care oferă capabilități similare poate fi utilizat.

baterii

Pentru a furniza energie dispozitivului, este recomandabil să utilizați baterii cu litiu-ion (Li-ion) sau nichel-hidrură metalică (Ni-Mh).

Când funcționează în condiții climatice normale, este logic să folosești baterii Li-ion, care au următoarele avantaje în comparație cu Ni-Mh:

  • ușurința de implementare a circuitului de încărcare
  • disponibilitatea modulelor de încărcare gata făcute
  • tensiune de ieșire mai mare
  • varietate dimensiunile per totalși containere
La temperaturi scăzute, este de preferat să folosiți baterii Ni-Mh.

Tensiunea la ieșirea unei baterii Ni-Mh (1,0 -1,4 V) nu este suficientă pentru a funcționa dispozitivul. Pentru a obține o tensiune de 5 V (necesară atât pentru funcționarea Arduino, cât și a senzorului de parcare), pe lângă baterii, vom folosi un convertor boost DC-DC.

Pentru a opera convertoarele DC-DC pe care le-am selectat, este necesar să se asigure o tensiune de intrare de 0,9-6,0 V. Pentru a obține tensiunea de ieșire necesară, se poate folosi un element Ni-Mh cu o tensiune de 1,2 volți. Cu toate acestea, pe măsură ce scade tensiunea de intrare, scade și capacitatea de sarcină a convertorului, deci pt funcționare stabilă Este recomandabil să alimentați dispozitivul cu cel puțin 2 V la intrarea convertorului (două elemente Ni-Mh de 1,2 V fiecare sau un element Li-ion cu o tensiune de 3,7 V). Rețineți că există convertoare DC-DC pentru care o tensiune de intrare de 1,2 V nu este suficientă.

Încărcarea bateriilor

Pentru baterii Li-ion Există multe module ieftine gata făcute, cu indicație de sfârșit de încărcare.

În cazul bateriilor Ni-Mh totul este mai complicat. Nu am găsit nicio soluție integrată gata făcută pe piață în acest moment. Pentru a încărca bateriile Ni-Mh, puteți folosi încărcătoare externe specializate sau puteți crea propriul circuit de încărcare.

O modalitate de a încărca o celulă Ni-Mh este conexiune serială cu o baterie de doi stabilizatori liniari LM317 (sau similar): primul - în modul de limitare a curentului, al doilea - în modul de limitare a tensiunii.

Tensiunea de intrare a unui astfel de circuit este de 7,0-7,5 V. În absența răcirii stabilizatorilor, nu se recomandă depășirea acestei tensiuni. Tensiunea fiecărei baterii Ni-Mh în timpul încărcării ar trebui să fie de aproximativ 1,45 V (tensiunea unei celule Ni-Mh complet încărcate). Pentru a evita supraîncălzirea și defectarea microcircuitelor, curentul de încărcare a bateriei nu trebuie să depășească 100 mA și poate fi crescut la 200 mA atunci când se utilizează radiatoare adecvate.

Avantajul acestei scheme de încărcare este că nu este nevoie să controlați starea de încărcare: atunci când tensiunea necesară pe element este atinsă, curentul va scădea automat la un minim sigur.

Alarma

În funcție de alegerea canalului de avertizare (auditiv sau tactil), este selectat un actuator - un sonerie sau un motor cu vibrații. În plus, puteți combina ambele metode de notificare, oferind utilizatorului posibilitatea de a comuta între ele.

În timpul testării prototipurilor, am aflat că este cel mai convenabil să transmitem informații despre apropierea unui obstacol prin vibrații, deoarece în acest caz nu se ocupă de ceva foarte important pentru persoana oarba canal audio. De aceea, toate produsele noastre proiectate și asamblate folosesc vibrații pentru a avertiza despre obstacole. Intensitatea vibrației este proporțională cu distanța până la obstacol.

Cadru

Nu am putut găsi o carcasă convenabilă pentru atașarea bastonului cu ultrasunete printre carcasele produse în serie. Pentru a testa dispozitivul, am folosit o carcasă din plastic ABS imprimată 3D. Pentru a imprima carcasa pe o imprimantă 3D, am dezvoltat următorul model 3D:

Rezultatul testului prototipurilor

În timpul procesului de dezvoltare, au fost colectate peste 12 opțiuni de produs. Fiecare produs nou a eliminat neajunsurile celor anterioare: în timpul procesului de dezvoltare am redus dimensiunile și greutatea produsului, am selectat un senzor cu ultrasunete care ne-a satisfăcut atât ca preț, cât și ca caracteristici tehnice, am renunțat la utilizarea unui canal audio și am optimizat funcționarea. algoritmul dispozitivelor. Împreună cu orbi (Bortnikov P.V., Shalintsev V.A.), au fost efectuate teste ale tuturor produselor asamblate. Ca rezultat, am obținut proba finală.

Mai jos este o schemă electrică schematică a dispozitivului dezvoltat:

Când este dezasamblat, brelocul cu ultrasunete pentru gât arată astfel:

Toate componentele utilizate în asamblare, cu excepția carcasei imprimate 3D pentru atașarea bastonului, au fost achiziționate prin AliExpress:

  1. Senzor cu ultrasunete HC-SR04.
  2. Placa de control Adruino Pro Mini.
  3. Baterie reîncărcabilă 3,7 V 300 mAh.
  4. Convertor de tensiune 0,9V ~ 5V la 5V 600 mA.
  5. Modul de încărcare AC/DC 220V până la 5 V 1 A.
  6. Încărcător LA-520W.
  7. Alarma: motor vibratie pt telefon mobil 4x10mm DC 3V.
  8. Buton PB-22E60.
  9. Carcasa Gainta G1906 (pentru cheie).
  10. Tranzistor: bss138/bcr108 sau optocupler CPC1230N.
Aspectul și prețurile (inclusiv livrarea din China) componentelor utilizate pentru asamblarea capului cu ultrasunete pe baston sunt prezentate în figură:

Dintre componentele utilizate în timpul asamblarii, cea mai mare contribuție la costul dispozitivului o are carcasa imprimată 3D.

Aspectul și prețurile (inclusiv livrarea din China) componentelor utilizate pentru asamblarea cheii cu ultrasunete sunt prezentate în figură:

În viitor, puteți dezvolta o montură pentru corpul Gainta G1906 și puteți utiliza un dispozitiv cu un astfel de corp ca atașament pentru un baston.

Una dintre modalitățile de a reduce costul dispozitivelor este de a economisi costurile cu forța de muncă și costul livrării componentelor dispozitivelor în Rusia, prin implementarea producției direct în China.

Dispozitivele dezvoltate de noi au următoarele caracteristici:

După efectuarea testelor preliminare ale dispozitivelor, am fost forțați să limităm raza de detectare a obstacolelor la 1,5 metri pentru a evita alarmele inutile atunci când folosim dispozitivele într-o mulțime de oameni. La schimbare continuă nivelul de vibrație este mai dificil de determinat apropierea unui obstacol, așa că pe baza rezultatelor testelor preliminare, ne-am stabilit trei niveluri vibratii.
Aspectul atașamentului ultrasonic pe baston:

Aspectul brelocului pentru gât:

Un model 3D al atașamentului bastonului cu ultrasunete și codul sursă firmware pentru Adruino sunt disponibile pentru descărcare la adresa

Controler Arduino PWM încărcare solară
Cum să faci un controler de încărcare solar PWM foarte mic, simplu și ieftin cu Arduino Pro Mini pentru configurații off-grid de 12V. mărimea placă de circuit imprimat se potrivește cu dimensiunea miniboard-ului Pro, astfel încât să poată fi prinse împreună. PCB plănuiește o placă prototip universal.

Conectarea și utilizarea acestui controler Arduino sarcina solara foarte simplu - sunt 2 fire de intrare de la panou panouri solare(+ și -) și 2 ieșiri conduc la o baterie plumb-acid. Baza panoului solar și bateriile sunt conectate împreună. Orice sarcină trebuie conectată direct la bornele bateriei, iar controlerul de încărcare se va ocupa automat de restul.

Arduino măsoară în mod regulat tensiunea bateriei cu plumb acid în funcție de o anumită valoare, comută MOSFET-ul pentru a încărca bateria de la panoul solar și oprește MOSFET-ul când bateria este complet încărcată. Când sarcina preia energie de la baterie, controlerul detectează căderea de tensiune și începe imediat să încarce bateria din nou. În timpul nopții, când panoul solar nu mai produce, controlerul așteaptă până când panoul începe să iasă din nou.


Este necesar un fir pozitiv la panoul solar dioda de protectie Schottky instalat direct pe cablu (învelit în tub termocontractabil). Acesta nu este inclus în PCB-ul principal, deoarece acest lucru facilitează înlocuirea și răcirea în același timp. Puteți face cu ușurință placa puțin mai lungă pentru a se potrivi cu un alt tip de diodă.

Descrierea circuitului și a funcției:

Funcția se bazează pe tranzistorul MOS cu canal N IRF3205 partea înaltă lanţuri. Acest lucru necesită o tensiune de poartă mai mare de 12 V pentru a porni corect MOSFET-ul. Pentru a elimina necesitatea driver extern MOSFET, este condus de o pompă de încărcare creată cu diode, 2 condensatoare și doi pini de ieșire Arduino PWM (3 și 11). Pinul A1 măsoară tensiunea bateriei, iar pinul 9 controlează ciclul MOSFET ON/OFF. LED-ul integrat Arduino Pro Mini conectat la pinul 13 este folosit pentru a afișa ciclul curent al semnalului PWM.

Regulatorul de tensiune și toți condensatorii din jur (C6, C5 și C4) ar putea fi eliminate, deoarece există un regulator inclus în Arduino Pro Mini. Cu toate acestea, pentru că foloseam o placă de clonă ieftină, nu am vrut să mă bazez pe capacitatea acesteia de a suporta tensiuni mai mari decât 12V pentru perioade mai lungi de timp. LP2950 este foarte ieftin și eficient până la 30 de volți, așa că oricum merită să fie la bord.


Lista de piese: Regulator de tensiune joasă de putere LP2950ACZ-5.0 Tranzistoare 2N3904 2N3906 x 2 MOSFET cu canale N Rezistoare IRF3205 82K (1%) 20K (1%) 220K x3 (0,4W este suficient) 4K7 (0,4W este suficient 0,4W x14N) Diode 14N P6KE33CA 90SQ035 (sau orice altă diodă Schottky de 35V minim 9A) Condensatori 47N/50V x2 ceramică 220P/100V ceramică 1M/50V (1000nF) ceramică 4M7/10V tantal 1M/35V tantal x 2

Circuitul și codul acestui controler de încărcare sunt de Julian Ilett, el este creierul din spatele acestui lucru inteligent. Toate acestea sunt doar documentație sofisticată și design adecvat PCB pentru a se potrivi perfect cu placa Arduino Pro Mini. Împărtășește un videoclip cu un regulator de încărcare Arduino MPPT mai eficient, dar construcția lui este mult mai complexă și proiectul nu este încă finalizat. Dacă puteți îmbunătăți codul sau designul în vreun fel, vă rugăm să împărtășiți îmbunătățirile dvs. în comentarii.



Inducția magnetică este o tehnologie pe care probabil ți-o amintești de la ora de fizică din liceu. Pentru transmisie fără fir energie veți avea nevoie de două bobine: o bobină emițător și o bobină receptor. Curentul alternativ din bobina emițătorului generează un câmp magnetic, care induce o tensiune în bobina receptorului. Această tensiune poate fi folosită pentru alimentare dispozitiv mobil sau pentru a încărca bateria.


Nu vor fi elemente mai puțin importante inductoarele, pe care le puteți realiza cu propriile mâini. Aceste bobine simple sunt înfășurate din fire de cupru și sunt numite bobine de miez de aer. Crearea unei astfel de înfășurări pentru scopul nostru este foarte simplă. Găsiți un cilindru rotund cu un diametru de aproximativ 5 centimetri și înfășurați firul în jurul lui, astfel încât fiecare tură să nu se suprapună cu o altă tură, dar în același timp să fie cât mai aproape de cealaltă tură. Un cilindru rotund poate fi, de exemplu, un tub din PVC. Poate fi necesar să utilizați bandă adezivă sau bandă adezivă în 2-3 locuri pentru a menține structura stabilă.


Pe lângă Arduino și inductori, vom avea nevoie de: un tranzistor NPN tip 2N3055, o punte de diode de 1A (ansamblu de diode, au patru borne), un LED, un rezistor de 100 ohmi, doi condensatori de 47 nF, baterie de 9 V pentru alimentați Arduino și, de asemenea, de preferință două plăci pentru prototipare. Diagrama pentru conectarea componentelor pentru a crea un dispozitiv de transmisie de date fără fir este prezentată în figura de mai jos.



Circuitul poate fi testat folosind codul Arduino simplu de mai jos.


void setup() ( pinMode(13,OUTPUT); ) void loop() ( digitalWrite(13,HIGH); delay(0.5); digitalWrite(13,LOW); delay(0.5); )

Cu toate acestea, un dispozitiv simplu de transfer de putere fără fir poate fi realizat fără un Arduino. Practic, putem folosi doar un singur tranzistor 2N2222. Conectați terminalul său de bază la primul capăt al bobinei și colectorul său la celălalt capăt al bobinei. Pinul emițătorului este conectat la baterie. Ca rezultat, un design atât de simplu ar putea arăta astfel:




   Vă mulțumim pentru interesul acordat proiect de informare site-ul web.
   Dacă vrei interesant și materiale utile a apărut mai des și a fost mai puțină publicitate,
   Puteți susține proiectul nostru donând orice sumă pentru dezvoltarea lui.

Un Arduino și circuitele sale de încărcare adăugate pot fi utilizate pentru a monitoriza și controla încărcarea bateriilor NiMH, astfel:

Dispozitiv finalizat

Bateriile reîncărcabile sunt într-un mod grozav pentru a vă alimenta electronicele portabile. Vă pot economisi o mulțime de bani atunci când încărcare corectă. Pentru ca tu să profiti la maximum de la tine baterii, acestea trebuie încărcate corect. Aceasta înseamnă că aveți nevoie de un încărcător bun. Puteți cheltui mulți bani cumpărând un încărcător gata făcut sau vă puteți distra făcând unul singur. În acest articol vom vedea cum puteți crea un încărcător controlat de Arduino.

În primul rând, este important să rețineți că nu există metoda universalaîncărcător care ar fi potrivit pentru toate bateriile. Diferite tipuri de baterii folosesc diferite procese chimice pentru a le face să funcționeze. Ca urmare, tipuri diferite Bateriile trebuie încărcate diferit. Nu putem acoperi toate tipurile de baterii și metodele de încărcare în acest articol. Deci, de dragul simplității, ne vom concentra pe cel mai comun tip de baterie AA, bateria cu hidrură metalică de nichel (NiMH).

Accesorii

Lista componentelor de la stânga la dreapta:

  • rezistor puternic de 10 ohmi (minim 5 wați);
  • rezistență 1 MOhm;
  • condensator 1 µF;
  • tranzistor MOSFET IRF510;
  • senzor de temperatură TMP36;
  • alimentare 5 volți;

Cum să încărcați bateriile NiMH AA

Creșterea ratei de încărcare crește riscul de deteriorare a bateriei.

Există multe modalități de a încărca bateriile NiMH. Metoda pe care o utilizați depinde în principal de cât de repede doriți să vă încărcați bateria. Rata de încărcare este măsurată în raport cu capacitatea bateriei. Dacă bateria ta are o capacitate de 2500 mAh și o încarci la 2500 mA, atunci o încarci la o rată de 1C. Dacă încărcați aceeași baterie la 250 mA, atunci o încărcați la o rată de C/10.

Pe parcursul încărcare rapidă baterie (la viteze peste C/10), trebuie să monitorizați cu atenție tensiunea și temperatura bateriei pentru a evita supraîncărcarea acesteia. Acest lucru poate deteriora grav bateria. Cu toate acestea, atunci când încărcați lent bateria (la o rată sub C/10), este mult mai puțin probabil să deteriorați bateria dacă o supraîncărcați accidental. Prin urmare, metodele de încărcare lentă sunt în general considerate mai sigure și vă vor ajuta să creșteți durata de viață a bateriei. Prin urmare, în încărcătorul nostru de casă vom folosi o rată de încărcare de C/10.

Circuit de încărcare

Pentru acest încărcător, baza este un circuit pentru controlul sursei de alimentare cu folosind Arduino. Circuitul este alimentat de la o sursă de 5 volți, de exemplu, de la un adaptor curent alternativ sau unitate de calculator nutriție. Cele mai multe USB porturi nu sunt potrivite pentru a acestui proiect datorită limitărilor actuale. Sursa de 5V încarcă bateria printr-un rezistor puternic de 10 ohmi și MOSFET puternic tranzistor. Tranzistorul MOSFET stabilește cantitatea de curent care curge prin baterie. Rezistorul este adăugat ca o modalitate simplă de a controla curentul. Monitorizarea cantității de curent se face prin conectarea fiecărui pin de rezistență la pinii de intrare analogic ai Arduino și măsurarea tensiunii pe fiecare parte. Tranzistor MOSFET controlat de ieșire PWM Pin Arduino. Impulsurile semnalului de modulare a lățimii impulsului sunt netezite tensiune DC filtru pe un rezistor de 1 MΩ și un condensator de 1 μF. Acest circuit permite Arduino să monitorizeze și să controleze curentul care trece prin baterie.


senzor de temperatura

Senzorul de temperatură este utilizat pentru a preveni supraîncărcarea bateriei și pentru a asigura siguranța.

Ca măsură suplimentară de precauție, la încărcător a fost adăugat un senzor de temperatură TMP36 pentru a monitoriza temperatura bateriei. Acest senzor produce o tensiune care variază liniar cu temperatura. Prin urmare, spre deosebire de termistori, nu necesită calibrare sau echilibrare. Senzorul este instalat într-un orificiu perforat în corpul suportului bateriei și lipit în orificiu, astfel încât să apese pe baterie atunci când este instalat în suport. Pinii senzorului sunt conectați la magistrala de 5V, la carcasă și la pinul de intrare analogic al Arduino.

Suport pentru baterie AA înainte și după instalare pe placa

Cod


Codul pentru acest proiect este destul de simplu. Variabile la început cod sursa vă permit să configurați încărcătorul introducând capacitatea bateriei și rezistența exactă a rezistenței de mare putere. Au fost adăugate și variabile prag sigure. Tensiunea maximă admisă a bateriei este setată la 1,6 volți. Temperatura maximă a bateriei este setată la 35 de grade Celsius. Timpul maxim de încărcare este setat la 13 ore. Dacă oricare dintre aceste praguri de siguranță este depășită, încărcătorul se oprește.

În corpul programului puteți vedea că sistemul măsoară constant tensiunea la bornele unui rezistor puternic. Acesta este folosit pentru a calcula tensiunea pe baterie și curentul care trece prin aceasta. Curentul este comparat cu valoarea țintă, care este C/10. Dacă curentul calculat diferă de valoarea țintă mai mult de 10 mA, sistemul ajustează automat valoarea de ieșire pentru a o corecta.

Arduino folosește o interfață serială pentru a afișa toate datele curente. Dacă doriți să monitorizați funcționarea încărcătorului, puteți conecta Arduino la portul USB al computerului, dar acest lucru nu este necesar, deoarece Arduino este alimentat de sursa de tensiune de 5V a încărcătorului.

Capacitate baterie int = 2500; // valoarea capacității bateriei în mAh rezistență la plutire = 10,0; // rezistența măsurată a rezistenței puternice int cutoffVoltage = 1600; // tensiunea maximă a bateriei (în mV) care nu trebuie depășită float cutoffTemperatureC = 35; // temperatura maximă a bateriei care nu trebuie depășită (în grade C) //float cutoffTemperatureF = 95; // temperatura maximă a bateriei care nu trebuie depășită (în grade F) cutoffTime lung = 46800000; // timpul maxim de încărcare este de 13 ore, care nu trebuie depășit int outputPin = 9; // firul semnalului de ieșire este conectat la pinul digital 9 int outputValue = 150; // valoarea semnalului PWM de ieșire int analogPinOne = 0; // primul senzor de tensiune este conectat la pinul analogic 0 float valueProbeOne = 0; // variabilă pentru a stoca valoarea pe analogPinOne float voltageProbeOne = 0; // tensiune calculată pe analogPinOne int analogPinTwo = 1; // al doilea senzor de tensiune este conectat la pinul analogic 1 float valueProbeTwo = 0; // variabilă pentru a stoca valoarea pe analogPinTwo float voltageProbeTwo = 0; // tensiune calculată pe analogPinTwo int analogPinThree = 2; // al treilea senzor de tensiune este conectat la pinul analogic 2 float valueProbeThree = 0; // variabilă pentru a stoca valoarea pe analogPinThree float tmp36Voltage = 0; // tensiune calculată pe analogPinThree float temperatureC = 0; // temperatura senzorului calculată în grade C //temperatură plutitoareF = 0; // temperatura senzorului calculată în grade F float voltageDifference = 0; // diferența dintre tensiunile pe analogPinOne și analogPinTwo float batteryVoltage = 0; // tensiunea bateriei calculată float current = 0; // curent calculat care curge prin sarcină în (mA) float targetCurrent = batteryCapacity / 10; // curentul de ieșire țintă (în mA) este setat la // C/10 sau 1/10 din curentul de plutire a capacității baterieiEroare = 0; // diferența dintre curenții țintă și actuali (în mA) void setup() ( Serial.begin(9600); // setup Interfață serială pinMode(outputPin, OUTPUT); // setați pinul ca ieșire ) void loop() ( analogWrite(outputPin, outputValue); // scrieți valoarea de ieșire pe pinul de ieșire Serial.print("Output: "); // arată valorile de ieșire pentru monitorizare pe computer Serial.println (outputValue = analogRead(analogPinOne) // se citește valoarea de intrare pe prima sondă voltageProbeOne = (valueProbeOne*5000) // se calculează tensiunea la prima sondă în milivolti; print("Voltage Probe One (mV): " // arată tensiunea de pe prima sondă Serial.println(voltageProbeOne = analogRead(analogPinTwo) // citește valoarea de intrare pe a doua sondă = (valueProbeTwo); *5000)/1023 // se calculează tensiunea pe a doua sondă în milivolti Serial.print("Voltage Probe Two (mV): " // arată tensiunea pe a doua sondă Serial.println(voltageProbeTwo); 5000 - voltageProbeTwo // calculează tensiunea bateriei Serial.print("Battery Voltage (mV): " // arată tensiunea bateriei Serial.println(batteryVoltage); curent = (voltageProbeTwo - voltageProbeOne) / rezistență; // se calculează curentul de încărcare Serial.print("Curentul țintă (mA): "); // arată curentul țintă Serial.println(Current țintă); Serial.print("Curentul bateriei (mA): "); // arată curentul actual Serial.println(current); currentError = targetCurrent - curent; // diferența dintre curenții țintă și măsurați Serial.print("Eroare curentă (mA): "); // afișează eroarea de setare curentă Serial.println(currentError); valueProbeThree = analogRead(analogPinThree); // citește valoarea de intrare a celei de-a treia sonde, tmp36Voltage = valueProbeThree * 5.0; // convertind-o la tensiune tmp36Voltage /= 1024.0; temperaturaC = (tmp36Tensiune - 0,5) * 100 ; // conversie bazată pe o dependență de 10 mV pe grad cu o deplasare de 500 mV // ((tensiune - 500 mV) înmulțit cu 100) Serial.print("Temperatura (grade C) "); // arata temperatura in grade Celsius Serial.println(temperatureC); /* temperaturaF = (temperaturaC * 9,0 / 5,0) + 32,0; //convertire în grade Fahrenheit Serial.print("Temperatura (grade F) "); Serial.println(temperatureF); */ Serial.println(); // linii goale suplimentare pentru a face datele mai ușor de citit la depanarea Serial.println(); if(abs(currentError) > 10) // dacă eroarea de setare curentă este suficient de mare, atunci reglați tensiunea de ieșire ( outputValue = outputValue + currentError / 10; if(outputValue)< 1) // выходное значение никогда не может быть ниже 0 { outputValue = 0; } if(outputValue >254) // valoarea de ieșire nu poate fi niciodată mai mare de 255 ( outputValue = 255; ) analogWrite(outputPin, outputValue); // scrieți o nouă valoare de ieșire ) if(temperatureC > cutoffTemperatureC) // opriți încărcarea dacă temperatura bateriei depășește pragul de siguranță ( outputValue = 0; Serial.print("Max Temperature Exceeded"); ) /* if(temperatureF > cutoffTemperatureF) / / opriți încărcarea dacă temperatura bateriei depășește pragul de siguranță ( outputValue = 0; ) */ if(batteryVoltage > cutoffVoltage) // opriți încărcarea dacă tensiunea bateriei depășește pragul de siguranță ( outputValue = 0; Serial.print("Max Voltage Exceeded" ) if(millis() > cutoffTime) // opriți încărcarea dacă timpul de încărcare a depășit pragul ( outputValue = 0; Serial.print("Max Charge Time Exceeded"); ) delay(10000); // întârzie cu 10 secunde înainte de următoarea iterație a buclei)

Puteți găsi o versiune descărcabilă a codului sursă la linkul de mai jos.