aumentare diminuire velocità motore dc

stato1 è sempre a 1 per questo esegue il ciclo for

Questo codice dovrebbe muovere nella direzione opposta al sensore attivo quando incontra
uno ostacolo

se scrivi nel codice:

#define debug

puoi simulare gli switch(sensori) e verificare se va nella direzione giusta

#define vai_indietro B00010000 // setta a '1' PD4 , ovvero pin 47
#define vai_avanti B00001000 // setta a '1' PD3 , ovvero pin 46

qui c'e scritto che PD4 ( leggendo PD0 da destra) configura dir per andare indietro. Verifica che non sia
l'opposto.
Comunque il codice è commentato, vedi un pò se ti puo servire

  #define pwm_1 3
  #define pwm_2 2                 
  
  #define dir_2 47  // PORTA D
  #define dir_1 46  // PORTA D

  #define ant1 23     //PORTA B    sensore anteriore
  #define post1 22    // PORTA B   sensore posteriore

  #define vai_indietro B00010000  // setta a '1' PD4 , ovvero pin 47
  #define vai_avanti   B00001000  // setta a '1' PD3 , ovvero pin 46
  
 
  int val1 = 0;  // legge lo stato del sensore anteriore
  int val3 = 0;  // legge lo stato del sensore posteriore
   
  byte speed = 80;
  int pwm_value=0;
 
  void setup() { 
    Serial.begin(9600);
    pinMode(ant1, INPUT);
    pinMode(post1, INPUT);
    pinMode(pwm_1,OUTPUT);
    pinMode(dir_1,OUTPUT);
    pinMode(pwm_2,OUTPUT);
    pinMode(dir_2,OUTPUT);
  
  } 

/*
 * COMMENTARE '#define debug'  QUANDO SI PROVA IL ROBOT
 */

//  #define debug
    
  void loop()
  { 
    byte dirMask=B00011000;  
    byte dir;  
    
    val1 = digitalRead(ant1); // HIGH = sensore non attivo , LOW = sensore attivo ( switch premuto)
    val3 = digitalRead (post1); // HIGH = sensore non attivo , LOW = sensore attivo ( switch premuto)

 #ifdef debug
    int v1 =LOW;   // Simula lo switch anteriore premuto (attivo)
    int v3 =HIGH;  // Simula lo switch posteriore Non premuto ( Non attivo)
    val1 = v1;
    val3 = v3;
 #endif
    
    
   if (val1 ^ val3)  // la condizione è vera solo se uno dei due sensori è attivo ( LOW = 0 volts = switch chiuso ). Se entrambi sono HIGH oppure entrambi sono LOW , la condizione è falsa.
                 // per cui se il robottino è chiuso davanti e dietro , rimmarà fermo e non eseguirà quindi il ciclo for.
    {
      delay(1000); 
      
      if (val1==LOW) dir = vai_indietro;  // Se è stato il sensore val1 ad attivarsi allora configura la scheda motore per andare indietro ( verificare che non sia l'incontrario..)
      if (val3==LOW) dir = vai_avanti;    // Se è stato il sensore val3 ad attivarsi allora configura la scheda motore per andare avanti ( verificare che non sia l'incontrario..)

      PORTD = (PORTD &~dirMask) | dir;  // setta a 1 ( HIGH ) il bit corrispondente e quindi il bit della direzione (dir) desiderata. Solo un pin per volta è HIGH 

      Serial.print("PORTD "); Serial.println(PORTD);   // debug, visualizza quali bit (in decimale) ha settato per determinare la direzione ( verificare che siano quelli giusti)
      
     for (pwm_value=0; pwm_value<speed; pwm_value=pwm_value+5)  // Esegue un ciclo di pwm come da codice originale
     {
        analogWrite(pwm_2,pwm_value);
        analogWrite(pwm_1,pwm_value);
        delay(100);
     }
    }  // a questo punto il sensore attivo si sarà disattivato ( a meno che non sia rotto) rendendo la condizione di cui sopra , falsa impedendo il ripetersi del ciclo for.
  }