gbm
Robot kit Pico 1.1 con Pico85 SMD
Tutorials -
Scritto da gbm

Con questa guida verranno dimostrate le potenzialità di Pico85 SMD e della piattaforma di sviluppo Pico 1.1, per farlo ho sviluppato un semplice robot rover che possa fungere esempio di base. Mi sono soffermato soprattutto sull'efficienza generale del sistema e sulla riduzione di peso e consumo di elettricità. Ho scelto di utilizzare una cella singola LIPO 3.7v 1A, per ottenere 5v utilizzo uno StepUp che alimenta Pico85 e i servomotori. Grazie a questa configurazione è possibile abbandonare per sempre le batterie stilo o nichel cadmio, pesanti non molto efficienti e se non ricaricabili, estremamente inquinanti e costose. Come unità motrici ho scelto i microservi modificati a rotazione continua. Sono fantastici perchè con 5 euro e 10 minuti di lavoro si ottiene un micromotoriduttore estremamente performante, leggerissimo, in cui è integrato il doppio ponte ad H necessario a comandarlo, facilmente pilotabile con la libreria SoftwareServo. Come sensore di prossimità ho scelto il kit sensore ERER.

 



Di cosa è composto il robot:

1x Pico85 SMD

1x Kit sensore ERER - vedi Tutorials sensori

1x StepUP 3.7v -> 5v LIPO

1x Batteria Lipo 3.7v 1A

1x Mini Breadboard

1x Piattaforma Pico 1.1 (presto disponibile)

2x Staffa microservi / sensori

2x Elle in metallo

2x Microservimodificati a rotazione continua
vedi Modifica servomotori a rotazione continua

2x Ruote servo 8cm grigio

1x Ruota pivotante in plastica

 

 


Il circuito

Come si puo' vedere  nel video, ho utilizzato una mini breadboard per comporre il circuito. Per comodità suddivido il circuito in 3 moduli.

Alimentazione: Stepup input > LIPO | Stepup output > VIN PICO e alimentazione servi

Non ci si puo' sbagliare armeggiando con lo stepUp perchè i plug, pensati per il modellismo, non permettono una connessione errata e la reference è molto chiara. Quello che faremo è connettere la cella LIPO all'input dello stepup. Dopodichè dovremo connettere l'output dello stepup a VIN di Pico85smd e all'alimentazione dei servomotori (ricordandosi di rendere comuni le masse).

 

Sensore: + LED emettitore > +5v | - LED emettitore > GND | + LED ricevitore > PB2 (porta analogica) | - LED ricevitore > GND

Visto il numero esiguo di porte I/O ho scelto un wiring davvero molto semplice per poter utilizzare una sola porta I/O per ottenere un dato di distanza. Per farlo ho connesso il LED emettitore direttamente a 5v, e il polo positivo del ricevitore a una porta analogica. In questo caso, otterro' un voltaggio che varierà in rapporto alla luce riflessa che colpisce la giunzione. In questo caso, il LED si comporta come un modulo fotovoltaico e noi, analizzando questa tensione potremo stimare la quantità di luce riflessa e quindi la distanza dell'eventuale ostacolo. Come potete vedere nel codice in questo caso è stata utilizzata una semplice soglia, che andrà regolata in rapporto alla luce ambientale, per ottenere un funzionamento corretto. Se si vuole ottenere un dato piu' certo e libero da interferenze ambientali, consiglio di scegliere la configurazione spiegata nel tutorial Sensore di prossimità LED.

 

Servomotori: Servo1 input > PB0 | Servo2 input > PB1

Grazie alla libreria software servo pilotiamo i servomotori in modo molto comodo e pratico, bisogna solo ricordarsi che perchè questa libreria funzioni dobbiamo richiamare la funzione SoftwareServo::refresh(); ogni 50 millisecondi. Per comodità ho connesso i 3 cavi del potenziometro di tutti e due i servomotori a un solo potenziometro per regolare comodamente il movimento di entrambi, davvero comodo provare per credere.

 

Il codice - ricordatevi di richiamare la libreria SoftwareServo.h

SoftwareServo left;
SoftwareServo right;
int value = 0;
int vision = 0;
float time = 0;

void setup(){
 left.attach(0); // Porta PB0
 left.setMaximumPulse(2200);
 right.attach(1); // Porta PB1
 right.setMaximumPulse(2200); 
}



void loop() {
 SoftwareServo::refresh(); 
 left.write(180); // Vai avanti
 right.write(0);  // Vai avanti
 vision = analogRead(1); // Voltaggio prodotto da LED
 if(vision >= 190) {  // Se è maggiore della soglia
  if(vision - 190 > 5) { // Scelta senso rotazione Pseudorandom
   time = millis();  
   while (millis() - time < 600) { // Ruota per 600 millis
    left.write(180); 
    right.write(180); 
    SoftwareServo::refresh(); 
   }
  }
  else { 
   time = millis(); 
   while (millis() - time < 600) { // Ruota per 600 millis
   left.write(0); 
   right.write(0); 
   SoftwareServo::refresh(); 
   }
  }
 }
}

 


 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi