Bon , OK, ça marche mais on perd complétement l'esprit de la machine et c'est super moche .
Au risque de me répéter, l'encodeur est absolument introuvable, il y a effectivement quelques rares annonces sur le net mais soit ce sont des encodeurs HS ou douteux vendus au prix de l'or soit ce sont des encodeurs n'ayant pas la même table de caractère que l'Apple 2+ (KR3600 ne terminant pas par "-070) donc inutilisables.
Comme on n'est jamais si bien servi que par soi-même, j'ai décidé de contourner le problème de la façon la plus élégante possible en reconstruisant un encodeur s'insérant entre le clavier d'origine et la carte mère.
J'aurai bien aimé remplacer le KR3600 directement par un microcontrôleur mais cela nécessitait de charcuter sauvagement la carte encodeur et ça c'est c'est Le Mal .
Le seul souci immédiatement rencontré est que pour gérer convenablement le clavier du 2+ il faut 28 pattes d'entrées/sorties (matrice 10X5 = 15, touches shift, ctrl, reset et rept = 4, bus de donnée + strobe + reset = 9).
En rusant on peut gagner 3 pattes mais c'est toujours trop par rapport aux 23 pattes d'E/S d'un arduino classique basé sur un mega 328 (nano, uno, duemilanove...).
Ne voulant pas rajouter de circuit externe et pour rester simple je me suis finalement dirigé sur un Atméga 32 qui comporte 32 E/S, le grand confort !
Pour programmer un Atmega vierge (sans bootloader donc) c'est super simple !
Il suffit d'utiliser un arduino sur lequel on va charger un programme qui va permettre de programmer n'importe quel Atmega de n'importe quel référence , elle est pas belle la vie ?!
En prérequis il faut télécharger le core de l'Atmega utilisé (ATmega1284, 644, 324, 164, 32, 16 et 8535 ), j'ai utilisé la bibliothèque de cores MightyCore à cet endroit https://github.com/MCUdude/MightyCore (aller dans la section installation en bas de page) avec une version de l'IDE Arduino en V1.6 minimum.
Comme je ne voulais pas m’embêter avec des composants externes, j'ai programmé l'Atméga32 pour utiliser son oscillateur interne à 8 Mhz plutôt qu'un quartz externe.
Je n'ai pas encore fini toute la programmation mais pour obtenir le résultat ci-dessous il faut une quarantaine de lignes dont la majeure partie est utilisée par plusieurs tableaux de définitions des touches.
J'ai utilisé la bibliothèque KEYPAD qui permet très facilement de gérer un clavier matricé de n'importe quel taille.
Il va encore me rester encore plein de place pour rajouter des petits trucs sympas, gérer un clavier externe de type PS/2 par exemple et/ou ajouter un port série pour rentrer des données avec un PC externe en mode terminal .
L'arduino Nano sur la partie gauche n'est là que pour programmer l'Atmega32, une fois le projet finalisé il n'y aura plus que l'Atmega32, une résistance, un condo et 2 connecteurs.
On voit bien le caractères ascii (afficheur de gauche) et son code affiché (afficheurs de droite).
La led rouge montre un strobe avec un caractère shift, la led verte montre un strobe avec un caractère normal sans shift.
Tout en bas le vilain encodeur APPLE dont le KR3600-070 est mort .
Et hop, le code que j'utilise, il n'est pas terminé mais le plus gros est fait .
Code : Tout sélectionner
/* @file HelloKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates the simplest use of the matrix Keypad library.
|| #
Modifié par olivier LIPPMANN 20/01/2017
Remplacement de l'encodeur clavier APPLE 2+ KR3600-70 par un ATMEGA 32
Jeux de caractère normal et shift OK
Reste à faire jeux de caractère et détection avec touche Ctrl
on peut aussi retirer 0x40 de tous les caractères entre 0x41 et 0x5F si manque de mémoire
Reste à faire envoi du reset calibré sur détection des touches Reset et Ctrl
Reste à faire fonction repeat avec la touche RPT
Attention le caractère 0x00 est interdit car il pose des soucis avec le Pascal sur Apple, remplacé par 0x20
*/
#include <Keypad.h>
boolean shift = 0 ;
const byte ROWS = 10; //10 rows
const byte COLS = 5; //5 columns
char keys[ROWS][COLS] = {
{0x2D,0x50,0x15,0x2F,0x0D},
{0x3A,0x4F,0x08,0x2E,0x20},
{0x30,0x49,0x3A,0x2C,0x20},
{0x39,0x55,0x4C,0x4D,0x20},
{0x38,0x59,0x4B,0x4E,0x20},
{0x37,0x54,0x4A,0x42,0x41},
{0x36,0x52,0x48,0x56,0x1B},
{0x35,0x45,0x47,0x43,0x31},
{0x34,0x57,0x46,0x58,0x32},
{0x33,0x51,0x44,0x5A,0x53}
};
const byte ROWS2 = 10; //10 rows
const byte COLS2 = 5; //5 columns
char keys2[ROWS2][COLS2] = {
{0x3D,0x40,0x20,0x3F,0x20},
{0x2A,0x20,0x20,0x3E,0x20},
{0x20,0x20,0x2B,0x3C,0x20},
{0x29,0x20,0x20,0x5D,0x20},
{0x28,0x20,0x20,0x5E,0x20},
{0x27,0x20,0x20,0x20,0x20},
{0x26,0x20,0x20,0x20,0x20},
{0x25,0x20,0x20,0x20,0x21},
{0x24,0x20,0x20,0x20,0x22},
{0x23,0x20,0x20,0x20,0x20}
};
byte rowPins[ROWS] = {A0, A1, A2, A3,A4,A5,A6,A7,14,13}; //connexion des rangées du clavier normal
byte colPins[COLS] = {12, 11, 10,9,8}; //connexion des colonnes du clavier
byte rowPins2[ROWS2] = {A0, A1, A2, A3,A4,A5,A6,A7,14,13}; //connexion des rangées du clavier shift
byte colPins2[COLS2] = {12, 11, 10,9,8}; //connexion des colonnes du clavier
Keypad clav = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Keypad clavshift = Keypad( makeKeymap(keys2), rowPins2, colPins2, ROWS2, COLS2 );
void setup(){
DDRC = B01111111; // bit 0 à 6 du port C en sortie
pinMode(1, OUTPUT); // pin 2 en sortie
pinMode(0, OUTPUT); // pin 1 en sortie
pinMode(15, INPUT_PULLUP); // pin 15 en entrée touche shift
}
void loop(){
char key = clav.getKey(); // récup de la touche appuyée dans la variable key
char key2 = clavshift.getKey(); // récup de la touche appuyé avec shift dans la variable key2
shift = digitalRead(15); // on lit la touche shift
// simulation strobe de 700 ms avec jeux de caractère normal , led verte sur pin 1
// Si key et shift vrai, on exécute la suite du IF
if (key && shift){
PORTC = key; // on allume les bits du PortC avec la valeur de key
digitalWrite(0,HIGH); // on envoie le strobe sur la led verte pin 1
delay (700); // la led reste allumée 700 ms
digitalWrite(0,LOW); // on éteint la led verte
}
// simulation strobe de 700 ms avec jeux de caractère shift , led rouge sur pin 2
// le vrai Strobe ne dure que 10 microseconde
// !shift car on détecte un niveau 0, un coté de la touche shift est relié à la masse
// si key2 et l'inverse de shift est vrai on exécute la suite du IF
if (key2 && !shift){
PORTC = key2;
digitalWrite(1,HIGH); // on envoie le strobe sur la led rouge pin 2
delay (700);
digitalWrite(1,LOW);
}
}