domenica 20 novembre 2011

PIC18F4550 - Pinguino Bot controlled by PC



Una prima versione del bot era controllata da un programma scritto in visual basic sempre tramite un adattatore bluetooth in modalità COM port. Una volta accoppiato l'adattatore bluetooth ad una porta COM  occorre ovviamente aprire la porta seriale:

Private Sub CmdImposta_Click()
    On Error Resume Next

    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
    End If
   
    MSComm1.CommPort = CInt(Mid(ComboPort.Text, 4))
    MSComm1.Settings = "115200,N,8,1"
    MSComm1.RThreshold = 1
    MSComm1.DTREnable = False
    MSComm1.InputLen = 1
    TxtImpostazioni.Text = MSComm1.Settings
    MSComm1.PortOpen = True
    If Err.Number > 0 Then
        Err.Clear
        TxtStato.Text = "Errore COM" & MSComm1.CommPort
        Exit Sub
    End If
    TxtStato.Text = "Porta COM" & MSComm1.CommPort & " aperta"
End Sub


Il collegamento è effettuato a 115.200baud; vengono trasmessi al pc i dati della tensione delle batterie, la lettura sonar di eventuali ostacoli e la posizione della testa servo.
Per fare avanzare il bot occorre inviare il carattere 'W' al firmware:

Private Sub CmdAvanti_Click()
    MSComm1.Output = "W"
    TxtStato.Text = "Send 'W' char"
End Sub


La tensione della batteria 7.2V viene rilevata, tramite partitore di tensione con due resistenze da 10K, all'ingresso ADC del pinguino. La lettura della batteria (ADC a 10bit) va prima trasformata nella scala corretta:
...
volt = FormatNumber((value * 5 * 2) / 1023, 3)
progValue = (100 * volt) / 7.2
...
Il valore di progValue viene poi inviato alla progressBar per la visualizzazione.

La durata dell'impulso del sonar va trasformato per ricavare la distanza dell'ostacolo in cm:
...
Private Function GetSonarCM(ByVal value As String) As Double
    Dim sonar_out_cm As Double
    Const SONAR_SENS As Double = 147 / 2.54   '373.38  'us/cm
    Const TOSC As Double = 0.667 'us
    sonar_out_cm = value * TOSC / SONAR_SENS
    GetSonarCM = FormatNumber(sonar_out_cm, 2)
End Function

...

Con la posizione del servo (servo.getPosition()) inviata al programma visual basic e la distanza dell'ostacolo in cm è ora possibile disegnare il punto rilevato nello schema radar. La funzione servo.getPosition() restituisce un valore da 0 a 255 corrispondente a 0 gradi fino all'apertura massima consentita dal servo.

Nessun commento:

Posta un commento