как передать "hello" по i2c

Тема в разделе "Raspberry Pi", создана пользователем mazzick, 3 сен 2018.

  1. mazzick

    mazzick Нуб

    Привет!
    Уже замучился искать ответ. Может у кого есть простой пример, как передать слово + цифра из ардуино в распбери через i2c. По usb нашел как сделать, попробовал и все получилось. По i2c целый день потратил но так и не нашел простого кода для ардуино и распбери. Кто поделится магией?
     
  2. Mitrandir

    Mitrandir Гуру

    Могу поделиться кодом как с распберри забрать у адруины данные если надо ( распберри мастер, ардуино слейв).
    Ардуино мастер -малина слейв не приходилось делать
     
  3. Mitrandir

    Mitrandir Гуру

    Raspberry:
    Код (C++):
    #include <iostream>
    #include <wiringPiI2C.h>

    using namespace std;

    int main()
    {

    int fd = wiringPiI2CSetup (0x40); // the device address goes here
    cout << "Init result: "<< fd << endl;
    wiringPiI2CWrite (fd, 5);


    int result =0
    char buff[10];
    int bp = 0;
    while(result = wiringPiI2CRead(fd))
    {
       buff[bp++]=result;
    }
    buff[bp++]=0;
    cout<< buff<<endl;

    }
     
    Arduino-slave
    Код (C++):


    #include <Wire.h>


    // function that executes whenever data is received from master
    // this function is registered as an event, see setup()
    void receiveEvent(int howMany) {
      int x = Wire.read();    // receive byte as an integer
      if (x == 5)
      {
          Wire.write("hello");
      }
    else
    {
         Wire.write("Go Away");
    }
    }
    void setup() {
      Wire.begin(0x40);                // join i2c bus with address #8
      Wire.onReceive(receiveEvent); // register event
      Serial.begin(9600);           // start serial for output
    }

    void loop() {
     
    }
     
    [/code]
     
    mazzick нравится это.
  4. mazzick

    mazzick Нуб

    Mitrandir Спасибо! вроде то что надо, только я не очень в программировании. На чем код написан для распбери?
    я на питоне немного набросал, но с текстом так и не справился ((( могу только 255 максимум , а мне надо поболее цифр передать и разделить их символами для каждого датчика - температура,влажность,давление,ветер и т.п. Придумал так разделить t24th65hp755pw5w... но только по USB получилось это передать, по i2c ничего не получается

    вот только пару цифр смог, на большее не хватило магии

    Код (C++):
    #include <Wire.h>
    #define SLAVE_ADDRESS 0x09

    int number = 123;

    void setup() {

        pinMode(13, OUTPUT);
        Serial.begin(9600);         // start serial for output
        Wire.begin(SLAVE_ADDRESS);
        Wire.onRequest(sendData);
    }

     

    void loop() {
       delay(1000);
       Serial.print(number);
    }

    void sendData(){
        Wire.write(number);
    }
    Код (Python):
    import smbus

    bus = smbus.SMBus(1)
    address = 0x09

    def readNumber():
        number = bus.read_byte(address)
        return number

    while True:
        number = readNumber()
        print  number
     
     
  5. ИгорьК

    ИгорьК Оракул Модератор

    Коллеги, а не проще ли применить UART? Почему i2c?
     
    mazzick нравится это.
  6. Mitrandir

    Mitrandir Гуру

    C++. питон не знаю
     
  7. Mitrandir

    Mitrandir Гуру

    Ну например не надо логические уровни согласовывать. Логическую единицу формирует малина в три вольта, ардуино принимает такое напряжение как 1.

    Не знаю как у тс, у меня ещё и гироскоп с акселерометром на и2с
     
    Последнее редактирование: 4 сен 2018
    ИгорьК нравится это.
  8. mazzick

    mazzick Нуб

    а почему UART? я просто в поисковике ввел запрос типо "самый надежный (правильный) способ соединить arduino и raspbery"
     
  9. ИгорьК

    ИгорьК Оракул Модератор

    Поиск хороший, но результат его сильно зависит от удачи - компетентности комментатора.
    i2c хорошая межблочная шина, но UART всяко проще. Устройства i2c работают всегда в режиме мастер-слэйв, тогда как UART - простая двунаправленная шина.
    Обычно везде пишется о работе МК или Малины в режиме Мастера и описывается работа с какими-то подчиненными устройствами.
    Не скажу, что через шину i2c вопрос нерешаем, но UART - в разы проще.

    ИМХО, ДВА устройства проще соединять по UART, если нужно больше - конечно другие варианты.
    Микроконтроллеры напрямую, обычно, соединяются или по UART или по SPI.
     
    mazzick нравится это.
  10. mazzick

    mazzick Нуб

    ок понял ) я вообще никаких языков не знаю, ща буду изучать С++ )))
     
  11. mazzick

    mazzick Нуб

    ОК спасибо, покопаю в поиске тогда про uart тоже
     
  12. Mitrandir

    Mitrandir Гуру

    Uart проще немного. Правда нужен делитель напряжения на линии тх ардуино rx raspberry
     
    mazzick и ИгорьК нравится это.
  13. Mitrandir

    Mitrandir Гуру

    У вас какая малина? Первую и вторую технически невозможно сделать слейвом, третью вроде как можно
     
  14. ИгорьК

    ИгорьК Оракул Модератор

    Да, об этом забывать не следует - Малина и Ардуино работают на разных напряжениях и 5 вольт жжет Малину безжалостно.
     
  15. mazzick

    mazzick Нуб

    ну а код программы то проще будет, или тоже заморочек с текстом и длинной будет?
     
  16. Mitrandir

    Mitrandir Гуру

    Плюс минус так же. Но с юартом проще сделать чтобы ардуино начинало диалог.

    Т. Е. По юарт проще двухстороннее взаимодействие делать.
     
  17. Igor68

    Igor68 Гуру

    Как правило на ардуине есть USB-SERIAL... а в малине он есть и так... и зачем уродовать и без того не ровный I2C? Ведь он (I2C протокол) специфичный... конечно и горбатого к стене приставить можно... но просто USB шнурок из малины в ардуину не судьба?
     
    mazzick и ИгорьК нравится это.
  18. mazzick

    mazzick Нуб

  19. ИгорьК

    ИгорьК Оракул Модератор

    Igor68 нравится это.
  20. mazzick

    mazzick Нуб

    судьба конечно, мне даже проще по USB ))) но незнающего легко с верного пути сбить. Мне просто надо вебстраничку сделать для метеостанции, и по USB все готово было, просто предложили "более правильный вариант подключения" )))