I am building a bunch of slave devices (Arduinos) that operate autonomously, but will report data back to a single raspberry pi and update their clocks from the pi's time.

I've only worked with one arduino using serial, but I would imagine that 20 arduinos needs a special solution. I don't know how to split serial, but I've also considered SPI and I2C. Would either of these be the way to go?

Given that there are 20 units, I don't think I should go with wifi as I fear there would be loss of connectivity often. I prefer a hardwired method.

EDIT: Also, these arduinos won't be close to each other. They will be spread out, no more than 30 feet from the pi.

  • I2C works with 20 slaves. With SPI you'd at least have to use some generic GPIO pins as address lines. Both should do.
    – Ghanima
    Apr 8, 2016 at 15:28
  • @Ghanima can data be written in both directions? Can the slave report 'all good' or 'error on pin 1', for example? Also, the furthest arduino will be 30 feet from the pi.
    – pekasus
    Apr 8, 2016 at 15:49
  • 1
    You will probably have trouble running 20 30ft I2C connections. I2C likes to have very-low capacitance on the clock and data lines. See electronics.stackexchange.com/questions/106265/… . There are nuances to different electrical topologies as well e.g. ring vs star.
    – jamesbtate
    Apr 8, 2016 at 18:12
  • 2
    As per the last comment you would probably get better connectivity via wifi, not worse.
    – goldilocks
    Apr 8, 2016 at 18:23
  • 1
    I think you need multipoint bus such as RS-485 or CAN. You could use I2C with P82B96 or similar buffer IC as well.
    – edo1
    Apr 9, 2016 at 0:21

4 Answers 4



simulate this circuit – Schematic created using CircuitLab

I2C will be just fine, but don't forget to apply a power and use diodes to ensure a proper power flow

  • You might want to explain that diodes part.
    – Ghanima
    Apr 8, 2016 at 21:08
  • @Ghanima three diodes per power line (+ and -/gnd) Apr 8, 2016 at 21:10
  • Let me rephrase my question: why?
    – Ghanima
    Apr 8, 2016 at 21:12
  • @Ghanima I had some cases in I2C "long chains" when the I2C master's VCC was not enough to properly power it all on, discovered just by an experiment adding slaves one by one. The problem is that an external PSU must have the same GND with master(RPi) and the diodes to prevent SoC from frying - there are some precedents not only with RPi Apr 8, 2016 at 21:19
  • 2
    What on earth is "I2C VCC" supposed to be? I²C has 2 open-drain data lines with pullup to supply voltage. The Pi has on-board pullup.
    – Milliways
    Apr 9, 2016 at 1:31

I'd use Wifi and sockets. It's relatively simple to use Qt (or even plain C++) to implement a multi-connection client/server. There are lots of tutorials on the net.

  • I looked that up, but that looks like it may be overkill for the small amount of data that I'll be sending. It looks like I'd have to develop my own software in C++ for the networking vs using a library for I2C
    – pekasus
    Apr 8, 2016 at 20:44

You should be able to use I²C over these distances with careful layout. I would suggest you use the slowest I²C speed (although the Pi default is already 100kHz). You should also use a bi-directional level converter at the Pi end as the high level would otherwise be marginal for the Arduino.


A wired solution would be to use RS-485. You can connect many devices on a single twisted wire (two wire) cable. There is an good example at https://arduino-info.wikispaces.com/SoftwareSerialRS485Example. The modules shown are really cheap. I see vendors having 5 of them for 7.99. You can also use a USB to RS-485 dongle on the Raspberry Pi.

  • More detail is needed. The link might provide the answer, but the essence of what is on the webpage needs to be included in your answer.
    – Darth Vader
    Apr 14, 2016 at 19:12
  • So I guess I would just put two wires into each screw terminal if I want to link them with more than 2 arduinos, correct? This won't affect the signal?
    – pekasus
    Apr 14, 2016 at 19:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.