Arduino controllo motori robot

Da raspibo.
Versione del 12 feb 2016 alle 18:55 di Dancast78 (discussione | contributi) (Creata pagina con '= Introduzione = Su questa pagina un semplice codice da caricare su arduino per il controllo di due motori in corrente continua. E' stata appositamente creata per il robot = ...')
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Jump to navigation Jump to search

Introduzione

Su questa pagina un semplice codice da caricare su arduino per il controllo di due motori in corrente continua.

E' stata appositamente creata per il robot = Introduzione = Questa pagina descrive un generico server web su ESP8266 che può gestire eventi touch provenienti da un telefono o un tablet.

E' stata appositamente creata per il robot Ruschino WiFi, ma ha una più ampia possibilità di utilizzo., ma ha una più ampia possibilità di utilizzo.

Codice arduino

Il programma di arduino è abbastanza semplice, si tratta sostanzialmente di generare due segnali pwm in base alla decodifica della stringa passata dal modulo wifi.

Una stringa di controllo deve essere mandata sulla porta seriale, sul robot Ruschino WiFi questa funzione viene svolta dal modulo ESP8266 attraverso il codice ESP8266 Web server touch.

La stringa ha questo formato:

R=255&l=255&D=0&d=1&E=0&e=0
R=potenza del motore destro da 0 a 255
l=potenza del motore destro da 0 a 255
D=direzione del motore destro 0 o 1 
d=direzione del motore sinistro 0 o 1 
E=variabile predisposta per ampliamenti 
e=variabile predisposta per ampliamenti 

Dopo aver decodificato la stringa precedente il robot girera su se stesso a tutta potenza.

 String comando;
 int en12=9;
 int en34=10;
 int dir12=4;
 int dir34=5;
 int board=1;
 int out_bridge_n=0;
 int incomingByte = 0;
 int s_speed_sx=0;
 int s_speed_dx=0;
 boolean direction_sx=0;
 boolean direction_dx=0;
 boolean enable_sx=0; //non utilizzato
 boolean enable_dx=0; //non utilizzato
 int command_name;
 int position;
 char cmd;
 // Calculate based on max input size expected for one command
 #define INPUT_SIZE 30
 void motor_drive(int out_bridge, boolean dir, int speed) {
  if (out_bridge == 34) {
    digitalWrite(dir34, dir);
    analogWrite(en34, speed);  
  } 
  else if (out_bridge == 12) {
    digitalWrite(dir12, dir);
    analogWrite(en12, speed);
  }  
 }  
 void setup() {
  Serial.begin(115200); 
  pinMode(en12, OUTPUT);
  pinMode(dir12, OUTPUT);
  pinMode(en34, OUTPUT);
  pinMode(dir34, OUTPUT); 
  Serial.println("Start");
 }
 void loop() {
  if (Serial.available() > 0) {
    char input[INPUT_SIZE + 1];
    byte size = Serial.readBytes(input, INPUT_SIZE);
    input[size] = 0;
    char* command = strtok(input, "&");
    while (command != 0)
    {
      char* command_value = strchr(command, '=');
      if (command_value != 0)
      {
        *command_value = 0;
        command_name = command[0];
        ++command_value;
        position = atoi(command_value);
      }
      command = strtok(0, "&");
      switch(command_name) {
      case 'l':
        s_speed_sx=position;
        break;
      case 'R':
        s_speed_dx=position;
        break;  
      case 'D':
        direction_dx=position;
        break;
      case 'd':
        direction_sx=position;
        break;  
      case 'E':
        enable_dx=position;
        break;
      case 'e':
        enable_sx=position;
        break;  
      }  
    }
   motor_drive(34,direction_sx,s_speed_sx);
   motor_drive(12,direction_dx,s_speed_dx); 
  }
 }