Commander Arduino depuis Discord

Arduino et Discord pouvant être programmé en Python, il est assez simple d’utiliser les commandes Python pour interagir avec la carte Arduino pour :

  • allumer ou éteindre une led
  • demander une mesure
  • activer un moteur
  • régler une led RGB

Du côté Discord, que faire ?

Il vous faut :

  • un compte Discord
  • un serveur Discord
  • un bot dédié

Tout ceci est expliqué dans la page Programmer un bot Discord en Python.

Du côté Python et Arduino, que faire ?

Il vous faut :

  • une carte Arduino avec le FirmataExpress
  • sur Python les paquets Discord et Pymata4

Tout ceci est expliqué dans la page Installation de Pymata4.

Exemple : allumer et éteindre une led

Lorsque le script suivant est exécuté, la communication avec Arduino est activé et le bot lancé.

Les commandes possibles sont :

  • !allumer : allumer la led
  • !eteindre : éteindre la led
  • !quitter : terminer la communication avec Arduino et déconecter le du serveur Discord
  • !purger : effacer tous les messages du salon (attention !)
import discord
from discord.ext import commands
import sys
from pymata4 import pymata4
import time

with open("token.txt","r",encoding="utf-8") as fichier :
	token= fichier.readline()


bot = commands.Bot(command_prefix="!")

##########################################################################
# à la connexion
##########################################################################
@bot.event
async def on_ready():
	channel = discord.utils.get(bot.get_all_channels(), name="général")  #remplacer "général" par le nom du salon
	await bot.get_channel(channel.id).send("Bonjour à tous !")
	print(f"{bot.user.name} est prêt.") 


##########################################################################
# en cas d'erreur
##########################################################################
@bot.event
async def on_command_error(ctx,error):
	if isinstance(error,commands.CommandNotFound):
		await ctx.reply("Vérifier votre commande.")
	else :
		raise error


##########################################################################
# allumer
##########################################################################
@bot.command(name="allumer")
async def allumer(ctx):
	reponse="Led allumé."
	await ctx.reply(reponse)
	carte.digital_write(Led_bleue, 1)
	print(f"Réponse à message {ctx.message.id} : {reponse}")

##########################################################################
# eteindre
##########################################################################
@bot.command(name="eteindre")
async def eteindre(ctx):
	reponse="Led éteinte."
	await ctx.reply(reponse)
	carte.digital_write(Led_bleue, 0)
	print(f"Réponse à message {ctx.message.id} : {reponse}")

##########################################################################
# exit
##########################################################################
@bot.command(name="quitter")
async def quitter(ctx):
	reponse="Bot déconnecté. Bye Bye !"
	await ctx.reply(reponse)
	await bot.close()
	carte.shutdown()
	print(f"Réponse à message {ctx.message.id} : {reponse}")
	print("--------------- Fin --------------")


##########################################################################
# Supprimer tous les messages : !purger
##########################################################################
@bot.command(name="purger")
async def purge(ctx):
	await ctx.channel.purge()


##########################################################################
##########################################################################
##########################################################################
# Initialisations de Pymata et exécution du bot
##########################################################################
##########################################################################
##########################################################################
carte = pymata4.Pymata4()

print("--------------- Début --------------")
# Constantes
Led_bleue = 13 # Led

carte.set_pin_mode_digital_output(Led_bleue)
time.sleep(1)

with open("token.txt","r",encoding="utf-8") as fichier :
	token= fichier.readline()
bot.run(token)

Retour à la rubrique