Arduino-Sketche kombinieren...

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Arduino-Sketche kombinieren...

Beitrag von RMK »

Hallo Leute,

nach mehrfachen Anstupsern habe ich angefangen mit den uCs zu spielen - bevor es jetzt aber an die
geplante Ofensteuerung geht, habe ich eine kleinere Baustelle, die gamz gut für ein erstes ernsthaftes
Projekt geeignet wäre:


ich möchte gern eine Wasserwaage mit einem Arduino bauen, so in der Art hier:

https://www.youtube.com/watch?v=fadT2ODVMbc

also mit einer Reihe LEDs, die mittlere grün, und die Kippung soll nicht seitlich sondern nach vorn/hinten verlaufen, das ist ja aber egal.
schön wäre wenn nicht nur einzelne LEDs leuchten würden, sondern immer mehr, je "schiefer" das Ganze wird. Ist aber nicht so wichtig.

einen ADXL345 und den Sketch hier habe ich schon ausprobiert, das läuft:

https://github.com/jarzebski/Arduino-AD ... simple.ino
(ich habe Z- und Y-Achse auskommentiert, ich brauche nur eine Richtung, aber das ist ja nicht schlimm)

die Werte werden schön auf den seriellen Monitor geschickt. prima.


das würde ich gern mit einer Bargraph-Anzeige verheiraten:

https://www.arduino.cc/en/Tutorial/BarGraph

einzeln tut das auch, aber gemeinsam - da klemmts jetzt bei mir... :-(

eine Messung -10°-waagerecht- +10° wäre völlig ausreichend, mit 11 oder 13 LEDs in einer Reihe..


Hintergrund der ganzen Sache: mein Papa hat einen Radlader, aber kriegt es nicht so leicht hin, die
Gabeln beim stapeln von Gitterboxen oder Paletten waagerecht zu stellen und trifft dann immer gern mal
eine andere Gitterbox oder wirft die sogar runter :(

ich habe schonmal ein Kästchen gebaut mit einem Potentiometer, einem Pendelgewicht da dran und einem
LM-3916, das einfach an der (senkrechten) Fläche der Gabel befestigt wurde, aber leider ist das Pendel
nicht präzise genug bzw. braucht ein bisschen Losbrechmoment bis es sich bewegt - klappt nicht sonderlich gut.


daher jetzt der Umstieg auf nen Arduino Nano... in der Hoffnung dass der empfindlicher reagiert.

vielleicht hat jemand einen heissen Tip oder sogar ein kombinierten Sketch für mich..?
ich kriege die Anpassungen nicht hin :-/

danke!
bastelbjoern
Beiträge: 605
Registriert: So 12. Okt 2014, 22:46

Re: Arduino-Sketche kombinieren...

Beitrag von bastelbjoern »

RMK hat geschrieben:
die Werte werden schön auf den seriellen Monitor geschickt. prima.


das würde ich gern mit einer Bargraph-Anzeige verheiraten:

https://www.arduino.cc/en/Tutorial/BarGraph

einzeln tut das auch, aber gemeinsam - da klemmts jetzt bei mir... :-(
Der Baragraph erwartet ein analog Eingang an A0
dein Ausgang ist seriell da ich nur geraten habe welche Datei du hast (ADXL345? )
hat digitales signal.
das muss erst zu analog gewandelt werden. oder der Baragraph auf Digital Eingang gestrickt werden (was in meinen Augen Sinnvoller ist)
Aber da muss ich leider passen.
Im Augenblick reden deine Programmteile nicht miteinander. Jetzt brauchen wir(eigentlich DU ) nur einen, der für die Psychiater spielt :lol:

Gruss BJ
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

bastelbjoern hat geschrieben: Der Baragraph erwartet ein analog Eingang an A0
jupp, das ist mir klar (ist ja ein Poti dran)
dein Ausgang ist seriell da ich nur geraten habe welche Datei du hast (ADXL345? )
hat digitales signal.
ja, auch das hab ich realisiert...
das muss erst zu analog gewandelt werden. oder der Baragraph auf Digital Eingang gestrickt werden (was in meinen Augen Sinnvoller ist)
Aber da muss ich leider passen.
siehste, ich auch. ich wollte den Bargraph auch auf "friss digitale Werte!" haben, aber da haperts noch...
Im Augenblick reden deine Programmteile nicht miteinander. Jetzt brauchen wir(eigentlich DU ) nur einen, der für die Psychiater spielt :lol:
...und daher diese Anfrage hier :)

R
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Arduino-Sketche kombinieren...

Beitrag von Sir_Death »

Ich habe leider keinen ADXL345, darum kann ich dir nur grob die Richtung weisen.

Aus dem Sketch https://github.com/jarzebski/Arduino-AD ... simple.ino
kannst du den gesamten read normalized / output normalized Teil raus werfen - nachdem du die Daten ja auf eine LED-Anzeige wandeln willst, musst du sowieso selbst umwandeln, und brauchst aus dem Sketch nur die raw-Daten.

Weiters kannst du die beiden Unterroutinen showRange und showDataRate inklusive Ihrem Aufruf in void setup { } raus werfen, und dazu auch noch die serielle Schnittstelle - die könntest du maximal beim TEsten brauchen, aber danach macht sie das Programm nur langsamer.

Ich versuche es mal einzudampfen - wie gesagt ungetestet.

Code: Alles auswählen

#include <Wire.h>
#include <ADXL345.h>

ADXL345 accelerometer;

void setup(void) 
{
  // Initialize ADXL345
  accelerometer.begin();
  // Set measurement range
  // +/-  2G: ADXL345_RANGE_2G
  // +/-  4G: ADXL345_RANGE_4G
  // +/-  8G: ADXL345_RANGE_8G
  // +/- 16G: ADXL345_RANGE_16G
  accelerometer.setRange(ADXL345_RANGE_16G);
}

void loop(void) 
{
  // Read raw values
  Vector raw = accelerometer.readRaw();

  // Output to Bargraph
  // Hier gehört die Bargraph-Umrechnung und Ausgabe inkludiert.

 

  delay(100);
}
Der Rest von der simple.ino ist nicht notwendig.

Der gekürzte Bargraph-Code:

Code: Alles auswählen

const int ledCount = 10;    // the number of LEDs in the bar graph

int ledPins[] = {
  2, 3, 4, 5, 6, 7, 8, 9, 10, 11
};   // an array of pin numbers to which LEDs are attached


void setup() {
  // loop over the pin array and set them all to output:
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    pinMode(ledPins[thisLed], OUTPUT);
  }
}

void loop() {
  // Hier gehört der "Read Raw Values" - Teil aus dem ADXL345 Code her:
  //.......

  // map the result to a range from 0 to the number of LEDs: - Hier rechnen wir deinen X-Wert in die LED-Kette um. dein kleinster Wert soll nur die LED am weitesten links zu leuchten bringen, dein größter Wert nur die LED ganz rechts. steht er gerade, dann die mittlere LED. DAher ist es wichtig, dass dein Min und Max gleich groß sind!
  int ledLevel = map(raw.XAxis, 0, 1023, 0, ledCount);  // statt der "0" kommt dein Minimalwert, statt der "1023" dein Maximalwert. Dieser Befehl macht aus deinem Minimalwert einen LED-Level von "0", aus deinem Maximalwert einen LED-Level mit "ledCount" - sprich der Anzahl deiner LEDs. dazwischen wird linear interpoliert.

  // loop over the LED array:
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    // if the array element's index is less than ledLevel,
    // turn the pin for this element on:
    if (thisLed < ledLevel) {
      digitalWrite(ledPins[thisLed], HIGH);
    }
    // turn off all pins higher than the ledLevel:
    else {
      digitalWrite(ledPins[thisLed], LOW);
    }
  }
}
jetzt musst du nur noch die beiden Dateien verheiraten.
-) Alles was oberhalb von "void setup" steht, wird ganz oben hinein kopiert.
-) Die beiden "void setup" werden gemeinsam ein "void setup", in dem alle Teile aus beiden drinnen stehen
-) gleiches gilt für die beiden "void loop" - Zusammenfassen auf eines.

Ob du dann am Ende das delay(100); noch lässt musst du entscheiden, wie schnell sich die Anzeige aktualisieren soll.

Ich hoffe, damit hast du einen ersten Anhaltspunkt, wie die beiden zu verheiraten sind. - Ansonsten einfach nochmal fragen - genau so hab ich vor ein paar Jahren auch begonnen ;)

EDIT: Gerade noch gesehen: Der ADXL345 ist ein Beschleunigungssensor - kein Lagesensor. Da muss irgendwo dazwischen noch ein schlaues Stück Software rein (Umrechnung/Merker), damit daraus die Lage werden kann. - Diese Physik überlege ich mir aber heute nicht mehr - sorry ;) - Die Grundsätze zum Zusammenfassen der zwei Programme stimmen aber weiterhin.

EDIT2: http://www.pcmx.de/?p=204 so macht das der Typ im Video - Sourcecode ist aber auf Fußpilzebene (Assembler)
Weiterführende Literatur:
https://forum.arduino.cc/index.php?topic=372235.0
https://learn.adafruit.com/adxl345-digi ... rogramming

Da hast du dir für den Anfang gleich mal ein schwereres Projekt als deinen Ofen ausgesucht. :lol:
Benutzeravatar
Bastelbruder
Beiträge: 11481
Registriert: Mi 14. Aug 2013, 18:28

Re: Arduino-Sketche kombinieren...

Beitrag von Bastelbruder »

Sir_Death hat geschrieben:EDIT: Gerade noch gesehen: Der ADXL345 ist ein Beschleunigungssensor - kein Lagesensor. Da muss irgendwo dazwischen noch ein schlaues Stück Software rein (Umrechnung/Merker), damit daraus die Lage werden kann
Duitse spracke- schwere spracke. Synonyme, vergessene Worte und Worte mit mehreren Bedeutungen. Martin Luther bei so einer Gelegenheit das Tintenfaß an die Wand geworfen.
Der ADXL345 ist sehr wohl ein statisch arbeitender Lagesensor, der ist allerdings auch für Gegenden mit etwas höherer Gravitation geeignet. Oder für Kurvenfahrten mit ernsthaftem Fahrwerk.
The ADXL345 is a complete 3-axis acceleration measurement system with a selectable measurement range of ±2 g, ±4 g, ±8 g, or ±16 g. It measures both dynamic acceleration resulting from motion or shock and static acceleration, such as gravity, that allows the device to be used as a tilt sensor.
Reine Beschleunigungssensoren arbeiten dynamisch und haben eine untere Grenzfrequenz, das sind beispielsweise Piezos mit Ladungsverstärker.

Die Wasserwaage wird so funktionieren, aber ich würde die Luftblasenanzeige nicht durch einen Balken ersetzen. Nach Möglichkeit die Abtast- und Anzeigerate hochsetzen, dann hilft das Rauschen dem Auge, die Mitte der leuchtenden Wolke zu finden. Überhaupt ist Latenz ist das allerletzte was der bio-Regler beim manuellen Einstellen der Waagrechte brauchen könnte.
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

wie geschrieben, es ist für nen Radlader - da bewegt sich alles relativ gemächlich.
geht nur darum den *jetzt waagerecht!* -Zustand der Stapelgabel anzuzeigen,
über ca 2.5m Entfernung.... sonst hätt ich direkt ne Wasserwaage drangespaxt ;-)

und Kabel ziehen mit Anzeige im Führerhaus ist eher verwirrender als ne für helle
grüne LED die von weitem "jetzt passts!" anzeigt :)
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Arduino-Sketche kombinieren...

Beitrag von Sir_Death »

Bastelbruder hat geschrieben:....and static acceleration, such as gravity, that allows the device to be used as a tilt sensor.
Reine Beschleunigungssensoren arbeiten dynamisch und haben eine untere Grenzfrequenz, das sind beispielsweise Piezos mit Ladungsverstärker.
OK - so weit habe ich nicht gelesen - dann sollte tatsächlich das von mir skizzierte passen - musst du nur noch deinen Minimal- und Maximalwert herausfinden (siehe oben) und wie skizziert verheiraten.
Benutzeravatar
Spike
Beiträge: 2485
Registriert: Mi 15. Jul 2015, 08:05

Re: Arduino-Sketche kombinieren...

Beitrag von Spike »

Mal eine ganz andere Idee: Quecksilberschalter und Signallampe? Da tust Du Dir dann zwar keine Programmierkenntnisse drauf, könnte aber trotzdem funktionieren.
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

die Idee hatte ich sogar schon, mit einer Handvoll kleiner Quecksilberschalter und Lämpchen/LEDs.

theoretisch funktioniert das Ding mit dem Pendel am Potentiometer auch, nur braucht das Pendel einen kleinen
Schubs bis es sich bewegt, und das ist nicht ganz optimal. Könnte ich sicher noch verbessern (ich habe inzwischen
ein Poti gefunden mit "keiner" Reibung) aber ich dachte wenn alle Welt mit µCs arbeitet und ich eh mit den Dingern
anfangen wollte, warum nicht damit... :)

bin allerdings noch nicht dazu gekommen den geänderten Sketch zu testen, zu viel unterwegs grade :-/
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

Soooo, kurze Rückmeldung (und nebenbei Danksagung!) - der Gerät funktioniert, zumindest auf dem Breadboard. :)

die voids und setups habe ich kombiniert, das delay rausgenommen, und den Wert experimentell (äh.. geraten ;-) )
auf -100 und + 100 gesetzt. (nicht 0 und 200..)
Dadurch leuchtet tatsächlich bei waagerecht gehaltener Sensorplatine die Hälfte der LEDs, incl meiner grünen "Mitte",
und wenn man weiter kippt leuchtet der Rest nach und nach auch - bzw. beim Zurückkippen werden es wieder weniger.

Ich überlege ob ich es hinkriege auf einzeln leuchtende LEDs umzustricken, und noch eine weitere als
Einschaltanzeige leuchten lasse (wobei das auch stumpf "analog" mit Widerstand und LED am Einschalter
zu bewerkstelligen ist... #-) )

also, danke nochmals, wenn ich alles in ein Kästchen gebaut habe gibts auch ein Bild davon. :)
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Arduino-Sketche kombinieren...

Beitrag von Sir_Death »

Sehr gut! - Bin schon gespannt, wie es fertig aussieht.
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

Hallo,

mechanisch bauen kann ich erst wenn ich wieder aus dem Urlaub zurück bin (Anfang September...),
so spektakulär wird das aber nicht. Eine wasserdichte Abzweigdose mit ner Reihe LEDs, auf der Rückseite
zwei Festplattenmagnete, dann noch ein Einschalter und evtl. eine Ladebuchse für die LiIons die ich
verwenden will...

im Prinzip funktioniert es, und ich werd das Ding auch so bauen (ok, mit 11 LEDs, eine grüne in der Mitte);
umprogrammieren geht ja dann immer noch - da ist nämlich noch eine kleine Unschönheit :-)
ich hab den folgenden Code:

Code: Alles auswählen

const int ledCount = 10;    // the number of LEDs in the bar graph

    int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};   // an array of pin numbers to which LEDs are attached


    #include <Wire.h>
    #include <ADXL345.h>

    ADXL345 accelerometer;

    void setup(void)
    {
      // Initialize ADXL345
      accelerometer.begin();

      // Set measurement range
      accelerometer.setRange(ADXL345_RANGE_2G);
    
      // loop over the pin array and set them all to output:
      for (int thisLed = 0; thisLed < ledCount; thisLed++) {
        pinMode(ledPins[thisLed], OUTPUT);
      }
    }

    void loop() {

      // Read raw values
      Vector raw = accelerometer.readRaw();

      // Output to Bargraph
         
      // map the result to a range from 0 to the number of LEDs: - Hier rechnen wir deinen X-Wert in die LED-Kette um. dein kleinster 
      // Wert soll nur die LED am weitesten links zu leuchten bringen, dein größter Wert nur die LED ganz rechts. steht er gerade, dann die 
      // mittlere LED. DAher ist es wichtig, dass dein Min und Max gleich groß sind! (damit lässt sich aber auch eine evtl. Grundneigung kompensieren)

      int ledLevel = map(raw.XAxis, -80, 80, 0, ledCount);  // statt der "0" kommt dein Minimalwert, statt der "1023" dein Maximalwert. 
       //   Dieser Befehl macht aus deinem Minimalwert einen LED-Level von "0", aus deinem Maximalwert einen LED-Level mit "ledCount" - sprich der 
       // Anzahl deiner LEDs. dazwischen wird linear interpoliert.

      // loop over the LED array:
      for (int thisLed = 0; thisLed < ledCount; thisLed++) {
        // if the array element's index is equal to ledLevel,
        // turn the pin for this element on:
        if (thisLed == ledLevel) {
          digitalWrite(ledPins[thisLed], HIGH);
             }
        
        // turn off all pins other than the ledLevel:
        else {
          digitalWrite(ledPins[thisLed], LOW);
             }


        }
    }

dadurch leuchtet immer nur eine LED, klappt sehr gut- das doofe ist nur wenn der maximale Bereich
der Neigung überschritten ist, geht die letzte LED der Reihe halt auch wieder aus. Das hätte ich
gern verhindert, so dass die letzten an bleiben.. was muss ich da noch einfügen?

thx... :)
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Arduino-Sketche kombinieren...

Beitrag von Sir_Death »

nach dem:

Code: Alles auswählen

int ledLevel = map(raw.XAxis, -80, 80, 0, ledCount);
einfügen:

Code: Alles auswählen

if (raw.XAxis<-80) ledLevel=0; //eventuell ledLevel=1;
if (raw.XAxis>80) ledLevel = ledCount;
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

ok, versuche ich, danke- hatte es mit einer if-Abfrage nach dem
"abschalten" versucht, das war aber nicht zielführend...

melde mich bei Erfolg (oder Misserfolg :-D )
Benutzeravatar
RMK
Beiträge: 5360
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Arduino-Sketche kombinieren...

Beitrag von RMK »

sooo, läuft - nochmal danke. :)

musste allerdings in der zweiten Zeile den Wert "ledCount-1" eintragen, damit tatsächlich
auch die letzte LED in der Reihe beim "überdrehen" anbleibt...

warum, ist mir nicht so ganz klar.

ansonsten klappt es sehr gut, auch verzögerungsfrei, jetzt werd ich wie gesagt das "magnetische"
Gehäuse bauen- schöne große helle 10mm-LEDs habe ich schon bereitgelegt. :)


die nächste Ausbaustufe wird dann eine Kreuzwasserwaage mit Auswertung von beiden
Achsen :-)

danke fürs Anstupsen, hatte ich mir tatsächlich schlimmer vorgestellt - gut, das sind jetzt auch
keine wirklich komplexen Aktionen hier, aber wie ich schon sagte, mein "analoger" Lösungsweg klappt nicht...
Sir_Death
Beiträge: 3446
Registriert: Mo 11. Mai 2015, 22:36
Wohnort: südlich von Wien

Re: Arduino-Sketche kombinieren...

Beitrag von Sir_Death »

das mit LedCount-1 liegt wahrscheinlich daran, dass wenn ich mich richtig erinnere das Array von 0 bis 9 zählt und nicht von 1 bis 10.
Aber bei den Dingen probiere ich oft selbst nur herum.

Jedenfalls kann ich dir für zukünftige Projekte mitgeben, wenn das Ding nicht tut, was es soll, einfach die fragliche Variable auf die serielle zum PC rausschubsen - hilft oft ungemein, wenn man weis, was er gerade tut :-)
Antworten