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.
Iscriviti a:
Commenti sul post (Atom)
Nessun commento:
Posta un commento