МОДУЛИ ARDUINO ПОМИМО KIT

В этой статье представлены сведения по модулям помимо приобретенного комплекта  ARDUINO KIT. Здесь всего 10 популярных, имеющихся в наличии, модулей.

  1. АКСЕЛЕРОМЕТР.  GY-521  MPU-6050
  2. АКСЕЛЕРОМЕТР.  Модуль GY-9250
  3. Ультразвуковой дальномер HC-SR04
  4. GPS модуль GY-NEO6MV2 с антенной
  5. Модуль Wi-Fi ESP8266
  6. Барометр ВМР180
  7. Радиомодули 433МГц (FS1000A -передатчик, MX-Rm-5V - приемник)
  8. Приемопередатчик 2,4 ГГц NRF24L01+PA+LNA
  9. Приемопередатчик 2,4 ГГц NRF24L01
  10. MICRO-CD READER

АКСЕЛЕРОМЕТР.  GY-521  MPU-6050 

MPU6050.pngЭта  интерфейсная плата с установленным MPU6050 датчиком. MPU-6050 является первым в мире 6 осевым устройством, имеющим малую мощность, низкую стоимость, и обладающий высокой производительностью. Область применения таких датчиков достаточно широка. Данный модуль часто применяют для стабилизации полета квадрокоптера по причине совместного использования гироскопа и акселерометра. Кроме этого модуль используется для координации различных устройств - от просто детектора движения до системы ориентации различных роботов или управления движениями каким-либо устройствами. Наиболее интересное применение гироскопа и акселерометра – в движущихся полуавтоматических и автоматических системах. Прибор измеряет и сообщает микроконтроллеру о ускорении и ориентации. Динамические параметры подвижного объекта, которые измеряет модуль 3-х осевого гироскопа и акселерометра GY-521 MPU-6050: тангаж (нос вверх и вниз), рыскание (нос влево и вправо) и крен (по часовой стрелке или против часовой стрелки глядя из кабины объекта). Они в навигационной системе подаются в МК, который рассчитывает текущее положение. Полет квадрокоптера без такого модуля невозможен. Применяется в смартфонах, планшетах. Область подобных сенсорных устройств достаточно новая и интересная для изучения и применения в любительской технике. Благодаря отслеживанию вектора силы тяжести акселерометр может применяться как электронная альтернатива обычному строительному уровню. На основе акселерометра строят угломеры относительно тяготения земли – инклинометры.
Датчик объединяет 3 оси гироскопа и 3 оси акселерометра на  кремнии вместе с встроенным DPM (цифровой процессор Motion), способен обрабатывать комплекс алгоритмов 9 осного движения. 
Характеристики: напряжение питания 3,7 – 5,5 В;  ток до 10 мА; гироскоп потребляет 3,6 мA, в режиме ожидания 5 мкА; акселерометр потребляет 350 мкА;  Максимальная частота интерфейса I2C составляет 400 кГц; Формат данных: углы Эйлера, кватернионы, матрица поворота или необработанные данные; Диапазон гироскопа: ±250, ±500, ±1000, и ±2000 градусов в секунду; Диапазон акселерометра: ±2, ±4, ±8 и ±16 g; имеется 16 бит вывода данных; Резонансная частота 27 кГц4 Шум 0,005°/с/√Гц; Расстояние между контактами 2,54 мм; Отверстия под винт 3 мм; Размеры 20 x 16 мм.

Данные измерений датчиков можно считывать как из регистров хранения, так и пользоваться функциями FIFO. Имеется отдельный регистр под названием Who am I, значение, записанное в этом регистре постоянно и его можно только считать, можно использовать как идентификатор устройства, значение в регистре 104 или 0х68. Отдельным выводом является выход прерываний, который настраивается регистрами настройки под определенные события.

Датчики гироскопа и акселерометра изготовлены как MEMS (микроэлектромеханическая система) - внешнее воздействие на датчик сначала изменяет состояние механической части, затем изменение состояния механической части приводит к изменению сигнала электрической части. Одним словом в одном корпусе собрана не только электроника, но и механика. В микросхеме MPU6050 содержится сразу два MEMS датчика, производитель утверждает, что их взаимное воздействие друг на друга сведено к минимуму.

Ипользование датчики акселерометра и гироскопа. Температурный датчик трогать не будем - данные о температуре прочитали, перевели в человеческие значения и наслаждаемся. Гироскоп выдает значения мгновенной угловой скорости с разрешением, заданным в настройках, например 2000 градусов в секунду. Если прошить микроконтроллер и смотреть на получаемые данные, то увидим только нули. Если начать крутить датчик, то получим мгновенные значения угловой скорости. Заметьте, что скорость мы получаем в градусах в секунду, а это значит, что линейные скорости не влияют на эти показания - показания будут изменяться только при повороте датчика в пространстве. Далее с помощью этих данных можно получить ориентацию объекта в пространстве. Для этого нужно получить мгновенное значение угловой скорости и умножить его на промежуток времени между опросами датчика гироскопа. Пример разрешение 2000 градусов в секунду, промежуток между опросами датчика 0,1 секунда, значение мгновенной скорости 300, значит 300*0,1=30 - за это время ось гироскопа была повернута на 30 градусов. Далее каждое полученное значение нужно сложить с предыдущим. Если ось двигалась в одном направлении - значение 30 градусов, если в другом, то -30, таким образом, при возвращении датчика в исходное положение всегда (в идеале) будет 0, при отклонении от исходного положения, при выполнении вышеописанных действий, получим угол отклонения. Обрабатывая углы трех осей гироскопа можно получить ориентацию объекта в пространстве.

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

С акселерометром все проще. Измеряя ускорения трех осей датчика можно получить данные, преобразуя их с помощью геометрии, по которым можно также получить ориентацию объекта в пространстве. Помимо этого акселерометр измеряет линейные ускорения, то есть ориентация объекта может искажаться при движении датчика в линейных направлениях. Также с помощью акселерометра можно определять движение объекта или его столкновение. Например детектировать падение объекта или толчок о преграду, чтобы обходить это.

Данные от акселерометра получаем всегда достаточно точные, то есть нуль всегда остается нулем ни при каких воздействиях (имеется ввиду не зависит ни от времени, ни от характера воздействия), однако недостаток кроется в том, что данные идут шумом в некотором диапазоне данных, то есть до десятых долей градуса точно измерять угол не получится. Зато исходя из экспериментальных данных, точность до целых значений градуса держится вполне стабильно. Не забываем про влияние линейных ускорений.

Если датчик приобрели, можно переходить к рассмотрению внутренностей модуля, а именно главного элемента - микросхемы MPU6050. Информация хранится в регистрах микросхемы, которых более 100 (!). И вот тут то и кроется огромный подводный камень. производитель не утрудился расписать в документации всю информацию, а привел лишь информацию о самом необходимом. На самом деле не известно даже сколько же всего там регистров, доступных для чтения или записи или того и другого. Также информации на некоторые регистры попросту нет, кроме его названия. Ну что же, придется экспериментально определять влияния значений, записанных в некоторые регистры.

Интерфейс I2C работает по стандартной схеме. Адрес микросхемы может быть двух значений (без бита чтения / записи) в зависимости от состояния вывода AD0 - b1101000, если AD0 соединен с землей и b1101001, если AD0 соединен с источником питания. Соответственно плюс бит чтения или записи.

Микросхема содержит Digital Motion Processor (DMP), он необходим для того, чтобы обрабатывать данные, получаемые из датчиков гироскопа и акселерометра. Все это делается для того, чтобы повысить точность получаемых данных, так как при обработке данных на микроконтроллере точность может пострадать из-за снижения скорости их обработки. Как правило, алгоритмы обработки движения должны работать с достаточно высокой частотой, обычно 200 Гц, как утверждает документация.

Что касается регистров, то их достаточно большое количество, необходимая информация находится в карте регистров на MPU6050, документ прилагается к статье. Помимо этого прилагается исходник с настройками этих регистров.

Трехосевой акMPU6050селерометр ”чувствует” проекции ускорения на оси X, Y и Z. Если прибор размещен строго горизонтально и не движется то проекции ускорения силы тяжести на оси X и Y равны нулю. Сила тяготения воспринимается только чувствительными элементами вертикальной оси Z. Время от времени в состоянии покоя производят проверку и калибровку акселерометра. Во время движения объект постоянно то ускоряется, то замедляется. Идеально равномерного движения не существует. Это и позволяет использовать акселерометр не только для определения положения объекта, но и для определения динамических параметров при движении. Акселерометр регистрирует сумму ускорения при движении и гравитацию.

:Трехосевой гироскоп – датчик поворота объекта, позволяющий вычислить углы поворотов по осям X, Y, Z благодаря определению угловых скоростей.
 
Roll (крен), Pitch (Тангаж) и Yaw (рыскание).
 РАСПОЗНОВАНИЕ И ОБРАБОТКА ПАРАМЕТРОВ ДВИЖЕНИЯ
 Предположим квадрокоптер при горизонтальном полете накренился. Акселерометр фиксирует изменение ускорение по осям. Теперь к ускорению движения прибавляется ускорение тяготения в другом порядке, не так как при полете без крена. В результате система управления сделает вывод о движении в сторону крена, хотя на самом деле происходит горизонтальное движение. Для правильной обработки параметров движения и верного распознавания динамических параметров применяют совместно акселерометр и гироскоп.
При использовании гироскопа в рассмотренном случае он определит угол поворота и даст возможность правильно интерпретировать данные акселерометра. Использование гироскопа без акселерометра невозможно из-за особенностей математики гироскопа приводящих к накоплению погрешности. Специальная математика позволяет объединить обработку данных от обоих датчиков.

Схема модуля GY-521. Питание модуля GY-521 поступает на вход стабилизатора напряжения Q2 микросхема MIC5205-3.3BM5 с выходным напряжением 3,3 В. На стабилизаторе происходит небольшое падение напряжения 0,3 – 0,4 В, поэтому напряжение питания модуля должно быть выше 3,3 В. Индикатор питания модуля 3-х осевого гироскопа и акселерометра GY-521 MPU-6050 – светодиод D1. Величина резисторов R4 и R5 может отличаться от указанных на схеме. 
 Назначение контактов. VCC – напряжение питания; GND – общий провод; SCL – тактовый сигнал I2C; SDA – данные I2C; XDA – данные шины I2C при работе в режиме мастера; XCL – тактовый сигнал шины I2C при работе в режиме мастера; AD0 – бит 0 адреса I2C; INT – выход сигнала о готовности данных для использования как внешнего прерывания МК; При изучении работы микросхемы MPU-6050 гироскопа следует помнить, что механические гироскопы стабилизируются в пространстве за счет своих физических свойств. Электронный гироскоп так работать не может. Он лишь измеряет скорость вращения.
Каждый модуль GY-521 требует калибровки. Показания датчиков имеют некоторое смещение относительно нуля, что вносит погрешность в измерения. Нужно учесть это смещение для каждой оси гироскопа и каждой оси акселерометра, внести корректировку в программу. При производстве микросхем невозможно получить абсолютную точность угла между осями датчиков, поэтому угол между ними содержит погрешность. Также нельзя забывать о том, что данные от трех осей могут иметь разную пропорциональность.
Наибольшая точность результатов математических преобразований для получения параметров движения будет получена при синхронном считывании данных акселерометра и гироскопа.
При построении управляемой машины следует избегать в механизмах источников колебаний и их гармоник с частотой резонанса указанной в характеристиках.
При первом ознакомлении с модулем проверяют его работу на шине данных I2C. Для этого используют программу I2C сканер.
Внутреннее АЦП микросхемы очень чувствительно, его разрядность 16 бит. При такой чувствительности предъявляются повышенные требования к питанию модуля, несмотря на собственный стабилизатор. Здесь не подходит источник питания класса ”какой есть” на 5 В. Прежде всего надо разобраться с параметром используемого блока питания величина пульсаций или уровень шумов с помощью осциллографа. Величина шума в линии питания не должна превышать 50 мВ. Применение батарей в этих условия уместно, но это дорого. Установка конденсаторов не снизит шумы некачественного блока питания. Если блок питания шумит от него надо отказаться, заменить или собрать другой. В тоже время установка конденсаторов на линиях питания возле модуля GY-521 снизит влияние мощных электромагнитных помех. Рекомендуется провода питания перевить в витую пару. Нельзя использовать блок питания один и тот же для модуля и для питания двигателей. При калибровке модуль 3-х осевого гироскопа и акселерометра GY-521 MPU-6050 должен иметь собственный источник, отдельный от модуля МК и других потребителей. Если на этапе первого запуска еще можно смириться с повышенным шумом в питании, то на этапе калибровки это приведет к ошибкам, а о высокой точности измерений без качественного питания говорить не приходится.

дин из способов использования модуля GY-521 – применение микроконтроллерного модуля Arduino. Программное обеспечение Arduino позволяет установить библиотеки для GY-521. Есть сложная библиотека I2Cdevlib для доступа к MPU-6050 и другим устройствам на шине I2C. Она устанавливается в папку MPU6050. Использует аппаратный буфер микросхемы и возможности цифровой обработки параметров движения MPU-6050 для выполнения преобразования данных между различными системами координат и объединяет данные от нескольких датчиков. Еще одна полезная библиотека FreeIMU, ориентированная на инерциальный измерительный блок из нескольких датчиков и может выполнять сложную обработку данных. FreeIMU использует I2Cdevlib, но последняя версия I2Cdevlib в комплекте с FreeIMU вызывает конфликт версий. Перед использованием следует убедиться в правильном выборе версии I2Cdevlib.
 Микросхема MPU-6050. Напряжение питания 2,3 – 3,6 В. Номинальное 3,3 В. Микросхема MPU-6050 содержит запатентованный компанией InvenSense процессор обработки сигналов, вызванных движением Digital Motion Processor (DMP), способный обрабатывать алгоритмы MotionFusion. DMP может быть использован для сложных расчетов. Собственный процессор может делать расчеты, не отвлекая микроконтроллер и даже способен обрабатывать информацию от другого датчика, подключенного ко второй шине I2C. Специальная программа на языке команд DMP записывается в память каждый раз после подачи питания. Это занимает около секунды. Программа фильтрует показания акселерометра и гироскопа. Данные передаются в буфер FIFO. Некоторые рассуждения об этом здесь.
Для точного отслеживания движений предусмотрена возможность записи в память MPU-6050 актуальных пределов измерений. Данные можно считывать из регистров хранения или буфера FIFO размером 1024 байт. Микросхема MPU-6050 может работать в режиме мастер на шине I2C для контактов XDA и XCL. Содержит АЦП 16 бит. Есть регистр под названием Who am I (как меня зовут) хранящий адрес модуля GY-521 на шине I2C. Значение в регистре 104 десятичное или 68 шестнадцатеричное. Есть выход для прерываний МК, который настраивается под интересующее событие. Микросхема MPU-6050 содержит более 100 регистров. 

Подключение к Arduino. Контакты при подключении:  V Arduino – VCC; GND Arduino – GND; A4 Arduino – SDA; A5 Arduino – SCL; GND Arduino – AD0. В начале программы должна происходить калибровка по первым 10 данным для получения постоянных погрешностей (смещений) от датчиков. Смещения вычитаем из необработанных значений датчика до преобразования данных в углы.
Для вычисления ориентации акселерометром, мы опираемся на тот факт, что происходит постоянное гравитационное притяжение 1 g. Если нет дополнительных сил, действующих на акселерометр, то обнаруженная величина ускорения будет 1 g.
Согласно описанию MPU-6050 с. 13 (Sensitivity Scale Factor), сырые данные акселерометра программой преобразуются в ускорение свободного падения g=9,8 м/с^2 путем деления на коэффициент 16384. При перемещении и вращении датчика, данные акселерометра сильно колеблются. Если они могут быть очищены от шумов, то акселерометр обеспечит точные результаты. 

Для вычисления ориентации, мы должны сначала инициализировать гироскоп с известным значением (возможно, от акселерометра), затем измерять угловую скорость ω через интервалы времени Δt. Тогда ω × Δt = изменение угла. Проблема с этим подходом заключается в том, что мы интегрируем. Многократное суммирование приращения ω × Δt приведет к увеличивающейся со временем ошибке. Это является причиной гироскопического дрейфа.
Деление сырых данных гироскопа на 131 дает угловую скорость в градусах в секунду. 131 - коэффициент чувствительности гироскопа в заданном режиме 250 град/с. Поскольку у него АЦП 16 бит, то модуль максимального необработанного значения равен 32767. Теперь 32767 / 250 = 131 условных единиц на градус в секунду. То есть, если необработанное значение равно 131, то угловая скорость равна 1 градус в секунду.
 С помощью этих данных можно получить положение объекта. Для этого мгновенное значение угловой скорости умножим на промежуток времени между опросами датчика гироскопа. Например, разрешение 2000 градусов в секунду, время между опросами 0,1 с, значение мгновенной скорости 210, значит 210*0,1=21 – за это время произошел поворот на 21 градус. Далее каждое полученное значение нужно сложить с предыдущим. 

Как объяснено выше данные акселерометра и гироскопа склонны к систематическим ошибкам. Акселерометр обеспечивает получение точных данных в долгосрочной перспективе, но дает сильный шум при рассмотрении за короткий промежуток времени. Гироскоп обеспечивает получение точных данных о изменении ориентации за короткий промежуток времени, но при интеграции данных происходит дрейф.
Решение этих проблем заключается в использовании данных акселерометра и гироскопа вместе таким образом, чтобы ошибки взаимно уничтожались. Стандартный способ объединения – применение фильтра Калмана, который является довольно сложной методикой. Есть более простая аппроксимация для объединения этих двух типов данных – комплементарный фильтр. Хорошо объяснено здесь и здесь. Вот формула комбинирования данных обоих датчиков:
 
Угол фильтра = α × (Угол от гироскопа) + (1 − α) × (Угол от акселерометра)
α=τ/(τ + Δt)
Угол от гироскопа = (Последний угол измеренный фильтром) + ω×Δt
Δt = время выборки
 τ = постоянная времени превышающая интервалы между шумами
Угол фильтра – отфильтрованный, результирующий угол наклона
Рекомендуется время выборки около 0,04 с и постоянная времени около 1 с, что дает α≈0,96.
 
Величина угла наклона представляет собой сумму интегрированного значения гироскопа и мгновенного значения акселерометра. Главная задача комплементарного фильтра в том, чтобы ликвидировать дрейф нуля гироскопа и ошибки дискретного интегрирования. На каждом шаге интегрирования (шаге цикла управления машиной) корректируется интеграл угла наклона с помощью показаний акселерометра. Сила этой коррекции определяется коэффициентом фильтра α. Выбор коэффициента α зависит от величины дрейфа нуля гироскопа, от скорости накопления ошибок вычисления и от условий использования машины. Так, слишком малое значение α приведет к тому, что на результат работы фильтра будет влиять вибрация корпуса. Как правило, коэффициент комплементарного фильтра подбирается вручную для каждого случая.

АКСЕЛЕРОМЕТР.  Модуль GY-9250 на микросхеме MPU-9250 http://robot-kit.ru/product_info.php?products_id=1143  

GY-9250.pngGY-9250 это 9-ти осевое устройство 3-х осевой гироскоп, 3-х осевой акселерометр и 3-х осевой магнитометр (магниторезистивный компас).
MPU-9250 – самый миниатюрный в мире (корпус QFN 3×3×1 мм) девятиосевой сенсор движения второго поколения компании InvenSense. Микросхема предназначена для применения в роботах, смартфонах, трекерах активности и прочих портативных потребительских изделиях. Добиться столь малых размеров микросхемы при высокой функциональности удалось с помощью патентованной технологии InvenSense CMOS MEMS, позволяющей изготавливать на одном кристалле МЭМС-устройства и КМОП-электронику. В корпусе микросхемы MPU-9250 объединены два кристалла: на одном размещён трёхосевой гироскоп и трёхосевой акселерометр, а на втором – трёхосевой магнитометр Asahi Kaisei Microdevices (AK8963). Данные с сенсоров оцифровываются 16-битными АЦП, обрабатываются с применением алгоритмов Motion Fusion сигнальным процессором DMP (Digital Motion Processor) и передаются внешнему микроконтроллеру по шине I2C/SPI. 

GY-9250-sxema.pngМодуль характеризуется низким потреблением энергии, низкой стоимостью и высокой производительностью. Алгоритмы MotionFusion обрабатывают все внутренние сенсоры и собирают полный набор данных. Даташит микросхемы MPU9250 (формат PDF размер 1.1 МБ) http://robot-kit.ru/manual/DataSheet_MPU-9250.pdf Гироскоп – это сенсор, реагирующий на изменение углов ориентации в пространстве. В тех же квадрокоптерах его используют, чтобы стабилизировать положение аппарата в воздухе и защитить его от ветра.

Акселерометр сравнивает проекцию ускорения объекта с гравитационным ускорением и способен замерять линейную скорость объекта, а вкупе с гироскопом – и положение в пространстве.

Магнитометр представляет собой устройство для измерения интенсивности ближайшего магнитного поля, действующего на объект (впрочем, название датчика говорит само за себя).

GY-9250-I2C.pngСвязь со всеми регистрами устройства выполняется с использованием I2C на частоте 400 кГц или GY-9250-SPI.pngSPI на частоте 1 МГц. За приложения, требующие более быстрой связи, датчики и регистры прерываний могут считываться с использованием SPI в 20МГц. Используя свою запатентованную и подтвержденную объемами платформу CMOS-MEMS, которая объединяет MEMS пластины с компаньонной электроникой CMOS через склеивание на уровне пластины, InvenSense управляет пакетом размером до основания и толщиной 3x3x1 мм, чтобы обеспечить очень небольшую, но высокую производительность низкой стоимости пакет. Устройство обеспечивает высокую прочность, поддерживая надежность 10000 лет.

В корпусе микросхемы объединены два кристалла: на одном размещён трёхосевой гироскоп и трёхосевой сенсор, а на втором - также трёхосевой магнитометр Asahi Kaisei MicrodevicMPU-9250.pnges. Данные с сенсоров оцифровываются 16-битными АЦП, обрабатываются с применением алгоритмов Motion Fusion сигнальным процессором DMP (Digital Motion Processor) и передаются внешнему микроконтроллеру по шине I2C/SPI. Характеристики микросхемы MPU-9250: рабочие диапазоны гироскопа: ±250, ±500, ±1000, ±2000 °/с; чувствительность гироскопа: 131, 65,5, 32,8, 16,4 LSB/°/c; рабочие диапазоны акселерометра: ±2, ±4, ±8, ±16 g; рабочий диапазон магнитометра: ±4800 мкТл; напряжение питания: 2,4-3,6 В; рабочий ток: гироскоп - 3,2 мА, акселерометр - 450 мкА, магнитометр - 280 мкА; ток в режиме сна: 8+8 мкА (гироскоп+акселерометр). 

Характеристики модуля GY-9250: Микросхема: MPU9250; Напряжение питания: 3 - 5 Вольт; Интерфейс: I2C (400кГц) / SPI (1 МГц); Диапазон измерения акселерометра: +/- 2G, +/- 4G, +/- 8G, +/- 16G; Диапазон измерения гироскопа: +/- 250, +/- 500, +/- 1000, +/- 2000°/с; Чувствительность гироскопа: 131, 65,5, 32,8, 16,4 LSB/°/c; Диапазон измерения компаса магнитометра: +/- 4800 мкТл; Буфер: FIFO 512B; Рабочий ток: гироскоп – 3,2 мА, акселерометр – 450 мкА, магнитометр – 280 мкА; Ток в режиме сна: 8+8 мкА (гироскоп+акселерометр); Габариты: 25 х 16 x 3 мм; Вес модуля: 2 грамма; Диаметр отверстий для монтажа: 3 мм (2 шт.); Шаг распиновки: 2.54 мм. 

Подключение к Arduino. Используем скетч на оснве двух библиотек. Это позволит считывать информацию (данные) со всех трех датчиков и выводить в порт. Здесь понадобится библиотека Wire 0. Она уже встроена в Arduino IDE , а, значит, ее отдельно скачивать устанавливать не нужно. Библиотека TimerOne.h упрощает использование временных функций.

  1. #include <Wire.h>
  2. #include <TimerOne.h>
  3. #define MPU9250_ADDRESS 0x68
  4. #define MAG_ADDRESS 0x0C
  5. #define GYRO_FULL_SCALE_250_DPS 0x00
  6. #define GYRO_FULL_SCALE_500_DPS 0x08
  7. #define GYRO_FULL_SCALE_1000_DPS 0x10
  8. #define GYRO_FULL_SCALE_2000_DPS 0x18
  9. #define ACC_FULL_SCALE_2_G 0x00
  10. #define ACC_FULL_SCALE_4_G 0x08
  11. #define ACC_FULL_SCALE_8_G 0x10
  12. #define ACC_FULL_SCALE_16_G 0x18
  13. // This function read Nbytes bytes from I2C device at address Address.
  14. // Put read bytes starting at register Register in the Data array.
  15. void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data)     {
  16.       // Set register address
  17.       Wire.beginTransmission(Address);
  18.       Wire.write(Register);
  19.       Wire.endTransmission();
  20.       // Read Nbytes
  21.       Wire.requestFrom(Address, Nbytes);
  22.       uint8_t index=0;
  23.       while (Wire.available())
  24.       Data[index++]=Wire.read();     }
  25. // Write a byte (Data) in device (Address) at register (Register)
  26. void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)    {
  27.       // Set register address
  28.       Wire.beginTransmission(Address);
  29.       Wire.write(Register);
  30.       Wire.write(Data);
  31.       Wire.endTransmission();    }
  32. // Initial time
  33. long int ti;
  34. volatile bool intFlag=false;
  35. // Initializations
  36. void setup()    {
  37.       // Arduino initializations
  38.       Wire.begin();
  39.       Serial.begin(115200);
  40.       // Set accelerometers low pass filter at 5Hz
  41.       I2CwriteByte(MPU9250_ADDRESS,29,0x06);
  42.       // Set gyroscope low pass filter at 5Hz
  43.       I2CwriteByte(MPU9250_ADDRESS,26,0x06);
  44.       // Configure gyroscope range
  45.       I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_1000_DPS);
  46.       // Configure accelerometers range
  47.       I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_4_G);
  48.       // Set by pass mode for the magnetometers
  49.       I2CwriteByte(MPU9250_ADDRESS,0x37,0x02);
  50.  
  51.       // Request continuous magnetometer measurements in 16 bits
  52.       I2CwriteByte(MAG_ADDRESS,0x0A,0x16);
  53.       pinMode(13, OUTPUT);
  54.       Timer1.initialize(10000); // initialize timer1, and set a 1/2 second period
  55.       Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
  56.       // Store initial time
  57.       ti=millis();    }
  58. // Counter
  59. long int cpt=0;
  60. void callback()    {
  61.       intFlag=true;
  62.       digitalWrite(13, digitalRead(13) ^ 1);    }
  63. // Main loop, read and display data
  64. void loop()    {
  65.       while (!intFlag);
  66.       intFlag=false;
  67.       // Display time
  68.       Serial.print (millis()-ti,DEC);
  69.       Serial.print ("\t");
  70.       // ::: Counter :::
  71.       // Display data counter
  72.       // Serial.print (cpt++,DEC);
  73.       // Serial.print ("\t");
  74.       // ____________________________________
  75.       // ::: accelerometer and gyroscope :::
  76.       // Read accelerometer and gyroscope
  77.       uint8_t Buf[14];
  78.       I2Cread(MPU9250_ADDRESS,0x3B,14,Buf);
  79.       // Create 16 bits values from 8 bits data
  80.       // Accelerometer
  81.       int16_t ax=-(Buf[0]<<8 | Buf[1]);
  82.       int16_t ay=-(Buf[2]<<8 | Buf[3]);
  83.       int16_t az=Buf[4]<<8 | Buf[5];
  84.       // Gyroscope
  85.       int16_t gx=-(Buf[8]<<8 | Buf[9]);
  86.       int16_t gy=-(Buf[10]<<8 | Buf[11]);
  87.       int16_t gz=Buf[12]<<8 | Buf[13];
  88.       // Display values
  89.      // Accelerometer
  90.      Serial.print (ax,DEC);
  91.      Serial.print ("\t");
  92.      Serial.print (ay,DEC);
  93.      Serial.print ("\t");
  94.      Serial.print (az,DEC);
  95.      Serial.print ("\t");
  96.      // Gyroscope
  97.      Serial.print (gx,DEC);
  98.      Serial.print ("\t");
  99.      Serial.print (gy,DEC);
  100.      Serial.print ("\t");
  101.      Serial.print (gz,DEC);
  102.      Serial.print ("\t");
  103.      // ::: Magnetometer :::
  104.      // Read register Status 1 and wait for the DRDY: Data Ready
  105.      uint8_t ST1;
  106.      do         {
  107.            I2Cread(MAG_ADDRESS,0x02,1,&ST1);         }
  108.      while (!(ST1&0x01));
  109.      // Read magnetometer data
  110.      uint8_t Mag[7];
  111.      I2Cread(MAG_ADDRESS,0x03,7,Mag);
  112.      // Create 16 bits values from 8 bits data
  113.      // Magnetometer
  114.      int16_t mx=-(Mag[3]<<8 | Mag[2]);
  115.      int16_t my=-(Mag[1]<<8 | Mag[0]);
  116.      int16_t mz=-(Mag[5]<<8 | Mag[4]);
  117.      // Magnetometer
  118.      Serial.print (mx+200,DEC);
  119.      Serial.print ("\t");
  120.      Serial.print (my-70,DEC);
  121.      Serial.print ("\t");
  122.      Serial.print (mz-700,DEC);
  123.      Serial.print ("\t");
  124.      // End of line
  125.      Serial.println("");
  126.      // delay(100); }

Ультразвуковой дальномер HC-SR04

Dalnomer.pngУльтразвуковой дальномер HC-SR04 может определять расстояния до объектов, объезжать препятствия, или строить карту помещения. Его можно также использовать в качестве датчика для сигнализации, срабатывающего при приближении объектов. Дальномер генерирует звуковые импульсы на частоте 40 кГц и слушает эхо. По времени распространения звуковой волны туда и обратно можно однозначно определить расстояние до объекта. Характеристики: Напряжение питания: 5 В; Потребление в режиме тишины: 2 мА; Потребление при работе: 15 мА; Диапазон расстояний: 2–400 см; Эффективный угол наблюдения: 15°; Рабочий угол наблюдения: 30°. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см. Для уменьшения ошибок и погрешности измерений обычно выполняются следующие действия:
усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
датчик устанавливается на серводвигатель, с помощью которого мы «поворачиваем голову», перемещая диаграмму направленности влево или вправо.

Работа модуля основана на принципе эхолокации. Модуль посылает ультразвуковой сигнал и принимает его отражение от объекта. Измерив время между отправкой и получением импульса, не сложно вычислить расстояние до препятствия. Модуль подключается четырьмя проводами. Пины дальномера:
Vcc — положительный контакт питания.
Trig — цифровой вход. Для запуска измерения необходимо подать на этот вход логическую единицу на 10 мкс. Следующее измерение рекомендуется выполнять не ранее чем через 50 мс.
Echo — цифровой выход. После завершения измерения, на этот выход будет подана логическая единица на время, пропорциональное расстоянию до объекта.Контакты VCC и GND служат для подключения питания, а Trig и Echo— для отправки и приема сигналов дальномера. Подключим их к пинам 10 и 11 соответственно. Для того чтобы инициализировать отправку сигнала дальномером, необходимо подать высокий сигнал длительностью 10 ?s на пин Trig.
После получения высокого сигнала длительностью 10 ?s на пин Trig, модуль генерирует пучок из восьми сигналов частотой 40 кГц и устанавливает высокий уровень на пине Echo. После получения отраженного сигнала модуль устанавливает на пине Echo низкий уровень.
Зная продолжительность высокого сигнала на пине Echo можем вычислить расстояние, умножив время, которое потратил звуковой импульс, прежде чем вернулся к модулю, на скорость распространения звука в воздухе (340 м/с).
Функция pulseIn позволяет узнать длительность импульса в ?s. Запишем результат работы этой функции в переменную duration.
Теперь вычислим расстояние переведя скорость из м/с в см/мкс:
distance = duration * 340 м/с = duration * 0.034 м/мкс
Преобразуем десятичную дробь в обыкновенную
distance = duration * 1/29 = duration / 29
Принимая во внимание то, что звук преодолел расстояние до объекта и обратно, поделим полученный результат на 2
distance = duration / 58

Для работы с Arduino можно воспользоваться существующими библиотеками:

  • Ultrasonic — самая популярная библиотека для HC-SR04.
  • NewPing — отличается большей точностью и скоростью работы.

Конкретный код для работы дальномера с Arduino имеет вид:

int trigPin = 10; int echoPin = 11;  // Укажем, что к каким пинам подключено
 void setup() { 
  Serial.begin (9600); 
  pinMode(trigPin, OUTPUT);   pinMode(echoPin, INPUT); } 
 void loop() { 
  int duration, distance;
    digitalWrite(trigPin, LOW); // для большей точности установим значение LOW на пине Trig
  delayMicroseconds(2); 
    digitalWrite(trigPin, HIGH);// Теперь установим высокий уровень на пине Trig
  // Подождем 10 ?s 
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 
    duration = pulseIn(echoPin, HIGH); // Узнаем длительность высокого сигнала на пине Echo
    distance = duration / 58;// Рассчитаем расстояние
    Serial.print(distance); Serial.println(" cm"); // Выведем значение в Serial Monitor
  delay(100);}

GPS модуль GY-NEO6MV2 с антенной

NEO-6M-GPS.pngGPS модуль GY-NEO6MV2 с антенной осуществляет обмен данными через UART, имеет автономный GPS приемник. «Горячий старт» занимает от 1 секунды,  чувствительность отслеживания GPS: -162 dBm, обладает Технологией антиподавления, поддерживает SBAS (WAAS, EGNOS, MSAS, GAGAN). Скорость обновления местоположения: 5 Гц, Температурный режим работы: от -40 до 85°C, есть EEPROM: для хранения настроек. Скорость передачи данных по умолчанию: 9600. Размеры модуля: 25 x 35 мм, Размеры антенны: 25 x 5 мм.

GPS модуль имеет 5 контактов: GND, Vin, Tx, Rx и снова GND. Контакт GND соединен с корпусом на Arduino, Vin подключаем к шине +5В на Arduino, Tx подключен к выводу 10 на Arduino, а вывод Rx никуда не подключаем, так как не будем посылать на GPS модуль никаких сообщений. Модуль передает спутниковые данные, используя интерфейс RS-232, со скоростью 4800 бит/сек, которые принимаются Arduino на выводе 10. Модуль отправляет то, что известно как NMEA сообщения. Приведен  пример одного NMEA сообщения и его разъяснение (выдержка из технического описания):

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,,,,0000*18
ID сообщения    $GPGGA         Заголовок протокола GGA
Время UTC    161229.487        hhmmss.sss (две цифры часы, две цифры минуты, затем секунды с точностью до тысячных)
Широта    3723.2475              ddmm.mmmm (первые две цифры градусы, затем минуты с точностью до десятитысячных)
Флаг N/S    N                           N – север, S – юг
Долгота    12158.3416         ddmm.mmmm (первые две цифры градусы, затем минуты с точностью до десятитысячных)
Флаг E/W    W                        E – восток, W – запад
Индикатор местоположения    1  (0 – местоположение недоступно или некорректно; 1 – режим GPS SPS, местоположение корректно; 2 – дифференциальный GPS, режим SPS, местоположение корректно; 3 – режим GPS PPS, местоположение корректно.
Количество используемых спутников    07         В диапазоне от 0 до 12
HDOP    1.0                          Ухудшение точности по горизонтали
Высота относительно уровня моря    9.0    метры     
Единицы измерения            M    метры     
Геоидальное различие         Различие между земным эллипсоидом WGS-84 и уровнем моря (геноидом)
Единицы измерения             M    метры     
Возраст дифференциальных данных GPS         секунды    Нулевые поля, когда DGPS не используется
ID станции, передающей дифференциальные поправки    0000          
Контрольная сумма    *18          
<CR><LF>                          Конец сообщения

GPS модуль GY-NEO6MV2. Схема электрическая принципиальная (Техническое описание на GPS модули NEO-6).

GPS модуль GY-NEO6MV2 схема электрическая принципиальная

При подаче питания GPS модуль затрачивает некоторое время, чтобы получить правильное местоположения от спутников. Когда местоположение получено, модуль шлет NMEA сообщения на Arduino. Библиотека TinyGPS содержит функцию для получения времени и даты из GPRMC сообщения. Она называется crack_datetime() и принимает в качестве параметров семь указателей на переменные: год year, месяц month, день месяца day, часы hour, минуты minute, секунды second, и сотые доли секунды hundredths. Вызов функции выглядит так: gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);

Вызов данной функции возвращает вам в переменных правильные значения до тех пор, пока с железом всё в порядке.
Чтобы получить ваше местоположение, можно вызвать функцию f_get_position(). Данная функция принимает в качестве параметров два указателя на переменные: широта latitude и долгота longitude. Вызов данной функции выглядит так:
gps.f_get_position(&latitude, &longitude);
Исходный текст программы можно найти по адресу: https://radioprog.ru/post/125              https://ngin.pro/arduino/218-uchebnoe-posobie-dlya-svyazi-neo-6m-gps-dly...

SoftwareSerial представляет собой библиотеку Arduino, которая обеспечивает последовательную передачу данных через другие цифровые контакты Arduino. Библиотека разширяет аппаратные функции и обрабатывает задачу последовательной связи. TinyGPS это библиотека, которая преобразует все эти сообщения в формате NMEA в удобном для чтения формате, наполняя последовательности символов в переменные. Для того, чтобы иметь возможность

В интерфейсный модуль GPS с Arduino надо загрузить библиотеки и распаковать их в библиотеках Arduino: файл: softwareserial.rar [7,82 Kb];  файл: tinygps.rar [10,71 Kb]. 

Прежде чем приступать к подключению GPS к ардуино, нужно научиться тестировать сам модуль. Для этого нам обязательно понадобится программа, позволяющая показать статус устройства, количество пойманных спутников и другу тестовую информацию. Мы постарались собрать вместе наиболее популярный софт для работы с GPS на компьютере.

U-Center. Ссылка на скачивание — https://www.u-blox.com/en/product/u-center-windows
Программа u-center используется для работы с GNSS-проемниками от фирмы U-Blox. С помощью этого программного обеспечения можно тестировать точность позиционирования, изменять конфигурацию ресивера и проводить общую диагностику, обрабатывать полученные данные и отображать их в режиме реального времени. Координаты приемник получает с помощью GPS, ГЛОНАСС.  Полученную информацию можно экспортировать и показывать в картах Google Maps, Google Earth. Программа позволяет создавать двухмерные диаграммы, гистограммы и другие виды графиков. u-center можно использовать при работе с несколькими приемниками. Возможности программного обеспечения U-Center:
Работа с Windows;
Чтение NMEA , SiRF данных, UBX;
Вывод полученных данных в виде текста и графиков;
Запись данных, и воспроизведение;
Полное управление модулем GPS;
Возможность изменения конфигурации GPS-модуля;
Запись новой конфигурации в модуль;
Запись конфигурации в файл формата .txt;
Обновление прошивки модуля;
Возможность холодного, теплого и горячего старта модуля.
Программа позволяет оценивать работоспособность приемника, анализировать его быстродействие и устанавливать его настройки. Помимо U-Center могут использоваться и другие программы, например, Visual GPS, Time Tools GPS Clock и другие.
Visual GPS. Ссылка на скачивание http://www.visualgps.net/VisualGPS/download.htm
Эта программа используется для отображения GPS данных по протоколу NMEA 0183 в графическом виде. Программа позволяет записывать лог GPS данных в файл. Существует два режима работы в программе – в первом Visual GPS связывается с приемником GPS, а во втором Visual GPS считывает показания NMEA из файла. Программа имеет 4 основных окна – Signal Quality (качество сигнала), Navigation (навигация), Survey (исследование), Azimuth and Elevation (азимут и высота).
Time Tools GPS Clock. Ссылка на скачивание https://softadvice.informer.com/Time_Tools_Gps_Clock.html
Эта программа работает на Windows и любых рабочих станциях, она проверяет время со стандартного приемника времени NMEA GPS, который подключен к компьютеру, и позволяет синхронизировать время на ПК. Отображается информация о времени, дате, состоянии GPS, полученная от приемника. Недостатком программы является невозможность высокоточного определения времени, так как GPS-устройства не имеют секундного импульса  для последовательного порта компьютера.
GPS TrimbleStudio. Ссылка на скачивание http://softwaretopic.informer.com/trimble-gps-studio/
Программное обеспечение используется для работы с приемником Copernicus в Windows. Программа отображает принимаемые навигационные данные. Полученные координаты можно отобрать на картах Google Maps, Microsoft Visual Earth. Все установленные настройки приемника можно сохранить в конфигурационном файле
Fugawi. Ссылка на скачивание http://www.fugawi.com/web/products/fugawi_global_navigator.htm
Программа используется для планирования маршрута, GPS навигации в реальном времени. Программа позволяет записывать и сохранять маршруты и путевые точки на картах. Навигация производится как на суше, так и на воде и в воздухе. В программе используются различные виды цифровых карт – топографические карты, стандарты NOAA RNC, отсканированные копии бумажных карт, Fugawi Street Maps.
3D World Map. Ссылка на скачивание www.3dwamp.com
В этой программе можно увидеть землю в трехмерном виде. Используется как удобный географический справочник, в котором можно узнать информацию 269 странах и тридцати тысячах населенных пунктов, производить измерение между двумя точками, воспроизводить аудиозаписи.

../documents/

Модуль Wi-Fi ESP8266

Esp-01.pngМодуль ESP-01 с чипом ESP8266 предназначен для связи устройства с беспроводными сетями по WiFi. sx-for-ESP12.png

ESP-01 — плата-модуль WiFi на базе популярного чипсета ESP8266EX. На борту платы находится микросхема Flash-памяти объёмом 2 МБ, чип ESP8266EX, кварцевый резонатор, два индикаторных светодиода и миниатюрная антенна из дорожки на верхнем слое печатной платы в виде змейки. Flash-память необходима для хранения программного обеспечения. При каждом включении питания, ПО автоматически загружается в чип ESP8266EX.

По умолчанию модуль настроен на работу через «AT-команды». Управляющая плата посылает команды — Wi-Fi модуль выполняет соответствующую операцию. Но внутри чипа ESP8266 прячется целый микроконтроллер, который является самодостаточным устройством. Прошивать модуль можно на разных языках программирования. Но обо всё по порядку. В стандартной прошивке Wi-Fi модуль общается с управляющей платой через «AT-команды» по протоколу UART. На всех платах Iskra и Arduino присутствует хотя бы один аппаратный UART — HardwareSerial. Если же по каким то причинам он занят другим устройством, можно воспользоваться программным UART — SoftwareSerial.

Для записи прошивки на чип ESP8266 используется Arduino (в режиме конвертора - надо бросить RESET Arduino на GND). Для перехода в  режим записи прошивки – зажать кнопку для записи прошивки (GPIO0 на GND), один раз нажать кнопку для сброса (RES на GND), а затем отпустить кнопку для записи прошивки. При этом загорится светодиод, подключенный к GPIO2. 
Конечно, необходимо настроить среду Arduino, чтобы сделать ее совместимой с модулем ESP-01. 
1. Откройте окно настроек из IDE Arduino. Перейдите в меню «Файл»> «Настройки».
2. Введите http://arduino.esp8266.com/stable/package_esp8266com_index.json в поле «Дополнительные адреса диспетчера советов» и нажмите кнопку «ОК»
3. Open boards manager. Go to: Tools > Board > Boards Manager
4. Прокрутите вниз, выберите меню платы ESP8266 и установите «платформа esp8266».
5. Выберите плату ESP8266 из раздела «Инструменты»> «Платы»> «Generic ESP8266 Module»

 Arduino        Модуль ESP8266 ESP-01
GND    <--->      GND
TX       <--->       TX
RX       <--->       RX
Кнопка сброса    <--->    RST
Кнопка для записи прошивки    <--->    GPIO0
GPIO2     <--->    на светодиод
Питание  <--->    3,3 В

Для прошивки управления светодиодом: открыть Arduino IDE, выбрать плату ESP8266 в меню: Tools > Board > Generic ESP8266 Module. Скопировать скетч в Arduino AMS1117-stab.pngIDE, изменить SSID на точку доступа Wi-Fi (роутера), измените пароль на свой пароль Wi-Fi и скомпилировать (загрузка). При этом нажать кнопку загрузки. 
Далее в последовательном мониторе посмотреть URL (ip:192.168.0.103) и открыть через веб-браузер. Подключить GPIO 2 от ESP8266 к более длинному выводу светодиода. Теперь можно управлять светодиодом удаленно через локальную сеть WiFi! 
На сайте ip:192.168.0.103 появятся: 
Led pin is now: Off
Click here turn the LED on pin 2 ON
Click here turn the LED on pin 2 OFF
Далее можно удалить все провода, которые были необходимы для загрузки кода. Модуль ESP8266 ESP-01 станет автономным.
Скетч для загрузки
#include <ESP8266WiFi.h>
const char* ssid = "TP-LINK_9C66EC";//type your ssid
const char* password = "17199728";//type your password
 int ledPin = 2; // GPIO2 of ESP8266
WiFiServer server(80);//Service Port
 void setup() {Serial.begin(115200); delay(10);
 pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW);
 Serial.println(); Serial.println(); Serial.print("Connecting to ");// Connect to WiFi network
Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");}
Serial.println(""); Serial.println("WiFi connected");
 server.begin();// Start the server
Serial.println("Server started");
Serial.print("Use this URL to connect: "); // Print the IP address
Serial.print("http://");
Serial.print(WiFi.localIP()); Serial.println("/");}
 void loop() {WiFiClient client = server.available();// Check if a client has connected
if (!client) { return;}
 Serial.println("new client");// Wait until the client sends some data
while(!client.available()){delay(1);}
 String request = client.readStringUntil('\r');// Read the first line of the request
Serial.println(request);
client.flush();
  int value = LOW;// Match the request
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(ledPin, HIGH); value = HIGH; } 
if (request.indexOf("/LED=OFF") != -1){
digitalWrite(ledPin, LOW); value = LOW; }
 //Set ledPin according to the request //digitalWrite(ledPin, value);  // Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); //  do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
 client.print("Led pin is now: ");
 if(value == HIGH) {
client.print("On");  
} else {client.print("Off");}
client.println("<br><br>");
client.println("Click <a href=\"/LED=ON\">here</a> turn the LED on pin 2 ON<br>");
client.println("Click <a href=\"/LED=OFF\">here turn the LED on pin 2 OFF<br>");
client.println("</html>");  delay(1);
Serial.println("Client disconnected");
Serial.println(""); }

Файл:ESP8266 Tutorial h3-min.jpgПодключение ESP8266 к Интернету: В настоящее время модуль ESP8266 доступен только через локальную сеть Wi-Fi (в данном случае через WiFi роутер (ssid = "TP-LINK_9C66EC", password = "17199728") . Чтобы управлять устройствами из Интернета, необходимо выполнить переадресацию портов на маршрутизаторе. Для этого найти IP-адрес системы либо с помощью команды «ifconfig» в терминале, либо перейти на страницу whatsmyip.org. Скопировать свой IP-адрес. Теперь открыть настройку маршрутизатора и перейти в настройки «Переадресация». Введите данные для «Сервисного порта» и «IP-адреса». Сервисный порт - это номер порта из кода Arduino (служебный порт: 80): WiFiServer server(80);//Service Port. IP-адрес тот, который указан ранее. Оставьте остальные настройки по умолчанию. Теперь перейдите в свой браузер и введите адрес: ip:192.168.0.103: 80. Должна открыться страница для управления светодиодом. На рисунке представлена схема подключенияESP-01 к Ардуино. Используется Arduino со встроенным USB-TTL конвертером.

  1. 1. Arduino Reset подключен к GND чтобы не запускался микроконтроллер на Arduino, в данном виде используется Arduino как прозрачный USB-TTL конвертер
  2. 2. RX и TX подключены не «на перекрест», а прямо — RX — RX, TX — TX
  3. 3. Для режима записи прошивки– зажать кнопку для записи прошивки, один раз нажать на кнопку для сброса, а затем отпустить кнопку для записи прошивки.

Прошивка через Nodemcu Flasher: Устанавливаем на вкладке Advanced Параметр Flash size в соотвествии выбранным размером flash памяти (в байтах) – 4 Мбит. Остальные параметры не трогаем. Указываем на вкладке Config путь на файл прошивки с адресом 0x0000. На вкладке Operation выбираем COM порт и жмем кнопку FLASH. После успешной прошивки необходимо запустить режим safe mode, замкнув между собой RX и TX и перезапустив модуль или нажать 3 раза подрят (с интервалом нажатия около секунды) кнопку RESET на ESP8266. В эфире появится точка с именем homessmart , к которой можно подключится используя смартфон или ноутбук. Наконец-то удалось “завести” ESP8266 01. Залил прошивку ESP8266 на скорости 115200 бод про Flash Size 512 Кбайт. Serial Monitor начал отвечать на команды АТ на скорости 115200 бод после перезапуска питания.

Барометр ВМР180

BMP180-modul.pngДатчики компании BOSH: BMP085 и BMP180 - прицезионные. Второй барометр более новый, но полностью совместимый со старой версией. Адрес: http://robotclass.ru/tutorials/arduino-pressure-sensor-bmp180-bmp085/. Эти прецизионные датчики от Bosch являются лучшим решением для измерения барометрического давления и температуры. Поскольку изменения давления с высоты можно также использовать его как высотомер! Датчик припаян на печатную плату с регулятором 3.3 В, переключатель скоростей i2c и пульсирующие резисторы на штырьках I2C. BMP180 является новым поколением датчиков от Bosch и заменяет Хорошая новость заключается в том, что она полностью идентична BMP085 в плане прошивки/программного обеспечения/interfaction -Можно использовать любой пример кода/библиотеки для BMP085 в качестве Drop-в замене. Даташит на русском: https://iarduino.ru/lib/datasheet%20bmp180.pdf. 

Характеристики: -40-+ 85 °C с эксплуатационным диапазоном, +-2 °C точность температуры; диапазон измеряемых значений: от 300 гПа до 1100 гПа  (от -500м от +9000м над уровнем моря); напряжение питания: от 3.3 до 5 Вольт; сила тока: 5 мкА при скорости опроса — 1 Герц;  уровень шума: 0.06 гПа (0.5м) в грубом режиме (ultra low power mode) и 0.02 гПа (0.17м) а режиме максимального разрешения (advanced resolution mode). До 0.03hpa/0.25 м разрешение; 

Состав датчика BMP180:
- пьезо-резистивный датчик (для определения атмосферного давления);
- термодаBMP180.pngтчик (для определения температуры);
- АЦП (аналого-цифровой преобразователь);
- EEPROM (энергонезависимая электрически стираемая перепрограммируемая память);
- RAM (энергозависимая память, другими словами ОЗУ);
- микроконтроллер;
- передача данных организована по шинам I2C или SPI.

В датчике имеется герметичная камера, одна из стенок которой является гибкой мембраной с установленными на ней тензодатчиками. Мембрана прогибается пропорционально разности давлений внутри камеры и снаружи, что влияет на изменение сопротивления тензодатчиков электрическому току. Так же имеется термодатчик, сопротивление которого меняется пропорционально температуре.
АЦП (аналого-цифровой преобразователь) переводит результаты изменений датчиков в цифровые данные «некомпенсированные результаты», которые доступны для чтения из регистров датчика: «Out MSB», «Out LSB» и «Out xLSB».
Для компенсации указанных результатов (компенсации смещения, температурной зависимости, погрешностей при изготовлении, неоднородностей материалов и т.д.) каждый датчик калибруется на заводе, и в EEPROM записываются индивидуальные для каждого датчика 11 калибровочных коэффициентов (176 бит), которые доступны для чтения из регистров датчика: «AC1», «AC2», «AC3», «AC4», «AC5», «AC6», «B1», «B2», «MB», «MC», «MD».

Подключение к Ардуино Уно.
BMP 180            GND    VCC    SDA    SCL
Ардуино Уно    GND    +5V    A4       A5

Для работы с датчиком нужна библиотека: BMP180_Breakout_Arduino_Library https://github.com/sparkfun/BMP180_Breakout_Arduino_Library 
BMP180 подключение к Arduino     http://skproj.ru/bmp180-podklyuchenie-k-arduino/ 
В результате эксперимента получено: Уровень моря: 1655 метров, 5430 футов
температура: 25.56 градусов C, 78.01 градусов F
абсолютное давление: 1002.82 миллибар, 29.62 дюймов ртутного столба
Давление по уровню моря: 1224.78 миллибар, 36.17дюймов ртутного столба
Использован скетч:
#include <SFE_BMP180.h>
#include <Wire.h>
 SFE_BMP180 pressure;// Объявим переменную для доступа к SFE_BMP180:
 #define ALTITUDE 1655.0 // высота над уровнем моря по приколу в метрах
 void setup() {   Serial.begin(9600);  Serial.println("REBOOT");
 if (pressure.begin())// инициализация
    Serial.println("BMP180 init ok");
  else  {    Serial.println("BMP180 init fail\n\n");// что-то не так. см. подключение
    while(1);   } }// зависаем
 void loop() {
  char status;  double T,P,p0,a;
   Serial.println();
  Serial.print("Уровень моря: ");// Если знать давление, то надо знать уровень моря 
  Serial.print(ALTITUDE,0);//(указан в константе ALTITUDE )
  Serial.print(" метров, ");
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" футов");
    // Для высоты над уровнем моря, надо указать атмосферное давление. 
   // Но надо сначала узнать температуру
  // В BMP180 есть встроенный термометр.  pressure.startTemperature вернет в status кол. милисекунд,
     status = pressure.startTemperature();
  if (status != 0)  {
        delay(status);// ждем:
    status = pressure.getTemperature(T);// Температура в переменной T:
    if (status != 0)    {
      Serial.print("температура: ");// пишем температуру:
      Serial.print(T,2);
      Serial.print(" градусов C, "); // в цельсиях
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" градусов F"); // в фаренгейтах
        status = pressure.startPressure(3);// Определяем атм. давление:
      if (status != 0)      {
        delay(status);// ждем окончания замера:
         status = pressure.getPressure(P,T);// Давление в переменной P.
        if (status != 0)        {
          Serial.print("абсолютное давление: ");// выводим все:
          Serial.print(P,2);
          Serial.print(" миллибар, ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" дюймов ртутного столба");
            p0 = pressure.sealevel(P,ALTITUDE);
          Serial.print("Давление по уровню моря: ");
          Serial.print(p0,2);
          Serial.print(" миллибар, ");
          Serial.print(p0*0.0295333727,2);
          Serial.println("дюймов ртутного столба");
           a = pressure.altitude(P,p0);
          Serial.print("рассчитанная высота над уровнем моря: ");
          Serial.print(a,0);
          Serial.print(" метров, ");
          Serial.print(a*3.28084,0);
          Serial.println(" футов");        }
        else Serial.println("ошибка получение давления\n");      }
      else Serial.println("ошибка запуска получения давления\n");    }
    else Serial.println("ошибка получения температуры\n");  }
  else Serial.println("ошибка запуска  получения температуры\n");
   delay(5000);}  // пауза 5 секунд.

Радиомодули 433МГц (FS1000A -передатчик, MX-Rm-5V - приемник)

../documents/ FS1000A.pngНа основе приемопередатчиков с частотой 433 МГц и 315 МГц работает большинство радиоканальных пультов управления. Имея Ардуино и приемник, мы можем декодировать сигналы управления и повторить их. Устройство по передаче данных состоит из двух модулей: приемника и передатчика. Данные мtransmiter.pngожно передавать только в одном направлении. Это важно понимать при использовании этих модулей. Приемо-передатчик реализует листанционное управление любым электронным устройством, будь то мобильный робот или,  передача сигналов с беспроводных датчиков на систему сбора данных. Модули могут иметь разные названия: MX-05V, XD-RF-5V, XY-FST, XY-MK-5V, и т.п., но все они имеют примерно одинаковый внешний вид и нумерацию контактов. Также, распространены две частоты радиомодулей: 433 МГц и 315 МГц. Передатчик имеет всего три вывода: Gnd, Vcc и Data. Для того, чтобы эти модули работали, необходимо припаять к каждому из них антенну, рекомендуемая длина – 17 см. Рабочее напряжение – до 12 вольт, но хватит и выхода Arduino на 5 вольт. Модули приемопередатчиков на 433 МГц работают на 50 метров уверенно, с штыревыми антеннами 20 см. Для увеличения дальности до 100-500 м к передатчику надо сделать усилитель мощности ВЧ на одном транзисторе. 

Fs+transistor.pngХарактеристики риемника MX-05V:  Рабочее напряжение: DC5V; Ток покоя: 4mA; Частота приема: 433.92 мГц; Чувствительность приемника:-105DB; Размеры: 30*14*7 мм; Внешняя антенна: 32 см одножильный провод  в спирали
Технические параметры трансмиттер:  Модель продукта: MX-FS-03V; Старт расстояние: 20-200 м (другое напряжение, разные результаты); Рабочее напряжение: 3.5-12 В; Размеры: 19*19 мм; Режим работы: AM; Скорость передачи: 4KB/s; Мощность передатчика: 10 МВт;  Передавая частота: 433 м; Внешняя антенна: 25 см 

Для работы с радиомодулями воспользуемся библиотекой RCSwitch. Напишем программу, которая будет каждую секунду по-очереди отправлять два разных сообщения.
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {    mySwitch.enableTransmit(2);}
void loop() {    mySwitch.send(B0100, 4);    delay(1000);     mySwitch.send(B1000, 4);    delay(1000);}
Разберем программу. Первое что мы сделали — объявили объект для работы с передатчиком и назвали его mySwitch.
RCSwitch mySwitch = RCSwitch();
Затем, внутри стандартной функции setup включили передатчик и указали вывод, к которому он подключен:
mySwitch.enableTransmit(2);
Наконец, в основном цикле программы loop отправляем сначала одно сообщение, а затем и второе с помощью функции send:
mySwitch.send(B1000, 4);
Функция send имеет два аргумента. Первый — это отправляемое сообщение, которое будет отправляться в эфир в виде пачки импульсов. Второй аргумент — это размер отправляемой пачки.
В нашей программе мы указали сообщения в формате двоичного числа. На это указывает английская буква «B» в начале кода B1000. В десятеричном представлении это число превратится в восьмерку. Так что мы могли вызвать функцию send так:
mySwitch.send(8, 4);
Также send умеет принимать двоичные строки:
mySwitch.send("1000", 4);
Программа для приемника
Теперь напишем программу для приемника. Для демонстрации факта передачи мы будем зажигать светодиод, подключенный к выводу №3 на плате Ардуино. Если приемник поймал код B1000 — включим светодиод, а если B0100 — выключим.
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {    pinMode( 3, OUTPUT );    mySwitch.enableReceive(0);}
void loop() {    if( mySwitch.available() ){        int value = mySwitch.getReceivedValue();
         if( value == B1000 )
            digitalWrite( 3, HIGH );
        else if( value == B0100 )
            digitalWrite( 3, LOW );
        mySwitch.resetAvailable();    }}
Функция available возвращает истину, если передатчик принял хоть какие-то данные:
mySwitch.available()
Функция getReceivedValue извлекает из потока данных одну пачку и декодирует её в число. В программе мы присваиваем полученное число переменной value:
int value = mySwitch.getReceivedValue();

Приемопередатчик 2,4 ГГц NRF24L01+PA+LNA

NRF24L01+PA+LNA.jpgСуществуют недорогие радимодули nRF24L01+ ,которые работают на частоте 2.4ггц и поддерживают скорость передачи до 2Mbps.Радиоканал на данных радиомодулях может обмениваться информацией в оба направления. Радиосеть может состоять из нескольких устройств на базе nRF24L01+ или NRF24LE1. Даташит на устройство nRF24L01+ : nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf. Примерная цена за 1 штуку:  1$. nRF24L01+ - отличный вариант для объединения отдаленных модулей в системе умного дома внутри помещений без прокладки проводов. Цена от 5$ на Ebay по наименованию NRF24L01+PA+LNA.
Модуль предназначен для создания различных робототехнических проектов. Например, для управления мобильным роботом. Или для сбора показаний дистанционных датчиков (один радиомодуль может держать связь одновременно с множеством других). Для построения беспроводных сетей «умного дома», как сканер радиочастот и многое другое.
Модуль работает в диапазоне частот 2.4~2.5 ГГц, что обеспечивает достаточно высокую скорость передачи данных и на большие расстояния (до 1000 м на открытом пространстве). Встроенный винтовой разъём позволяет заменять антенну, а усилитель радиосигнала – увеличить дальность связи.
Модуль поддерживает LNA и PA усиление.
Радиомодуль RKP-NRF24L01+PA+LNA это одновременно и цифровой приемник и передатчик. Соответственно для наладки связи нужно как минимум два таких радио модуля.
Дальность радиомодуля RKP-NRF24L01+PA+LNA будет напрямую зависеть от скорости передачи данных. При скорости 2 Мбит/с радиус действия составит 520 м, при скорости 1 Мбит/с – 750 м, при 250 кбит/сек – до 1.1 км. Данные приведены для прямой видимости. Максимальная длина передаваемого пакета – 32 байта.
Радиомодуль способен работать на одном канале максимум с шестью передатчиками одновременно и одним приёмником. Но если некоторые устройства будут иметь одинаковые адреса, их количество может быть увеличено.
Микросхема nRF24L01 имеет функции энергосбережения.
Модуль поддерживает пересылку потерянных пакетов.
Радио модуль RKP-NRF24L01+PA+LNA прост в использовании и без проблем подключается к контроллерам Arduino.
Характеристики:
Напряжение: 3 - 3.6 В
Несущая частота: 2.4 ~2.5 ГГц
Расстояние передачи/приема: до 1000 м (на открытом пространстве) 
Скорость передачи/приема: 2 Мбит/с до 520 м (открытое пространство) 
Скорость передачи/приема: 1 Мбит/с до 750 м (открытое пространство) 
Скорость передачи/приема: 250 кбит/сек до 1000 м (открытое пространство) 
Максимальная выходная мощность: +20 дБм
Усиление PA: 20 дцБ
Усиление LNA: 10 дцБ
Усиление антенны: 2 дБи
Пиковое потребление при передаче: 115 мА
Пиковое потребление при приеме: 45 мА
Интерфейс: SPI
Размер: 40.8 x 15.3 мм
Количество каналов: 128
Связь происходит в диапазоне частот 2,4–2.527 ГГц. Частота, на которой будут работать модули, определяется номером канала. Они имеют шаг 1 МГц. Каналу 0 соответствует частота 2,4 ГГц, каналу 76 частота 2,476 Ггц.
Соответственно есть возможность задать номер канала, мощность и скорость передачи сигнала.Заявленная дальность до 1100 метров при скорости 250кбит. При 1мбит - 750 метров. А при скорости 2мбит- 520 метров. Скорее всего эти параметры указаны при отсутсвии препятствий и если все радиомодули в радиосети будут именно такие. Рекомендую уменьшать избыточную мощность через setPALevel (библиотека Nf24) или напрямую в регистре RF_SETUP.
Назначение выводов:
SCK (Serial ClocK) — тактирование (синхронизация).
MOSI / MI (Master Out Slave In) — вход данных.
MISO / MO (Master In Slave Out) — выход данных.
CE/SS - Выбор ведомого на шине SPI из нескольких устройств.
SCN - выбор режима приема/передача , фактически тот же CE.
IRQ - выход прерывания,чаще всего не используется. Необходим для немедленной реакции микроконтроллера при приеме нового пакета данных.
GND - земля,масса,минусовая шина.
Vcc  -питание модуля 3.3в. Для надежной работы паралельно питанию как можно ближе к радиомодулю рекомендуется подключить электролитический конденсатор не менее 100мкф , а так же керамический на 0.1 мкф.
Библиотека для работы с nRF24L01+ в Arduino RF24 и Mirf. Ограничения библиотек: В радиосеть могут объеденены максимум до 6 радиомодулей. Радиомодуль может работать  только максимум с 6 адресами, но клиенты могут иметь и одинаковые адреса ,тем самым увеличив максимальное количество клиентов в радиосети. Длинна переданого пакета не больше 32 байт. В интернете можно найти  и другие библиотеки для работы с Arduino.
Подключение nRF24L01+ к Arduino
Таблица подключения радиомодуля к платам Arduino:
SCK    13     
MOSI    11     
MISO    12    
CSN    10*   
CE/SS    9*    
  * - при установке  иницилизации в скетчке командой RF24 radio(9,10);
  ** - при установке иницилизации в скетчке командой RF24 radio(48,53);
  Выводы СЕ и CSN могут быть назначены любые свободные.
  Питание подключается с соотвествующих выводов платы Arduino: GND и 3.3V.
  Пример скетча клиента тут , сервера - тут.

Подключаем выводы напрямую (MISO-12, MOSI-11, SCK-13), выводы CE (ChipEnable) и CSN (ChipSelectNot) подключаем к D10 и D9, можно использовать и другие цифровые вывода, главное подправить программу. Далее необходимо подключить кнопку, одну ножку через резистор 10Ком, подключаем к GND (Arduino) и этот же контакт к выводу 7. Осталось подключить питание (главное помнить два правила, что описывал выше) вывода Vcc к +3.3V и GND к GND. Вывод IRQ не используется в большинстве программ, в этом примере так же не будем использовать. Аналогично собираем вторую схему, вместо кнопки у нас будет светодиод.

Программа для передатчика:
#include <SPI.h>                        // Подключаем библиотеку SPI
#include <nRF24L01.h>                   // Подключаем библиотеку nRF24L01 
#include <RF24.h>                       // Подключаем библиотеку RF24 
 int data[1];                            // Создаём массив для приёма данных
RF24 radio(9,10);                       // Указываем номера выводов nRF24L01+ (CE, CSN)
int button = 7;                         // Создаем переменную button и указываем номер вывода
 void setup(void){
  pinMode(button, INPUT);        // Устанавливаем вывод 7 на вход
  radio.begin();                        // Инициируем работу nRF24L01+
  radio.setChannel(100);                // Указываем канал передачи (от 0 до 126)
  radio.setDataRate (RF24_1MBPS);       // Указываем скорость передачи (250KBPS, 1MBPS, 2MBPS)
  radio.setPALevel(RF24_PA_HIGH);       // Указываем мощность передатчика (MIN=-18dBm, LOW=-12dBm, HIGH=-6dBm, MAX=0dBm)
  radio.openWritingPipe(0x0123456789LL);}// Задаем идентификатором 0x0123456789LL для передачи данных данных 
 void loop(void){
  if (digitalRead(button) == HIGH){     // Считываем переменную "button", если HIGH идем дальше, если LOW зацикливаемся                     
  data[0] = 123;                        // Записываем значение 123 в массив data
  radio.write(data, 1);}  }              // Отправляем данные из массива data

Программа для приемника:
#include <SPI.h>                          // Подключаем библиотеку SPI
#include <nRF24L01.h>                     // Подключаем библиотеку nRF24L01 
#include <RF24.h>                         // Подключаем библиотеку RF24 
 int data[1];                              // Создаём массив для приёма данных
RF24 radio(9,10);                         // Указываем номера выводов nRF24L01+ (CE, CSN)
int LED = 3;                              // Создаем переменную SW1 и указываем номер вывода
 void setup(void){  delay(1000);                  // Ждем 1с
  pinMode(LED,OUTPUT);              // Устанавливаем вывод 3 на выход
  radio.begin();                          // Инициируем работу nRF24L01+
  radio.setChannel(100);                  // Указываем канал передачи (от 0 до 126)
  radio.setDataRate (RF24_1MBPS);         // Указываем скорость передачи (250KBPS, 1MBPS, 2MBPS)
  radio.setPALevel(RF24_PA_HIGH);         // Указываем мощность передатчика (MIN=-18dBm, LOW=-12dBm, HIGH=-6dBm, MAX=0dBm)
  radio.openReadingPipe(1,0x0123456789LL);// Задаем идентификатором 0x1234567890LL для передачи данных данных 
  radio.startListening  ();}
 void loop(void){
  if (radio.available()){          // Если в буфере поступили данные
      radio.read(data, 1);          // Считываем данные с массива data и задаем количество считываемых байт                
      if(data[0] == 123){                 // Если в массиве data значение 123 
         digitalWrite(LED, HIGH);}        // Включаем светодиод
         delay(10);     }                   // Ждем 10мс
    else{                      // Если в массиве data другое значение
      digitalWrite(LED, LOW);             // Выключаем светодиод
      delay(10);               } } // Ждем 10мс

Приемопередатчик 2,4 ГГц NRF24L01

NRF0.jpgЕсть проблемы при запуске модуля nRF24L01. В основном это связано с тем, что в модуле питания 3.3 В не предусмотрена Shild-Power.pngнеобходимая сила тока. Решение проблемы следующее:
Подключите конденсатор на 3.3 или 10 мкФ (микрофарад) напрямую к модулю - от 3.3 В (+) к GND (-). Некоторые рекомендуют использовать 10 мкФ или больше.
Отдельный источник питания на 3.3 В.
Использовать совместимый с Arduino YourDuinoRobo1, на котором добавлен регулятор 3.3 В (в этом случае, возможно, стоит добавить конденсатор на 1 мкФ на радиомодуль).
Старайтесь максимально избегать дополнительных проводов при подключении модуля радиопередатчика.
Разработать отдельную плату, на которую устанавливается модуль nRF24L01 и добавляются конденсаторы на 1 и 10 мкФ неподалеку от контактов 3.3 В и GND.
Проблемы с питанием возникают при использовании таких микроконтроллеров как, например, Arduino Uno, Nano, Mega, в которых на пины подается всего 50 мА. На некоторых новых модификациях плат делают пины с силой тока до 350 мА. Ну или вы можете отдельно приобрести шилды для увеличения мощности.

Расстояние передачи 100 метров на открытом воздухе, без препятствий на пути сигнала. Частота передатчика настроена на 2500 кГц. Внутри помещений, из-за наличия стен и других преград расстояние срабатывания будет меньше.

Есть Латашит  скачать даташит. Самые полезные страницы: 7, 8, 9 (общая характеристика и особенности радиопередатчика nRF24L01) и страница 39 (MultiCeiver, который дает возможность передавать информацию с 6 плат Arduino на основной (Primary) Arduino).

Существуют дополнительные модули для трансмиттера/ресивера (передатчика/приемника), которые обеспечивают беспроводную радиопередачу на расстояния до 1 км! Эти модули используют внешнюю антенну, которая может устанавливаться непосредственно на модуль или антенна, которая подключается с помощью дополнительных коннекторов. На фото ниже приведены несколько разновидностей модулей.

Подобные трансиверы отправляют и принимают пакеты данных по несколько байт. Предусмотрена встроенная коррекция погрешностей и возможность отправить данные еще раз. Каждый отдельный модуль NRF24L01 может одновременно обмениваться данными с шестью! аналогичными модулями!
Этот недорогой модуль не так просто освоить, но талантливые люди написали библиотеки для Arduino, благодаря которым использовать эти передатчики стало на порядок проще. Ниже приведены примеры использования передатчиков с Arduino и ссылки на библиотеки, которые вам понадобятся. На рисунках ниже показана схема подключения NRF24L01 к Arduino, которая используется во всех последующих примерах.

Большинство проблем при передаче возникает из-за шумов от источника питания 3.3 В. Особенно это чувствуется при использовании плат Arduino Mega. Решить эту проблему можно следующим образом: добавить в схему конденсатор между контактом GND и 3.3 В на радио модуле. Можно использовать конденсаторы номиналом 100 нФ. Некоторые ставят конденсаторы номиналом от 1 пкФ до 10 пФ.

Библиотека TMRh20's RF24 Library. Скачать ее можно здесь (Кнопка "Download ZIP" в нижнем правом углу страницы). После загрузки ZIP архива, на вашем ПК появится архив RF24-master.ZIP. Измените название архива на RF24.ZIP. Внутри архива находится папка с тем же названием RF24-master. Ее тоже переименуйте в RF24.

MICRO-CD READER ../documents/

micro-CD-sxema.pngCD-kard.pngКарта памяти нужна, чтобы записывать на неё данные с различных датчиков нашего устройства. Кроме самих показаний датчиков, рационально еще записывать время съема этих показаний — это называется журналированием. Таким образом, подключив к Ардуино датчики температуры, влажности и давления, а также часы реального времени и карту памяти мы сможем сделать настоящую погодную станцию. SD и microSD карты могут существенно расширить возможности проектов ардуино, работающих с большими объемами данных: регистраторов данных, метеостанций, систем умного дома. Платы arduino оснащены сравнительно небольшой внутренней памятью, всего до 4 килобайт, включая и флэш-память, и EEPROM. Этой памяти не хватит для записи больших объемов данных, тем более, если плата будет постоянно выключаться или выключаться. Универсальный модуль представляет собой обыкновенную плату, на которой помещены слот для карты, резисторы и регулятор напряжений. Он обладает следующими техническими характеристикаCD-card=pin.pngми: Диапазон рабочих напряжений 4,5-5 В; Поддержка SD карты до 2 Гб; Ток 80 мА; Файловая система FAT 16. Модуль SD-карты реализует такие функции как хранение, чтение и запись информации на карту, которая требуется для CD-card+Nano.pngнормального функционирования прибора на базе микроконтроллера. Довольно легко подключить CD карту к микроконтроллеру, если знать наименования ее контактов (см. рисунок).

Подключение SD карты ардуино в качестве внешнего накопителя позволяет многократно увеличить место для хранения любой информации. Съемные накопители SD стоят дешево, легко подключаются и удобны в использовании. Модуль подключается к Ардуино по SPI шине, Подключение:
Модуль micro-SD карт    GND    VCC    CS    MOSI    MISO    SCK
Ардуино Уно                   GND    +5V    4        11        12      13
Принципиальная схема

    По адресу http://robotclass.ru/tutorials/arduin-read-write-micro-sd-card/представлены  программы: 

    1. считывания с карты служебной информации,: тип карты, тип файловой системы, размер первого раздела и список файлов на нём.
    2. для записи данных на micro-SD карту.
    3. для чтения данных с micro-SD карты.

    Для работы с файлами в ардуино существует класс File. В него входят функции, которые предназначены для записи и чтения информации с карты:
    available() – проверяет наличие в файле байт, которые доступны для чтения. В ответ приходит количество места, которое доступно для чтения.
    close() – закрывает файл, перед эти проверяет, сохранены ли данные на карту.
    flush() – функция позволяет убедиться, что данные записаны на карту.
    name() – возвращает указатель на имя.
    peek() – считывает байты данных, при этом не перемещает указатель на следующий символ.
    position() – находит текущее положение указателя в файле.
    print() – выводит данные в отдельный файл.
    println() – печатает данные в файл до места, где появляется символ перевода каретки и пустая строка.
    seek() – меняет положение текущей позиции в файле.
    size() – выводит информацию о размере данных.
    read() – считывает информацию.
    write() – производит запись в файл.
    isDirectory() – с помощью этого метода происходит проверка, является ли файл директорией, то есть каталогом или папкой.
    openNextFile() – выводит имя последующего файла.
    rewindDirectory() – возвращает к первому файлу в директории.

    Популярной практикой при создании проектов — регистраторов данных является разбивка больших файлов на более мелкие, которые удобнее обновлять и открывать на компьютере. Например, вместо одного очень большого файла datalog.csv на SD карте можно иметь несколько маленьких, добавляя к концу номер по порядку: datalog01.csv, datalog02.csv и т.д.