Robot diffidente

Mi presento, sono Matteo e da quando ho scoperto arduino sono finalmente riuscito a fare qualche esperimento in questo campo che mi ha sempre affascinato. Le mie competenze in elettronica e programmazione sono molto modeste e autodidatte, nonostante questo sono riuscito a realizzare un robottino che segue la luce e rileva ostacoli tramite fotoresistenze ed ultrasuoni (provando,copiando,modificando etc aiutato anche da molti anni di aereomodellismo). Poi ho visto questo: http://www.gioblu.com/tutorials/robotica/220-un-robot-diffidente (ho usato il pde compound_3 fornito a fine pagina) Ho preso il compound eye,il tilt e pan e adattato il tutto al robottino. Quello che non riesco a fare, e qui chiedo l'aiuto di questo forum che leggo sempre, è modificare il programma per comandare non più i 2 servi a 360° ma i miei 2 motori con relativo LM239D (già collegato e operante). In particolare non capisco bene a cosa servono i vari fattori di scala presenti e come poter cambiare la parte di programma relativa alla quantità di movimento da inviare ai motori. Se qualcuno mi potesse fare da "Cicerone" attraverso il programma mi aiuterebbe molto. Grazie....

Se ci riesco ti posso dare una mano io. I fattori di scala servono per capire di quanto girare la testa del robottino. Il valore che viene restituito dal compound eye varia tra 0 e 1023, che è il range dell’adc. Questo valore si deve però trasformare in un valore in gradi del servo della testa che varia tra 0 e 180. Poichè in realtà i valori restituiti dal sensore compound eye, a seconda della distanza cui è posto l’oggetto variano tra 200 e 1000 con una curva adc-distanza che non è lineare, i fattori di scala che vedi sono stati scelti sperimentalmente per fare in modo che la testa non giri troppo o troppo poco ma possa seguire abbastanza fedelmente il movimento dell’oggetto che sta davanti. Aumentando il fattore di scala la testa oscilla mentre diminuendolo la testa resta indietro rispetto al movimento della mano.
Per poter usare dei motori dc invece dei servi la parte che devi modificare è questa:

 //-------------------------------------------------------------Turn body to follow object--------------------------------------------
    // se la testa si gira più di 60 gradi, gira anche il corpo - if the head turn more than 60 degrees, turn the body
    temp=LRmax-panOld;
    if (temp<60)
    {
      sSpeed=sMotorStop-50+temp/2;
      dSpeed=dMotorStop-50+temp/2;
    }
    temp=panOld-LRmin;
    if (temp<60)
    {
      dSpeed=dMotorStop+50-temp/2;
      sSpeed=sMotorStop+50-temp/2;
    }

    //------------------------------------------------------Move forward or backward to follow object------------------------------------
    // se l'oggetto è a distanza inferiore a quella bestdistance, muovi per tornare a quella distanza
    // if the object distance is less than bestdistance, move the robot to go again to the same distance
    temp=distance-bestdistance;
    temp=abs(temp);

    if (temp>10)
    {
      temp=temp-10;
      if (distance>bestdistance)
      {
        dSpeed=dSpeed-temp/3;
        sSpeed=sSpeed+temp/3;
      }
      else
      {
        dSpeed=dSpeed+temp/3;
        sSpeed=sSpeed-temp/3;
      }
    }
  }

anche qui i valori da dare ai servi sono ottenuti sperimentalmente facendo prove, riprovando quando girava troppo o troppo poco o quando andava troppo avanti o troppo indietro.

Grazie @alegiaco, adesso mi è più chiaro il discorso scala. Si poteva anche usare il comando map o non serve qui?

Per i motori dc: Quindi quel 50 e quel /2 in: sSpeed=sMotorStop-50+temp/2 sono valori trovati sperimentalmente,giusto? Questa quantità di movimento da inviare al motore dc (che prima era appunto sSpeed x il servo sx) come la posso quantificare? Richiamando dei void (tipo avanti, indietro, dx, sx etc) con dei delay ? O usando i millis(), che però ancora non gestisco bene? Farò qualche tentativo...

Grazie di nuovo,ciao.

Si può usare il map ma è più scomodo da usare per trovare la mappatura giusta. Un bel coefficiente è più semplice da modificare.
Per i motori ti puoi fare delle primitive (avanti, indietro etc) e le puoi calibrare con i delay. Mi sembra tu sia sulla buona strada.
Alla fine posta un bel video del robottino.

Grazie, ci sto provando e se il risultato mi soddisfa posto il video, sennò evito la brutta figura :blush:

ciao

Ce la devi fare assolutamente! Se non viene posta il listato che vediamo se riusciamo a migliorare qualcosa.

Ok sarà fatto!! XD

funziona!! Anche se ci sono alcune correzioni da fare XD

Se riesco oggi provo ad aggiungere anche il sensore ad ultrasuoni. Poi non ho più pin da usare.. :~ Come si possono espandere i pin? A parte comprare un MEGA....

ecco il video come promesso :

L’avanti e indietro che fa davanti al divano blu lo fa solo là perchè per es. con la gamba o la mano si posiziona alla sua distanza e sta buono là.

Ho messo tutti i delay per le routine dei motori a 1 altrimenti era tutto bloccato.
Mi piacerebbe aumentare la reattività della testa…

Ciao,Matteo

Complimenti! funziona bene. bravo, per aumentare la reattività della testa perchè non smanetti un po' con la parte di codice che la gestisce? suggerimento: modifica i delay.

Grasssie XD delay nel controllo della testa non ce ne sono se non per l'accensione e spegnimento IR per il controllo radiazione di fondo e sono dell'ordine dei 2-5 millisecondi. Forse provando invece con i vari fattori di scala...

Domanda: prendendo un paio di 328 (noP) e collegandoli tramite I2c riesco ad aumentare i pin a disposizione per aggiungere utrasuoni (ne ho 2 quindi sono 4 pin digitali) e display lcd (ne ho 1 16x2 ) o altro? Oppure cosa mi serve?

prova a usare 10 millisecondi nei delay dell'IR.

Per i pin... adesso da qui non vedo i video, quindi non so se tutti i pin analogici sono occupati, ma puoi utilizzare anche quelli come fossero pin digitali in ingresso

solo gli IR occupano 4 pin analogici... in ogni caso la domanda è anche per sapere fin dove si può arrivare senza passare al mega o altro e soprattutto come si fa. Ho visto che nella guida di Menniti come si preparano i 328 per l'utilizzo ma poi devo ancora arrivare a come li utilizzo tutti assieme, non stand alone.

Anche io ho finito i pin della UNO e stavo documentandomi sulla comunicazione I2C. Già uso un PCF8574 per l'LCD e ne vorrei mettere più di uno (di PCF8574N mi sembra se ne possano mettere fino ad 8).

Con 8 PCF8574N puoi arrivare a 64 pin. Per il momento sono arrivato fino a qui....devo studiare ancora anche se mi sembra che non sia difficilissimo, bisogna però prendere dimestichezza con i byte e gli esadecimali che in questo momento non ho quindi non ti posso aiutare più di tanto. Anzi magari su questo tu potresti aiutare me :)

Credo tu sia un passo avanti a me perchè non ho ancora provato altri integrati e come te sono a digiuno di byte & C. Ho ancora lavoro da fare davanti... Sicuramente comunque il forum è una miniera di info, il problema è poi capirle XD XD !! Ma ci proviamo....un gradino alla volta, compatibilmente con il tempo a disposizione. 8)

La mia domanda è ma si può comandare 1 o più 328 da arduino uno tramite I2C senza altri integrati in mezzo? Cioè creando una specie di rete?

MatteoG: Domanda: prendendo un paio di 328 (noP)

Risposta: No! E' già venuto fuori che l'uso di quel micro con il software di Arduino è problematico. Lascia perdere.

MatteoG: La mia domanda è ma si può comandare 1 o più 328 da arduino uno tramite I2C senza altri integrati in mezzo? Cioè creando una specie di rete?

Sicuramente. Io già lo faccio: uso un 328 che gestisce una stazioncina meteo che dialoga con un Tiny84 che gestisce un LCD

Ok, quindi niente 328np... :~ La mia incompetenza è notevole, ecco altre 2 domandine: 1- Quindi un arduino 1 come master e 2 328 con relativi pin impegnati con sensori vari e/o L293 si possono collegare tramite I2C,giusto? 2- Tu (@leo72) usi un Tiny84 per l'LCD, @resonance usa un PCF8574, quali sono le differenze (a grandi linee...)?

Grazie, Matteo.

MatteoG: Ok, quindi niente 328np... :~ La mia incompetenza è notevole, ecco altre 2 domandine: 1- Quindi un arduino 1 come master e 2 328 con relativi pin impegnati con sensori vari e/o L293 si possono collegare tramite I2C,giusto?

2- Tu (@leo72) usi un Tiny84 per l'LCD, @resonance usa un PCF8574, quali sono le differenze (a grandi linee...)?

Grazie, Matteo.

Sono 2 cose differenti. Il primo è un microcontrollore come il 328 solo limitato nel numero di funzioni, memoria e pin ma programmabile. Il secondo è un semplice moltiplicatore I2C.

Io comunico con il Tiny84 sempre con l'I2C e poi lascio a lui la visualizzazione dei dati sull'LCD: in questo modo risparmio i 7 pin minimi che servono per pilotare il display.

ok, capito,grazie.
Lo studio continua… :slight_smile: