Arduino Nano als RC-Heli Telemetriesensor-Hub

Hallo zusammen!

Bin neu hier und hoffe daß ihr mir bei meinem Problem helfen könnt.

Muß vorausschicken, daß ich weder aus der EDV-Ecke noch aus der Elektronik-Ecke komme, sondern Maschinenbauer bin und mir alles zum Thema Arduino und Elektronik bisher aus dem Internet und mittels Trial&Error selber beigebracht habe.
Wenn also das eine oder andere nicht dem heutigen Stand der Technik entsprechen sollte, seid bitte gnädig mit mir ..... :slight_smile:

Nun zu meinem Anliegen:

Ich nutze mehrere Arduino Nano in meinen RC Modellen bspw. zur Drehzahl und Strommessung.

Als Fernsteuersystem nutze ich ein Telemetriesystem von Frsky, der Nano überträgt seine Daten unter Zuhilfenahme dieser Bibliothek

zum Empfänger, welcher die Daten wiederum an den Sender schickt.

Drehzahlmessung mittels Magnet+Hallsensor beim Heli sowie im Flugzeug mittels eigener Drehzahlsensoren

(z.B. Radio Control Planes, Drones, Cars, FPV, Quadcopters and more - Hobbyking )

funktionieren einwandfrei.

Wo ich aber jetzt feststecke ist die Strommessung.

Ich nutze diesen Stromsensor:

Dieser wird mit 5V vom Arduino betrieben und liefert an A1 ein analoges Signal, welches ich auslese.

Als Testaufbau schalte ich den Sensor zwischen Ladegerät und Akku und erhöhe schrittweise den Ladestrom und lese die Analogwerte an A1 aus.

Dies sieht folgendermaßen aus:

Strom .... Meßwert
0A .... 312
1A .... 315
2A .... 318
3A .... 321
usw.

Der auf dem Stromsensor vorhandene Hallsensor ist ein ACS756 mit Meßbereich von -100 bis +100A (wobei ich mit "Minus" A so meine Verständnisprobleme habe, aber gut...).
Insofern entspräche -100A einem Meßwert von ca. 12 und +100A einem Meßwert von ca. 612.

Mein Problem liegt jetzt darin, daß, sobald der Helimotor anläuft, der Arduino den Meßwert 1023 ausgibt und danach keine (Strom) Daten mehr liefert (RPM kommen nach wie vor!).

In diesem Zustand messe ich per Multimeter 1,633 V am Analogausgang des Stromsensors....

Und jetzt kommts:
nehme ich den Stromsensor heraus, sprich er mißt gar keinen Strom, zeigt er am Anfang den Meßwert 312 (also 0A) UND GEHT EBENFALLS AUF 1023 SOBALD DER MOTOR ANLÄUFT, und das obwohl er wie gesagt weder mit Motor noch mit Akku verbunden ist!!!

Für mich würde das bedeuten, daß im Moment des Motoranlaufs 5V an Analog A1 anliegen, doch woher bitte schön kommen die? Und warum mißt er dann nicht weiter?

Testweise habe ich mal den internen pullup an A1 aktiviert, was nichts gebracht hat.

Gedanken mache ich mir auch über das Thema + und - A:

Bei meinem Testaufbau fließt der Strom vom Lader zum Akku (für diese Richtung ist er eigentlich nicht konzipiert), die Meßwert steigen dabei jedoch, obwohl ich mir denke, daß dies dann die "Minus" Ampere sein sollten und die Meßwerte fallen sollten???

In seiner "normalen" Arbeitsrichtung von Akku zum Motor (also genau umgekehrt), sollten die Werte dann ja eigentlich in die andere Richtung gehen oder?
Sorry, wie gesagt, bin hier wie gesagt Laie.....

Könnt ihr mir hier irgendwie weiterhelfen?

Könnt ihr mir hier irgendwie weiterhelfen?

Mein Rat ist hier, ließ dich in Fachbücher ein. Aus meiner Sicht ist dieses Thema für einen Nichtfachmann, wie du dich bezeichnest, viel zu komplex und wir können hier keine Grundlagenschulung geben.

Also ein gutes Fachbuch der Elektronik und darin lesen um die Thematik auch zu verstehen.

Ohne dem geht es leider nicht.

Danach sind wir gerne bereit, dir bei deinem Vorhaben zu helfen.

der ACS 756 sollte bei 0A ca. Vcc/2 am Ausgang haben, also ca. 2,5V, somit sollte der Nano ca. 512 am Analog Input ausgeben. Die Empfindlichkeit beträgt 40mV/A. Brauchst du einen Sensor für einen so großen Strom? Sonst nehme doch einen ACS712, die gibt es in 5A, 20A, oder 30A,
Wie hast du den Sensor angeschlossen, und wie sieht dei Sketch aus, mit dem du ihn ausliest?

HotSystems:
Mein Rat ist hier, ließ dich in Fachbücher ein. Aus meiner Sicht ist dieses Thema für einen Nichtfachmann, wie du dich bezeichnest, viel zu komplex und wir können hier keine Grundlagenschulung geben.

Also ein gutes Fachbuch der Elektronik und darin lesen um die Thematik auch zu verstehen.

Ohne dem geht es leider nicht.

Danach sind wir gerne bereit, dir bei deinem Vorhaben zu helfen.

Also:
Nichtfachmann heißt jetzt nicht, daß ich ein kompletter DAU bin, sonst wäre ich wahrscheinlich noch nicht so weit gekommen, wie ich jetzt bin.
Und soooo komplex ist die Thematik des Auslesens zweier Sensorwerte und deren Umrechnung in ein lesbares Format ja jetzt auch wieder nicht!
Abgesehen davon geht's hier nicht darum, in einer Doktorarbeit auf mA genau zu messen, sondern die Werte >ca.< zu haben um während des Fluges Einschätzungen zu treffen und Überlastungen zu vermeiden sowie Auslegungen zu prüfen (Prop Durchmesser / Steigung etc....).
Aber Danke trotzdem!

ardubu:
der ACS 756 sollte bei 0A ca. Vcc/2 am Ausgang haben, also ca. 2,5V, somit sollte der Nano ca. 512 am Analog Input ausgeben. Die Empfindlichkeit beträgt 40mV/A.

Das Datenblatt habe ich gelesen, ich komme aber mit den Werten nicht hin. Weder die Vcc/2 kommen hin noch die angegebenen 20 bzw. 40mV/A. (Multimeter sagt 15mV/A).
Vielleicht ein anderer Subtyp des Sensors? Von einem anderen Hersteller vielleicht?

ardubu:
Brauchst du einen Sensor für einen so großen Strom? Sonst nehme doch einen ACS712, die gibt es in 5A, 20A, oder 30A,

Oh ja, die Dinger ziehen ganz schön Strom unter Vollast! 60-70A in Extremsituationen sind schon möglich. Der nächstgrößere Helityp kratzt dann schon an der 100A Marke!

ardubu:
Wie hast du den Sensor angeschlossen, und wie sieht dei Sketch aus, mit dem du ihn ausliest?

5V vom Arduino gehen an den Sensor, ebenso Masse.
Signal vom Sensor geht an Arduino Pin A1

Hier mein Sketch:

#include <SoftwareSerial.h>
#include <Time.h>
#include <FrSkySportSensor.h>
#include <FrSkySportSensorRpm.h>
#include <FrSkySportSingleWireSerial.h>
#include <FrSkySportTelemetry.h>
#include <FrSkySportSensorFcs.h>
#include <SoftwareSerial.h>

float rpm,current_reading,current;
long ActualPulse,PreviousPulse;
volatile long TimeBetweenPulses;

FrSkySportSensorRpm Sensor_RPM;
FrSkySportTelemetry telemetry;
FrSkySportSensorFcs Sensor_Current;

#define PIN_RPM 3 // pin Hall-Sensor, mit 10k Pullup-Resistor
#define PIN_CURRENT A1 // pin Stromsensor

void setup()
{ rpm=0; PreviousPulse=0;TimeBetweenPulses=0;
pinMode(PIN_RPM, INPUT);
pinMode(A1, INPUT);
attachInterrupt(1, Impulse, FALLING);
telemetry.begin(FrSkySportSingleWireSerial::SOFT_SERIAL_PIN_12, &Sensor_RPM, &Sensor_Current);
Serial.begin(115200);
}

// Routine called each time pin defined in PIN_RPM goes from 1 to 0.
void Impulse()
{ ActualPulse=micros();
TimeBetweenPulses=ActualPulse-PreviousPulse;
PreviousPulse=ActualPulse;
}

void loop()
{ rpm=(1/(TimeBetweenPulses/1000000))*60;
Sensor_RPM.setData(rpm,0);

current_reading=analogRead(PIN_CURRENT);

/current=map(current_reading,12,612,-100,100);
Sensor_Current.setData(current,0);
/

Sensor_Current.setData(current_reading,0); // zum debuggen übertrage ich den gelesenen wert und nicht den Strom selbst

telemetry.send();
}

Aber die große Frage ist ja: Warum liest der A1 1023 obwohl beim Motorstart eigentlich gar nichts am Sensor dranhängt?

mach doch mal Serial.print(analogRead(PIN_CURRENT)); und schau mal was auf dem Seriellen Monitor angezeigt wird.

während ich den Sketch entwickelt hab habe ich NUR mit der Ausgabe über Serial.println() gearbeitet.

Erst als da die richtigen Werte (nachvollziehbar!) kamen habe ich dann begonnen die Werte an die Fernsteuerung zu übertragen, wo dann die gleichen Werte ankamen.

Das Problem ist, sobald ich Werte über den Serial Monitor ausgebe, funktioniert die Übertragung an den Sender nicht mehr.
Keine Ahnung warum, aber da mußte ich auch erstmal draufkommen. Am Serialmonitor waren die Werte ok, aber am Sender kam nichts an, war schon am Verzweifeln.
Erst als ich alle Serial.println() auskommentiert hatte, empfing der Sender alle Werte.

Aber um auf deine Frage zu antworten:

Serial.print(analogRead(PIN_CURRENT));

bring genau das gleiche Ergebnis.... 1023 sobald der Motor anläuft, RPM werden sauber ausgegeben.

was passiert wenn du den Sensor weg läßt und den A1 auf GND legst

ardubu:
was passiert wenn du den Sensor weg läßt und den A1 auf GND legst

dann bekomme ich den Wert 0 gelesen, wie es sein sollte.
Interessant ist allerdings, wenn ich dabei den Motor anlaufen lasse (Wert bleibt 0) und danach wieder den Sensor anstecke habe ich sofort wieder den Wert 1023 anliegen.
Ich verstehs einfach nicht.

Allerding habe ich jetzt einen alternative Sketch geschrieben (mit einigen Hilfen aus diversen einschlägigen Foren).
Ich habe aus dem Internet das Grundgerüst genommen und meine Berechnungen eingefügt, und, voila, es läuft.

Obwohl ich keine großen Unterschiede zu meinem ersten Sketch feststellen kann:

#include <SoftwareSerial.h>
#include <Time.h>
#include <FrSkySportSensor.h>
#include <FrSkySportSensorRpm.h>
#include <FrSkySportSingleWireSerial.h>
#include <FrSkySportTelemetry.h>
#include <FrSkySportSensorFcs.h>
#if !defined(MK20DX128) && !defined(MK20DX256)
#include <SoftwareSerial.h>
#endif

float rpm;
float lastrpm;
float rpm_last;
float current_reading;
float current;
float ActualPulse;
volatile float TimeBetweenPulses;
float PreviousPulse;
int ActualTime;

FrSkySportSensorRpm Sensor_RPM(FrSkySportSensor::ID15);
FrSkySportTelemetry telemetry;
FrSkySportSensorFcs Sensor_Current(FrSkySportSensor::ID20);

#define PIN_RPM 3
#define PIN_CURRENT A1

void setup()
{ rpm=0; PreviousPulse=0;TimeBetweenPulses=0;
pinMode(PIN_RPM, INPUT);
attachInterrupt(1, Impulse, FALLING);

#if defined(MK20DX128) || defined(MK20DX256)
telemetry.begin(FrSkySportSingleWireSerial::SERIAL_12, &Sensor_RPM, &Sensor_Current);
#else
telemetry.begin(FrSkySportSingleWireSerial::SOFT_SERIAL_PIN_12, &Sensor_RPM, &Sensor_Current);
#endif
// set the data rate for the SoftwareSerial port
// this is the speed of the UART of the FrSky receiver
Serial.begin(115200);
ActualTime=micros();
}

void Impulse()
{ ActualPulse=micros();
TimeBetweenPulses=ActualPulse-PreviousPulse;
PreviousPulse=ActualPulse;
}

void loop()
{ // RPM Measurement

if(Serial.available());
{ rpm=(1/(TimeBetweenPulses/1000000)*60);
Sensor_RPM.setData(rpm,0);

// Current Measuerment
current_reading=analogRead(PIN_CURRENT);
current=(float)map(current_reading,2,604,100,-100);
Sensor_Current.setData(current,0.4);
}

telemetry.send();

}

Irgendwo war da wohl der unsichtbare Wurm drin.
Läuft also jetzt erstmal, vielen Dank für die Hilfe......

Ich habe auch die FrSky Telemetrie im Einsatz und wollte mich schon immer damit befassen, werde vom Arduino einzuspeisen bzw. auszuwerten und am Sender per großem Display auszugeben. Hast du mal ein paar Links zu einschlägigen deutschsprachigen Seiten?

ElEspanol:
Hast du mal ein paar Links zu einschlägigen deutschsprachigen Seiten?

deutschsprachige leider nicht, sorry.

Ich hab mir alles von diesem Link:

sowie dem einen, in dem die FrSky Library vorgestellt wird:

In der Library ist auch ein Beispiel dabei, wie die einzelnen Sensorwerte emuliert werden.

Was ich für sinnvoll halte und relativ einfach realisierbar wäre, wären (Einzelzellen-)Spannung, Strom und eventuell ein Vario laut dieser Vorlage:

Wennst Fragen hast, meld dich....