-
Notifications
You must be signed in to change notification settings - Fork 0
/
brake_bias.c
314 lines (269 loc) · 8.25 KB
/
brake_bias.c
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
//============================================================================
// Name : code brake bias.c
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Code of the brake bias
//============================================================================
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
// Funções para utilização do display de sete segmentos
// display exibe um percentual entre 30 e 70
// quando 30, distribuiçao 30-70(30 diant, 70 tras)
// quando 70, distribuiçao 70-30(70 diant, 30 tras)
//divisão entre o algarismo da unidade e da dezena do percentual
int unidade (float num){
int a = num;
int b = a%10;
return b;
}
int dezena (float num){
int a = num;
int b = a/10;
return b;
}
// Funções para o display da unidade
char fn_11 (float num){
int a = unidade (num);
int b = a%2;
if (b==1){
return '1';
} else {
return '0';
}
}
char fn_12 (float num){
int a = unidade (num);
if (a==2 || a==3 || a==6 || a==7){
return '1';
} else {
return '0';
}
}
char fn_13 (float num){
int a = unidade(num);
if (a==4 || a==5 || a==6 || a==7){
return '1';
}else{
return '0';
}
}
char fn_14 (float num) {
int a = unidade(num);
if (a==8 || a==9){
return '1';
} else {
return '0';
}
}
// Funções para o display da dezena
char fn_21 (float num){
int a = dezena (num);
int b = a%2;
if (b==1){
return '1';
} else {
return '0';
}
}
char fn_22 (float num){
int a = dezena (num);
if (a==2 || a==3 || a==6 || a==7){
return '1';
} else{
return '0';
}
}
char fn_23 (float num){
int a = dezena (num);
if (a==4|| a==5 || a==6 || a==7){
return '1';
}else{
return '0';
}
}
char fn_24 (float num) {
int a = dezena(num);
if (a==8 || a==9){
return '1';
} else {
return '0';
}
}
// Funções que recebem os sinais de ambos os potenciômetros e os comparam
// determinando o percentual de distr. tras/dir observado
int fun_ang (float num){
int a = num/409; // sinal analógico varia entre 0 e 4095
// esta operação garante que o controle não busque que ambos os sinais sejam exatamente iguais,
// apenas que estejam na mesma banda. A banda pode ser modificada alterando apenas esta operação
a = 30 + 4*a;
return a;
}
int fun_lin (float num){
int a = num/409;
a = 30 + 4*a;
return a;
}
// Função que gerencia a exibição do display de sete segmentos
int analog_to_bcd(float lin) {
char n_11[1], n_12[1], n_13[1], n_14[1], n_21[1], n_22[1], n_23[1], n_24[1];
n_11[0] = fn_11(lin);
n_12[0] = fn_12(lin);
n_13[0] = fn_13(lin);
n_14[0] = fn_14(lin);
n_21[0] = fn_21(lin);
n_22[0] = fn_22(lin);
n_23[0] = fn_23(lin);
n_24[0] = fn_24(lin);
FILE *bcd_11 = NULL;
FILE *bcd_12 = NULL;
FILE *bcd_13 = NULL;
FILE *bcd_14 = NULL;
FILE *bcd_21 = NULL;
FILE *bcd_22 = NULL;
FILE *bcd_23 = NULL;
FILE *bcd_24 = NULL;
bcd_11 = fopen("/sys/class/gpio/gpio30/value","w"); //P9.11
bcd_12 = fopen("/sys/class/gpio/gpio31/value","w"); //P9.13
bcd_13 = fopen("/sys/class/gpio/gpio48/value","w"); //P9.15
bcd_14 = fopen("/sys/class/gpio/gpio49/value","w"); //P9.23
bcd_21 = fopen("/sys/class/gpio/gpio60/value","w"); //P9.12
bcd_22 = fopen("/sys/class/gpio/gpio50/value","w"); //P9.14
bcd_23 = fopen("/sys/class/gpio/gpio51/value","w"); //P9.16
bcd_24 = fopen("/sys/class/gpio/gpio15/value","w"); //P9.24
fwrite (n_11, sizeof(char), 1, bcd_11);
fwrite (n_12, sizeof(char), 1, bcd_12);
fwrite (n_13, sizeof(char), 1, bcd_13);
fwrite (n_14, sizeof(char), 1, bcd_14);
fwrite (n_21, sizeof(char), 1, bcd_21);
fwrite (n_22, sizeof(char), 1, bcd_22);
fwrite (n_23, sizeof(char), 1, bcd_23);
fwrite (n_24, sizeof(char), 1, bcd_24);
usleep(10000);
fclose (bcd_11);
fclose (bcd_12);
fclose (bcd_13);
fclose (bcd_14);
fclose (bcd_21);
fclose (bcd_22);
fclose (bcd_23);
fclose (bcd_24);
return 0;
}
int main() {
/* //Configuração inicial dos pinos >> realizada em codigo próprio
// configurar entradas analógicas (necessita rodar como root)
system("echo BB-ADC > /sys/devices/platform/bone_capemgr/slots");
// habilitar portas do motor
system("echo 66 > /sys/class/gpio/export");
system("echo 67 > /sys/class/gpio/export");
system("echo 68 > /sys/class/gpio/export");
// habilitar portas do display
system("echo 30 > /sys/class/gpio/export");
system("echo 31 > /sys/class/gpio/export");
system("echo 48 > /sys/class/gpio/export");
system("echo 49 > /sys/class/gpio/export");
system("echo 60 > /sys/class/gpio/export");
system("echo 50 > /sys/class/gpio/export");
system("echo 51 > /sys/class/gpio/export");
system("echo 15 > /sys/class/gpio/export");
// configurando portas do motor como saídas
system("echo out > /sys/class/gpio/gpio66/direction");
system("echo out > /sys/class/gpio/gpio67/direction");
system("echo out > /sys/class/gpio/gpio68/direction");
system("echo 1 > /sys/class/gpio/gpio68/value"); // enable -> sempre definido como 1
// configurando portas do motor como saídas
system("echo out > /sys/class/gpio/gpio30/direction");
system("echo out > /sys/class/gpio/gpio31/direction");
system("echo out > /sys/class/gpio/gpio48/direction");
system("echo out > /sys/class/gpio/gpio49/direction");
system("echo out > /sys/class/gpio/gpio60/direction");
system("echo out > /sys/class/gpio/gpio50/direction");
system("echo out > /sys/class/gpio/gpio51/direction");
system("echo out > /sys/class/gpio/gpio15/direction");
*/
// FILE *export_file = NULL;
// inicialização das variáveis que guardarão os endereços
// das saídas digitais para o motor e das entradas analógicas
FILE *mot1 = NULL;
FILE *mot2 = NULL;
FILE *f_ang = NULL;
FILE *f_lin = NULL;
// sinais a serem gravados nos pinos de saída digitais
char on[] = "1";
char off[] = "0";
// sinais das entradas analógicas (char)
char c_ang[7];
char c_lin[7];
// variaveis que recebem as entradas convertidas de char para int
int s_ang;
int s_lin;
// Endereços dos pinos analogicos utilizados
//ground ADC ----------------------------------------------------------- P9.34
//vcc ADC -------------------------------------------------------------- P9.32
f_ang = fopen("/sys/bus/iio/devices/iio:device0/in_voltage1_raw", "r"); //P9.40
f_lin = fopen("/sys/bus/iio/devices/iio:device0/in_voltage0_raw", "r"); //P9.39
fread(c_ang, sizeof(char), 6, f_ang);
s_ang = strtol(c_ang,NULL,0); // converte char para int
fread(c_lin, sizeof(char), 6, f_lin);
s_lin = strtol(c_lin,NULL,0); // converte char para int
fclose(f_ang);
fclose(f_lin);
int ang = fun_ang(s_ang); //podem assumir valores entre 30 e 70
int lin = fun_lin(s_lin); //pode assumir valores entre 30 e 70
while (1!=0){ //loop de realização da tarefa
//leitura das entradas analógicas
f_ang = fopen("/sys/bus/iio/devices/iio:device0/in_voltage1_raw", "r");
fread(c_ang, sizeof(char), 6, f_ang);
s_ang = strtol(c_ang,NULL,0);
f_lin = fopen("/sys/bus/iio/devices/iio:device0/in_voltage0_raw", "r");
fread(c_lin, sizeof(char), 6, f_lin);
s_lin = strtol(c_lin,NULL,0);
ang = fun_ang(s_ang); //podem assumir valores entre 30 e 70
lin = fun_lin(s_lin); //pode assumir valores entre 30 e 70
printf("ang: %d lin %d \n", ang,lin); // para visualização em terminal
// atuação sobre o motor de acordo com a comparação entre as entradas
if (ang > lin){
mot1 = fopen("/sys/class/gpio/gpio66/value", "w"); // P8.7
mot2 = fopen("/sys/class/gpio/gpio67/value", "w"); // P8.8
// enabler = fopen("/sys/class/gpio/gpio68/value", "w"); // P8.10 --> sempre definido como 1
fwrite (off, sizeof(char), 1, mot1);
fwrite (on, sizeof(char), 1, mot2);
usleep(10000);
fclose(mot2);
fclose(mot1);
analog_to_bcd (lin);
}
else {
if (ang < lin){
mot1 = fopen("/sys/class/gpio/gpio66/value", "w");
mot2 = fopen("/sys/class/gpio/gpio67/value", "w");
fwrite (on, sizeof(char), 1, mot1);
fwrite (off, sizeof(char), 1, mot2);
usleep(10000);
fclose(mot2);
fclose(mot1);
analog_to_bcd (lin);
}
else {
if (ang == lin){
mot1 = fopen("/sys/class/gpio/gpio66/value", "w");
mot2 = fopen("/sys/class/gpio/gpio67/value", "w");
fwrite (off, sizeof(char), 1, mot1);
fwrite (off, sizeof(char), 1, mot2);
usleep(10000);
fclose(mot2);
fclose(mot1);
analog_to_bcd (lin);
}
}
}
fclose(f_ang);
fclose(f_lin);
}
fclose(f_ang);
fclose(f_lin);
fclose(mot2);
fclose(mot1);
}