snap code stappermotor arduino niet

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik ben met een project met arduino bezig om een stappenmotor een specifiek aantal graden te draaien en ik heb een programma gevonden dat werkt met 360° maar ik snap de code niet

hier is de code
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11
int Steps = 0;
boolean Direction = true;// gre
unsigned long last_time;
unsigned long currentMillis ;
int steps_left = 4095;
long time;
void setup()
{
  Serial.begin(115200);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}
void loop()
{
  while (steps_left > 0) {
    currentMillis = micros();
    if (currentMillis - last_time >= 1000) {
      stepper(1);
      time = time + micros() - last_time;
      last_time = micros();
      steps_left--;
    }
  }
  Serial.println(time);
  Serial.println("Wait...!");
  delay(2000);
  Direction = !Direction;
  steps_left = 4095;
}
void stepper(int xw) {
  for (int x = 0; x < xw; x++) {
    switch (Steps) {
      case 0:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 1:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
        break;
      case 2:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 3:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 4:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 5:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 6:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 7:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      default:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
    }
    SetDirection();
  }
}
void SetDirection() {
  if (Direction == 1) {
    Steps++;
  }
  if (Direction == 0) {
    Steps--;
  }
  if (Steps > 7) {
    Steps = 0;
  }
  if (Steps < 0) {
    Steps = 7;
  }
}


ik snap wel hoe je de motor zelf aanstuurt (de basic code)
dat is dit stuk:
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
53
54
55
      case 0:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 1:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
        break;
      case 2:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 3:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 4:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 5:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 6:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 7:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      default:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
    }

Alle reacties


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 12-09 10:02
Welk deel van de logica gaat het dan wel mis en snap je dan niet? Probeer het anders uit te schrijven in een flow diagram of met debugging tools doorheen te stappen.

Acties:
  • 0 Henk 'm!

  • WK100
  • Registratie: Februari 2011
  • Laatst online: 12-09 07:47
Dit is waarschijnlijk (lees: ik heb de code niet grondig bekeken) het aantal stappen dat de motor zal nemen:

code:
1
  steps_left = 4095;


Probeer dit getal eens te tweaken en bekijk wat het resultaat is van jouw wijzigingen.
Leg dit daarna voor jezelf uit aan de hand van de loops die in de code zitten, zoals de while en for loop - zo kom je er vanzelf :Y)

[ Voor 6% gewijzigd door WK100 op 16-12-2017 18:12 ]


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
ik heb de code en beetje naar het nederlands gezet
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11
int huidige_stappen = 0;
int richting = 1;
long uiteindelijke_tijd;
long huidige_tijd; 
int uiteindelijke_stappen = 4095;
long tijd;
void setup()
{
  Serial.begin(9600);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}
void loop()
{
  while (uiteindelijke_stappen > 0) {
    huidige_tijd = micros();
    if (huidige_tijd - uiteindelijke_tijd >= 1000) {
      motor(1);
      tijd = tijd + micros() - uiteindelijke_tijd;
      uiteindelijke_tijd = micros();
      uiteindelijke_stappen--;
    }
  }
  Serial.println(tijd);
  Serial.println("Wait...!");
  delay(2000);
  richting = !richting;
  uiteindelijke_stappen = 4095;
}
void richting_instellen() {
  if (richting == 1) {
    huidige_stappen++;
  }
  if (richting == 0) {
    huidige_stappen--;
  }
  if (huidige_stappen > 7) {
    huidige_stappen = 0;
  }
  if (huidige_stappen < 0) {
    huidige_stappen = 7;
  }
}
void motor(int xw) {
  for (int x = 0; x < xw; x++) {
    switch (huidige_stappen) {
      case 0:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      case 1:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, HIGH);
        break;
      case 2:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 3:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
        break;
      case 4:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 5:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 6:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
      case 7:
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        break;
      default:
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW);
        break;
    }
    richting_instellen();
  }
}


nu heb ik wel nog steeds een paar dingen die ik niet snap:
in dit deel:
code:
1
2
void motor(int xw) {
  for (int x = 0; x < xw; x++) {

je maakt een variabele xw aan maar hoeveel is die dan? je zegt in for loop dat x < moet zijn dan xw maar hoeveel is xw dan?


en dan de richting: ik snap hoe je aan de 0 of 1 komt voor de richting maar hoe komt het dan dat de richting ook effectief omdraait?


en verder heb ik dit deel nog dat ik niet snap:
code:
1
    switch (huidige_stappen) {

ik weet wel dat de term switch bij al die cases hoort maar wat is de functie ervan? ik denk gewoon herhalen zoveel als "huidige_stappen" maar ik ben niet zeker

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 01:11

Damic

Tijd voor Jasmijn thee

Die motor/stepper is een aparte sub, deze roep je aan in je loop.

Arduino heeft een mooie functie voor stappenmotoren aan te drijven, waarom gebruik je die niet?

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
omdat die dan trager gaat en dan is de motor minder sterk

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

jonas-ventje schreef op zondag 17 december 2017 @ 08:31:
code:
1
2
void motor(int xw) {
  for (int x = 0; x < xw; x++) {

je maakt een variabele xw aan maar hoeveel is die dan? je zegt in for loop dat x < moet zijn dan xw maar hoeveel is xw dan?


en dan de richting: ik snap hoe je aan de 0 of 1 komt voor de richting maar hoe komt het dan dat de richting ook effectief omdraait?


en verder heb ik dit deel nog dat ik niet snap:
code:
1
    switch (huidige_stappen) {

ik weet wel dat de term switch bij al die cases hoort maar wat is de functie ervan? ik denk gewoon herhalen zoveel als "huidige_stappen" maar ik ben niet zeker
Dat eerste is een function; de waarde van xw is gelijk aan wat er wordt meegegeven op de plek waar de functie wordt aangeroepen.

Over de switch: https://www.tutorialspoin...switch_statement_in_c.htm

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
@Radiant
en wat wordt er dan in dat geval meegegeven?

Acties:
  • 0 Henk 'm!

Verwijderd

jonas-ventje schreef op zondag 17 december 2017 @ 15:59:
@Radiant
en wat wordt er dan in dat geval meegegeven?
De functie wordt op regel 24 aangeroepen.

Acties:
  • 0 Henk 'm!

  • jonas-ventje
  • Registratie: Juli 2016
  • Laatst online: 19-01-2024
Aah ja ok ik snap het
Pagina: 1