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.
}