Page 2 sur 2

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 15:11
par Dumli
Non, je comprends pas pourquoi d'ailleurs. Je cherche :|

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 15:13
par G-Rom
Quand je vois ca , il n'attends pas "zqsd" mais "12345" ?

Code : Tout sélectionner

void loop()
{
  if(NULL != recvChar) {
    Serial.print("Received: ");
    Serial.print(recvChar);
    Serial.print(" [");

    switch(recvChar) {
    case '1':
      Serial.println("forward]");
      digitalWrite(4, HIGH); //-------------------------------------------------- ICI commande du PIN 4 -------------------------------------------------------------
      Serial.println("Commande envoyée");
      delay(300);
      break;
    case '2':
      Serial.println("backward]");
      break;
    case '3':
      Serial.println("turn right]");
      break;
    case '4':
      Serial.println("turn left]");
      //your control code goes here...
      break;
    case '5':
      Serial.println("stop]");
      break;
    default:
      Serial.println("unexpected value received]");
      break;
    }

    //we have handled the last data receive so clear recvChar so that we don't handle the same data again.
    recvChar = NULL;
  }

edit :

Code : Tout sélectionner



IPDRONE$    = "192.168.0.100"
PORTDRONE.i = 1000

InitNetwork()

Connection = OpenNetworkConnection(IPDRONE$,PORTDRONE,#PB_Network_TCP)


*FORWARD_CMD  = AllocateMemory(1)
*BACKWARD_CMD = AllocateMemory(1)
*LEFT_CMD     = AllocateMemory(1)
*RIGHT_CMD    = AllocateMemory(1)
*STOP_CMD     = AllocateMemory(1)

; ATTENTION A LA CASE !   Z != z
PokeC(*FORWARD_CMD,  Asc("1"))
PokeC(*BACKWARD_CMD, Asc("2"))
PokeC(*LEFT_CMD,     Asc("3"))
PokeC(*RIGHT_CMD,    Asc("4"))
PokeC(*STOP_CMD,     Asc("5"))


If Connection
  
  
  ; On avance
  SendNetworkData(Connection, *FORWARD_CMD , SizeOf(*FORWARD_CMD) )
  
  ; on attend une seconde
  Delay(1000)
  
  ; on va à droite
  SendNetworkData(Connection, *RIGHT_CMD , SizeOf(*RIGHT_CMD) )
  
  ; on attend une seconde
  Delay(1000)
  
  ; on stope le drone
  SendNetworkData(Connection, *STOP_CMD , SizeOf(*STOP_CMD) )

    
  
EndIf 

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 15:33
par Dumli
Oui oui tu as tout à fait raison mais je l'avais modifié en conséquence :wink:

Et je pense savoir pourquoi ton code ne marche pas. Le drone attend un retour chariot pour arrêter ça lecture ! :)

Sinon, j'ai modifié mon serveur et il marche mais qu'est ce que ça lague ! 8O Enfin ... quand je laisse appuyé sur une touche, le programme bloque puis envoie TOUTES les touches les unes après les autres et je perds tout contrôle ... :roll:

Code : Tout sélectionner

EnableExplicit
InitNetwork()

#PORT = 1000        ;Port d'ecoute
#MAXDATASIZE = 100  ;Taille maxiamale d'envoi

Procedure main()
  Protected sockfd.i, nbBytes.i, *buffer, srv.SOCKADDR_IN, buffer_len.i, chaine.s
  
  OpenConsole()
  *buffer = AllocateMemory(#MAXDATASIZE)
  
  srv\sin_family = #AF_INET
  srv\sin_port = htons_(#PORT)
  srv\sin_addr = MakeIPAddress(192, 168, 0, 100)  ;IP Adresse du WiShield
  
  PrintN("Connection en cours ...")
  
  sockfd = SOCKET_(#PF_INET, #SOCK_STREAM, 0)
  If sockfd = -1
    PrintN("Erreur lors de la creation du socket")
    ProcedureReturn 1
  EndIf
  
  If connect_(sockfd, @srv, SizeOf(SOCKADDR_IN)) = -1
    PrintN("Erreur lors de la connexion")
    ProcedureReturn 2
  EndIf
  PrintN("Connection au Wishield etablie !")
  PrintN("Deconnexion et lancement de la procedure ...")
  closesocket_(sockfd)
  
  chaine = ""
  
  PrintN("Commande à envoyer (Z/Q/S/D) : ")
  
  Repeat
    
    chaine = Inkey()
    
    If chaine <> ""
      Print(chaine + " ")
      
      chaine + #LF$
      
      sockfd = SOCKET_(#PF_INET, #SOCK_STREAM, 0)
      If sockfd = -1
        PrintN("Erreur lors de la creation du socket")
        ProcedureReturn 1
      EndIf
      
      If connect_(sockfd, @srv, SizeOf(SOCKADDR_IN)) = -1
        PrintN("Erreur lors de la connexion")
        ProcedureReturn 2
      EndIf
      
      ;Envoi de la réponse
      If send_(sockfd, @chaine, Len(chaine)+1, 0) = -1
        PrintN("Erreur lors de l'envoi de la reponse")
        closesocket_(sockfd)
        ProcedureReturn 4
      EndIf
      
      Print("Envoyé !")
      
      Delay(500)
      
      closesocket_(sockfd)
      
    EndIf
    
  ForEver
  
  ;fermeture de la connexion
  closesocket_(sockfd)
  
  ProcedureReturn 0
EndProcedure

main()
Input()
End

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 15:37
par lepiaf31
Change le Delay(500) en Delay(10) (et je te conseille aussi de le mettre juste avant le forever) je pense que ca "ramera" moins déjà. Ensuite, l'envoi de la commande devrait se faire via un thread, sinon ton programme est bloqué durant tout l'envoi de la commande.

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 15:46
par Dumli
Un thread c'est bien une boucle qui tourne en parallèle avec la boucle principale ? Si c'est ça, je pense que c'est une bonne idée. Je vais voir ce que je peux faire :) Et comment je pourrais faire pour tester que la connexion soit bien établi (entre le drone et le PC) à TOUT moment du programme ? C'est possible au moins ? :|

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 16:13
par G-Rom
l'utilisation de thread est une mauvaise idée, ton pc tourne beaucoup plus vite que ton arduino, tu va saturé le port serie, l'arduino ne va rien comprendre.
après chaque envois de commande , temporise légerement ( 10 / 5 ms ) de façon à laisser le temps à l'arduino de bien digérer le tout ;)

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 17:07
par Dumli
Je vois ce que tu veux dire mais pourquoi ne pas temporiser le Thread ? Ca éviterai à la fois au serveur de rester "figé" pendant l'envoi et ça éviterai aussi de surcharger la Arduino :o

Le gros soucis c'est que je n'arrive pas à temporiser la saisi clavier. Je m'explique : Quand je reste appuyé sur une touche pendant un bon bout de temps, le programme va envoyer l'info une 1er fois puis il va réenvoyer cette info plein de fois sans que je ne puisse plus rien faire :? Je ne pourrais reprendre le controle seulement quand il aura fini TOUS les envois :roll:

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 17:46
par Backup
Dumli a écrit :Quand je reste appuyé sur une touche pendant un bon bout de temps, le programme va envoyer l'info une 1er fois puis il va réenvoyer cette info plein de fois sans que je ne puisse plus rien faire :? Je ne pourrais reprendre le controle seulement quand il aura fini TOUS les envois :roll:
ben oui c'est le buffer Clavier ....

arrete le mode Console , et passe par une application fenetré , ça te permetra deja de pouvoir gerer les gadgets
( un bouton par commande +raccourci Clavier )

voir d'utiliser un callback avec les constantes #Vk_

bref , ton prg ne sera plus bloqué par la commend Inkey() qui est la pire chose qui soit
ça devrai améliorer le probleme du Return (chr(13)... ;)

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 17:50
par G-Rom
il te manques des bases en programmation :wink:

Code : Tout sélectionner

move_up_flag.b = #False 


If KeyboardPushed(#PB_Key_Up) And move_up_flag = #False 
  
  move_up_flag = #True 
  
  ; Envois ta commande ici
  
EndIf 



; Relachement de la touche
If KeyboardPushed(#PB_Key_Up) = 0 And move_up_flag = #False 
  move_up_flag = #False 
EndIf 


Pour le thread , c'est idiot , la fonction sera bloquante aussi dans le thread, si 2 threads se lance en même temps ( appuis sur 2 touche par exemple )
le message du port serie risque fort d'être corrompu. bonjour le débogage ;)
l'utilisation de thread n'est vraiment pas utile, tu ne fait pas de la vidéo ou du traitement d'image, mais une simple "télécommande"

#Vk_
API windows Image

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 18:23
par Dumli
Voila l'interface du serveur en mode fenetré :) Par contre, les raccourcis clavier ne sont pas fonctionnels. Je ne peux pas utiliser la technique de G-Rom car je n'ai pas de "Screen" d'ouvert :?

Code : Tout sélectionner

InitKeyboard()

#larg = 200
#haut = 200
#main = 0

cmd.s = ""

Enumeration
  #Z
  #Q
  #S
  #D
  #Txt
EndEnumeration


OpenWindow(#main,0,0,#larg,#haut,"Interface de commande",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonGadget(#Z, #larg/2-50/2, #haut/4-50/2, 50, 50, "Z")
AddKeyboardShortcut(#main, #PB_Key_Z, #Z)

ButtonGadget(#Q, #larg/4-50/2, #haut/2-50/2, 50, 50, "Q")
AddKeyboardShortcut(#main, #PB_Key_Q, #Q)

ButtonGadget(#S, #larg/2-50/2, #haut/2-50/2, 50, 50, "S")
AddKeyboardShortcut(#main, #PB_Key_S, #S)

ButtonGadget(#D, #larg/2+50/2, #haut/2-50/2, 50, 50, "D")
AddKeyboardShortcut(#main, #PB_Key_D, #D)

TextGadget(#Txt, 2, 2, 196, 20, "Aucune touche appuyée")

Repeat
  
  event = WaitWindowEvent()
  
  Select event
      
    Case #PB_Event_CloseWindow
      exit = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Z
          cmd="z"
          SetGadgetText(#Txt,cmd)
        Case #Q
          cmd="q"
          SetGadgetText(#Txt,cmd)
        Case #S
          cmd="s"
          SetGadgetText(#Txt,cmd)
        Case #D
          cmd="d"
          SetGadgetText(#Txt,cmd)
      EndSelect
      
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Z
          cmd="z"
          SetGadgetText(#Txt,cmd)
        Case #Q
          cmd="q"
          SetGadgetText(#Txt,cmd)
        Case #S
          cmd="s"
          SetGadgetText(#Txt,cmd)
        Case #D
          cmd="d"
          SetGadgetText(#Txt,cmd)
      EndSelect
      
  EndSelect
  
  
Until exit = 1

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 18:51
par Backup
Dumli a écrit :Voila l'interface du serveur en mode fenetré :) Par contre, les raccourcis clavier ne sont pas fonctionnels.
[/code]

normal !! utilise :
AddKeyboardShortcut(#main, #PB_Shortcut_Z, #Z)
et pas
AddKeyboardShortcut(#main, #PB_Key_Z, #Z)
:roll:

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 19:36
par Dumli
On va dire que ta rien vu hein :roll: Merci bien en tout cas ! :lol:

Re: Aide WiFi - Drone terrestre

Publié : mar. 01/mai/2012 20:29
par Dumli
Voici le code du server, j'y ai ajouté quelques fonctionnalités et je suis plutot satisfait :mrgreen: Seul soucis, si je ferme 1 fenetre, elles se ferment toutes :?

En tout cas merci de votre aide ! :wink:

Voici le code :

Code : Tout sélectionner

InitKeyboard()
InitNetwork()

#larg = 300
#haut = 300
#main = 0
#video = 1
#MAXDATASIZE = 100
PORT = 1000

cmd.s = ""

Enumeration
  #Z
  #Q
  #S
  #D
  #cam
  #link
  #Txt
  #bar
  #bartxt
  #buttparam
  #param
  #ip
  #port
  #valid
EndEnumeration

*buffer = AllocateMemory(#MAXDATASIZE)

srv.SOCKADDR_IN

srv\sin_family = #AF_INET
srv\sin_port = htons_(PORT)
srv\sin_addr = MakeIPAddress(192, 168, 0, 100)  ;IP Adresse du WiShield

Procedure win_video(video)
  OpenWindow(#video, 0, 0, 800, 600, "IP Webcam")
  
  WebGadget(#link, 0, 0, 800, 600, URLEncoder("http://192.168.0.16:8080"))
  
  Repeat
    
    event = WaitWindowEvent()
    
    If event = #PB_Event_CloseWindow
      exit_vid = 1
    EndIf
    
    Delay(1)
    
  Until exit_vid = 1
  
EndProcedure

Procedure win_parametre(parametre)
  OpenWindow(#param, 0, 0, 200, 200, "Configuration du serveur")
  
  IPAddressGadget(#ip, 5, 5, 190, 20)
  SetGadgetState(#ip, MakeIPAddress(192,168,0,100))
  
  StringGadget(#port, 5, 5+20+5, 50, 20, "1000", #PB_String_Numeric)
  
  ButtonGadget(#valid, 5+50+5, 5+20+5, 50, 20, "Valider")
  
  Repeat
    
    event = WaitWindowEvent()
    
    If event = #PB_Event_CloseWindow
      exit_param = 1
    ElseIf event = #PB_Event_Gadget
      Select EventGadget()
        Case #valid
          SetGadgetText(#port, "En construction ...")
      EndSelect  
    EndIf
    
    Delay(1)
    
  Until exit_param = 1
  
EndProcedure



OpenWindow(#main,0,0,#larg,#haut,"Interface de commande",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonGadget(#Z, #larg/2-50/2, #haut/4-50/2, 50, 50, "Z")
AddKeyboardShortcut(#main, #PB_Shortcut_Z, #Z)

ButtonGadget(#Q, #larg/2-50/2-50, #haut/4-50/2+50, 50, 50, "Q")
AddKeyboardShortcut(#main, #PB_Shortcut_Q, #Q)

ButtonGadget(#S, #larg/2-50/2, #haut/4+50/2, 50, 50, "S")
AddKeyboardShortcut(#main, #PB_Shortcut_S, #S)

ButtonGadget(#D, #larg/2+50/2, #haut/4-50/2+50, 50, 50, "D")
AddKeyboardShortcut(#main, #PB_Shortcut_D, #D)

ProgressBarGadget(#bar, 2, #haut/2+80, 296, 30, 0, 100)
TextGadget(#bartxt, 2, #haut/2+58, 296, 20, "Transfert inactif !", #PB_Text_Center)

CheckBoxGadget(#cam, 5, #haut-25, 150, 30, "Vidéo caméra embarquée")

ButtonGadget(#buttparam, #larg-105, #haut-25, 100, 20, "Paramètres")

TextGadget(#Txt, 5, 5, 296, 20, "Aucune touche appuyée")

Repeat
  
  event = WaitWindowEvent()
  
  Select event
      
    Case #PB_Event_CloseWindow
      exit = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Z
          cmd="z"
          SetGadgetText(#Txt,"Cliqué sur : " + cmd)
        Case #Q
          cmd="q"
          SetGadgetText(#Txt,"Cliqué sur : " + cmd)
        Case #S
          cmd="s"
          SetGadgetText(#Txt,"Cliqué sur : " + cmd)
        Case #D
          cmd="d"
          SetGadgetText(#Txt,"Cliqué sur : " + cmd)
        Case #cam
          CreateThread(@win_video(),video)
        Case #buttparam
          CreateThread(@win_parametre(), parametre)
      EndSelect
      
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Z
          cmd="z"
          SetGadgetText(#Txt,"Appuyé sur : " + cmd)
        Case #Q
          cmd="q"
          SetGadgetText(#Txt,"Appuyé sur : " + cmd)
        Case #S
          cmd="s"
          SetGadgetText(#Txt,"Appuyé sur : " + cmd)
        Case #D
          cmd="d"
          SetGadgetText(#Txt,"Appuyé sur : " + cmd)
      EndSelect
      
  EndSelect
  
  If cmd <> ""
    
    cmd + #LF$
    
    SetGadgetText(#bartxt, "Création du socket ...")
    SetGadgetState(#bar, 0)
    
    sockfd = SOCKET_(#PF_INET, #SOCK_STREAM, 0)
    If sockfd = -1
      SetGadgetText(#bartxt,"Erreur lors de la creation du socket")
    EndIf
    
    SetGadgetText(#bartxt,"Connection au WiShield ...")
    SetGadgetState(#bar,33)
    
    If connect_(sockfd, @srv, SizeOf(SOCKADDR_IN)) = -1
      SetGadgetText(#bartxt,"Erreur lors de la connexion")
    EndIf
    
    SetGadgetText(#bartxt,"Envoi du packet ...")
    SetGadgetState(#bar, 66)
    
    ;Envoi de la réponse
    If send_(sockfd, @cmd, Len(cmd)+1, 0) = -1
      SetGadgetText(#bartxt,"Erreur lors de l'envoi de la reponse")
      closesocket_(sockfd)
    EndIf
    
    SetGadgetState(#bar, 100)
    
    SetGadgetText(#bartxt, "Fermeture du socket ...")
    closesocket_(sockfd)
    
    SetGadgetText(#bartxt, "Transfert effectué !")
    
    cmd = ""
    
    Delay(20)
    
  EndIf
  
  Delay(1)
  
Until exit = 1