cu mentiunea ca la exista un mic histerezis de 3 biti pentru a aparea aprinderi intre stari.
Schema, pentru led multicolor cu anod comun, redesenata in Eagle PCB si colorata in Paint arata asa:
Pentru led multicolor cu catod comun, schema este cea prezentata la inceputul articolului.
Programul RGB_LiPo3S_checker1a.ino permite sa se foloseasca ori led cu anod comun
ori cu catotd comun
functie de ce linii se activeaza.
Montajul realizat de Lidiano:
Microcontrolerul trebuie sa fie setat pe 8MHz cu oscilator intern pentru a avea o animatie ca in filmuletul realizat de Lidiano numit Lipo 3S tester
Pentru detalii despre programarea microcontrolerului ATiny85(45) cititi informatiile din articolul Programarea unui microcontroler ATtiny85 cu sketch Arduino.
Lidiano a facut teste fizice si mi-a trimis si poze:
- tensiune prea mare pe acumulator
Nu mai repet modul de programare, ci voi prezenta schema unui montaj pentru programare, care se poate face pe cablaj, pentru a fi mereu la indemana:
Fata de schema din articolul anterior, am mai pus si 3 leduri, care indica intrarea in modul de programare (led verde), "bataile inimii", adica comunicarea (led galben) si daca apare vreo eroare (led rosu).
Cablajul cu piese ar arata asa
Dupa ce am vazut cum se poate programa un microcontroler ATtiny85 cu sketch Arduino si avand in vedere ca este mai ieftin decat un ATmega328P-PU, poate functiona si fara cuart (oscilator intern la 1MHz), am zis sa fac "ceva" si, avand in vedere ca este iarma si pot fi probleme cu acumulatorul masinii, am facut un indicator pentru starea acumulatorului si pentru alternator si releul regulator. Schema initiala de test a fost cea in care am pus un semireglabil conectat intre +5V si masa, iar cursorul la intrarea analogica:
ulterior am pus si divizorul rezistiv de la intrare:
dar are prea deranjanta cu modul de afisare, asa ca am modificat sketch-ul sa am mai putine situatii si sa am o afisare frumoasa si nederanjanta, facand si schema completa cu alimentarea de la acumulator prin intermediul unui LM7805:
- tensiune pe acumulator mai mica de 10,8V (acumulatorul descarcat... ledul se aprinde cu intermitenta):
- tensiune pe acumulator intre 10,8V si 11,8V (daca motorul este oprit, bateria este destul de descarcata si sunt sanse sa nu porneasca masina, daca tensiunea este cu motorul pornit sunt probleme cu alternatorul si releul regulator, ledul este aprins permanent in rosu):
- tensiune pe acumulator intre 11,8V si 13,5V (daca motorul este oprit, situatia este normala, daca motorul este pornit, bateria poate fi descarcata dupa o perioada de nefolosire sau alternatorul nu incarca suficient, trebuie verificat alternatorul si releul regulator):
- tensiune pe acumulator intre 13,5V si 14,37V (motor pornit, becuri aprinse sau nu, situatia normala, se aprinde doar ledul verde):
- tensiune pe acumulator mai mare de 14,37 (motor pornit, acumulator supravoltat, se aprinde permanent ledul albastru, iar ledul verde se aprinde cu intermitenta, trebuie verificat alternatorul si releul regulator):
Sketch-ul scris de mine pentru schema de mai sus este:
/*basesd sketch named "Analog Input" from Examples -> 03.Analogcreated by David Cuartielles, modified 30 Aug 2011, By Tom Igoehttp://arduino.cc/en/Tutorial/AnalogInput*//* original circuit made by niq_ro from http://www.tehnic.go.rohttp://nicuflorica.blogspot.ro/http://arduinotehniq.blogspot.com/1) uC: ATtiny85 (ATtiny45) at 1MHz (internal clock)2) common chatode RGB LED code OSTA5131A-C, see http://nicuflorica.blogspot.ro/2012/12/arduino-uno-si-un-led-multicolor-rgb.html- an 180ohms resistor at pin D0 (phisical pin 5) in series with RED LED at GND- an 100ohms resistor at pin D1 (phisical pin 6) in series with GREN LED at GND- an 100ohms resistor at pin D2 (phisical pin 7) in series with BLUE LED at GND3) a voltage divisor 1:4 made like this: +BAT --|=10k=|-|=10k=|-|=10k=|-A2|=10k=|-GND, pin A2 is phisical pin 3- for tests can use an 10-50kohms variabile resistor put at +5V and GND, midle at A2 (phisical pin 3)4) Vcc (phisical pin 8) at 5V5) GND (phisixcal pin 4) at GND*/int sensorPin = A2; // select the input pin for the potentiometer / resistor dividerint ledRPin = 0; // select the pin for the RED LEDint ledGPin = 1; // select the pin for the GREEN LEDint ledBPin = 2; // select the pin for the BLUE LEDint u = 0; // variable to store the value coming from the sensorfloat k=4.95/5; // corection voltage// define voltage steps:int treapta1 = 552/k; // Ubat=10,8Vint treapta2 = 604/k; // Ubat=11,8Vint treapta3 = 690/k; // Ubat=13,5Vint treapta4 = 735/k; // Ubat=14,37V (14,4V)voidsetup() {
// declare the ledPins as an OUTPUT:pinMode(ledRPin, OUTPUT);
pinMode(ledGPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
}
voidloop() {
/* // all leds are off digitalWrite(ledRPin, LOW); // turn the red led off digitalWrite(ledGPin, LOW); // turn the green led off digitalWrite(ledBPin, LOW); // turn the blue led off*/// read the value from the sensor:
u = analogRead(sensorPin);
// voltage below 10,8Vif (u < treapta1)
{
digitalWrite(ledGPin, LOW); // turn the green led offdigitalWrite(ledBPin, LOW); // turn the blue led offdigitalWrite(ledRPin, HIGH); // turn the red led ondelay(100);
digitalWrite(ledRPin, LOW); // turn the red led offdelay(100);
digitalWrite(ledRPin, HIGH); // turn the red led ondelay(100);
digitalWrite(ledRPin, LOW); // turn the red led offdelay(1000);
}
// voltage ower 10,8V & below 11,8Vif (u > treapta1 && u < treapta2)
{
digitalWrite(ledGPin, LOW); // turn the green led offdigitalWrite(ledBPin, LOW); // turn the blue led offdigitalWrite(ledRPin, HIGH); // turn the red led ondelay(100);
}
// voltage ower 11,8V & below 13,5Vif (u > treapta2 && u < treapta3)
{
digitalWrite(ledBPin, LOW); // turn the blue led offdigitalWrite(ledRPin, HIGH); // turn the red led ondelay(500);
digitalWrite(ledRPin, LOW); // turn the red led offdelay(100);
digitalWrite(ledGPin, HIGH); // turn the green led ondelay(200);
}
// voltage ower 13,5V & below 14,37Vif (u >= treapta3 && u < treapta4)
{
digitalWrite(ledRPin, LOW); // turn the red led offdigitalWrite(ledBPin, LOW); // turn the blue led offdigitalWrite(ledGPin, HIGH); // turn the green led ondelay(100);
}
// voltage ower 14,37if (u > treapta4)
{
digitalWrite(ledRPin, LOW); // turn the red led offdigitalWrite(ledGPin, HIGH); // turn the green led ondelay(500);
digitalWrite(ledGPin, LOW); // turn the green led offdelay(100);
digitalWrite(ledBPin, HIGH); // turn the blue led ondelay(200);
}
}
Scrierea sketch-ului in microcontrolerul nostru, care poate fi ATTiny85 sau ATtiny45, datorita dimensiunii reduse...
Pentru proiecte simple se pot folosi microcontrolere mai slabute, cum este ATtiny85 sau ATtiny84. Regasind articolul Using an ATtiny as an Arduino de pe site-ul tronixstuff, am zis ca trebuie sa incerc si eu sa programez un ATTiny85 (este un "piciuman" in capsula DIL8), dar folosind o clona Arduino Nano, care era libera, celelate tip Uno fiind in diverse montaje in teste. Avand Arduino Nano am folosit schema urmatoare (nu am utilizat comutator in teste, dar asa ar fi comod):
Dupa ce am descarcat acel fisier, il dezarhivam si copiem subdirectorul numit attiny in locul unde este instalata versiunea de Arduino IDE in subdirectorul hardware:
Daca intram in subdirectorul attiny vom gasi:
si daca intram si in variants:
... revenim la partea utila. Dupa ce copiem acel folder attiny, inchidem si redeschidem programul Arduino IDE, vom gasi urmatoarele placi Arduino:
Incarcam sketch-ul ArduinoISP din exemple:
Trecem la placa Arduino pe care o avem:
Verificam ca programatorul sa fie cel obisnuit:
Realizam schema prezentata mai sus:
Incarcam sketch-ul ArduinoISP in memoria placii Arduino Nano, apoi deconectam cablul USB si conectam condensatorul de 10uF intre RESET-ul si GND-ul placii Arduino Nano:
Incarcam in programul Arduino IDE sketch-ul care se va incarca in ATTiny (eu am folosit sketch-ul al doilea din articolul menttionat la inceput):
Schimbam placa de dezvoltare:
Schimbam si programatorul:
Dam comanda de incarcare si asteptam sa apara pe ecran un mesaj de genul:
care ne indica faptul ca acum avem un microcontroler ATtiny85 incarcat cu programul nostru...
Deconectam cablul USB de la calculator si desfacem legaturile dintre placa Arduino Micro si ATiny85, pastrand, cel putin pentru moment, doar legaturile de la +5V si masa GND), apoi facem legaturile ca in schema:
Alimentam si obtinem un joc de lumini, conform programului idn sketch:
PS: In articolul ATtiny85 vs ATmega328 gasiti comparatia intre ATtiny85 si ATmega328 (cel folosit in Arduino Uno, de exemplu).
PS2: In articolul Programmare un Attiny85 con Arduino se gaseste modul de scriere al unui sketch in limba italiana, aratand mai explicit si corespondenta pinilor:
15.01.2015
Cand am vrut sa scriu un sketch mai complex, am constatat ca tot in articolul Using an ATtiny as an Arduino sunt mai bine definiti pinii, asa ca am facut si eu un rezumat, care ma ajuta mult la scrierea sketch-urilor:
Am realizat un temporizator reglabil cu reset (comanda din acelasi buton) folosind un ATTiny85 programat cu un sketch Arduino si am facut filmuletul temporizator cu reset (3)
21.01.2015 Am mai cautat diverse informatii si proiecte si am gasit o prezentare frumoasa a pinilor la pighixxx.com, din care rezulta ca pinul fizic 1 al capsulei lui ATtiny85 se poate folosi in sketch-uri ca pin digital D5, respectiv intrare analogica A0:
26.01.2015 In articolul de la http://www.kobakant.at/DIY/?p=3742 este o reprezentare frumoasa a schemei de prograre si se prezinta intuitiv modul de setare a microcontrolerului la 8MHz: