dc motor en servo tegelijk laten werken. hoe?

algemene C code
Berichten: 8
Geregistreerd: 02 Mrt 2017, 15:27

dc motor en servo tegelijk laten werken. hoe?

Berichtdoor Jelleman » 07 Sep 2017, 13:46

Ik ben zelf aan het 'uitvinden' hoe ik een programma kan schrijven voor wat uiteindelijk een autonoom autootje moet gaan worden.
Een programma voor 4 dc motoren kan ik schrijven, een programma voor een servo die heen en weer gaat kan ik ook schrijven.
mijn vraag is hoe combineer ik beiden. hoe laat ik dus de motoren vooruitgaat terwijl de servo van 0 tot 180 graden heen en weer gaat.
eigenlijk wil ik het programma voor de motoren en het programma voor de servo tegelijk laten werken.
hoe doe ik dit?

Advertisement

Gebruikers-avatar
Berichten: 146
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor baco1978 » 07 Sep 2017, 15:29

het zal een beetje op dit princiepewerken

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Met vriendelijke groet Arjan

Berichten: 8
Geregistreerd: 02 Mrt 2017, 15:27

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor Jelleman » 07 Sep 2017, 16:35

op onderstaande manier met 'void' werkt het ook, wel zit er een hinderlijke pauze van een halve sec. in de dc motoren

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <Servo.h>

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor_one = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor_three = AFMS.getMotor(3);
Servo myServo_one;
Servo myServo_two;

int pos_one=0;
int pos_two=0;


void setup()
{
Serial.begin(9600);
Serial.println("motor test Motorshield versie 2 DC motor");
AFMS.begin();
myServo_one.attach(10);
myServo_two.attach(9);
myServo_one.write(90);
myServo_two.write(60);
}

void motoren()
{
uint8_t i;
myMotor_one->run(FORWARD);
myMotor_three->run(FORWARD);
for (int mySpeed = 0; mySpeed < 255; mySpeed ++)
{
myMotor_one->setSpeed(mySpeed);
myMotor_three->setSpeed(mySpeed);
}
myMotor_one-> run(FORWARD);
myMotor_three-> run(FORWARD);

}

void sweep()

{
for (pos_one = 0; pos_one <= 180; pos_one += 1)
{
myServo_one.write(pos_one);
delay(15);
}
for (pos_one = 0; pos_one <= 180; pos_one += 1)
{
myServo_one.write(pos_one);
delay(15);
}
}

void loop()
{
sweep();
motoren();
}

Gebruikers-avatar
Berichten: 1728
Geregistreerd: 06 Aug 2016, 01:03

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor Koepel » 07 Sep 2017, 18:00

Om millis() te gebruiken volgens het BlinkWithoutDelay voorbeeld, vergt dat de hele sketch anders geschreven wordt.

Dan zou je bijvoorbeeld iedere 10ms de waarde van de servo motoren kunnen doorgeven, en tegelijkertijd nog andere dingen doen.

Als je dat zou willen proberen, probeer dan met BlinkWithoutDelay eens om twee ledjes afzonderlijk van elkaar te laten knipperen.

Berichten: 8
Geregistreerd: 02 Mrt 2017, 15:27

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor Jelleman » 08 Sep 2017, 09:16

bedankt voor jullie antwoord, is miles een meer gebruikelijker manier om twee programma's/apparaten tegelijk te laten werken dan 'void' ?
Ik ga me het vandaag zeker aanleren, mooi de hele dag er tijd voor.

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

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor nicoverduin » 08 Sep 2017, 10:13

Wat is een 'void'?
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 8
Geregistreerd: 02 Mrt 2017, 15:27

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor Jelleman » 08 Sep 2017, 16:00

Ik weet niet wat void is maar ik gebruikte het om twee programma's tegelijk te laten lopen. dat was mijn eerste poging om iets te laten multitasken in arduino. maar ik lees hier nu dat het gebruik van milli() handiger of beter is. En vanuit de herhalingen van het milli() vloeit weer het OOP uit. dus voorlopig heb ik daar wel even een hele kluif aan.


void motoren()

laat de motoren draaien

void servo_een()

laat servo draaien

void loop()
servo_een()
motoren()

Gebruikers-avatar
Berichten: 1728
Geregistreerd: 06 Aug 2016, 01:03

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor Koepel » 10 Sep 2017, 06:24

"void" is "niets", een "leegte", een "omhulsel zonder inhoud", of "ongeldig", of een "holle ruimte".
Heb je wel eens gelezen dat de garantie "void" wordt, zodra je een apparaat open maakt ?

Een functie is een blokje code dat bij elkaar in een functie wordt gezet. Die functie geeft een waarde terug. Als de functie niets terug geeft, dan wordt 'void' gebruikt.

Code: Alles selecteren
int Bereken ( int a, int b)
{
  return ( a + b );
}

void BerekenNiets ( int a, int b)
{
  digitalWrite( 13, HIGH);
}


Wanneer je in de loop() twee functies achter elkaar zet, dan worden ze achter elkaar uitgevoerd. Het heeft dus niets te maken met multitasking. Echt helemaal niets.

Voor de Arduino Due/Zero/M0 is er een eenvoudige schedular die een soort van multitasking doet. Dat werkt stabiel omdat het zo eenvoudig is. Ik kan voor je opzoeken welke library de juiste is, het staat ergens in mijn projecten.

Voor alle soorten Arduino boarden is er echter ook "millis()" : https://www.arduino.cc/en/Reference/Millis.
Daarbij is het nodig dat er zo weinig mogelijk delay() in de loop() staat, zodat de loop() zeer snel steeds opniew wordt uitgevoerd.
Met millis() wordt gekeken of het al tijd is om iets te gaan doen. Daardoor is het mogelijk om zelfs tientallen dingen door elkaar heen te doen, omdat alleen maar wordt gekeken of het tijd is om een bepaald stukje code uit te voeren.

Dus stel je voor dat de loop() duizenden keren per seconde opnieuw wordt uitgevoerd.
Met millis() kan dan gekeken worden of er 5 seconden om zijn om een ledje uit te doen. Daar is een variabele voor nodig, meestal "previousMillis".
Met een andere variabele (previousMillis2 of zo) kan gekeken worden of er ieder half uur een toeter af gaat.
Met weer een andere variabele (prevousMillis3 of zo) kan gekeken worden of er één keer per dag een relais aangezet moet worden.

Zie je dat een beetje voor je ? De loop() wordt steeds opnieuw uitgevoerd en heeft vrijwel nooit iets te doen. Alleen als millis() zo ver is dat het tijd is om iets te gaan doen, dan wordt er eindelijk een stukje code uitgevoerd.

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

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor nicoverduin » 10 Sep 2017, 12:18

Ik stelde bewust de vraag wat een void is, omdat ik de indruk kreeg dat de TS hier niet mee bekend was. Het resultaat terug viel wat tegen terwijl er toch een uitgebreide reference is : https://www.arduino.cc/en/Reference/FunctionDeclaration
Tja je kan wel honderden tutorials maken, maar als je ze niet bekijkt ......
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: dc motor en servo tegelijk laten werken. hoe?

Berichtdoor shooter » 10 Sep 2017, 21:03

je void uitleg is niet goed maar je uitwerking wel, het zijn dus een paar functies die je telkens in de loop aanroept.
dat is ook hier de oplossing.
je moet wel de delay eruit halen en iets bedenken met een timer (millis())
paul deelen
shooter@home.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast