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
- Téléchargez la dernière version de Raspbian depuis le site officiel de Raspberry Pi : Raspbian Download.
- Utilisez un outil comme Balena Etcher pour flasher l’image de Raspbian sur votre carte microSD.
- 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
- Lancez le terminal et mettez à jour votre système :
sudo apt update sudo apt upgrade
- 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
- Installez Flask :
pip3 install flask
- 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
- Lancez votre application Flask :
python3 app.py
- 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
- Installez les bibliothèques nécessaires pour le lecteur RFID :
pip3 install mfrc522
- 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.
Laisser un commentaire