PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : servomotorbewegung zählen



AJJN
07.06.2012, 16:14
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, 16: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

AJJN
07.06.2012, 16:53
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, 17: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

AJJN
07.06.2012, 17:14
genau das ist unser probelm =) wie lautet der befehl dafür die anzahl der durchlaufenen schleifen zu zählen????
=)

021aet04
07.06.2012, 17: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

AJJN
07.06.2012, 17:21
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 =)
=)

AJJN
07.06.2012, 17:28
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, 17: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

AJJN
07.06.2012, 17:39
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, 17: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

AJJN
07.06.2012, 17:57
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, 17: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

AJJN
07.06.2012, 18:01
DDRA is kein gültiger befehl bei meinem programm =(

021aet04
07.06.2012, 18: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

AJJN
07.06.2012, 18:07
ok gut ja des hilft mir weiter =) wusste nur nicht was das ist =) ich probiers mal und poste dann mein programm =)

AJJN
07.06.2012, 18:10
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?

AJJN
07.06.2012, 18:13
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! =)

AJJN
07.06.2012, 18:30
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, 21: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