Драйвер L298N. Подключение к Arduino.

Драйвер двигателей L298N. Подключение к Arduino.      Motor Shield разработан на базе микросхемы L298N. Позволяет управлять двумя моторами постоянного тока, либо одним шаговым двигателем. Максимальный потребляемый ток не должен превышать 2 Ампера.       В отличие от известной микросхемы L293D, в более мощный драйвер L298N не встроены защитные диоды. Их необходимо устанавливать в обвязку микросхемы дополнительно. На обозреваемом модуле мы можем увидеть эти диоды (4 штуки слева и 4 справа от микросхемы).      По выполняемым функциям  L298N и L293D схожи чуть более чем полностью. Имеются те же управляющие выводы – IN1 и IN2, IN3 и IN4, ENA и ENB. Чередование сигналов разного уровня (высокий и низкий логический уровень) на парах выводов задаёт направление вращения моторов.      Выводы ENA (привязан к IN1 и IN2) и ENB (привязан к IN3 и IN4) отвечают за раздельное управление каналами. Могут использоваться в двух режимах: 1.       Активный режим. Управление возлагается на контроллер (рис.а1). Высокий логический уровень разрешает вращение моторов, низкий запрещает, при этом уровни сигнала на выводах “IN” не имеет значения. Подавая на выводы “EN” ШИМ (PWM) сигнал, можно управлять скоростью вращения моторов. 2.       Пассивный режим. Подключение выводов “EN” к высокому уровню (+5 Вольт). Для этого на плате с помощью джамперов замыкаем штырьки +5V и EN, как показано на рис.а2. В таком режиме мы уже не сможем регулировать скорость двигателей, они всегда будут работать на полной скорости. Зато мы экономим два вывода микроконтроллера. Направление вращение по-прежнему задаётся состоянием выводов “IN”. А вот чтобы остановить двигатель, на парные выводы “IN” подаём сигнал одного уровня. В примерах программного кода в конце статьи все эти моменты подробно пояснены в комментариях.      Разъём для подачи питания и работа стабилизатора.   Подключение моторов к модулю L298N    В первом примере рассмотрим подключение одного мотора без регулировки скорости.       Программный код: int IN3 = 5; // Input3 подключен к выводу 5 int IN4 = 4; void setup() { pinMode (IN4, OUTPUT); pinMode (IN3, OUTPUT); } void loop() { // На пару выводов "IN" поданы разноименные сигналы, мотор вращается digitalWrite (IN4, HIGH); digitalWrite (IN3, LOW); delay(4000); // На пару выводов "IN" поданы одноименные сигналы, мотор не вращается digitalWrite (IN4, LOW); delay(500); // На пару выводов "IN" поданы разноименные (и уже противоположные относительно первого случая) сигналы, мотор вращается // относительно первого случая) сигналы, мотор вращается в другую сторону digitalWrite (IN3, HIGH); delay(4000); // Снова на выводах "IN" появились одноименные сигналы, мотор не вращается digitalWrite (IN3, LOW); delay(5000); } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Во втором примере подсоединим ENB к выводу ШИМ (D3). Таким образом мы задействуем возможность драйвера управлять скоростью, меняя скважность ШИМ сигнала. Значение скважности устанавливается функцией analogWrite(pin, ЗНАЧ), где ЗНАЧ изменяется от 0 до 255, прямо пропорционально скважности сигнала. В скетче подобраны четыре значения, при которых двигатель стартует с низких оборотов, набирает средние, затем высокие и останавливается.    Программный код: int IN3 = 5; // Input3 подключен к выводу 5 int IN4 = 4; int ENB = 3; void setup() { pinMode (ENB, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); } void loop() { // На пару выводов "IN" поданы разноименные сигналы, мотор готов к вращению digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); // подаем на вывод ENB управляющий ШИМ сигнал analogWrite(ENB,55); delay(2000); analogWrite(ENB,105); delay(2000); analogWrite(ENB,255); delay(2000); // Останавливаем мотор, подав на вывод ENB сигнал низкого уровня. // Состояние выводов "IN" роли не играет. analogWrite(ENB,0); delay(5000); } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Третий пример предлагает подключить два двигателя с регулировкой скорости. В приведённом ниже скетче два мотора будут вращаться с плавным набором скорости    Программный код: int IN1 = 5; // Input1 подключен к выводу 5 int IN2 = 4; int IN3 = 3; int IN4 = 2; int ENA = 9; int ENB = 3; int i; void setup() { pinMode (EN1, OUTPUT); pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (EN2, OUTPUT); pinMode (IN4, OUTPUT); pinMode (IN3, OUTPUT); } void loop() { digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); digitalWrite (IN4, HIGH); digitalWrite (IN3, LOW); for (i = 50; i <= 180; ++i) { analogWrite(EN1, i); analogWrite(EN2, i); delay(30); } analogWrite (EN1, 0); analogWrite (EN2, 0); delay(500); digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); for (i = 50; i <= 180; ++i) { analogWrite(EN1, i); analogWrite(EN2, i); delay(30); } analogWrite (EN1, 0); analogWrite (EN2, 0); delay(8000); }      Ещё немного информации о разгоне двигателей с помощью выводов ENABLE. При старте двигатель потребляет ток  в среднем в 4-6 раз больше номинального, а при резком реверсе ещё больше. Такой скачок можно снизить или вообще убрать, если разгонять двигатель плавно в течение какого-то промежутка времени. В приведённом выше скетче как раз продемонстрирован такой подход.                          ..
Вся статья

Добавлено: 27.07.2015

Лечим FTDI в картинках

Лечим FTDI в картинках Борьба корпораций с контрафактом и конечными пользователями                 Иногда борьба больших корпораций с контрафактными версиями своих продуктов приобретает чудовищные формы. Такое несчастье случилось и с горячо любимой многими электронщиками FTDI. Если вы используете устройство с конвертером USB <> UART на чипе выше обозначенной кампании (например, неоправданно дорогостоящий, во многом избыточный, но от того не менее народный FT232RL) – будьте осторожны. С сентября 2014 FTDI ломает контрафактные чипы программными средствами. Анамнез                 В последнее время участились жалобы владельцев Arduino и Arduino-подобных плат на внезапные поломки. Симптомы одни и те же: операционная система отказывается корректно устанавливать драйвер, и наше устройство лишается связи с компьютером, однако сохраняя при этом работоспособность на основе уже записанного скетча. Такой болезни подвержены только модели, интерфейс USB у которых спроектирован на чипе FT232RL.                 Процесс поломки чипа FTDI состоит из двух этапов: первым делом происходит автоматическое обновление драйверов через службу Windows Update. Эти драйверы отказываются работать с неправильным, как они думают, устройством.  Затем пользователь скачивает новые драйвера и, не читая, соглашается с лицензионным соглашением. После этого новые драйверы изменяют PID нашего чипа.                    Итак, если Вы установили очередные обновления Windows и Вас постигла сия участь, а из опуса UnknownType вы мало что поняли, тогда продолжаем читать эту статью.                         Диагностика                 Самый первый шаг, который следует сделать, это зайти в Список устройств (прав.кн.мыши на ярлыке Мой Компьютер > Свойства > Диспетчер устройств). Если там такая картина:                 то в свойствах скорее всего будет полное отсутствие информации о драйверах, а само устройство внезапно получило PID равным 0000:                 Это значит, что с самой Arduino все в порядке!! Теперь скорее скачиваем драйвера версии 2.8.14 или более ранние. Устанавливаем на устройство сначала ftdibus, затем ftdiport. Если установка не проходит, поправим файл ftdibus.inf. Открываем его блокнотом и вместо PID_6001 вставляем PID_0000, сохраняем.                  Устанавливаем драйвера. Теперь в системе есть два конвертера, но работает только один. Так и должно быть, всё идёт по плану. Скачиваем утилиту FTDI MProg 3.5.                 Запускаем, находим в меню Tools > Read and Parse. Утилита сама прочитает всю информацию из чипа и распишет её по ячейкам.                 Теперь можно и (и нужно!) ввести в окошке Product ID «6001» (для FT232R(L)). Теперь заходим в меню, находим пункт File > Save As… и сохраняем файл конфигурации EEPROM на жёсткий диск. Без этой процедуры программа не позволит прошить чип. После чего комбинацией клавиш Сtrl+P ловко прошиваем нашу микросхему.                  Две – три секунды, и у нас снова рабочая микросхема! Теперь и прочитать данные можно. Вместо заключения                  Теперь главное проследите, чтобы на устройстве стояли правильные драйвера! Иначе очень скоро придётся заново повторять все приведённые действия. Статья в формате PDF  Лечим FTDI в картинках.PDF pdf, 497 КБ   ..
Вся статья

Добавлено: 09.10.2014

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

Ультразвуковой дальномер HC-SR04. Подключаем к Arduino.           В этой статье мы научимся работать с ультразвуковым дальномером HC-SR04. Как работает ультразвуковой дальномер? Устройство испускает ультразвук, который отражается от препятствий и в виде отражённой волны возвращается обратно. Измерив возвращения звука и зная скорость распространения звука, можно очень просто посчитать пройденное им расстояние. Модель дальномера HC-SR04 является самой простой и недорогой, однако обладает хорошими техническими характеристиками (измеряемый диапазон расстояний от 2 до 450 см). Именно поэтому данный модуль можно смело рекомендовать радиолюбителям.           Описание принципа работы ультразвукового дальномера HC-SR04 можно разделить на следующие шаги:                 Шаг 1: На вход Trig подаётся импульс длительностью 10 микроСекунд. Для дальномера это команда начать измерение расстояния перед ним.                 Шаг 2: Устройство генерирует 8 ультразвуковых импульсов с частотой 40 кГц через выходной сенсор T.                 Шаг 3: Звуковая волна отражается от препятствия и попадает на принимающий сенсор R.                 Шаг 4: На выходе Echo формируется импульс, длительность которого прямо пропорциональна измеренному расстоянию.                 Шаг 5: На стороне управляющего контроллера переводим длительность импульса Echo в расстояние по формуле: ширина импульса(мкс) / 58 = дистанция (см).           Ниже на рисунке приведены временные диаграммы, наглядно поясняющие перечисленные шаги.                              Теперь, когда мы разобрались с устройством ультразвукового дальномера HC-SR04, подключим его к нашему Arduino по следующей схеме:           Собрав схему, нам остаётся только залить скетч для работы. Ниже приведён пример такого скетча. В нём информация о расстоянии будет выводиться в COM порт компьютера, а также при измеренной дистанции менее 30 см загорится светодиод, подключенный к 13 пину Arduino. Пример программного кода: #define Trig 9 #define Echo 8 #define ledPin 13 void setup() { pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); Serial.begin(9600); /* задаем скорость общения. В нашем случае с компьютером */ } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm<30) // Если расстояние менее 30 сантиметром { digitalWrite(ledPin, HIGH); // Светодиод горит } else { digitalWrite(ledPin, LOW); // иначе не горит } delay(100); /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ } Дополнительный пример работы:         Взаимодействие дальномера и сервопривода. Дистанция, измеряемая дальномером, преобразуется в угол поворота сервопривода. #include <Servo.h> #define coef 10 //(коэффициент соответствия 10 градусов на 1см) #define dead_zone 4 #define max_value 22 #define servoPin 11 #define Trig 9 #define Echo 8 #define ledPin 13 Servo myservo; void setup() { pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); myservo.attach(servoPin); myservo.write(0); } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime = pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm = impulseTime/58; // Пересчитываем в сантиметры if (distance_sm >= dead_zone && distance_sm <= max_value) { myservo.write(coef * (distance_sm - dead_zone)); } else if (distance_sm < dead_zone)// если дистанция менее 4 см, серва в положении ноль градусов { myservo.write(0); } else { myservo.write(180); } delay(100); /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ }   Статья в формате PDF  Подключаем УЗ дальномер.PDF pdf, 696 КБ                 ..
Вся статья

Добавлено: 09.10.2014