PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 6 basis LEDs als batteriestatus-Anzeige nutzen



carlitoco
19.12.2007, 15:04
Ist sicher ein alter hut und wurde von vielen schon vorgemacht...

Ich möchte die 6 LED des RP6 als Ladungsanzeige der Akkus nutzen -soweit so gut... doch wie programmieren? Da ich noch nocht sonderlich viel erfahrung mit C habe ist das immer noch leichter gesagt als getan *grins*

find auch im handbuch leider noch nichts über das genauere auslesen des batteriespannung (abgesehen von der kurzen umschreibung "Sensorik" S.17) um diese dann einer LED zu zuordnen...

wär nett wenn mir da jemand weiterhelfen könnte, ev auch mit einem beispiel

Danke vorab !

MfG carlitoco

KingTobi
19.12.2007, 18:24
Du teilst die höchst mögliche Spannung durch 6 Teile, je nachdem in welchem Bereich die tatsächliche Spannung ist, lässt du die LEDs leuchten.
Fertig!

Die Funktionen zum auslesen der Spannung und zum ansteuern der LEDs stehen in der Dokumentation!

carlitoco
20.12.2007, 16:51
hast ja recht ich wollts mal mit n bischen Faulhiet versuchen *grins*

KingTobi
20.12.2007, 16:54
Super Einstellung! Weiter so...

carlitoco
20.12.2007, 18:45
Wie involviere ich das jetzt in einem Programm?
habe da nun schon ne weile dran rumgebastelt... komme aber nicht zur lösung...

wäre um nen kleinen hinweis froh!


#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
startStopwatch1();
while(true)
{
if(getStopwatch1() > 300)
{

writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeChar('\n');

if(adcBat < 1000)
setLEDs(0b011111);

if(adcBat < 900)
setLEDs(0b001111);

if(adcBat < 800)
setLEDs(0b000111);

if(adcBat < 700)
setLEDs(0b000011);

if(adcBat < 600)
setLEDs(0b000001);
if(adcBat < 550)
setLEDs(0b000000);

setStopwatch1(0);
}

task_ADC();
}
return 0;
}

KingTobi
20.12.2007, 18:57
Naja, finde die Abfrage nicht so gut, da unter umständen mehrere Bedingungen erfüllt sein können!
Dann besser eindeutig festlegen, wann was leuchten soll:


if(adcBat < 1001 && adcBat > 900)
setLEDs(0b011111);
if(adcBat < 901 && adcBat > 800)
setLEDs(0b001111);
if(adcBat < 801 && adcBat > 700)
setLEDs(0b000111);
if(adcBat < 701 && adcBat > 600)
setLEDs(0b000011);
if(adcBat < 601)
setLEDs(0b000001);

carlitoco
20.12.2007, 19:20
ok soweit erstmal einleuchtend, das die Berreiche als Ganzes festgelegt werden sollten...

carlitoco
20.12.2007, 19:27
Binde ich das dann in einem Programm in die "main" ein oder lege ich da auch so nen "(void)Batterystatus(void) an?
Das ist mir alles noch nicht ganz klar.

Danke vorab !
MfG carlitoco

radbruch
20.12.2007, 19:27
Hallo

Na, ihr macht's euch ja echt einfach. Ich würde erstmal den Wert für volle Akkus (=alle LEDs) ermitteln, dann den Wert für's unterste Limit (steht in der Doku). Dann sollten bei viel Power alle, bei weniger Power weniger grüne und bei fast leer nur noch die roten LEDs leuchten. Bei minimum (oder kleiner) sollten dann die roten blinken (stromsparend).

Zu eurer aktuellen Version: Es wird immer das Ergebniss der letzten Abfrage angezeigt. Wenn also erst auf < 1000 erkannt wird, es aber 500 sind, wird die Ausgabe am Ende vom < 550 überschrieben. Das geht so schnell dass man es nicht bemerkt.

Gruß

mic

KingTobi
20.12.2007, 19:29
Ich würde eine Funktion schreiben in der Dein Code zur überprüfung der Spannung und setzen der LEDs steht.
Diese Funktion kannst du dann in der while Schleife aufrufen.
Kannst es auch per Timer machen.

@radbruch
Hab ich doch schon am Anfang geschrieben...
Und was meinst du mit aktuelle Version? Bei meiner Version passiert das mit dem überschreiben nicht.

carlitoco
20.12.2007, 19:35
hm so mit bliken und so? also ich fand das fürs erste programm garnicht allzu übel *grins* aber stimmt mit blinken ist natürlich stromsparender - hatte ich auch schon überlegt...

KingTobi
20.12.2007, 19:38
Naja, man kann eh über den Sinn streiten sich ununterbrochen den Status der Akkus anzeigen zu lassen! Da wüsste ich mit den LEDs besseres anzufangen.

Man sollte sich auf ein bestimmtes Signal hin den Status anzeigen lassen können.

carlitoco
20.12.2007, 19:41
Ist auch was wahres drann man könnte ja z.B. nur die beiden grünen LEDs für den akku verwenden..
vielpower=beide an
weniger=eine
weniger=beide blinken
laden=eine blinkt

KingTobi
20.12.2007, 19:44
Kannst es auch mit einer machen.
voll = durchgehend leuchten
halb voll = schnelles blinken
fast leer = langsames blinken

Es gibt da zig Möglichkeiten!

carlitoco
20.12.2007, 19:52
jetzt erstmal voll laden ! das auf jedenfall wichtig!

radbruch
20.12.2007, 20:43
Hallo

Nur keine Aufregung, ich wollte euch nur etwas inspirieren.


Hab ich doch schon am Anfang geschrieben...
Da hab ich wohl was überlesen, ich sehe nur die Stelle mit max. Spannung geteilt durch 6, bei 8,4V wären das alle 2,4V eine LED, aber irgendwo bei 6,nochwas wird der Spannungsregler aussteigen und der Mege32 bleibt dann wohl stehen. Oder setLEDs-Werte rechtsshiftend gn-gn-rt-gn-gn-rt aber z.B kein Blinken bei absolutem Minimum um möglichst lange eine Anzeige zu haben?

Mit "eure aktuelle Version" meinte ich eure Wertereihe 1000-900-..-550, die gemischte rot/grün-Anzeige und z.B. das fehlende if - else in den Abfragen, denn wenn ein Wert erkannt wurde, müssen die anderen nicht mehr geprüft werden.

Wie sinnvoll oder eben sinnlos solch eine Anzeige ist, ist eigentlich nicht so wichtig. Entscheidend ist nach meiner Meinung die Idee und der anschließende Versuch, die Idee möglichst gut umzusetzen. Bei solchen Postings sollte man aber eh besser auf ignorieren schalten:


hast ja recht ich wollts mal mit n bischen Faulhiet versuchen *grins*
Bin mal gespannt, was nun aus der Idee wird.

Gruß

mic

KingTobi
20.12.2007, 20:46
Nur keine Aufregung, ich wollte euch nur etwas inspirieren.
Hier is niemand aufgeregt ;)


Wie sinnvoll oder eben sinnlos solch eine Anzeige ist, ist eigentlich nicht so wichtig. Entscheidend ist nach meiner Meinung die Idee und der anschließende Versuch, die Idee möglichst gut umzusetzen. Bei solchen Postings sollte man aber eh besser auf ignorieren schalten:
Ganz deiner Meinung.

Am schönsten isses die Spannung per Tastendruck auf einem LCD auszugeben :)

carlitoco
20.12.2007, 21:08
jaa ihr profis habe noch keine taste und LCd auch nicht!
*ist nicht böse gemient*

also ich bin grade dabei das Blinken zu schreiben, doch bleibe ich dabei hängen :

#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
startStopwatch1();
while(true)
{
if(getStopwatch1() > 300)
{

writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat > 900)
setLEDs(0b001001);
if(adcBat < 901 && adcBat > 700)
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;

updateStatusLEDs();


setStopwatch1(0);
}

task_ADC();
}
return 0;
}
ich weiss das es so nicht richtig ist... Aber wie wäre es richtig, habe dafür kein beispiel gefunden, oder übersehen...

@radbruch Wie müsste das mit der if - else denn aus sehen so in etwa ?

#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
startStopwatch1();
while(true)
{
if(getStopwatch1() > 300)
{

writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeChar('\n');
if(adcBat >1000)
setLEDs(0b001001);
else if(adcBat < 1001 && adcBat > 900)
setLEDs(0b011111);
else if(adcBat < 901 && adcBat > 800)
setLEDs(0b001111);
else if(adcBat < 801 && adcBat > 700)
setLEDs(0b000111);
else if(adcBat < 701 && adcBat > 600)
setLEDs(0b000011);
else if(adcBat < 601)
setLEDs(0b000001);

setStopwatch1(0);
}

task_ADC();
}
return 0;
}

Danke für die Hilfe !

radbruch
20.12.2007, 21:34
Hallo

Na, dass sieht ja schon mal vielversprechend aus. Wenn du mehrere Anweisungen von dem IF abhängig machen willst, mußt du Klammern verwenden:

if(adcBat > 900)
setLEDs(0b001001);
if(adcBat < 901 && adcBat > 700)
{
statusLEDs.LED4 = !statusLEDs.LED4;
statusLEDs.LED1 = !statusLEDs.LED1;
updateStatusLEDs();
}
setStopwatch1(0);


Das IF ... ELSE hast du richtig eingebaut.

Die Bumbers sind auch Taster...

Gruß

mic

SlyD
23.12.2007, 16:45
aber irgendwo bei 6,nochwas wird der Spannungsregler aussteigen und der Mege32 bleibt dann wohl stehen.


Ist ein LDO (Low Dropout Regulator) - die Regelung auf 5V funktioniert auch noch bei 5.5V Batteriespannung. Dann sind die Batterien aber wirklich völlig am Ende ;)

Weniger als 5.25V kann der Batteriesensor übrigens nicht messen weil dann Referenzspannung = Eingangsspannung ist.
Laufen tut der Controller aber auch bei unter 5V noch. Erst bei 2.7V wird das Reset Signal gesetzt.
So ist der Roboter relativ resistent gegen Einbrüche der Versorgungsspannung unterhalb von 5V - z.B. bei schwachen Akkus und stark belasteten Motoren.

MfG,
SlyD