I2C with Arduino

I’m having some trouble communicating with the Arduino over I2C.

We’re planning to use it for LED strips, since almost all our PWM slots are taken. But most examples I find online use Java, not Python. Is there any way to easily write a string over I2C? For example, writing something like “rgb,10,0,255” would turn on the RGB strip.

Can you post a link to java code that you think will solve your problem?

Here.

First part, should be pretty straightforward.


wire = wpilib.I2C(wpilib.I2C.Port.kOnBoard, 4)

Second part– I admit the docs aren’t super clear here, but it wants you to pass it a list of things that can be converted to bytes… so either integers or a bytestring.


wire.transaction(b'go', 0)

I’m pretty sure that’ll work.

It’s weird that the java code isn’t trying to receive any data (maybe writeBulk is more appropriate?).

Thanks, works great! In case anyone else stumbles across this, here’s the code I used:


import wpilib

class MyRobot(wpilib.IterativeRobot):

    def robotInit(self):
        self.stick = wpilib.Joystick(0)
        self.arduino = wpilib.I2C(wpilib.I2C.Port.kOnboard, 4)

    def teleopPeriodic(self):
        if (self.stick.getTrigger()):
            try:
                data = self.arduino.transaction(b'go', 0)
            except:
                pass
        else:
            try:
                data = self.arduino.transaction(b'stop', 0)
            except:
                pass

if __name__ == "__main__":
    wpilib.run(MyRobot)

And


#include <Wire.h>

void setup()
{
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);
  Serial.print("Hello");

}

void loop()
{
  delay(100);
}

void receiveEvent(int howMany)
{
  String rxString = "";
 
  while ( Wire.available() > 0 )
  {
    char n=(char)Wire.read();
    if(((int)n)>((int)(' ')))
    rxString += n; 
  }

  Serial.print(rxString);
}

Awesome, I like how much shorter it is than the Java version: