Présentation de Visual Basic
Visual Basic de Microsoft est un langage objet qui est assez facile à mettre en oeuvre puiqu'il utilise des instructions très proches du Basic et qui offre des possibilités presqu'illimitées en terme d'interface graphique et de sonorisation
Si vous avez déjà quelques connaissances en informatique , alors il est intéressant de l'employer pour la commande d'un réseau de trains. Sinon, il vaut mieux utiliser Freebasic qui est beaucoup plus simple à maitriser.
Lorsqu’on écrit une application Visual Basic, on crée un ensemble d’objets, et les procédures qui s’y rapportent. Lorsqu’on sauvegarde cette application, Visual Basic va créer un certains nombre de fichiers:
- Un fichier dit " projet " comportant l’extension .vbp. Ce fichier rassemble les informations générales de votre application (notamment les lignes de codes)
- Un fichier par objet Form créé
- un ou plusieurs fichiers module
lors de l’exécution, le langage est ce qu’on appelle " compilé à la volée ". C’est-à-dire que VB traduit vos lignes de code au fur et à mesure en langage machine, puis les exécute. Cela ralentit naturellement considérablement l’exécution, même si sur de petites applications, c’est imperceptible.
C’est pourquoi, une fois l’application (le " projet ") mis au point définitivement, VB vous propose de le compiler une bonne fois pour toutes, créant ainsi un unique fichier *.exe. Ce fichier contient cette fois à lui seul l’ensemble de votre projet, Form, code, et tutti quanti. Et il peut naturellement être exécuté sans l’ouverture préalable de Visual Basic.
Un projet terminé est donc un projet compilé.
Et qui, accessoirement, fonctionne sans erreurs.
On peut trouver une présentation complète en Français de Visual Basic sur le site de l'Université de Jussieu
Depuis la version 2005 de Visual Studio, Microsoft propose les Express Editions, des versions limitées mais gratuites de leurs produits, destinées essentiellement aux étudiants. La firme de Redmond ne déroge pas à la règle avec la version 2008 de la suite et propose ainsi un Visual Basic Express Edition 2008.
Comme pour son prédecesseur, on retrouve donc les qualités de Visual Basic et notamment la possibilité de créer facilement et de manière visuelle des applications Windows tirant parti de nombreuses technologies : bases de données, son, vidéo ... Au rang des nouveautés apportées par la version 2008, on trouve notamment la possibilité de réaliser des applications tirant parti des technologies Silverlight ou WPF.
Il faut noter que cette version bien que limitée est largement suffisante pour couvrir toutes les applications liées au modélisme ferroviaire.
Vous pouvez télécharger Visual Basic Express Edition 2008 sur le site de Microsoft en cliquant ici
ici.
On peut trouver un cours Visual Basic 2008 complet et en Français sur le site de
Philippe Lasserre.
Programmation du port parallèle en Visual Basic
En Visual Basic, il n'est pas possible d'accéder directement aux ports du PC. Pour cela, nous avons recours aux célèbres DLL qui permettent d'étendre les possibilités du langage. Nous allons utiliser Inpout.dll (comprendre Inp-out, en rapport avec les fonctions du même nom en Basic) qui contient deux fonctions permettant de lire et d'écrire dans un des trois registres. Cette dll est disponible un peu partout sur le net et en téléchargement ici :
Enregistrer la DLL
Les prototypes des fonctions sont les suivants :
Out ADRESSE, VALEUR
VALEUR = Inp(ADRESSE)
Tout projet nécessitant l'utilisation de cette DLL doit contenir un module servant à déclarer ces nouvelles fonctions que Visual Basic ne connaît pas. Il faut aller dans le menu "Projet" puis cliquer sur "Ajouter un module". Inscrire alors dans ce module le code suivant :
Public Declare Function Inp Lib "inpout32.dll"
_
Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll"
_
Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
De plus, il est souvent nécessaire d'insérer des temporisations entre 2 commandes. La commande SLEEP de QBasic ou RapidQ existe aussi en Visual Basic mais il faut la déclarer:
Private Declare Sub Sleep Lib "Kernel32.dll" (ByVal dwMillisenconds As Long)
Le temps est exprimé en millisecondes.
Par exemple pour effectuer une temposisation de 5 secondes, il faut taper l'instruction suivante:
Sleep (5000)
Pour le traitement des données d'entrée sur le port parallèle qui correspondent à l'adresse 889, on utilise la fonction Inp(889) qui renvoie une valeur décimale qui dépend du niveau des signaux appliqués aux broches d'entrée du connecteur.
A titre d'exemple, voici les valeurs obtenues avec mon PC pour l'une des entrées:
niveau d'entrée 5 Volts (contact ouvert): Inp(889) = 127
niveau d'entrée 0 Volts (contact fermé): Inp(889) = 111
Dans le programme qui se déroule séquentiellement, si la donnée d'entrée correspond par exemple à la fermeture d'un détecteur de passage, le programme doit attendre le signal de fermeture avant de passer à l'instruction suivante. J'utilise le sous-programme suivant:
120 'détection de présence'
121 If Inp(889) = 111 Then
GoTo 122
Else
GoTo 121
End If
122 Return
Dans ce sous programme, la fermeture du contact du détecteur de préence correspond à Inp(889) = 111. Tant que le contact n'est pas fermé, le programme fonctionne en boucle fermée.
Par exemple pour faire démarrer progressivement une locomotive (accélération pendant 5 secondes) et l'arrêter après passage sur le détecteur, il faut écrire les instructions suivantes:
out 888,2 (2 correspond à la fermeture du relais qui commande l'accélération)
Sleep (5000)
out 888,0 (0 correspond à un état stable: les relais sont ouverts)
gosub 120 (appel du sous programme de détection de passage)
out 888,8 (8 correspond à la fermeture du relais qui commande la décélération)
Sleep (5000)
out 888,0
Restitution d'un son au format wav
J'utilise la fonction sndPlaySound qui permet de lire un fichier son de type WAVE qui est indiqué à la fonction soit par son chemin d'accès soit par une clef du registre.
Pour utiliser cette fonction, il faut la DLL winmm.dll que vous pouvez télécharger ici:
Enregistrer la DLL
Le code à utiliser pour générer un son est le suivant.
Dans la section Déclarations du module ou de la feuille insérer:
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Dans le programme , l'exécution du fichier son "toto.wav" qui se trouve par exemple dans le dossier "musique" du disque C s'écrit comme suit:
Call sndPlaySound("c:\musique" + "\toto.wav", SND_ASYNC)
SND_ASYNC signifie que le son sera diffusé jusqu'à la fin même si d'autres instructions sont exécutées par le programme.
Pour arrêter le son, il faut appeler SndPlaySound avec une valeur nulle pour le chemin d'accès, par exemple:
Call sndPlaySound("", SND_ASYNC)
Une autre solution, plus lourde, consiste à employer les contrôles MCI ou Windows Media Player. L'avantage de ces contrôles est que, contrairement à l'API SndPlaySound, ils permettent de jouer des sons dans des formats différents (wav, mp3, wma, midi, etc...)
A titre d'exemple, vous pouvez télécharger le petit programme ci-dessous appelé "SonWave" dans lequel vous verrez comment utiliser la fonction sndPlaySound.
Enregistrer "SonWave"
Logiciels de commande du réseau
J'ai développé 3 logiciels écrits en Visual Basic qui réalisent les fonctions suivantes:
- TCO logiciel qui remplace un TCO classique (sans sonorisation)
- programme de commande entièrement automatique avec sonorisation
- programme de jeu
Ces 3 logiciels écrits en Visual Basic ne sont pas proposés en téléchargement car ils sont trop spécifiques de mon réseau.
Cependant, si vous êtes intéressés par développer des logiciels de ce type ou si vous en avez déjà réalisés, n'hésitez pas à me contacter.
Je suis prêt à répondre à toute question.
Programme de commande automatique
Dans la version la plus complète, 7 trains vont effectuer des manoeuvres séquentiellement. A un instant donné, un seul train manoeuvre. Cette limitation est du au fait que le réseau est sonorisé: avant le début de chaque manoeuvre une explication est donnée aux spectateurs puis lors de la manoeuvre, les haut-parleurs placés sous le réseau suivent le mouvement du train. Dans ces conditions, la commande simultanéé de plusieurs trains est très difficile.
Voici à titre d'exemple l'écran affiché lors de l'exécution d'un trajet.
Logiciel de jeu
Je pense que l'aspect ludique est à privilégier lorsque l'on s'intéresse aux trains miniatures.
C'est beau de voir un réseau évoluer mais il est aussi intéressant d'être acteur, surtout si on s'adresse à un public de jeunes.
C'est pourquoi, j'ai développé un logiciel de jeu qui consiste à réaliser un certain nombre de trajets avec plusieurs trains dans le minimum de temps.
Le jouer doit choisir un trajet dans une liste déroulante, commuter les aigulles correspondant au trajet choisi, faire démarrer le train et l'arrêter au bon endroit.
Le PC supervise les opérations en donnant des pénalités lorsque des erreurs sont effectuées, calcule et affiche le temps écoulé.
La figure ci-dessous montre l'interface graphique du jeu programmé en Visual Basic.
Les actions effectuées par le joueur sont les suivantes:
- choix du trajet à effectuer (un parmi 15). Il y a un ordre optimal à trouver, certains trajets n'étant pas autorisés au début du jeu (voies occupées par des wagons ou locos en stationnement par exemple).
- commutation des aiguilles permettant d'effectuer le trajet
- commande du départ du train
- commande de l'arrêt du train en fin de trajet.
Le jeu se termine lorsque les 15 trajets ont été effectués et le temps réalisé s'affiche. Le temps affiché inclut les pénalités éventuelles pour erreur de trajet ou erreur d'aiguillage.
Le joueur utilise le PC pour choisir le trajet et les aiguilles. Le démarrage et l'arrêt des trains sont effectués par des boutons poussoirs.