Blame view

PercTeacher/Sources/Robot/robot.c 2.36 KB
7d329109   pifou   PercTeacher progr...
1
2
3
4
  #include <avr/io.h>
  #include <util/delay.h>
  
  #define SERIAL_BAUDE_RATE 9600
6a806062   pfrison   PercTeacher test ...
5
  #define DELAI_STEP 2
3fcb1d7b   pfrison   update robot code...
6
7
8
9
  #define STEP_MOTEUR_GAUCHE 0x00 // pin ??
  #define STEP_MOTEUR_DROIT 0x00 // pin ??
  #define DIR_MOTEUR_GAUCHE 0x00 // pin ??
  #define DIR_MOTEUR_DROIT 0x00 // pin ??
7d329109   pifou   PercTeacher progr...
10
  
6601d4de   pfrison   Test moteurs sur ...
11
12
  #define CPU_FREQ 16000000L
  
7d329109   pifou   PercTeacher progr...
13
14
  //gestion des moteurs
  void init_pins(void){
3fcb1d7b   pfrison   update robot code...
15
      DDRB = STEP_MOTEUR_GAUCHE | STEP_MOTEUR_DROIT | DIR_MOTEUR_GAUCHE | DIR_MOTEUR_DROIT;
7d329109   pifou   PercTeacher progr...
16
17
  }
  
6a806062   pfrison   PercTeacher test ...
18
  void pas_moteur(int g, int d){
3fcb1d7b   pfrison   update robot code...
19
20
21
22
      if (g != 0)
          PORTB |= STEP_MOTEUR_GAUCHE;
      if (d != 0)
          PORTB |= STEP_MOTEUR_DROIT;
6a806062   pfrison   PercTeacher test ...
23
      _delay_ms(DELAI_STEP);
3fcb1d7b   pfrison   update robot code...
24
25
26
27
      if (g != 0)
          PORTB &= ~STEP_MOTEUR_GAUCHE;
      if (d != 0)
          PORTB &= ~STEP_MOTEUR_DROIT;
6a806062   pfrison   PercTeacher test ...
28
      _delay_ms(DELAI_STEP);
7d329109   pifou   PercTeacher progr...
29
30
  }
  
3fcb1d7b   pfrison   update robot code...
31
32
33
34
35
36
37
38
39
40
41
  void moteur_set_dir(int g, int d){
  	if(g != 0)
          PORTB |= DIR_MOTEUR_GAUCHE;
  	else
          PORTB &= ~DIR_MOTEUR_GAUCHE;
  	if(d != 0)
          PORTB |= DIR_MOTEUR_DROIT;
  	else
          PORTB &= ~DIR_MOTEUR_DROIT;
  }
  
7d329109   pifou   PercTeacher progr...
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
  //gestion de la liaison serie
  void init_serial(int speed){
      UBRR0 = CPU_FREQ / (((unsigned long int) speed) << 4) - 1; //Set baud rate
      UCSR0B = (1 << TXEN0 | 1 << RXEN0); //Enable transmitter & receiver
      UCSR0C = (1 << UCSZ01 | 1 << UCSZ00); //Set 8 bits character and 1 stop bit
      UCSR0A &= ~(1 << U2X0); //Set off UART baud doubler
  }
  
  void send_serial(unsigned char c){
      loop_until_bit_is_set(UCSR0A, UDRE0);
      UDR0 = c;
  }
  
  unsigned char get_serial(void){
      loop_until_bit_is_set(UCSR0A, RXC0);
      return UDR0;
  }
  
  int main(void){
      init_pins();
      init_serial(SERIAL_BAUDE_RATE);
  
      while(1){
          unsigned char deltaL1 = get_serial();
          unsigned char deltaL2 = get_serial();
          unsigned char deltaR1 = get_serial();
          unsigned char deltaR2 = get_serial();
3fcb1d7b   pfrison   update robot code...
69
  		
7d329109   pifou   PercTeacher progr...
70
          // conversion 2x8 bits => 16 bits
3fcb1d7b   pfrison   update robot code...
71
72
73
74
75
76
77
          uint16_t deltaL = (deltaL1 << 8) + deltaL2;
          uint16_t deltaR = (deltaR1 << 8) + deltaR2;
  		
  		// sens rotation
  		moteur_set_dir((deltaL & 0x80) == 0x80 ? 1 : 0, (deltaR & 0x80) == 0x80 ? 1 : 0)
  		deltaL &= 0x7F;
  		deltaR &= 0x7F;
7d329109   pifou   PercTeacher progr...
78
          
3fcb1d7b   pfrison   update robot code...
79
80
          uint16_t deltaMax = deltaL > deltaR ? deltaL : deltaR;
          for(uint16_t i=0; i<deltaMax; i++){
6a806062   pfrison   PercTeacher test ...
81
82
83
84
85
86
              if(deltaL > i && deltaR > i)
                  pas_moteur(1, 1);
              else if(deltaL > i)
                  pas_moteur(1, 0);
              else if(deltaR > i)
                  pas_moteur(0, 1);
7d329109   pifou   PercTeacher progr...
87
          }
3fcb1d7b   pfrison   update robot code...
88
89
  		
  		send_serial(0x01);
7d329109   pifou   PercTeacher progr...
90
91
92
      }
      return 0;
  }