Vraag


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik heb een arduino 2wd car gekocht en ik heb hem al van alles laten doen maar ik wil nu zoals op filmpjes die ik gezien heb de ultrasonic laten heen en weer gaan door een servo motor maar het lukt mij niet om de servo motor te laten draaien en tegelijkertijd de ultrasonic de omgeving te analyseren. (apart lukt het wel)

ik heb ook al op het internet wat gesurft en ik kan er precies uit afleiden dat een arduino maar 1 ding tegelijkertijd kan doen weet iemand hoe ik dit dan wel moet doen?

YouTube: Arduino Robot Chassis 2WD Smart Car Chassis
hier heb ik dit gevonden maar ik heb die drie sensoren die er ook opzitten wel niet.

Beste antwoord (via jonas-ventje op 27-06-2017 09:30)


  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Je for loop moet beide if voorwaarden omvatten. Je sluit nu de for loop af en nu staat de if (i%==3) buiten de for loop.

Je moet een kijken naar jouw accolades. De laatste accolade boven de if ( i % 3 == 0 ) moet naar onderen, na de laatste accolade van dat else statement:
code:
1
2
3
4
5
    else
    {
      digitalWrite(led, LOW);
    }
  } << hierna moet die accolade geplaatst worden.


Wel netjes gedaan trouwens, die foutmelding met i oplossen door i in de setup te declareren.

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)

Alle reacties


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Ik denk dat je dit in Electronica of Programming het best kunt navragen. Volgens mij moet je je verdiepen in interrupts. Interrupts kunnen checken voor status wisselingen en daarop reageren en dan de processor loslaten zodat deze weer andere dingen kan doen. Één van de twee condities die je wil monitoren zul je als een interrupt moeten programmeren en ik denk dat dat jouw ultrasonic moet zijn.

Succes er mee!

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
heb nog nooit met interrupt geprogrammeerd, ik heb op de site van arduino gaan kijken maar snap er niet veel van, kun je eens een voorbeeld geven

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
heb dit nu geprobeerd maar het werkt nog steeds niet

#include <Servo.h>
Servo myservo;
int pos = 0;
const int trigPin = 6;
const int echoPin = 5;
void setup()
{
myservo.attach(7);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop()
{
noInterrupts();
{
for (pos = 0; pos < 160; pos += 2)
{
myservo.write(pos);
delay(15);
}
for (pos = 160; pos >= 0; pos -= 2)
{
myservo.write(pos);
delay(15);
}
}
interrupts();
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
delay(100);
}

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Vraag even via een topic report aan dat hij verplaatst wordt naar Programmeren.
En zet je code tussen [ code ] [ /code ] tags (zonder de spaties)

Het is me uit deze code niet helemaal duidelijk wat nu precies jouw ultrasonic detectie is en wat je precies wilt doen als jouw ultrasonic detecteerd dat er iets in de buurt is.

Ik heb deze methode in ieder geval gebruikt om button presses te detecteren:
https://www.arduino.cc/en/Reference/AttachInterrupt

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//assign pin to variable
const byte P1=2;

void setup() {
  pinMode(P1, INPUT_PULLUP);
  //Verbind de interrupt aan een event op P1, hier wordt gekeken of P1 van HIGH naar LOW gaat (Falling)
  //callbackfunction is datgene wat wordt uitgevoerd op het moment dat P1 van HIGH naar LOW gaat
  //Deze callback zet je in de loop, zie hier beneden.
  attachInterrupt(digitalPinToInterrupt(P1), callbackfunction, FALLING);
}  

void loop() {


}
void callbackfunction() {
  //Zet hier de code neer die je wil uitvoeren
  DoStuff(); //Pseudocode  
}

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik snap het nog steeds niet echt goed (ik ben 14)
dit is wat ik heb

deel 1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
{
  for (pos = 80; pos < 160; pos += 2)
  {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 160; pos >= 80; pos -= 2)
  {
    myservo.write(pos);
    delay(15);
  }
}


deel2:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  servo_aan();
  if (distance < 4)
  {
    digitalWrite(led, HIGH);
  }
  else
  {
    digitalWrite(led, LOW);
  }
  delay(100);
}


ik wil deze 2 acties tegelijkertijd uitvoeren (de ultrasonic moet de omgeving analyseren terwijl de servo motor heen en weer gaat)
welke actie moet nu in welke loop?

Acties:
  • 0 Henk 'm!

  • Swedgin
  • Registratie: Februari 2016
  • Laatst online: 12-01-2022
Wat probeer je nu juist te doen?
Als je de servo om de delay(15) tijdspassage wilt goed zetten, doe je dat best met een interrupt gebonden aan bv. timer0 geconfigureerd als compare_match.

2de deel zegt mij niets.

Acties:
  • 0 Henk 'm!

  • dion_b
  • Registratie: September 2000
  • Nu online

dion_b

Moderator Harde Waren

say Baah

Dit heeft weinig met hardware te maken en meer met programmeren.

Move OH -> PRG

Oslik blyat! Oslik!


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
maar ik vind niet hoe ik dat doe, ik heb wel het trefwoord programmeren toegevoegt

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik wil gewoon de servomotor(deel 1) tegelijkertijd met de ultrasonic(deel 2) laten werken maar ik weet niet of dat wel gaat

de twee delen werken wel apart

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
jonas-ventje schreef op dinsdag 27 juni 2017 @ 08:26:
maar ik vind niet hoe ik dat doe, ik heb wel het trefwoord programmeren toegevoegt
Het topic is door dion_b al verplaatst naar het subforum PRG

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
aah ok bedankt

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Deel 1 en deel 2 werken nu niet samen omdat ze achter elkaar uitgevoerd worden. Door de "delay" functie staat je script telkens stil. Pas als deel 1 helemaal klaar is zal deel 2 uitgevoerd worden. Je zult iets moeten doen waardoor het tegelijkertijd werkt.

Zover ik weet heeft de arduino echter geen mogelijkheid tot multi-threading, dus zul je moeten kijken of je het met een simpele scheduling oplossing kunt doen.

bijvoorbeeld in pseudocode
code:
1
2
3
4
5
6
7
8
9
for(int i = 0;;i++){
    if( i % 2 == 0 ) {
         //Do something on even ticks
    }    
    if( i % 3 == 0 ) {
         //Do something every 3 ticks
    }
    delay(1);
}


Dat in combinatie met de suggestie van @ElCondor om het signaal terug op te vangen.

[ Voor 6% gewijzigd door Woy op 27-06-2017 08:36 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
maar kan hij dan de twee delen tegelijk doen? nee?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
jonas-ventje schreef op dinsdag 27 juni 2017 @ 08:36:
maar kan hij dan de twee delen tegelijk doen? nee?
Niet echt tegelijk, maar je kunt het wel zo schrijven dat het lijkt dat het tegelijk gebeurt. Je zult alleen je code anders moeten structureren dat er pas delays uitgevoerd worden als je alles gedaan hebt binnen die "tick". En je zult moeten zorgen dat je delays niet langer duren dan nodig voordat je de volgende actie uit wil voeren.

Je moet je voorstellen dat je een functie hebt die elke milliseconde aangesproken wordt, en dan alle acties voor die "tick" uit moet voeren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ok ik zal zien of het mij lukt met die code

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Zeker kan hij de twee delen tegelijk doen. Je moet een programmeer script zien als een lijst met instructies die altijd achter elkaar uitgevoerd zullen worden. Twee dingen tegelijk laten uitvoeren zul je moeten programmeren. Daar zijn interrupts voor.
Interupts moet je zien als een 'reminder' die altijd in het achterhoofd van je computertje meeloopt terwijl hij druk is met zijn hoofdtaak.
Als er aan bepaalde voorwaarden wordt voldaan (zoals er is iets in de buurt) dan wordt de loop van het hoofdprogramma geïnterrumpeerd (vandaar de naam interrupt) en springt het programma naar de (callback)routine en voert die code uit (bijvoorbeeld de wielen naar links of rechts draaien) en springt dan weer terug naar de plek in het hoofdprogramma waar het was toen de interrupt plaatsvond.
Zo moet je het dan ook programmeren.

Hoe is jouw engels? Want je zult ook moeten kijken en leren van engelstalige video's en instructies. Dat kan lastig zijn, maar bijna niet te voorkomen. Maar hey, zie het zo, dan leer je ook engels ;)

Blijf volhouden en zoeken in ieder geval, proberen en falen, daar leer je van. Ondertussen willen we graag helpen d:)b

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik krijg 1 jaar engels (ben wel bijna de slechtste van de klas) maar ik snap dat wel behoorlijk en ik gebruik ook wel google translate ;)

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
code:
1
2
3
4
5
6
7
8
9
for(int i = 0;;i++){
    if( i % 2 == 0 ) {
         //Do something on even ticks
    }    
    if( i % 3 == 0 ) {
         //Do something every 3 ticks
    }
    delay(1);
}


Dat in combinatie met de suggestie van @ElCondor om het signaal terug op te vangen.
ik heb het zo geprobeerd maar ik krijg een foutmelding dat ik i gelijk moet stellen aan iets. aan wat moet ik dit dan gelijk stellen? gewoon 0 of????

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Ok, dan nog één tip voor nu, jouw deel 2 moet in ieder geval in datgene wat in mijn code de callback functie genoemd wordt.
Deel 1 moet direct in de loop, dus niet binnen die callback functie. Dus hij loopt dan door deel 1 heen en zal heen en weer blijven rijden, maar altijd met in het acherhoofd dat hij moet interumperen als hij ergens te dichtbij komt.
Wordt aan die voorwaarde voldaan, dan moet hij dus die callback functie aanroepen en deel 2 gaan uitvoeren.

Het helpt vaak ook voor je om even een klein stroom diagram te maken om uit te tekenen wat je op welk moment in het programma wilt laten plaatsvinden. Die onderdelen kun je dan los programmeren en dan in een structuur in elkaar verwerken.

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

jonas-ventje schreef op dinsdag 27 juni 2017 @ 08:54:
[...]


ik heb het zo geprobeerd maar ik krijg een foutmelding dat ik i gelijk moet stellen aan iets. aan wat moet ik dit dan gelijk stellen? gewoon 0 of????
Hmmm, vreemd, want de code
code:
1
for(int i = 0;;i++)

stelt 1 gelijk aan 0 (i=0) dus dat zou niets een probleem moeten zijn. als het goed is geeft de foutmelding ook aan op welke regel het fout gaat.
Kun je de hele foutmelding eens posten? In code tags ;)

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
maar het rode balkje komt bij de twee andere

code:
1
if( i % 2 == 0 )

en
code:
1
if( i % 3 == 0 )


ik heb geprobeerd i vanboven gelijk te stellen, deze kan hij wel uploaden maar ik heb het gevoel dat hij nu alleen maar de servo motor laat werken

ik heb met een ledje gekeken of het werkt maar deze code werkt in ieder geval niet, het ledje gaat nooit aan
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <Servo.h>
Servo myservo;
int pos = 0;
int i = 0;
const int trigPin = 6;
const int echoPin = 5;
void setup()
{
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
}
void loop()
{
  for (i;; i++) {
    if ( i % 2 == 0 )
    {
      for (pos = 0; pos < 160; pos += 2)
      {
        myservo.write(pos);
        delay(15);
      }
      for (pos = 160; pos >= 0; pos -= 2)
      {
        myservo.write(pos);
        delay(15);
      }
    }
  }
  if ( i % 3 == 0 )
  {
    long duration, distance;
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration / 2) / 29.1;
    if (distance < 10)
    {
      digitalWrite(led, HIGH);
    }
    else
    {
      digitalWrite(led, LOW);
    }
  }
  delay(1);
}

en in seriële monitor doet hij ook niets

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Je for loop moet beide if voorwaarden omvatten. Je sluit nu de for loop af en nu staat de if (i%==3) buiten de for loop.

Je moet een kijken naar jouw accolades. De laatste accolade boven de if ( i % 3 == 0 ) moet naar onderen, na de laatste accolade van dat else statement:
code:
1
2
3
4
5
    else
    {
      digitalWrite(led, LOW);
    }
  } << hierna moet die accolade geplaatst worden.


Wel netjes gedaan trouwens, die foutmelding met i oplossen door i in de setup te declareren.

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • +1 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik weet het ik was juist een bericht aan het typen waar ik ging zeggen dat ik een accolade te veel had gezet en het nu wel werkt

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <Servo.h>
Servo myservo;
int pos = 0;

int led = 3;
const int trigPin = 6;
const int echoPin = 5;
void setup()
{
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
}
void loop()
{
  for (int i = 0;; i++) {
    if ( i % 2 == 0 )
    {
      for (pos = 0; pos < 160; pos += 2)
      {
        myservo.write(pos);
        delay(15);
      }
      for (pos = 160; pos >= 0; pos -= 2)
      {
        myservo.write(pos);
        delay(15);
      }
    }
    if ( i % 3 == 0 )
    {
      long duration, distance;
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration / 2) / 29.1;
      if (distance < 10)
      {
        digitalWrite(led, HIGH);
      }
      else
      {
        digitalWrite(led, LOW);
      }
    }
    delay(1);
  }
}

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
waarom kun je geen twee beste antwoorden geven :(

Acties:
  • +1 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

jonas-ventje schreef op dinsdag 27 juni 2017 @ 09:28:
ik weet het ik was juist een bericht aan het typen waar ik ging zeggen dat ik een accolade te veel had gezet en het nu wel werkt

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <Servo.h>
Servo myservo;
int pos = 0;

int led = 3;
const int trigPin = 6;
const int echoPin = 5;
void setup()
{
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
}
void loop()
{
  for (int i = 0;; i++) {
    if ( i % 2 == 0 )
    {
      for (pos = 0; pos < 160; pos += 2)
      {
        myservo.write(pos);
        delay(15);
      }
      for (pos = 160; pos >= 0; pos -= 2)
      {
        myservo.write(pos);
        delay(15);
      }
    }
    if ( i % 3 == 0 )
    {
      long duration, distance;
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration / 2) / 29.1;
      if (distance < 10)
      {
        digitalWrite(led, HIGH);
      }
      else
      {
        digitalWrite(led, LOW);
      }
    }
    delay(1);
  }
}
Baas! d:)b

Kun je nu eens uitleggen wat die if statements precies betekenen? Ik weet het wel, maar copy-paste programmeren gaat je niets helpen. Je moet iemand anders kunnen uitleggen wat jouw code betekend. Anders leer je er nog niets van ;)

En een volgende uitdaging: Probeer de code nu eens te herschrijven en gebruik te maken van interrupts, zoals ik eerder aangaf. Je zult er mogelijk eerst het een en ander van jouw code voor stuk moeten maken, maar ook daar leer je van :)

[ Voor 7% gewijzigd door ElCondor op 27-06-2017 09:32 ]

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
is het niet dat in het eerste deel alles om de 1 tick achter elkaar volgt
code:
1
if ( i % 2 == 0 )

en in het tweede deel alles om de 3 ticken
code:
1
if ( i % 3 == 0 )

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Dat klopt enigszins, maar waarom? Snap je wat dat % teken doet? Je zult namelijk zien dat deze functie nog wel eens gebruikt wordt om een ticker/stapper effect te maken. De vraag is, waarom wordt er gebruik van gemaakt?

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik vind het procentteken niet op mijn toetsenbord dus ik typ het gewoon voluit maar ik weet inderdaad niet echt waar dat teken voor staat, heb het wel al eens in andere codes tegen gekomen

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
jonas-ventje schreef op dinsdag 27 juni 2017 @ 09:43:
ik vind het procentteken niet op mijn toetsenbord dus ik typ het gewoon voluit maar ik weet inderdaad niet echt waar dat teken voor staat, heb het wel al eens in andere codes tegen gekomen
Dat betekent modulo ( Kan je mooi googlen ;) ).

edit: door de delay die je nu nog in de code hebt zal het overigens nog steeds achter elkaar uitgevoerd worden, en niet na elkaar.

[ Voor 16% gewijzigd door Woy op 27-06-2017 09:49 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
zou het kunnen dat ik kon afleiden van het internet dat het dingen splitst
het zou ook logisch zijn, want ik splitst de void loop in tweeën

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Iets harder zoeken. :)

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
Berekent de rest wanneer een getal wordt gedeeld door een ander. Het is nuttig voor het houden van een variabele binnen een bepaald bereik (bijvoorbeeld de grootte van een matrix).
kon ik vinden op de arduino site zelf (met translate)
maar ik snap er niet veel van :'(

Acties:
  • +3 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik heb hem.
het berekent de rest van een quotiënt dat niet deelbaar is
vb. 11%4 = 3 --> 4 gaat 2 keer in 11 en de rest is 3

en de hele code betekend dan dit denk ik
code:
1
2
3
4
5
6
7
8
9
10
11
for(int i = 0;;i++){ //je werkt in i
     if( i % 2 == 0 ) // als i deelbaar is door 2 zonder rest;
         {
         // dan gebeurt dit
         }  
    if( i % 3 == 0 ) // als i deelbaar is door 3 zonder rest;
         {
         //dan gebeurt dit
         }
    delay(1);
}

[ Voor 58% gewijzigd door jonas-ventje op 27-06-2017 10:36 ]


Acties:
  • +1 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Kijk, je bent in ieder geval volhardend. Jij gaat er wel komen! :)

Succes kerel!

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
dus het is noch steeds niet juist of wat

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Nee, sorry, je begrijpt die laatste verkeerd. Dat is hem. Ik bedoel meer: succes in je verdere programmeer carrière ;)

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • +1 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
aah ok maar ik heb ook in interrupts proberen te programmeren maar ik krijg deze foutmelding:
'DoStuff' was not declared in this scope
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <Servo.h>
Servo myservo;
int pos = 0;
int led = 3;
const int trigPin = 6;
const int echoPin = 5;
const byte P1 = 2;

void setup() {
  pinMode(P1, INPUT_PULLUP);
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(P1), callbackfunction, FALLING);
}

void loop()
{
  for (pos = 0; pos < 160; pos += 2)
  {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 160; pos >= 0; pos -= 2)
  {
    myservo.write(pos);
    delay(15);
  }
}
void callbackfunction()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance < 10)
  {
    digitalWrite(led, HIGH);
  }
  else
  {
    digitalWrite(led, LOW);
  }
  DoStuff();
}

hoe los ik dit op?

Acties:
  • 0 Henk 'm!

  • KoningsGap
  • Registratie: Augustus 2013
  • Laatst online: 09:22
Dostuff() is een placeholder voor je eigen code. Daar vul je dus de method of functie in die je op dat moment uitgevoerd wilt hebben.

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
dus ik moet die gewoon weg doen, dat heb ik ook al geprobeerd maar dan gaat mijn lichtje niet aan

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Had je wel begrepen dat de declaratie echopin = 5 de fysieke pin 5 verbind met de variable echopin?
En fysieke pin 2 of 3 zijn de enige pins die interrupts kunnen maken, dus...

Jouw ultrasound detectie moet verbonden zijn met P1 (pin 2) of P2 (pin 3). Die pins van de arduino zijn de enige die een interrupt naar de processor (en dus naar jouw programma) kunnen sturen.

echopin en P1 zijn maar variablen, dus je mag ze noemen wat je wilt.
In de bovenstaande code mag je int en byte als hetzelfde beschouwen. Een byte kan een int zijn en een int is altijd een of meerdere bytes.

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
Ok kan het nu ff ni proberen maar ik zal het straks doen en laten weten of het werkt

[ Voor 3% gewijzigd door jonas-ventje op 27-06-2017 11:16 ]


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
dit is toch wat het moet zijn of niet?
ik heb de echoPin verandert naar pin3

maar het werkt nog steeds niet!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <Servo.h>
Servo myservo;
int pos = 0;
int led = 10;
int trigPin = 6;
int echoPin = 3;
const byte P1 = 2;

void setup() {
  pinMode(P1, INPUT_PULLUP);
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(P1), callbackfunction, FALLING);
}

void loop()
{
  for (pos = 0; pos < 160; pos += 2)
  {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 160; pos >= 0; pos -= 2)
  {
    myservo.write(pos);
    delay(15);
  }
}
void callbackfunction()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance < 10)
  {
    digitalWrite(led, HIGH);
  }
  else
  {
    digitalWrite(led, LOW);
  }
}

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Pas op dat je niet te veel gaat doen in je interrupt, zolang je daar in zit werkt er niets anders meer. In het algemeen moet je dus niet gaan zitten delay'en of dat soort dingen.
Daarnaast, maar ik weet niet hoe Arduino daar mee omgaat, zou ik geen double precision dingen gaan doen (uberhaupt) in die kreupele 8 bitter; dat doe je hier door die
C++:
1
distance = (duration / 2) / 29.1;

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Kun je uitvlooien wat deze regel precies doet?
code:
1
attachInterrupt(digitalPinToInterrupt(P1), callbackfunction, FALLING);

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • +1 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik snap het
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Servo.h>
Servo myservo;
int pos = 0;
int led = 10;
int trigPin = 6;
const byte echoPin = 2;

void setup() {
  pinMode(echoPin, INPUT_PULLUP);
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(led, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(echoPin), callbackfunction, FALLING);
}

void loop()
{
  for (pos = 0; pos < 160; pos += 2)
  {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 160; pos >= 0; pos -= 2)
  {
    myservo.write(pos);
    delay(15);
  }
}
void callbackfunction()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance < 10)
  {
    digitalWrite(led, HIGH);
  }
  else
  {
    digitalWrite(led, LOW);
  }
}


maar het werkt nog steeds niet, nu draait zelfs mijn servo motor niet meer

Acties:
  • +1 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
@jonas-ventje volgens mij snap je het nog niet helemaal.

attachInterrupt zorgt ervoor dat als een interupt getriggerd wordt er een functie aangeroepen wordt. Wat je nu doet is zeggen dat als op pin "echoPin" een FALLING edge gedetecteerd wordt ( Signaal gaat van hoog naar laag ), dan wordt callback de callback aangeroepen.

Op dit moment roep je in je interupt callback weer pulseIn aan die gaat zitten wachten op een change van de pin. Wat je beter kunt doen is zorgen dat je interrupt triggert als de pin uberhaupt verandert ( CHANGE ). Je registreert dan alleen het tijdstip waarop hij naar HIGH verandert. Als hij de volgende keer naar LOW verandert weet je dus hoe lang hij hoog geweest is ( Huidige tijd, min geregistreerde tijd ) ( Of andersom afhankekelijk van wat voor signaal je precies verwacht ).

Sowieso zul je bij je callbackfunction de delayMicroseconds er uit moeten halen, en je pulseIn. Dat soort blocking functies hoor je niet te gebruiken binnen een interupt handler.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 14:34

ElCondor

Geluk is Onmisbaar

Inderdaad, zoals Woy zegt. Je hebt een deel van de code die ik aanhaalde ontcijfert maar nog niet alles, blijkbaar. Je moet ALLE paramters kunnen thuisbrengen en verklaren voordat je een functie begrijpt ;)

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
nee ik denk dat ik het inderdaad nog niet helemaal snap
1) moet ik nu FALLING veranderen door CHANGE of ...
2) hoe kun je nu de delayMicroseconds en pulseln uit een ultrasonic programma halen
3) dat kan dan toch geen invloed hebben op mijn servo motor, normaal moet de void loop dan toch gewoon zijn ding doen ook al is mijn void callbackfunction niet juist

of anders als het echt te moeilijk is om mij het te laten snappen geef ik het wel gewoon op

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
@jonas-ventje kun je eens een tijdlijn geven van wat je voor elkaar wil krijgen, en aangeven hoe je hardware in elkaar zit. Ik zie dat je een servo aanstuurt, een trigPin hebt, en een echoPin. Wat betekenen deze pinnen en wanneer wil jij ze aansturen, en wat wil je doen als ze extern aangestuurd worden?

Kun je iets van een dergelijke schema tekenen (Met daarbij jouw hardware, en wat input/output is)?

Afbeeldingslocatie: https://www.bartwolff.com/File/SHENZHEN/004-1.PNG

[ Voor 21% gewijzigd door Woy op 28-06-2017 10:40 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik heb dit al eens laten lukken met dit
code:
1
2
3
4
5
6
7
8
9
for(int i = 0;;i++){
    if( i % 2 == 0 ) {
         //Do something on even ticks
    }    
    if( i % 3 == 0 ) {
         //Do something every 3 ticks
    }
    delay(1);
}

ik wil gewoon juist hetzelfde maar dan met interrupt, elcondor heeft in een van de eerste berichten gezegd dat dat beter is

en ik zal eens kijken of ik dat kan, ik heb wel fritzing op mijn laptop staan je kunt er verschillende soorten schema's op maken maar deze heb ik nog nooit gezien

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
jonas-ventje schreef op woensdag 28 juni 2017 @ 10:47:
en ik zal eens kijken of ik dat kan, ik heb wel fritzing op mijn laptop staan je kunt er verschillende soorten schema's op maken maar deze heb ik nog nooit gezien
Dit komt uit een spelletje (Shenzen IO), misschien leuk om eens te proberen, want het komt redelijke overeen met de materie die je nu op een Arduino aan het proberen bent.

Maar van mij part doe je het in paint. Het gaat er meer om dat je concreet maakt wat je voor elkaar wil krijgen.

Het stukje van de modulo is niet veel meer dan het volgende in pseudo code

code:
1
2
3
4
5
6
loop ( en verhoog i met 1 )
    als i deelbaar is door 2 doe dan het volgende
         //Code
    als i deelbaar is door 3 doe dan het volgende
         //Code
    slaap 1 ms


Het voert nog niet echt iets tegelijkertijd uit. Om dat voor elkaar te krijgen zul je de delays uit je code moeten halen, want op dat moment onderbreek je je volledige programma.

De interrupts zijn vooral bedoeld om op externe (of soms ook interne) gebeurtenissen te reageren.

Ik zou meer iets als volgt doen
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <Servo.h>
Servo myservo;
int pos = 0;
const int echoPin = 5;
const int trigPin = 6;

volatile unsigned long startTime = 0;
volatile unsigned long timeDiff = 0;

void setup() {
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(echoPin), echoPinChanged, CHANGE);
}  

void loop() {
    for(int i = 0;; i++)
    {
        //Update servo elke 15 ms
        if(i % 15 == 0){
            //Bereken de waarde waar je de servo op wil zetten aan de hand van i (Kan natuurlijk ook aan de hand van de tijd o.i.d.)
            int position = (i / 15) % 320;
            if(position > 160)
                position = 160 - (position - 160);
            
            myservo.write(pos);
        }
        
        //Zet trigpin elke 1000 ms hoog     
        if(i%1000 == 0)
        {
            digitalWrite(trigPin, HIGH);
        }
        else if(i%1000 == 10) //Zet 10 ms later weer laag
        {
            digitalWrite(trigPin, LOW);
        }
        
        //Als timeDiff niet gelijk is aan 0 dan is deze gezet in je callbackfunction
        if(timeDiff != 0)
        {
            //Doe hier iets met de tijd dat de pin hoog geweest is
            stuff.........
            //Reset timeDiff weer naar 0
            timeDiff = 0;
        }
        
        delay(1);       
    }
}

void echoPinChanged() {
    if(digitalRead() == HIGH){
        startTime = millis();
    }
    else {
        timeDiff = startTime - millis();
    }
}

[ Voor 7% gewijzigd door Woy op 28-06-2017 11:16 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Nja, in dit geval zou ik die berekening + de digitalWrite wel in de interrupt routine doen om de latency van de main loop er uit te halen magoed, tomayto-tomahto.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ja ten eerste snap ik er niet veel van en ten tweede werkt die code ook niet dus ik zal het wel gewoon houden bij
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <Servo.h>
Servo myservo;
int pos = 0;

int led = 3;
const int trigPin = 6;
const int echoPin = 5;
void setup()
{
  myservo.attach(7);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
}
void loop()
{
  for (int i = 0;; i++) {
    if ( i % 2 == 0 )
    {
      for (pos = 0; pos < 160; pos += 2)
      {
        myservo.write(pos);
        delay(15);
      }
      for (pos = 160; pos >= 0; pos -= 2)
      {
        myservo.write(pos);
        delay(15);
      }
    }
    if ( i % 3 == 0 )
    {
      long duration, distance;
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration / 2) / 29.1;
      if (distance < 10)
      {
        digitalWrite(led, HIGH);
      }
      else
      {
        digitalWrite(led, LOW);
      }
    }
    delay(1);
  }
}

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
farlane schreef op woensdag 28 juni 2017 @ 11:17:
Nja, in dit geval zou ik die berekening + de digitalWrite wel in de interrupt routine doen om de latency van de main loop er uit te halen magoed, tomayto-tomahto.
De write kan op zich wel in de interrupt, maar de delay en het daarna weer omhoog zetten wil je niet in de interrupt hebben.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
jonas-ventje schreef op woensdag 28 juni 2017 @ 11:18:
ja ten eerste snap ik er niet veel van en ten tweede werkt die code ook niet dus ik zal het wel gewoon houden bij
code:
1
...
Op zich is er niet veel mis met die code, maar het gebeurt nu niet tegelijk, maar na elkaar.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik zal later als ik wat meer ervaring heb nog wel eens met interrupt proberen...

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Woy schreef op woensdag 28 juni 2017 @ 11:18:
[...]

De write kan op zich wel in de interrupt, maar de delay en het daarna weer omhoog zetten wil je niet in de interrupt hebben.
Na de digitalwrite komt er geen delay meer, hij (led) wordt enkel door de volgende trigger weer laag/hoog gemaakt

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ja maar laat maar ik snap er toch niet veel van

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
farlane schreef op woensdag 28 juni 2017 @ 11:26:
[...]

Na de digitalwrite komt er geen delay meer, hij (led) wordt enkel door de volgende trigger weer laag/hoog gemaakt
O, je hebt het idd over de reactie op de afstand met de led. Ja dat zou inderdaad wel in de interrupt kunnen. Het was meer zo geschreven omdat ik mij voor kan stellen dat er een langere afhandeling gewenst is, en om zo aan te geven hoe je kan communiceren tussen de interrupt en je main loop.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1