(ricordare di non far fare al robot movimenti bruschi: prima di passare da avanti a dietro, fermare i motori, etc) 0) Tracciare lo schema del robot 1) tarare i motori in modo che il robot vada il piu' possibile diritto 2) Definire delle funzioni: void goForward(int vL, int vR, int time); void goBackward(int vL, int vR, int time); void rotateRight(int vL, int vR, int time); void rotateLeft(int vL, int vR, int time); void stopMotors(); che governino il movimento del robot e in modo tale che: i) se time > 0, la funzione fa effettuare al robot il movimento per "time" secondi prima di tornare al chiamante ii) se time == 0, la funzione imposta i valori che permettono il movimento, e poi torna subito iii) vL e vR siano le velocita' per il motore di sinistra e destra rispettivamente Esempio (incompleto) // go forward void goForward(int vL, int vR, int time) { digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); analogWrite(ENA,vL); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); analogWrite(ENB,vR); ... delay(time*1000); ... } 3) Stabilire velocità pwm e tempo per una rotazione di un angolo di 90° a dx e sx; definire due funzioni che facciano ruotare il robot di 90° a dx e sx: void rotateRight90deg() void rotateLeft90deg() Usare le funzioni scritte in precedenza. 4) stabilire velocità pwm e tempo perche' il robot vada avanti (indietro) per un metro; definire delle funzioni chiamate void goForwardDistance(float distance) void goBackwardDistance(float distance) che facciano avanzare il robot per una distanza data in metri Usare le funzioni scritte in precedenza. 5) Realizzare una "coreografia": il robot va avanti per un metro, gira su se stesso due volte verso dx, poi una volta verso sinistra, ruoti 90° a dx, torni indietro... 6) Quanto e' riproducibile il moto del robot? Preparare un programma che faccia fare al robot un quadrato e vedere se torna alla posizione di partenza. 7) Come possiamo far compiere al robot una circonferenza di raggio "abbastanza" grande (per esempio, 50cm circa)? 8) Montare un sensore HC-SR04 in posizione centrale. Realizzare un software che governi il robot in modo che eviti gli ostacoli. Usare il piu' possibile delle funzioni. Suggerimenti: se l'ostacolo e' "vicino", il robot si ferma, torna eventualmente un po' indietro, ruota un po' (per esempio a destra), ricontrolla... quando non c'e' piu' l'ostacolo, il robot riprende ad avanzare. 9) Come in 8, pero' il robot sceglie a caso la direzione in cui girare. 10) Come in 8, pero' quando vedo l'ostacolo aspetto un po' nel caso l'ostacolo si tolga e, solo se dopo un paio di secondi l'ostacolo e' ancora presente, mi comporto come in 8. 11) tre sensori, decidere la strategia 12) Comportamento misto: (1) esploratore: gira evitando gli ostacoli (in futuro potra' anche per esempio seguire la luce), comportamento seguito per un tempo casuale, poi passa al comportamento 2; (2) Alla ricerca di un posto comodo: siccome il robot ama gli spazi aperti, gira intorno a se stesso per un paio di secondi: se non trova ostacoli a meno di 30-50 cm, si ferma e passa allo stato 3; se trova ostacoli, si muove in una direzione a caso per due secondi e riprova; serve perche' nello stato 4 il robot vuole spazio per arretrare! (3) robot addormentato, fermo ma vigile (magari, con un cicalino, lo facciamo russare); se sente un ostacolo davanti a se', il robot si sveglia e si spaventa, e passa allo stato 4; (4) robot in fuga: arretra velocemente, poi gira in una direzione a caso e torna al comportamento 1; 13) aggiungere il lampeggiare del LED a frequenza bassa quando e' fermo, media quando esplora, alta quando vede un ostacolo e indietreggia 14) Uso della libreria NewPing, http://tech.endeepak.com/blog/2016/01/02/simple-obstacle-avoiding-robot-using-arduino/ paragrafo 2.2, e studiare/imitare il codice al paragrafo 2.3 15) integrazione con due sensori ir posteriori? 16) integrazione con fotocellule anteriori? 17) interfaccia con cellulare? 18) Seguire una parete