{ "cells": [ { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "> Dans le prolongement des activités déjà menée sur la chaine d'information, ce carnet jupyter propose un tour d'horizon non exhaustif des possibilités de programmer en Python une carte à microcontroleur pour traiter l'information d'un robot (ou de tout système assimilé) à des fins d'applications en projets.\n", "\n", "## Histoire de robots :" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%HTML\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Evolution technologique de l'unité de traitement :" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Un système technique (automatisme, robot, objet connecté (IoT), système embarqué...) peut-être représenté par sa chaîne d'information et sa chaîne d'énergie tel que :\n", "\n", "
\"Focus
\n", "\n", "Dans un projet de robotique, le composant à programmer est celui qui réalise la fonction **traiter**.\n", "\n", "C'est dans ce domaine que les solutions ont particulièrement évolué ces dernières années :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Les progrès en automatisme industriel et en robotique sont intimmement liés aux évolutions de l'informatique générale et à celle des ordinateurs en particulier. Ce sont des branches cousines qui suivent des évolutions parallèles avec souvent un décalage temporel inhérent aux besoins de développer des solutions fiables et robustes à coût réduit.\n", "\n", "| | | | |\n", "|:-:|:-:|:-:|:-:|\n", "| Séquenceur à cames | Séquenceur pneumatique | Relais | Tubes à vide |\n", "\n", "Les solutions mécaniques (cames), pneumatiques (séquenceur), électriques (relais), ont laissé la place à celles électroniques des tubes à vide, remplacés par des [transistors](https://fr.wikipedia.org/wiki/Transistor) à partir du milieu des années 1950 eux mêmes miniturisés dans des [circuits intégrés](https://fr.wikipedia.org/wiki/Circuit_int%C3%A9gr%C3%A9) (1958) et dans les [microprocesseurs](https://fr.wikipedia.org/wiki/Microprocesseur) (1969)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "
\n", "Les premiers microcontroleurs apparaisent dans les années 70, Texas Instrument, son inventeur, commercialise à partir de 1974 les [TMS1000](https://en.wikipedia.org/wiki/Texas_Instruments_TMS1000) mais c'est depuis la fin des années 90 qu'ils se sont développés de manière spectaculaire." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "
\n", "\n", "Un [microcontrolleur](https://fr.wikipedia.org/wiki/Microcontr%C3%B4leur) est en quelque sorte un ordinateur miniaturisé et simplifié généralement dédié à une application de traitement de l'information dans un système embarqué (clavier, souris, automobile, calculatrice, électroménagé, jeux, ...) Il inclut, sur une même puce, à minima, un microprocesseur, de la mémoire ROM et RAM, une interface entrées/sorties (GPIO, General Purpose Input/Output) et selon le cas d'autres modules tels qu'un oscillateur, un convertisseur analogique numérique (CAN), un Timer, de la mémoire flash, EPROM ou EEPROM, des générateurs de signaux MLI (PWM), des controleurs de communication UART, SPI, I2C, radio, Bluetooth, Wifi...\n", "\n", "- https://franco-micro-bit.github.io/introduction101/microcontroleurs/" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "
\n", "\n", "> On observe sur le boitier de ce microcontroleur la fenêtre qui permetait par insolation de rayons UV d'effacer l'EPROM, Ereasable Programmable Read Only Memory. Cette mémoire possède les mêmes propriétés que la ROM sauf que l'on peut l'effacer pour la reprogrammer. L'EPROM est accessible en lecture uniquement, et contient généralement le programme à exécuter. \n", "> C'est de là que viendrait le verbe **\"flasher\"** synonyme de téléverser un programme dans le microcontroleur.\n", "> Aujourd'hui on continue donc à \"flasher\" mais de l'EEPROM : Electrically Ereasable Programmable Read Only Memory." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Il était encore complexe et coûteux de mettre en œuvre un microcontrôleur au début des années 2000. L'arrivée de cartes à microcontroleur telles que l'Arduino à partir de 2005 a grandement simplifié la chose. Cela ne nécessite alors que du matériel peu coûteux, environ 20€ pour la carte la plus populaire qu'est l'Arduino Uno R3 basée sur l'ATmega328. Un simple PC suffit pour le développement du programme en langage C.\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "En 2012 l'ordinateur à carte unique Raspberry PI, un [Single Board Computer](https://en.wikipedia.org/wiki/Single-board_computer) low cost, avec son [GPIO](https://fr.wikipedia.org/wiki/General_Purpose_Input/Output) vient concurrencer les cartes à microcontroleur pour des applications qui requièrent un interfaçage vers des appareils simples mais avec plus de capacité de calcul. Le langage de programmation privilégié sur cette plateforme est Python.\n", "\n", "> Le processeur du Raspberry PI est également monté sur une puce ([SoC](https://en.wikipedia.org/wiki/System_on_a_chip)) mais contrairement à un microcontroleur cette puce ne contient pas de mémoire. \n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Depuis 2013, l'augmentation des capacités de certains microcontrôleur permet de les programmer également en [MicroPython](https://github.com/micropython) une version allégée de Python 3 créée par [Damien George](https://github.com/dpgeorge)\n", "\n", "C'est le cas de la carte BBC micro:bit, du Circuit Playground Express (CPX), des ESP8266 et ESP32.\n", "\n", "| | | | |\n", "|:-:|:-:|:-:|:-:|\n", "| [BBC micro:bit](https://tech.microbit.org/hardware/) | [Wemos ESP8266](https://wiki.wemos.cc/products:d1:d1_mini) | [Adafruit CPX](https://www.adafruit.com/product/3333) | [Wemos ESP32](https://wiki.wemos.cc/products:lolin32:lolin32) |\n", "\n", "Les microcontrôleurs sont donc devenus des composants électronique incontournables, modifiant profondément la manière de concevoir les circuits électroniques des systèmes embarqués et des objets connectés." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "> *\" Les objets qui sont dotés d'un microcontroleur embarqué, éventuellement en réseau, deviennent enchantés de la même façon que les objets des mondes magiques : il suffit de leur donner des ordres. Comme dans les histoires de magie, il est impératif d'apprendre comment réalise les incantations pour que les objets enchantés se plient à votre volonté.*\n", ">\n", "> *Et c'est ici qu'entre en jeu le langage MicroPython \"*\n", ">\n", "> Extrait du livre de Nicholas H. Tollervey, Programming with MicroPython.\n", "\n", "Autres cartes : \n", "\n", "| | | | | |\n", "|:-:|:-:|:-:|:-:|:-:|\n", "|[CALLIOPE](https://en.wikipedia.org/wiki/Calliope_mini) | [m5stack](https://m5stack.com/) | [HALOCODE](https://www.makeblock.com/steam-kits/halocode)| [Tiny 2040](https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html) | [Raspberry Pi4](https://www.raspberrypi-france.fr/raspberry-pi-4/) |\n", "\n", "***\n", ">Sortie en novembre 2020, le Raspberry Pi 400 inclut un ordinateur complet dans un clavier. Cette idée n'est pas nouvelle, elle s'inspire des machines des années 80 telles que le [BBC micro](https://fr.wikipedia.org/wiki/BBC_Micro) :\n", "\n", ">
\n", ">
Le Nouveau Raspberry Pi 400 : un mini-ordinateur dans un clavier !
\n", " \n", "*** \n", " " ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "## Applications au BBC micro:bit :\n", "\n", "CF : [Programmation d'un BBC micro:bit](https://ericecmorlaix.github.io/1SI_2022-2023/bbc_microbit/)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from microbit import *" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "fragment" } }, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "Le point de vue du programmeur en robotique concerne donc l'unité de traitement, un ordinateur à carte unique, une carte à microcontroleur, qui reçoit des informations électriques en **entrées** et en émet en **sortie** :\n", "\n", "\n", "
\n", "\n", "\n", "## Sorties du BBC micro:bit :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### L'affichage LED\n", "\n", "La carte BBC micro:bit présente sur sa face avant un matrice de 5x5 LEDs :\n", "\n", "
\"Matrice
\n", "\n", "> C'est la seule sortie physique que possède la carte BBC micro:bit mais c'est déjà 25 fois mieux qu'une carte Arduino qui ne possède qu'une LED en dur sur la sortie 13.\n", "\n", "Cet affichage est géré par le module `display` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "display.scroll('Test')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "display.show(Image.HAPPY)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "display.set_pixel(2, 2, 4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "display.clear()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "skip" } }, "source": [ "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/images.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=pyled\n", "- https://microbit-micropython.readthedocs.io/en/latest/image.html\n", "- https://microbit-micropython.readthedocs.io/en/latest/display.html" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Les broches :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Il y a 25 connecteurs en cuivre sur la tranche du bas de la carte BBC micro:bit. Ce sont des Entrées/Sorties qui permettent au micro:bit d'interagir avec son environnement en s'y connectant physiquement.\n", "\n", "Le BBC micro:bit dispose de 19 broches qui peuvent être utiliser en tant que sortie pour faire fonctionner des **actionneurs** tels qu'une LED, un moteur ou encore un buzzer...\n", "\n", "Chacunes est associées à un objet `pinN`, instance de la class `pin`, ou `N`correspond au numéro attribué à la broche de 0 à 16 ainsi que 19 et 20.\n", "\n", "
\"Broches\"
" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Si ces broches sont utilisées en tant que sortie alors leurs autres fonctionnalités potentielles ne sont plus disponibles. Par exemple les broches pin3, pin4, pin6, pin7, pin9 et pin10 sont utilisées pour la matrice de LEDs, il faut donc [désactiver l'affichage](https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.off) pour les utiliser à autre chose...\n", "\n", "Pour pouvoir utiliser ces broches il faut aussi les raccorder physiquement à d'autres composants électoniques par l'intermédiaire de fils à connecteur bannane ou à pince crocodile ou encore avec des straps sur une breadboard via un connecteur...\n", "\n", "
\n", "
bread:bit
\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Sortie logique, Tout Ou Rien (TOR), digital output :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Les niveaux électriques des broches du BBC micro:bit ne peuvent être mis qu'à 0V ou à 3,3V. Ce qui correspond respectivement aux valeurs `0` ou `1`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "pinN.write_digital(valeur)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

A faire vous-même - défi n°0 :

\n", "\n", "\n", "#### Prendre en main l'environnement de développement et programmer un \"Hello World\" :\n", "\n", "Le premier programme que réalise tout apprenti informaticien est le fameux [Hello World!](https://fr.wikipedia.org/wiki/Hello_world)... Celà permet avec un programme minimal de prendre en main un langage et surtout de s'assurer du bon fonctionnement de l'environnement de développement choisi [IDE](https://fr.wikipedia.org/wiki/Environnement_de_d%C3%A9veloppement).\n", "\n", "#### \"Hello World\" spécial robotique :\n", "\n", "**Raccorder** une LED sur la sortie P0 tel que sur les circuit et schéma ci-dessous puis **programmer** un allumage alternatif à la fréquence de 1Hz.\n", "\n", "\n", "| | |\n", "|:-:|:-:|\n", "| Circuit | Schéma |\n", "\n", "
\n", "\n", "> - Sachant que la sortie P0 délivre au maximum une tension de 3,3V, **calculer** la résistance R1 minimale afin de limiter le courant dans la LED à 20mA pour une tension de 2V à ses bornes.\n", ">\n", "> - La valeur réelle retenue pour la résistance R1 est ici de 220 Ohms, en **déduire** l'intensité du courant dans la LED.\n", "\n", "
\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Sortie pseudo-analogique, Modulation de Largeur d'Impulsion (MLI), Pulse Width Modulation (PWM), analog output :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Même si les broches du BBC micro:bit ne peuvent être mises qu'à 0V ou à 3,3V, il est possible de faire croire au composant raccordé qu'il est alimenté sous une tension comprise entre 0 et 3,3V.\n", "\n", "La technique s'appelle **Modulation de Largeur d'Impulsion (MLI)**, Pulse Width Modulation (PWM) en Anglais. Le principe consiste à générer un signal pseudo-périodique qui met à `1` la sortie sur une portion ($t_h$) de la période ($T$) du signal.\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "On appelle rapport cyclique le ratio $\\alpha = {t_h \\over T}$. Ainsi le composant connecté à une sortie PWM aura l'impression d'être alimenter en moyenne sous une tension telle que $V_{MOY} = \\alpha \\times 3,3$ \n", "\n", "
\n", "\n", "Dans l'instruction suivante `valeur` est telle que $\\alpha = {{valeur \\times 100} \\over 1023}$. Une valeur à `0` correspond à $\\alpha = 0 %$ et à une tension de 0V en sortie, une valeur à `511` correspond à $\\alpha = 50$% et à une tension de 1,65V en sortie et une valeur à `1023` correspond à $\\alpha = 100$% et à une tension de 3,3V en sortie." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "pinN.write_analog(valeur)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "La durée de la pseudo-période est choisie suffisamment petite par rapport au temps de réaction de l'oeil humain dans le cas d'une LED ou, de l'inertie du composant électrique piloté par cette broche dans le cas d'un moteur par exemple.\n", "\n", "Il est possible de régler la pseudo-période du signal PWM soit en millisecondes (1ms minimum) soit en microseconde (254µs minimum) :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "set_analog_period(period)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "set_analog_period_microseconds(period)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "##### /!\\ Attention :\n", "\n", "Le BBC micro:bit ne peux gérer qu'un maximum de trois sorties en PWM simultannément.\n", "\n", "
\n", "

A faire vous-même - défi n°1 :

\n", "\n", "

Raccorder une LED sur la sortie P0 et programmer un allumage progressif en intensité sur 5 secondes à partir de l'initialisation de la carte ( = une rampe de démarrage). Puis la LED s'éteint instantannément après 6 secondes...

\n", "\n", "
\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "#### Plus d'informations sur les broches du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/pin.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=pycomp\n", "- https://tech.microbit.org/hardware/edgeconnector/\n", "\n", "- http://www.multiwingspan.co.uk/micro.php?page=pymoreled\n", "- https://microbit-micropython.readthedocs.io/en/latest/pin.html#pulse-width-modulation" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Faites du Bruit, Buzzer" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\"music\"
" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "Avec deux fils à embouts crocodiles, connecter les broches P0 et GND respectivement au fils + et - d'un buzzer ou à une prise jack tel que : \n", "\n", "
\n", "\n", "On peut alors gérer un buzzer sur une sortie TOR comme là :\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/io.html#bip-bip" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "Mais il est plus intéressant d'utiliser les modules :\n", "\n", "- `music` :\n", " - http://www.multiwingspan.co.uk/micro.php?page=pybuzz\n", " - https://microbit-micropython.readthedocs.io/fr/latest/tutorials/music.html\n", " - https://microbit-micropython.readthedocs.io/en/latest/music.html\n", " \n", "- `audio` :\n", " - https://microbit-micropython.readthedocs.io/en/latest/audio.html\n", "\n", "- `speech` :\n", "- http://www.multiwingspan.co.uk/micro.php?page=speech\n", "- https://microbit-micropython.readthedocs.io/en/latest/tutorials/speech.html\n", "- https://microbit-micropython.readthedocs.io/en/latest/speech.html" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "## Entrées du BBC micro:bit :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Le BBC micro:bit embarque en dur un grand nombre d'équipements sui délivrent des informations à l'entrée de son microcontrôleur.\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Deux Boutons poussoirs repérés A et B\n", "\n", "
\"Boutons
\n", "\n", "La carte BBC micro:bit dispose, sur sa face avant, de deux boutons poussoir repérés par les lettres A et B.\n", "\n", "Chacun est représenté par un objet `button_a` et `button_b`, instance de la classe `button`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "button_a.is_pressed()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "button_a.was_pressed()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "button_a.get_presses()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\n", "

A faire vous-même - défi n°2 :

\n", "\n", "

Raccorder une LED sur la sortie P0 et programmer l'intensité de son allumage par paliers progressifs de sorte que quatres impulsions successives sur l'entrée A conduisent à l'éclairage maximal. Tandis qu'une impulsion sur le bouton B provoque l'extinction totale de la LED.

\n", "\n", "
\n", "\n", "\n", "#### Plus d'informations sur les boutons poussoirs du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/buttons.html#boutons\n", "- https://microbit-micropython.readthedocs.io/en/latest/button.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=pybutton" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Trois touches sensitives 0, 1, 2" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\"Touches
\n", "\n", "Les trois grandes broches (pin) repérées 0, 1, 2 sont sensibles à un changement de capacité provoqué au contact d'un doigt.\n", "\n", "Les instances de `pin0`, `pin1` et `pin2` possèdent une méthode qui renvoie un booléen :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "pinN.is_touched()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "> Normalement ces touches capacitives devraient réagir au conctact de votre doigt à la condition de tenir le BBC micro:bit par le `GND` avec l'autre main ; mais pour plus d'efficaccité le plus sûr est de raccorder un bout d'un câble à pince crocodile au `GND` et avec l'autre bout de venir toucher la broche `0`, `1` ou `2`.\n", "\n", "#### Plus d'informations sur les touches sensitives du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/io.html#python-chatouilleux\n", "- http://www.multiwingspan.co.uk/micro.php?page=pytouch\n", "- https://microbit-micropython.readthedocs.io/en/latest/pin.html#microbit.MicroBitTouchPin" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Magnétomètre" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\"Boussole\"
\n", "\n", "Le magnétomètre détecte tout champ magnétique à proximité et donc à fortiori le champ magnétique terrestre, ce qui permet de savoir quelle direction le BBC micro:bit indique. Cette boussole doit être étalonnée avant de pouvoir être utilisée.\n", "\n", "Comment ? A l'aide des références de code ci-dessous :\n", "\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/direction.html\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/compass.html" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Accéléromètre" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\"Accéléromètre\"
\n", "\n", "La carte BBC micro:bit embarque un accéléromètre 3 axes. Ce composant détecte quand le micro:bit est en mouvement. Il peut aussi détecter d'autres actions, par exemple quand il est secoué, incliné ou qu'il tombe.\n", "\n", "Comment ? A l'aide des références de code ci-dessous :\n", "\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/movement.html\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/gestures.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=pyacc\n", "- https://microbit-micropython.readthedocs.io/en/latest/accelerometer.html" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "from microbit import *\n", "monBool = True\n", "while True :\n", " sleep(500)\n", " if button_b.was_pressed() :\n", " break\n", " if button_a.was_pressed() :\n", " monBool = not monBool\n", " if flag :\n", " print(accelerometer.get_x())\n", " else :\n", " print(accelerometer.get_values())" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Capteur de lumière" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\"Luminosité\"
\n", "\n", "En s'inversant, la matrice de LEDs devient un capteur de lumière basique qui permet de détecter la luminosité ambiante.\n", "\n", "Le module `display` possède donc une méthode qui renvoie une valeur entière comprise entre `0` et `255` représentative d'un niveau de luminosité :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "display.read_light_level()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "#### Plus d'informations sur le capteur de lumière du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.read_light_level" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Capteur de température" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\"Température\"
\n", "\n", "Le processeur du BBC micro:bit dispose d'un capteur de température interne intégré. \n", "\n", "Le module `microbit` possède donc une méthode qui renvoie une valeur représentant une estimation de la température ambiante en degré Celsius :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "temperature()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "#### Plus d'informations sur le capteur de température du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/microbit.html?highlight=temperature#microbit.temperature\n", "- http://www.multiwingspan.co.uk/micro.php?page=hot" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Broche d'entrée logique, Tout Ou Rien (TOR), digital input :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Les 19 broches du BBC micro:bit peuvent être utiliser en tant qu'entrée logique pour faire fonctionner des **capteurs** tels qu'une fourche optique, un Interrupteur à Lame Souple, un contact de fin de course, un bouton poussoir supplémentaire...\n", "\n", "Chaque broches est associées à un objet `pinN`, instance de la class `pin`, ou `N`correspond au numéro attribué à la broche de 0 à 16 ainsi que 19 et 20.\n", "\n", "
\"Broches\"
\n", "\n", "Si ces broches sont utilisées en tant que sortie alors leurs autres fonctionnalités potentielles ne sont plus disponibles. Par exemple les broches pin3, pin4, pin6, pin7, pin9 et pin10 sont utilisées pour la matrice de LEDs, il faut donc [désactiver l'affichage](https://microbit-micropython.readthedocs.io/en/latest/display.html#microbit.display.off) pour les utiliser à autre chose..." ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "Pour pouvoir utiliser ces broches il faut aussi les raccorder physiquement à d'autres composants électoniques par l'intermédiaire de fils à connecteur bannane ou à pince crocodile ou encore avec des straps sur une breadboard via un connecteur...\n", "\n", "
\n", "
bread:bit
\n", "\n", "On peut connaitre l’état d’une entrée logique avec la méthode `read_digital()` qui retourne un entier égal à `0` si le niveau de tension sur l'entrée est bas ou `1` si le niveau de tension sur l'entrée est haut. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "pinN.read_digital()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "#### Plus d'informations sur les broches d'entrées logiques du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/pin.html\n", "- https://tech.microbit.org/hardware/edgeconnector/\n", "- http://www.multiwingspan.co.uk/micro.php?page=pybutt1\n", "- http://www.multiwingspan.co.uk/micro.php?page=reed" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Broches d'entrée analogiques (CAN) :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "Le microcontroleur du BBC micro:bit contient un Convertisseur Analogique Numérique (CAN), Analogue to Digital Converter (ADC) en Anglais, dont la résolution est de 10bits. Il convertit proportionnelement un niveau de tension variant de 0 à 3,3V en une valeur entière comprise entre 0 et 1023. La plus petite variation de tension que l'on peut mesurer est donc égale au $quantum = {3,3 \\over 1023} = 3,2 mV$\n", "\n", "
\n", "\n", "Le BBC micro:bit possède 6 broches sur lesquels on peut lire une valeur d'entrée analogique.\n", "\n", "Elles sont représentés par les instances `pin0`, `pin1`, `pin2`, `pin3`, `pin4`, `pin10`.\n", "\n", "La méthode `read_analog()` renvoie une valeur entière correspondante au niveau de tension mesuré :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "pinN.read_analog()" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "-" } }, "source": [ "
\n", "

A faire vous-même - défi n°3 :

\n", "\n", "

Raccorder une LED sur la sortie P0 et un potentiomètre sur l'entrée P1 et programmer le niveau d'intensité lumineuse de la LED selon le réglage de la position du potentiomètre...

\n", "\n", "
\n", "\n", "#### Plus d'informations sur les broches d'entrées analogiques du BBC micro:bit :\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/pin.html#microbit.MicroBitAnalogDigitalPin\n", "- http://www.multiwingspan.co.uk/micro.php?page=pypot\n", "- http://www.multiwingspan.co.uk/micro.php?page=pybutt\n", "- http://www.multiwingspan.co.uk/micro.php?page=flex\n", "- http://www.multiwingspan.co.uk/micro.php?page=tmp" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Communication :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "La communication c'est ce qui va permettre à tous ces systèmes embarqués de devenir des objets connectés.\n", "\n", "Même si d'évidence un système n'est pas connecté avec l'extérieur, il se peut très bien qu'en interne, pour réduire la connectique, certains capteurs et actionneurs sont organisés en réseau avec l'unité de traitement sur un bus de terrain (I²C, SPI, RS485 (DMX), CAN, ...) \n", "\n", "De très nombreuses solutions existent pour établir une communication chacune mieux adapté qu'une autre pour répondre à un besoin particulier." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Série :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Par l'intermédiaire de ses broches, le BBC micro:bit va permettre d'expérimenter facilement une communication point à point filaire :\n", "\n", "
\"Série\"
\n", "\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/network.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=pybit2bit " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### USB, UART :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "
\n", "\n", "La communication Point à Point d'un BBC microbit vers un PC par la liaison USB est particulièrement simplifé en MicroPython puisqu'il suffit d'une simple instruction `print(message)` dans le programme de la carte pour récupérer le `message` sur le PC dans le REPL de l'éditeur Mu par exemple ou tout autre terminal série :\n", "\n", "- https://www.isnbreizh.fr/1nsi/activity/microbitSerial/index.html\n", "\n", "Le module UART va permettre de gérer une communication série filaire bidirectionnelle entre le BBC micro:bit et le PC :\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/uart.html" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Radio :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "C'est là une de ces originalités très intéressante, le BBC micro:bit est bien adapté pour expérimenter une communication radio et ainsi constituer un réseau :\n", "\n", "
\"Radio\"
\n", "\n", "- https://microbit-micropython.readthedocs.io/fr/latest/tutorials/radio.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=radio\n", "- https://www.isnbreizh.fr/1nsi/activity/microbitRadio/index.html\n", "- https://microbit-challenges.readthedocs.io/en/latest/tutorials/radio.html\n", "- https://microbit-micropython.readthedocs.io/en/latest/radio.html\n", "\n", "
\n", "

A faire vous-même - défi n°4 :

\n", "\n", "

Raccorder une LED sur la sortie P0 d'une carte et un potentiomètre sur l'entrée P1 d'une autre carte et programmer le niveau d'intensité lumineuse de la LED selon le réglage de la position du potentiomètre...

\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### I2C, SPI :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Les bus I2C ( Inter Integrated Circuit ), développé par Philips, et SPI (Synchronous Peripheral Interface), développé par Motorola, sont des protocoles de communication imaginés pour pouvoir connecter de très nombreux composants à des microcontroleurs en série sur un même réseau filaire (un bus de terrain) plustôt qu'en parallèle afin de réduire la connectique :\n", "\n", "
\n", "\n", "- https://microbit-micropython.readthedocs.io/en/latest/i2c.html\n", "- https://microbit-micropython.readthedocs.io/en/latest/spi.html\n", "- http://www.multiwingspan.co.uk/micro.php?page=chuck" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Bluetooth :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "
\"Radio\"
\n", "\n", "L'espace mémoire du BBC micro:bit n'est pas suffisant pour héberger un module MicroPython pour de la communication Bluetooth :\n", "- https://microbit-micropython.readthedocs.io/en/latest/ble.html\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Wifi :\n", "\n", "#### BBC micro:bit :\n", "La carte BBC micro:bit ne possède pas de possibilité de connexion en Wifi. Mais de nombreus autres solutions de SBC sont équipées de Wifi à commencer par le Raspberry Pi.\n", "\n", "#### ESP :\n", "Certains microcontroleurs comme les ESP8266 et ESP32 embarquent en dur des modules wifi et sont programmables en MicroPython :\n", "- La documentation officielle est là :\n", " - ESP8266 http://docs.micropython.org/en/latest/esp8266/tutorial/\n", " - ESP32 http://docs.micropython.org/en/latest/esp32/quickref.html\n", " \n", " \n", "- Série de tutoriels : https://randomnerdtutorials.com/micropython-programming-with-esp32-and-esp8266/\n", "\n", " - Débuter https://randomnerdtutorials.com/getting-started-micropython-esp32-esp8266/\n", " - GPIO https://randomnerdtutorials.com/micropython-gpios-esp32-esp8266/\n", " - https://randomnerdtutorials.com/esp32-esp8266-analog-readings-micropython/\n", " - Serveur Web https://randomnerdtutorials.com/esp32-esp8266-micropython-web-server/\n", " - https://randomnerdtutorials.com/esp32-esp8266-dht11-dht22-micropython-temperature-humidity-sensor/\n", " - https://randomnerdtutorials.com/micropython-esp32-esp8266-dht11-dht22-web-server/\n", " - https://randomnerdtutorials.com/category/0-esp32-micropython/\n", " - Autre : https://www.rototron.info/raspberry-pi-esp32-micropython-tutorial/\n", "\n", "- Tutoriel et source pour développer en jupyter notebook :\n", " - https://towardsdatascience.com/micropython-on-esp-using-jupyter-6f366ff5ed9\n", " - https://github.com/goatchurchprime/jupyter_micropython_kernel\n", " - https://github.com/goatchurchprime/jupyter_micropython_developer_notebooks" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "## Autres composants :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "### Servomoteur :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "La carte BBC micro:bit permet d'alimenter un petit servomoteur en le branchant en direct aux broches. Mais compte tenu de la tension et du courant d'alimentation necessaire au bon fonctionnement d'un servomoteur classique, il est préférable de connecter au BBC mcro:bit une carte intermédiaire qui distibuera depuis une alimentation externe l'énergie utile pour alimenter à la fois les servomoteurs et la carte BBC micro:bit.\n", "\n", "\n", "Voici un example de code pour un servomoteur raccordé au pin2 :\n", "\n", "````python\n", "from microbit import *\n", "\n", "def set_servo_angle(pin, angle):\n", " duty = 26 + (angle * 102) / 180\n", " pin.write_analog(duty)\n", "\n", "angle = 90\n", "set_servo_angle(pin2, angle)\n", "\n", "while True:\n", " if button_a.was_pressed() and angle >= 10:\n", " angle -= 10\n", " set_servo_angle(pin2, angle)\n", " if button_b.was_pressed() and angle <= 170:\n", " angle += 10\n", " set_servo_angle(pin2, angle)\n", "````\n", "source : https://www.monkmakes.com/mb_servo/\n", "\n", "Quelques solutions :\n", "\n", "- https://www.gotronic.fr/cat-commandes-de-moteurs-1704.htm\n", "- un montage à base d'ULN2803...\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "### Sonar, Capteur à ultrason :" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "Voici un exemple de code pour mesurer une distance à partir d'un capteur à ultrason connecté à une carte BBC micro:bit :\n", "`````python\n", "from microbit import *\n", "from utime import ticks_us, sleep_us\n", "\n", "sonar = pin2\n", "\n", "def getDistance():\n", " sonar.write_digital(1) # Send 10us Ping pulse\n", " sleep_us(10)\n", " sonar.write_digital(0)\n", " while sonar.read_digital() == 0: # ensure Ping pulse has cleared from receiver\n", " pass\n", " start = ticks_us() # define starting time\n", " while sonar.read_digital() == 1: # wait for Echo pulse to return\n", " pass\n", " end = ticks_us() # define ending time\n", " echo = end-start\n", " distance = int(0.01715 * echo) # Calculate cm distance\n", " return distance\n", "\n", "def note(duree):\n", " for i in range(10*duree):\n", " pin0.write_digital(1)\n", " sleep_us(1136)\n", " pin0.write_digital(0)\n", " sleep_us(1136)\n", "\n", " \n", "while True:\n", " note(10)\n", " sleep_us(getDistance()*1000)\n", " print(getDistance())\n", "````\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "Autres Sources :\n", "- https://lecluseo.scenari-community.org/CircuitPython/co/g_maqueen.html\n", "- https://lecluseo.scenari-community.org/CircuitPython/co/g_vitesseSon.html\n", "- https://numerique-sciences-informatiques.discip.ac-caen.fr/mesurer-la-vitesse-du-son-avec-un-microcontroleur\n", " " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Extensions :\n", "\n", "Outre l'utilisation d'une bredboard via un connecteur adapté au BBC micro:bit, il existe de nombreuses solutions d'extension...\n", "\n", "#### Shield d'entrée/sortie :\n", "\n", "- Shield d'expansion E/S Freaduino Octopus de Elecfreaks :\n", "\n", "https://elecfreaks.com/learn-en/microbitExtensionModule/octopus_bit.html\n", "\n", "\n", "
\"Shield
\n", "\n", "\n", "- Shield d'expansion E/S Grove :\n", "\n", "
\"Shield
\n", "\n", "\n", "#### Shield moteurs :\n", "\n", "https://www.elecfreaks.com/learn-en/microbitExtensionModule/motor_bit_v16.html?highlight=motor%20bit\n", "\n", "
\"Shield
\n", "\n", "#### Robots roulants :\n", "\n", "- Plateforme Bit:Bot :\n", "\n", "http://4tronix.co.uk/blog/?p=1490\n", "\n", "
\"Plateforme
\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Prolongement :\n", "\n", "

Développer autre chose..., en lien avec votre projet par exemple...

" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Ressources :" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "- https://www.gcworks.fr/tutoriel/microbit/MicrobitMicroPythonGrove1.html\n", "- https://microbit-micropython.readthedocs.io/fr/latest/index.html\n", "- https://microbit-micropython.readthedocs.io/en/latest/index.html\n", "- http://www.multiwingspan.co.uk/micro.php\n", "- https://lecluseo.scenari-community.org/CircuitPython/co/module_Micropython_3.html\n", "- https://franco-micro-bit.github.io/introduction101/\n", "- https://github.com/franco-micro-bit\n", "- https://laboiteaphysique.fr/site2/\n", "- http://www.astrovirtuel.fr/microbit/\n", "- https://www.elecfreaks.com/learn-en/microbitKit/Tinker_Kit/tinker_kit_case_34.html\n", "- https://4tronix.co.uk/blog/?p=1490" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "## Humour :\n", "\n", "Aujourd'hui c'est robologie :\n", "- http://tumourrasmoinsbete.blogspot.com/search/label/robot" ] }, { "cell_type": "markdown", "metadata": { "hidden": true, "slideshow": { "slide_type": "fragment" } }, "source": [ "\"Licence
Ce document est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.\n", "\n", "Pour toute question, suggestion ou commentaire : eric.madec@ecmorlaix.fr" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "_draft": { "nbviewer_url": "https://gist.github.com/d4f650def7e5d57276f1b1124e97f549" }, "celltoolbar": "Aucun(e)", "gist": { "data": { "description": "Documents/DU_ESNSI/S3/Untitled.ipynb", "public": true }, "id": "d4f650def7e5d57276f1b1124e97f549" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "256px" }, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }