Pages

10 déc. 2018

OLED - Micropython

Je me suis mis en tête de faire fonctionner un  petit écran oled que j'avais déjà testé sur arduino, sur la carte micropython en SPI, histoire de faire fonctionner un premier hardware sur cette carte.



J'ai pas mal cherché sur le web s'il y avait déjà eu des expériences du genre, mon but étant d'afficher du graphisme et pas seulement du texte.

J'ai quand même trouvé un super tutoriel de chez adafruit de Tonny Dicola qui se rapproche très fort de ce que je veux faire, celui ci fait référence au ESP8266, du coup un bon point pour la librairie en python, mais il existe des différences entre la pyboard 1.1 et l'ESP8266. Il va falloir vérifier quels sont les connectiques à faire entre la carte pyb et l'écran oled. L'écran oled que j'utilises étant différent de celui proposé dans le tutoriel.

Voici le matériel dont je dispose:




Ecran OLED I2C/SPI, 128x64 pixel
série 12864, 0.96 pouces, 
module d'affichage SSD1306
Py Board v1.0, Micropython


Analyse de l'écran OLED:
Il existe plusieurs sortes d'écrans OLEDS avec différents annotations sur les pinouts. Cette version-ci est SPI et I2C. Sur les versions I2C seules, on trouvera 4 pinouts (VCC,GND,SDL,SDA). Les versions SPI ont d'autres sorties, parfois nommées différemment. Voici un tableau comparatifs des différentes nomenclatures des sorties SPI sur ce genre d'écran:


pin OLED > GND VCC D0 D1 RES DC CS
SPI masse 3v3, 5v CLK (clock) MOSI Reset Data Command Cable Select
I2C masse 3v3, 5v SCL SDA - - -

Analyse de la connectique SPI de la carte micropython pyb v 1.1:


On peut observer que cette carte a plusieurs ports SPI disponibles. 


/SS (CS)
SCK
MISO
MOSI
SPI (1)
X5
X6
X7
X8
(cpu name)
A4
A5
A6
A7
SPI (2)
Y5
Y6
Y7
Y8
(cpu name)
B12
B13
B14
B15

Il existe plusieurs notations pour le port SPI (exemple de notation sur le wiki).
On notera ici que l'écran OLED ne reprends pas les notations standard.

J'ai opté pour mon test du port SPI (2), (cela aura de l'importance dans le code lors de l'initialisation du port SPI) ce qui donne ceci pour la connectique:



pin OLED >GNDVCCD0D1RESDCCS
noms SPI
CLK (clock)MOSIResetData CommandCable Select
pin PyBoard >GND3v3Y6 (SCK)Y8Y1Y2Y3 (/SS)

Ce qui est curieux, c'est qu'il semblerait que le D1 ne soit pas le DI (data in), mais plutot le MOSI
Idem pour le CS, Y3 alors que le SS est en Y5 sur la carte, ( software ? à vérifier ).

Code:
J'ai repris deux librairies que j'ai un peu adapté et compilée en une seule, les code originaux de la librarie SSD1306.py et gfx.py de chez adafruit.

Les modifs consistent en la suppression de la partie I2C du code SSD1306. Pour la partie GFX, je n'ai gardé que tout ce qui concerne le remplissage de forme, et j'ai ajouté la notion de polygones à 4 cotés pour mon application.

Le premier code est le main.py a copier dans la pyboard.

On note que dans le code lors de la définition du SPI, j'ai opté pour le Y3 pour le Chip Select(CS) et le Y2 pour le data command (DC).

Le second est la lib oled.





Vous devriez voir un petit carré qui se balade sur l'écran avec un mot qui le suit a droite ou a gauche.



Notez bien:

spi = SPI('Y', mode=SPI.MASTER, baudrate=8000000, polarity=0, phase=0)

Le 'Y', correspond au second port SPI, comme décrit dans la doc pour la définition du constructeur du port.





Aucun commentaire: