Hallo Forum, Vorstellung und ZPM2000DQT

Motorroller mit E-Antrieb
Antworten
Benutzeravatar
dirk74
Beiträge: 1758
Registriert: So 10. Apr 2011, 13:55
Roller: Trinity Uranus
PLZ: 65
Wohnort: bei Frankfurt
Kontaktdaten:

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von dirk74 »

2Alf20658 hat geschrieben: Auszulesen dann mit Smartphone ? Das wäre der Hammer.
Aber bitte:
arduino_bluetooth.jpg
Arduino/Bluetooth
Das leuchtende Modul auf dem Steckbrett ist ein Bluetooth-/Seriell-Umsetzer. Die auf dem Handy sichtbare App ist ein Bluetooth-Terminal mit konfigurierbaren Buttons. Bei Senden eines speziellen Zeichens gibt er die ermittelte Spannung an Analog-Pin 0 auf die Konsole aus.

Code: Alles auswählen

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); //RX, TX - Bluetooth-Ausgabe
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to
int ack;
int sensorValue = 0;        // Variable initialisieren
void setup()  
{
  Serial.begin(9600);
  Serial.println("Startup");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Leviate boot ..."); //  - Bluetooth-Ausgabe
}

void loop() // run over and over
{
  // read the analog in value:
  sensorValue = analogRead(analogInPin); //Lese PIN 0
//  //Reichweitentest Bluetooth
//  if (mySerial.read()=='t'){ //
//    Serial.println("Test1");
//    mySerial.print("Ack ");
//    mySerial.print(ack);
//    mySerial.println("");
//    ack+=1;
//  }
  //Analog PIN 0
  if (mySerial.read()=='v'){ //
    Serial.println("Test2");
    mySerial.print("Analog 0: ");
    mySerial.print(sensorValue*5/1023);
    mySerial.println("V");
  }
}
Gruß
Dirk
Trinity Uranus L2 - 3 kW - >73.000 km
0-2.250 km: Leihakkus L1/L3
2.250-36.872 km: L2-Akku 60V / 40Ah (Lithium)
aktuell: L3-Akku 60V / 50Ah (Lithium)
Skoda CITIGOe iV (>56.000 km)

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

Jopp, genau so dachte ich es mir. Nur dann mit einer richtigen App statt einer generischen ;)

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

2Alf20658 hat geschrieben:Jetzt habe ich Blut geleckt....... mal sehen.
Hab früher in C16+4 - Zeiten ja auch schon mit Basic rumgemacht.
Also auf Android haben wir Java und auf dem Arduino haben wir C/C++. Wenn Du Basic gewöhnt bist ist es ein harter Umstieg aber es gibt alles im Netz. Die Kommunikation über Bluetooth ist klar. Man müßte sich nur auf ein einheitliches Protokoll einigen, dann können mehrere Entwickler zusammenarbeiten. Beispielsweise könnte man JSON über den seriellen Port schicken. Oder man könnte addressierte Einzeldaten schicken. Beispiel:

TYPE:VERSION;ID;VALUE

TYPE = T,V,A,D,H,.... (Temperatur, Volt, Ampere, Devices,History)
VERSION = Protokollversion (falls mal eine große Änderung ansteht)
ID = temp1, volt1,..... (ID des Sensors)
VALUE = 12.4 (Wert des Sensors)

Mit einem solchen Protokoll läßt sich sehr viel abbilden.

Abfrage/ Info welche Sensoren verfügbar sind:
D:1;temp1;Temperatur
D:1;batt1;Batterie
D:1;batt2;Batterie
D:1;batt3;Batterie

Zustandsmeldung:
T:1;temp1;23.5
V:1;batt1;12.4
V:1;batt2;12.0

Statistik letzte 5 Werte
H:1;batt1;12.4,12.3,12.2,12.1,12.0

Auf Android Seite muß man das dann nur aufdröseln und entsprechend grafisch darstellen. Wenn man einen solchen Standard etabliert, können verschiedene Android Entwickler darauf aufbauen und unterschiedliche Apps entwickeln. Umgekehrt können auch die Arduino Entwickler sicherstellen, das ihre Infos korrekt vom Android code dargestellt werden. Eine Win/Win Situation

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

So, im ersten Code waren noch ein paar bugs. Jetzt bekomme ich folgenden Output auf Seriell. Der Arduino ist komplett nackig. D.h. die Analogpins sind alle offen und die Werte entsprechend falsch. Ich warte immer noch auf die Teile wie SD Kartenlese etc.

Code: Alles auswählen

Initializing SD card...
Card failed, or not present
Values reset and count set to 1
Got Temperature at Pin 19 with 161.43C
Got Battery 0 at Pin 20 with 7.52V
Got Battery 1 at Pin 21 with 6.40V
Got Battery 2 at Pin 22 with 5.89V
Got Battery 3 at Pin 23 with 5.48V
Write SD Card: 1;161.43;7.52;6.40;5.89;5.48
Values reset and count set to 2
Got Temperature at Pin 19 with 70.61C
Got Battery 0 at Pin 20 with 5.21V
Got Battery 1 at Pin 21 with 4.87V
Got Battery 2 at Pin 22 with 4.95V
Got Battery 3 at Pin 23 with 4.83V
Write SD Card: 2;70.61;5.21;4.87;4.95;4.83
Values reset and count set to 3
Got Temperature at Pin 19 with 58.40C
Got Battery 0 at Pin 20 with 4.71V
Got Battery 1 at Pin 21 with 4.48V
Got Battery 2 at Pin 22 with 4.71V
Got Battery 3 at Pin 23 with 4.62V
Write SD Card: 3;58.40;4.71;4.48;4.71;4.62
Values reset and count set to 4
Got Temperature at Pin 19 with 56.93C
Got Battery 0 at Pin 20 with 4.60V
Got Battery 1 at Pin 21 with 4.38V
Got Battery 2 at Pin 22 with 4.64V
Got Battery 3 at Pin 23 with 4.56V
Write SD Card: 4;56.93;4.60;4.38;4.64;4.56
Values reset and count set to 5
Got Temperature at Pin 19 with 55.96C
Got Battery 0 at Pin 20 with 4.56V
Got Battery 1 at Pin 21 with 4.32V
Got Battery 2 at Pin 22 with 4.58V
Got Battery 3 at Pin 23 with 4.52V
Write SD Card: 5;55.96;4.56;4.32;4.58;4.52
Der Arduino code für Arduino 1.5.4 Beta - in der 1.0.5 läuft der nicht, da String() dort noch kein float unterstützt. Wenn keine SD Karte vorhanden ist, wird nach 60 Meßdurchläufen (#define SD_RETRY 60) erneut versucht die SD Karte anzusprechen. Es wird pro Arduino Neustart eine neue CSV auf der SD Karte angelegt (batlog1.csv.....batlogn.csv). Der Meßintervall ist eine Sekunde (#define REFRESH 1000)

Code: Alles auswählen

#include <SPI.h>
#include <SD.h>

#define DEBUG

#define NUM_BATTERYS 4
#define VOLTAGE 5.0
#define REFRESH 1000
#define SD_RETRY 60

// used Pins Temperature
int sensorPinTemperature = 19; //the analog pin the TMP36's Vout (sense) pin is connected to the resolution is 10 mV / degree centigrade with a 500 mV offset to allow for negative temperatures
float temperatureC; 

// used Pins Batterys
int SensorPinBattery[] = {
  20, 21, 22, 23};
float vin[NUM_BATTERYS];

// resistance of R1 & R2
float R1 = 13000.0; 
float R2 = 4300.0;

// chipselect Pin for SD card
const int chipSelect = 10;
int sdCardPresent = 0;
String filename = "batlog";

int measureCount = 0;
int sdCardInitCount = SD_RETRY;


void setup()
{
  // Set Pinmode for Temperature Sensor
  pinMode(sensorPinTemperature, INPUT);

  // Set Pinmode for Battery Sensors
  for (int i = 0; i < NUM_BATTERYS; i++)
  {
    pinMode(SensorPinBattery[i], INPUT);
  }

  // Set Pinmode for SD Card chipselect
  pinMode(chipSelect, OUTPUT);

  Serial.begin(9600);  //Start the serial connection with the computer to view the result open the serial monitor 
  while (!Serial) { 
    ; /* wait for serial port to connect. Needed for Leonardo only*/
  }

  initSDCard();

}

void loop()  
{
  // set BatteryArray and Temperature to 0.0 and raise measure count with 1
  resetValues();

  // make a string for assembling the data to log:
  String dataString = String(measureCount);

  // get Temperature and write to string
  getTemperature();
  dataString += ";" + String(temperatureC);

  // go through the batterys and write the voltage
  for (int i = 0; i < NUM_BATTERYS; i++)
  {
    getBatteryVoltage(i);
    dataString += ";" + String(vin[i]);
  }

  // write to display
  writeToDisplay();

  // just in case we have no card
  reinitSDCard();

  // write the values to SD Card
  writeToSDCard(dataString);

  // wait for next interval
  delay(REFRESH);
}

void writeCSVHeadline()
{
  // write csv head
  String dataStringHeadline = "Count;Temperature";
  for (int i = 0; i < NUM_BATTERYS; i++)
  {
    dataStringHeadline += ";Battery" + String(i);
  }
  writeToSDCard(dataStringHeadline);
}

void reinitSDCard()
{
  if (!sdCardPresent)
  {
    if( sdCardInitCount <= 0)
    {
      sdCardInitCount = SD_RETRY;
      initSDCard();
    }
    else
    {
      sdCardInitCount--;
    }
  }
}

void initSDCard()
{
#ifdef DEBUG
  Serial.println("Initializing SD card...");
#endif
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) 
  {
#ifdef DEBUG
    Serial.println("Card failed, or not present");
#endif
    sdCardPresent = 0;

  } 
  else {
#ifdef DEBUG
    Serial.println("Card initialized.");
#endif
    sdCardPresent = 1;

    // generate the next free filename
    for(int i = 1;; i++)
    {
      String temp = filename;
      temp.concat(i);
      temp.concat(".csv");
      char _filename[temp.length()+1];
      temp.toCharArray(_filename, sizeof(_filename));
      if(!SD.exists(_filename))
      {
        filename = temp;
        break;
      }
    }
#ifdef DEBUG
    Serial.println("Filename for this Session set to: " + filename);
#endif
    writeCSVHeadline();
  }

}

void writeToSDCard(String line)
{
  // If SD Card is properly initialized
  if (sdCardPresent)
  {
    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    String temp = filename;
    char _filename[temp.length()+1];
    temp.toCharArray(_filename, sizeof(_filename));
    File dataFile = SD.open(_filename, FILE_WRITE);

    // if the file is available, write to it:
    if (dataFile) 
    {
      dataFile.println(line);
      dataFile.close();
    } 
    else 
    {
#ifdef DEBUG
      Serial.println("Error opening " + filename);
#endif
      sdCardPresent = 0;
    } 
  }

  // print to the serial port anyway
  Serial.println("Write SD Card: " + line);
}

void writeToDisplay()
{
  // later usage
}

void resetValues()
{
  measureCount++;
  temperatureC = 0.0;
  for (int i = 0; i < NUM_BATTERYS; i++)
  {
    vin[i] = 0.0;
  }
#ifdef DEBUG
  Serial.println("Values reset and count set to " + String(measureCount));
#endif
}

void getTemperature()
{
  temperatureC = (((analogRead(sensorPinTemperature) * (float)VOLTAGE) / 1024.0) - 0.5) * 100; 
#ifdef DEBUG
  Serial.println("Got Temperature at Pin " + String(sensorPinTemperature) + " with " + String(temperatureC) + "C");
#endif
}

void getBatteryVoltage(int numberBattery)
{
  vin[numberBattery] = ((analogRead(SensorPinBattery[numberBattery]) * (float)VOLTAGE) / 1024.0) / (R2/(R1+R2));
#ifdef DEBUG
  Serial.println("Got Battery " + String(numberBattery) + " at Pin " + String(SensorPinBattery[numberBattery]) + " with " + String(vin[numberBattery]) + "V");
#endif  
}



Edit: Ich habe noch mal die Meldungen per Compilerdirektive abschaltbar gemacht (#define DEBUG)

Benutzeravatar
dirk74
Beiträge: 1758
Registriert: So 10. Apr 2011, 13:55
Roller: Trinity Uranus
PLZ: 65
Wohnort: bei Frankfurt
Kontaktdaten:

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von dirk74 »

Waldmensch hat geschrieben:Jopp, genau so dachte ich es mir. Nur dann mit einer richtigen App statt einer generischen ;)
Ich habe hoffentlich nicht den Eindruck erweckt, ich hätte die App selbst geschrieben. Irgendwo muss man sich selbst ein Limit setzen.
Ich bin schon zufrieden, wenn das irgendwann mal fertig nutzbar verkabelt mit LC-Bildschirm ist. Die Bluetooth-Anbindung möchte ich nur zur Diagnose nutzen, um z. B. auf Knopfdruck alle wesentlichen Kenndaten auszulesen. So könnte ich morgens im Pyjama in der Wohnung meinen in der klirrenden Kälte stehenden Roller abfragen, wie denn Lade- und Temperaturverlauf in der Nacht waren. Da reicht tatsächlich ein BT-Terminal mit konfigurierbaren Buttons.

Gruß
Dirk
Trinity Uranus L2 - 3 kW - >73.000 km
0-2.250 km: Leihakkus L1/L3
2.250-36.872 km: L2-Akku 60V / 40Ah (Lithium)
aktuell: L3-Akku 60V / 50Ah (Lithium)
Skoda CITIGOe iV (>56.000 km)

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

@ 2Alf20658: Ich habe ja hier auch nur blanke Arduinos liegen. Das tut ja aber nix - testen kann man auch so :D

@ dirk74: Das ist doch nicht schlimm! Dafür gibt es das Internet. Es wird sich auf keiner aufregen, wenn Du offenen Code nimmst, diesen spezialisierst und Lösungen daraus entwickelst an denen du wiederum alle teilhaben läßt. Das ist der Gedanke von Open Source. Auch mein Programmcode besteht aus ein paar copy/paste Sachen. Solche SD Karte öffnen+schreiben+schließen Sachen sind Standardcode aus der Arduino Referenz. Ich bin in C++ auch nicht soo sicher da ich beruflich ausschließlich in .NET entwickle

Ich bin aber schon an der nächsten kleinen Schaltung dran. Motto: "Überwintere und pflege 4 Batterien mit einem Ladegerät". Dafür habe ich mir diese Relaisplatine (für m.E. Spottpreis) http://www.amazon.de/Kanal-Relais-Modul ... _diy_img_y bestellt. Mein Ladegerät ist das H-Tronic was ich weiter oben schonmal verlinkt hatte. Der Lader legt automatisch los, sobald man Plus trennt und wieder anklemmt. Also wird ein Arduino an die Relaisplatine geklemmt und wird im 48 Stundentakt die Pluspole der vier Akkus wechselnd an den Lader schaltet. So bekommt jeder Akku eine 2 Tage Pflege und dann wieder 6 Tage Ruhe. Und das Beste - man braucht sich nicht drum zu kümmern und vergißt das umklemmen nicht :mrgreen:

Benutzeravatar
dirk74
Beiträge: 1758
Registriert: So 10. Apr 2011, 13:55
Roller: Trinity Uranus
PLZ: 65
Wohnort: bei Frankfurt
Kontaktdaten:

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von dirk74 »

Mein Lieblingsversand ist ja Dealextreme für Elektrokomponenten inkl. Arduino, aber das Relaismodul ist konkurrenzlos günstig.
Ein paar Atmega-Chips habe ich mit dem Arduino-Bootloader geflasht, da ich möglichst nur die zum Betrieb absolut notwendigen Bauteile einsetzen möchte. Je weniger Betriebsstrom, desto besser.
Trinity Uranus L2 - 3 kW - >73.000 km
0-2.250 km: Leihakkus L1/L3
2.250-36.872 km: L2-Akku 60V / 40Ah (Lithium)
aktuell: L3-Akku 60V / 50Ah (Lithium)
Skoda CITIGOe iV (>56.000 km)

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

dirk74 hat geschrieben:Mein Lieblingsversand ist ja Dealextreme für Elektrokomponenten inkl. Arduino, aber das Relaismodul ist konkurrenzlos günstig.
Ein paar Atmega-Chips habe ich mit dem Arduino-Bootloader geflasht, da ich möglichst nur die zum Betrieb absolut notwendigen Bauteile einsetzen möchte. Je weniger Betriebsstrom, desto besser.
Ach Gott, das bisschen Mäusefutter auf sonem Arduino nano macht doch den Kohl nich fett. :lol:
20131127_224421.jpg

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

Habe gerade noch Lesestoff für Stromstärke Messung mit Arduino über Shunt gefunden (so macht es das Teil von Turnigy). Ist ja eigentlich trivial und die Hauptsicherung ist in Reichweite unter der Sitzbank :D

Ist in leider in Englisch aber gut beschrieben
http://www.vwlowen.co.uk/arduino/current/current.htm

Son Shunt habe ich auch schon gefunden http://www.ebay.de/itm/DC-0-50A-Gleichs ... 1095060331

Waldmensch

Re: Hallo Forum, Vorstellung und ZPM2000DQT

Beitrag von Waldmensch »

Ich habe mir mal 3 Stück von diesem geordert 75mV, 50A und billiger als Conrad http://www.ebay.de/itm/400604819061? Der kommt direkt hinter die Hauptsicherung.

Übrigens habe ich mir auch dieses Display http://www.amazon.de/gp/product/B008K7G ... UTF8&psc=1 bestellt. Es hat einen SD Card Reader gleich an Bord und man kann sowas damit machen http://www.youtube.com/watch?v=3UQgVF98hPY

Ich plane auch grad ein, 2 Arduinos zu nutzen und mit I2C zu verbinden. Dh. die Daten werden unter der Sitzbank erfasst von einem "Meßarduino" und über eine 4adrige Leitung an den Arduino im "Cockpit" geschickt der sie dann auf dem Display ausgibt und evtl auf SD Karte speichert. Wo wir einmal bei I2C Bus sind: Ich habe dieses Schnuffelchen http://www.ebay.de/itm/NEW-NEO-6-V3-0-G ... 46166d83e6 noch in der Quadrocopter Bastelkiste. Den Code dazu gibts auch. Damit könnte die Cockpit Einheit auch noch die Geschwindgkeit über GPS ermitteln. ;)

Antworten

Zurück zu „Elektroroller“

Wer ist online?

Mitglieder in diesem Forum: jacko, Semrush [Bot] und 19 Gäste