Résolu : Communication avec un 74HC138N

Bonjour,

Je me permet de venir vers vous, car je rencontre quelques problématiques.

Nous avons connecté deux 74HC138N sur un arduino mega.

Chaque 74HC138N sert à la fois pour la lecture des boutons et l’écriture des leds.

Pour chaque adressage du 74HC (colonne) nous avons 8bit pour les lignes.

nous avons un également un pins le verrouillage des leds.

Notre lecture des boutons envoyer des information en udp et l’écriture des leds vient du UDP en buffer, par un tableau hexadécimal.

Notre problématique c’est qu’il peut y avoir plusieurs leds d’allumer en même temps.

Dans l’état actuel, nous n’avons pas de problème de lecture des boutons, mais plutôt des problèmes d’écriture, soit les leds sont faible, soit des leds s’allume mais pas à l’adressage souhaité.

voici notre code actuel :

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>


byte arduinoMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress arduinoIP(192, 168, 1, 166); // desired IP for Arduino
unsigned int arduinoPort = 8888;      // port of Arduino

IPAddress receiverIP(192, 168, 1, 160); // IP of udp packets receiver
unsigned int receiverPort = 8080;      // port to listen on my PC

EthernetUDP _Udp;

uint8_t _packetBuffer[96];
int touches1[8][8];
int touches2[8][8];


#define MAX_NUMBER_OF_LINES 8
uint8_t ledtouche1[MAX_NUMBER_OF_LINES]; // N lignes, un bit par ligne
uint8_t ledColor1[MAX_NUMBER_OF_LINES]; // couleurs
uint8_t ledtouche2[MAX_NUMBER_OF_LINES]; // N lignes, un bit par ligne
uint8_t ledColor2[MAX_NUMBER_OF_LINES]; // couleurs


uint8_t ports1[8] = {B00000000, B00000001, B00000010, B00000011, B00000100, B00000101, B00000110, B00000111};
uint8_t ports2[8] = {B00000000, B00010000, B00100000, B00110000, B01000000, B01010000, B01100000, B01110000};

void setup() {
  Ethernet.begin(arduinoMac, arduinoIP);
  _Udp.begin(arduinoPort);

  // 1 == outputs, 0 == input
  DDRF = B00000000;  // Code binaire des lignes TMP IC11 -- Lecture bouton -- premier TMP
  DDRK = B00000000;  // Code binaire des lignes TMP IC11 -- Lecture bouton -- Deuxième TMP
  DDRC = B01110111; // Code binaire des colonnes TMP IC11 -- adressage led et boutons
  DDRA = B11111111; // Ecriture des leds -- premier TMP
  DDRL = B11111111;// Ecriture des leds -- Deuxième TMP

  pinMode(41, OUTPUT); // -- premier TMP
  pinMode(40, OUTPUT); // -- Deuxième TMP

  reset();
  //Serial.begin(9600); // open the serial port at 9600 bps:
}

void lecture() {
  for (int t = 0; t < 8; t++) {
    PORTC = ports1[t];
    delayMicroseconds(50);
    for (int i = 0; i < 8; i++) {
      touches1[t][i] = bitRead(PINF, i);
    }
  }
  
  for (int t = 0; t < 8; t++) {
    PORTC = ports2[t];
    delayMicroseconds(50);
    for (int i = 0; i < 8; i++) {
      touches2[t][i] = bitRead(PINK, i);
    }
  }
  
  if (PINF != 0) {
    for (int col = 0; col < 8; col++) {
      for (int ligne = 0; ligne < 8; ligne++)
      {
        if (touches1[col][ligne] == 0) {
          envoiUDPServer(3, col, ligne);
        }
      }
    }
  }

  if (PINK !=0) {
    for (int col = 0; col < 8; col++) {
      for (int ligne = 0; ligne < 8; ligne++)
      {
        if (touches2[col][ligne] == 0) {
          envoiUDPServer(4, col, ligne);
        }
      }
    }
  }
}

void envoiUDPServer(int tmp, int col, int ligne) {
  _Udp.beginPacket(receiverIP, receiverPort); //start udp packet
  _Udp.print(tmp);
  _Udp.print(col);
  _Udp.print(ligne);
  _Udp.endPacket();
}

void loop() {
  lecture();
  delay(1);
  ecriture();
}

void ecriture() {

  int packetSize = _Udp.parsePacket();

  if (packetSize)
  {
    _Udp.read(_packetBuffer, UDP_TX_PACKET_MAX_SIZE);

    uint8_t cmd = _packetBuffer[0];
    if (cmd == 3)
    {
      for (int i = 0; i < MAX_NUMBER_OF_LINES; i++)
      {
        ledtouche1[i] = _packetBuffer[1 + (2 * i)];
        ledColor1[i] = _packetBuffer[1 + (2 * i)];
      }
    }
    else
    {
      for (int i = 0; i < MAX_NUMBER_OF_LINES; i++)
      {
        ledtouche2[i] = _packetBuffer[1 + (2 * i)];
        ledColor2[i] = _packetBuffer[1 + (2 * i)];
      }
    }
  }
  /// fin UDP wait
  for (int i = 0; i < 8; i++)
  {
    if(ledtouche1[i] > 0){
    digitalWrite(41, LOW);
    PORTC = ports1[i];
    delayMicroseconds(80);
    leds1(ledtouche1[i], ledColor1[i]);
    //Vérouiller les leds
    digitalWrite(41, HIGH);
    delayMicroseconds(200);
    }
  }
  for (int i = 0; i < 8; i++)
  {
    if(ledtouche2[i] > 0){
    digitalWrite(40, LOW);
    PORTC = ports2[i];
    delayMicroseconds(80);
    leds2(ledtouche2[i], ledColor2[i]);
    //Vérouiller les leds
    digitalWrite(40, HIGH);
    delayMicroseconds(200);
    }
  }
}
void leds1(uint8_t line, uint8_t color)
{
  uint8_t l;

  for (int i = 0; i < 8; i++)
  {
    uint8_t c = bitRead(color, i);
    digitalWrite(21, c ? HIGH : LOW);
    bitWrite(l, i, bitRead(line, i));
  }

  delayMicroseconds(80);
    PORTA = l;
  delayMicroseconds(70);
}

void leds2(uint8_t line, uint8_t color)
{
  uint8_t m;

  for (int i = 0; i < 8; i++)
  {
    uint8_t c = bitRead(color, i);
    digitalWrite(21, c ? HIGH : LOW);
    bitWrite(m, i, bitRead(line, i));
  }

  delayMicroseconds(80);
    PORTL = m;
  delayMicroseconds(70);
}

void reset()
{
  for (int i = 0; i < MAX_NUMBER_OF_LINES; i++)
  {
    ledtouche1[i] = 0;
    ledtouche2[i] = 0;
  }
}

J’ai besoin de nouvelle œil pour peut-être la solution à mon problème.

J’espère avoir été clair. Je pourrais donner plus d’information si besoin.

Merci d’avance et impatient de vous lire.

Cordialement,

Vincent

Bonjour,

Nous avons à réussi créer notre code pour écrire et lire avec notre multiplexeur (3to8).

Problème résolu.

Cordialement,

Vincent.