Wie kan me helpen met een Sparkfun ACS712 low current BB??

Hallo Iedereen!

Ik ben al een tijdje aan het "spelen" met een Arduino Uno (rev.3). Mijn programmeerkennis is nihil, maar meestal trek ik mijn plan wel met stukjes code knippen en plakken....

Nu heb ik een labvoeding gebouwd en wou de uitlezing met een Uno en een LCD doen. Om de stroom te meten heb ik bij Sparkfun volgende breakoutbordje gekocht : SparkFun Current Sensor Breakout - ACS723 (Low Current) - SEN-14544 - SparkFun Electronics

Nu kan ik nergens een voorbeeld code vinden en ik kom er zelf ook niet uit.... Ik weet dat het bij 0A 2,5V uitgeeft, en dit krijg ik ook op mijn lcd, maar hoe met ik dit verschalen naar de werkelijke waarde?

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
   
  lcd.begin(16, 2);
}

void loop() {
  
int sensorValue = analogRead(A0);
float voltage = (sensorValue * (5.0 / 1023.0)) * 12;

int currentSensor = analogRead(A1);
float current = currentSensor * (5.0 / 1023.0) * 1000;



  lcd.setCursor(0,0);
    lcd.print(voltage);
    lcd.print(" V ");
    
    lcd.setCursor(0,1);
    lcd.print(current);
    lcd.print(" mA ");
   
  delay(10);                     
}

De spanning in Volt, werkt perfect, de vermenigvuldiging met 12 is omdat ik een spanningsdeler met verhouding 1:12 heb gemaakt om te meten....

Hoi Koen_P_Belgium, welkom !

Wat is het stroombereik van je voeding ?
Volgens het schema van dat boardje kun je het nulpunt en de versterking instellen.
Het nulpunt stel je in met R4 en de versterking met R3.
Wanneer je nooit stromen terug in je voeding wil laten lopen, is het ook niet zinvol om pas bij 2,5 volt te gaan meten, want je gooit dan het halve meetbereik van je Arduino overboord.
Daarom is het handig als je het nulpunt kunt instellen.

Ik zou een testopstelling maken, waar ik verschillende stromen mee zou kunnen opnemen.
Vervolgens zou ik die met mijn multimeter meten, en dan de spanning meten die uit het boardje komt.
Maar daarvoor moet je wel zeker weten dat je binnen het bereik van dat boardje blijft natuurlijk.
Als je eenmaal weet hoe dit verloopt(ik zou voor minimaal 4 referentiepunten gaan), kun je een tabelletje maken.

De meetwaarden op de analoge pins, kun je dan met de map functie (klik !) in je sketch verwerken naar te tonen stroomwaardes.
Mapping is het Engelse woord dat staat voor verschalen, en doet dan dus ook precies wat jij zoekt.
Alleen is dit wel gebaseerd op een lineair verloop, ik weet niet of dit ook uit je boardje komt.
Dat is wel de reden waarom ik minimaal 4 referentiepunten zou nemen, meestal kun je dan al wel zien of het verloop lineair of logaritmisch (of iets anders) is.

Hartelijk Dank voor je reactie :slight_smile:

De voeding kan een maximale stroom van 1.5A leveren en het bordje meet tot 5A. Dat van de potmetertjes had ik al min of meer begrepen van de Sparkfun website.

Bedankt voor de tips, dit ga ik straks toepassen :slight_smile:

Hello,

Ik heb net even een meetopstelling gemaakt en ik ben tot de volgende conclusies gekomen:

  • met de potmeter Vref op het BB de spanning van 2,5V bij 0A terug zetten naar 0V bij 0A geeft als resultaat dat het bordje pas bij 750mA de spanning begint te verhogen. Spelen met de gain potmeter geeft hierop geen resultaat.

Als ik de spanning netjes op 2,5V instel op het BB, dan langzaam de stroom opdrijf varieert de spanning mee vanaf het begin in wat toch op een relatief lineaire curve lijkt, zie volgende meetresultaten:

bij 0mA -> 2,50V
250mA -> 2,74V
500mA -> 2,98V
750mA -> 3,22V
1000mA -> 3,47V
1250mA -> 3,71V

dat lijkt min of meer een stijging van 100mV bij 100mA stroom

nu heb ik dit met het voorbeeldje dat MAS3 me gelinkt heeft, even getest maar het resultaat op de lcd blijft 0mA aangeven

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
   
  lcd.begin(16, 2);
}

void loop() {
  
int sensorValue = analogRead(A0);
float voltage = (sensorValue * (5.0 / 1023.0)) * 12;

int current = analogRead(A1);

current = map(current, 0, 1023, 0, 1500);


  lcd.setCursor(0,0);
    lcd.print(voltage);
    lcd.print(" V ");
    
    lcd.setCursor(0,1);
    lcd.print(current);
    lcd.print(" mA ");
   
  delay(10);                     
}

Hoi.

Aangezien je aan het testen (debuggen) bent, lijkt het me handig om dat display van je meteen te gebruiken als hulpmiddel daarvoor.
Mij heeft dat in het verleden al erg geholpen.
Wat je dan zou kunnen doen, is de waarde die uitgelezen word ook op het scherm zetten.
Want hoe weet je nu dat je niet werkelijk de waarde nul binnenhaalt ?
Dus zou ik het volgende doen:

void loop() {
  
int sensorValue = analogRead(A0);
float voltage = (sensorValue * (5.0 / 1023.0)) * 12;

int current = analogRead(A1);
    lcd.setCursor(9,1);  // Tijdelijk plaatsje reserveren voor debugging.
    lcd.print(current);

current = map(current, 0, 1023, 0, 1500);

  lcd.setCursor(0,0);
    lcd.print(voltage);
    lcd.print(" V ");
    
    lcd.setCursor(0,1);
    lcd.print(current);
    lcd.print(" mA ");
   
  delay(10);                     // He bah, een delay !
}

Je zult hierdoor op de tweede regel dus 2 getallen zien, links de berekende stroom, en rechts de spanning die je binnenhaalt van A1, en afkomstig is van je sensor.
Kleine (tijdelijke) verandering, maar je ziet gewoon wat er gebeurt.

Hartelijk bedankt voor je hulp :slight_smile:

Zo kan ik inderdaad meevolgen met wat er gebeurt. Het resultaat is bijna goed met volgende waarden:

current = map(current, 512, 1023, 0, 5000);

wat eigenlijk logisch is.... zo is de meetwaarde van de Arduino bijna gelijk aan die van de multimeter, fine tunen met de gain en Vref potmetertjes denk ik. Waarom hebben ze die zo verdomd klein gemaakt.........

Nu zijn deze waarden praktisch niet af te lezen daar ze continu veranderen.... is dat ook op te lossen met een "He bah, een delay"? :slight_smile:

Ik wist wel een aardig eind waar het probleem zou zitten, maar wilde dat je dit zelf zou zien in plaats van maar aannemen wat iemand je vertelt.
Wellicht dat je een volgende keer dan zelf iets kunt bedenken om te zien wat er eigenlijk gebeurt.

Delay: Ja en nee.
Als dit alles is wat je aan het doen bent, kun je inderdaad een delay gebruiken.
Want eigenlijk is de Arduino een beetje overkill.
Ik zou de delay dan 100 of 200 milliseconden maken, of te wel ongeveer tien of vijf keer updaten per seconde.
Maar delay is per definitie zonde, want je laat je controller gewoon ff niets doen terwijl ie wel erg druk bezig is om niets te doen.
Zoals gezegd in dit geval zou ie wel kunnen.

Voor wat betreft die waardes die nogal veranderen:
Je hebt nu 512 waardes die je ongeveer vermenigvuldigt met tien.
Dus je meet dan van nul tot vijf Ampère, maar je kunt maar van nul tot anderhalf genereren.
Dat betekent dat je twee derde van je mogelijke meetbereik weggooit, en je die dan met de helft van je Arduino bereik gaat verwerken.
Dat zou dus ook beter kunnen, maar dan moet je wel nog wat toevoegen (nog een versterker IC plus wat omringende onderdelen om uit te komen op nul tot vijf volt bij nul tot vijftienhonderd milliampères).

MAS3, Hartelijk bedankt voor je goede raad en gouden tips....
Het is inderdaad overkill hier een Arduino (ik zelf een print ontworpen rond de ATMega328) maar in mijn ogen was dit de eenvoudigste weg om eens iets anders te doen dan een A/D coverter en 7 segment- displays om volt- en ampéremeters te bouwen.

Om zelf kleinere µC te programmeren heb ik nog niet voldoende kennis. Ik ben al blij dat ik wat kan aanmodderen met de UNO.

Blijkbaar is de ACS712 niet beste keuze voor mijn toepassing, vooral omdat er te weinig van het meetbereik van de ATMega wordt benut.

Wat ik nu even ga doen is de hardware aanpassen, ACS712 eruit en meten over een shuntweerstand, versterken met een OpAmp (LM358) en zo eens naar de analoge ingang sturen. Zo heb ik uiteindelijk de voltmeter ook gebouwd en dit werkt zeer goed.

Ik zal mijn vorderingen hier ook blijven posten, en als er iemand interesse in heeft wil ik ook wel de schema's en printlayouts hier ergens neerzetten.

Het is een hele goede voeding, een ontwerp van CircuitsOnline.net, met wat eigen toevoegingen.

Dat de toepassing van de Arduino overkill is, neemt natuurlijk niet weg dat dit wel een leuk en leerzaam projectje is.
Het extra leuke eraan is dan dat je al gelijk een real life toepassing ervoor hebt, en dat zal je dan ook extra motiveren dit tot een goed eind te brengen.

Wanneer je 'm helemaal zo hebt als je wil, kun je natuurlijk nog gaan werken aan het verwijderen van de dan aanwezige delay()s.
Dan creëer je voor jezelf wat tijd om het ding andere zaken te doen.
Ik noem maar zo ff wat er in me opkomt:

Je stelt het ding nu in met vermoedelijk een potmetertje.
Wie weet kun je daar je Arduino ook voor gebruiken.
Dat je het ding met een paar druktoetsen kunt instellen.
Of een encoder.
En dat je een paar snelkoppelingen hebt om direct vaste instellingen op te roepen.
Dat je de temperatuur van het ding kunt gaan registreren.
Dat je een log kunt bijhouden (opslaan op een SD kaartje) van de spanningen en stromen die je voeding levert.
Dat kun je later weer op je pc in een grafiekje weergeven.

Dat je de PC het ding kan laten instellen via een seriële, of USB (eigenlijk ook een seriële) verbinding.
En nu je die verbinding toch hebt, die SD kaart van daarnet zo uitlezen.
Dat je via je lokale netwerk (en/of Wifi) het ding kan instellen.
Of via het internet.

Zo maar wat dingetjes die je wellicht helemaal niet nodig hebt, maar wel enorm leuk zijn om uit te werken.
En waar je bij CO dan weer de blits mee kunt maken :stuck_out_tongue:

Overigens zou ik niet zo snel roepen dat de ACS712 niet geschikt is.
Als jij tevreden bent met diens schijnbare resolutie van zo'n 10 mA dan is het ding dus best te gebruiken.
Maar je kunt dan overwegen middels bijvoorbeeld een opamp schakeling (houd er rekening mee dat de 358 geen rail to rail opamp is, en je 'm dus niet moet voeden met 5 volt) het uitgangsbereik van die ACS712 te verschuiven zodat dat tussen 0 en 5 volt terecht komt.
Ik heb het sterke vermoeden dat de functie is van de opamp die op de module zit vergelijkbaar is.
Hoewel de Burr Brown natuurlijk wel ff iets meer klasse biedt dan een eenvoudige 358, en die OPA344 dus wel een rail to rail versie is.
Burr Brown behoort overigens al een tijdje tot de TI groep, zoals meer opvallende halfgeleider merken (Dallas Semiconductor die veel hobbytastisch spul maken, en MAXIM bijvoorbeeld)