Похожие презентации:
Знакомство с Arduino. Часть 2. Занятие 9. Передача по i2c
1.
Знакомство с Arduino часть 2Занятие 9. Передача по i2c
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
2.
Правила• Соблюдаем тишину, когда преподаватель
говорит
• Поднимаем руку, если хотим что-то сказать
или спросить
• Не меняемся деталями из набора
• Запуск программы только после проверки
преподавателем правильности соединений
• Командная работа значительно улучшает
каждого из нас
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
3.
Протокол i2cligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
4.
Протокол i2cligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
5.
Протокол i2cligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
6.
Протокол i2cWire.begin()
Функция инициализирует библиотеку Wire.h и подключает
устройство к шине I2C в качестве мастера.
Wire.beginTransmission(slave address)
Эта функция начинает передачу с ведомого устройства I2C,
имеющего свой уникальный адрес.
Параметр slave address
7-битный адрес устройства, с которым мы хотим установить
связь
Пример
Wire.beginTransmission (50) //начать передачу
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
7.
Протокол i2cWire.write(data)
Данная функция используется для записи (передачи) данных
на ведущее или ведомое устройство.
Параметр data это однобайтовое значение, строка, массив данных.
Возвращает количество записанных байтов
Пример:
Wire.write(7); // отправляем байт данных
Wire.write("i2c"); //отправляем строку на ведомое устройство
Wire.write(a, 6); // здесь а массив
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
8.
Протокол i2cWire.endTransmission()
Функция завершает передачу на ведомое устройство, начатую
функцией beginTransmission(), и передает байты, поставленные
в очередь функцией write().
Возвращает байт, который указывает статус передачи.
Пример:
byte error = Wire.endTransmission();
Байт, сообщающий о статусе передачи данных:
0 — успешно
1 — данных слишком много, чтобы они могли уместиться в
буфер передачи
2 — при передаче адреса получен NACK
3 — при передаче данных получен NACK
4 — другая ошибка
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
9.
Пример передачи данных от ведущего#include <Wire.h>
void setup() {
Wire.begin();
}
byte x = 0;
void loop() {
Wire.beginTransmission(8);
Wire.write(x);
Wire.endTransmission();
x++;
delay(500);
}
ligarobotov.ru
Передача данных
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
10.
Протокол i2cWire.available()
Функция применяется мастером или ведомым устройством
для проверки наличия запрошенных данных. Она возвращает
количество байт, которые можно считать.
Wire.read()
Данная функция предназначена для чтения данных,
запрошенных мастером с ведомого, или чтения данных,
переданных от ведущего к мастеру.
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
11.
Протокол i2cWire.begin(address)
Функция инициирует библиотеку Wire и подключается к шине
I2C в качестве подчиненного устройства с указанным
адресом.
Параметр address
7-битный адрес ведомого устройства, если он не указан,
присоединяйтесь к шине в качестве ведущего.
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
12.
Протокол i2cWire.onReceive(handler)
Функция обработчика, которая вызывается, когда ведомое
устройство получает переданные данные от ведущего.
void setup() {
Wire.begin(8); //инициализируем I2C шину с адресов #8
Wire.onReceive(receiveEvent); // обработчик события
Serial.begin(9600); // инициализируем UART
}
void receiveEvent (int howmany){
while (Wire.available() > 1) { // в цикле проверяем
поступили ли на шину I2C данные
char c = Wire.read();
// если да, читаем байт
Serial.print(c);
// отправляем его на UART
}
}
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
13.
Пример приема данных ведомым#include <Wire.h>
void setup() {
Wire.begin(8);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop() {
delay(100);
}
void receiveEvent(int howMany) {
while (0 < Wire.available()) {
int c = Wire.read();
Serial.print(c);
}
}
ligarobotov.ru
Прием данных данных
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
14.
Задача №1Напишите программу для ведущего, которая
отправляет ведомому 1, при нажатии на
кнопку и 0 при отпущенной.
Напишите программу для ведомого, которая
принимает
символы
и
включает
или
выключает светодиод.
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
15.
Протокол i2cWire.requestFrom(address, quantity, stop)
Эта функция используется мастером для запроса или получения
данных от ведомого устройства. Запрошенные данные можно
прочитать с помощью Wire.read().
Параметры:
address - адрес устройства, с которым мы хотим общаться
quantity - количество запрашиваемых байт
stop - значение true или false. true – отправлять стоп-сообщение
после запроса, освобождая шину. false – постоянно отправлять
перезагрузку после запроса, сохраняя соединение активным
Возвращает число байт, возвращенных ведомым устройством
Wire.requestFrom(50, 4)
// запрос 4-х байт от ведомого устройства с адресом 50
Wire.requestFrom(50, 4, true)
//перестанет получать данные после 4 байт, освобождая шину.
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
16.
Пример запроса ответа у ведомого#include <Wire.h>
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.println("I am I2C Master");
}
void loop() {
Wire.beginTransmission(8);
Wire.write("Hello Slave");
Wire.endTransmission();
Wire.requestFrom(8, 9);
while(Wire.available()){
char c = Wire.read();
Serial.print(c);
}
Serial.println();
delay(1000);
}
ligarobotov.ru
Передача строки и запрос
ответа 9 байт
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
17.
Протокол i2cWire.onRequest(handler)
Функция-обработчик, которая вызывается, когда мастер
запрашивает у ведомого устройства, не принимает параметров и
ничего не возвращает.
void setup() {
Wire.begin(8); //инициализируем I2C шину с адресов #8
Wire.onRequest(requestEvent); // регистрируем событие
}
void loop() {
delay(100);
}
// функция, которая выполняется всякий раз, когда мастер
запрашивает данные
void requestEvent() {
Wire.write("hello "); // отправляем сообщение 6 байт, как и
ожидал мастер
}
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
18.
Пример ответа ведомого#include <Wire.h>
void setup() {
Wire.begin(8);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
Serial.begin(9600);
Serial.println("I am I2C Slave");
}
void loop() {
delay(100);
}
void receiveEvent(int howMany) {
while (0 <Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
Serial.println();
}
void requestEvent() {
Wire.write("Hi Master");
}
ligarobotov.ru
Ответ ведомого (строка 9 байт)
на запрос ведущего
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
19.
Задача №2Напишите программу для ведущего, которая
отправляет ведомому 1, при нажатии на
кнопку и 0 при повторном нажатии. При этом
ведущий запрашивает состояние светодиода
Напишите программу для ведомого, которая
принимает
символы
и
включает
или
выключает светодиод, а так же отправляет
состояние светодиода ведущему.
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
20.
Задача №3Напишите программу для ведущего, которая
в начале отправляет ведомому 5 байт строк
«х is », затем 1 байт счетчика раз в 500мс.
Напишите программу для ведомого, которая
принимает символы и число и выводит
строку в монитор порта.
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
21.
Ответ (для ведущего)#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop() {
Wire.beginTransmission(8); // transmit to device #8
Wire.write("x is ");
// sends five bytes
Wire.write(x);
// sends one byte
Wire.endTransmission(); // stop transmitting
x++;
delay(500);
}
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
22.
Ответ#include <Wire.h>
void setup() {
Wire.begin(8);
// join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600);
// start serial for output
}
void loop() {
delay(100);
}
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
Serial.print(c);
// print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x);
// print the integer
}
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
23.
Свободноевремя
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
24.
Сдача наборовСпасибо за
занятие!
ligarobotov.ru
© Международная школа робототехники «Лига Роботов», Новосибирск, 2022
Программирование
Электроника