Functie schrijven zonder delay, hulp nodig

Arduino specifieke Software
Berichten: 4
Geregistreerd: 11 Okt 2015, 21:19

Functie schrijven zonder delay, hulp nodig

Berichtdoor mitchellsande » 11 Okt 2015, 21:23

Kan iemand mij hiermee helpen, ik wil 2 motoren tegelijk aansturen om vloeistoffen te laten mixen.
Nu was mijn idee ik schrijf een functie die channel en hoeveelheid bevat, hiermee kan ik dus later in een case makkelijk bepalen hoe dat alles gemixt moet worden.
Helaas kan ik de functie niet anders schrijven dan met een delay erin, er zal natuurlijk een slimmere manier zijn om eenzelfde functie te maken zonder delay.
Dan hoeven de 2 motoren niet op elkaar te wachten, kan iemand mij hiermee op weg helpen?
(Naar mijn inzien werkt het bekende blink aan blink uit principe hier niet omdat de teller dan steeds op een andere waarde gezet wordt)



unsigned long ml_count = 0;

void setup() {
Serial.begin(9600);
Serial.println("Begin");

pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}

void loop() {
mix(8, 100);
mix(9, 25);
}


int mix(int channel, double ml_value){
double ml_min = 1.333;
int ml_speed = 255;
double wait = 0;

wait = (ml_value / ml_min) * 1000;
analogWrite(channel, ml_speed);
delay(wait);
analogWrite(channel, 0);
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor nicoverduin » 11 Okt 2015, 22:01

Blink without delay is wel degelijk de oplossing. Echter je hebt besloten om in de mix functie ook de analoge write uit te voeren. Zou je er voor hebben gekozen om eerst de waardes voor beide motoren te berekenen en dan pas de motoren te besturen had je ze gerust beide parallel kunnen besturen.
Daarnaast moet je jezelf nog afvragen of dit meng proces eindeloos moet doorgaan. M.a.w. wanneer is het mengen afgelopen?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 11 Okt 2015, 21:19

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor mitchellsande » 11 Okt 2015, 22:14

Nee dat snap ik, deze code wil ik later ook toe gaan voegen aan een web server dus het gaat hier alleen om een test code.
Het probleem is dan toch dat ik niet weet wanneer de motoren moeten stoppen afzonderlijk van elkaar?
Ik vul eerst het kanaal van de motor in en daarna de hoeveelheid dus hoe lang dat hij aan moet blijven staan.
Of bedoel je dat dit is af te vangen met een high low per channel?

Alvast bedankt!

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor nicoverduin » 11 Okt 2015, 22:27

Stel je geeft de wait waarde terug.
cpp code
uint32_t delay1 = mix(8,100);
uint32_t delay2 = mix(9,25);
uint32_t timer1 = millis();
uint32_t timer2 = timer1;
analogWrite(8, speed); // start motor 1
analogWrite(9, speed); // start motor 2
//
// motor 1
//
if (timer1 != 0) {
//
// timer1 loopt
//
if ((millis() - timer1) > delay1) {
//
// timer1 is verlopen
//
analogWrite(8,0);
//
// reset timer 1
//
timer1 = 0;
}
}
//
// motor 2
//
if (timer2 != 0) {
//
// timer2 loopt
//
if ((millis() - timer2) > delay2) {
//
// timer2 is verlopen
//
analogWrite(9,0);
//
// reset timer 2
//
timer2 = 0;
}
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 11 Okt 2015, 21:19

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor mitchellsande » 11 Okt 2015, 22:42

Oke bedankt, dit is me nu duidelijk maar stel ik wil dit met 5 motoren doen is er dan geen makkelijkere stap?
Of moet ik dit kopieren en dan voor motor 2 tot en met 5 hetzelfde doen?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor nicoverduin » 11 Okt 2015, 22:44

Die is er..... denk eens aan arrays.... Dus wees creatief zou ik zeggen... De code die je hebt kan dus gehalveerd worden. De loop wordt ongeveer ergens tussen de 5000-10000 keer uitgevoerd per seconden. Dit loopje kan gerust 1000 motoren aan ware het niet dat je daarvoor tekort RAM geheugen hebt...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 11 Okt 2015, 21:19

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor mitchellsande » 12 Okt 2015, 10:26

Ik heb nu het volgende geprobeerd, kun je kijken wat hier verkeerd gaat?
Alvast heel erg bedankt!

Code: Alles selecteren
//Array: channel - speed - ml_value - wait time
int motorArray[4][5]  = {{5   ,6   ,9   ,10  ,11 },
                         {255 ,255 ,255 ,255 ,255},
                         {0   ,0   ,0   ,0   ,0  },
                         {0   ,0   ,0   ,0   ,0  } };

void setup() {
  Serial.begin(9600);
  Serial.println("Begin");

  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);

}

void loop() {
  drink_mixer();
}



unsigned long previousMillis_1 = 0;
const long interval_1 = 1000;

void drink_mixer (void){
  for (int j = 0; j < 5; j++) {
    if(motorArray[2][j] > 0 && motorArray[3][j] <= 0){
      motorArray[3][j] = (motorArray[2][j] / 1.333);
      analogWrite(motorArray[0][j],motorArray[1][j]);
      motorArray[2][j] = 0;
    }
  }
   
  unsigned long currentMillis_1 = millis();
  if(currentMillis_1 - previousMillis_1 >= interval_1) {
    previousMillis_1 = currentMillis_1;
    for (int j = 0; j < 5; j++) {
      if(motorArray[3][j] > 0){
        motorArray[3][j] = motorArray[3][j] - 1;
      }
      else if(motorArray[3][j] == 0){
        analogWrite(motorArray[0][j],0);
      }
    }
  }
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor nicoverduin » 12 Okt 2015, 14:22

Dan heb je het niet helemaal begrepen.... jij bouwt.... jij test.... en als je er niet uitkomt geef je aan wat het niet doet....
Enne btw... Ik zou mijn programma voorzien van commentaar. Dan begrijpt een ander ook wat je doet.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Functie schrijven zonder delay, hulp nodig

Berichtdoor shooter » 12 Okt 2015, 15:21

het begint al ergens op te lijken vind ik.
inderdaad commentaar is erg handig voor ons.
je hebt dus een array waar de beginwaarden instaan.
vervolgens even een paar tussenresultaten uitrekenen, want uit snelheid en ml_value komt je draaitijd per ingredient.
die tijd begint na de wachttijd.
ook tijden kunnen in een array, dus je krijgt dan een array met een starttijd, en een stoptijd per motor.
je start dan met tijd op 0
if current>starttijd[motor] && current < stoptijd[motor] // kijken of motor moet draaien
&& (snelheid[motor]<> draai[motor]// als motor niet draait dan
){ analogWrite(pin[motor],snelheid[motor]) // maar een keer snelheid instellen en niet telkens overschrijven
else analogWrite.... stoppen

je moet dan nog wel een paar arrays maken voor de verschillende mixen en als een keuze gemaakt is deze kopieren naar je motorarray.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: iminelomao en 94 gasten