mechanische tripmaster

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 35
Geregistreerd: 07 Jan 2016, 22:09
Woonplaats: Veghel

mechanische tripmaster

Berichtdoor JoostB » 21 Jan 2016, 20:34

Hallo allemaal,

ik ben nieuw met Arduino en zelf al een tijdje aan het zoeken en proberen, gaat allemaal erg moeizaam maar langzaamaan wat beter.
Uiteindelijk wil ik een mechanische teller aansturen met een stappenmotor en een reset kunnen geven met een servo.
als dit gelukt is wil ik nog het één en ander uitbreiden maar daar later meer over.
Een tripmaster word gebruikt in de autosport bij bijv. regelmatigheidsritten om afstanden te meten.
Ik heb een vraag.

Ik heb nu een programmatje met een stappenmotor en een servo.
Zolang de stappenmotor loopt kan ik de servo niet bedienen graag zou ik dit willen.
Kan iemand mij hier bij helpen (tip en tricks).


cpp code
#include <Servo.h>

Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0; // variable to store the servo position
int buttonPinservo = 6; //reset schakelaar teller
int Distance = 0; // Record the number of steps we've taken
int buttonPin = 7; //schakelaar voor stappenmotor
int buttonState = 0;



void setup() {


pinMode(8, OUTPUT); //zet pin 8 als output
pinMode(9, OUTPUT); //zet pin 9 als output
pinMode (buttonPin, INPUT); //zet buttonPin 7 als input
pinMode (buttonPinservo, INPUT); //zet buttonPinservo als input
digitalWrite(8, LOW);
digitalWrite(9, LOW);
myservo.attach(5); // attaches the servo on pin 9 to the servo object

}

void loop() {

buttonState = digitalRead (buttonPin); //lees status van de buttonPin
if (buttonState==HIGH){ //als buttonState hoog is doe onderstaand

for (int i = 0; i < 2600; i++){ //als i kleiner is dan 2600 start loop elke keer word er 1 keer i bij opgeteld(i++)

digitalWrite(9, HIGH);
delayMicroseconds(100);
digitalWrite(9, LOW);
delayMicroseconds(100);

}}

buttonState = digitalRead (buttonPinservo); //
if (buttonState==HIGH){

for (pos = 50; pos <= 300; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(1); // waits 15ms for the servo to reach the position
}
for (pos = 300; pos >= 50; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(1); // waits 15ms for the servo to reach the position
} } }

Advertisement

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

Re: mechanische tripmaster

Berichtdoor nicoverduin » 21 Jan 2016, 21:09

Het klopt wat je zegt. Dat komt omdat je 2600 keer 200mSeconden de processor niets laat doen. Eigenlijk hoef je gedurende 100msec niet op de stappenmotor te wachten. Zoals je vermoedelijk nog heel veel malen zult horen zit de clue in het programmatje "blink without delay". Oftewel een led laten knipperen zonder dat je de delay gebruikt. En dat is eigenlijk precies wat je zoekt.

Conceptueel
je moet het hele proces ff van bovenaf bekijken. Dat betekent dat je alleen iets moet doen als er iets moet gebeuren. Dus bij de stappen motor krijg je:
cpp code
ALS aantalPulsen != 2600 DAN
ALS 100mS zijn verlopen DAN
ALS pulse = HOOG DAN
pulse is LAAG
verhoog aantalPulsen met 1
ANDERS
pulse is HOOG
einde ALS
einde ALS
einde ALS

Als je de code veranderd in C/C++ dan doet de code alleen iets als er echt iets moet gebeuren.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 35
Geregistreerd: 07 Jan 2016, 22:09
Woonplaats: Veghel

Re: mechanische tripmaster

Berichtdoor JoostB » 22 Jan 2016, 12:05

dank je wel voor je antwoord, ik zal het eens gaan bekijken echter heb ik geen idee hoe
ik "blink without delay" hierin toe moet gaan passen (misschien nog een tip?)
1 geluk het hoeft deze week niet klaar te zijn! :)

Gr Joost

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

Re: mechanische tripmaster

Berichtdoor shooter » 22 Jan 2016, 12:34

het is iets makkelijker hoor.
voor de servo gebruik je al een lib prima, je hoeft die servo helemaal niet per stap te zetten gewoon servo (180) is ook goed.
de servo loopt er dan vanzelf naar toe.

de stepper kun je beter aansturen met stepper.h of accelstepper
die zorgt dan voor het stappen en hoef je helemaal niks te doen.

en nico heeft gelijk kijk eens hoe blink werkt dat is tenslotte les 2

met een display erbij kun je ook een elektronische tripmaster maken, die kun je dan zelfs zo maken dat de tijden er direct uitkomen.
wel een advies is om dan een RTC te gebruiken.
je kunt dan met 1 ledje aangeven sneller/goed/langzamer.
paul deelen
shooter@home.nl

Berichten: 35
Geregistreerd: 07 Jan 2016, 22:09
Woonplaats: Veghel

Re: mechanische tripmaster

Berichtdoor JoostB » 23 Jan 2016, 20:39

Ik heb/had Blink without delay nogmaals bekeken en begrijp hoe het werkt, alleen begrijp ik niet hoe ik dit dan weer bijv. in mijn code toe moet gaan passen.

ondertussen maar weer eens begonnen om de stappenmotor met een andere code en een bibliotheek aan te sturen.
Ik heb nu onderstaande code en kan de stappenmotor met de button aansturen echter maar 1-keer.
Al van alles geprobeerd maar nog niet gevonden, hoe kan ik er voor zorgen dat ik de loop weer met de button kan starten??

#include <AccelStepper.h>


AccelStepper stepper(1, 9, 8);


int buttonPin = 7; //schakelaar voor stappenmotor
int buttonState = 0;

int pos = 3600;
void setup()
{
stepper.setMaxSpeed(3000);
stepper.setAcceleration(9000);
pinMode (buttonPin, INPUT); //zet buttonPin 7 als input
}

void loop()
{
buttonState = digitalRead (buttonPin); //lees status van de buttonPin
if ( buttonState==HIGH){

stepper.moveTo(pos); //stepper beweegt (CW)
}
stepper.run(); //stepper draait ingestelde aantal stappen

}


en inderdaad Shooter ik wil er uiteindelijk ook een display bij maken met klok/stopwatch/ gemiddelde snelheid ed.
Maar voor het zo ver is kan er al wel een elfstedentocht geweest zijn!

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

Re: mechanische tripmaster

Berichtdoor shooter » 24 Jan 2016, 11:32

dus als je op de knop drukt dan gaat de stepper draaien van 0 naar 3600 want dat zeg je.
nu kun je dat dus op twee manieren oplossen:
als de motor op de positie is (3600 bij jou)(zie accelstepperlib) dan zet de position op 0

http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

void AccelStepper::setCurrentPosition ( long position )

Resets the current position of the motor, so that wherever the motor happens to be right now is considered to be the new 0 position. Useful for setting a zero position on a stepper after an initial hardware positioning move. Has the side effect of setting the current motor speed to 0.

Parameters
[in] position The position in steps of wherever the motor happens to be right now.

je kunt hier dus gewoon 0 invullen, dan begint het gewoon opnieuw.

Of je kunt 3600 optellen bij de moveto.
je kunt ook opvragen of de stepper al op de positie is.
Ik gebruik dit bij een lineaire aandrijving dan loopt de stepper eerst tegen een schakelaar aan, en dan zet ik de setcurrentposition op -20 en dan een moveto 0 dan staat alles klaar.


je kunt ipv stepper.moveTo ook stepper.move(3600) gebruiken ben je overal vanaf. want dat is relatief.

(maar dan wel met de goede lib.
het leuke is dat als je de positie opvraagt en dan deelt door 3600 weet je precies hoeveel omwentelingen de stepper gemaakt heeft.
paul deelen
shooter@home.nl

Berichten: 35
Geregistreerd: 07 Jan 2016, 22:09
Woonplaats: Veghel

Re: mechanische tripmaster

Berichtdoor JoostB » 24 Jan 2016, 17:12

Hallo Shooter (Paul)

bedankt voor je reactie, en inderdaad hoe simpel kan het zijn!
ondertussen al weer heel de zondag lekker bezig! (is toch slecht weer)

Ik heb nu "stepper.move ()" gebruikt en inderdaad ondertussen loopt de loop gewoon door
en kan ik een herstart geven.

Ik heb nu "blink without delay " toegepast op de aansturing van de servo maar loop tegen het probleem aan
dat ik de startbutton nu ook de ingestelde tijd ingedrukt moet houden.

Ik heb al van alles geprobeerd om dit te verhelpen maar het wil niet lukken.
Misschien nog een tip?????

Die link die je in je vorige bericht meestuurde met de uitleg van de libery is erg gemakkelijk, ik heb dit ook geprobeerd
om op deze site andere libery's op te zoeken maar dat wil niet lukken, ik kan eigenlijk alleen jouw link volgen.
Is er een manier om andere libery's op te zoeken met deze uitgebreide uitleg?
cpp code
#include <Servo.h>
#include <AccelStepper.h>


AccelStepper stepper(1, 9, 8);
Servo myservo;

int buttonPin = 7; //schakelaar voor stappenmotor
int buttonState = 0;

int pos = 0; // variable om servo positie op te slaan
int buttonPinservo = 6; //reset schakelaar teller
long previousMillis = 0;
long interval = 1000;

void setup()
{
stepper.setMaxSpeed(1000); //maximale snelheid stappenmotor
stepper.setAcceleration(1000); //acceleratie hoe hoger het getal hoe sneller
pinMode (buttonPin, INPUT); //zet buttonPin 7 als input

pinMode (buttonPinservo, INPUT); //maak van de servoPin een output
myservo.attach(5); // sluit de servo aan op pin 5

Serial.begin(9600);
}

void loop(){

buttonState = digitalRead (buttonPin); //lees status van de buttonPin
if ( buttonState==HIGH){

stepper.move(10000); //stepper beweegt (CW)
}
stepper.run(); //stepper draait ingestelde aantal stappen



unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;


buttonState = digitalRead (buttonPinservo);
if (buttonState==HIGH){

myservo.write(20); // vertel de servo dat hij hier naar toe gaat (variable positie)

}
else{
myservo.write(200); // vertel de servo dat hij hier naar toe gaat (variable positie)

}} }

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

Re: mechanische tripmaster

Berichtdoor shooter » 24 Jan 2016, 19:01

jaja het zijn dus de onderste 5 regels,
de timer stat er ook al bij dus:
als buttonstate== high dan die timer starten de servo naar 20 sturen
als timer gedaan is dan de servo terug

if (buttonState==HIGH){

myservo.write(20); // vertel de servo dat hij hier naar toe gaat (variable positie)
previousMillis = currentMillis;

}
unsigned long currentMillis = millis();// dit doe ik altijd bij het begin van de loop dan blijft de tijd voor alles gelijk.

if(currentMillis - previousMillis > interval) {

myservo.write(200); // vertel de servo dat hij hier naar toe gaat (variable positie)

}
paul deelen
shooter@home.nl

Berichten: 35
Geregistreerd: 07 Jan 2016, 22:09
Woonplaats: Veghel

Re: mechanische tripmaster

Berichtdoor JoostB » 24 Jan 2016, 22:07

aha eindelijk wat resultaat! Het werk!

Ik heb nog wel in de code wat moeten verplaatsen want ik bleef een foutmelding houden.
Ik heb: unsigned long currentMillis = millis();
naar boven moeten verplaatsen, omdat de melding bleef dat hij currentMillis not declard in this scoop.
na verplaatsing werkt het.

Wat nu opvalt is dat de stappenmotor de ene keer meer stappen maakt dan de andere keer, dit komt omdat ik de ene of de andere
keer de schakelaar langer vasthoud.
Dit zal natuurlijk ook zo zijn met een hall-switsch op het wiel, bij lagere snelheid zal de motor meer stappen maken.
Eerst maar weer kijken wat we hieraan kunnen doen.

Shooter, alvast bedankt1

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

Re: mechanische tripmaster

Berichtdoor nicoverduin » 25 Jan 2016, 08:42

@joostB: Je code is nogal rommelig opgesteld. Je doet er goed aan om de accolades die een groep vormen op het zelfde niveau laten inspringen. CTRL-T op de IDE helpt al een aardig stap in die richting. Nu is het erg rommelig wat de leesbaarheid van de code niet ten goede komt.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten