Strelets Diana

Урок 5. Интерфейсы связи Arduino


План:

  1. SPI (Serial Peripheral Interface)
  2. UART (продолжение)
  3. I2C (inter-IC)

Хочешь освоить программирование Arduino в аудитории и с преподавателем- записывайся на блиц-курс по робототехнике.

 

Теоретическая часть

1. SPI (Serial Peripheral Interface)

SPI  – синхронный протокол последовательной передачи данных. При помощи SPI микроконтроллер связываться с периферийными устройствами, которые находятся на небольших расстояниях.

При связи, с помощью SPI присутствует одно ведущее устройство (master), чаще всего микроконтроллер, и хотя бы одно ведомое (slave). Обычно, для всех взаимодействующих устройств используются три общие линии:


• MOSI (Master Out Slave In) - линия для передачи данных от ведущего устройства к ведомым. Также можно встретить обозначения: SI, SDI, DI. . На Arduino вывод MOSI находится на 11 пине.
• MISO (Master In Slave Out) – вывод для передачи данных от ведомого устройства к ведущему. Также можно встретить обозначения: SO, SDO, DO. На Arduino вывод MISO находится на 12 пине.
• SCK (Serial Clock) – линия синхронизации. На этом выводе ведущее устройство генерирует тактовые импульсы, синхронизирующие процесс передачи данных. Также можно встретить обозначения: SCK, CLK. На Arduino вывод SCK находится на 13 пине.
Кроме общих линий, на каждое устройство отводится еще по одной линии:
• SS (Slave Select) – присутствует на каждом периферийном устройстве. Предназначен для активации ведущим устройством передачи данных с соответствующим ведомым устройством. Также можно встретить обозначения: nCS, CS, CSB, CSN, nSS, STE. На Arduino по умолчанию вывод SS находится на 10 пине. Если на этом пине установлен низкий уровень, то ведомое устройство взаимодействует с ведущим, если низкий – игнорирует сигналы от ведущего устройства. Таким образом возможно осуществлять связь с несколькими ведомыми устройствами, подключенными к одной шине( линиям MOSI, MISO и SCK).


Алгоритм работы SPI:

1. Ведущее устройство устанавливает в низкий уровень ту линию SS, на которой располагается устройство, с которым необходимо создать связь.
2. Ведущее устройство задает такт, изменяя уровень на SLK с определенной частотой, и, одновременно, с каждым изменением уровня SLK выставляет нужный уровень на линии MOSI, передавая ведомому устройству по биту за такт.
3. Ведомое устройство на каждый такт SLK выставляет нужный уровень на MISO, передавая ведущему по биту данных за такт.
4. Для того, чтобы остановить передачу, линия SS устанавливается в высокий уровень.

В Arduino есть специальная библиотека, которая использует возможности AVR и облегчает работу с SPI. Arduino может работать только в качестве ведущего устройства.

Функции библиотеки:

begin() и end() – соответственно начало и окончание связи по SPI. При инициализации выводы SLK (13), MOSI (11) и SS (10) устанавливаются в режим вывода. Порты SCK и MOSI устанавливаются в низкий уровень, а SS в высокий. Функция end() не изменяет состояния портов, но выключает на микроконтроллере блок SPI.
setBitOrder(order) - задает порядок отправки битов данных:
Если в фенкцию передается параметр MSBFIRST, то первым отправляется старший бит(по умолчанию). Если LSBFIRST — младший бит.
setClockDivider(divider) – задает тактовый делитель SPI относительно основной тактовой частоты. Делители могут быть равными 2, 4, 8, 16, 32, 64 и 128. Функция принимает параметр вида SPI_CLOCK_DIVn, где n — делитель, например, SPI_CLOCK_DIV16. По умолчанию делитель равен 4. Т.е. по умолчанию частота работы SPI будет равна тактовой частоте МК на Arduino (16МГц), деленной на заданный делитель (4) и равна 4МГц.
setDataMode(mode) - Задаёт режим работы SPI. Принимает в параметр константы SPI_MODE0 (по умолчанию), SPI_MODE1, SPI_MODE2 и SPI_MODE3. Режимы передачи основаны на комбинации уровней тактового сигнала (CPOL) и фазы синхронизации (CHPA). CPOL — это состояние линии синхронизации до начала и после окончания передачи. А CHPA – определяет, когда передавать сигналы: при изменении состояния тактового сигнала с 0 на 1 (на фронте) или с 1 на 0 (на спаде).
Режим 0: CPOL=0, CPHA=0. Чтение на фронте, запись - на спаде.
Режим 1: CPOL=0, CPHA=1. Чтение — на спаде, запись — на фронте.
Режим 2: CPOL=1, CPHA=0. Чтение — на спаде, запись — на фронте.
Режим 3: CPOL=1, CPHA=1. Чтение — на фронте, запись — на спаде.
transfer(value) – двусторонняя передача. Передает ведомому устройству байт, заданный в параметре (value) и возвращает принятый байт, принятый от ведомого.
shiftIn(miso_pin, sclk_pin, bit_order) - принимает от ведомого устройства данные. Можно использовать любые пины, в качестве линий, но устанавливать их в режим входа/выхода необходимо самостоятельно.
shiftOut(mosi_pin, sclk_pin, order, value) – передает ведомому устройству данные.


2. UART (продолжение)

Рассмотрим еще несколько функций, входящих в класс Serial.
Serial.parseFloat() - считывает данные, с последовательного буфера и возвращает первое вещественное число. Все нецифровые символы, включая знак минус игнорируются. Функция прекращает свою работу при нахождении первого символа, не относящегося к найденному вещественному числу.
Serial.parseInt() - выполняет поиск очередного целого числа в буфере последовательного порта. Функция выполняется по умолчанию на протяжении одной секунду. Если за это время ни одно число найдено не было, то она возвращает значение 0. Величина таймаута может задаваться с помощью функции Serial.setTimeout().
Serial.readBytes(buffer, length) – читает данные, приходящие на последовательный порт, и записывает их в приемный буфер. Функция прекращает работать после приема и записи заданного количества символов, либо по истечении заданного времени.
Возвращаемое значение: количество записанных байт, либо 0, если ничего записано не было.
Имеет два параметра:
buffer - массив, куда записываются принятые данные (char[] или byte[])
length - количество символов, которое необходимо считать (int).

 

3. I2C (inter-IC)

I2C - двунаправленная двухпроводная шина для "межмикросхемного" (inter-IC) управления. Так же встречается под названием TWI. Линия SDA (data line – линия данных) в платах Arduino обычно находится на 4 аналоговом пине. Линия SCL (clock line – линия тактирования) – на 5 пине. На Arduino Mega, SDA находится на 20 цифровом пине, а SCL на 21.
Для упрощения работы с протоколом I2C , предназначена библиотека Wire. Arduino может работать с протоколом I2C как в режиме master, так и в slave.


Библиотека имеет следующие методы:

void begin() - Инициализация I2C. Обычно вызывается только один раз и определяет в каком режиме будет работать устройство: ведущего или ведомого устройства.
Может принимать параметры:
begin(uint8_t address) или begin(int address): 7-битный адрес устройства, если устройство ведомое. Если функция задается без параметров, то устройство выступает ведущим.

uint8_t requestFrom(uint8_t address, uint8_t quantity) - используется в режиме master для запроса количества доступных для чтения байт на ведомом устройстве.
Принимает параметры:
address - 7-битный адрес ведомого устройтства
quantity - количество запрошиваемых байт
Возвращает количество считанных байт.

beginTransmission(uint8_t address) – функция начала передачи I2C ведомому устройству с 7-ми битным адресом address. После вызова этой функции, необходимо использовать метод write() для добавления байт, подготовленных на передачу, а затем методом endTransmission() выполнить непосредственную передачу данных ведомому устройству. Функция endTransmission() возвращает 1 в случае успешной передачи и 0 если данные не помещаются в буфер передачи. Размер буфера можно изменить, переопределив BUFFER_LENGTH

#define BUFFER_LENGTH 32

Значение 2 возвращается, если получили NACK (не подтверждение получения) на передачу адреса. 3 при приеме NACK на передачу данных.
При другой ошибке передачи возвращается 4.

Wire.write(value) – посылает запрос на ведомое устройство и записывает полученные от него данные. Если вызывается между beginTransmission() и endTransmission(), то записывает последовательность байт, подготовленную для передачи на ведомое устройство. Возвращает количество записанных байт.

Может принимать параметры:
Wire.write(value) - один байт для отправки.
Wire.write(string) - последовательность байт как строка для отправки.
Wire.write(data, length) - два параметра: Массив байт для отправки и количество байт.

.

Практическая часть

Добавить в программу, написанную на прошлом уроке, модуль, который позволяет через последовательный порт устанавливать основное положение серводвигателя и угол, на который серводвигатель будет отклоняться относительного основного положения.


#include <Arduinо.h>
#include <Servо.h>
#include <NеwPing.h>

const char commSet = 'S';
const char commGet = 'G';
const char paramO = 'O';
const char paramD = 'D';
int O = 0;
int D = 0;
int counter = 0;
int readInt = 0;
char readSerial[4];
char endStr;

void setup()
{
 Serial.begin(115200);
}

void loop()
{
  while(Serial.available() && counter<4)
   {
    endStr = Serial.read();

    if(endStr != ' ' && endStr != ' ')
     readSerial[counter++] = endStr;
   }

if(counter==4)
{

  if(readSerial[0] == commSet)
   {

    if(Serial.available())
    {

      if(readSerial[3] == paramO)
      {
      O = Serial.parseInt();
      }
     else
     {
       D = Serial.parseInt();
      }
   counter=0;
  }

 }

 else
  {
  if(readSerial[3] == paramO)
  {
   Serial.print(O);
  }
   else
  {
   Serial.print(D);
   }
   counter=0;
  }
 }
}

 

 


Урок 4


Учебная программа курса


Урок 6


Похожие посты:

Руководство пользователя к интелектуальному контролю Servo (SCSxx) и TTLinker

SCPC-2 Manual & Smart Control Servo (SCSxx) and TTLinker

0
Комментировать
Введите код: