Hilfe bei Projektrealisierung: Verfahren einer Ebene

Hallo miteinander,

ich bin dabei ein Projekt zu realisieren und dies möchte ich hier vorstellen und einzelne Problemstellungen die dabei auftreten mit eurer Hilfe lösen.

Konkret geht es dabei eine Ebene vertikal zu verfahren. So weit, so einfach. Es werden aber noch einige weitere Funktionen benötigt, auf die ich später noch kommen werden.

Die zu verfahrende Ebene wird in ihren Ecken durch Gewindestangen gehalten. Diese sind wiederrum an der Abttriebswelle von Elektromotoren befestigt.

Den Arduino benötige ich um über Relais die Motoren einzuschalten und den Drehsinn umzukehren (hoch oder runter der Ebene). Ebenfalls wird es Schalter geben, mit deren Hilfe ich die Position der Ebene (oben oder unten) bestimmen werde und die somit als Kriterium gelten, in welche Richtung die Ebene als nächstes verfährt und ob die gewünschte Position erreicht wird.

Des weiteren möchte ich mit dem Adruino einen Verbraucher schalten, der am Stromnetz betrieben wird.

Ich hoffe ich bin in diesem Unterforum richtig und freue mich auf rege Teilnahme.

Okay. Wo ist die Frage? :wink:
Sieht nach einem Beamerlift aus...

hi,

ich denke, das war keine frage, sondern eine vorstellung.
na dann herzlich willkommen...

gruß stefn

Brauchst Du wirklich 4 Gewindestangen und nicht eine Mechanik mit einer zentralen Motor und nur einer Gewindestange?
Grüße Uwe

Gewindestangen hätten den Vorteil, dass die Steigung (bei gleichem Durchmesser natürlich) identisch ist. Sofern man mit einem Motor alle 4 Gewindestangen ohne Schlupf antreiben kann, stellt dies eine ganz brauchbare Lösung dar. Sowas sieht man zum Beispiel mit zwei Gewindespindeln auch bei CNC-Maschinen.
Andersrum gefragt: Gibt es bessere mechansiche Lösungen als die hier vorgeschlagene? :wink:

Hallo,

ja, es war erstmal eine Vorstellung.

Ich bin gerade dabei mich ins Thema einzuarbeiten.

Schlupf soll es bei dieser Lösung keinen geben. Bei entstehenden Schlupf würde die Ebene nicht waagerecht verfahren->no go.

Diese Lösung wurde gewählt, weil sie mechanisch leicht umzusetzen ist und ich alles mit im Baumarkt oder Conrad erhältlichen Teilen realisieren kann.

Ich bin gerade dabei erste Teile raus zu suchen und sobald Fragen auftauchen, würde ich gerne eure Hilfe in Anspruch nehmen.

Eine solche Scherenmechanik benötigt nur einen Motor und die Bebene ist parallel zu Unterlage.

oder für größere Hübe:

Muß sich die Plattform genau senkrecht bewegen oder kann sie sich in einer Achse ein wenig verschieben?
Grüße Uwe

Nein, Ebene muss sich genau senkrecht bewegen.

An die gezeigten Scherenhübe habe ich bereits auch gedacht. Leider habe ich erstens keine fertigen Lösungen gefunden und zweitens sind diese prinzipbedingt ausgefallen. In der Ebene ist nämlich mittig eine Aussparung, durch die Gegenstände durchgeführt werden sollen.

Ansonsten bräuchte ich zwei Scheren die ich außen an der Ebene befestige. Da fand ich die Lösung mit den Gewindestangen unkomplizierter.

Wie kann ich Zeitabfragen programmieren? Welche Befehle gibt es da.

Ich benötige etwas wie: Führe alle 30min xy aus. Alle 15min yz

Ich benötige etwas wie: Führe alle 30min xy aus. Alle 15min yz

Mit millis()
Grüße Uwe

Hallo Uwe,

danke dafür. Ich werde mir das mal anschauen.

Aktuell habe ich noch folgendes Problem:

Ich möchte mit dem Arduino ein Gerät ansteuern über eine serielle Schnittstelle. Ich habe ein Arduino Mega 2560.

void setup () {
 Serial1.begin(9600);
}

Und weiter

// Unterprogramm Waage nullen
void Waage_nullen ()
{
  Serial1.print("t");
  
}

Wenn ich im Ascii Code ein t an meine Waage schicke wird diese genullt laut der Bedienungsanleitung der Waage. Ist mein Befehl korrekt? Leider steht die Verkablung noch nicht, so dass ich es nicht überprüfen kann.

Und weiter

// Unterprogramm wiegen
void wiegen (){
  Serial1.print("s");
for ( i = 0; i = 100; i++);
{
  Gewicht[i]=Serial1.read();
}
}

Ascii s an die Waage löst das wiegen aus. Danach sendet die Wage das ermittelte Gewicht zurück. Wie speichere ich dies in einem Array? Ist die geschriebene Lösung so okay und würde dies funktionieren?

Vielen Dank für die weitere Hilfe :blush:

Was für eine Waage ist das denn? So könnte man auch mal in die (hoffentlich online verfügbare) Bedienungsanleitung schauen. :wink:
Ansonsten gibts mit dem letzten Code Probleme, schau dir nochmal in der Referenz an, wie man for() benutzt: http://arduino.cc/en/Reference/For
Sicher meinst du:

for (int i = 0; i <= 100; i++) 
{
  Gewicht[i]=Serial1.read();
}

Finde drei Unterschiede. :wink: Nein Spaß, das Semikolon hat dort nichts zu suchen, i wurde noch nicht als Integer deklariert (man könnte bei kleinen Zahlen auch byte nehmen) und das < hast du vergessen.
Jetzt hast du natürlich das Problem, dass exakt 101 Zeichen ankommen müssen. Das glaube ich weniger, ein Blick in die Bedienungsanleitung sollte Aufschluss bringen.

Besser ist es hier eine while-Anweisung zu verwenden:

while (Serial1.available() > 0) {
  incomingByte = Serial.read();
}

Danke für eure Hilfe.

In der Tat war ich mir nicht sicher, ob meine for Schleife so richtig war. Programmiere das erste mal einen Arduino. Habe vorher viel Matlab benutzt, vielleicht kommt es daher.... :slight_smile:

Die Waage ist eine Kern 440-49N. Bedienungsanleitung einsehbar unter http://dok.kern-sohn.com/manuals/files/German/440-BA-d-0941.pdf

Ob die Waage 101 Bytes sendet, wage ich zu bezweifeln. Ziel war es eigentlich, dass der Arduino-loop durchläuft und die Messwerte bei jedem Durchlauf in einem Array namens Gewicht abgespeichert werden.

Habe schon vermutet das es, so wie ich es hatte nicht funktionieren wird.

Das mit der while-Schleife ist natürlich die elegantere Lösung. Wahrscheinlich werde ich nicht drum herum kommen alles miteinander zu verkabeln und einfach auch ein bisschen rumzuprobieren.
Da noch nicht alle Teile da sind, wollte ich zuerst die Programmierung fertig stellen, so dass ich dann nur noch zusammenbauen brauche.... Aber wird es wohl nicht ganz klappen :roll_eyes:

Edit: In der Bedienungsanleitung der Waage ist die Seite 30 Punkt 9.3.4. Fernsteuerung der Waage über die serielle Schnittstelle die interessante. So würde ich das gerne machen. Ich sende einen Befehl an die Waage und sie sendet mir ihren Messwert zurück, den ich dann in einem Array speichere.

Hast du auch beachtet, dass du einen RS232-TTL-Wandler wie den Max232 brauchst? Sonst kann sich dein Arduino mal ganz schnell verabschieden.
Den gibt es bspw. als Bausatz bei Pollin: Bausatz RS232/TTL Wandler online kaufen | Pollin.de

Nein, habe ich nicht.... :blush:

Ich dachte ich kann die Pins einfach verbinden und muss nur darauf achten das ich die Masse von der Waage nicht auf den Arduino lege.

Aber wenn die RS232 mit +-15V betrieben wird, dann brauch ich natürlich so einen Wandler.

Habe eben schnell beim Conrad geschaut, da gibt´s aber nur das hier: http://www.conrad.de/ce/de/product/190200/Aurel-650200627-RS232TTL-Logik-Signalwandler-Baustein-RS232. Und so wie es aussieht brauche ich dafür auch eine externe Spannungsversorgung.

Das ist das von dir gezeigte Modul besser. Leider müsste ich dies bestellen und kann es nicht um die Ecke kaufen. Gibt es noch Alternativen? Würde es am liebsten vor Ort kaufen und gleich mitnehmen.

Edit 2:
Edit:
Aktuell habe ich das Problem eine Aktion alle x Minuten durchzuführen.

Zeit=millis()/60000;

    if (Zeit%60==0);
    {
        x;
    }

Bei Zeit habe ich ja jetzt Minuten. Durch die Moduloperation sage ich ja in der if Anweisung, führe x aus wenn genau 60min abgelaufen sind. Was mache ich aber wenn du Programmcode nicht exakt nach 60min an dieser Stelle ist?

Ich bräuchte also sowas wie einen Puffer. Führe Aktion x aus, wenn 60 bis max63min um sind und führe diese aktion nur einmal aus. Also nicht das er x nach 60 minuten ausführt und weil er in den nächsten 3min 3 mal an der Anweisung vorbeikommt, noch mal 3 mal.

Jemand eine Idee oder einen Tipp, komme momentan nicht weiter.

hi,

nimm einfach if (Zeit % 60 < 3000) und setz da drin eine bool getan = true
und bei if (Zeit % 60 > 5000) setzt Du die getan auf false.

gruß stefan

edit: Du rechnest ja vorher in minuten um, also 3 statt 3000 und 5 statt 5000.

Also so

if (Zeit%360<2 ==true && Zeit%360>4 ==false);
    {
           x();
    }

wenn die Schleife aber innerhalb von 2 Minuten mehrmals abgefragt wird, wird auch der Inhalt der Schleife mehrmals ausgeführt oder wird Sie definitiv nur einmal durchlaufen, auch wenn der Programmcode mehrmals innerhalb von 2 Minuten an der Stelle ist.

...das Problem eine Aktion alle x Minuten durchzuführen...

...löst man ab besten so, dass man sich merkt, wann es das letzte Mal ausgeführt worden war.

const byte X = 2; // Minuten 
const unsigned long INTERVALL = 60000UL * X;
static unsigned long lasttime;

if ( millis() - lasttime >= INTERVALL ) {
 lasttime = millis();
 x();  // wird nur einmal je INTERVALL ausgeführt, egal wie oft oder selten loop dran kommt  
}

Die Differenz ( millis() - lasttime ) hat auch den Vorteil, einen Überlauf nach 50 Tagen sicher zu überleben.

Das angehängte UL an der Konstanten 60000 stellt sicher, dass der Compiler die Konstante Multiplikation auc mit long integer macht.

** **lasttime** **
muss entweder [b]static [/b] oder als globale Variable definiert werden...

hi,

wenn die Schleife aber innerhalb von 2 Minuten mehrmals abgefragt wird, wird auch der Inhalt der Schleife mehrmals ausgeführt oder wird Sie definitiv nur einmal durchlaufen, auch wenn der Programmcode mehrmals innerhalb von 2 Minuten an der Stelle ist.

eben, deswegen ja die statusvariable "getan" in meinem codeschnipsel.
natürlich ist es einfacher, mit intervall zu rechnen, aber ich verwende es beim takten mit dem ds1307 im sekundentakt, mit intervall geht das dann nicht. ich war zu faul, nachzulesen, wofür es hier gebraucht wird. :*

gruß stefan

Ich möchte in meiner Schaltung ein paar Taster integrieren.

Die Schaltung möchte ich wie folgt realisieren:
http://pgdev.pighixxx.com/ABC/SET/s1.pdf

Gleich die erste Seite links unten. Pushbutton to 5V.

Ich hab auf meinem Arduino ja nur einmal 5V. Also alle Schalter parallel schalten. IN sind ja die einzelnen Pins. Kann ich dann für 7 Taster nur einen Widerstand verwenden, weil die kommen ja auch alle an die gleiche Masseleitung. Oder brauchen die alle einen eigenen Widerstand und werden erst dann zusammengefasst.

Edit: Des Weiteren brauche ich noch eine Schaltung, mit der ich Netzspannung schalten kann. Wie bewerkstellige ich sowas?