Andamento del servo con Arduino

pilotare un servo con Arduino lo hai già imparato in alcuni dei miei precedenti articoli, ti mostro il risultato di alcuni esperimenti condotti sul controllo dell’andamento del servo, esperimenti condotti in collaborazione con Federico C., amico, appassionato di innovazione e tecnologia.

andamento del servo

Hai già avuto modo di vedere alcuni dei progetti nati dalla mente di Federico e dalla nostra collaborazione:

  • Robot sfera presentato a Roma in occasione dell’Arduino Day 2012;
  • Umanoide lo studio delle matematiche che potrebbero consentire ad un robot di simulare la camminata umana;
  • Mano biomeccanica lo studio 3D di una mano riproducibile con una stampante 3D tipo RepRap;

Gli ultimi due progetti hanno ispirato questo articolo e descrizione degli studi eseguiti.

Controllare l’andamento del servo con Arduino

Il progetto parte da una premessa che ti invito a testare con un

Esercizio: apri e chiudi un dito e osserva la velocità che assume all’inizio, al momento di massima estensione e poco prima di completare la chiusura, avrai notato che non è costante ossia non si sposta sempre a velocità ed accellerazione uniforme.

Osservazione: da quanto hai osservato hai dedotto che l’andamento del servo a cui colleghi il dito della tua mano non può far variare il proprio andamento in modo costante ma dovrà avere un andamento più lento in partenza la cui velocità aumenta progressivamente per rallentare in prossimità del della massima estensione in cui inverte il verso di rotazione ed ricomincia ad aumentare fino a metà della chiusura per rallentare e fermarsi quando il dito è chiuso.

Il fenomeno che hai osservato ed ho provato a descriverti è un andamento del servo di tipo sinusoidale:

andamento del servo

per ottenerlo devi sconfinare nel mondo della trigonometria, ecco a cosa serve la trigonometria, a parte gli scherzi quella che stai per applicare è trigonometria applicata ala robotica.

Lo scopo di gestire l’andamento del servo

a cosa serve tutto questo ragionamento?

a parte ad aver trovato un’applicazione della trigonometria in robotica, lo scopo vero è poter programmare un robot perché i suoi movimenti siano più naturali possibili, stiamo parlando di Umanoidi.

Per calcolare la sinusoide che renda il controllo dell’andamento del servo tale da permettere un movimento abbastanza veritiero puoi utilizzare alla funzione sin( X ) in cui X è l’angolo variabile.

Il vantaggio è che la funzione sin( X ) al variare di restituisce un valore compreso tra -1 ed 1 ( trigonometria ) per cui la velocità con cui ambia X ti consente di definire velocità del movimento ed intervallo di accelerazione e decelerazione in prossimità dei cambi di andamento sinusoidale.

Il servo che ho utilizzato per i miei esperimenti lo hai già visto in tanti altri:

andamento del servo

Le formule per pilotare l’andamento del servo

il solo valore di sin( X ) non è sufficiente ad essere utilizzato per controllare l’andamento del servo, in quanto il risultato varia tra -1 ed 1 ed otterresti un sevo che cambia da 0 a 1° perchè il grado -1 non è in grado di eseguirlo.

Il primo passo è calcolare il valore dell’angolo da inviare al servo.

Sai che un servo, normalmente, può ruotare da 0° a 180° e per sicurezza io evito di utilizzare gli estremi, almeno che non ne abbia bisogno, per cui considera l’escursione 10-170°.

Il punto centrale ossia quello della massima estensione del dito sarà (170-10)/2 = 160/2 = 80; puoi scrivere la formula come:

grado = (sin( X ) *80);

in cui al variare di sin( X ) da -1 a 1 otterrai un grado che varia da -80 a +80 gradi.

Sai che il servo non può riprodurre gradi inferiori a 0 ed inoltre che vorrei evitare di arrivare a 0° rimanendo a 10° per cui puoi sommare 90 al valore ottenuto e scrivere la formula come:

grado = (( sin(X) * 80 ) + 90 );

la cui variazione sarà 10° ….. 170° proprio quella che volevi ottenere per regolare l’andamento del servo.

Ho messo in un excel questa formula incrementando il valore di X di 0,5° ad ogni loop:

angolo sin(X) gradi
0,00 0,00 90,00
0,50 0,01 90,70
1,00 0,02 91,40
1,50 0,03 92,09
2,00 0,03 92,79
2,50 0,04 93,49
3,00 0,05 94,19
3,50 0,06 94,88
4,00 0,07 95,58
4,50 0,08 96,28
5,00 0,09 96,97
5,50 0,10 97,67
6,00 0,10 98,36
6,50 0,11 99,06
7,00 0,12 99,75
7,50 0,13 100,44
8,00 0,14 101,13
8,50 0,15 101,82
9,00 0,16 102,51
9,50 0,17 103,20
10,00 0,17 103,89
10,50 0,18 104,58
11,00 0,19 105,26
11,50 0,20 105,95
12,00 0,21 106,63
12,50 0,22 107,32
13,00 0,22 108,00
13,50 0,23 108,68
14,00 0,24 109,35
14,50 0,25 110,03
15,00 0,26 110,71
15,50 0,27 111,38
16,00 0,28 112,05
16,50 0,28 112,72
17,00 0,29 113,39
17,50 0,30 114,06
18,00 0,31 114,72
18,50 0,32 115,38
19,00 0,33 116,05
19,50 0,33 116,70
20,00 0,34 117,36
20,50 0,35 118,02
21,00 0,36 118,67
21,50 0,37 119,32
22,00 0,37 119,97
22,50 0,38 120,61
23,00 0,39 121,26
23,50 0,40 121,90
24,00 0,41 122,54
24,50 0,41 123,18
25,00 0,42 123,81
25,50 0,43 124,44
26,00 0,44 125,07
26,50 0,45 125,70
27,00 0,45 126,32
27,50 0,46 126,94
28,00 0,47 127,56
28,50 0,48 128,17
29,00 0,48 128,78
29,50 0,49 129,39
30,00 0,50 130,00
30,50 0,51 130,60
31,00 0,52 131,20
31,50 0,52 131,80
32,00 0,53 132,39
32,50 0,54 132,98
33,00 0,54 133,57
33,50 0,55 134,15
34,00 0,56 134,74
34,50 0,57 135,31
35,00 0,57 135,89
35,50 0,58 136,46
36,00 0,59 137,02
36,50 0,59 137,59
37,00 0,60 138,15
37,50 0,61 138,70
38,00 0,62 139,25
38,50 0,62 139,80
39,00 0,63 140,35
39,50 0,64 140,89
40,00 0,64 141,42
40,50 0,65 141,96
41,00 0,66 142,48
41,50 0,66 143,01
42,00 0,67 143,53
42,50 0,68 144,05
43,00 0,68 144,56
43,50 0,69 145,07
44,00 0,69 145,57
44,50 0,70 146,07
45,00 0,71 146,57
45,50 0,71 147,06
46,00 0,72 147,55
46,50 0,73 148,03
47,00 0,73 148,51
47,50 0,74 148,98
48,00 0,74 149,45
48,50 0,75 149,92
49,00 0,75 150,38
49,50 0,76 150,83
50,00 0,77 151,28
50,50 0,77 151,73
51,00 0,78 152,17
51,50 0,78 152,61
52,00 0,79 153,04
52,50 0,79 153,47
53,00 0,80 153,89
53,50 0,80 154,31
54,00 0,81 154,72
54,50 0,81 155,13
55,00 0,82 155,53
55,50 0,82 155,93
56,00 0,83 156,32
56,50 0,83 156,71
57,00 0,84 157,09
57,50 0,84 157,47
58,00 0,85 157,84
58,50 0,85 158,21
59,00 0,86 158,57
59,50 0,86 158,93
60,00 0,87 159,28
60,50 0,87 159,63
61,00 0,87 159,97
61,50 0,88 160,31
62,00 0,88 160,64
62,50 0,89 160,96
63,00 0,89 161,28
63,50 0,89 161,59
64,00 0,90 161,90
64,50 0,90 162,21
65,00 0,91 162,50
65,50 0,91 162,80
66,00 0,91 163,08
66,50 0,92 163,36
67,00 0,92 163,64
67,50 0,92 163,91
68,00 0,93 164,17
68,50 0,93 164,43
69,00 0,93 164,69
69,50 0,94 164,93
70,00 0,94 165,18
70,50 0,94 165,41
71,00 0,95 165,64
71,50 0,95 165,87
72,00 0,95 166,08
72,50 0,95 166,30
73,00 0,96 166,50
73,50 0,96 166,71
74,00 0,96 166,90
74,50 0,96 167,09
75,00 0,97 167,27
75,50 0,97 167,45
76,00 0,97 167,62
76,50 0,97 167,79
77,00 0,97 167,95
77,50 0,98 168,10
78,00 0,98 168,25
78,50 0,98 168,39
79,00 0,98 168,53
79,50 0,98 168,66
80,00 0,98 168,78
80,50 0,99 168,90
81,00 0,99 169,02
81,50 0,99 169,12
82,00 0,99 169,22
82,50 0,99 169,32
83,00 0,99 169,40
83,50 0,99 169,49
84,00 0,99 169,56
84,50 1,00 169,63
85,00 1,00 169,70
85,50 1,00 169,75
86,00 1,00 169,81
86,50 1,00 169,85
87,00 1,00 169,89
87,50 1,00 169,92
88,00 1,00 169,95
88,50 1,00 169,97
89,00 1,00 169,99
89,50 1,00 170,00
90,00 1,00 170,00
90,50 1,00 170,00
91,00 1,00 169,99
91,50 1,00 169,97
92,00 1,00 169,95
92,50 1,00 169,92
93,00 1,00 169,89
93,50 1,00 169,85
94,00 1,00 169,81
94,50 1,00 169,75
95,00 1,00 169,70
95,50 1,00 169,63
96,00 0,99 169,56
96,50 0,99 169,49
97,00 0,99 169,40
97,50 0,99 169,32
98,00 0,99 169,22
98,50 0,99 169,12
99,00 0,99 169,02
99,50 0,99 168,90
100,00 0,98 168,78
100,50 0,98 168,66
101,00 0,98 168,53
101,50 0,98 168,39
102,00 0,98 168,25
102,50 0,98 168,10
103,00 0,97 167,95
103,50 0,97 167,79
104,00 0,97 167,62
104,50 0,97 167,45
105,00 0,97 167,27
105,50 0,96 167,09
106,00 0,96 166,90
106,50 0,96 166,71
107,00 0,96 166,50
107,50 0,95 166,30
108,00 0,95 166,08
108,50 0,95 165,87
109,00 0,95 165,64
109,50 0,94 165,41
110,00 0,94 165,18
110,50 0,94 164,93
111,00 0,93 164,69
111,50 0,93 164,43
112,00 0,93 164,17
112,50 0,92 163,91
113,00 0,92 163,64
113,50 0,92 163,36
114,00 0,91 163,08
114,50 0,91 162,80
115,00 0,91 162,50
115,50 0,90 162,21
116,00 0,90 161,90
116,50 0,89 161,59
117,00 0,89 161,28
117,50 0,89 160,96
118,00 0,88 160,64
118,50 0,88 160,31
119,00 0,87 159,97
119,50 0,87 159,63
120,00 0,87 159,28
120,50 0,86 158,93
121,00 0,86 158,57
121,50 0,85 158,21
122,00 0,85 157,84
122,50 0,84 157,47
123,00 0,84 157,09
123,50 0,83 156,71
124,00 0,83 156,32
124,50 0,82 155,93
125,00 0,82 155,53
125,50 0,81 155,13
126,00 0,81 154,72
126,50 0,80 154,31
127,00 0,80 153,89
127,50 0,79 153,47
128,00 0,79 153,04
128,50 0,78 152,61
129,00 0,78 152,17
129,50 0,77 151,73
130,00 0,77 151,28
130,50 0,76 150,83
131,00 0,75 150,38
131,50 0,75 149,92
132,00 0,74 149,45
132,50 0,74 148,98
133,00 0,73 148,51
133,50 0,73 148,03
134,00 0,72 147,55
134,50 0,71 147,06
135,00 0,71 146,57
135,50 0,70 146,07
136,00 0,69 145,57
136,50 0,69 145,07
137,00 0,68 144,56
137,50 0,68 144,05
138,00 0,67 143,53
138,50 0,66 143,01
139,00 0,66 142,48
139,50 0,65 141,96
140,00 0,64 141,42
140,50 0,64 140,89
141,00 0,63 140,35
141,50 0,62 139,80
142,00 0,62 139,25
142,50 0,61 138,70
143,00 0,60 138,15
143,50 0,59 137,59
144,00 0,59 137,02
144,50 0,58 136,46
145,00 0,57 135,89
145,50 0,57 135,31
146,00 0,56 134,74
146,50 0,55 134,15
147,00 0,54 133,57
147,50 0,54 132,98
148,00 0,53 132,39
148,50 0,52 131,80
149,00 0,52 131,20
149,50 0,51 130,60
150,00 0,50 130,00
150,50 0,49 129,39
151,00 0,48 128,78
151,50 0,48 128,17
152,00 0,47 127,56
152,50 0,46 126,94
153,00 0,45 126,32
153,50 0,45 125,70
154,00 0,44 125,07
154,50 0,43 124,44
155,00 0,42 123,81
155,50 0,41 123,18
156,00 0,41 122,54
156,50 0,40 121,90
157,00 0,39 121,26
157,50 0,38 120,61
158,00 0,37 119,97
158,50 0,37 119,32
159,00 0,36 118,67
159,50 0,35 118,02
160,00 0,34 117,36
160,50 0,33 116,70
161,00 0,33 116,05
161,50 0,32 115,38
162,00 0,31 114,72
162,50 0,30 114,06
163,00 0,29 113,39
163,50 0,28 112,72
164,00 0,28 112,05
164,50 0,27 111,38
165,00 0,26 110,71
165,50 0,25 110,03
166,00 0,24 109,35
166,50 0,23 108,68
167,00 0,22 108,00
167,50 0,22 107,32
168,00 0,21 106,63
168,50 0,20 105,95
169,00 0,19 105,26
169,50 0,18 104,58
170,00 0,17 103,89
170,50 0,17 103,20
171,00 0,16 102,51
171,50 0,15 101,82
172,00 0,14 101,13
172,50 0,13 100,44
173,00 0,12 99,75
173,50 0,11 99,06
174,00 0,10 98,36
174,50 0,10 97,67
175,00 0,09 96,97
175,50 0,08 96,28
176,00 0,07 95,58
176,50 0,06 94,88
177,00 0,05 94,19
177,50 0,04 93,49
178,00 0,03 92,79
178,50 0,03 92,09
179,00 0,02 91,40
179,50 0,01 90,70
180,00 0,00 90,00
180,50 -0,01 89,30
181,00 -0,02 88,60
181,50 -0,03 87,91
182,00 -0,03 87,21
182,50 -0,04 86,51
183,00 -0,05 85,81
183,50 -0,06 85,12
184,00 -0,07 84,42
184,50 -0,08 83,72
185,00 -0,09 83,03
185,50 -0,10 82,33
186,00 -0,10 81,64
186,50 -0,11 80,94
187,00 -0,12 80,25
187,50 -0,13 79,56
188,00 -0,14 78,87
188,50 -0,15 78,18
189,00 -0,16 77,49
189,50 -0,17 76,80
190,00 -0,17 76,11
190,50 -0,18 75,42
191,00 -0,19 74,74
191,50 -0,20 74,05
192,00 -0,21 73,37
192,50 -0,22 72,68
193,00 -0,22 72,00
193,50 -0,23 71,32
194,00 -0,24 70,65
194,50 -0,25 69,97
195,00 -0,26 69,29
195,50 -0,27 68,62
196,00 -0,28 67,95
196,50 -0,28 67,28
197,00 -0,29 66,61
197,50 -0,30 65,94
198,00 -0,31 65,28
198,50 -0,32 64,62
199,00 -0,33 63,95
199,50 -0,33 63,30
200,00 -0,34 62,64
200,50 -0,35 61,98
201,00 -0,36 61,33
201,50 -0,37 60,68
202,00 -0,37 60,03
202,50 -0,38 59,39
203,00 -0,39 58,74
203,50 -0,40 58,10
204,00 -0,41 57,46
204,50 -0,41 56,82
205,00 -0,42 56,19
205,50 -0,43 55,56
206,00 -0,44 54,93
206,50 -0,45 54,30
207,00 -0,45 53,68
207,50 -0,46 53,06
208,00 -0,47 52,44
208,50 -0,48 51,83
209,00 -0,48 51,22
209,50 -0,49 50,61
210,00 -0,50 50,00
210,50 -0,51 49,40
211,00 -0,52 48,80
211,50 -0,52 48,20
212,00 -0,53 47,61
212,50 -0,54 47,02
213,00 -0,54 46,43
213,50 -0,55 45,85
214,00 -0,56 45,26
214,50 -0,57 44,69
215,00 -0,57 44,11
215,50 -0,58 43,54
216,00 -0,59 42,98
216,50 -0,59 42,41
217,00 -0,60 41,85
217,50 -0,61 41,30
218,00 -0,62 40,75
218,50 -0,62 40,20
219,00 -0,63 39,65
219,50 -0,64 39,11
220,00 -0,64 38,58
220,50 -0,65 38,04
221,00 -0,66 37,52
221,50 -0,66 36,99
222,00 -0,67 36,47
222,50 -0,68 35,95
223,00 -0,68 35,44
223,50 -0,69 34,93
224,00 -0,69 34,43
224,50 -0,70 33,93
225,00 -0,71 33,43
225,50 -0,71 32,94
226,00 -0,72 32,45
226,50 -0,73 31,97
227,00 -0,73 31,49
227,50 -0,74 31,02
228,00 -0,74 30,55
228,50 -0,75 30,08
229,00 -0,75 29,62
229,50 -0,76 29,17
230,00 -0,77 28,72
230,50 -0,77 28,27
231,00 -0,78 27,83
231,50 -0,78 27,39
232,00 -0,79 26,96
232,50 -0,79 26,53
233,00 -0,80 26,11
233,50 -0,80 25,69
234,00 -0,81 25,28
234,50 -0,81 24,87
235,00 -0,82 24,47
235,50 -0,82 24,07
236,00 -0,83 23,68
236,50 -0,83 23,29
237,00 -0,84 22,91
237,50 -0,84 22,53
238,00 -0,85 22,16
238,50 -0,85 21,79
239,00 -0,86 21,43
239,50 -0,86 21,07
240,00 -0,87 20,72
240,50 -0,87 20,37
241,00 -0,87 20,03
241,50 -0,88 19,69
242,00 -0,88 19,36
242,50 -0,89 19,04
243,00 -0,89 18,72
243,50 -0,89 18,41
244,00 -0,90 18,10
244,50 -0,90 17,79
245,00 -0,91 17,50
245,50 -0,91 17,20
246,00 -0,91 16,92
246,50 -0,92 16,64
247,00 -0,92 16,36
247,50 -0,92 16,09
248,00 -0,93 15,83
248,50 -0,93 15,57
249,00 -0,93 15,31
249,50 -0,94 15,07
250,00 -0,94 14,82
250,50 -0,94 14,59
251,00 -0,95 14,36
251,50 -0,95 14,13
252,00 -0,95 13,92
252,50 -0,95 13,70
253,00 -0,96 13,50
253,50 -0,96 13,29
254,00 -0,96 13,10
254,50 -0,96 12,91
255,00 -0,97 12,73
255,50 -0,97 12,55
256,00 -0,97 12,38
256,50 -0,97 12,21
257,00 -0,97 12,05
257,50 -0,98 11,90
258,00 -0,98 11,75
258,50 -0,98 11,61
259,00 -0,98 11,47
259,50 -0,98 11,34
260,00 -0,98 11,22
260,50 -0,99 11,10
261,00 -0,99 10,98
261,50 -0,99 10,88
262,00 -0,99 10,78
262,50 -0,99 10,68
263,00 -0,99 10,60
263,50 -0,99 10,51
264,00 -0,99 10,44
264,50 -1,00 10,37
265,00 -1,00 10,30
265,50 -1,00 10,25
266,00 -1,00 10,19
266,50 -1,00 10,15
267,00 -1,00 10,11
267,50 -1,00 10,08
268,00 -1,00 10,05
268,50 -1,00 10,03
269,00 -1,00 10,01
269,50 -1,00 10,00
270,00 -1,00 10,00

leggendo i valori ti sarai reso conto che l’ultima colonna passa da 90 a 170 a 10 gradi con un andamento che excel stesso mostra come:

andamento del servo

ho fatto anche test con valori differenti di incremento per rendere la variazione dell’andamento del servo più o meno veloce, ottenendo variazioni della sinusoide in frequenza, trovi un’utile spiegazione dei fenomeni che interessano l’andamento della sinusoide su wikipedia.

Lo sketch

per complicarti un po la vita ho realizzato uno sketch in cui la variazione dell’incremento di X è regolata da un potenziometro, al variare del valore letto sulpin analogico A5 ( 0-1023 ) fai variare il valore moltiplicatore da 0 a 8:

#include <Servo.h>

#define pinServo 3
#define rad2grad 57.295779513

float angolo = 0;
double sen   = 0;
float grado  = 0;
int pinPot   = A5;

Servo servoA;

void setup() {
  Serial.begin( 9600 );
  Serial.println( " ------------------ Avvio ------------------------" );

  pinMode( pinPot, INPUT );
  digitalWrite( pinPot, LOW );

  servoA.attach( pinServo );
  servoA.write( grado );
}

void loop() {

  int pot = ( analogRead( pinPot ) / 127 );

  Serial.print( "Potenziometro: " );
  Serial.print( pot );

  Serial.print( "angoloK: " );
  Serial.print( angolo );

  sen = sin( (angolo/rad2grad) );

  Serial.print( " sin(K): " );
  Serial.print( sen );

  grado = (( sen * 80 ) + 90 );

  Serial.print( " grado: " );
  Serial.println( grado );

  servoA.write( grado );

  angolo = (angolo + pot );
}

lo sketch è semplice, se hai bisogno di chiarimenti sul funzionamento commenta l’articolo.

Tuttavia voglio fare una precisazione all’uso della funzione sin(X) in quanto X deve essere specificato in radianti e non in gradi, per cui devi convertire gradi in radianti prima di passarli alla funzione sin().

La costante di conversione è:

57.295779513

che imposti alla linea 04 come rad2grad;

linea 26: rimappi il valore letto su A5 nel fattore di incremnto da 0 a 8, infatti 1023 /127 = 8…. arrotondato ad 8 essendo pot una variabile integer ( intero );

linea 34: calcoli il valore dell’angolo da gradi in radianti dividendo i gradi per la costante di conversione;

linea 46: ricalcoli il valore dell’angolo ( in gradi ) sommando il valore precedente con il valore calcolato alla linea 26.

Il video dell’andamento del servo

Per darti meglio l’idea di cosa significa tutto questo ho realizzato il seguente video:

in cui vedi che il valore di moltiplicazione passa da 0 a 8 mentre io ruoto il potenziometro con un momento di pausa quando il fattore di incremento vale 4.

Buon lavoro !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/andamento-del-servo.html

28 pings

Skip to comment form

  1. […] Una settimana prima avevamo pubblicato, sullo stesso sito, l’articolo con il codice  che rende armonico il movimento di un servo e sul quale sto ancora lavorando con lo scopo di realizzare uno sketch in grado do dare a tutta la mano un movimento armonico. […]

  2. […] ottenere i servo con movimento armonico puoi partire dalla teoria descritta in questo articolo e proseguire la lettura di questo articolo in cui oltre ad un singolo servo ne aggiungi 4, so che […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.