Archive pour décembre 2009

 Youpi, testons les moteurs !

 30 décembre 2009  Bricolage  2 commentaires

J’avais longuement expliqué dans cet article les étapes de fabrication d’un câble parallèle pour relier le robot Youpi à un PC standard.

Aujourd’hui je vais comme promis diffuser les quelques lignes de code permettant de tester l’ensemble des moteurs. Le programme est grandement inspiré de celui que l’on peut trouver sur le site du BTS-IRIS de Niort.

C’est un programme développé à la va-vite en C. Il pourra servir de base pour tous ceux qui comme moi souhaitent vérifier que tous les moteurs sont en bon état de fonctionnement.

Le code

robotest.c :

/*
 Youpi Robot Test program
 ------------------------

 This program has to be run as root
 or with sufficient credentials (suid...)
*/

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/io.h>

// Change this to your parallel port
#define LPT 0x378

// Defines the byte type
typedef unsigned char byte;

/*
 This functions writes a byte to the parallel port
 Do not use any other way to do it as the robot needs to pause
 between each instruction.
*/
void writelpt(byte b) {
	int tempo = 1500;
	outb(b, LPT);
	usleep(tempo);
}

/*
 This is the main function
*/
int main() {

	//Variables
	int i,j;
	int steps = 600;

	//Welcome message
	printf("*** YOUPI ROBOT TEST PROGRAM ***\n");

	//Tries to access parallel port
	if(ioperm(LPT, 1, 1) != 0) {
		perror("ioperm");
		return 1;
	}

	//Initializes the robot
	printf(" * Initialization\n");
	writelpt(0x47);
	writelpt(0x00);

	//Orders earch motor to rotate
	for(j=0; j<6; j++) {
		printf(" * Test of motor %d\n", j);

		//...into one direction
		writelpt(0x80);
		writelpt(0x00);
		for(i=0; i<steps; i++) {
			writelpt(0x40+j);
			writelpt(0x00+j);
		}

		//...into the opposite direction
		writelpt(0xBF);
		writelpt(0x3F);
		for(i=0; i<steps; i++) {
			writelpt(0x40+j);
			writelpt(0x00+j);
		}
	}

	return 0;
}

Et le Makefile qui va avec :

CC=gcc
CFLAGS=-W -Wall -O

all: robotest

robotest: robotest.c
	$(CC) $(CFLAGS) -o $@ $<

clean:
	rm robotest

Quelques explications

Le manuel indique une vitesse de rotation maximale de 40°/s pour tous les moteurs, avec une résolution maximale de 0.03° par 1/2 pas. Chaque 1/2 pas est effectué grâce à l’envoi de 2 instructions par le port parallèle. Pour faire avancer le robot à cette vitesse maximale, il est nécessaire d’espacer chaque instruction d’un temps T en secondes, calculé ci-dessous :

Il faut donc espacer chaque instruction de 1500 µs, ce qui explique les 1500 à la ligne 27 du code. Descendre en dessous de cette limite est susceptible de provoquer des catastrophes inconnues, donc si vous essayez, cela sera à vos risques et périls.

Bugs connus

Avec un sommeil de 1500 µs entre chaque instruction, le programme devrait théoriquement être terminé en approximativement 2+6*(2+600*2)*2*0.0015 = 22 secondes, en négligeant le temps nécessaires aux autres instructions. Hors j’obtiens en moyenne un temps d’exécution à 58 secondes.

Ce phénomène est expliqué en partie par le paragraphe suivant, tiré de la page man 3 de usleep :

La période de sommeil peut être allongée par  la  charge  système, par le temps passé à traiter l’appel de fonction, ou par la granularité des temporisations système.

En résumé, lors de mon test, la vitesse de rotation de chaque moteur n’est pour le moment pas optimale. J’avais fait d’autres essais en réduisant significativement cette temporisation à quelques µs, ou en utilisant nanosleep afin d’avoir une granularité plus fine, mais le temps d’exécution total n’est jamais descendu en dessous de ces 58 secondes. Je ne sais pas encore comment optimiser cette vitesse, cela fait appel à des notions d’architecture système et de programmation temps réel qui me manquent à l’heure actuelle. Dans tous les cas, même si la vitesse est à l’heure actuelle bridée, le programme est néanmoins capable de démontrer le fonctionnement correct de chaque moteur.

Informations complémentaires

J’en profite pour placer un rappel : au lieu de me contacter personnellement pour me demander de l’aide à propos de ce robot, merci d’effectuer cette démarche en laissant un commentaire sur ce site afin que les questions et réponses profitent à tout le monde.

NB : vous pourrez maintenant trouver en un seul clic tous les articles de ce site relatifs au robot Youpi grâce au tag Youpi.

 C’est Noël Théo, c’est l’époque des miracles

 29 décembre 2009  Projet Arcade  Aucun commentaire

Hans Grüber l’avait bien dit dans Piège de Cristal, et il ne pouvait pas être plus proche de la vérité : « C’est Noël Théo, c’est l’époque des miracles. »

Et en cette période de miracles, celui-ci me fait vraiment plaisir : Mon flipper Gold Wings est revenu à la vie !

Les ennuis avaient démarré en mai, avec une panne au niveau des afficheurs. La série noire avait continué en juin, avec un blackout total sur le flipper. Et pour couronner le tout, je n’avais pas eu le temps de m’occuper de ces problèmes, à part vérifier un par un tous les fusibles sur les conseils des membres de Gamoover.

Le problème était à la fois simpliste et vicieux, puisque la rouille avait recouvert un des fusibles de l’alimentation principale ainsi que son support, empêchant ainsi le passage du courant en position normale, alors que le fusible donnait un résultat positif au testeur… C’est papa AlphaK qui à trouvé la panne ;)

Malheureusement, la remise en route de la machine n’a pas ressuscité les afficheurs par la même occasion. Mais on avance… Lorsque j’aurai un peu de temps, j’irai vérifier les connecteurs et les niveaux de tension avec les schémas électriques sous la main, avec l’espoir de régler de manière définitive tous les problèmes sur ce flip…

 Pong Clock :: calcul des trajectoires

 16 décembre 2009  Bricolage  Aucun commentaire

Deux rapides améliorations ont été apportées :

La police de caractères utilisée pour l’affichage des scores a été modifiée pour se rapprocher du jeu original, plus « carrée », composée de lignes simples. Ça n’a l’air de rien comme ça, mais j’ai dû « dessiner » les 10 chiffres pixel par pixel dans le code (par groupe de 8 pixels, pour être précis). Ce qui donne un truc très sympa dans ce genre là (une ligne = un caractère) :

unsigned char pongfont[4096] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // chr(0)
// [...]
254,254,198,198,198,198,198,198,198,198,198,198,198,254,254,0, // chr(48) = 0
24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,0, // chr(49) = 1
254,254,6,6,6,6,254,254,192,192,192,192,192,254,254,0, // chr(50) = 2
254,254,6,6,6,6,62,62,6,6,6,6,6,254,254,0, // chr(51) = 3
198,198,198,198,198,198,254,254,6,6,6,6,6,6,6,0, // chr(52) = 4
254,254,192,192,192,192,254,254,6,6,6,6,6,254,254,0, // chr(53) = 5
254,254,192,192,192,192,254,254,198,198,198,198,198,254,254,0, // chr(54) = 6
254,254,6,6,6,6,6,6,6,6,6,6,6,6,6,0, // chr(55) = 7
254,254,198,198,198,198,254,254,198,198,198,198,198,254,254,0, // chr(56) = 8
254,254,198,198,198,198,254,254,6,6,6,6,6,254,254,0, // chr(57) = 9
// [...]
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  // chr(255) = ÿ
};
Mise à jour de la police de caractères, premières informations de trajectoire.

Mise à jour de la police de caractères, premières informations de trajectoire.

Enfin, pas forcément plus simple, sans être non plus très complexe, la détermination de la trajectoire qui sera suivie par la balle lorsqu’elle touche la raquette, jusqu’à la raquette adverse, affichée en vert sur ces captures d’écran en mode debug.

Le nombre de rebonds peut rapidement devenir important...

Le nombre de rebonds peut rapidement devenir important...

C’est à peu près tout ce qu’il est possible de faire à ce stade avec des images fixes. Les prochaines modifications m’amèneront certainement à me lancer à minima dans l’animation de la balle.

 Pong Clock, les premières images

 16 décembre 2009  Bricolage  Aucun commentaire

Voila enfin, en exclusivité mondiale, les premières images du développement de l’horloge Pong !

Avec également un petit bilan intermédiaire des frais :

  • 2/3 heures de développement
  • 200 lignes de code (sans la police de caractères)

Avec en contrepartie les résultats suivants :

  • Affichage du terrain, des raquettes, et de la balle.
  • Affichage du score (police non définitive) en fonction de de l’heure système.
  • Gestion d’une zone vide optionnelle au dessus du terrain, pouvant être dédiée à l’affichage des scores ou de tout autre information.
  • Taille du terrain, des raquettes, et de la balle customisables.
  • Gestion de plusieurs résolutions en 4/3 de 320*240 à 1600*1200.
  • Affichage des premiers éléments de débogage.

Pour faciliter mes tests, les développements sont effectués sur une machine virtuelle. Les captures d’écran sont également issues de cette VM. Voici l’écran d’initialisation :

L'écran de départ, balle au centre, score initialisé à l'heure courante : 20h27.

L'écran de départ, balle au centre, score initialisé à l'heure courante : 20h27.

Les éléments sont pour le moment tous fixes. Dès les premiers moments d’animation, je devrai contrôler que chaque élément reste dans son périmètre. C’est pourquoi j’ai d’ores et déjà commencé à afficher en surimpression quelques éléments de débogage.

  • En rouge le périmètre de mouvement de la balle, par rapport à son centre.
  • En bleu le rail des deux raquettes, par rapport à leur centre également.
Affichage des infos de débogage. Notez la zone vide en haut de l'écran, réduisant ainsi la taille du terrain.

Affichage des infos de débogage. Notez la zone vide en haut de l'écran, réduisant ainsi la taille du terrain.

Je trouve le résultat satisfaisant pour le moment. On attaquera les choses sérieuses la prochaine fois, puisqu’il faudra commencer à animer les différents éléments, et prévoir la trajectoire de la balle.

Stay tuned.

 Nouveau matos pour la Mamecab

 15 décembre 2009  Projet Arcade  Aucun commentaire

Lorsque je parlais de nouveau PC dans l’article précédent, avec un petit air de ne pas y toucher, j’étais en réalité déjà dans le vrai. La faute à un nouveau venu qui s’ajoute au capharnaüm de mon appartement : un PC à la config plus qu’honorable généreusement donné par Flo, que je remercie chaleureusement.

Une très belle bête à base d’Athlon 64 3500+, GeForce 6600 LE, 1 Go de RAM DDR1.

Même le boîtier en jette !

Même le boîtier en jette !

Ça serait presque trop pour une Mamecab, mais j’ai bien envie de faire un comparatif avec la config actuelle pour voir si ça booste dans les jeux les plus gourmands.

La config actuelle, qui n’est pas trop à la ramasse, comprend un Athlon XP 1800+, une GeForce 6200, avec entre 512 Mo et 1 Go de RAM DDR1. Donc à mon avis, ça risque de booster sévère. Mais je préfère ne pas m’emballer, les résultats des tests me permettront de prendre une décision mûrement pesée.

En attendant, juste pour le fun, j’ai booté la machine dépourvue de disque dur sur un Live CD de Damn Small Linux, que j’utilise aussi sur ce projet, et je n’ai pas attendu longtemps pour voir un bureau apparaître. Bureau + terminal + navigateur démarrés, la conso mémoire est en dessous de 30 Mo. C’est donc vraiment une distro idéale pour les petites configs orientées bureautique et navigation internet.

Un bureau complet et réactif pour 30 Mo et sans disque dur, que demande le peuple ?

Un bureau complet et réactif pour 30 Mo et sans disque dur, que demande le peuple ?

À la prochaine pour le résultat des tests.

PS : je sais, mes photos brûlent toujours les yeux, j’attends que les périodes de Noël soient terminées pour m’offrir un pur appareil photo à prix abordable.

 Bienvenue au nouveau

 14 décembre 2009  Projet Web  Aucun commentaire

Nouveau quoi ?

Nouveau PC ? Non, du moins pas encore, mais c’est pour bientôt.

Nouveau projet farfelu ? J’en ai des tas en réserve, mais pas dans un état suffisamment avancé pour en parler.

Vestige d'un passé lointain...

Vestige d'un passé lointain...

Non, le nouveau, c’est un site web, ou plutôt un sous-ensemble de pages dans le même domaine. On pourrait presque dire un nouveau blog, mais je n’aime pas l’idée de mettre en ligne des blogs ni de me considérer comme un blogueur, même si mes articles sont écrits avec un outil de gestion de blogs. Je préfère parler de CMS (et pan, avec un seul mot bien placé, je sors de la bulle pleine de préjugés du blogueur amateur et j’entre dans celle réservée aux professionnels qui se la pètent).

Alors, quel est ce nouveau contenu ? C’est un ensemble de pages à la ligne éditoriale bien différente de celle-ci, qui justifie à elle seule un cloisonnement bien distinct.

J’y placerai toutes mes railleries, tous mes pics de colère, toutes mes bouderies et mes irritations psychologiques, toutes mes fustigations politiquement incorrectes, qui n’auront pas leur place dans ces pages. Tout comme Docteur Jeckyll a son Mister Hyde, tout comme Renaud a son Renard, tout comme Presse-citron a son antiblog, AlphaK aura son dark side. Et ça, c’est nouveau.