как передать "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 все готово было, просто предложили "более правильный вариант подключения" )))