Привет! Уже замучился искать ответ. Может у кого есть простой пример, как передать слово + цифра из ардуино в распбери через i2c. По usb нашел как сделать, попробовал и все получилось. По i2c целый день потратил но так и не нашел простого кода для ардуино и распбери. Кто поделится магией?
Могу поделиться кодом как с распберри забрать у адруины данные если надо ( распберри мастер, ардуино слейв). Ардуино мастер -малина слейв не приходилось делать
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]
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
Ну например не надо логические уровни согласовывать. Логическую единицу формирует малина в три вольта, ардуино принимает такое напряжение как 1. Не знаю как у тс, у меня ещё и гироскоп с акселерометром на и2с
а почему UART? я просто в поисковике ввел запрос типо "самый надежный (правильный) способ соединить arduino и raspbery"
Поиск хороший, но результат его сильно зависит от удачи - компетентности комментатора. i2c хорошая межблочная шина, но UART всяко проще. Устройства i2c работают всегда в режиме мастер-слэйв, тогда как UART - простая двунаправленная шина. Обычно везде пишется о работе МК или Малины в режиме Мастера и описывается работа с какими-то подчиненными устройствами. Не скажу, что через шину i2c вопрос нерешаем, но UART - в разы проще. ИМХО, ДВА устройства проще соединять по UART, если нужно больше - конечно другие варианты. Микроконтроллеры напрямую, обычно, соединяются или по UART или по SPI.
Да, об этом забывать не следует - Малина и Ардуино работают на разных напряжениях и 5 вольт жжет Малину безжалостно.
Плюс минус так же. Но с юартом проще сделать чтобы ардуино начинало диалог. Т. Е. По юарт проще двухстороннее взаимодействие делать.
Как правило на ардуине есть USB-SERIAL... а в малине он есть и так... и зачем уродовать и без того не ровный I2C? Ведь он (I2C протокол) специфичный... конечно и горбатого к стене приставить можно... но просто USB шнурок из малины в ардуину не судьба?
судьба конечно, мне даже проще по USB ))) но незнающего легко с верного пути сбить. Мне просто надо вебстраничку сделать для метеостанции, и по USB все готово было, просто предложили "более правильный вариант подключения" )))