Wpis z mikrobloga

#programowanie #arduino #i2c

Hej Mirasy!

Szukam od kilku dni rozwiązania problemu. Wygląda on następująco:

Mam spięte magistralą i2c UNO r3 jako master i n klonów (dswyrobot - działają)

Dane przesyłane przez i2c:

Master:

- wysyła do slave'a 2 bajty danych (w tym momencie są to stany z przycisków, później będą to wyliczone kąty serw)

kod:

#include

const int buttonPin2 = 2;

const int buttonPin3 = 3;

byte buttonState2 = 0;

byte buttonState3 = 0;

byte test[] = {buttonState2, buttonState3};

void setup()

{

pinMode(buttonPin2, INPUT);

pinMode(buttonPin3, INPUT);

Wire.begin();

Serial.begin(9600);

}

void loop()

{

buttonState2 = digitalRead(buttonPin2);

buttonState3 = digitalRead(buttonPin3);

Wire.beginTransmission(4);

Wire.write(test[0]);

Wire.write(test[1]);

Wire.endTransmission();

delay(1000);

}

Slave:

-odbiera dane i zapala poszczególne diody

kod:

#include

#define SLAVE
ADDRESS 4

#define Regmapsize 2

#define MAXSENDBYTES

const int ledPin2 = 2;


const int ledPin3 = 3;

int ledState2 = 0;

int ledState3 = 0;

byte test[] = {ledState2, ledState3};

void setup()

{

Wire.begin(SLAVE_ADDRESS);

Wire.onRequest(requestEvent);

Wire.onReceive(receiveEvent);

Serial.begin(9600);

pinMode(ledPin2, OUTPUT);

pinMode(ledPin3, OUTPUT);

}

void loop()

{

// delay(100); // czy jest to w ogóle potrzebne w tym wypadku?

}

void requestEvent(){

}

void receiveEvent(int bytesReceived)

{

while(1 < Wire.available())

{

test[0] = Wire.read();

test[1] = Wire.read();

if (test[0]>0)

{

digitalWrite(ledPin2, HIGH);

}

else

{

digitalWrite(ledPin2, LOW);

}

if (test[1]>0)

{

digitalWrite(ledPin3, HIGH);

}

else

{

digitalWrite(ledPin3, LOW);

}

}

delay(1000);

}

Co robię nie tak? Kluczową rolę w projekcie odgrywa komunikacja, a czas goni, nerwów brak..

Tak, dupa ze mnie nie programista. Nie miałem wcześniej zbyt owocnej pracy przy mikrokontrolerach...
  • 8
@Wiktor426: @zachwiej: Myślicie, że asynchroniczna magistrala będzie lepsza?

Nie wiem dlaczego, ale wydawało mi się, że to i2c jest szybsze...

W takim razie podejście nr milion jeden do kolejnej próby rozwiązania problemu...

Dziękuję panowie, moderatora proszę o zamknięcie tematu.
@Yerboholik: a na przyszłość pamiętaj zasilacz tylko z białej listy! ;)

PS. I2C działa napewno na 15m po skrętce sieciowej, i to biegnąc koło przewodu z 230v AC :P to jako ciekawostka bo I2C jest raczej magistralą na odlegości PCB ;)
@zachwiej: W moim przypadku odległości pomiędzy arduino a arduino to max 10cm, więc wcale nie dużo.

Nic to, będę walczył dalej. Jeśli i przy RS485 będę miał jakiś problem, zawołam :)

I jeszcze raz dzięki!