Bonjour
Je réalise un robot bimoteur qui est composé des éléments suivants : Carte Arduino Mega et Smartphone Android.
La carte Arduino collecte les données de 2 encodeurs (A), un Lidar, une camera AI ( . La carte envoie ces données au smartphone via une liaison Bluetooth. ©
Le smartphone envoie des commandes de guidage à la carte Arduino qui actionne 2 servos. (D)
L'ensemble fonctionne mais il y a clairement un problème de précision qui est dû à un décalage entre le moment où l'Arduino envoie les données et le moment où le smartphone les reçoit. Ce décalage est variable mais atteint parfois 4 secondes ce qui est énorme surtout quand le robot fait une manoeuvre qui exige de la précision.
La transmission se fait à 9600 baud via un socket. La vitesse de transmission ne peut pas être augmentée étant donné que c'est du Bluetooth.
Mais même à 9600 baud la réception devrait se faire sans problème quasi instantanément. La chaîne de paramètres envoyée par l'Arduino fait +/- 80 digits.
Au niveau du code sur le téléphone (c'est du Windev) :
Il faut d'abord initialiser le socket
SocketEnCours est une chaîne = "so01" MacDispositif est une chaîne RetourExiste est une chaîne MacDispositif = "00:0E:EA:CF:71:40" e = SocketConnecteBluetooth(SocketEnCours,"SerialPortServiceClass_UUID",MacDispositif) SI e = Vrai ALORS RetourExiste = SocketExiste(SocketEnCours) LIB_01 = "Connexion établie" SI SocketChangeModeTransmission("so01", SocketSansMarqueurFin) = Vrai ALORS LIB_02 = "Mode de transmission modifié" SINON LIB_01 ="Connexion en Bluetooth impossible " Info(errInfo) FIN
Ensuite une procédure est lancée toutes les 100 ms
buf = buf + SocketLit("so01",Faux,1000) buf = Droite(buf,500) bs = AnsiVersUnicode(buf) u2 = Position(bs,"#",0,DepuisFin) // récupération de la fin de la chaîne u1 = Position(bs,"@",u2,DepuisFin) // récupération du début de la chaîne bs = Milieu(bs,u1,u2-u1+1) erg = Val(ExtraitChaîne(bs,2,";")) // encodeur moteur gauche erd = Val(ExtraitChaîne(bs,3,";")) // encodeur moteur droit px1 = Val(ExtraitChaîne(bs,9,";")) // Coordonnées camera X px2 = Val(ExtraitChaîne(bs,10,";")) // Coordonnées camera Y ...
Le problème vient peut-être de cette communication par socket. Mais Windev Mobile ne prend pas en charge une communication série.
Si je connecte l'Arduino sur le port usb d'un pc, la réception des données à 9600 baud est quasiment immédiate.
Il va falloir remplacer le smartphone par un pc