dc motor en servo tegelijk laten werken. hoe?
14 berichten
• Pagina 1 van 2 • 1, 2
dc motor en servo tegelijk laten werken. hoe?
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?
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
Re: dc motor en servo tegelijk laten werken. hoe?
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();
}
#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();
}
Re: dc motor en servo tegelijk laten werken. hoe?
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.
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.
Re: dc motor en servo tegelijk laten werken. hoe?
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.
Ik ga me het vandaag zeker aanleren, mooi de hele dag er tijd voor.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: dc motor en servo tegelijk laten werken. hoe?
Wat is een 'void'?
Re: dc motor en servo tegelijk laten werken. hoe?
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()
void motoren()
laat de motoren draaien
void servo_een()
laat servo draaien
void loop()
servo_een()
motoren()
Re: dc motor en servo tegelijk laten werken. hoe?
"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.
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.
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.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: dc motor en servo tegelijk laten werken. hoe?
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 ......
Tja je kan wel honderden tutorials maken, maar als je ze niet bekijkt ......
Re: dc motor en servo tegelijk laten werken. hoe?
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())
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
shooter@home.nl
14 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten