#include <Servo.h>Ao declarar os pinos 7..0 como inputs com pull-ups ligados, o estado por omissão deles é 1.
#define LEFT_MIN 94
#define LEFT_MAX 124
#define RIGHT_MIN 89
#define RIGHT_MAX 59
Servo left_servo, right_servo;
unsigned short int left_mod, right_mod;
boolean lastseen_left, lastseen_right;
byte lista_validade[36] = {
B00001000, // 8
B00000100, // 4
B00001100, // 12
B00000010, // 2
B00000110, // 6
B00001110, // 14
B00000001, // 1
B00000011, // 3
B00000111, // 7
B00001111, // 15
B00010000, // 16
B00010001, // 17
B00010011, // 19
B00010111, // 23
B00011111, // 31
B00100000, // 32
B00110000, // 48
B00110001, // 49
B00110011, // 51
B00110111, // 55
B00111111, // 63
B01000000, // 64
B01100000, // 96
B01110000, // 112
B01110001, // 113
B01110011, // 115
B01110111, // 119
B01111111, // 127
B10000000, // 128
B11000000, // 192
B11100000, // 224
B11110000, // 240
B11110001, // 241
B11110011, // 243
B11110111, // 247
B11111111, // 255
};
boolean verif_linha(byte leitura){
boolean validade = false;
for(short int k = 0; k < 37; k++){
if(leitura == lista_validade[k]){
validade = true;
break;
}
}
return(validade);
}
void setup(){
left_servo.attach(9);
right_servo.attach(10);
DDRD = 0; // portas 7..0 como inputs, aqui ligarei os 8 sensores.
PORTD = 0xFF; // pull-ups das portas 7..0 ligados. 0xFF = 255 = B11111111
for(short int i = 0; i < 31; i++){ // os motores vão arrancar gradualmente, com muita suavidade...
left_servo.write(LEFT_MIN + i);
right_servo.write(RIGHT_MIN - i);
delay(10);
}
}
void loop(){
if(verif_linha(PIND)){
left_mod = (PIND >> 4);
right_mod = (0x0F & PIND);
(left_mod > right_mod ? lastseen_left = true : lastseen_left = false);
(right_mod > left_mod ? lastseen_right = true : lastseen_right = false);
left_servo.write(LEFT_MAX - left_mod);
right_servo.write(RIGHT_MAX + right_mod);
delay(10);
}
else{
if(lastseen_left){ // se a linha tiver sido vista pla última vez à esquerda
do{
left_servo.write(LEFT_MAX - 15); // virar à esquerda
right_servo.write(RIGHT_MAX);
delay(10);
}while(!verif_linha(PIND)); // até obter uma "linha" válida
}
else if(lastseen_right){
do{
left_servo.write(LEFT_MAX);
right_servo.write(RIGHT_MAX + 15);
delay(10);
}while(!verif_linha(PIND));
}else{
do{ // se a "linha" não é válida (cruzamentos),
left_servo.write(LEFT_MAX); // e se a linha não foi vista nem à esquerda nem à direita,
right_servo.write(RIGHT_MAX); // então está no meio!!! PREGO A FUNDO!!!
delay(10);
}while(!PIND);
}
}
}
PIND | 0b10101100 | |
0x0F | &_ | 0b00001111 |
right_mod | 0b00001100 |
Vel. mínima | Vel. máxima | |
Motor esquerdo | 94 | 124 |
Motor direito | 89 | 59 |
Possíveis representações da linha na superfície: 0b00000001 1 0b00000010 2 0b00000011 3 0b00000100 4 0b00000110 6 0b00000111 7 0b00001000 8 0b00001100 12 0b00001110 14 0b00001111 15 0b00010000 16 0b00011000 24 0b00011100 28 0b00011110 30 0b00011111 31 0b00100000 32 0b00110000 48 0b00111000 56 0b00111100 60 0b00111110 62 0b00111111 63 0b01000000 64 0b01100000 96 0b01110000 112 0b01111000 120 0b01111100 124 0b01111110 126 0b01111111 127 0b10000000 128 0b11000000 192 0b11100000 224 0b11110000 240 0b11111000 248 0b11111100 252 0b11111110 254 0b11111111 255 | Representação lógica nos sensores (4 bits da direita invertidos): 0b00001000 8 0b00000100 4 0b00001100 12 0b00000010 2 0b00000110 6 0b00001110 14 0b00000001 1 0b00000011 3 0b00000111 7 0b00001111 15 0b00010000 16 0b00010001 17 0b00010011 19 0b00010111 23 0b00011111 31 0b00100000 32 0b00110000 48 0b00110001 49 0b00110011 51 0b00110111 55 0b00111111 63 0b01000000 64 0b01100000 96 0b01110000 112 0b01110001 113 0b01110011 115 0b01110111 119 0b01111111 127 0b10000000 128 0b11000000 192 0b11100000 224 0b11110000 240 0b11110001 241 0b11110011 243 0b11110111 247 0b11111111 255 |
boolean verif_linha(byte leitura){
boolean validade = false;
for(int k = 0; k < 37; k++){
if(leitura == lista_validade[k]){
validade = true;
break;
}
}
return(validade);
}
Mas o código foi feito de uma vez e ainda não está testado. Tenho andado atarefado com a "estrutura" do robô.Também ainda não testei o meu, já tenho a estrutura toda completa, foi o que me deu mais gozo fazer :D
INPUT (EMITTER) | TEST CONDITION | SYMBOL | TYP. | MAX. | UNIT |
Forward voltage | IF = 60 mA | VF | 1.25 | 1.5 | V |