1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Akku Spannung auf Orux / Locus Dashboard anzeigen

Dieses Thema im Forum "Controller/Regler, Fahrerinformation, Elektronik" wurde erstellt von christiank, 31.12.16.

  1. christiank

    christiank

    Beiträge:
    1.399
    Alben:
    5
    Ort:
    3500 Krems
    Details E-Antrieb:
    Hollandrad elfkw VR Bergwicklung, Haibike EQ Xduro
    Ich habe das Prinzip schon in diesem Thread kurz vorgestellt.
    http://www.pedelecforum.de/forum/in...an-smartphone-senden.39220/page-6#post-754680

    Das Ziel:

    Die durchschnittliche Akku-Einzelzellspannung im OruxMaps oder Locus Dashboard anzeigen.
    = keine zusätzliche APP notwendig.

    Problem:

    Die Dashboards bieten einen fixen Parametersatz zu Anzeige wobei an externen Sensoren nur die üblichen Pulsgurte, Kadenzmesser etc. zu Verfügung stehen. Weitere, frei definierbare, Eingabequellen werden nicht unterstützt und zukünftig wohl auch nicht implementiert.

    Lösung (nach langer Suche):

    Der Zephyr Pulsgurt, dieser fährt ein einfaches serielles Protokoll und braucht somit nur ein einfaches Bluetooth Modul zur Datenübertragung wie den billigen HC-06.

    Es ist also möglich mit einem Mikroprozessor so einen Zephyr Pulsgurt zu emulieren und beliebige Werte jedem Programm das einen Zephyr Pulsgurt unterstützt unterzujubeln.

    Somit: Es wird über einen ATTiny45 (84, Arduino, was auch immer) die Akkuspannung ermittelt, durch die Zellanzahl (XX"P") dividiert mit 10 multipliziert und dieser Wert als Pulsfrequenz an Locus/Orux gesendet und im Dashboard angezeigt.
    Also 4,1V Zellenspannung ergibt "41" als Pulsfrequenz, 4,14V > "41", 4,16V> "42"

    Details:

    Zephyr Protokoll:
    Das Übertragungsprotokoll im Detail ist dokumentiert (siehe Anhang + Programmcode), es werden im Grunde plausible Default-Werte gesendet (siehe Programmcode).
    Im Feld für die Herzfrequenz wird die Zellspannung hinterlegt (Locus + Orux)
    Im Feld für die prozentuale Batterie/Akkuladung des Pulsgurtes lässt sich auch ein beliebiger Wert wie zB die aktuelle Stromaufnahme des Motors transportieren (hier nicht implementiert) - dieses Wertefeld wird allerdings dzt. nur von Oruxmaps unterstützt.
    Wertebereich für Heart Rate und Battery Charge Indicator: unsigned byte, also theoretisch 0-254, die Plausibilitätsgrenzen sind in der doku nachzulesen.
    Die Heartrate ist mit 30-240bpm begrenzt, funktioniert aber auch mit niedrigeren Werten, sowohl in Orux als auch in Locus, ob das auch in zukünftigen Versionen so sein wird ist nicht zu garantieren - also besser in den Grenzen bleiben.

    TestAPP für Zepyr: https://play.google.com/store/apps/details?id=com.pyebrook.hxmDemo

    Konfiguration Bluetooth Modul HC-06:
    Name: Dieser muss unbedingt mit "HXM" beginnen gefolgt von einer 6-stelligen Nummer
    Config. 9600,8,1,N - also die default Werte
    Also HC06 an einen USB/TTL converter anschliessen und (zB)
    AT+NAMEHXM000007 eingeben.
    (siehe auch Anhang hc06.pdf)
    Kabel (zB) http://www.ebay.com/itm/PL2303TA-US...529602?hash=item3ccadd2a02:g:dbgAAOSwCGVX7IqS
    Terminalprogramm dafür : hterm https://www.heise.de/download/product/hterm-53283

    Hardware:

    • Stromversorgung: recom r-78hb5.0-0.5 (conrad), ist klein, Pinkompatibel mit normalen Reglern, effizient und der Ruhestrom liegt bei 1mA (40V) gerade noch im akzeptablen Bereich - Nachteil: ein teures Stück.
    • Spannungsmessung: 10bit ADC über Spannungsteiler - muss kalibriert werden (siehe Software), Spannungsreferenz = Spannungsversorgung = +/- 0,03V per Zelle. Wer es genauer haben will muss (zB) einen LM4040 als Referenz für den ADC verwenden.
    • Bluetooth HC-06 (siehe oben)
    • ATTiny45 getaktet auf 1mhz
    • 1 Logic-Level N-Channel Mosfet zur Abschaltung des Bletooth-Moduls bei kritischer Akkuspannung - auf low-side.
    • Kleinzeug wie LC-LED und Taster

    Software:
    Geschrieben in Bascom.
    Reichlichst inline Dokumentiert, bitte hier nachsehen.

    Eckpunkte:

    • Nach dem Start leuchtet die LED für 3 Sekunden. In dieser Zeit kann
      - einmalig die Spannungsmessung kalibriert werden (Referenz 40V) = 3sec. Tastendruck.
      - die Zellanzahl (xx"P") eingestellt werden = kurzer Tastendruck. Der Akku muss dazu voll geladen sein (Zellspannung 4.00 - 4.20V).
    • Anschliessend blinkt die LED wobei die Anzahl der Leuchtvorgänge die Anzahl der erkannten Zellen ("p") wiedergibt.
    • Programmschleife startet: Über TimerINT wird der ATTiny ca. 2* per Sekunde aufgeweckt und meldet die Zellenspannung als Pulsfrequenz. Zwischendurch befindet sich der ATTiny im Sleep Modus.
    • Wird eine kritische Akkuspannung registriert - hier <= 2,8V per Zelle (ist im Programm beliebig zu ändern) wird die Stomversorgung des Bluetooth Moduls abgeschaltet und der ATTiny geht in Shutdown. Der Stromverbrauch wird dann auf ca. 1,1mA bei 40V reduziert (Gesamtverbrauch)
      Wiederelebung des Moduls: Abstecken und an geladenen Akku anstecken.

    Bemerkungen:

    Das Ganze ist natürlich eine Spielerei - keine Frage.
    Der Aufbau verzichtet auf SMD, ist also für Normalbastler wie meinereiner zu realisieren.

    Wobei ich die Grundidee spannend finde und bei der Realisierung für mich als Laien doch einiges an KnowHow anfiel das ich gerne teilen wollte wie:

    • Zephyr Handling
    • ATTiny Stromsparmodi
    • Kalibrierung Strommessung
    • Ermittlung Akku-Zellen
    • Unterspannungsabschaltung
    • etc..

    Das ganze lässt sich beliebig ausbauen.
    So kann die Logik der Abschaltung des Bluetooth Moduls auch zur Abschaltung des Motorstroms verwendet werden (Unterspannungsschutz), eine Messung des Motorstroms kann ganz leicht hinzugefügt werden und der Motorstrom alternierend mit der Zellspannung angezeigt werden, etc...
    Die lästige Grundarbeit ist im vorliegenden Programm erledigt, alles weitere geht leicht.

    IMG_3293.JPG IMG_3301.JPG IMG_3303.JPG
    IMG_3304.JPG IMG_3305.JPG
     

    Anhänge:

    Zuletzt bearbeitet: 31.12.16
    gerry.k, dagobird und Hochsitzcola gefällt das.
  2. christiank

    christiank

    Beiträge:
    1.399
    Alben:
    5
    Ort:
    3500 Krems
    Details E-Antrieb:
    Hollandrad elfkw VR Bergwicklung, Haibike EQ Xduro
    Anhang:

    Platine:

    ATTiny_Zephyr_D.jpg ATTiny_Zephyr_O.jpg

    Stückliste:
    D1 LED 3mm, grün
    R5 Widerstand 0207, 10K
    R1 Widerstand 0207, 220K
    R4 Widerstand 0207, 1K
    Taster EIN-Taster, Taster
    T1 TO-220, IRFP4310Z
    UB V-Batt, 12-60Volt
    C2 Elko 1 µF
    IC1 DIL8, ATTiny45
    - Sockelleiste, 4-fach
    R3 Widerstand 0207, 22K
    R2 Widerstand 0207, 33K
    C1 Elko RM=2,5 D=5, 4,7 µF /100V
    U1 Regler, positiv, R-78HB5.0-0.5

    HQ IC-Sockel mit integrierten Kondensator
     
    stroker88 gefällt das.
  3. Hochsitzcola

    Hochsitzcola

    Beiträge:
    861
    Details E-Antrieb:
    NC FH154 mit EB306 und EB-Precontroller
    Welche Bascom Version verwendest du?

    Bei mir (ver 2.0.7.6) wirft er beim Compilieren eine Fehlermeldung bei der Zeile

    Code:
    zeph_var(12) = temp_2 / 10

    wenn ich das "geteilt durch zehn" in eine eigene Zeile schreibe, dann geht's :)
    Code:
    temp_2 = temp_2/10
    zeph_var(12) = temp_2
    Gruß
    hochsitzcola
     
  4. christiank

    christiank

    Beiträge:
    1.399
    Alben:
    5
    Ort:
    3500 Krems
    Details E-Antrieb:
    Hollandrad elfkw VR Bergwicklung, Haibike EQ Xduro
    Ja, das ist die Variable für den prozentuellen Batteriestand im Pulsgurt.
    Ist nicht getestet da ich mir meinen reserve-HC06 geschossen habe, :whistle:

    bitte

    Code:
    zeph_var(12) = temp_2
    auskommentieren oder eben testen und probieren was rauskommt.
    Mit auskommentierter Zeile werden 100% Batteriestand ausgegeben.
    Das mit den Dimensionen ist heikel da ich nur in byte/word/dword arbeite.

    Du kannst das aber auch im debugmode=1 mit BT-Terminal testen - aber Vorsicht da wird es im ATTiny45 ziemlich eng.

    Ich stelle eben auf den ATTiny84 um und werde - irgendwann mal - den ACS714 CurrentSensor dazu hängen,
    in zeph_var(12) den Motorstrom verpacken und auch alternierend mit der Spannung in zeph_var(13) (=Herzfrequenz) einblenden.

    Wenn Du das Ganze nachbaust bitte auch den Schaltplan (=die Streifenplatine) kritisch beäugen
    da ich den Mosfet von high_side noch zum Schluss auf low_side umgestellt habe.
    Sollte aber passen....
     
    Zuletzt bearbeitet: 31.12.16
  5. Hochsitzcola

    Hochsitzcola

    Beiträge:
    861
    Details E-Antrieb:
    NC FH154 mit EB306 und EB-Precontroller
    Die Mosfet-Schalterei brauche ich nicht, ich würde das Zephyr Protokoll in meinen ToPPCon implementieren. Dem hatte ich sowieso schon ein Bluetooth-Modul zum Debuggen spendiert :)
    Ich würde das also in Arduino portieren. Das Speichern der Kalibrierwerte müsste ich anders lösen, da die STM32 kein EEprom an Bord haben.

    Gruß
    hochsitzcola
     
    Zuletzt bearbeitet: 31.12.16
    christiank gefällt das.
  6. Hochsitzcola

    Hochsitzcola

    Beiträge:
    861
    Details E-Antrieb:
    NC FH154 mit EB306 und EB-Precontroller
    So jetzt habe ich den halben Neujahrstag vor dem Rechner verbracht. Das größte Hindernis war die Checksumme, die in Arduino nicht so einfach mit Offset zu berechnen ist wie in Bascom...
    Ausserdem wird in einem Array in Bascom mit 1 angefangen zu zählen, in Arduino mit 0 :eek:
    Letztendlich hat es aber geklappt. Ich würde die Anzeige dazu nutzen, die aktuelle Gasgriffstellung (berechnet aus Trittmoment, Kadenz und Geschwindigkeit) und ggf. die Akkuspannung oder auch die verbrauchten Wattstunden anzuzeigen.

    Code:
    ...
    byte zeph_var[]={0x02,0x26,0x37,0x1A,0x00,0x31,0x66,0x50,0x00,0x31,0x64,0x64,0x43,0x65,0x63,0x48,0xD3,0x44,0x3F,0x41,0xBF,0x3D,0x0B,0x3A,0x4B,0x36,0x9F,0x32,0xDF,0x2E,0x37,0x2B,0xFF,0x27,0xB3,0x24,0x87,0x21,0x7F,0x1E,0x4B,0x1B,0x03,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x04,0x00,0x00,0x2E,0x00,0x00,0x00,0x89,0x03};
    
    ...
    
    void loop() {
     
     
        if (tic){
           tic=LOW;
           if (zeph_var[11]>250){
            zeph_var[11]=1;
           }
           if (zeph_var[12]>250){
            zeph_var[11]=1;
           }
            zeph_var[11]++;                                      //Prozent Batterie
            zeph_var[12]++;                                      //Puls
         
         
         
            zeph_var[58]= CRC8( zeph_var , 55 );
                //Zephir-Code senden
            Serial2.write(zeph_var,sizeof(zeph_var));
       
          }                                                      
         }
    
    ...
    
    byte CRC8( const byte *data, byte len ) {
    
      byte crc = 0x00;
      data++;                               //Offset auf Pointer setzen
      data++;
      data++;
    
      while (len--) {
    
        byte extract = *data++;
        for (byte tempI = 8; tempI; tempI--) {
          byte sum = (crc ^ extract) & 0x01;
          crc >>= 1;
          if (sum) {
            crc ^= 0x8C;
          }
          extract >>= 1;
        }
      }
      return crc;
    }
    Um die Programmierung prinzipiell zu zeigen, zählen "Herzfrequenz" und "Akkustand" (vom Brustgurt) in diesem Beispiel einfach hoch.

    Gruß
    hochsitzcola
     

    Anhänge:

    stroker88 und christiank gefällt das.