I2L 2024 Groupe5

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Proposition de système

Frogpad.png

Ce projet vise à développer un mini clavier programmable, conçu pour remplacer un clavier classique tout en étant optimisé pour une utilisation à une main. Inspiré du FrogPad, ce clavier permet d’accéder à l’ensemble des touches et fonctionnalités d’un clavier standard à travers 20 touches intelligentes.

Chaque touche est polyvalente et permet d’accéder à plusieurs caractères ou actions :

🔹 Lettres et chiffres

🔹 Symboles et caractères spéciaux

🔹 Raccourcis clavier et commandes système (Ctrl, Alt, Tab...)

L’utilisateur peut ainsi taper du texte, exécuter des commandes et naviguer rapidement, tout en bénéficiant d’un indicateur LED pour chaque touche enfoncée.

Ce clavier est particulièrement utile pour :

  • Les personnes en situation de handicap, qui ont des difficultés avec un clavier standard.
  • Les développeurs qui souhaitent optimiser leur flux de travail.
  • Les joueurs qui ont besoin de macros personnalisées pour leurs commandes.

Matériel utilisé

🔹 Microcontrôleur : ATmega32u4 (permet d’émuler un clavier grâce à la compatibilité USB HID).

🔹 Boutons programmables (nombre à définir selon la disposition).

🔹 LED RGB pour indiquer le mode actif et afficher les touches enfoncées.

🔹 USB 2.0 pour la connexion et la reconnaissance en tant que périphérique HID.

Fonctionnalités principales

🔹 Condense toutes les touches d’un clavier classique en seulement 20 touches intelligentes.

🔹 Système de combinaison de touches pour accéder aux différents caractères et commandes.

🔹 Indicateurs LED pour visualiser les touches actives et le mode en cours.

🔹 Support des raccourcis clavier (Ctrl+C, Alt+Tab, etc.).

🔹 Ergonomie optimisée pour une utilisation rapide et fluide à une main.

🔹 Mode de personnalisation permettant d’assigner des macros aux touches.

Pourquoi ce projet est pertinent ?

🔹 Accessibilité : Permet aux personnes en situation de handicap d’utiliser un clavier compact et efficace.

🔹 Optimisation : Facilite la saisie rapide pour les développeurs et les gamers.

🔹Exploration du protocole USB HID : Expérience technique sur la gestion d’un périphérique d’entrée avancé.

🔹Projet évolutif : Possibilité d’ajouter des fonctionnalités comme un écran OLED pour afficher les commandes en cours, ou encore des touches "libres" afin d'y associer des macros pour simplifier l'écriture de certaines commandes.

Contre-proposition

OK pour la proposition. Pour l'écran OLED ce serait compliqué mais vous pouvez ajouter la fonctionnalité USB série à la fonctionnalité clavier pour l'affichage ou la configuration de macros pour les touches.

Pour la gestion des touches en matrice voyez le projet [1].

Pas de difficulté particulière pour vos LED : elles sont en direct sur des sorties.

Si vous avez accès à un imprimante 3D vous pouvez tenter la fabrication de capuchons de touche à mettre sur les boutons poussoirs KAILH, regardez par exemple [2].

Proposition définitive

Répartition du travail

Carte

Schéma initial

Schéma de la carte

Schéma : Fichier:I2L-2024-Carte-G5a.zip

Carte routée

Schéma de la carte
vue de la carte

Suite à une erreur dans la conception de la carte (pas de diode en série avec les touches pour éviter les touches fantomes) une nouvelle version de la carte a été conçue.

Schéma de la carte
vue de la carte

Composants

  • ATmega32u4 : disponible
  • quartz GND24 : disponible
  • perle ferrite MH2029-300Y : commandée
  • LED RGB 5050 : disponible
  • touches KAILH BOX-BLACK : disponibles

Carte au 23/02/2025

Première réalisation

Non encore réalisé :

  • ajouter la perle de ferrite ;
  • ajouter la LED multicolore ;
  • ajouter les 18 touches restantes.

Carte au 26/02/2025

La LED multicolore est soudée. Par contre aucune touche n'a été ajoutée (attente de la nouvelle carte).

Montage

Code

Code C pour tester les touches.

#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>

typedef struct {
  volatile unsigned char *dir;
  volatile unsigned char *port;
  volatile unsigned char *pin;
  unsigned char bit;
} pin_t;

#define NB_LEDS		3
#define NB_LINES	4
#define NB_COLS		2

pin_t leds[NB_LEDS]={
  {&DDRE,&PORTE,&PINE,6},
  {&DDRF,&PORTF,&PINF,1},
  {&DDRB,&PORTB,&PINB,4}
};

pin_t lines[NB_LINES]={
  {&DDRF,&PORTF,&PINF,7},
  {&DDRF,&PORTF,&PINF,6},
  {&DDRF,&PORTF,&PINF,5},
  {&DDRF,&PORTF,&PINF,4}
};

pin_t cols[NB_COLS]={
  {&DDRC,&PORTC,&PINC,7},
  {&DDRB,&PORTB,&PINB,0}
};

int main(void)
{
CLKSEL0 = 0b00010101;   // sélection de l'horloge externe
CLKSEL1 = 0b00001111;   // minimum de 8Mhz
CLKPR = 0b10000000;     // modification du diviseur d'horloge (CLKPCE=1)
CLKPR = 0;              // 0 pour pas de diviseur (diviseur de 1)
MCUCR |= (1<<JTD);	// désactive JTAG pour utilisation de PF4 à PF7
MCUCR |= (1<<JTD);

// Configuration des LED
for(int i=0;i<NB_LEDS;i++) *leds[i].dir |= (1<<leds[i].bit);
// Configuration des lignes
for(int i=0;i<NB_LINES;i++) *lines[i].dir |= (1<<lines[i].bit);
// Configuration des colonnes
for(int i=0;i<NB_COLS;i++){
  *cols[i].dir &= ~(1<<cols[i].bit);
  *cols[i].port |= (1<<cols[i].bit);
}

// Initialisation des LED
for(int i=0;i<NB_LEDS;i++) *leds[i].port |= (1<<leds[i].bit);
// Initialisation des lignes
for(int i=0;i<NB_LINES;i++){
  if(i<NB_LINES-1) *lines[i].port |= (1<<lines[i].bit);
  else *lines[i].port &= ~(1<<lines[i].bit);
  } 

// Test des deux touches
while(1){
  if(*cols[0].pin & (1<<cols[0].bit)) *leds[0].port &= ~(1<<leds[0].bit); else *leds[0].port |= (1<<leds[0].bit);
  if(*cols[1].pin & (1<<cols[1].bit)) *leds[1].port &= ~(1<<leds[1].bit); else *leds[1].port |= (1<<leds[1].bit);
  if(!(*cols[0].pin & (1<<cols[0].bit)) && !(*cols[1].pin & (1<<cols[1].bit))) *leds[2].port |= (1<<leds[2].bit); else *leds[2].port &= ~(1<<leds[2].bit);
  }
}

Démonstrations

Lundi 24/02/2025 :

Allumer des leds en appuyant sur des touches. Une touche = une led


Jeudi 27/02/2025 :

Problème au niveau de la matrice .. combinaison impossible ..

Branchement clavier USB : OK. On peut inviter des personnes à faire la fête autour d'un bbq (2 touches, une 'b' et une 'q')

Combinaison de 2 touches = autre touche 'b' + 'q' = 'c'

Rendus

Projet KiCAD : Fichier:I2L-2024-Carte-G5.zip

Programmes : Fichier:I2L-2024-Programmes-G5.zip