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.
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?
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
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?
Was für eine Waage ist das denn? So könnte man auch mal in die (hoffentlich online verfügbare) Bedienungsanleitung schauen.
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. 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();
}
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....
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
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
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.
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...
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. :*
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?