lunedì 14 novembre 2011

PIC18F4550 - Pinguino bot controlled by Android



Il robot è autocostruito con lastre in plastica semirigida tagliata con un cutter. Le parti ad angolo sono state tagliate parzialmente, creata la piega e quindi fermata con della colla a caldo. I due servo e il sensore a ultrasuoni sono stati acquistati su RobotItaly ai link seguenti: 
http://www.robot-italy.com/product_info.php?cPath=85_28&products_id=1826
http://www.robot-italy.com/product_info.php?cPath=15_48_142&products_id=957 
Altrimenti se si vuole modificare un servo per la rotazione continua seguite la guida al link seguente:
http://www.robot-italy.com/article_info.php?articles_id=1

Per quanto riguarda pinguino (arduino clone) fare riferimento al sito web: http://www.hackinglab.org/
Di seguito riporto ugualmente il circuito realizzato su scheda millefori. Il quarzo da 20MHz e i condensatori da 22pF sono stati sistemati e saldati sotto il PIC 18F4550 nello zoccolo.



Il modulo bluetooth SPP è stato acquistato su ebay; se ne trovano per tutte le  tasche. Se non volete incappare nella modifica della configurazione mediante comandi AT; prediligere quelli già impostati a 9600 baud.

Il collegamento va fatto tramite la porta UART della scheda pinguino collegando il pin RX con TX e viceversa.




Il modem, infatti, ha i seguenti pin:
- CTS-I da collegare insieme al pin RTS-I
- VCC
- GND 
- TX-0 da collegare con porta rx della UART
- RX-I da collegare con porta tx della UART
- RTS-0 da collegare insieme al pin CTS-I





I segnali RTS (REQUEST TO SEND) - CTS (CLEAR TO SEND) generalmente vengono usati per forzare l'abilitazione del segnale di portante sul doppino telefonico. In pratica il PC deve alzare il segnale RTS ed attendere che il modem risponda alzano il segnale CTS del PC.
Generalmente nelle connessioni tra dispositivi questi segnali vengono simulati creando un ponticello, a livello del connettore del cavo seriale tra i pin dei segnali RTS-CTS, di modo che quando il dispositivo alza il segnale RTS si ritrova automaticamente il CTS attivo.
Utilizzando l'ambiente di sviluppo da hackinglab.org, consultando le varie guide e utilizzando la libreria servo ho caricato sulla scheda pinguino il programma seguente:
void setup(void)
{

 Serial.begin(9600);
 servo.attach(5); //sonar position servo
 servo.attach(6); //right wheel servo
 servo.attach(7); //left wheel servo
}


void loop(void)
{
 if (Serial.available() > 0)
 {
  incChar = Serial.read();

  if (incChar == 'W') {
   //go forward
   servo.setMinimumPulse(6);
   servo.setMaximumPulse(7);
  }

...
... left, right, reverse
...
}



Particolare del sonar montato su un servo. Tramite modulo CCP del PIC18F4550 (Pinguino) viene misurata la durata dell'impulso di uscita del modulo sonar. Di seguito parte del codice del PIC che gestisce la misurazione dell'impulso come differenza fra istante del fronte di discesa e salita.

void UserInterrupt()
{
if(PIR2bits.CCP2IF == 1)  
{               
if(edge1 == 0)              // rising edge
{
rise = (CCPR2H<<8)+ CCPR2L;
CCP2CON = 0x04;      // 00000100; CCP2 as capture mode, now changed to capture on every falling edge
edge1 = 1;           // for falling edge
}
else
{
fall = (CCPR2H<<8)+ CCPR2L;
dur = fall - rise;
TMR3H = 0x0;       // preset for timer3 MSB register
TMR3L = 0x0;       // preset for timer3 LSB register
CCP2CON = 0x05;    //CCP2 now reconfigured to capture mode on very rising edge
edge1 = 0;         // back to rising edge
}
PIR2bits.CCP2IF =  0;
}
}

...

Nella funzione setup di pinguino occorre abilitare il modulo CCP e relativo TIMER 3:

...
TMR3H = 0x0;        // preset for timer3 MSB register
TMR3L = 0x0;        // preset for timer3 LSB register
T3CON = 0b00111101; //Enable timer3 CCP2 clock 8bit read write operation

CCP2CON = 0x05;
PIR2bits.CCP2IF =  0;
PIE2bits.CCP2IE =  1; //Enable interrupt

...

Per quanto riguarda invece il controllo del robot basta creare un nuovo progetto Android in Eclipse. Partire dall'esempio BluetoothChat al link seguente: http://developer.android.com/resources/samples/BluetoothChat/index.html 
Nella classe BluetoothChatService.java modificare la stringa UUID con "00001101-0000-1000-8000-00805F9B34FB" che identifica appunto il profilo SPP. Senza questa modifica android non si collega e/comunica con il modulo bluetooth.
Accoppiate il modulo SPP con il telefonino (il codice key è solitamente 1234) fate partire l'applicazione


collegate il modulo SPP con il programma e provate ad inviare il carattere 'W' al robot. Se avete fatto tutto correttamente vedrete avanzare il robot.
Se avete dimestichezza con il linguaggio Java e Eclipse e Android SDK potrete divertirvi a modificare il programma inserendo dei pulsanti 'ImageButton' per le quattro direzioni.
Per quanto riguarda l'utilizzo e configurazione di Eclipse con Android SDK si rimanda alla pagina http://developer.android.com/sdk/index.html
PS: se sapete come impostare la data della mini telecamera 'mini dv' attendo i vostri suggerimenti. Le ho provate tutte con il file TAG.TXT... ma guai se funziona!




   

Nessun commento:

Posta un commento