Deoarece senzorii si afisajele care se conecteaza la o placa Arduino pot avea un consum ce depaseste "puterea" disipata pe regulatorul intern (LM1117 la Arduno Uno R3) si pot aparea defecte (cum am patit eu, vedeti articolul Utilizare placa Arduino cu interfata USB defecta), am hotarat sa folosesc un alimentator stabilizat separat pentru alimentarea acelor consumatori externi, iar placa Arduino doar sa dea comenzi si eventual sa alimenteze mici consumatori (LED-uri, de exemplu). Varianta uzuala pentru un consum de pana in 1A este cea in care se foloseste un stabilizator liniar de tensiune fixa LM7805 pe care l-am prezentat in articolul 78xx, dar merge foarte bine si un un stabilizator liniar de tensiune reglabila gen LM317 pe care l-am prezentat in mai multe articole, ultimul fiind Stabilizator reglabil de tensiune (1,2..12V) cu LM317T. O alta varianta este un alimentator in comutatie, gasindu-se pe ebay un modul care foloseste integratul LM2577:
Caracterisiticile principale ale modulului sunt:
- tensiune de intrare: 3,5..35Vcc
- tensiune stabilizata la iesire: 4..35V (reglabila)
- curent maxim: 3A (necesita radiator) ca si in cazul cand puterea deisipata e mai mare de 15W);
- randament: >92%
- frecventa de comutatie: 50kHz
- protectie la scurtcircuit: prin limitare de curent
- precizia de stabilizare a tensiunii la iesire: ±0.5%
- dimensiuni cablaj:48x23mm
Pentru a realiza un alimentator se foloseste un transformator coborator, o punte redresaore si un condensator de filtraj. Daca se doreste modificarea tensiune de iesire, se poate inlocui semiregalbilul cu un potentiometru pe panou.
In timpul testelor la un indicator date mediu pentru masina (temperatura exterioara citita de un senzor DS18B20, temperatura si umiditatea interioara citite de un senzor DHT11, tensiunea bateriei masurata cu un divizor rezistiv si afisare date pe un ecran LCD alfanumeric cu 16 coloane si 2 randuri) cand am alimentat placa Arduino cu 12V dintr-o sursa stabilizata, datorita consumului mare al perifericelor si a diferentei mari de tensiune (tensiune de intrare si cea stabilizata de 5V pentru alimentarea microcontrolerului ATmega328P-PU si a interfetei USB), am depasit puterea suportata de stabilizatorul de pe placa Arduino. Din pacate, incercam sa fac un filmulet de prezentare si nu am mai verificat temperatura stabilizatorului de tensiune, asa ca de pe placa Arduino Uno R2 am "prajit" interfata USB realizata cu ATmega8u2 si microcontoler-ul ATmega328P-PU.. nerealizand problema, am incercat sa mai fac un film cu alta placa Arduino Uno (de data asta R3), dar am reusit sa fac acelasi lucru si la asta, unde s-au "dus" interfata USB realizata cu ATmega16u2 si microcontoler-ul ATmega328P-PU. Solutia eleganta este inlocuirea microcontrolerului ATmega8u2 (sau ATmega16u2) si reprogramarea ca interfata USB, dupa cum e prezentat inclusiv pe site-ul Arduino in articolul Updating the Atmega8U2 and 16U2 on an Uno or Mega2560 using DFU, utile fiind si informatiile din discutia de pe forum-ul Arduino numita [Solved] Wipe out sketch from arduino the hard way - 8U2 firmware bug. Detaliat se prezinta pasii reprogramarii la Bring your dead Uno/Mega back to life! How to fix ATMEGAXXU2 issues. Respectivele microcontroler-e se gasesc in Romania la TME, cel putin acolo am gasit cautand pe net. Interfata USB folosita de mine este cu integratul CP2102 si am prezentat-o in articolul Arduino de casa cu interfata USB CP2102
Schema de conectare este:
Aceasta varianta a functionat la una din placi, cealalta are scurt in interfata USB cu ATmega16u2 si trebuie intai eliminat...
Deci, cand se folosesc mai multe periferice (afisaje, senzori, etc) trebuie folosit un stabilizator extern pentru 5V din care sa fie alimentati acestia...de exemplu cu LM7805 (vezi articolul 78xx) sau cu LM317 (vezi articolele LM317 si/sau Stabilizator reglabil de tensiune (1,2..12V) cu LM317T).
27.03.2014 Ca exemplu, la placa Arduino Uno R3, conectarea interfetei USB cu CP2102 se poate face in 2 etape: - eliminarea (dezlipirea) integratului/microcontrolerului ATmega16u2
- realizarea unor legaturi (strapuri) pe cablajul unde au fost pinii 8 cu 11, respectiv 9 cu 10, pentru a se aprinde LED-urile care indica comunicatia cu USB-ul
- lipirea unor conductoare/fire: DTR de la modulul USB la fostul pin 13, TxD la fostul pin 9, RxD la fostul pin 8
- lipirea unor fire de la mufa USB de pe modul la mufa USB de la placa Arduino (la asta se poate renunta si se face comunicatia si alimentarea pe mufa modului): USB5V se leaga la fostul pin 31, GND la GND, D- la fostul pin 30, iar D- la fostul pin 29.
In articolul anterior, prezentasem cum am de gand sa fac un indicator pentru temperatura exterioara (cu DS18B20), temperatura si umiditatea din masina cu DHT11 si masurarea tensiunii bateriei. Pe ecran, informatiile se prezinta asa:
Schema exacta este:
Are o mica modificare, in sensul ca rezistenta de 15k din prima schema am realizat-o din 2, una de 10k si una de 4k7. Am facut un film, numit indicator date mediu - masina in care am simulat toate situatiile, care am crezut eu ca pot exista, ca valori:
Cand tensiunea de pe baterie este sub 10V, valoarea apare cu intermitenta.. la fel si la temepratura interioara cand temperatura e sub 00C apare un zero cu intermitenta. Fiind "baiat bun" postez si sketch-ul folosit la teste:
/*original sketch by niq_ro (Nicu FLORICA) from http://nicuflorica.blogspot.comprogram original scris de mine (niq_ro) versiunea 1.0..............................................................*/
#include <LiquidCrystal.h>
// folosesc libraria pentru afisaje LCD simpleLiquidCrystal lcd(7, 6, 5, 4, 3, 2);
// indic modul de legare, vezi mai jos:/* ------------------- | LCD | Arduino | ------------------- LCD RS pin to digital pin 7 | RS | D7 | LCD Enable pin to digital pin 6 | E | D6 | LCD D4 pin to digital pin 5 | D4 | D5 | LCD D5 pin to digital pin 4 | D5 | D4 | LCD D6 pin to digital pin 3 | D6 | D3 | LCD D7 pin to digital pin 2 | D7 | D2 | LCD R/W pin to ground | R/W | GND | -------------------*/// http://arduino.cc/en/Reference/LiquidCrystalCreateCharbyte grad[8] = {
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
};
// variables float R1, R2, R3; // rezsistors in voltage divisorfloat k1; // adjustment for divisorfloat u1, u11, u12; // for voltageint ti; // temperature inside of car;// dataint VPin = A0; // voltage pinint DHTPin = A1; // data pin from DHT11//int DSPin = 10; // // for DHT11 sensor
#include "DHT.h"
#define DHTPIN A1 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 10 on the Arduino
#define ONE_WIRE_BUS 10
#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire);
// arrays to hold device addressesDeviceAddress outsideThermometer;
voidsetup() {
R1 = 4.7; // R1 = 4k7
R2 = 10; // R2 = 10k
R3 = 4.7; // R3 = 4k7
k1 = 1/1.033;
lcd.createChar(0, grad);
lcd.begin(16, 2); // set up the LCD's number of columns and rows: // initialing the DHT11 sensor;
dht.begin();
lcd.clear(); // clear the screen
lcd.setCursor(1, 0); // put cursor at colon 2 and row 0 = left/up
lcd.print("indicator bord"); // print a text
lcd.setCursor(2, 1); // put cursor at colon 0 and row 0 = left/down
lcd.print("1.0 by niq_ro"); // print a textdelay (2000);
lcd.clear(); // clear the screen// Start up the DS18B20 sensor
sensors.begin();
// adress for ds sensor // DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x04, 0x00, 0x00, 0x7E };// DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x4, 0x0, 0x0, 0x7E };// set the resolution to 9..12 bit
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
} // END void setupvoidloop(){
u1 = analogRead(VPin);
u11 = k1*5.0*u1/1023*(R1+R2+R3)/R1;
u12 = u11 + 0.05;
//u12=11.4; // for test// u12=7.5; //for test;if (u12<10.0)
{
lcd.setCursor(12, 0);
lcd.print(u12,1);
lcd.print("V");
delay(500);
lcd.setCursor(12, 0);
lcd.print(" ");
}
else
{
lcd.setCursor(11, 0);
lcd.print(u12,1);
lcd.print("V");
delay(500);
}
// DHT11 partint h = dht.readHumidity();
int ti = dht.readTemperature();
lcd.setCursor(0, 1);
lcd.print("int:");
//ti=0; // for test;//ti=7; // for test;//ti=29; // for test;if (ti<1) {
lcd.setCursor(5, 1);
lcd.print(" 0");
lcd.write(byte(0));
lcd.print("C");
delay(500);
lcd.setCursor(5, 1);
lcd.print(" ");
}
elseif (ti>=9) {
lcd.setCursor(4, 1);
lcd.print("+");
lcd.print(ti);
lcd.write(byte(0));
lcd.print("C");
}
else//if (ti>=1 || ti<10)
{
lcd.setCursor(5, 1);
lcd.print("+");
lcd.print(ti);
lcd.write(byte(0));
lcd.print("C");
}
lcd.setCursor(11, 1);
lcd.print(h);
lcd.print("%um");
// DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x4, 0x0, 0x0, 0x7E };
sensors.requestTemperatures();
float te = sensors.getTempC(outsideThermometer);
// printTemperature(DeviceAddress outsideThermometer);delay(300);
//te=-24;//te=-2;//te=-0.4;// te=0;//te=0.3;//te=5;//te=17;//te=17.6;
lcd.setCursor(0, 0);
lcd.print("ext:");
if (te<-10) {
lcd.setCursor(4, 0);
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C ");
}
elseif (te>-10 || te<0) {
lcd.setCursor(5, 0);
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C ");
}
elseif (te=0) {
lcd.setCursor(5, 0);
lcd.print("=0");
lcd.write(byte(0));
lcd.print("C ");
}
if (te>0)
{
lcd.setCursor(5, 0);
lcd.print("+");
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C ");
}
if (te>=10) {
lcd.setCursor(4, 0);
lcd.print("+");
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C ");
}
}
Urmeaza transferarea proiectului pe un cablaj pentru a fi montat pe masina... schema de conectare la masina ar fi:
23.03.2014 Am facut si mica modificare, rezultandu-mi:
24.03.2014 Deoarece am reusit "performanta" de a strica 2 placi Arduino (partea de interfata USB + microcontroler ATmega328P-PU) din cauza consumului mare pe ramura de 5V, recomand utilizarea unui stabilizator extern pentru 5V...
Cand ne aflam in masina, este util sa stim ce temperatura este afara, cat este tenmperatura si ce umiditate este in masina, tensiunea bateriei, asa ca m-am gandit sa vizualizez datele pe un afisaj LCD cu 16 coloane si 2 randuri, sub forma:
Pentru exterior m-am gandit la un senzor DS18B20 in carcasa protejata, ceva de genul:
deoarece domeniul de masura este -55..+1250C, arhisuficient in zona noastra.
Pentru interior, m-am gandit la senzorul DHT11, mai putin precis care masoara temperatura in domeniul 0..+500C, cu eroare de +20C, iar umiditate in domeniul 20..90%, cu eroare de +5%.
Deoarece nu cred ca as putea sofa sau sta intr-o masina in care temperatura e sub zero grade, o sa pun sa apara cu intermitenta un simbol de temperatura scazuta, eventual o sa apelez la un alt senzor DS18B20, de exemplu.
Pentru a masura tensiunea bateriei o sa folosesc un divizor rezistiv, care sa poata masura pana la cca. 20V (acoperitor pentru tensiunile de pe masina):
Eu am prezentat senzorul de temperatura DS18B20 (si verisorul lui MAX31820) in mai multe articole:
Pentru a fi montat pe masina, o sa fac trecerea pe un cablaj indpendent cu un microcontroler ATmega328P-PU programat ca Arduino sau voi folosi un Arduino Pro Mini, cum am prezentat in articolul Transferarea unui proiect Arduino pe un cablaj
sau
20.3.2014
O schema de conectare ar putea fi:
Dupa cum se observa, pentru primele teste o sa folosesc:
- o placa de dezvoltare Arduino;
- un regulator de tensiune pentru 5V,pentru alimentarea placii Arduino, afisajului si senzorilor;
- un senzor de temperatura DS18B20, pentru exterior;
- un senzor DHT11 pentru temperatura si umiditatea din interior;
- un divizorul rezistiv, pentru a putea masura tensiunea de pe baterie
21.03.2014
Am realizat ca nu am nevoie de stabilizator, ca are placa Arduino, asa ca schema se simplifica:
Prima data trebuie sa vedem pe ce port se conecteaza placa Arduino (asta daca mutam Arduino pe mai multe calculatoate, cum fac eu):
Deschidem programul Gobetwino manual sau automat (pus shortcut in Startup):
Punem calea pentru comenzi, in cazul meu doua (FILM si FILM2):
Putem modifica si portul folosit de program (trebuie sa fie acelasi cu cel folosit de Arduino)
Am apasat pe butonul (tasta) care deschide cel de-al doilea film:
apoi pe butonul (tasta) care deschide primul film:
iar pe fereastra programului am comenzile primite si ce a executat el...
Cele 2 butoane fara retinere (taste) sunt conectate la D2, respectiv D3 catre masa...
Sketch-ul folosit de mine:
/*http://electronics.divinechildhighschool.org/Home/Arduino-Lessons/using-gobetwino-to-control-windows-through-arduinohttp://nicuflorica.blogspot.ro/2014/03/controlul-unor-fisiere-din-calculator.html Reads a digital input on pin 2 or 3, prints the result to the serial monitor to control Gobetwino This example code is in the public domain. */int pushButton = 2; // a pushbutton is attached digital pin2int pushButton2 = 3; // a pushbutton is attached digital pin3// the setup routine runs once when you press reset:voidsetup() {
// initialize serial communication at 9600 bits per second:Serial.begin(9600);
// make the pushbutton's pins an inputs:pinMode(pushButton, INPUT);
pinMode(pushButton2, INPUT);
// pushbuttons are put in HIGH sofware digitalWrite(pushButton, HIGH);
digitalWrite(pushButton2, HIGH);
}
// the loop routine runs over and over again forever:voidloop() {
// pushbuttons are put in HIGH sofware digitalWrite(pushButton, HIGH);
digitalWrite(pushButton2, HIGH);
// read the input pin:if (digitalRead(pushButton) == LOW)
{
Serial.print("#S|FILM|[");
Serial.println("]#");
delay(10000);
// Serial.println("---------------");
}
if (digitalRead(pushButton2) == LOW)
{
Serial.print("#S|FILM2|[");
Serial.println("]#");
delay(10000);
// Serial.println("---------------");
}
delay(1000); // delay in between reads for stability
}
La inceputul anului trecut, am scris 2 article despre folosirea lui Arduino ca multimetru de panou: in Arduino ca multimetru am prezentat mai mult calcule, iar in Arduino ca multimetru (2) am pus si experimente, inclusiv sketch-uri.. Am reluat testele deoarece am primit un mesaj ca apar erori pe ecran... In mare modul de conectare al lui Arduino la la un alimentator este prezentat in figura urmatoare:
/* LiquidCrystal Library The circuit * LCD RS pin to digital pin 12 * LCD Enable pin to digital pin 11 * LCD D4 pin to digital pin 5 * LCD D5 pin to digital pin 4 * LCD D6 pin to digital pin 3 * LCD D7 pin to digital pin 2 * LCD R/W pin to ground * 10K resistor: * ends to +5V and ground * wiper to LCD VO pin (pin 3) Library originally added 18 Apr 2008 by David A. Mellis library modified 5 Jul 2009 by Limor Fried (http://www.ladyada.net) example added 9 Jul 2009 by Tom Igoe modified 22 Nov 2010 by Tom Igoe This example code is in the public domain.http://www.tehnic.go.rohttp://www.niqro.3x.rohttp://nicuflorica.blogspot.roamper & voltmeter by niq_ro, 02.2013, Craiova, Romaniavers. 1.3 - see http://nicuflorica.blogspot.ro/2013/02/arduino-ca-multimetru-2.html */// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pinsLiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int Pintensiune = A3; // divizorul rezistiv pentru tensiune e legat la intrarea A3 int Pincurent = A5; // rezistenta inseriata este conectata la A5voidsetup() {
analogReference(INTERNAL); // punem referinta interna de 1,1V;// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("www.tehnic.go.ro");
lcd.setCursor(0, 1);
lcd.print("creat de niq_ro");
delay(2500);
lcd.clear();
lcd.print("indicator panou");
lcd.setCursor(0, 1);
lcd.print("tensiune-curent");
delay (2500);
lcd.clear();
lcd.print(" sketch ver.2.1");
lcd.setCursor(0, 1);
lcd.print("Umax=30V&Imax=5A");
delay (2500);
lcd.clear();
}
voidloop() {
float sumatens =0;
float sumacurent = 0;
for (int i=1; i <= 20; i++){
// citire valoare pe intrarea analogica float tensiune = analogRead(Pintensiune);
tensiune = 27.27 * 1.1 * tensiune / 1023.0 ;
sumatens = sumatens + tensiune;
float curent = analogRead(Pincurent);
curent = 1.1 / 0.22 * curent / 1023.0 ;
sumacurent = sumacurent + curent;
delay (20);
}
float tensiune = sumatens / 20.0 ;
float curent = sumacurent /20.0 ;
float putere = tensiune * curent ;
float rezistenta = tensiune / curent;
// partea de afisare
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tensiune);
lcd.print(" V");
lcd.setCursor(9, 0);
lcd.print(curent);
lcd.print(" A");
if (curent > 0.01)
{
// calculeaza, apoi afiseaza puterea si curentul
lcd.setCursor(0, 1);
lcd.print(putere);
lcd.print(" W");
lcd.setCursor(8, 1);
lcd.print(rezistenta);
lcd.print(" ");
lcd.write(0b11110100);;
}
else
{
// daca curentul e mai mic de 10mA considera ca sursa e in golif (tensiune < 0.1)
{
// scurtcircuit
lcd.setCursor(1, 1);
lcd.print("sursa oprita ");
}
elseif (tensiune < 0.8)
{
// scurtcircuit
lcd.setCursor(1, 1);
lcd.print(" scurtcircuit ");
}
else//
lcd.setCursor(1, 1);
lcd.print("sursa e in gol ");
}
// se odihneste si el 1,5 secundedelay(1500);
}
In ultimul filmulet apare si un modul voltmetru de panou pe care l-am achizitionat de pe ebay, pentru a vedea cum se comporta si pare ok...
Descriere: 1. domeniul de masura: 0-100V (fir alb sau galben) 2. afisaj LED cu 7 segmente, cifre de 14mm 3. consum propriu redus 4. masuratori la fiecare: 500ms (0,5s) 5. montare usoara pe panou 6. culoare LED-uri: rosie 7.tensiune alimentare: 3..30V (fir rosu la +, fir negru la masa) 8. temperatura de functionare: -10℃..+65 ℃. 18.03.201427.04.2021 Am desenat toata corectat schema:
PS: Daca curentul indicat este mereu zero, verificati cu un aparat de masura pe voltmetru, ca avand borna neagra la GND si cea rosie la A5 tensiunea este pozitiva., daca nu este, inversati bornele de la ramura negativa, astfel incat pe sunt sa fie o tensiune pozitiva fata de GND-ul placii Arduino.