Page 1 sur 3

[RESOLU] SerialPort et WiFi

Publié : jeu. 12/avr./2012 18:25
par Dumli
Salut tout le monde, :D

Je possède une carte Arduino UNO (http://arduino.cc/en/Main/ArduinoBoardUno) avec un module WiFi (http://www.robotshop.com/cupperhead-wif ... duino.html) et je voudrais savoir s'il est possible de lire/envoyer des informations à la carte via le port COM ? J'ai trouvé la librairie SerialPort dans PureBasic mais je voudrais savoir si elle est bien adaptée à ma carte ? Le but serait d'envoyer des appuis de touches du clavier directement à la carte par WiFi. Je voudrais donc dans un premier temps le faire par USB mais au final il faudrait que je parvienne à le faire par WiFi. Là arrive alors la seconde question, est-ce que la méthode du SerialPort sera valable pour envoyer des infos en WiFi ? :?

Merci de m'éclairer sur le sujet :)

Cordialement,

Re: SerialPort et WiFi

Publié : jeu. 12/avr./2012 20:00
par MetalOS
Il te faudra un shield spécifique je pense. Mais pour la programmation il faut utiliser l'IDE arduino.

Re: SerialPort et WiFi

Publié : jeu. 12/avr./2012 20:37
par G-Rom
en théorie oui, de mémoire l'Arduino à un convertisseur usb<>série.
si cela ne marche pas ( je testerais aussi ) , tu peut toujours passer par un max232 pour une communication série.
si tu veut une carte beaucoup plus performante que l'arduino : http://fr.wikipedia.org/wiki/Raspberry_Pi

Re: SerialPort et WiFi

Publié : jeu. 12/avr./2012 21:14
par Dumli
Ah priori donc, je pourrais bien faire un petit programme qui envoie les données directement à la Arduino. Cepedant comment faire pour le WiFi après ? Ca sera radicalement différent ? :?

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 0:29
par MetalOS
Je ne pense pas que l'arduino arrive à lire du code purebasic.

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 7:10
par mad
Bonjour à tous,

Je passais par là, et j'ai croisé ce post...


Pour ton module Arduino, c'est tout à fait possible.


Pour mon propre besoin de télécommander un téléscope, j'ai créer moi même mon système sur une carte, avec un module beaucoup plus basic.

J'ai donc, par rapport au datasheet du constructeur, encaspuler les bits, pour dialoguer avec l'interface.

En fait, bien sûr, arduino ne comprend pas le language de purebasic, mais regarde la méthode de communication. Par exemple le port usb, que j'avais acheté était de marque FTDI. Il est bien connu des électroniciens, car il embarque automatiquement, une puce pour la communication USB.

Pour mon cas, c'est de l'encapsulation de mots de 8bits.

Pour ton cas, cela dépend du module que tu as acheté. Mais c'est tout à fait possible.

Pour ton wifi, il absolument, soit trouver un librairie (en C en rêgle général), afin de d'encapsuler automatiquement ces fameux bit... Car je pense que ce n'est plus sur 8bit, mais beaucoup plus...

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 9:32
par mad
Tiens, pour exemple je t'ai filé l'encodeur décodeur de bits que j'ai fait pour ma puce.
La puce qui est contrôlé est une ULN2003a. La puce que me fait communication et le transports des bits
dans le Bus que j'ai placé entre le COM et l'UNL2003a, est codé sur 8Bits... Logique il y a 8 entrées.


Code : Tout sélectionner

;-----------------------------------------------------------------------------------
;
; Modèle PUREBASIC : 2.6
;
;-----------------------------------------------------------------------------------
;
;-
;
; Titre du programme  : 
;- Auteur              :  MAD
;- Version             :  0
;- Date de création    :
;- Date de modification :
;
; Commentaires et remarques :
; ---------------------------
;
;
;
;
;
;-
;-----------------------------------------------------------------------------------

;-----------------------------------------------------------------------------------
;- Comportement et directives de compilation (pour le compilateur)
;-----------------------------------------------------------------------------------

EnableExplicit
;EnableASM

;-----------------------------------------------------------------------------------
;- Définition des Structures
;-----------------------------------------------------------------------------------

Structure ConfigReveilleActionPort ; Conçu pour la fonction qui programme un bit du FIFO sur un temp donnée
	ID_PeripheriqueUSB.i
	Port.a
	EtatPort.b
	Duree.i ; Exprimer en millisecondes
EndStructure

;-----------------------------------------------------------------------------------
;- Définition des constantes
;-----------------------------------------------------------------------------------

; code erreur


Enumeration 
	#FT_OK
	#FT_INVALID_HANDLE
	#FT_DEVICE_NOT_FOUND
	#FT_DEVICE_NOT_OPENED
	#FT_IO_ERROR
	#FT_INSUFFICIENT_RESOURCES
	#FT_INVALID_PARAMETER
	#FT_INVALID_BAUD_RATE
	#FT_DEVICE_NOT_OPENED_FOR_ERASE
	#FT_DEVICE_NOT_OPENED_FOR_WRITE
	#FT_FAILED_TO_WRITE_DEVICE
	#FT_EEPROM_READ_FAILED
	#FT_EEPROM_WRITE_FAILED
	#FT_EEPROM_ERASE_FAILED
	#FT_EEPROM_NOT_PRESENT
	#FT_EEPROM_NOT_PROGRAMMED
	#FT_INVALID_ARGS
	#FT_NOT_SUPPORTED
	#FT_OTHER_ERROR
	#FT_DEVICE_LIST_NOT_READY
EndEnumeration

Enumeration
	#FT_DEVICE_BM
	#FT_DEVICE_AM
	#FT_DEVICE_100AX
	#FT_DEVICE_UNKNOWN
	#FT_DEVICE_2232C
	#FT_DEVICE_232R
	#FT_DEVICE_2232H
	#FT_DEVICE_4232H
	#FT_DEVICE_232H
EndEnumeration



;Constantes pour la fonction FT_SetBitMode
#FT_BITMODE_RESET	= $00
#FT_BITMODE_ASYNC_BITBANG = $01
#FT_BITMODE_MPSSE	= $02
#FT_BITMODE_SYNC_BITBANG = $04
#FT_BITMODE_MCU_HOST = $08
#FT_BITMODE_FAST_SERIAL = $10
#FT_BITMODE_CBUS_BITBANG = $20
#FT_BITMODE_SYNC_FIFO = $40




;
; Bit d'arrêt (Stop Bits)
;

#FT_STOP_BITS_1 = "0"
#FT_STOP_BITS_1_5 = "1"
#FT_STOP_BITS_2 = "2"

;
; Parité (Parity)
;

#FT_PARITY_NONE = "0"
#FT_PARITY_ODD = "1"
#FT_PARITY_EVEN = "2"
#FT_PARITY_MARK = "3"
#FT_PARITY_SPACE = "4"

;
; Contrôle de flux (Flow Control)
;

#FT_FLOW_NONE = $0000
#FT_FLOW_RTS_CTS = $0100
#FT_FLOW_DTR_DSR = $0200
#FT_FLOW_XON_XOFF = $0400


;
; Encode des bits de la puce FIFO
;
;Représente les pins FIFO codé sur 8 bits.

#FIFO_D0 = %00000001
#FIFO_D1 = %00000010
#FIFO_D2 = %00000100
#FIFO_D3 = %00001000
#FIFO_D4 = %00010000
#FIFO_D5 = %00100000
#FIFO_D6 = %01000000
#FIFO_D7 = %10000000
#FIFO_FULL = #FIFO_D0|#FIFO_D1|#FIFO_D2|#FIFO_D3|#FIFO_D4|#FIFO_D5|#FIFO_D6|#FIFO_D7

;-----------------------------------------------------------------------------------
;- Définition des prototypes
;-----------------------------------------------------------------------------------

Prototype.b FT_Open (NumUSB.i,*ID_USB)
Prototype.b FT_Close (ID_USB)
Prototype.b FT_Read (ID_USB,*RecuperationBiT,NombreBitsARecuperer,*RetourNBBit)
Prototype.b FT_Write (ID_USB,*CodeBinATransmettre,TailleBuffer_CodeBinATransmettre,*RetourNBBitEnvoye)
Prototype.b FT_SetBitMode (ID_USB, BitModeMask, ValeurUcMode)

;-----------------------------------------------------------------------------------
;- Définition des variables
;-----------------------------------------------------------------------------------

Global MUT_InstructionFIFO.i

;-----------------------------------------------------------------------------------
;- Ajout de modules
;-----------------------------------------------------------------------------------
;Import ".\FTDI_whql\static\i386\FTD2XX.obj"
	
;EndImport

;-----------------------------------------------------------------------------------
;- Ajout de données (DATASECTION)
;-----------------------------------------------------------------------------------
DataSection

EndDataSection
;-----------------------------------------------------------------------------------
;- Déclaration des procédures
;-----------------------------------------------------------------------------------
Declare.b ReveilleActionPort(*Config.ConfigReveilleActionPort)
 

;-----------------------------------------------------------------------------------
;- Définition des Objets
;-----------------------------------------------------------------------------------


;-----------------------------------------------------------------------------------
;- Appel de pile / Initialisation de module (initNetwork())
;-----------------------------------------------------------------------------------


;-----------------------------------------------------------------------------------
;- Execution du code
;-----------------------------------------------------------------------------------
MUT_InstructionFIFO = CreateMutex()


;-----------------------------------------------------------------------------------
;- Définition des Fonctions
;-----------------------------------------------------------------------------------
Procedure.i ChargeLibrairieFTDI(EmplacementLibrairie$="ftd2xx.dll")	
	Define ID_OuvertureLibrairieFTD2XX.i
	;Shared ID_OuvertureLibrairieFTD2XX.i
	
	Global FT_Open.FT_Open, FT_Close.FT_Close, FT_Write.FT_Write, FT_Read.FT_Read, FT_SetBitMode.FT_SetBitMode
	
	EmplacementLibrairie$ = madlib_CodeNDF(EmplacementLibrairie$)
	ID_OuvertureLibrairieFTD2XX = OpenLibrary(#PB_Any,EmplacementLibrairie$)		
	
	;Récupération des différentes Fonctions listé en prototype.
	FT_Open = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Open")
	FT_Close = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Close")
	FT_Write = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Write")
	FT_Read = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_Read")
	FT_SetBitMode = GetFunction(ID_OuvertureLibrairieFTD2XX,"FT_SetBitMode")
	
	ProcedureReturn ID_OuvertureLibrairieFTD2XX
EndProcedure

Procedure.a EncodeBinFIFO(Port.a,EtatPort=#PB_Ignore)
	
	Static CodeBinActuel.a
	
	;Encode des bits avec les bits déja existants
	;EncodageBin = RecupereCodeBinaire(ID_PeripheriqueUSB)
	Debug "EncodeBinFIFO : Avant encodage => "+RSet(Bin(CodeBinActuel),8,"0")
	Debug "EncodeBinFIFO : Port demandé   => "+RSet(Bin(Port),8,"0")	
	;Si l'état du port est égal a False alors sous traction binaire du port	
	If EtatPort = #True		
		CodeBinActuel | Port
	ElseIf EtatPort = #False
		CodeBinActuel & ~Port
	ElseIf EtatPort = #PB_Ignore
		CodeBinActuel = Port
	EndIf		
	Debug "EncodeBinFIFO : Après encodage => "+RSet(Bin(CodeBinActuel),8,"0")
	Debug "                                   -------------------------------"
	ProcedureReturn CodeBinActuel
EndProcedure

Procedure.b ConfigureModeBitBang(ID_USB,PortFIFO.b=#FIFO_FULL,Mode=#FT_BITMODE_ASYNC_BITBANG)
	Global MUT_InstructionFIFO
	
	LockMutex(MUT_InstructionFIFO)
		FT_SetBitMode(ID_USB,PortFIFO,Mode)
		;CallFunction(1,"FT_SetBitMode",ID_USB,$FF,Mode)
	UnlockMutex(MUT_InstructionFIFO)
EndProcedure

Procedure.a RecupereCodeBinaire(ID_PeripheriqueUSB,NombreBitARecuperer=8)
	;Shared ID_OuvertureLibrairieFTD2XX
	Protected RetourNBBits.a, RecuperationBiT.a, REF.a
	Global MUT_InstructionFIFO
	
	LockMutex(MUT_InstructionFIFO)
		;CallFunction(ID_OuvertureLibrairieFTD2XX,"FT_Read",ID_PeripheriqueUSB,@RecuperationBiT,NombreBitsARecuperer,@RetourNBBits)
		FT_Read(ID_PeripheriqueUSB,@RecuperationBiT,NombreBitARecuperer,@RetourNBBits)
		REF = RecuperationBiT
	UnlockMutex(MUT_InstructionFIFO)
	ProcedureReturn REF	
EndProcedure

Procedure.a EnvoyeCodeBinaire(ID_PeripheriqueUSB,CodeATransmettre.a) ; Sert juste a envoyer le code binaire au fifo via usb	
	;Shared ID_OuvertureLibrairieFTD2XX
	Protected RetourNBBits.a, REF.a
	Global MUT_InstructionFIFO
	
	LockMutex(MUT_InstructionFIFO)
		Debug "Envoye sur le port usb N° "+Str(ID_PeripheriqueUSB)
		Debug "EnvoyeCodeBinaire : Envoye code binaire :> "+Bin(CodeATransmettre)+ " = "+Str(CodeATransmettre)
		REF = FT_Write(ID_PeripheriqueUSB,@CodeATransmettre,SizeOf(CodeATransmettre),@RetourNBBits)
		;CallFunction(ID_OuvertureLibrairieFTD2XX,"FT_Write",ID_PeripheriqueUSB,@CodeATransmettre,SizeOf(RecuperationBiT),@RetourNBBits)
	UnlockMutex(MUT_InstructionFIFO)
	ProcedureReturn REF
EndProcedure

Procedure.b SignalePortFIFO(ID_PeripheriqueUSB,Port.a,EtatPort.b=#False,Duree.i=#PB_Ignore)
	
	Protected REF.a, ConfigurationDuReveilleDuPort.ConfigReveilleActionPort, *AdresseMem
	
	;Envoye du mot binaire
	REF = EnvoyeCodeBinaire(ID_PeripheriqueUSB,EncodeBinFIFO(Port,EtatPort))
	Debug REF
	;Si durée attente puis inversion du code binaire
	If Duree > #False		
		Debug "Mise en route d'un THD pour le port FIFO"
		If EtatPort = #False
			EtatPort = #True
		Else
			EtatPort = #False
		EndIf		
		
		*AdresseMem = AllocateMemory(SizeOf(ConfigReveilleActionPort))
		
		ConfigurationDuReveilleDuPort\ID_PeripheriqueUSB = ID_PeripheriqueUSB
		ConfigurationDuReveilleDuPort\Port = Port
		ConfigurationDuReveilleDuPort\EtatPort = EtatPort
		ConfigurationDuReveilleDuPort\Duree = Duree
		
		CopyMemory(@ConfigurationDuReveilleDuPort,*AdresseMem,SizeOf(ConfigurationDuReveilleDuPort))
		Debug "--- thd"
		Debug CreateThread(@ReveilleActionPort(),*AdresseMem)
		;Attente de l'acquitement 
	EndIf
	ProcedureReturn REF
EndProcedure

Procedure.b ReveilleActionPort(*Config.ConfigReveilleActionPort)
	Debug "OK"
	
	Delay(*Config\Duree)	
	SignalePortFIFO(*Config\ID_PeripheriqueUSB,*Config\Port,*Config\EtatPort)	
	FreeMemory(*Config)
	Debug "Fin THD"
EndProcedure

Procedure.b PulseSignalePortFIFO(ID_PeripheriqueUSB.i,Port.a,EtatPortDemarrage.b=#True,DureeImpulsion.i=1,NBImpulsion.i=1)
	
	Protected ind_NBImpulsion.i, EtatPortFinImpulsion.b
	
		If EtatPortDemarrage = #True
			EtatPortFinImpulsion = #False
		Else
			EtatPortFinImpulsion = #True
		EndIf
	
	For ind_NBImpulsion = 1 To NBImpulsion
		SignalePortFIFO(ID_PeripheriqueUSB,Port,EtatPortDemarrage)
		Delay(DureeImpulsion)
		SignalePortFIFO(ID_PeripheriqueUSB,Port,EtatPortFinImpulsion)
	Next	
EndProcedure
;-----------------------------------------------------------------------------------
;- FIN
;-----------------------------------------------------------------------------------

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 10:32
par Backup
:)

lorsque tu fais :

Code : Tout sélectionner

Procedure.i ChargeLibrairieFTDI(EmplacementLibrairie$="ftd2xx.dll")   
   Define ID_OuvertureLibrairieFTD2XX.i
   ;Shared ID_OuvertureLibrairieFTD2XX.i
   
   Global FT_Open.FT_Open, FT_Close.FT_Close, FT_Write.FT_Write, FT_Read.FT_Read, FT_SetBitMode.FT_SetBitMode ; <<<<<<<<<<
dans une procedure ç'est ... comment dire ça sans te froisser , :)

dans une procedure utilise Shared , qui sert a partager les variables avec (vers ) l’extérieur (donc les rends Global)
mais sémantiquement c'est pas la meme chose :)
peut etre bien qu'au niveau declaration, et pile non plus d'ailleurs ( j'ai la bulle de ressortir IDA :lol: )

Global n'a rien a faire dans une procedure a mon sens ..
ça sert a déclarer les variables pour l'ensemble du code (donc hors procedure) ..

dans une procedure .. on partage (ou pas ) ce qui se trouve dans une procedure avec "Shared"


recap :
Global rends les variables accessibles par tout le code
Shared : rend les variables créées dans une procédure , accessibles par tout le code


ps : Ne prends pas ça comme une remontrance .. juste comme pour le "Define" .. une information .. rien de plus ;)

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 15:52
par G-Rom
Je ne pense pas que l'arduino arrive à lire du code purebasic.
8O
c’était pas la question.

PB est l'arduino communique très bien , après mes tests.
PB à la lib serial , l'arduino aussi , ils communique sans problèmes. faut juste pensé à temporiser
le programme PB car il va beaucoup plus vite que l'arduino.

Pour ton wifi , c'est un shield , il faudra que tu lançes tes commandes par le biais de PureBasic vers ton arduino, qui lui enverras le reste vers le shield.

PB -> Arduino -> Shield.

je ferais un programme PB qui allume et éteint une LED via l'arduino , je posterais sur le forum.

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 18:25
par G-Rom

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 19:16
par Backup

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 22:28
par Dumli
WOW 8O
Merci les gas ! Franchement ça fait plaisir :o

Je vais étudier tout ça en détail mais une question me trotte toujours, comme faire pour le Wifi ?
Pour ton wifi , c'est un shield , il faudra que tu lançes tes commandes par le biais de PureBasic vers ton arduino, qui lui enverras le reste vers le shield.

PB -> Arduino -> Shield.
D'accord, j'ai déjà le Shield (http://www.robotshop.com/cupperhead-wif ... duino.html) mais je ne comprends pas comment PB peut envoyer des données à la Arduino en WiFi :? Et pour le schéma c'est pas plutôt : PB => Shield => Arduino => Shield => PB ? :lol:

Encore merci en tout cas ! 8O

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 22:36
par G-Rom
non , PB n'a aucun moyen de communiquer en WIFI , il faudrait que tu passes par une lib externe à la rigueur, et encore...
le mieux pour ton cas , c'est deux arduino & 2 shield wifi , un qui commande, l'autre qui reçois, celui qui commande est relié à ton PC

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 23:18
par MetalOS
Cool je ne savais pas que PB pouvais communiquer avec une carte arduino simplement avec la lib serial. Merci G-Rom :wink:

Re: SerialPort et WiFi

Publié : ven. 13/avr./2012 23:47
par Backup
G-Rom a écrit :non , PB n'a aucun moyen de communiquer en WIFI ,
en utilisant les fonctions Reseau de Purebasic ?
lorsque j'ouvre la page de mon routeur , j'envoie bien ma requete par le wifi non ... ? !!

il suffit d'avoir un ip (192.168.0.1)

on peut aussi utiliser Telnet ... ;)

le Wifi , du moment qu'on a une adresse et un port , c'est transparent non ?