Clavier sur ATmega32U4

Bonjour à tous,

Nouveau sur le forum, je démarre tout juste la programmation avec Arduino.

J’ai grandement besoin de votre aide pour finaliser un programme.

Le but est d’avoir un clavier composé uniquement de 17 boutons de types momentané.

Pour le câblage, j’ai simplement suivi ce tutoriel qui permet de créer une interface de type “Joystick”.

Tout mes boutons poussoirs sont bien reconnus via la configuration du Joystick.

Il me reste à programmer un bout de code, pour que l’ordinateur reconnaisse mon périphérique en tant que Clavier et non pas Joystick.

Voici mon petit bout de code mais qui fonctionne que de manière très aléatoire. Je sollicite votre aide pour fiabiliser ce programme.

#include <Keyboard.h>  

void setup() {
pinMode(A3,INPUT);  
pinMode(14,INPUT);  
Serial.begin(9600);      
Keyboard.begin();      

void loop() {  

 if (digitalRead(A3) == LOW && digitalRead(14) == LOW) 
  {
     
    Keyboard.write('C');    
    delay(200); 
   
  }
 Keyboard.end(); 

  
}

Thor42:
Voici mon petit bout de code mais qui fonctionne que de manière très aléatoire.

Aléatoire, c'est-à-dire?
Quel est le comportement constaté?

Merci pour ton aide. fdudnews

Le comportement, c’est que la lettre C ne s’affiche pas tout le temps lorsque je presse le bouton.

J’ai câblé mes boutons en suivant ce schéma mis en pièce jointe.

Parfois, la lettre C apparaît lorsque j’appuie sur un autre bouton, car elle est sensée apparaître seulement quand je presse le même bouton.

Salut
Avec un clavier matriciel, tu n'utilises pas la librairie keypad ?
Elle gère aussi les rebonds.

En lisant ton programme au post #1 je pensais que ton clavier était composé de touches connectées à la masse.
Ton schéma montre un clavier matriciel mais la gestion que tu fais n'est pas du tout adaptée. Il faut utiliser comme le préconise hbachetti la librairie keypad qui balayera le clavier et fournira directement un code de touche lors d'un appui.

J'ai suivi vos conseils en utilisant la librairie Keypad.
Tout fonctionne parfaitement :slight_smile:
Il me reste à configurer le module Bluetooth HC06 sur la Raspberry.

Merci beaucoup pour votre aide.

Trop top.
Bonne continuation.

Je progresse très lentement.

J'ai installé la carte HC-06 sur mon arduino pro micro.

J'arrive à appairer la carte sur mon PC Windows 10, le logiciel Arduino via le moniteur série, lit bien les données lorsque je presse mes boutons poussoirs.

En revanche, sur le raspberry, je m'arrache les cheveux ^^
Il y a des tonnes de package, j'arrive à me connecter sur le HC-06 mais impossible de lire les données quand je presse les boutons poussoirs.

Les données à lire sont simplement 1 chiffre ou 1 lettre.

Il semblerait qu'il faut utiliser un programme python qui puisse "écouter". J'ai essayé pas mal de chose dont du RFCOMM mais rien à faire.

Auriez vous des suggestions à me faire svp ?

Merci beaucoup !!

pyserial si tu travailles en python.
Tu trouveras de nombreux exemples sur le WEB.

Si il y a d'autres méthodes, je suis preneur.

Je vais suivre ton idée hbachetti, merci :slight_smile:

Je travaille depuis des années avec pyserial.
C'est super-portable et très bien fait. le mec qui a pondu ça est un pro de la ligne série sous WIndows et LINUX.
Tu changes d'OS en modifiant le device : "COM1" sous Windows ou "/dev/ttyS0" ou "/dev/ttyUSB0" sous LINUX et ça roule.
Bien entendu cela tourne sur RASPBERRY, en USB.

Et ca peut fonctionner en bluetooth ?

Une petite confirmation svp : Si le moniteur série d'Arduino m'affiche "2" en réponse, la console de pyserial devrait m'afficher la même chose ?

Il n'y a pas de console pyserial.
Pour afficher les caractères reçus par pyserial, utilise :

print(c) si les caractères sont imprimables (ASCII)
print(ord(c)) sinon, pour afficher le code ASCII.

Aucun lien avec bluetooth ou pas bluetooth. Si le port série est ouvert à la même vitesse que sur l'ARDUINO, pyserial verra la même chose.

@+

Bonsoir à tous,

Je ne parviens pas à faire ce que je veux à savoir que lorsque je presse un bouton poussoir, cela doit écrire un caractère dans le Terminal de Raspbian.

Après lecture de nombreux posts, il semblerait que c'est parce que mon module bluetooth HC-06 ne gère pas le HID.

Est-ce que python est capable d'exécuter un ordre lorsqu'il comprend que mon bouton poussoir est enclenché ?

En clair :
1- J'appuie sur l'un des 17 boutons poussoirs de mon boîtier
2- python lit la valeur que renvoie l'atmega32u4
3- Il lance une commande dans la console.

Merci de votre aide.

Bonsoir

Est-ce que python est capable d'exécuter un ordre lorsqu'il comprend que mon bouton poussoir est enclenché ?

Il y a quelque chose à faire en écrivant un programme Python utlisant Pyserial (comme cela a déjà été écrit plusieurs fois au dessus) pour réceptionner les données puis lancer la ou les commandes correspondantes.

Par analogie avec Arduino disons que Pyserial est une librairie qui permet de gérer en Python les ports séries

Le HC06 ne peut être vu par le système d'exploitation que comme un port série virtuel et non comme un clavier BT.

J'ai essayé de coder un petit script avec la fonction print de Pyserial.
Pyserial m'affiche bien les valeurs qui peuvent aller de 1 à 9 et de a à k quand je presse le bouton poussoir.

En revanche, ma condition (si touche 1 est pressé, alors faire ceci) ne fonctionne pas. Je colle mon code, auriez vous une suggestion à faire svp ?

import serial

ser = serial.Serial('/dev/rfcomm0', 9600)

while 1:
    bouton = ser.readline()
    print('bouton') 


if bouton == b :	print('bouton')

Le premier print('bouton') dans le code sert juste de témoin quand je presse le bouton. Cette ligne de code sera effacée quand j'aurai pu mettre en place la condition.
Voyez vous des choses qui ne vont pas avec la condition ? Car la dernière ligne de code ne fonctionne pas.

Un petit up.
Je progresse à petit pas, mais je suis confronté à un nouveau problème.

Le code suivant :

if result == '4' : os.system("omxplayer -o local /home/pi/Videos/merci.mp4")
if result == 'c' : os.system("sudo pkill omxplayer")

La vidéo se lance bien quand j'appuie sur le bouton 4.
Si je souhaite l'arrêter, j'appuie sur le bouton C.

Mais comme la vidéo est au premier plan, pyserial n'écoute plus quand je presse le bouton poussoir.
Existe t-il un moyen pour que pyserial continue d'écouter, même lorsqu'il y a une vidéo en cours d'exécution ?

Je suppose que result contient un caractère reçu par la ligne série ?

Les événements clavier ou souris sont envoyés à l'application au premier plan.

Ce n'est pas le cas d'une ligne série.
La réception des caractères peut se faire en arrière plan.
Il doit y avoir une autre erreur.

@+

Effectivement, une fois la connexion établie via

ser = serial.Serial('/dev/rfcomm0', 9600)

Je fais la boucle suivante

while True:
result = ser.read()
print(result)
if result == '4' : os.system("omxplayer -o local /home/pi/Videos/merci.mp4")
if result == 'c' : os.system("sudo pkill omxplayer")

Avec ce script, pyserial ne lit pas les instructions en arrière plan.
Auriez vous une piste ?