Connect with us

How do I multiplex lots of switches/LEDs with my Arduino

Discussion in 'Microcontrollers, Programming and IoT' started by Crystal Wizard, Feb 21, 2016.

Scroll to continue with content
  1. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    I am looking at building a Project (https://www.electronicspoint.com/threads/assorted-gubbins-on-toy-tank.277654/ ) and need to control about 13 LEDs, using maybe 12 Buttons.

    I do not have that many I/O pins on the Arduino Micro that I am planning on using (especially once the other parts I need are connected)

    I have been pointed in the direction of "Multiplexing", but need to check that I understand how it works.

    So:
    To manage the 12 Input Buttons, rather than using 12 separate pins, I build a 3x4 matrix of buttons, and write a loop to cycle through each of the 4 Columns, checking which of the 3 buttons is pressed. This uses 7 Pins (4 Column-selector, 3 input).
    I run this loop, assigning values to IsButtonXPressed variables, and then move on to the next section of code (do stuff when buttons are pressed).
    The code then comes back to the loop, and checks all the buttons again.

    I also need to do similar on the Output, putting the LEDs in a grid, and controlling row/columns to light them up.

    Am I on the right lines here?
     
  2. (*steve*)

    (*steve*) ¡sǝpodᴉʇuɐ ǝɥʇ ɹɐǝɥd Moderator

    25,505
    2,852
    Jan 21, 2010
    yeah, pretty much so.

    However it might be worth looking at the 74HC595 for driving the LEDs. With this you can control an almost unlimited number of LEDs with just 3 pins.

    The equivalent for inputs is the 74HC165.

    There are also plenty of other chips out there that can do this sort of thing.

    You'll find that there will be a tradeoff between simplicity, number of pins, number of inputs/outputs and cost (amongst other things). It's up to you to decide what the right answer is for you.
     
    Gryd3 likes this.
  3. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    Thanks.
    They certainly do look handy! And probably easier to cram into my limited space than my (inexpertly-built) matrix! :)
     
  4. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    So, I can either connect 8 of my buttons to the 74HC165, and the other 4 direct to pins, or use 2x 74HC165 and work on them all together. Sounds more coherent to do the latter.
    Only one button will be being pushed at once.

    For LEDs, I do similar. 2x 74HC595. I will need multiple LEDs lit at once. I'm not sure how this works. Do I send a "pattern" to the 595, and it lights those LEDs, or do I send sequential 1 LED signals, and they "flicker" (too fast to notice)?
     
  5. BobK

    BobK

    7,682
    1,689
    Jan 5, 2010
    For the outputs, you send a bit stream representing all of the LEDs then send a latch command. The LEDs that had a 1 in the bit stream will be on. You need do nothing else until you change anything, then you do it all over again. No flickering.

    Bob
     
  6. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    Cool.
    I think I know where I am going with the code needed then. Will test basic code when my Arduino arrives, and then send off for some 74HCxxx chips.
     
  7. Jouellet

    Jouellet

    86
    19
    Feb 2, 2015
  8. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    I need to figure what I2C is!

    For now, i think the 74HC165/595 will do what I need.
     
  9. Jouellet

    Jouellet

    86
    19
    Feb 2, 2015
    8 I/O points expansion module

    You could configure 4 points as Inputs and 4 points as Outputs

    You write 0/1 thru I2C to turn outputs on/off
    And read thru I2C
     
  10. (*steve*)

    (*steve*) ¡sǝpodᴉʇuɐ ǝɥʇ ɹɐǝɥd Moderator

    25,505
    2,852
    Jan 21, 2010
    I2C is a communications protocol which allows bidirectional data transfer.

    In practice this means you (typically) use a specific set of pins and call library routines to read and write data to/from the external device(s).
     
  11. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    I'm struggling to source a 74HC165 from my favoured suppliers.
    Would a 74HCT164 do the same job?

    Or is there a good place to buy a 165?
     
  12. (*steve*)

    (*steve*) ¡sǝpodᴉʇuɐ ǝɥʇ ɹɐǝɥd Moderator

    25,505
    2,852
    Jan 21, 2010
    Try sourcing a 74HC166

    Who is your supplier? Try Element 14, Mouser, or RS.
     
  13. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    I have been using bitsbox.co.uk.
    I am only ordering small amounts ( <£20) at a time.

    I know I can chain shift-registers together, but would be interested in a 16-bit IC, to keep both code and hardware tidy (I am limited on space).
     
  14. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    Me again! :)

    I've got a bag full of 595s and 166s.

    I've built a circuit using an OUTPUT shift-register (595). All works fine.
    But I need to expand, and use an INPUT shift-register for my rack of switches/buttons. (also a 2nd OUTPUT shift-register, but that looks OK ...)

    Every tutorial/example uses Arduino Pin 8 as latch, for both.
    My OUTPUT is currently:
    Code:
    //Pin connected to ST_CP of 74HC595
    int latchPin = 8;
    //Pin connected to SH_CP of 74HC595
    int clockPin = 12;
    ////Pin connected to DS of 74HC595
    int dataPin = 11;
    I am concerned that if I connect my INPUT latch to Pin 8, I will cause issues on the OUTPUT when reading the INPUT.

    Is this a problem? Can I use a different pin?
     
  15. (*steve*)

    (*steve*) ¡sǝpodᴉʇuɐ ǝɥʇ ɹɐǝɥd Moderator

    25,505
    2,852
    Jan 21, 2010
    You can latch both at the same time if your process is to load the outputs and then read the inputs at the same time.

    It is probably simpler to use a different pin for latching inputs than used for latching outputs.

    There is a cunning method of using a single pin to both read and write, and a single pin for latching, but unless you're really short of pins, make things as was as possible for yourself.
     
  16. Crystal Wizard

    Crystal Wizard

    100
    32
    Feb 10, 2016
    Thanks.
    I can just use a different pin. :)

    I might be interested in the cunning trick, but not for this project! By offloading my Inputs and Outputs onto shift-registers, I should have plenty of pins left on the Arduino.
     
Ask a Question
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.
Electronics Point Logo
Continue to site
Quote of the day

-