Du 240p en VGA sur un Raspberry Pi

Récemment, j’ai tenté un truc intéressant pour les amateurs d’émulation : il est possible d’émettre un signal 240p avec un Raspberry Pi, en VGA. Ca permet notamment de brancher un vieil écran et d’afficher les fameuses scanlines.

Un peu de théorie : du temps de l’analogique, les téléviseurs travaillaient avec une fréquence de balayage horizontale de ~15 kHz. La valeur se calcule assez facilement, je vais expliquer. Pour l’exemple, je vais rester en NTSC (la technologie américaine) mais c’est similaire en PAL ou en SECAM (Europe et France). Une image TV classique en NTSC comprend 525 lignes (et à peu près 480 lignes visibles) à 30 images/s, ce qui donne 15 750 (525 x 30) lignes à balayer en une second (et donc une fréquence de balayage de ~15 kHz). Sur un téléviseur, on travaille généralement en entrelacé pour l’image : d’abord les lignes impaires, puis les lignes paires. Le résultat est ce qu’on appelle du 480i (i, comme interlaced).

Avec les consoles 8 et 16 bits, le fonctionnement est un peu différent (les puristes, désolé, je simplifie un peu). Au lieu d’utiliser toutes les lignes, les consoles n’affichent qu’une ligne sur deux, mais plus rapidement. Elles sortent donc 240 lignes visibles (la moitié de 480) mais avec une verticale de 60 Hz (le double). La fréquence horizontale ne bouge pas : ~15 kHz. Ce mode fait apparaître quelque chose que les amateurs de vieux jeux adorent : des scanlines. Ce sont en fait des lignes noires qui apparaissent entre les lignes affichées. Leur présence s’explique très simplement : il s’agit des lignes qui ne sont pas balayées en 240p.

Avec l’arrivée du VGA, en 1987, la fréquence horizontale augmente. Pour afficher du 640 x 480 à 60 images/s, il faut balayer deux fois plus rapidement, soit ~31 kHz. Depuis, cette valeur minimale s’est imposée dans les écrans pour PC (cathodiques puis, maintenant, LCD) et la majorité des écrans ne descend tout simplement pas sous cette valeur. Mais il existe quelques exceptions : les écrans de bornes d’arcades travaillent en 15 kHz, tout comme les entrées RGB des téléviseurs. Techniquement, il est parfaitement possible de connecter une sortie VGA à une entrée Peritel et d’obtenir une image, tant que la source (PC, etc.) sort un signal avec une fréquence horizontale de 15 kHz. Plus intéressant, ce que j’ai fait ici, de rares écrans acceptent un signal 15 kHz sur l’entrée VGA.

Quel est l’intérêt ? Ce que j’explique au début : les émulateurs. Si vous avez un vieil écran cathodique qui accepte du 15 kHz en entrée, vous pourrez afficher des jeux 8 et 16 bits comme à l’époque. Avec un Raspberry Pi, de base, l’émulateur calcule l’image (pas forcément avec les bonnes proportions), l’upscale plus ou moins bien et l’envoie à votre téléviseur ou moniteur. Selon la définition d’origine de la console et la définition du téléviseur LCD, le résultat est plus ou moins propre. Une console qui sort du 240p (par exemple une Super NES) va permettre un upscale « propre » sur une dalle Ultra HD (2160/240 donne une valeur entière) alors que ce n’est pas le cas sur un téléviseur Full HD (1080/240 donne 4,5). En théorie, un téléviseur 720p donne un bon résultat (720/240 donne 3) mais ce n’est pas réellement le cas étant donné qu’une bonne partie des téléviseur « 720p » utilisent une dalle en 1 366 x 768. Sur un écran cathodique qui accepte du 15 kHz, vous aurez la définition originale, avec des scanlines.

Il n’accepte pas


Il n’accepte pas


Il n’accepte pas


Il n’accepte pas


Il n’accepte pas

Le cas des LCD est un peu particulier. Premièrement, la (grande) majorité des appareils n’accepte tout simplement pas le signal. Pour afficher quelque chose avec le Raspberry Pi, j’ai du essayer deux téléviseur avec entrée VGA (ça ne passe pas), un écran cathodique et six écrans LCD divers et variés avant de finalement trouver un écran qui affiche une image (un Dell ST2320L). Deuxièmement, ça n’a pas un grand intérêt pratique pour les consoles, vu qu’au lieu de laisser l’émulateur effectuer l’upscale, c’est le moniteur qui va le faire. Ca peut toujours servir avec les quelques appareils qui sortent un signal avec une fréquence horizontale de 15 kHz, comme les Amiga ou des hybrides genre le Mega PC d’Amstrad. Dans certains cas, ça donne un résultat différent, mais ça reste loin du résultat d’un affichage sur un écran cathodique. Ceci dit, un écran LCD qui affiche du VGA en 15 kHz (il y a une liste là) peut toujours servir, ne serait-ce (comme moi) que pour vérifier que le montage fonctionne.

Il accepte


Il affiche du 720 x 240

Et le Raspberry Pi ? En fait, il est assez simple de sortir du 240p en VGA sur un Raspberry Pi. Premièrement, il faut un Raspberry Pi de la seconde génération (à partir du B+) avec 40 broches GPIO (contre 26 sur le premier modèle). Deuxièmement, un adaptateur VGA de type « Gert 666 ». Ca se trouve sur eBay pour 6 ou 7 € (il suffit de taper 666 VGA). Le nom provient de l’inventeur de cet adaptateur (Gert van Loo) et du fait qu’il génère des images en 6 bits. L’adaptateur se place sur les GPIO et offre une prise VGA femelle.

L’adaptateur sur un Raspberry Pi A+

Une fois l’adaptateur installé, il suffit d’ajouter quelques lignes dans le /boot/config.txt pour activer l’adaptateur.

dtoverlay=vga666
enable_dpi_lcd=1
display_default_lcd=1
dpi_group=2
dpi_mode=87
#hdmi_timings=256 1 6 17 18 192 1 26 22 29 0 0 0 60 0 4800000 1 # 256:192 Sega Master System (NTSC)
#hdmi_timings=256 1 8 17 21 224 1 7 10 24 0 0 0 60 0 4800000 1 # 256:224 NES, SNES (NTSC)
hdmi_timings=320 1 20 29 35 224 1 10 14 16 0 0 0 60 0 6400000 1 # 320:224 Sega Genesis (NTSC)
#hdmi_timings=320 1 14 46 28 256 1 17 32 9 0 0 0 50 0 6400000 1 # 320:256 Amiga (PAL)

Les lignes précédées d’un # ne sont pas prises en compte, donc il suffit de mettre un # devant une ligne et de le supprimer devant une autre pour changer de mode. EN cherchant sur le Net, vous trouverez facilement les timings pour d’autres consoles et appareils.

Vous pouvez voir ce sujet comme une introduction technique au sujet, dans la suite je montrerais normalement ce que ça donne avec un adaptateur VGA vers Peritel (et si possible avec un écran cathodique).