· Présentation du projet
L'idée est d'utiliser
un téléphone comme relay réseau pour un dialogue entre un PC et un Arduino et
profiter aussi des périphériques qui sont sur le téléphone. (caméra, GPS(pas
encore fonctionnel) micro…)
Ici je vais vous décrire comment utiliser à votre sauce mon projet. Mais
aussi un exemple d'utilisation pour des questions pédagogiques, ou simplement
pour le reprendre tel quel. Cet exemple est une voiture guidée à distance avec
caméra embarqué temps réel.
Présentation vidéo:
Présentation vidéo:
o Plan des différents programmes sur les différents "terminaux"
Voici un petit schéma d'ensemble de ce projet
Le dialogue entre l'Arduino et le "PC
client" se fait à travers un "Telephone relay" et un "PC
serveur" (qui peut être le même que le PC client.)
o Description des rôles des programmes
Une partie du programme concernant le dialogue avec le téléphone sera
immuable sous peine de ne plus être "compris" du téléphone.
Une partie du programme dépends de votre projet. Utilisez les fonctions de
la partie immuable pour dialoguer avec le PC.
Le programme "Arduino EveryWhere" se charge d'établir la
connexion avec le serveur, La connexion avec l'Arduino via le Bluetooth, La
gestion de la caméra ( un jour peut être d'autre périphériques ).
-Tout octet émis par l'Arduino est expédié
au serveur ( qui fera suivre au "pc client" )
-Tout octet émis par le "Pc
client" est retransmis à travers le serveur et le téléphone à l'Arduino.
-Si le "PC client" réclame la
vidéo, Arduino EveryWhere créera un flux vidéo et transmettra l'adresse de ce
flux au "PC client". Le "PC client" devra lancer un client
vidéo pour lire ce flux.
Cette partie ne nécessite pas d'être modifié pour votre propre projet.
Cette partie ne nécessite pas d'être modifié pour votre propre projet.
Le téléphone et le "PC client"
doivent se connecter au serveur.
Le serveur fait suivre les données de l'un
à l'autre. Il envoie aussi quelques messages pour:
-Initier le flux vidéo.
-Renseigner le téléphone de la connexion
d'un PC client.
-Renseigner le "PC client" de la
connexion d'un téléphone.
-Renseigner le "PC client" de la
présence d'un Arduino derrière le téléphone (via bluetooth).
-Permet d'observer les échange si
nécessaire.
Cette partie ne nécessite pas d'être modifié pour votre propre projet.
Comme sur l'Arduino, une partie de ce
programme est personnalisable. Une autre dépend du projet que l'on en fera.
La partie immuable est dans une classe
spécifique.
Utilisez cette classe pour toutes les
fonctions de la solution.
Les messages que vous envoyez à L'Arduino
seront reçu tel quels par l'Arduino. À vous d'écrire pour l'Arduino et le
"PC client" l'interprétation des messages que vous envoyez.
· Comment utiliser les programmes
o Configuration du serveur
-
Debug
Activez le débug pour voir tout les échanges entre l'appli et le téléphone
relay
-
Port
Définissez le port que vont utiliser l'appli et le téléphone pour discuter
avec le serveur
Vous devrez mettre le même dans l'appli et
le téléphone
-
Mot de passe
Pas encore défini
o Configuration de Arduino EveryWhere
-
Réseau
Pour accéder aux paramètres réseau cliquez
sur cette icône.
·
Adresse IP / Port
Indiquez l'Adresse IP et le port utilisée
par le serveur.
·
mot de passe
Pas encore défini
·
Multi connexion
Pas encore défini. Devrait permettre de
connecter plusieurs appli à un Arduino
Ou plusieurs Arduino à une appli.
-
Bluetooth : Choix du périphérique. Trouver
notre Arduino
Pour sélectionner le Bluetooth de votre
Arduino, cliquez sur cette icône.
Vous obtenez le menu ci dessous.
-Déployez l'objet "HM-10 Service" afin d'afficher "HM-10 Module".
-Sélectionnez le.
-Si votre projet envoie des données vous pourrez constater qu'elle s'affichent. ( à Data )
-faites retour arrière jusqu'au menu général.
Sur le menu général, l'icône Bluetooth passe bleu quand la liaison est assurée.
-
Configuration Vidéo
Pour modifier les paramètres vidéos,
cliquez sur cette icône.
Choisissez les paramètres vidéo et audio
qui vous conviendrons le mieux.
o
Exemple d'utilisation d'un programme coté
client
-
Paramètre réseau
Indiquez l'adresse et le port qu'utilise
le serveur.
-
Paramètre vidéo
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUg5Ljhr_LaJY1ETFN6_T3Td-vatx1yoyTz6Q8tid6llkzKZz_iZh4YzUsa1xB-hULAh-LNxtqaCBAUjskJSnJStzxHd4Pl21ZqrfFg_-f6L8Lkb7nwwNc_ZGjrOg8vtHGGEm_gSRwnQ8/s1600/menu+client+vid%25C3%25A9o.jpg)
Pour la vidéo c'est plus compliqué.
L'adresse à utiliser est celle du téléphone.
Quand on appuie sur "vidéo
start". Cela envoie au téléphone l'ordre de mettre mettre en place le serveur video. Le téléphone retourne au PC son adresse. ( dans adresse donnée par le
serveur).
Mais il y a plusieurs cas où ce n'est pas
l'adresse qu'il faut utiliser. C'est pourquoi il faut indiquer la valeur
manuellement. (dans adresse à utiliser)
·
Le PC client
est dans un LAN différent du téléphone.
Il faut donner l'adresse du modem routeur
du LAN du téléphone. ( n'oubliez pas de configurer un nattage dans ce routeur)
·
Le téléphone
utilise un tunnel SSH.
Il faut donner l'adresse de l'entrée de ce
tunnel. Certains opérateurs mobile internet interdisent les connections
entrantes. Or, notre flux vidéo utilise ce mécanisme. L'utilisation d'un tunnel
SSH m'est apparu la meilleure façon de contourner ce problème. Voir plus bas :
"Réseau IP nattage et Arduino
EveryWhere"
Sinon, dans les cas les plus simples, recopiez simplement dans "adresse à utiliser" l'adresse qui est apparue dans "adresse donnée par serveur" après que vous ayez cliqué sur "vidéo start"
·
Plan du montage électronique
-
montage Bluetooth Arduino de base
-
montage Bluetooth pour le drone
Note concernant l'alimentation : les batteries ayant une alimentation >
5V j'utilise le régulateur 5V embarqué dans le module à base de L298N.
Le pont
de résistance à droite sert à mesurer la tension des batteries.( la tension
après pont diviseur doit être inférieur à la tension d'alimentation de
l'Arduino.(5v)
· Paramétrage de la veille du téléphone
Il est nécessaire de faire ces
paramétrages sinon "Arduino EweryWhere" ne pourra pas déverrouiller
le téléphone afin d'utiliser la caméra.
·
Déverrouillage du téléphone
Dans les paramètres Android chercher le
menu "affichage"
Mettez la mise en veille la plus courte
possible.
o
réglage de la veille
Dans les paramètres Android chercher le
menu "Ecran de verrouillage"
Entrez le menu "Mode de
déverrouillage" pour le passer à Aucun
· Appropriez vous le projet : comment modifier les programmes
o
Programmes dans l'Arduino
-
Partie obligatoire
Veullez consulter les sources sur GitHub.
Au départ il y a quelques variables non obligatoires.
Dans le setup il y a quelques commandes non obligatoire
A partir de la fonction "loop()" (incluse) rien n'est obligatoire
Veullez consulter les sources sur GitHub.
Au départ il y a quelques variables non obligatoires.
Dans le setup il y a quelques commandes non obligatoire
A partir de la fonction "loop()" (incluse) rien n'est obligatoire
-
Utilisation personelle :
Conservez tout ce qui est obligatoire. Pour dialoguer avec le PC utilisez simplement l'objet "BlueSerial"
vous pouvez aussi changer le nom bluetooth de votre arduino. Dans le setup, modifiez sendCommand("AT+NAMEbluino");
Conservez tout ce qui est obligatoire. Pour dialoguer avec le PC utilisez simplement l'objet "BlueSerial"
vous pouvez aussi changer le nom bluetooth de votre arduino. Dans le setup, modifiez sendCommand("AT+NAMEbluino");
o
Programme côté "client"
Je n'ai que 2 exemples sur windows: "exempleAndruino" utilisait un activeX VLC. "DroneCMD" lui lance une instance de VLC. Dans les 2 cas VLC doit être installé. DroneCMD est toutefois préférable.
Vous pouvez essayer avec autre chose que VLC. Il faut toutefois que cela supporte le protocole RTSP.
Je n'ai que 2 exemples sur windows: "exempleAndruino" utilisait un activeX VLC. "DroneCMD" lui lance une instance de VLC. Dans les 2 cas VLC doit être installé. DroneCMD est toutefois préférable.
Vous pouvez essayer avec autre chose que VLC. Il faut toutefois que cela supporte le protocole RTSP.
-
Partie obligatoire
La partie obligatoire est dans "AsynchronousClient.cs" et il est préférable de ne pas y toucher
- Partie utilisée par l'exemple présenté
Dans l'exemple, regardez le début de "DroneCMD\DroneUI.cs". Cette partie initialise les callbacks qui permettent à l'objet AsynchronousClient d'appeller les fonctions de votre projet censé traiter les évènements standard de Arduino EveryWhere
Inspirez vous de la fonction "ReceptionFluxRtsp" dans "DroneCMD\DroneUI.cs" car c'est elle qui traite l'affichage d'un flux vidéo.
Inspirez vous de la fonction "ReceptionFluxRtsp" dans "DroneCMD\DroneUI.cs" car c'est elle qui traite l'affichage d'un flux vidéo.
o Pour utiliser Arduino EveryWhere dans vos propres projets C#.
Créez un objet AsynchronousClient. Cet Objet a des fonction pour solliciter un service Mais a aussi des callbacks. Lorsque le service doit solliciter votre programme. Par exemple, pour transmettre un message venant de l'Arduino.
Vous devez donc définir votre propre gestion pour les callbacks suivants:
ReceptionMsgHexa : Ce callback reçoit en argument un message envoyé par l'Arduino sous forme de chaine hexadécimale. (Voir les fonctions de conversions ci-dessous )
ReceptionCapteur : Ce callback reçoit en argument un message venant des capteurs ( suite aux sollicitations via la méthode SendCapteur() ).
ReceptionDErreur : Ce callback reçoit en argument un message d'erreur. Quand une erreur venant d'Arduino Everywhere apparait.
ReceptionFluxRtsp : Ce callback surviens suite à la requête VideoRequest(), cela signifie que le serveur rtsp est démarré sur le téléphone. L'argument reçu par ce callback est l'adresse du flux rtsp bien que cette information puisse ne pas être la plus judicieuse. ( voir Réseau IP nattage et Arduino EveryWhere )
ChangementStatutServer : Ce callback est appelé chaque fois que le serveur est connecté/déconnecté, ou que le nombre d'Arduino visibles, a changé ( Dans le futur je prévois de permettre de dialoguer avec plusieurs Arduino d'un coup ).
ReceptionMsgCool : Ne pas utiliser. Ceci servait surtout lors du développement de Arduino EveryWhere. Ceci ne reçoit pas de message de l'Arduino mais seulement du téléphone.
Selon vos besoin appelez ces méthodes :
SendMsgHexa(string) : La chaine doit contenir une série de valeurs hexadécimales. 2 caractères par octets sans aucune séparation. (Voir les méthodes de conversions ci-dessous ).
VideoRequest() : Demande l'activation du serveur vidéo.
VideoStop() : Demande l'arrêt du serveur vidéo.
SendCapteur(string) : Utilise un des périphérique du téléphone. Pour l'instant seul 2 messages sont traités:
-FlashLightON : allume le flash.
-FlashLightOFF : éteins le flash.
Send(string) : Ne pas utiliser. Ceci servait surtout lors du développement de Arduino EveryWhere. Ceci n'envoie pas de message à l'Arduino mais seulement au téléphone.
Quelques propriétés:
port : Port du serveur Arduino EveryWhere.
ipAddress : Adresse du serveur Arduino EveryWhere.
bServerResponding : Est à true si le serveur est joignable.
NbrBlueTooth : Renvoie le nombre d'Arduino joignable. ( à l'avenir je souhaite pouvoir envoyer un même message à plusieurs Arduino en même temps )
Des méthodes de conversion sont disponible:
Méthodes pour convertir des entiers en chaine hexadécimale.
ByteToHex(byte) : Convertit un byte en une chaine hexadécimale
ShortToHex(short) : Convertit une short en une chaine hexadécimale
IntToHex(int) : Convertit une int en une chaine hexadécimale
Méthodes pour convertir une chaine hexadécimale en entiers
HexToByte(string) : Convertit une chaine hexadécimale en un byte.
HexToShort(string) : Convertit une chaine hexadécimale en une short.
HexToInt(string) : Convertit une chaine hexadécimale en une int.
Méthodes pour convertir du texte
StringToHex(string) : Convertit une chaine en une chaine de caractère hexadécimale.
HexToString(string) : Convertit une chaine hexadécimale en une chaine de caractère.
Créez un objet AsynchronousClient. Cet Objet a des fonction pour solliciter un service Mais a aussi des callbacks. Lorsque le service doit solliciter votre programme. Par exemple, pour transmettre un message venant de l'Arduino.
Vous devez donc définir votre propre gestion pour les callbacks suivants:
ReceptionMsgHexa : Ce callback reçoit en argument un message envoyé par l'Arduino sous forme de chaine hexadécimale. (Voir les fonctions de conversions ci-dessous )
ReceptionCapteur : Ce callback reçoit en argument un message venant des capteurs ( suite aux sollicitations via la méthode SendCapteur() ).
ReceptionDErreur : Ce callback reçoit en argument un message d'erreur. Quand une erreur venant d'Arduino Everywhere apparait.
ReceptionFluxRtsp : Ce callback surviens suite à la requête VideoRequest(), cela signifie que le serveur rtsp est démarré sur le téléphone. L'argument reçu par ce callback est l'adresse du flux rtsp bien que cette information puisse ne pas être la plus judicieuse. ( voir Réseau IP nattage et Arduino EveryWhere )
ChangementStatutServer : Ce callback est appelé chaque fois que le serveur est connecté/déconnecté, ou que le nombre d'Arduino visibles, a changé ( Dans le futur je prévois de permettre de dialoguer avec plusieurs Arduino d'un coup ).
ReceptionMsgCool : Ne pas utiliser. Ceci servait surtout lors du développement de Arduino EveryWhere. Ceci ne reçoit pas de message de l'Arduino mais seulement du téléphone.
Selon vos besoin appelez ces méthodes :
SendMsgHexa(string) : La chaine doit contenir une série de valeurs hexadécimales. 2 caractères par octets sans aucune séparation. (Voir les méthodes de conversions ci-dessous ).
VideoRequest() : Demande l'activation du serveur vidéo.
VideoStop() : Demande l'arrêt du serveur vidéo.
SendCapteur(string) : Utilise un des périphérique du téléphone. Pour l'instant seul 2 messages sont traités:
-FlashLightON : allume le flash.
-FlashLightOFF : éteins le flash.
Send(string) : Ne pas utiliser. Ceci servait surtout lors du développement de Arduino EveryWhere. Ceci n'envoie pas de message à l'Arduino mais seulement au téléphone.
Quelques propriétés:
port : Port du serveur Arduino EveryWhere.
ipAddress : Adresse du serveur Arduino EveryWhere.
bServerResponding : Est à true si le serveur est joignable.
NbrBlueTooth : Renvoie le nombre d'Arduino joignable. ( à l'avenir je souhaite pouvoir envoyer un même message à plusieurs Arduino en même temps )
Des méthodes de conversion sont disponible:
Méthodes pour convertir des entiers en chaine hexadécimale.
ByteToHex(byte) : Convertit un byte en une chaine hexadécimale
ShortToHex(short) : Convertit une short en une chaine hexadécimale
IntToHex(int) : Convertit une int en une chaine hexadécimale
Méthodes pour convertir une chaine hexadécimale en entiers
HexToByte(string) : Convertit une chaine hexadécimale en un byte.
HexToShort(string) : Convertit une chaine hexadécimale en une short.
HexToInt(string) : Convertit une chaine hexadécimale en une int.
Méthodes pour convertir du texte
StringToHex(string) : Convertit une chaine en une chaine de caractère hexadécimale.
HexToString(string) : Convertit une chaine hexadécimale en une chaine de caractère.
· Dysfonctionnement connus
o
Caméra et verrouillage du téléphone
Actuellement, je dois déverrouiller
totalement le téléphone afin qu'il puisse utiliser la caméra sur commande. Si
une autre solution existe ce serait une bonne chose
o
Déconnexion du réseau
Je souhaite que l'application se
reconnecte au serveur automatiquement. Mais cela ne marche pas franchement.
o
impossible de changer de caméra (devant
derrière)
Le code utilisé est censé le faire…
Serveur: modifier
message "press key for menu"
Téléphone : l'icone paramètre vidéo doit
ressembler à un écran
· Évolutions envisagées
o
Utilisation du GPS
o
Accéléromètre, gyroscope
o
Utilisation du HP
o
Possibilité d'un traitement local dans le
téléphone
o
Client sur Android
o
prévenir l'Arduino de l'état de la
connexion avec le PC
o
multi connections
· Réseau IP nattage et Arduino EveryWhere
o
connections entrante et serveur
Les connections IP s'établissent toujours
à la demande du client vers le serveur.
Quand un serveur est situé derrière un
modem-routeur un problème se présente: ce serveur n'a pas d'adresse vu
d'internet. La seule machine qui se voit d'internet est le modem-routeur. Il faut donc indiquer au modem routeur que
s'il reçoit une demande de connexion sur
le port qui nous intéresse. Il doit "forwarder" cette demande vers le
serveur.
Pour ça consultez la doc de votre modem-routeur ( ou BOX ). Cherchez le terme "nattage de ports"
o
connexion entrante et Tunnel SSH ( pour
vidéo )
Si les connections entrantes sont
interdites depuis le réseau où vous êtes ( soit réseau d'entreprise, soit
réseau GSM qui interdit cela.)
Un solution peut être les tunnels SSH.
On crée un tunnel depuis le téléphone vers
un serveur SSH. Ainsi la connexion est sortante pour le réseau du téléphone. (personellement j'ai utilisé Kia4 )
Il faut configurer le téléphone et le
serveur Il faut aussi natter ce tunnel
SSH si le serveur est derrière un modem routeur.
Enfin, pour utiliser notre service vidéo.
On indiquera au programme de se connecter au serveur SSH. Celui-ci forwardera
cette connexion au téléphone et le téléphone forwardera à Arduino EveryWhere
cette connexion.
Voilà comment contourner une interdiction
de connexion entrante sur un réseau "trop fermé"
Sources et remerciements
Mon Github (sources à compiler):
schémas sur fritzing du montage et sources Arduino :
Serveur et clients sur PC :
Partie sur le téléphone :
Sources exécutables:
Serveur :
Client :
Android :
Les sources qui m'ont permis de faire ça
Gestion des Flux rtsp :
Gestion Bluetooth :