Archiv verlassen und diese Seite im Standarddesign anzeigen : servomotorbewegung zählen
hallo,
kann mir jemand helfen?!
wir bauen gerade einen non-touch desinfektionsspender.die programmierung hierfür ist beinahe vollständig.unser problem: wir wollen dass ein licht leuchtet nachdem der servo motor sich 360x bewegt hat. gibt es hierfür eine möglichkeit?!
schon im vorraus danke.=)
021aet04
07.06.2012, 17:43
Man bau an den Motor einen Kontakt, damit man die Umdrehungen zählen kann. Es gibt mehrere Möglichkeiten wie man die Umdrehungen zählen kann. Mechanischer Kontakt (eher schlecht), Hallschalter (ein Magnet wird an die Motorwelle montiert), Drehgeber (optisch oder Hall). Diese Impulse zählt man und schaltet dann z.B. das Licht ein.
MfG Hannes
danke aber dies wird uns nicht weiterhelfen,da sich unser motor nur 35° bewegt und dann wieder zurück dreht.wir wollen zählen wie oft die schleife durchlaufen wird.
=)
021aet04
07.06.2012, 18:06
Dann ist es doch noch einfacher. Du zählst einfach wie oft die Schleife durchgeführt wird. Wenn die 360 erreicht sind kannst du den Zähler wieder auf 0 stellen (falls nötig).
MfG Hannes
genau das ist unser probelm =) wie lautet der befehl dafür die anzahl der durchlaufenen schleifen zu zählen????
=)
021aet04
07.06.2012, 18:17
Die Glaskugel habe ich nicht bei mir. Du müsstest einmal schreiben was ist die Plattform (PC, welcher µC, welche SPS,....) und dann welche Programmiersprache du verwendest, welches Programmierprogramm.
MfG Hannes
also wir haben einen arduino duemilanove, proggramiersprache C++ glaub wenns des gibt =) ja am pc und wir sind nicht so die computer chegger aber wir kennen uns bisschen mit proggrammierung aus =)
=)
int helligkeit = 0; // variable helligkeit auf 0 setzen
#include <Servo.h> //?
Servo myservo1; // variablen der motoren
Servo myservo2;
int pos = 0; //variable zur bestimmung der position der Motoren
int erster_start = 1;
void setup()
{
pinMode(8, OUTPUT); //LED gelb anmelden
Serial.begin(9600);
myservo1.attach(9); //Motoren angemeldet
myservo2.attach(10);
}
void loop()
{
digitalWrite(8, HIGH); // LED ein
if(erster_start == 1)
{
myservo1.write(90); //motoren drehen sich auf ihre positionen -> voller Anschlag
myservo2.write(0);
delay(500); //warten
erster_start = 0;
}
helligkeit = analogRead(0); //helligkeitswert wird eingelesen von lichtsenor und angepasst
if(helligkeit > 150) //helligkeit muss höher als 500 sein dass Motoren sich bewegen
{
myservo1.write(55); //Herunterdrücken
myservo2.write(35); //Herunterdrücken
delay(1000); // Wartezeit, Servo muss in dieser Zeit ganz nach unten gekommen sein
myservo1.write(90);
myservo2.write(00);
delay(1000);
}
also das ist unsere programmierung und die funktioniert auch =)
021aet04
07.06.2012, 18:34
Das du mit dem PC programmierst war relativ klar, da es nicht viele Systeme gibt die man ohne PC programmieren kann (z.B. einige ältere SPS). Mit Arduino kenne ich micht nicht so gut aus, aber wenn du das Programm postest könnte ich dir Vorschlagen wo du was hinschreiben kannst. Ob beim Arduino C, C++ oder beides verwendet wird weiß ich nicht. Als Erstes brauchst eine Zählvariable. Im Programm schreibst du dann nur z.B. i++; (i ist die Zählvariable) und es wird i um 1 erhöht. Man fragt dann einfach i ab und vergleicht es mit einer Vorgabe und führt die Dinge aus die man machen will wie z.B. Ausgänge setzen, löschen,... (z.B. if (i >= 360){} ).
MfG Hannes
ok soweit hab ich mir das auch schon gedacht aber ich muss doch irgendwo angeben dass i die schleifen zählen muss oder reicht das schon wenn ich
int i=0
in void setup angebe und später in void loop am ende
if(i=360)
digitelWrite(pin,HIGH)
reagiert der dann darauf?!
aber danke schon mal =))
021aet04
07.06.2012, 18:48
Es fehlt aber die main Schleife oder ist das nicht das ganze Programm?
Du musst unter die include Anweisung die Zählvariable definieren.
unsigned int i=0;
Den jeweiligen Pin musst du als Ausgang definieren. Bei mir ist das z.B. PA1
DDRA |= (1<<PA1);
In die if(helligkeit > 150) Schleife schreibst du ganz unten (nach dem delay)
i++;
if (i>=360) PORTA |= (1<<PA1);
else PORTA &= ~(1<<PA1);
MfG Hannes
also wenn ich des jetzt versuche dann kommt error compiling =(
hast du noch ne andere idee?!
sind grad bisschen am verzweifeln =(
021aet04
07.06.2012, 18:58
Poste einmal dein Programm. Welcher Fehler kommt genau?
Ich habe eine C-Datei hochgeladen damit du weißt wie man es aufbauen sollte.
MfG Hannes
DDRA is kein gültiger befehl bei meinem programm =(
021aet04
07.06.2012, 19:04
DDRA ist das Register indem man festlegt ob ein Pin Eingang oder Ausgang ist. Wie das dann bei dir heißt weiß ich nicht. Ich programmiere normale AVRs mit AVR Studio.
MfG Hannes
ok gut ja des hilft mir weiter =) wusste nur nicht was das ist =) ich probiers mal und poste dann mein programm =)
int helligkeit = 0; // variable helligkeit auf 0 setzen
int i = 0 ; //zählvariable auf 0 setzen
#include <Servo.h> //?
//unsigned int i=0;
Servo myservo1; // variablen der motoren
Servo myservo2;
int pos = 0; //variable zur bestimmung der position der Motoren
int erster_start = 1;
void setup()
{
pinMode(8, OUTPUT); //LED gelb anmelden
pinMode(7, OUTPUT); //LED rot anmelden
pinMode(9, OUTPUT); //Motor zählen
Serial.begin(9600);
myservo1.attach(9); //Motoren angemeldet
myservo2.attach(10);
}
void loop()
{
digitalWrite(8, HIGH); // LED ein
if (i<360)
{
if(erster_start == 1)
{
myservo1.write(90); //motoren drehen sich auf ihre positionen -> voller Anschlag
myservo2.write(0);
delay(500); //warten
erster_start = 0;
}
helligkeit = analogRead(0); //helligkeitswert wird eingelesen von lichtsenor und angepasst
if(helligkeit > 150) //helligkeit muss höher als 500 sein dass Motoren sich bewegen
{
myservo1.write(55); //Herunterdrücken
myservo2.write(35); //Herunterdrücken
delay(1000); // Wartezeit, Servo muss in dieser Zeit ganz nach unten gekommen sein
myservo1.write(90);
myservo2.write(00);
delay(1000);
i++;
}
else
{
digitalWrite(7, HIGH); //LED rot einschalten
}
}
}
also des programm wenn ich es so kontorllieren lasse von meinem programm is von der theorie alles richitg meinst so funktioniert das?
noch ne frage des PORTA |= (1<<PA1); was bedeutet das? dass ich des in mein programm umschreibn kann weil sonst hat meine änderung am programm glaub gar keinen sinn! =)
also ERFOLG! nach der gewünschten anzahl hört der auf zu pumpen muss nur doch die LED mit in die schleife brignen
DANKE !!
=)
021aet04
07.06.2012, 22:47
Glückwunsch wenn es funktioniert. Bin erst jetzt wieder heim gekommen.
Erklärung zu "PORTA |= (1<<PA1);"
PORTA => ist der Port der angesprochen werden soll, beim Atmega 168/328 gibt es diesen Port nicht, PORTD (den gibt es beim Atmega168/328) wäre PD0 bis PD7
|= => verwendet man zum Setzen von Pins,... ist eine Oder Verknüpfung
(1<<PA1) => 1 nach links schieben um PA1 (ist 1), PA1 schreibt man damit man eine bessere Lesbarkeit erreicht
MfG Hannes
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.