Conception
J'ai généré une disposition plus ou moins idéale pour la disposition des touches en fonction de la forme de ma main sur ergopad : https://pashutk.ru/ergopad/
On vas tenter de générer un pcb depuis un logiciel prévu pour ça : ergogen le logiciel demande nodeJS, un interprète javascript que je ne connais pas et qui fut plutot laborieu a installer sur un linux, on installe ensuite ergopad. (J'ai par la suite trouver une version web beaucoup plus pratique et qui ne nécessite pas de mettre les mains dans le cambouis : https://ergogen.cache.works/#) un clavier normal a en general 26 touches de lettres, 22 pour les chiffre et caractères speciaux puis les touches de control (2 alt, 2 ctrl, 2 maj, vermaj, retours windows, tabb, dell, espace), la croix directionnelle, les 12 touches de fonction, le pavé numérique et éventuellement des touches de macro. Tout ça pour un total de 88 touches, 56 réelement indispensable.
config des pins ici : https://github.com/benvallack/ergogen
On ne posede que 5 doigts qui on entre 3 et 4 position confortable pour une touche chacun (8 pour l'index et 3 pour le pouce), un total de 44 touches possibles au total. On vas tenter de réduire au maximum le nombre de touche nécessaire par exemple en mettant différente organisation de clavier différentes interchangeable avec une une touche. ref : https://www.youtube.com/watch?v=8wZ8FRwOzhU&t=132s
Switch brown (retours tactile mais silencieux) https://fr.aliexpress.com/item/32899833333.html https://fr.aliexpress.com/item/1005001864766812.html?spm=a2g0o.productlist.0.0.6b584a82GRTs8m&algo_pvid=afcbc6e4-3e33-4a80-9bb9-defdb27c54b4&algo_exp_id=afcbc6e4-3e33-4a80-9bb9-defdb27c54b4-1&pdp_ext_f=%7B%22sku_id%22%3A%2212000017909409069%22%7D&pdp_npi=2%40dis%21EUR%21%2115.42%21%21%21%21%21%402100bb5116531312875265836e5f85%2112000017909409069%21sea
carte : https://fr.aliexpress.com/item/4000991785942.html (je vais finalement utiliser une carte promicro car déjà implémenté dans le logiciel qui génère le pcb)
diode : https://fr.aliexpress.com/item/32947233235.html
Bépo la config de touche
autres exemples : https://github.com/benvallack/ergogen/blob/master/config.yaml https://github.com/benvallack/ergogen/blob/master/config-flipper.yaml
après un passage (long et fastidieu) sur ergogen on obtient ca (le code est en dessous) :
J'ai rajouté par dessus en couleur comment je voulais relier electroniquement les touches, il faut également rajouter une diode a chaque touche pour éviter une contre réaction et pouvoir appuyer sur plusieurs touches en même temp, c'est également géré par le logiciel. on obtient a la fin un fichier Kicad que nous n'avons plus qu'a dessiner les pistes a la main en reliant les composants déjà placé et relié par des trait (definit dans ergogen également grace a la condition “net”). Et voila le résultat sur Kicad :
Il ne reste plus qu'a le graver au fablab sur la technodrill ou via des services de gravures proposées en ligne.
Je l'ai fait graver au fablab avec l'aide de Manuel Bouyer. On est dabbord passer par un logiciel permetant de faire le tracé puis on l'a envoyé directement sur la machine après avoir fait les réglages physique néscecaires comme la mise a niveau du plateau en fonction de l'epaisseur de la plaque. (voir le guide d'utilisation sur le wiki). Pour ce circuit on a besoin d'une plaque double couche, on vas donc avoir besoin de retourner la plaque pour faire la gravure des deux cotées. On a utilisé 3 fraises differentes, une pour découper les contours et les trous pour les touches, une pour les trous des pins et une derniere pour la gravure. A cause de probleme de calibration, certaines pistes ne sont pas isolé de la masse, j'ai donc terminer de découper la piste au scalpel a l'aide de la loupe binoculaire.
Je me suis rendu compte un fois terminé que la carte scencé se positionner sur la carte ne corespondait pas avec celle du PCB, ce n'est pas un soucis, j'ai juste pris des pins coudé pour la souder a la carte.
Par ailleur le schéma exploite les deux couches qui doivent parfois etre relier, malheureusement la technodrill ne permet pas de faire ceci, je vais donc devoir souder les touches des deux cotés de la plaque. C'est un peu perilleux car on risque d'abimer les touches et on dois systematiquement verifier la conductivité électrique a chaque soudure mais totalement faisable. On soude aussi les diodes et on coupe les pates qui dépassent.
Par la suite, il nous faut coder la carte, j'ai opté pour une configuration Bépo avec deux autres layers pour les caracteres speciaux mais je ne parviens toujours pas a programmer la carte correctement. Je compte ajouter un bouton pour changer de mode plus facilement mais je vais surrement avoir besoin de rajouter une deuxieme carte pour plus de touches.
Je vais ensuite imprimer des touches en 3D, avec une precision maximale pour etre plus agréable sous les doigts. J'ai imprimé un premier prototype qui me semble concluant. Reste le probleme de comment inscrire les lettres sur les touches. Soit renfoncé dirrectement dans la touche a l'impression, soit peinte. Et ensuite couverte par de la resine. Sinon je pourrais créer un moule a partir d'une impression dans du silicone puis couler de la resine epoxie, meme si elle serons surement un peu lourde.
Enfin on peu tenter de faire une couverture pour la carte electronique, par exemple en bois grace a la découpeuse laser, faire un revetement pour proteger la carte de l'eau ou de l'humidité et les cours circuit (résine epoxy ? vernis ?), des pied en caoutchou antidérapant pour la stabilité et l'orientation du clavier, modifier un cable pour en avoir un plus joli et raccord avec l'éstetique du clavier, etc....
forme sur ergogen : ca nous permet de créer un pcb sur kicad et un contours a partir de la definition des positions des touches.
Points
zones:
ptit:
anchor:
rotate: 8
rows:
1:
row_net: P10
mirror.row_net: P10
2:
row_net: P16
mirror.row_net: P16
3:
row_net: P14
mirror.row_net: P14
columns:
o:
key:
column_net: P1
mirror.column_net: P11
3autres:
anchor:
rotate : -8
ref: ptit_o_1
shift : [22, 5]
rows:
1:
row_net: P10
mirror.row_net: P10
2:
row_net: P16
mirror.row_net: P16
3:
row_net: P14
mirror.row_net: P14
4:
row_net: P15
mirror.row_net: P15
columns:
annulaire:
rotate: 0
key:
column_net: P21
mirror.column_net: P11
majeur:
rotate: -5
stagger: 5
spread: 20
key:
column_net: P20
mirror.column_net: P9
index2:
rotate: -5
stagger: -5
spread: 20
key:
column_net: P19
mirror.column_net: P8
index1:
rotate: -3
stagger: -1
spread: 21
key:
column_net: P18
mirror.column_net: P7
poucehaut:
anchor:
ref: 3autres_index1_1
rotate: -20
shift: [29.5,0]
rows:
1:
row_net: P8
mirror.row_net: P8
columns:
1:
key:
column_net: P18
mirror.column_net: P7
2:
rotate: -15
stagger : -3
spread: 21
key:
column_net: P19
mirror.column_net: P8
3:
rotate: -15
stagger : -3
spread: 21
key:
column_net: P20
mirror.column_net: P9
4:
rotate: -15
stagger : -3
spread: 21
key:
column_net: P21
mirror.column_net: P10
pouce2:
rows:
1:
row_net: P9
mirror.row_net: P9
columns:
1:
key:
column_net: P21
mirror.column_net: P10
anchor:
ref: poucehaut_4_1
rotate: 0
shift: [0,-20]
espace:
rows:
1:
row_net: P9
mirror.row_net: P9
columns:
1:
key:
column_net: P18
mirror.column_net: P7
anchor:
ref: 3autres_index1_1
rotate: -30
shift: [32,-24]
mirror:
ref: poucehaut_4_1
distance: 50
key:
footprints:
- type: mx
nets:
from: mx
to: =column_net
params.keycaps: true
- type: diode
anchor:
shift: [0, -4.7]
nets:
from: mx
to: =row_net
outlines.exports:
plate:
- type: keys
side: left
size: 30
bevel: 5
- type: polygon
points:
- ref: pouce2_1_1
shift: [0,-12]
- ref: espace_1_1
shift: [0,-12]
- ref: poucehaut_2_1
shift: [0,-12]
- ref: poucehaut_4_1
shift: [0,-12]
operation: add
- type: rectangle
size: [30, 30]
anchor:
ref: poucehaut_1_1
shift: [-14,-35]
bevel: 5
operation: add
- type: rectangle
size: [24, 43]
anchor:
ref: 3autres_index1_4
shift: [14, -40]
bevel: 5
operation: add
- type: rectangle
size: [24, 43]
anchor:
ref: 3autres_index1_4
shift: [9, -40]
operation: add
- type: rectangle
size: [24, 43]
anchor:
ref: 3autres_index1_4
shift: [14, -60]
operation: add
# - type: rectangle # size: [35, 18] # anchor: # rotate: -90 # ref: 3autres_index1_4 # shift: [16, -2] # operation: stack # - type: circle # radius: 2 # anchor: # ref: 3autres_index1_4 # shift: [25, -19.5] # operation: stack
platemirror:
- type: keys
side: right
size: 30
bevel: 5
- type: polygon
points:
- ref: mirror_pouce2_1_1
shift: [0,-12]
- ref: mirror_espace_1_1
shift: [0,-12]
- ref: mirror_poucehaut_2_1
shift: [0,-12]
- ref: mirror_poucehaut_4_1
shift: [0,-12]
operation: add
- type: rectangle
size: [30, 30]
anchor:
ref: mirror_poucehaut_1_1
shift: [14,-35]
bevel: 5
operation: add
- type: rectangle
size: [24, 60]
anchor:
ref: mirror_3autres_index1_1
shift: [38, -16]
bevel: 5
operation: add
- type: rectangle
size: [24, 60]
anchor:
ref: mirror_3autres_index1_1
shift: [30, -16]
bevel: 5
operation: add
arduino:
- type: rectangle
size: [24, 43]
anchor:
ref: 3autres_index1_4
shift: [14, -40]
bevel: 5
operation: add
- type: rectangle
size: [24, 43]
anchor:
ref: 3autres_index1_4
shift: [9, -40]
operation: add
- type: rectangle
size: [24, 43]
anchor:
ref: 3autres_index1_4
shift: [14, -60]
operation: add
finalkey:
- plate
- platemirror
- type: keys
side: both
size: 18
operation: subtract
final:
- plate
- platemirror
- arduino
PCBS :
left:
outlines:
contours:
outline: plate
layer: Edge.Cuts
footprints:
- type: promicro
anchor:
rotate: -90
ref: 3autres_index1_4
shift: [25, -19.5]
right:
outlines:
contours:
outline: platemirror
layer: Edge.Cuts
footprints:
- type: promicro
anchor:
rotate: -90
ref: 3autres_index1_4
shift: [25, -19.5]
- type: jumper
anchor:
ref: mirror_3autres_index1_2
shift: [-10, 0]
nets:
from: P18
to: P20
both:
outlines:
contours:
outline: final
layer: Edge.Cuts
footprints:
- type: promicro
anchor:
rotate: -90
ref: 3autres_index1_4
shift: [25, -19.5]
#ligne L1 = P10 L2 = P16 L3 = P14 L4 = P15 L5 = P8 L6 = P9
#colones main gauche C1 = P1 C2 = P21 C3 = P20 C4 = P19 C5 = P18 #colones main droites C6 = P7 C7 = P8 C8 = P9 C9 = P10 C10 = P11
Si vous essayez de reproduire ceci et avez des problèmes avec Ergogen, n’hésitez pas a me contacter. J'ai suffisamment galéré avec ce truc pour que maintenant je puisse aider d'autres personnes. romain.tessier@etu.sorbonne-universite.fr