{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Logique de la chaine d'information :" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Mise en situation :\n", "\n", "Nous allons découvrir la logique fondamentale qui permet de **traiter** l'information d'un système dont nous décrirons le comportement en utilisant différents moyens. \n", "\n", "\"Focus\n", "\n", "> *Pour illustrer notre propos, nous étudierons, dans un premier temps, le cas d'un simple **système par [Va et Vient](https://fr.wikipedia.org/wiki/Montage_va-et-vient)** qui permet de commander l’éclairage d’une pièce depuis deux endroits différents ?*\n", ">\n", "> *cf document pdf associé* : [Description de la Logique d'un Va Et Vient](https://ericecmorlaix.github.io/1SI_2023-2024/CI/ChaineInformation-LogiqueVaEtVient.pdf)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "
" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "HTML('''
\n", "\n", "
''')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Définition :\n", "\n", "Une fonction logique est une relation établie entre une variable logique de sortie et une ou plusieurs variables logiques d’entrée.\n", "\n", "\"Fonction\n", "\n", "Ces variables d’entrée et de sortie sont dites logiques car elles ne peuvent prendre que deux valeurs (niveaux ou états) distinctes et non simultanées : \n", "- soit **Vraies = $1$** ;\n", "- soit **Fausses = $0$**.\n", "\n", "Ce sont des variables binaires, de type **booléennes**.\n", "\n", "Car pour étudier ces fonctions de variables binaires, on utilise l’algèbre de [George BOOLE](https://fr.wikipedia.org/wiki/George_Boole) (mathématicien britannique du XIX siècle), qui a permis le développement des automatismes et de l’informatique...\n", " \n", "\n", "> *Dans notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", "> *L’état allumé ou éteint d’une lampe (L) d’éclairage d’une pièce dépend de l’état d’un interrupteur (a) situé à un des accès de la pièce et de celui d’un interrupteur (b) situé à l’autre accès de la pièce.*\n", ">\n", ">

A faire vous-même - Compléter les entrées et sortie de la fonction traiter du va et vient :

\n", "> \n", ">\"Fonction\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Description d'une fonction logique\n", "\n", "#### Proposition logique littérale :\n", "\n", "Une fonction logique peut se décrire par une phrase établissant une relation de cause à effet (si...alors) entre les entrées et la sortie.\n", " \n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", "> *SI l’interrupteur a est NON actionné ET l’interrupteur b est actionné OU SI l’interrupteur a est actionné ET l’interrupteur b est NON actionné ALORS la lampe L est allumée.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Equation logique (Equation booléenne) :\n", "\n", "Pour alléger l’écriture et rendre possible l’application de l’algèbre de Boole, on code la proposition logique sous la forme d’une équation.\n", "\n", "Le ET se traduit par $\\bullet$, le OU se traduit par $+$, le ALORS se traduit par $=$, le NON se traduit par une barre sur la $\\overline{variable}$.\n", " \n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Ecrire l'équation booléenne du va et vient :

\n", ">\n", "> $L =\\overline{a}\\bullet b + a\\bullet\\overline{b}$\n", ">\n", "\n", "\n", "\n", "##### Complément : [les propriétés de l’algèbre de Boole](https://fr.wikiversity.org/wiki/Logique_de_base/Alg%C3%A8bre_de_Boole)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Table de vérité :\n", "\n", "Pour décrire le résultat d’une fonction logique en fonction de l’état de ses entrées on dresse un tableau ordonné appelé table de vérité.\n", "\n", "Elle permet de faire l’inventaire de toutes les combinaisons possibles. Le nombre de combinaisons est $2^n$ avec $n$ le nombre d’entrées\n", " \n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter la table de vérité du va et vient :

\n", ">\n", "> \"Table\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Tableau d'inventaire des principales fonctions logiques :\n", "\n", "\"TableauFonctionLogique\"\n", "\n", ">

A faire vous-même :

\n", ">\n", ">**Compléter** le tableau ci-dessus à partir d'une recherche web et en expérimentant par simulation le fonctionnement de chaque porte logique de base sur [https://logic.ly/demo](https://logic.ly/demo) \n", ">\n", "> *cf document pdf associé* : [Tableau des Fonctions Logiques](https://ericecmorlaix.github.io/1SI_2023-2024/CI/ChaineInformation-Logique_TableauFonction.pdf)\n", ">\n", "
\n", "\n", "### Exemple de ressource du web :" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "

Logic Gates, Symbols, and Boolean Expressions from EICC on Vimeo.

\n", "" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "HTML('''\n", "

Logic Gates, Symbols, and Boolean Expressions from EICC on Vimeo.

\n", "''')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ">

Prolongement :

\n", ">\n", ">**Simuler** puis **Expérimenter** le fonctionnement de chaque porte logique de base avec une carte [BBC micro:bit](https://ericecmorlaix.github.io/adn-Tutoriel_lab_si/IOT/BBC_microbit/) \n", ">\n", "> On utilisera les boutons-poussoir A et B pour faire les entrées et on affichera en sortie sur la matrice à LEDs un pour vrai et un pour faux.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> ## Lois de De Morgan :\n", ">Les deux égalités du théorème de DE MORGAN permettent de simplifier les expressions logiques comportant des sommes ou produits complémentés.\n", ">\n", "> $$\\overline{a \\bullet b} = \\overline{a} + \\overline{b}$$ $$\\overline{a + b} = \\overline{a} \\bullet \\overline{b}$$\n", ">\n", ">Et elles permettent la modification d'une expression afin de réaliser la fonction logique correspondante à partir d'opérateurs logiques **NAND** et/ou **NOR**.\n", ">\n", "> Pour cela on complémente deux fois l’expression et on casse la barre du bas en changeant d’opérateur. On réitère cette opération autant de fois que nécessaire.\n", ">\n", "> ...\n", ">" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", ">

Exercice d'application - Google doodle

\n", ">\n", ">
\n", ">\"doodle_George\"\n", ">
\n", ">\n", "> - **Répondre** aux questions du [notebook](https://nbviewer.org/urls/ericecmorlaix.github.io/1SI_2023-2024/CI/Fonctions_Logiques-Google_doodle.ipynb) \n", ">\n", "> ##### Proposition de correction\n", "> - A qui Google rendait hommage le 2 novembre 2015 en mettant sur la page d'accueil de son moteur de recherche le doodle ci-dessus ?\n", ">> [George BOOLE](https://www.google.fr/search?q=George+Boole&oi=ddle&ct=george-booles-200th-birthday-5636122663190528&hl=fr) ; \n", "> - Quelles étaient les raisons de cet hommage rendu par Google ?\n", ">> 200ième anniversaire de la naissance de George BOOLE ;\n", "> - Qu'est-ce qu'une variable booléenne ?\n", ">> une variable binaire, qui ne peut prendre que deux valeur soit 0 soit 1 ;\n", "> - Qu'elles sont les principales fonctions (opérations) booléennes ?\n", ">> les fonctions logique NON (not), ET (and) et OU (or) ; \n", "> - Expliquer en observant le gif animé du doodle ci-dessus, les conditions pour que :\n", "> - le G s'allume en bleu :\n", ">> x ET y à 1 ;\n", "> - le deuxième o s'allume en jaune :\n", ">> x OU y à 1 ;\n", "> - le l s'allume en vert :\n", ">> NON y à 1 ;\n", "> - le e s'allume en rouge :\n", ">> NON x à 1 ;\n", "> - le premier o s'allume en rouge :\n", ">> x OU y à 1 mais pas les deux à la fois, c'est un OU exclusif ;\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Description d'une fonction logique (Suite) :\n", "\n", "#### Schéma à contacts :\n", "\n", "Il s’agit de représenter la fonction logique sous la forme d’un schéma à contact de technologie électrique.\n", "\n", "Un contact ouvert au repos (NO) représente une variable d’entrée dont l’état vrai (=1) est requis, un contact fermé au repos (NF) représente une variable d’entrée dont l’état faux (=0) est requis, et une charge (bobine ou lampe) représente la variable de sortie, la fonction ET est traduite en disposant les contacts en série, la fonction OU est traduite en disposant les contacts en parallèle.\n", " \n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Tracer un schéma à contacts pour le va et vient :

\n", ">\n", "> \"Schéma\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Logigramme :\n", "\n", "Une fonction logique peut également être représentée sous la forme d’un logigramme de technologie électronique (ou pneumatique).\n", "Une fonction logique peut se décomposer en fonctions de base (opérateurs logiques). Il existe deux représentations graphiques normalisées pour ces dernières, l'une est Européenne, l'autre est Américaine.\n", "Le logigramme est la représentation graphique d’une fonction logique en combinant les symboles des opérateurs logiques qui la composent.\n", " \n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter le logigramme du va et vient :

\n", "> \n", "> \"Logigramme\"\n", ">\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Chronogramme :\n", "\n", "Un chronogramme permet de décrire le fonctionnement d’un système au cours du temps. Une fonction logique peut donc être représentée par un chronogramme.\n", "\n", "Il s’agit d’un graphe permettant de visualiser, en fonction du temps, l’état logique des sorties en fonction des états logiques pris par les entrées au cours du temps.\n", " \n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter le chronogramme du va et vient :

\n", ">\n", "> \"Chronogramme\"\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Algorithme :\n", "\n", "Un algorithme est un ensemble de règles opératoires rigoureuses ordonnant, à un processeur particulier,\n", "d'exécuter dans un ordre déterminé, un nombre fini d'opérations élémentaires pour remplir une fonction donnée.\n", "\n", "Un algorithme s'implémente dans un programme informatique.\n", "\n", "L'algorithme est un outil méthodologique général qui ne doit pas être confondu avec le programme proprement dit. \n", "\n", "Un algorithme peut être représenté :\n", "\n", "- soit graphiquement à l'aide de l'algorigramme (organigramme ou ordinogramme) en respectant un formalisme de symboles et de structure ;\n", "- soit littéralement grâce au langage algorithmique en respectant un formalisme d'écriture (pseudo-code). \n", "\n", "\n", "##### Algorigramme :\n", "\n", "C'est une représentation graphique de l'algorithme utilisant des symboles définis par des normes (NF Z 67-010 et ISO 5807)\n", "\n", "\"AlgorigrammeNormes\"\n", "\n", "\n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter l'algorigramme de la fonction va et vient :

\n", "> \n", "> \"AlgorigrammeVaEtVient\"\n", "\n", "\n", "##### Pseudo-Code :\n", "\n", "Le pseudo-code est une façon de décrire un algorithme en langage presque naturel, sans référence à un langage de programmation en particulier.\n", "\n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter le pseudo-code de la fonction va et vient :

\n", "> \n", "> ````pseudo-code\n", "> TANT QUE Vrai\n", "> FAIRE \n", "> LIRE a\n", "> LIRE b\n", "> SI ....................... = Vrai\n", "> ALORS\n", "> FAIRE\n", "> L <- ....\n", "> SINON\n", "> FAIRE\n", "> L <- ....\n", "> FIN SI\n", "> ECRIRE L\n", "> FIN TANT QUE\n", "> ````\n", "\n", "\n", "#### Implémentation en Python :\n", "\n", "\n", "\n", "En Python, une variable booléeene est soit `True` soit `False` et les opérateurs booléens sont les mots clés :\n", "- `and` pour le ET\n", "- `or` pour le OU\n", "- `not` pour le NON\n", "\n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter le script Python de la fonction va et vient :

\n", ">\n", "> Remarque : la fonction `bool()` renvoie `True` pour toute saisie `input()` non vide et `False` sinon.\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "while True:\n", " a = bool(input())\n", " b = bool(input())\n", " if ............................. == True:\n", " L = .....\n", " else:\n", " L = .....\n", " print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> On observe que la fonction ``input()`` qui renvoie une chaine de caractères n'est pas très adaptée pour gérer des entrées booléennes même avec la fonction de conversion de type ``bool()``. De plus, l'utilisation d'une boucle infinie n'est pas pratique...\n", ">\n", "> Pour remédier, nous pouvons organiser notre code dans une fonction VaEtVient(a,b) et utiliser le module ``ipywidgets`` qui permet d'afficher une interface graphique interactive dans un carnet jupyter :\n", ">\n", ">

A faire vous-même - Compléter l'expression booléenne de la fonction VaEtVient(a,b) dans ce nouveau script Python :

\n", ">" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Il faut importer la fonction interact() du module ipywidgets\n", "from ipywidgets import interact\n", "\n", "# Définition de la fonction logique à simuler\n", "def VaEtVient(a, b):\n", " # Expression booléenne de la fonction en python\n", " L = ...........................\n", " # Résultat interactif à afficher\n", " return (print(f\"Si a = {a} et b = {b} alors la lampe L = {L}\"))\n", "\n", "# Appel de la fonction interact() qui appelle la fonction logique à simuler\n", "interact(VaEtVient, a = False, b = False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> Ce script peut être adapté pour toute autre fonction logique. Essayez..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### SYSML, Diagramme d'Etats-Transitions (stm, State Machine Diagramme) :\n", "\n", "Le diagramme d’états est un outil de la modélisation graphique SYSML qui permet de décrire le comportement dynamique séquentiel d’un système ou d'un sous-système. On parle alors d’une machine à états.\n", "\n", "Le diagramme d'état décrit les transitions entre les états et les actions que le système ou ses parties réalisent en réponse à un événement.\n", "\n", "Un état représente une période du fonctionnement du système pendant laquelle le système satisfait une certaine condition, accomplit une ou plusieurs actions, ou attend un évènement.\n", "\n", "A un moment donné, un état est actif ou inactif. Plusieurs états peuvent être actifs simultanément.\n", "\n", "Les états sont représentés par des rectangles aux coins arrondis.\n", "\n", "On nomme transition le lien qui relie deux états successifs.\n", "\n", "Depuis un état actif, pour activer un état lié, il faut que la condition de transition soit vérifée.\n", "\n", "\"DiagrammeEtatsTransitions\"\n", "\n", "\n", "**Actions dans un état** : Pour définir les actions à exécuter il existe trois modes :\n", "- Actions à l’activation de l’état : la syntaxe est ``entry: action1, action2 ;``\n", "- Action durant l’état : la syntaxe est ``during: action1, action2 ;``\n", "- Action à la désactivation de l’état : la syntaxe est ``exit: action1, action2 ;``\n", "\n", "> *Pour notre exemple de **système d’éclairage par va et vient** :*\n", ">\n", ">

A faire vous-même - Compléter le diagramme d'états-transitions de la fonction va et vient :

\n", "> \n", "> \"DiagrammeEtatsTransitionsVaEtVient\"\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Références au programme :\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", "
Compétences développéesConnaissances associées
Traduire le comportement attendu ou observé d’un objetComportement séquentiel
Structures algorithmiques (variables, fonctions, structures séquentielles, itératives, répétitives, conditionnelles)
Diagramme d’états-transitions
Modéliser sous une forme graphique un circuitCircuit électrique
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "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" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3.10.1 64-bit", "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.10.1" }, "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": {}, "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 }, "vscode": { "interpreter": { "hash": "c813da0d88532624e95401f841607d640ef6d724b81c00ab0d0885f617a921c3" } } }, "nbformat": 4, "nbformat_minor": 2 }