dimanche 20 octobre 2019

Présentation du projet Arduino EveryWhere




·         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:

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

-  Dans l'Arduino
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.


-  Dans le téléphone.
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.

-  Le serveur sur un PC
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.


-  Le "PC client"
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

Pour accéder au menu. Appuyez sur une touche

-  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.




La liste des périphériques bluetooth visible apparait.
Cliquez sur celui de votre projet.



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

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


-  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");



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.
-  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.



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.



·         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 :


Aucun commentaire:

Enregistrer un commentaire

Présentation du projet Arduino EveryWhere

·          Présentation du projet L'idée est d'utiliser un téléphone comme relay réseau pour un dialogue entre un P...