7.3 KiB
Imprimante Ricoh SP C252DN
Cet article couvre deux opérations sur la Ricoh SP C252DN sous Linux : l'installation du fichier PPD pour exploiter toutes les fonctionnalités de l'imprimante, et la reprogrammation des puces de toner pour réinitialiser les niveaux d'encre.
Installation du fichier PPD sous Linux
Un fichier PPD (PostScript Printer Description) décrit les capacités d'une imprimante : résolutions disponibles, options de finition, polices intégrées, etc. Les systèmes Linux s'appuient sur ce descripteur pour exposer les options d'impression avancées au système et aux applications.
1. Ajouter l'imprimante via JetDirect
Lors de l'ajout de l'imprimante, sélectionner le protocole JetDirect.
2. Choisir un pilote générique temporaire
Choisir Generic > Generic PDF Printer. Ce pilote servira de base avant l'installation du PPD spécifique.
3. Télécharger le PPD Ricoh
Télécharger le fichier PPD depuis le dépôt suivant : https://git.abonnel.fr/cedricAbonnel/richo_c250dn_c252dn/src/branch/main/ppd
4. Installer le PPD
Dans la liste des imprimantes, ouvrir l'imprimante nouvellement ajoutée, cliquer sur l'icône Paramètres (
) puis sur Informations sur l'imprimante.
Cliquer sur Installer le fichier PPD, sélectionner le fichier téléchargé, ajuster le nom et l'emplacement si besoin.
Fermer la fenêtre avec la croix.
5. Vérifier les options d'impression
L'imprimante apparaît désormais avec ses options avancées dans la boîte de dialogue d'impression de n'importe quelle application.
Reprogrammation de la puce de toner
Les cartouches de toner Ricoh Aficio SP C250SF / SP C250DN / C250e / C252DN intègrent une puce EEPROM qui signale les niveaux d'encre au firmware. Reprogrammer cette puce permet de réinitialiser ces niveaux après un rechargement physique du toner.
Matériel et port de communication
L'opération se fait via un Arduino communiquant en I²C avec la puce. Les images ci-dessous montrent le port de communication de la cartouche et le câblage à réaliser.
Code Arduino
Adapter la valeur de EEPROM_I2C_ADDRESS selon la couleur de la puce à reprogrammer :
83— noir (K)82— cyan (C)81— magenta (M)80— jaune (Y)
// This code updates Ricoh toner chips for Ricoh Aficio SP C250SF, SP C250DN, C250e, etc.
// Update EEPROM_I2C_ADDRESS to the chip you want to reprogram:
// 83 = K (black), 82 = C (cyan), 81 = M (magenta), 80 = Y (yellow)
#define EEPROM_I2C_ADDRESS 83
#include <Wire.h>
// Blank data for K, C, M and Y chips (128 bytes each), dumped from replacement chips.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
void setup() {
// Select the correct data array based on the chip address.
byte WriteData[128];
switch (EEPROM_I2C_ADDRESS) {
case 83: memcpy(WriteData, KChipData, 128 * sizeof(byte)); break;
case 82: memcpy(WriteData, CChipData, 128 * sizeof(byte)); break;
case 81: memcpy(WriteData, MChipData, 128 * sizeof(byte)); break;
case 80: memcpy(WriteData, YChipData, 128 * sizeof(byte)); break;
default: memcpy(WriteData, KChipData, 128 * sizeof(byte)); break; // Fallback to K.
}
// Initialise I2C and serial buses.
Wire.begin();
Serial.begin(9600);
delay(100);
Serial.println("Start");
Serial.println(" ");
// Write 128 bytes to the chip.
Serial.println("Write 128 bytes:");
byte wordaddress;
for (byte i = 0; i < 128; i++) {
wordaddress = i;
i2cwrite((byte)wordaddress, (byte)WriteData[i]);
Serial.print(wordaddress);
Serial.print(":");
Serial.print(WriteData[i]);
Serial.print(" ");
}
// Read back the 128 bytes to verify.
Serial.println(" ");
Serial.println("Read 128 bytes:");
for (byte i = 0; i < 128; i++) {
byte readVale = i2cread(i);
Serial.print(i);
Serial.print(":");
Serial.print(readVale);
Serial.print(" ");
}
Serial.println(" ");
Serial.println("End");
}
void loop() {
}
void i2cwrite(byte address, byte data) {
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((byte)address);
Wire.write((byte)data);
Wire.endTransmission();
delay(20);
}
byte i2cread(byte address) {
byte rData = 0;
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((byte)address);
Wire.endTransmission();
Wire.requestFrom(EEPROM_I2C_ADDRESS, 1);
while (Wire.available()) {
rData = Wire.read();
return rData;
}
}
// Utility: scan the I2C bus to identify the address of a connected chip.
void WhatI2CAddress() {
for (int i = 0; i < 128; i++) {
Wire.requestFrom(i, 1);
Serial.print(i);
Serial.print(":");
while (Wire.available()) {
byte c = Wire.read();
Serial.print(c); // If data exists, print it — that's the chip address.
}
Serial.println(" ");
delay(5);
}
}











