Créer un système de vote électronique avec Raspberry Pi

Système de vote avec Raspberry Pi

Introduction

Dans cet article, nous allons créer un système de vote électronique en utilisant un Raspberry Pi et Raspbian. Ce projet est idéal pour les écoles, les petites organisations ou tout environnement nécessitant un système de vote simple, fiable et sécurisé.

Matériel Nécessaire

  • Un Raspberry Pi (modèle 3 ou supérieur recommandé)
  • Une carte microSD (au moins 8 Go) avec Raspbian installé
  • Un écran et un clavier pour le Raspberry Pi
  • Une connexion Internet pour télécharger les paquets nécessaires
  • Un lecteur de carte RFID et des cartes RFID (facultatif mais recommandé pour l’identification des électeurs)
  • Câbles et alimentation pour le Raspberry Pi
  • Breadboard et câblage pour les connexions (si utilisation de périphériques supplémentaires)
  • Un boîtier pour le Raspberry Pi (facultatif mais recommandé pour la protection)

Installation de Raspbian

  1. Téléchargez la dernière version de Raspbian depuis le site officiel de Raspberry Pi : Raspbian Download.
  2. Utilisez un outil comme Balena Etcher pour flasher l’image de Raspbian sur votre carte microSD.
  3. Insérez la carte microSD dans le Raspberry Pi, connectez l’écran, le clavier, et l’alimentation, puis démarrez le Raspberry Pi.

Configuration Initiale

  1. Lancez le terminal et mettez à jour votre système : sudo apt update sudo apt upgrade
  2. Installez les paquets nécessaires pour le développement : sudo apt install python3 python3-pip python3-gpiozero

Configuration du Serveur Web

Nous allons utiliser Flask pour créer une application web qui servira d’interface pour notre système de vote.

Pourquoi Flask ?

Flask est un micro-framework web en Python qui est léger, facile à utiliser et parfait pour les petites applications comme notre système de vote. Il nous permet de créer des routes simples et de rendre des templates HTML, ce qui est exactement ce dont nous avons besoin.

Installation de Flask

  1. Installez Flask : pip3 install flask
  2. Créez un dossier pour votre projet et naviguez dedans : mkdir voting_system cd voting_system

Création de l’Application Flask

Créez un fichier app.py avec le contenu suivant :

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

# Dictionnaire pour stocker les électeurs et leurs votes
voters = {}
# Dictionnaire pour stocker les votes par candidat
votes = {"Candidate1": 0, "Candidate2": 0, "Candidate3": 0}

@app.route('/')
def index():
    # Rendre le template index.html avec les votes actuels
    return render_template('index.html', votes=votes)

@app.route('/vote', methods=['POST'])
def vote():
    # Récupérer l'ID de l'électeur et le candidat choisi depuis le formulaire
    voter_id = request.form['voter_id']
    candidate = request.form['candidate']

    # Vérifier si l'électeur a déjà voté
    if voter_id in voters:
        return "Voter has already voted"

    # Enregistrer le vote
    voters[voter_id] = candidate
    votes[candidate] += 1

    # Rediriger vers la page d'accueil
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Explication du Code

Importations et Configuration Initiale:

from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)

Ici, nous importons Flask et les fonctions nécessaires. Nous créons une instance de l’application Flask.

Stockage des Votes:

voters = {}
votes = {"Candidate1": 0, "Candidate2": 0, "Candidate3": 0}

Nous utilisons deux dictionnaires: voters pour enregistrer quels électeurs ont voté et votes pour compter les votes de chaque candidat.

Route de la Page d’Accueil:

@app.route('/')
def index():
    return render_template('index.html', votes=votes)

La fonction index rend la page d’accueil en passant les votes actuels au template.

Route pour le Vote:

@app.route('/vote', methods=['POST'])
def vote():
    voter_id = request.form['voter_id']
    candidate = request.form['candidate']

    if voter_id in voters:
        return "Voter has already voted"

    voters[voter_id] = candidate
    votes[candidate] += 1

    return redirect(url_for('index'))

La fonction vote gère les requêtes POST. Elle récupère l’ID de l’électeur et le candidat choisi, vérifie si l’électeur a déjà voté, enregistre le vote et redirige vers la page d’accueil.

Création du Template HTML

Créez un dossier templates et à l’intérieur, créez un fichier index.html :

<!DOCTYPE html>
<html>
<head>
    <title>Voting System</title>
</head>
<body>
    <h1>Vote for Your Candidate</h1>
    <form action="/vote" method="post">
        <label for="voter_id">Voter ID:</label>
        <input type="text" id="voter_id" name="voter_id" required><br><br>
        <label for="candidate">Choose a candidate:</label>
        <select id="candidate" name="candidate">
            <option value="Candidate1">Candidate1</option>
            <option value="Candidate2">Candidate2</option>
            <option value="Candidate3">Candidate3</option>
        </select><br><br>
        <input type="submit" value="Vote">
    </form>
    <h2>Current Votes</h2>
    <ul>
        {% for candidate, count in votes.items() %}
            <li>{{ candidate }}: {{ count }}</li>
        {% endfor %}
    </ul>
</body>
</html>

Explication du Template

Formulaire de Vote:

<form action="/vote" method="post">
    <label for="voter_id">Voter ID:</label>
    <input type="text" id="voter_id" name="voter_id" required><br><br>
    <label for="candidate">Choose a candidate:</label>
    <select id="candidate" name="candidate">
        <option value="Candidate1">Candidate1</option>
        <option value="Candidate2">Candidate2</option>
        <option value="Candidate3">Candidate3</option>
    </select><br><br>
    <input type="submit" value="Vote">
</form>

Le formulaire permet à l’électeur d’entrer son ID et de choisir un candidat. Les données sont envoyées à la route /vote via POST.

Affichage des Votes Actuels:

<h2>Current Votes</h2>
<ul>
    {% for candidate, count in votes.items() %}
        <li>{{ candidate }}: {{ count }}</li>
    {% endfor %}
</ul>

Cette section affiche le nombre de votes actuels pour chaque candidat en utilisant la boucle for de Jinja2 pour itérer sur les éléments du dictionnaire votes.

Lancer l’Application

  1. Lancez votre application Flask : python3 app.py
  2. Accédez à l’interface web en ouvrant votre navigateur et en allant à l’adresse http://<IP_DU_RASPBERRY_PI>:5000.

Utilisation d’un Lecteur de Cartes RFID (Facultatif)

Pour une sécurité accrue, vous pouvez utiliser un lecteur de carte RFID pour l’identification des électeurs.

Pourquoi Utiliser un Lecteur de Carte RFID ?

L’utilisation d’un lecteur de carte RFID ajoute une couche de sécurité en s’assurant que chaque électeur est identifié de manière unique et que les votes ne peuvent pas être falsifiés par des utilisateurs non autorisés.

Installation du Lecteur de Carte RFID

  1. Installez les bibliothèques nécessaires pour le lecteur RFID : pip3 install mfrc522
  2. Connectez le lecteur RFID au Raspberry Pi en suivant les instructions du fabricant.

Intégration du Lecteur RFID dans l’Application Flask

Modifiez le fichier app.py pour inclure la lecture des cartes RFID :

from flask import Flask, render_template, request, redirect, url_for
from mfrc522 import SimpleMFRC522
import RPi.GPIO as GPIO

app = Flask(__name__)
reader = SimpleMFRC522()

voters = {}
votes = {"Candidate1": 0, "Candidate2": 0, "Candidate3": 0}

@app.route('/')
def index():
    return render_template('index.html', votes=votes)

@app.route('/vote', methods=['POST'])
def vote():
    try:
        # Lecture de l'ID de la carte RFID
        id, text = reader.read()
        voter_id = str(id)
        candidate = request.form['candidate']

        if voter_id in voters:
            return "Voter has already voted"

        voters[voter_id] = candidate
        votes[candidate] += 1

        return redirect(url_for('index'))
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Explication des Modifications

Importations Supplémentaires:

from mfrc522 import SimpleMFRC522
import RPi.GPIO as GPIO

Nous importons les modules nécessaires pour le lecteur RFID.

Initialisation du Lecteur RFID:

reader = SimpleMFRC522()

Lecture de l’ID de la Carte RFID:

try:
    id, text = reader.read()
    voter_id = str(id)
    candidate = request.form['candidate']

    if voter_id in voters:
        return "Voter has already voted"

    voters[voter_id] = candidate
    votes[candidate] += 1

    return redirect(url_for('index'))
finally:
    GPIO.cleanup()

Nous lisons l’ID de la carte RFID lorsque l’électeur vote, et nous utilisons cet ID comme identifiant unique de l’électeur. La méthode GPIO.cleanup() est utilisée pour nettoyer les pins GPIO après la lecture.

Conclusion

Vous avez maintenant un système de vote électronique fonctionnel basé sur Raspberry Pi et Flask. Ce projet peut être étendu pour inclure des fonctionnalités supplémentaires telles que l’authentification multifactorielle, l’enregistrement des votes dans une base de données, et l’analyse des résultats des élections. Avec ce tutoriel, vous avez une base solide pour développer un système de vote sécurisé et fiable.