2016-09-06 5 views
1

(простите за плохой английский, я немецкий)I2C связи Raspberry Pi 3 и Arduino

Здравствуйте программисты,

Я пытаюсь (без успеха), чтобы отправить данные из Raspberry Pi 3 (мастер) к Arduino (раб):

Вот мой обновленный Arduino код:

#include <Wire.h> 
volatile bool flag = false; 
void wireHandler(int numBytes) 
{ 
    flag = true; 
} 
void setup() 
{ 
    pinMode(13, OUTPUT); 
    Wire.begin(0x23); 
    Wire.onReceive(wireHandler); 
} 
void loop() 
{ 
    delay(100); 
    digitalWrite(13, flag); 
} 

Мой скрипучий код (C++, г ++ main.cpp -lwiringPi):

#include <iostream> 
#include <wiringPi.h> 
#include <wiringPiI2C.h> 
int main(void) 
{ 
    if(wiringPiSetup() == -1) 
    { 
     std::cerr << "wiringPiSetup() == -1\n"; 
     return 1; 
    } 
    if(wiringPiI2CSetup(0x39) == -1) //is 0x39 correct? 
    { 
     std::cerr << "wiringPiI2CSetup(int) == -1\n"; 
     return 1; 
    } 
    while(true) 
    { 
     wiringPiI2CWrite(0x23, 0x23); 
     delay(100); 
    } 
} 

В теории это должно привести к тому, что светодиод Arduino Led (контакт 13) начнет мигать. Однако светодиод остается темным.

Буду признателен, если кто-нибудь сможет объяснить мне, почему эта программа не работает и как ее исправить.

И да I2C активирован в Raspi-Config.

ответ

0

Обработчик Wire.onReceive() вызывается из обработчика ISR, и поэтому все остальные ISR блокируются. В том числе один счет millis и без него delay() не может работать так, как полагается на millis.

Например, переменная volatile должна быть обновлена ​​этим событием и обработана в loop(), так как обработчики ISR должны быть как можно короче.

Например, этот один будет гореть, если принятый байт младшего бита является 1.

#include <Wire.h> 

volatile byte recv = 0; 

void setup() { 
    Wire.begin(0x23);    // join i2c bus with address #8 
    Wire.onReceive(receiveEvent); // register event 
    //Serial.begin(57600);   // start serial for output 
    pinMode(13,OUTPUT); 
} 

void loop() { 
    delay(10); 
    digitalWrite(13, recv); 
} 

void receiveEvent(int howMany) { 
    while (Wire.available()) { 
    byte c = Wire.read(); 
    recv = c & 1; // just last character and its LSB will be used 
    } 
} 

С другой стороны это еще один Arduino (как я просто не имею RPI) отправки приращения последовательности байт. Одно значение каждые 500 мс. Это делает первый arduino blink:

#include <Wire.h> 

void setup() { 
    Serial.begin(57600); 
    Wire.begin(); // join i2c bus (address optional for master) 
} 

byte x = 0; 

void loop() { 
    Wire.beginTransmission(0x23); // transmit to device #8 
    Wire.write(x);    // sends one byte 
    byte error = Wire.endTransmission();  // stop transmitting 

    Serial.print("Sent: "); 
    Serial.print(x,DEC); 
    Serial.print(" "); 
    Serial.println(error, DEC); 

    x++; 
    delay(500); 
} 

Но в основном только 0 или 1 значение может быть отправлено для выключения или включения светодиода.

+0

Спасибо, теперь, когда вы говорите об этом, это имеет смысл. Однако это все еще не работает. Любой вход? – Kryptomatrix

+0

Протестировано между двумя ардуинами. Код обновлен. – KIIV

+0

Благодарим вас за помощь, но это не решает мою проблему: если раб - это ардуино с моим кодом, а мастер - еще один ардуино, все работает отлично. Но если мастер - малина, это больше не работает. Возможно ли, что проблема в том, что малина имеет логику 3,3 В? – Kryptomatrix

Смежные вопросы