Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #15 on: March 27, 2012, 09:32:14 am » |
So da mein Projekt auch vorerst dem Ende zugeht, müsste ich noch eimal um Hilfe bitten. Undzwar kann ich bisher den Motor ansteuern. Ich kann auch einen Lichtschrankensensor (Sensorik einer Alten Maus  ) auslesen jedoch bekomme ich nur Qutasch heraus. Mein Ziel soll es sein das ich den Motor ansteuern kann und die Drehzahl auslesen kann. ( Komplett-Ziel wäre dann die Motordrehzahl auch unter einer Belastung konstant zuhalten (regeln).) Bin wie immer für jede Hilfe dankbar. #define MotorPin 10 #define SenosorPin 0
double MotorSpeed =0; int thisTime =0; int delayTime = 500; void setup () { Serial.begin(9600); pinMode (MotorPin,OUTPUT); analogWrite (MotorPin,100); /Mittellast }
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #16 on: March 27, 2012, 09:33:55 am » |
Wie liest Du den Sensor aus? Wie ist er verdrahtet? Was kommt bei Dir an? Wie sieht das komplette Programm dazu aus?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #17 on: March 27, 2012, 09:44:00 am » |
  Bzw. des Codes bin noch ein Anfänger und naja habe mit Test-Codes rumgefummelt wo Quatsch rauskam. Den es kammen immer andere Werte raus, totz Speerzustand...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #18 on: March 27, 2012, 09:45:25 am » |
Kann auch gerne ein Testprogramm drüber laufen lassen ( bzw der Werte) sofern du mit sagst welches =)
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #19 on: March 27, 2012, 09:47:26 am » |
Wo hast Du den Sensor angeschlossen? Welcher Pin? Analog oder digital? Interrupt?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #20 on: March 27, 2012, 09:51:17 am » |
Analog 0 Bei diesem Programm (wurde mich gerade geschickt) bekomme ich folgende Werte was auch eine änderung zeigt (  ) int val; long last=0; int stat=LOW; int stat2; int contar=0;
int sens=75; // this value indicates the limit reading between dark and light, // it has to be tested as it may change acording on the // distance the leds are placed. int nPalas=2; // the number of blades of the propeller
int milisegundos=1; // the time it takes each reading void setup() { Serial.begin(9600); pinMode(13,OUTPUT); }
void loop() { val=analogRead(0); if(val<sens) stat=LOW; else stat=HIGH; digitalWrite(13,stat); //as iR light is invisible for us, the led on pin 13 //indicate the state of the circuit.
if(stat2!=stat){ //counts when the state change, thats from (dark to light) or //from (light to dark), remmember that IR light is invisible for us. contar++; stat2=stat; } if(millis()-last>=milisegundos){ double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos; double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos); Serial.print((contar/2.0));Serial.print(" RPS ");Serial.print(rps); Serial.print(" RPM");Serial.print(rpm);Serial.print(" VAL ");Serial.println(val); contar=0; last=millis(); } }
0.00 RPS 0.00 RPM0.00 VAL 445 // bei nicht Durchlass 0.00 RPS 0.00 RPM0.00 VAL 468 // bei Durchlass Nur wie bekomme ich damit eine "Vernüntige" Drehzahl hin bzw. kann mit dieser regeln ? (Entschuldigung wenn ich mich dumm anstelle)
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #21 on: March 27, 2012, 09:53:50 am » |
Stell mal "sens" von 75 auf 457...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #22 on: March 27, 2012, 09:58:55 am » |
0.50 RPS 250.00 RPM15000.00 VAL 455 Bei Änderung
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #23 on: March 27, 2012, 10:02:59 am » |
Jetzt noch "nPalas" auf die Zahl der Unterbrechungen des Sensors pro Umdrehung einstellen, dann sollte das mal erledigt sein.
Anschließend musst Du eigentlich nur die Motorleistung erhöhen wenn die RPM unter das von Dir gewünschte Maß fällt und verringern im umgekehrten Fall. Das kann man dann noch beliebig verfeinern, aber funktionieren sollte es so dann schon mal.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #24 on: March 27, 2012, 10:07:29 am » |
.... Bin gerade wieder mal Doof ....
Kannste mit das eben schicken machen?
Wäre echt super!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #25 on: March 27, 2012, 10:10:23 am » |
#define MotorPin 10 int val; long last=0; int stat=LOW; int stat2; int contar=0; double MotorSpeed =0; int thisTime =0; int delayTime = 500; int sens=457; // this value indicates the limit reading between dark and light, // it has to be tested as it may change acording on the // distance the leds are placed. int nPalas=2; // the number of blades of the propeller
int milisegundos=1; // the time it takes each reading void setup() { Serial.begin(9600); pinMode(13,OUTPUT); pinMode (MotorPin,OUTPUT); analogWrite (MotorPin,100); }
void loop() { val=analogRead(0); if(val<sens) stat=LOW; else stat=HIGH; digitalWrite(13,stat); //as iR light is invisible for us, the led on pin 13 //indicate the state of the circuit.
if(stat2!=stat){ //counts when the state change, thats from (dark to light) or //from (light to dark), remmember that IR light is invisible for us. contar++; stat2=stat; } if(millis()-last>=milisegundos){ double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos; double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos); Serial.print((contar/2.0));Serial.print(" RPS ");Serial.print(rps); Serial.print(" RPM");Serial.print(rpm);Serial.print(" VAL ");Serial.println(val); contar=0; last=millis(); } }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #26 on: March 27, 2012, 10:13:00 am » |
Wie ermittel ich die Umdrehungen denn?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 43
|
 |
« Reply #27 on: March 27, 2012, 10:20:15 am » |
Ich habe einen Schlitz .... bekomme dies ausgeben...
0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.50 RPS 500.00 RPM30000.00 VAL 470 0.50 RPS 500.00 RPM30000.00 VAL 450 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449 0.00 RPS 0.00 RPM0.00 VAL 449
somit lassen auch 2 oder?
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #28 on: March 27, 2012, 11:25:19 am » |
Ich bekomme zb 2 mal 0.50 RPS 500.00 RPM30000.00 VAL 471 dann 10 mal 0.00 RPS 0.00 RPM0.00 VAL 448 danach 2 mal 0.50 RPS 500.00 RPM30000.00 VAL 471 dann 3 mal 0.00 RPS 0.00 RPM0.00 VAL 448 danach 2 mal 0.50 RPS 500.00 RPM30000.00 VAL 471 dann 3 mal 0.00 RPS 0.00 RPM0.00 VAL 448 dann wieder 0.50 RPS 500.00 RPM30000.00 VAL 471 Würde sagen Deine Abtastrate ist zu hoch. Stell mal milisegundos=1 um auf milisegundos=100
|
|
|
|
|
Logged
|
|
|
|
|
Weinsberg, Germany
Offline
God Member
Karma: 2
Posts: 770
A Coder's Tale
|
 |
« Reply #29 on: March 27, 2012, 01:37:49 pm » |
Mein Ansatz wäre sowas: #define LED 13 #define MOTOR 10 #define SENSOR 0
byte motorValue = 100; // Sollwert fuer den Motor double sensorAverage; // Schwellwert fuer den Sensor int counter; // Zaehlervariable long stateCount; // Durchgaenge, in denen der aktuelle Status gleich war boolean actState, lastState; // Aktueller und letzter Stand int targetRpm; // Solldrehzahl long lastPrintOutTime = millis();
void setup() { pinMode(LED, OUTPUT); pinMode(MOTOR, OUTPUT); Serial.begin(9600); }
void loop() { int value = analogRead(SENSOR); sensorAverage = sensorAverage * .999 + value * .001; // Schrittweise Annaeherung an den Mittelwert. Spart ein Array.
actState = value > sensorAverage; // Liegt der Sensorwert ueber oder unter der Schwelle, zeigt der Sensor HIGH oder LOW?
if (lastState == actState) { stateCount++; // Hochzaehlen wie lange der aktuelle Stand gegolten hat } else { stateCount = 0; // Falls sich was geaendert hat auf 0 setzen. lastState = actState; // Stand speichern }
if (stateCount==10) { // Pro Standwechsel nur ein Mal machen! counter++; }
analogWrite(MOTOR, motorValue);
if (millis()-lastPrintOutTime>300) { if (targetRpm>0) { if (counter<targetRpm-1 && motorValue<251) motorValue += 5; if (counter>targetRpm+1 && motorValue>4) motorValue -= 5; } else { if (millis()>10000) { targetRpm = counter; Serial.print("Target-RPM-Counter: "); Serial.println(targetRpm); } }
Serial.print(motorValue); Serial.print(" "); Serial.println(counter);
lastPrintOutTime = millis(); counter=0; } } Einschalten, zehn Sekunden warten bis er sich kalibriert hat, fertig. 
|
|
|
|
|
Logged
|
|
|
|
|
|