Symboles OPOS6UL et OPOS6UL_NANO dans Kicad

[Article sponsorisé]

Armadeus Systems utilise un logiciel de routage relativement onéreux et complètement fermé pour concevoir ses modules SoM. Ce logiciel est indispensable en interne pour concevoir des cartes électroniques aussi complexe que des modules processeurs.

L’APF6, ce genre de module qui nécessite presque une dizaine de couche de cuivre pour être routé proprement.

Logiciel que tout le monde ne peut pas forcément se permettre d’acheter, surtout si c’est pour faire une petite carte d’accueil.

Conscient de ce problème, la société a entamé une migration de la conception de ses cartes d’accueil avec le logiciel Kicad. La technologie des cartes d’accueil de ses SoM étant beaucoup plus simple, il était possible de les migrer sur un logiciel libre.

Kicad est un logiciel libre de conception électronique qui permet de faire le schéma électronique ainsi que le routage. Kicad génère les fichiers de fabrication au format ouvert GERBER. Format qui est parfaitement reconnu par la plupart des sous-traitants électronique (EMS).

Pour qu’un utilisateur de Kicad puisse faire un design avec nos SOM, il est donc indispensable qu’il puisse disposer des symboles et footprint. C’est donc ce qui a été ajouté officiellement dans kicad pour les cartes OPOS6UL et OPOS6UL_NANO.

Ces deux cartes ont déjà été évoquées sur ce blog, elles ont l’avantage d’être de taille extrêmement réduite pour un système Linux embarqué complet.

L’OPOS6UL à gauche, et deux OPOS6UL_NANO à droite.

OPOS6UL

L’OPOS6UL est une petite carte SOM à bas coût mais au grande performances.

L’OPOS6UL est un SOM à base de processeur i.MX6UL. Le connecteur utilise le form-factor d’un connecteur de barrette de RAM SODIMM 204 pins. Comme le connecteur est standard, il suffit de l’associer au footprint déjà présent dans la librairie Kicad.

Le symbole de l’OPOS6UL vient donc d’être intégré à la librairie officiel de Kicad via le commit de K.Joly.

OPOS6UL_NANO

L’OPOS6UL_NANO: la petite sœur.

l’OPOS6UL_NANO est la petite sœur de l’OPOS6UL. Petite par la taille, mais grande par la performance. Le connecteur utilisé est également un standard: le connecteur NGFF (M.2) 67pts. plus souvent appelé par son diminutif «M2».

Le symbole de l’OPOS6UL_NANO. Le SOM contient nettement moins de connexions, mais il est également nettement plus petit (3x plus petit que sa grande sœur).

Le symbole vient également d’être accepté dans la librairie officiel de Kicad avec le commit suivant.

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Une raspberrypi version RISCV pour moins de 100$ ?

On attendait la sortie du module processeur à 12.50$ muni d’un proc Allwinner XuanTie C906.

Le module promis à 12.5$

Hé bien pour le moment nous n’avons pas de nouvelles.

Par contre la carte Allwinner D1 nommée Nezha est belle et bien de sortie sur indiegogo. Elle est juste «un peu» plus cher que prévue puisque le prix du kit débute à 99$.

La carte «raspberrypi like» nommée Nezhra

Ça reste tout de même nettement moins cher que la carte BeagleV et son processeur StarFive dual U74 (Nettement moins puissant également).

La carte BeagleV qui est la plus puissante des carte RISCV à tarif abordable pour faire tourner linux 😉

Mais, si on exclu l’ovni MaixPy qui ne fonctionne pas très bien avec Linux, on peut affirmer que c’est la moins cher des cartes RISCV à pouvoir faire tourner une distribution Linux «de bureau».

Publié dans électronique, embarqué, informatique, Non classé | Marqué avec | Laisser un commentaire

Zephyr sur Longan Nano

Zephyr est un système d’exploitation temps réel pour microcontrôleur. Parler d’OS peut parfois faire réagir puisqu’il n’y a pas vraiment de noyau (kernel) et que tout est compilé en un seul firmware que l’on télécharge dans la mémoire du micro.

Ce n’est pas le seul RTOS existant pour microcontrôleur. Il a le gros avantage cependant d’être soutenu par la fondation Linux. Les deux grandes forces de ce système sont sa documentation et le support de nombreux protocoles réseaux (avec ou sans fils).

C’est le parfait OS à tester sur le GD32VF de gigadevice. Cependant, le portage n’est pas terminé. Le processeur n’apparaît donc pas dans la documentation officielle. Le seul tutoriel (en japonais) que j’ai trouvé se trouve là. J’en ai fait une traduction semi-automatique ici.

La version de Zephyr patché correspondante se trouve ici.

Essayons ici d’appliquer ce tutoriel.

On vérifiera sur le site officiel que nous avons bien installé toutes les dépendances sur notre machine.

Zephyr a besoin d’un outils python nommé west, c’est un projet à part mais qui reste dans le giron de Zephyr.

$ python -m pip install west
$ west init ~/zephyrproject 
$ cd ~/zephyrproject west update
$ python -m pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

On supprime le git officiel de zephyr téléchargé avec west Puis puis on clone le fork Zephyr de Soburi:

$ rm -rf zephyr
$ git clone https://github.com/soburi/zephyr.git
$ cd zephyr
$ git checkout longan_nano_2_5_0Langage du code : PHP (php)

Notez la branche remotes/origin/longan_nano_2_5_0 qui contient le travail de portage sur la longan_nano.

On installe le SDK (attention ~1Go)

$ cd ~/zephyrproject
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.4/zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ chmod +x zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ ./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d ~/zephyr-sdk-0.12.4
$ export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.12.4/Langage du code : PHP (php)

Manque plus qu’à mettre à jour avec le nouveau zephyr (de soburi) patché :

$ cd ~/zephyrproject
$ west update

Puis nous pouvons compiler le hello world :

$ cd ~/zephyrproject/zephyr/
$ west build -p auto -b sipeed_longan_nano samples/basic/blinky
Langage du code : JavaScript (javascript)

Flashage sur la longan nano

Avec le jtag

Si tout s’est bien passé on doit pouvoir maintenant flasher le binaire sur la carte. J’utilise pour cela l’adaptateur jtag de sipeed.

$ pip3 install pyelftools

Pour le moment j’ai pas encore réussi. Mais ça doit pouvoir se faire puisque ça marche avec openocd.

Avec l’usb par dfu-util

Pour avoir un fonctionnement correct il faut utiliser une version à jour du git du projet :

$ cd ~/zephyrproject
$ git clone git://git.code.sf.net/p/dfu-util/dfu-util
$ cd dfu-util
$ ./autogen.sh 
$ ./configure
$ make
$ sudo make installLangage du code : PHP (php)

J’ai suivi les conseils d’un lecteur.

$ git clone https://github.com/riscv-mcu/gd32-dfu-utils.git
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ dfu-util -V
 dfu-util 0.10-dev
 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 Copyright 2010-2021 Tormod Volden and Stefan Schmidt
 This program is Free Software and has ABSOLUTELY NO WARRANTY
 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/Langage du code : PHP (php)

Puis, pour télécharger le binaire, taper la commande :

$ dfu-util -d,28e9:0189 -s 0x8000000:leave -a 0 -D build/zephyr/zephyr.bin
dfu-util 0.10-dev
 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
 Copyright 2010-2021 Tormod Volden and Stefan Schmidt
 This program is Free Software and has ABSOLUTELY NO WARRANTY
 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
 dfu-util: Warning: Invalid DFU suffix signature
 dfu-util: A valid DFU suffix will be required in a future dfu-util release
 Opening DFU capable USB device…
 Device ID 28e9:0189
 Device DFU version 011a
 Claiming USB DFU Interface…
 Setting Alternate Interface #0 …
 Determining device status…
 DFU state(2) = dfuIDLE, status(0) = No error condition is present
 DFU mode device DFU version 011a
 Device returned transfer size 2048
 DfuSe interface name: "Internal Flash  "
 Found GD32VF103, which reports a bad page size and count for its internal memory.
 Fixed layout based on part number: page size 1024, count 128.
 Downloading element to address = 0x08000000, size = 19308
 Erase       [=========================] 100%        19308 bytes
 Erase    done.
 Download    [=========================] 100%        19308 bytes
 Download done.
 File downloaded successfully

Qui télécharge bien le binaire visiblement, et fait clignoter la led.

Pour s’assurer que c’est bien notre programme qui clignote, on peut changer la couleur de clignotement en modifiant la ligne suivante dans le fichier samples/basic/blinky/src/main.c:

# Ligne 16:
- define LED0_NODE DT_ALIAS(led0)
+ define LED0_NODE DT_ALIAS(led1)Langage du code : PHP (php)

Et relancer la compilation avec west:

$ west build -p auto -b longan_nano samples/basic/blinky
[3/9] Linking C executable zephyr/zephyr_prebuilt.elf
 [9/9] Linking C executable zephyr/zephyr.elf
 Memory region         Used Size  Region Size  %age Used
              ROM:       19308 B       128 KB     14.73%
              RAM:        4740 B        32 KB     14.47%
         IDT_LIST:          0 GB         2 KB      0.00%

Puis retélécharger pour voir la led verte clignoter.

Utilisation de la toolchain Platformio

La toolchain se trouve ici.

Le sdk nuclei se trouve ici et peut être téléchargé .

export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile
export CROSS_COMPILE=/home/fabien/zephyrproject/nuclei/gcc/bin/riscv-nuclei-elf-Langage du code : JavaScript (javascript)

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

La Raspberry Pi pico et ses 10 cores !

J’imagine que vous connaissez déjà le microcontrôleur à 4$ de la fondation RaspberryPi. En effet, un microcontrôleur dual cores cadencé à 133Mhz ça ne passe pas inaperçu.

Dual cores ? Vous êtes sûr ? Regardez bien la datasheet. Le processeur principal est bien constitué de 2 cœurs ARM Cortex-M0 ça c’est certain. Mais en lisant dans le détail on découvre un curieux périphérique nommé PIO state machine (chapitre 3) :

Qui permet d’exécuter des instructions assembleurs stockée dans une mémoire d’instructions spécifique.

2×4 véritables petits cœurs de processeurs qui accèdent directement aux GPIO du micro.

Voila des petits cœurs très intéressant dans le domaine de l’embarqué, surtout pour des application temps réel «dur».

La pico Pi n’est donc pas Dual-core mais 10-cores !

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Longan Nano avec le JTAG et openocd

Dans l’article précédent sur le sujet j’utilisai exclusivement le connecteur USB-C de la longan nano pour tout faire : alimenter la carte, communiquer et télécharger le firmware via le dfu.

Ça permet de faire beaucoup de choses, mais il serait intéressant de pouvoir poser des points d’arrêt dans son code pendant le développement au moyen d’une sonde JTAG par exemple. Or la carte possède un header avec les signaux JTAG. C’est le moment de rentabiliser la sonde Sipeed USB-JTag commandée en même temps que la longan.

Le branchement de la sonde sur la longannano est très simple il suffit de brancher les signaux du même nom entre eux avec des câbles dupont femelle:

L’adaptateur jtag de sipeed sipeed-rv-debugger branché sur la longan nano

Tout d’abord, installons et compilons openocd pour le riscv :

$ git clone https://github.com/bukinr/riscv-openocd
$ cd riscv-openocd
$ ./bootstrap
$ ./configure
$ makeLangage du code : PHP (php)

Pour la suite de mes tests je me suis inspiré du projet riscv-rust, même si l’objectif premier n’est pas de faire du rust (c’est juste l’objectif second), le projet donne toutes les configurations utiles pour openocd.

$ cd ..
$ git clone https://github.com/riscv-rust/longan-nano
$ cd longan-nano
$ ../riscv-openocd/src/openocd -f sipeed-jtag.cfg -f openocd.cfg &
Open On-Chip Debugger 0.10.0+dev-00924-g03cde8a0b (2021-01-14-21:26)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 8000 kHz

Info : clock speed 8000 kHz
Error: Can't run cJTAG reset escape sequences: TCK signal is not defined
Error: Can't run cJTAG reset escape sequences: TCK signal is not defined
Error: Can't run cJTAG reset escape sequences: TCK signal is not defined
Info : JTAG tap: riscv.cpu tap/device found: 0x1e200a6d (mfg: 0x536 (Nuclei System Technology Co.,Ltd.), part: 0xe200, ver: 0x1)
Info : JTAG tap: auto0.tap tap/device found: 0x790007a3 (mfg: 0x3d1 (GigaDevice Semiconductor (Beijing)), part: 0x9000, ver: 0x7)
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -irlen 5 -expected-id 0x790007a3"
Info : datacount=4 progbufsize=2
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=32, misa=0x40901105
Info : Listening on port 3333 for gdb connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Langage du code : PHP (php)

Une fois le serveur openocd lancé on peu s’y connecter avec telnet par exemple :

$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Info : accepting 'telnet' connection on tcp/4444
Open On-Chip Debugger
> riscv.cpu curstate
halted
> scan_chain
   TapName             Enabled  IdCode     Expected   IrLen IrCap IrMask
-- ------------------- -------- ---------- ---------- ----- ----- ------
 0 riscv.cpu              Y     0x1e200a6d 0x1e200a6d     5 0x01  0x03
 1 auto0.tap              Y     0x790007a3 0x00000000     5 0x01  0x03

Langage du code : JavaScript (javascript)

Voila ça semble marcher sur l’ordinateur. Mais pour aller plus loin j’ai préféré faire avec vscode.

Pour l’utiliser avec VScode il y a quelques tricks à savoir.

Tout d’abord les dépendances :

sudo apt install libhidapi-dev

Puis le problème de la librairies manquante :

 <em>cd /usr/lib/x86_64-linux-gnu; sudo ln -s libmpfr.so libmpfr.so.6</em>Langage du code : HTML, XML (xml)

Et voila, vous devriez pouvoir faire de l’exécution pas à pas de votre programme sur la Longan Nano désormais.

Publié dans électronique, embarqué, informatique, Non classé | Marqué avec , , , , | Laisser un commentaire

Rhaaa les listes en python !

Parfois python laisse dubitatif :

In [1]: alist = [{"pouet": 0, "prout":1},]*12                                                                                                                                                                      

In [2]: alist                                                                                                                                                                                                      
Out[2]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

In [3]: alist[4]["pouet"] = 12                                                                                                                                                                                     

In [4]: alist                                                                                                                                                                                                      
Out[4]: 
[{'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1}]
Langage du code : JavaScript (javascript)

Donc quand on crée une liste par multiplication, ([1]*12) l’objet n’est pas dupliqué, juste le pointeur vers l’objet.

Cette méthode résout le problème:

In [5]: alist = [{"pouet": 0, "prout":1} for _ in range(12)]                                                                                                                                                       

In [6]: alist                                                                                                                                                                                                      
Out[6]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

In [7]:  alist[4]["pouet"] = 12                                                                                                                                                                                    

In [8]: alist                                                                                                                                                                                                      
Out[8]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]
Langage du code : JavaScript (javascript)

Voila c’est tout, mais ça m’a bouffé une heure.

Publié dans programmation | Marqué avec , , , , | 2 commentaires

Réseau de micros de la MaixGo

Après avoir reçu la MaixGo et l’avoir montée, il faudrait commencer à faire quelque chose avec.

Tout d’abord, comme ça fait un an et demi qu’elle traine sur mon étagère, une bonne idée serait de la mettre à jour.

Mise à Jour

Les commandes brutes :

$ git clone https://github.com/sipeed/MaixPy
$ cd MaixPy
$ wget http://dl.cdn.sipeed.com/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz
$ sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt
$ cd projects/hello_world
$ python3 project.py menuconfig
$ python3 project.py build
$ python3 project.py flash -B dan -b 1500000 -p /dev/ttyACM0 -t
Langage du code : PHP (php)

6+1 micros

Mais à quoi peuvent bien servir autant de micros sur une même carte électronique ?

À faire de la localisation de source sonore pardi. Pour faire cela, je n’invente rien. Il suffit de reprendre le script proposé par chegewara sur son github (avec quelques suppressions de lignes inutiles dans le cas du MaixGo):

from Maix import MIC_ARRAY as mic
import lcd

lcd.init()
mic.init()

while True:
    imga = mic.get_map()
    b = mic.get_dir(imga)
    a = mic.set_led(b,(0,0,255))
    imgb = imga.resize(240,160)
    imgc = imgb.to_rainbow(1)
    a = lcd.display(imgc)
mic.deinit()Langage du code : JavaScript (javascript)

Pour reproduire la manipulation, on se connecte à la carte via le script proposé dans mon intro:

$ python sipeedcom.py 
--- forcing DTR inactive
--- forcing RTS inactive
--- Miniterm on /dev/ttyACM0  115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---

[MAIXPY]Pll0:freq:832000000
[MAIXPY]Pll1:freq:398666666
[MAIXPY]Pll2:freq:45066666
[MAIXPY]cpu:freq:416000000
[MAIXPY]kpu:freq:398666666
[MAIXPY]Flash:0xc8:0x17
open second core...
gc heap=0x802ee440-0x8036e440(524288)
[MaixPy] init end

 __  __              _____  __   __  _____   __     __
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /
| |\/| |   / /\ \     | |     > <   |  ___/    \   /
| |  | |  / ____ \   _| |_   / . \  | |         | |
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|

Official Site : https://www.sipeed.com
Wiki          : https://maixpy.sipeed.com

MicroPython v0.5.0-104-gbbd4c9880 on 2020-07-26; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>> 
Langage du code : PHP (php)

On peut bien sur copier/coller les lignes du script une par une. Mais c’est très pénible, surtout que la moindre erreur de frappe ne peut pas être corrigée.

Non pour se simplifier la vie on peut passer en mode «paste» avec Ctrl+e. un peu comme dans vim, il ne prendra le texte que de manière «brute» sans mise en forme. On termine sa session de collage avec la touche Ctrl+d.

>>> 
paste mode; Ctrl-C to cancel, Ctrl-D to finish
=== from Maix import MIC_ARRAY as mic
=== 
import lcd
=== 

=== 
lcd.init()
=== 
mic.init()
=== 

=== 
while True:
=== 
    imga = mic.get_map()
=== 
    b = mic.get_dir(imga)
=== 
    a = mic.set_led(b,(0,0,255))
=== 
    imgb = imga.resize(240,160)
=== 
    imgc = imgb.to_rainbow(1)
=== 
    a = lcd.display(imgc)
=== 
mic.deinit()
=== 

Microphone Array Arithmetic, Developed by Canaan, Port by Sipeed
TrueLangage du code : JavaScript (javascript)

Ce qui donne ça :

Le programme s’arrête avec un simple Ctrl+C

Microphone Array Arithmetic, Developed by Canaan, Port by Sipeed
True
Traceback (most recent call last):
File "", line 13, in
KeyboardInterrupt:Langage du code : PHP (php)

Publié dans Non classé | Laisser un commentaire

À fond sur la marche arrière !

Pour fêter l’arrêt de la centrale de Fessenheim en Alsace, l’Allemagne met en service une centrale à charbon.

Le tout à peu près au même moment puisque la mise en service de cette centrale à charbon a été faite le 30 mai 2020 et l’arrêt de Fessenheim le 28 juin 2020.

Donc on arrête une centrale qui fait de l’électricité (presque) sans CO2 pour la remplacer par la pire source fossile pour produire de l’électricité : le charbon.

Quel beau modèle écologique allemand ! Mais que fait Greenpeace ?

Publié dans Non classé | Laisser un commentaire

Clavier orthogonal Monster2, le fail !

Suite à mon article sur les claviers orthogonaux et ma bafouille sur LinuxFR, je pensais avoir trouvé LE clavier orthogonal à tarif raisonnable (40€ avec les frais de port) chez LDLC

Sauf que je ne m’étais pas méfié du nom.

Ça m’apprendra à ne pas lire les dimensions avant d’acheter 😉

Il porte bien son nom en effet: C’est un monstre ! Et donc d’un intérêt discutable pour une utilisation «normal».

Dommage, je croyais avoir enfin trouvé un clavier avec les touches alignés.

Publié dans Non classé | Laisser un commentaire

QrOfLife

Mon article de LinuxFR sur la libération des FPGA en 2020 m’ayant fait gagner le livre de C.Delannoy «Programmer en C++ moderne», il me fallait un projet «bac à sable» pour mettre en œuvre un peu de C++.

Le décès de John Conway et mon activité actuelle chez Armadeus Systemm’ont donné un sujet tout trouvé : QrOfLife.

Petit aperçu de QrOfLife qui génère le QrCode du text «QrOfLife» puis le fait évoluer sur le thème du jeux de la vie

Le principe est simple, on prend un texte en argument de la commande. On génère le QrCode correspondant puis on le fait évoluer avec les règles du jeu de la vie.

… application totalement inutile.

Mais à l’image du blinking led project pour les FPGA; Le QrOfLife permet de mettre en pratique tout un tas d’outils pour développer en C++. Il permet également de prendre en mains certaines bibliothèques ainsi que des outils de compilation comme cmake.

Dans un futur plus ou moins proche j’essayerais d’ajouter la génération de GIF animé ainsi que la lecture des QrCode via la camera.

Publié dans Non classé | Laisser un commentaire