domenica 14 maggio 2017

Controllo mBot, inseguimento linea nera



Il nostro progetto è quello del line follower, ovvero fare in modo che il robottino segua una linea nera.

Il line follower sfrutta questi due sensori dell’mBot:
 
Essi lavorano con un led che emana raggi infrarossi e in base a quanti ne ritornato al fotodiodo capiscono se la superficie sottostante è nera o bianca, in quanto una superficie chiara fa ritornare tanti raggi quanti glie ne arrivano, mentre una superficie scura fa ritornare una quantità minima di raggi rispetto a quelli che gli sono arrivati:
 


 
Il nostro programma è il seguente:
 
 
Che tradotto in linguaggio 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
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

#include <MeMCore.h>

MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
void move(int direction, int speed)
{
     int leftSpeed = 0;
     int rightSpeed = 0;
     if(direction == 1){
        leftSpeed = speed;
        rightSpeed = speed;
     }else if(direction == 2){
        leftSpeed = -speed;
        rightSpeed = -speed;
     }else if(direction == 3){
        leftSpeed = -speed;
        rightSpeed = speed;
     }else if(direction == 4){
        leftSpeed = speed;
        rightSpeed = -speed;
     }
     motor_9.run((9)==M1?-(leftSpeed):(leftSpeed));
     motor_10.run((10)==M1?-(rightSpeed):(rightSpeed));
}
double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
double speed;
double temp;
MeLineFollower linefollower_1(1);

void setup(){
   speed = 150;
}

void loop(){
   temp = linefollower_1.readSensors();
   if(((temp)==(0  ))){
       move(2,speed);
   }else{
       if(((temp)==(1 ))){
           move(3,speed);
       }else{
           if(((temp)==(2 ))){
               move(4,speed);
           }else{
               move(1,speed);
           }
       }
   }
   _loop();
}

void _delay(float seconds){
   long endTime = millis() + seconds * 1000;
   while(millis() < endTime)_loop();
}

void _loop(){
}






 

Nessun commento:

Posta un commento