Archiv der Kategorie: Berechnung

Arduino Funktionen zur Vektor Rechnung

Für die Vektorrechnung habe ich die Funktionen in einem Unterprogramm vektor.c zusammengefasst.

// Funktionen für die Vektor Rechnung 
//
// Matthias Busse 1.10.2018 Version 1.0

// Inhalt:
// vAdd(v1, v2, v3)           : v1+v2=v3
// vSub(v1, v2, v3)           : v1-v2=v3
// vMultF(v1, f, v2)          : v1*f=v2
// f=vBetrag(v1)              : |v1|=f
// f=vSkalarprodukt(v1, v2)   : v1 * v2=f
// f=vWinkelGrad(v1, v2)      : Winkel zwischen v1 und v2 in Grad
// vVektorprodukt(v1, v2, v3) : v1 x v2 = v3
// vEinheitsvektor(v1, v2)    : v1 / |v1| = v2, Länge=1
// vRichtungscosinusX(v1)     : v1 Winkel zur X-Achse in Grad
// vRichtungscosinusY(v1)     : v1 Winkel zur Y-Achse in Grad
// vRichtungscosinusZ(v1)     : v1 Winkel zur Z-Achse in Grad

//      z |
//        |
//        |
//        ---------- y
//       /
//    x /


void vAdd(float v1[3], float v2[3], float v3[3]) {
// Vektoren Addieren v1+v2=v3 
// Matthias Busse Version 1.0 vom 30.9.2018
  v3[0]=v1[0]+v2[0];
  v3[1]=v1[1]+v2[1];
  v3[2]=v1[2]+v2[2];
}

void vSub(float v1[3], float v2[3], float v3[3]) {
// Vektoren Subtrahieren v1-v2=v3 
// Matthias Busse Version 1.0 vom 30.9.2018
  v3[0]=v1[0]-v2[0];
  v3[1]=v1[1]-v2[1];
  v3[2]=v1[2]-v2[2];
}

void vMultF(float v1[3], float z, float v2[3]) {
// Vektor multiplizieren mit Zahl v1*z=v2 
// Matthias Busse Version 1.0 vom 30.9.2018
  v2[0]=v1[0]*z;
  v2[1]=v1[1]*z;
  v2[2]=v1[2]*z;
}

float vBetrag(float v1[3]) {
// Vektor Betrag (Länge) von v1 oder |v1|=z 
// Matthias Busse Version 1.0 vom 30.9.2018
  float z;
  z=sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]);
  return z;
}

float vSkalarprodukt(float v1[], float v2[]) {
// Vektoren Skalar multiplizieren v1 * v2 = z 
// |V1| * |V2| * cos winkel_dawischen = z
// Wenn das Ergebis 0 ist, dann sind die Vektoren senkrecht zueinander
// Matthias Busse Version 1.0 vom 30.9.2018
  float z;
  z= (v1[0]*v2[0]) + (v1[1]*v2[1]) + (v1[2]*v2[2]);
  return z;
}

float vWinkelGrad(float v1[], float v2[]) {
// Den Winkel in Grad zwischen zwei Vektoren berechnen  
// Matthias Busse Version 1.0 vom 30.9.2018
  float z, w;
  z=vSkalarprodukt(v1, v2);
  w = z / vBetrag(v1) / vBetrag(v2);
  return acos(w)*57.296; // Rad zu Grad
}

void vVektorprodukt(float v1[3], float v2[3], float v3[3]) {
// Vektorprodukt v1 x v2 = v3
// v3 steht senkrecht auf v1 und v2
// v3 Betrag |v3| ist die Fläche vom v1 und v2 Parallelogramm
// Winkel zwischen v1 und v2 ist 
// |v1 x v2| = |v3| = |A| * |B| * sin winkel_dawischen
// Matthias Busse Version 1.0 vom 30.9.2018
  v3[0]= (v1[1]*v2[2]) - (v1[2]*v2[1]);
  v3[2]= (v1[0]*v2[1]) - (v1[1]*v2[0]);
  v3[1]= -1.0 * ((v1[0]*v2[2]) - (v1[2]*v2[0]));
}

void vEinheitsvektor(float v1[3], float v2[3]) {
// Einheitsvektor v1 / |v1| = v2
// Ergibt den Vektor mit der Länge 1
// Matthias Busse Version 0.1 vom 01.10.2018
  float betrag;
  betrag=vBetrag(v1);
  v2[0]=v1[0]/betrag;
  v2[1]=v1[1]/betrag;
  v2[2]=v1[2]/betrag;
}

float vRichtungscosinusX(float v1[3]) {
// Der RichtungskosinusX bildet den Winkel zwischen dem Vektor und der X Achse
// cos(w) = vx / |v|
// Matthias Busse Version 1.0 vom 01.10.2018
  float winkel;
  winkel=acos(v1[0]/vBetrag(v1));
  return winkel*57.296; // Rad zu Grad
}

float vRichtungscosinusY(float v1[3]) {
// Der RichtungskosinusY bildet den Winkel zwischen dem Vektor und der Y Achse
// cos(w) = vy / |v|
// Matthias Busse Version 1.0 vom 01.10.2018
  float winkel;
  winkel=acos(v1[1]/vBetrag(v1));
  return winkel*57.296; // Rad zu Grad
}

float vRichtungscosinusZ(float v1[3]) {
// Der RichtungskosinusZ bildet den Winkel zwischen dem Vektor und der Z Achse
// cos(w) = vz / |v|
// Matthias Busse Version 1.0 vom 01.10.2018
  float winkel;
  winkel=acos(v1[2]/vBetrag(v1));
  return winkel*57.296; // Rad zu Grad
}

Hier das Programm um die Vektor Funktionen zu testen.
Weiterlesen

Leistung von dbm umrechnen in Volt, dbmW zu VRMS / VPeak / VoltPeakPeak

Die db Milliwatt (db mW) Leistung wird eingegeben und umgerechnet in:
– db Watt (db W)
– Milli Watt (mW)
– Watt (W)
– Volt Effektiv (V RMS)
– Volt Spitze (V Peak)
– Volt Spitze Spitze (V PP)

Die Berechnungen gelten für einen Wellenwiderstand (Z0) von 50 Ohm.

  • dB :
  • Watt :
  • Volt:

von Matthias Busse

Kapazitäten messen. Ein Eagle Board von Andre.

Andre hat ein Board in Eagle gezeichnet für die Kapazitäts Messung aus diesem Beitrag.

Das Board ist für einen Arduino Nano geeignet.
Benötigt werden der Arduino Nano, zwei Widerstände mit 220 Ohm / 10 kOhm und 1-3 Steckleisten.

Hier die Schaltung

und das Layout der Platine. Weiterlesen

In Processing den COM Port auswählen und Werte vom Arduino einlesen.

Wenn Werte vom Arduino abgerufen werden sollen muß zuerst der richtige COM Port ausgewählt werden und dann kann sich Processing damit verbinden. Für die Abfrage der Werte wird eine kurze Anfrage gesendet und der Arduino gibt den entsprechenden String zurück. Dieser wird in Processing eingelesen und dargestellt.

Hier werden als Beispiel 3 mögliche Strings ausgegeben:
1. Anfrage: n Antwort: Name des Geräts
2. Anfrage: s Antwort: Software Version
3. Anfrage: v Antwort: USB Spannung

Die USB Spannung wird ermittelt wie hier beschrieben. Dazu ist nur eine Brücke vom 3,3V Pin zum A0 Eingang notwendig.

Hier das Arduino Programm

// Arduino USB-Spannung an Processing ausgeben
//
// Matthias Busse 21.3.2017 Version 1.0
 
char wert; // Daten von der seriellen Schnittstelle
float vcc;
 
void setup() {
  Serial.begin(38400); // Baudrate
}
 
void loop() {
  vcc = 3.30 / analogRead(0) * 1023;
  while (Serial.available()) {       // Wenn serielle Daten kommen, dann lesen
    wert = Serial.read();            // Daten in wert speichern
    if (wert== 'n') {                // n: Name ausgeben
      Serial.println("USB Spannung messen");
    }
    if (wert== 's') {                // s: Software Version ausgeben
      Serial.println("Version 1.0");
    }
    if (wert== 'v') {                // v: Spannung ausgeben
      Serial.print(vcc);
      Serial.println(" V");
    }
  }
}

In Processing wird dann folgendes gemacht
Eine COM Port Auswahl mit einfachen Pfeiltasten. Dann kann man sich mit dem COM Port verbinden, die Verbindung wieder trennen oder die Liste der COM Ports neu einlesen. Der aktuelle Status wird im Feld darunter ausgegeben. Dazu wird eine einfache Button Klasse verwendet. Weiterlesen

Kapazitäten messen – das Shield von Christian

Hallo Matthias,

ich habe mich sehr über das Projekt zum Kapazitäten messen gefreut habe und es auch öfters schon benutzt.

Allerdings war es mir auf die Dauer zu mühsam das ganze immer wieder neu auf dem Steckbrett aufzubauen. Kurzerhand habe ich mich entschieden einfach ein mini „Shield“ für den Arduino Nano zu bauen.

Es ist wirklich nichts Besonderes, aber vielleicht als Idee für andere auch nützlich gerade weil es so simpel nachzubauen ist.

Im Anhang sind ein paar Fotos.

Danke und Gruß

Christian Weiterlesen

Der Peukert Exponent bei Blei Säure Batterien

Die Kapazität einer Blei-Säure Batterien wird meist für eine 20 Stunden Entladung angegeben. Das ist dann der aufgedruckte C20 Wert von z.B. 100Ah. Nach Vollladung kann die Batterie also 100Ah in 20 Stunden abgeben oder anders ausgedrückt 5A für 20 Stunden.

Wird der Strom erhöht, sinkt die Kapazität. Das ist mit dem Peukert Exponenten darstellbar.

Wenn dauerhaft 20A entnommen werden, sinkt die Kapazität auf ca. 70Ah und die Batterie ist schon nach 3,5 Stunden entladen. Weiterlesen

NMEA2000 Ankeralarm mit dem Arduino aufgebaut

Ein Ankeralarm hält die Ankerposition des Bootes fest und ermittelt dann kontinuierlich den Abstand zum Ankerplatz über die Nacht. Es wird ein Alarmradius eingegeben den das Boot nicht verlassen darf. Alle gehen schlafen und sollen geweckt werden, wenn der Anker nicht hält, weil z.B. der Wind stärker geworden ist, der Anker sich gelöst hat und der eingestellte maximale Ankerradius verlassen wird.

Dazu benötige ich einen GPS Empfänger (hier mein Lowrance HDS), ein NMEA2000 Netzwerk, den Arduino mit Schnittstellenplatine zur Berechnung der Positionen und dem Abstand, einen Poti um die Alarmdistanz (maximaler Ankerradius) einstellen zu können und einen Alarmtongeber (hier habe ich nur eine LED angeschlossen) der ggf. noch über ein Relais geschaltet werden kann. Weiterlesen

Den Mittelwert fortlaufend bilden mit einer Funktion

Es soll ein fortlaufender Mittelwert aus n Integer Zahlen gebildet werden. Dazu wird die Funktion float mittelWert(int neuerWert) verwendet.

Am Anfang des Programms wird die Anzahl der Mittelungen festgelegt und die globalen Variablen werden erstellt.

#define anzahlMittelWerte 10
int werte[anzahlMittelWerte], zaehlerMittelWerte=0;

Im Hauptprogramm werden fortlaufend Zufallszahlen zwischen 1 und 10 erzeugt. Diese werden hier gemittelt und ausgegeben.

Weiterlesen

Der Hamming Code für den Arduino

Bei einer digitalen Funkübertragung kann es zu Störungen kommen und einzelne Bits werden falsch empfangen, kippen sozusagen um. Aus einer 1 wird eine 0.

Richard Wesley Hamming hat sich dazu Gedanken gemacht und eine Codierung entwickelt, die es erlaubt zu überprüfen ob alle Bits richtig übertragen wurden. Einzelne Bits können sogar rekonstruiert werden.

Hier sollen 4 Daten-Bits übertragen werden. Dazu werden nach einem bestimmten Schema 3 Paritäts-Bits hinzugefügt, die Daten werden codiert. Es müssen nun 7 Bits übertragen werden. Wird ein Bit falsch empfangen, so lässt es sich später bei der Decodierung rekonstruieren.

Die 4 Daten-Bits werden mit 3 Paritäts-Bit nach diesem Schema ergänzt.
Die Datenbits: d4, d3, d2, d1 Weiterlesen

Arduino FFT auf dem 5110 Display ausgeben

Aus den letzten beiden Artikeln Arduino FFT berechnen und 5110 Grafik ausgeben ist nun eine Arduino Uno FFT Berechnung mit Grafik Ausgabe geworden.

Arduino Uno FFT Ausgabe

Für die Grafik Ausgaben wurde die Library von Henning Karlsen installiert und verwendet.

Das Programm berechnet verschiedene Wellenformen
– Ein Rechtecksignal
– Ein Sinus Signal
– Zwei addierte Sinus Wellen
– Eine Frequenzmodulation
und gibt das Frequenzspektrum von 0 – 2520 Hz aus, in 40 Hz Schritten. Weiterlesen