INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
08.03.2016, 10:14
Beitrag #17
RE: selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
wow tolles Projekt Smile

bin gespannt wie dein Gehäuse aussehen wird und ob alles so funktioniert wie du es dir vorstellst.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.01.2018, 02:29
Beitrag #18
RE: selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
Lang lang ist es her,
konnte vor einigen Tagen erst wieder damit weiter machen.

Aktueller Stand der Hardware ist:
- Micro USB-Buchse. Kann zum laden des Lithium Akku und hochladen des Code verwendet werden.
Für Induktionsladung konnte ich noch keine Teile bestellen die klein genug sind, um sie am Handgelenk tragen zu können.
- ATmega32U4 IC, 8-bit AVR Mikrocontroller mit 32K Bytes ISP Flash und USB Controller.
Noch verwende ich das Xadow Mainboard aber das ist nicht mehr erhältlich. Zum glück war es Opensource Hardware um mir für mein eigenes Board einiges davon ab kucken zu können.
- Reset Button. Dient zum neu starten des System.
- CN3065 IC, hoch effiziente Ladeelektronik (für Solarzellen geeignet).
- Batterieanschluss zum Anschluss eines LiPo-Akku mit JST 1.0 Stecker (JST 1mm = 1A max. Last).
- MIC5205-3.3YM5, hoch effizienter Spannungsregler (stark minimiertes Ausgangsrauschen).
- Separierte Spannungsversorgung für Mikrocontroller und Peripherie zur Stabilisation der Mikrocontrollerversorgung.
- OLED-Display 128x64 DotMatrix mit SSD1306 Controller in Pixelfarbe Weiß(max. Stromverbrauch von 15mA bei Änderung aller Pixel, max. Stromverbrauch von 100uA bei Änderung eines Segment (8x8 Pixel = 1 Zeichen)).
Für das RGBOLED-Display 96x64 DotMatrix mit SSD1331 Controller fehlt noch ein SoftSPI oder ein SPI zu I2C Schnittstellenwandler. SPI und I2C liegen bei diesem Mikrocontroller auf den selben Pins und können somit nicht gleichzeitig verwendet werden.
- MS5803_05BA Druck- und Temperatursensor für 0-5 Bar (0,9 - 12,5μA Stromverbrauch je nach Messauflösung)
- HMC5883 3-Achsen Digitalkompass (ca. 5μA Stromverbrauch).
Den HDMM01 musste ich leider ersetzen weil er die letzten Monate in seiner Ramschkiste nicht überlebt hatte.
- DS1337 Echtzeituhr (RTC) mit 3V Speicherbatterie CR1220 (ca. 150μA Stromverbrauch und max. 600nA Stromverbrauch bei Batterie Zeitspeicherung).
- Akku "DTP 603048" 3,7V 900mAh mit integriertem Schutz-IC (Überladeschutz Spannung 4.20V +/- 0,05V, Tiefentladeschutz Spannung 2,7V +/- 0,1V).

Wer sich genauer dafür Interessiert, kann sich ja mal die Datenblätter der Bauteile über Google zusammensuchen und sich die Empfohlenen Beispielbeschaltungen ansehen. Ich habe sie bisher auch nicht anders verwendet.

Hier noch mein aktueller Code dazu (die Librarys verlinke ich später noch):
Code:
#include "xadow.h"                  // Xadow Mainboard Library (nicht mehr lieferbar)!!!
#include <Wire.h>                   // Basic i2c Library
#include <SeeedOLED.h>              // i2c OLED-Display Library
#include <SparkFun_MS5803_I2C.h>    // i2c Druck und Temp Library
MS5803 sensor(ADDRESS_LOW);         //
#include <HMC5883L.h>               // i2c Kompass Library
HMC5883L compass;                   //
#include <RTClib.h>                 // i2c Echtzeituhr Library
RTC_DS1307 rtc;                     //

float temperature_c, temperature_f;
double pressure_abs, pressure_relative, altitude_delta, pressure_baseline;
double base_altitude = 100.0; // Hier stellt man die aktuelle Höhe auf der man sich gerade befindet, für die Kalibrierung ein.
double deep, deeppressure;
unsigned char tmpalt;
float batVolalt;
double deepalt, deeppressurealt;
float temperature_calt;
float mygradalt, mygrad;
char daysOfTheWeek[7][3] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};

void setup()
{
  Xadow.init();
  Wire.begin();
  SeeedOled.init();                                      // initialze SEEED OLED display
  SeeedOled.clearDisplay();                              // clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();                          // Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();                               // Set addressing mode to Page Mode
  SeeedOled.setRotation(true);                           // dreht Display um 180°
  sensor.reset();
  sensor.begin();
  pressure_baseline = sensor.getPressure(ADC_4096);
  Serial.begin(9600);
  compass.begin();
  compass.setRange(HMC5883L_RANGE_1_3GA);                // Set measurement range
  compass.setMeasurementMode(HMC5883L_CONTINOUS);        // Set measurement mode
  compass.setDataRate(HMC5883L_DATARATE_30HZ);           // Set data rate
  compass.setSamples(HMC5883L_SAMPLES_8);                // Set number of samples averaged
  compass.setOffset(0, 0);                               // Set calibration offset.
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(Jahr, Monat, tag, Stunde, Minute, Sekunde));
    // rtc.adjust(DateTime(2018, 1, 13, 2, 15, 0));
  }
  SeeedOled.setTextXY(2, 0);
  SeeedOled.putString("----------------");
}

void loop() {
  float batVol = Xadow.getBatVol();
  if (batVolalt != batVol) {
    SeeedOled.setTextXY(3, 0);
    SeeedOled.putString("Akku");
    SeeedOled.setTextXY(3, 6);
    SeeedOled.putString("    ");
    SeeedOled.setTextXY(3, 6);
    SeeedOled.putFloat(batVol, 2);
    SeeedOled.putString("V");
    batVolalt = batVol;
  }
  delay(200);
  unsigned char tmp = Xadow.getChrgState();
  SeeedOled.setTextXY(3, 12);
  SeeedOled.putString("  ");
  SeeedOled.setTextXY(3, 12);
  switch (tmp) {
    case NOCHARGE:
      Xadow.redLed(LEDOFF);
      Xadow.greenLed(LEDOFF);
      SeeedOled.putString("NCHG");
      break;
    case CHARGING:
      Xadow.redLed(LEDCHG);
      Xadow.greenLed(LEDOFF);
      SeeedOled.putString(" CHG");
      break;
    case CHARGDONE:
      Xadow.redLed(LEDOFF);
      Xadow.greenLed(LEDON);
      SeeedOled.putString("CHGD");
      break;
    default:
    ;
  }
  delay(200);
  pressure_abs = sensor.getPressure(ADC_4096);                  // Liest den Druck in Milibar aus.
  pressure_relative = sealevel(pressure_abs, base_altitude);    // Convertiert den absoluten Druck mit hilfe der Höhe in den relativen Druck.
  SeeedOled.setTextXY(4, 0);
  SeeedOled.putString("Druck");
  deeppressure = (pressure_relative - pressure_baseline) / 1000;
  if (deeppressurealt != deeppressure) {
    SeeedOled.setTextXY(4, 6);
    SeeedOled.putString("     ");
    SeeedOled.setTextXY(4, 6);
    SeeedOled.putFloat(checkNull(deeppressure),2);
    SeeedOled.putString("bar");
    deeppressurealt = deeppressure;
  }
  delay(200);
  SeeedOled.setTextXY(5, 0);
  SeeedOled.putString("Tiefe");
  deep = (pressure_relative - pressure_baseline) / 100;
  if (deepalt != deep) {
    SeeedOled.setTextXY(5, 6);
    SeeedOled.putString("     ");
    SeeedOled.setTextXY(5, 6);
    SeeedOled.putFloat(checkNull(deep),1);
    SeeedOled.putString("m");
    deepalt = deep;
  }
  delay(200);
  SeeedOled.setTextXY(6, 0);
  SeeedOled.putString("Temp");
  temperature_c = sensor.getTemperature(CELSIUS, ADC_512);
  if (temperature_calt != temperature_c) {
    SeeedOled.setTextXY(6, 6);
    SeeedOled.putString("     ");
    SeeedOled.setTextXY(6, 6);
    SeeedOled.putFloat(temperature_c, 1);
    SeeedOled.putString("C");
    temperature_calt = temperature_c;
  }
  delay(200);
  SeeedOled.setTextXY(7, 0);
  SeeedOled.putString("Grad");
  mygrad = readCompass();
  if (mygradalt != mygrad) {
    SeeedOled.setTextXY(7, 6);
    SeeedOled.putString("      ");
    SeeedOled.setTextXY(7, 6);
    if (mygrad <= 99) {
      SeeedOled.putString("0");
      if (mygrad <= 9) {
        SeeedOled.putString("0");
      }
    }
    SeeedOled.putFloat(mygrad, 1);
    SeeedOled.putChar(127);
    mygradalt = mygrad;
  }
  Zeitausgabe();
  delay(200);
}

double sealevel(double P, double A) {
  return (P / pow(1 - (A / 44330.0), 5.255));
}

double altitude(double P, double P0) {
  return (44330.0 * (1 - pow(P / P0, 1 / 5.255)));
}

float readCompass() {
  Vector norm = compass.readNormalize();
  float heading = atan2(norm.YAxis, norm.XAxis);
  // Set declination angle on your location and fix heading
  // You can find your declination on: http://magnetic-declination.com/
  // (+) Positive or (-) for negative
  // For Taunusstein-Hambach / Germany declination angle is +2° 15' (positive)
  // Formula: (deg + (min / 60.0)) / (180 / M_PI);
  float declinationAngle = (2.0 + (15.0 / 60.0)) / (180 / M_PI);
  heading += declinationAngle;
  if (heading < 0)
  {
    heading += 2 * PI;
  }
  if (heading > 2 * PI)
  {
    heading -= 2 * PI;
  }
  float headingDegrees = heading * 180 / M_PI;
  return headingDegrees;
}

void Zeitausgabe() {
  DateTime now = rtc.now();
  SeeedOled.setTextXY(0, 1);
  SeeedOled.putString(daysOfTheWeek[now.dayOfTheWeek()]);
  SeeedOled.setTextXY(0, 5);
  SeeedOled.putFloat(checkNull(now.day()),0);
  SeeedOled.putString(".");
  SeeedOled.putFloat(checkNull(now.month()),0);
  SeeedOled.putString(".");
  SeeedOled.putFloat(checkNull(now.year()),0);
  SeeedOled.setTextXY(1, 4);
  SeeedOled.putFloat(checkNull(now.hour()),0);
  SeeedOled.putString(":");
  SeeedOled.putFloat(checkNull(now.minute()),0);
  SeeedOled.putString(":");
  SeeedOled.putFloat(checkNull(now.second()),0);
  delay(200);
}

float checkNull(float funktion) {
  if (funktion <= 9) {
    SeeedOled.putString("0");
  }
  return funktion;
}

Ich könnte derzeit bei Folgenden Punkten Unterstützung brauchen:
- Code und besonders die Librarys auf den minimal nötigen umfang zusammenstreichen um ihn effizienter und Speicherplatz schonender zu machen.
Wie man sehen kann hab ich nicht wirklich viel Erfahrung sauber und effizient zu programmieren.
- Die abfrage der Sensoren und die Anzeige auf dem Display (quasi Eingabe und Ausgabe) würde ich gerne jeweils in einer Funktion oder Klasse verwalten und nutzen können, wie mache ich so etwas?
- Erstellen eines intuitiven Bedienkonzept und einer evtl. nötigen Menüstruktur.
- Priorisierung aller Anzeigedaten und Überarbeiten des aktuellen Layout.
- Integrieren einer einfachen Dekompressionstabelle und erste Überlegungen zur dynamischen Bestimmung von Dekompressionszeit und Sicherheitsstop beim auftauchen incl. Warnmeldung bei zu schnellem auftauchen.
- Erstellen eines ersten Schaltplan sowie Platinenlayout in Eagle (ich verwende Version 6.4.0). Damit bin ich leider noch nicht so firm, vor allem wenn es darum geht eigene Bauteile zu erstellen.
- Erstellen eines handgelenkfreundlichen Gehäuses mit Fusion360, um es mit einem 3D-Drucker zu drucken.

Das sind soweit erst mal die Dinge, die ich aktuell auf dem Schirm habe.
Würde mich freuen wenn ihr etwas dazu beitragen könntet.

p. s. bald gibt's wieder ein kleines Video dazu.

Gruß,
avoid

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.02.2018, 16:21
Beitrag #19
RE: selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
Hallo Avoid,

ich bin gerade auf dein Thread aufmerksam geworden und muß sagen ich finde Ihn Höchstinteressant.
Da ich mich selbst mit der Taucherei neuerdings am Rande befasse und deine Ansätze und Ideen sehr gut finde würde ich dir gerne Behilflich sein.
Ich kann dir leider nicht beim Programmieren helfen. Aber da ich in einem Falblab bin und selbst Maschinenbauer kann ich dir sicherlich auf jeden fall beim Gehäuse und bei den Platinen helfen.

Mit vielen Grüßen der Junkie
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.02.2018, 23:12 (Dieser Beitrag wurde zuletzt bearbeitet: 20.02.2018 23:16 von avoid.)
Beitrag #20
RE: selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
Danke für das Angebot,
aktuell befasse ich mich mit dem Schaltplan und Layout für einen Testaufbau der Komponenten. Nach der Diskussion in diesem Beitrag https://www.arduinoforum.de/arduino-Thre...d-um-Eagle habe ich mich dazu entschieden anstelle meines EAGLE mal Target 3001 Demo als Schaltplan und Layout Editor zu verwenden. Dafür erstelle ich gerade die fehlenden Bauteile in Target 3001. Ich bin allerdings noch dabei zu überlegen ob ich einen kompletten Schaltplan zeichne oder jede Baugruppe einzeln, wobei es ja nicht so viel ist.

Wenn der erste Schaltplan und das erste Layout stehen, kannst du evtl. eine Prototypplatine erstellen und mal ein Gehäuse dafür entwerfen das sich am Handgelenk tragen lässt?
Da fällt dir bestimmt einiges ein das es zu beachten gilt, was die Bedienbarkeit an geht, natürlich auch das Design und fugen für Dichtungen.
Das ist etwas um das ich mich noch überhaupt nicht kümmern konnte.

Die letzten Sachen für meinen 3D-Drucker habe ich mit Autodesk Fusion 360 erstellt und in PLA, Filaflex oder HIPS gedruckt. Das Gehäuse sollte auf jeden fall von jedem im 3D-Drucker nachdruckbar sein finde ich. CNC Version aus Metall ist dann natürlich ebenfalls möglich. Welches Material für so etwas geeignet ist habe ich allerdings auch noch keine Ahnung.

Würde mich über Hilfe wirklich freuen.
Auch bei der Programmierung suche ich noch Hilfe, die eingebundenen Librarys müssen auf den verwendeten Funktionsumfang abgespeckt und um fehlende Funktionen erweitert werden.
Ich suche auch noch einen Weg wie ich durch den programmierten Arduino Grafiken im i2c EEPROM ablegen kann ohne das Programm im Arduino ändern zu müssen. Ein kleines Tool unter Windows und einen wählbaren Programmiermodus für die Grafiken, irgendwie als Funktion im eigentlichen Programm.
Und zu guter Letzt brauche ich eine Tauchtabelle/Dekotabelle zur ablage in den i2c EEPROM und jemanden der die gängigen Rechenmodelle für Dekompression in Code formuliert der im Arduino funktioniert.

Noch viel zu tun bevor man damit das erste mal ins Wasser kann.

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2018, 08:29
Beitrag #21
RE: selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
(20.02.2018 23:12)avoid schrieb:  Danke für das Angebot,

Wenn der erste Schaltplan und das erste Layout stehen, kannst du evtl. eine Prototypplatine erstellen und mal ein Gehäuse dafür entwerfen das sich am Handgelenk tragen lässt?
Da fällt dir bestimmt einiges ein das es zu beachten gilt, was die Bedienbarkeit an geht, natürlich auch das Design und fugen für Dichtungen.
Das ist etwas um das ich mich noch überhaupt nicht kümmern konnte.

Die letzten Sachen für meinen 3D-Drucker habe ich mit Autodesk Fusion 360 erstellt und in PLA, Filaflex oder HIPS gedruckt. Das Gehäuse sollte auf jeden fall von jedem im 3D-Drucker nachdruckbar sein finde ich. CNC Version aus Metall ist dann natürlich ebenfalls möglich. Welches Material für so etwas geeignet ist habe ich allerdings auch noch keine Ahnung.

Noch viel zu tun bevor man damit das erste mal ins Wasser kann.

Moin,

Wenn du mir Maße oder einen Link zu der Displayeinheit schickst kann ich mal nen entwurf machen. Allerdings arbeite ich nur mit Freecad 0.17. Das ist Benutzerfreundlicher und vorallem Opensource. Das ist aber kein Problem. Das Gehäuse kann man sicherlich Auch wasserdicht drucken denke ich. Wir haben hier in der nähe einen Uhrmacher der die Druckdichtigkeit testen kann wenn ich mich nicht irre.
Gefräßt würde ich entweder V4A 1.4571 oder Alu ALMGSI... nehmen.
Als Scheibe erstmal ein Acrylglas bis alles wirklich fertig ist.

Wie schon gesagt bei der Programmierung etc. kann ich dir leider nicht helfen.

Viele Grüße

Der Junkie
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Gestern, 21:59 (Dieser Beitrag wurde zuletzt bearbeitet: Gestern 22:00 von avoid.)
Beitrag #22
RE: selbstbau Tauchcomputer [aktueller Fortschritt = Abschnitt 1]
Du kannst die Maße dieses Display verwenden.
Es ist von den Abmessungen baugleich zu dem das ich Gerade zum Testen verwende und auch zu dem Farbdisplay das ich später einbauen werde.
https://www.adafruit.com/product/326

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste