Informatique

Programmation en QBasic et Freebasic



Présentation de QBasic

Pour piloter l'alimentation et les aiguillages, le programme QBasic de Microsoft est idéal et est largement utilisé. La programmation est on ne peut plus simple ( pour piloter un élément, il suffit de taper par exemple l'instruction OUT 888,32 où 888 est l'adresse du port parallèle du PC et 32 est l'adresse de la sortie du port qui définit la commande à effectuer).

Pour plus d'information, vous pouvez consulter la page du site de Ulysse Delmas intitulée:
Programmation d'un réseau de train en QBasic.

Ce site présente les instructions du langage QBasic et donne des exemples d'application à la commande d'un réseau de trains.

Malheureusement, QBasic qui fonctionne sous DOS ne traite pas les sons et ne marche qu'avec les anciennes versions de Windows (95 et 98).

Cependant il existe maintenant un compilateur rapide pour QBasic appelé FreeBasic qui est gratuit, rapide et compatible avec toutes les versions de Windows (95, 98, 2000 et XP).

Présentation de Freebasic

Si vous voulez utiliser FreeBasic, je vous conseille une version avec éditeur qui permet d'éditer le programme dans une fenêtre Windows puis de le compiler avec FreeBasic. Vous pouvez utiliser FBIde qui est gratuit et que vous pouvez télécharger en cliquant ici.

Les avantages de Freebasic sont les suivants:
- il est très simple à utiliser (mêmes instructions que QBasic)
- il est compatible avec toutes les versions de Windows
- son compilateur est très rapide, ce qui permet de l'utiliser avec des vieux PC
- il traite les sons et peut servir à sonoriser un réseau
- on peut l'utiliser pour générer un signal DCC (voir la rubrique DCC)

Les inconvénients sont les suivants:
- il gère assez mal les commandes clavier
- le logiciel est en Anglais. Il n'y a pas de traduction française

Pour les débutants en informatique, Freebasic est très bien adapté à la commande automatique d'un réseau où toutes les opérations s'effectuent automatiquement sans intervention de l'opérateur.

Restitution d'un son au format wav avec Freebasic

Vous devez insérer au début du programme l'instruction suivante:

Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Ensuite, dans le programme,l'exécution du fichier son "ambiance.wav" qui doit se trouver dans le même dossier que le programme Freebasic s'écrit comme suit:

Call sndPlaySound("ambiance.wav", SND_ASYNC)

Il faut noter que l'exécution du programme est interrompue pendant la diffusion du son et reprend lorsque le son est terminé.

A titre d'exemple, vous pouvez télécharger le petit programme ci-dessous appelé "SonWavefreebasic" dans lequel vous verrez comment utiliser la fonction sndPlaySound .
Télécharger SonWavefreebasic

Programmation du port parallèle en Freebasic

Les fonctions sont les mêmes qu'en QBasic à savoir :

Out ADRESSE, VALEUR pour envoyer une commande
VALEUR = Inp(ADRESSE) pour recevoir un controle

Les ports travaillent avec des nombres. Ceux-ci peuvent être exprimés en hexadécimal, en binaire ou en décimal, Dans la suite, toutes les valeurs seront exprimées en décimal. De toute façon, vous faites fonctionner le port en envoyant un nombre qui représente le modèle binaire des informations physiques sur le port. Par exemple, pour mettre les 8 lignes de données à 11111111, vous devez envoyer 255. Pour les mettre à 00000000 vous devez envoyer 0.

A titre, le tableau ci-dessous donne la programmation des 8 bits de données du port parallèle (D0 à D7) qui correspondent à l'adresse 888:



De plus, il est souvent nécessaire d'insérer des temporisations entre 2 commandes et on utilise la commande SLEEP de QBasic.

SLEEP 5000 indique une temposisation de 5 secondes (soit 5000 ms)

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ésence 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

Vers la page suivante


Retour vers la page d'accueil