воскресенье, 13 декабря 2015 г.

Регулятор оборотов электродвигателя.

Одним из наиболее эффективных способов управления частотой вращения вала электродвигателя является использование широтно импульсной модуляции (ШИМ) мощности передаваемой на этот двигатель. Создать простой и эффективный ШИМ регулятор можно на микросхеме-таймере NE555 (или LM555). Такой регулятор может управлять электронным ключом замыкающим источник напряжения на электродвигатель с частотой ШИМа, ключ может быть для переменного или для постоянного тока. Схема регулятора, без ключа, приведена на рисунке:

На выходе такого регулятора имеется импульсное напряжение (на выходе output относительно GND) когда он работает, частота этого напряжение не меняется а скважность можно регулировать крутя или перемещая ручку (или чего у него там есть) потенциометра R3 (т.е. можно делать импульс длиннее или короче при этом не меняя время через которое появляется фронт следующего импульса (начало следующего импульса)). Ниже приведены схемы для регулировки оборотов электродвигателей.
 Схема регулятора оборотов электродвигателя переменного тока приведена на рисунке:

Рисунок 3 - Регулятор оборотов электродвигателя переменного тока

Схема регулятора оборотов электродвигателя постоянного тока приведена на рисунке:
Рисунок 4 - Регулятор оборотов электродвигателя постоянного тока

Некоторые подробности можно увидеть на видео:


Если сопротивление потенциометра будет больше то диапазон частот вращения вала двигателя тоже будет больше но также будет меньше частота ШИМа поэтому придётся уменьшить ёмкость конденсатора C1 т.к. если частота будет слишком низкой то возможно будет заметно "дёрганье двигателя" если частота будет слишком высокой то симисторный ключ не будет правильно открываться поэтому частота должна быть обязательно меньше 50Гц хотя бы в 10раз. Хорошо такой регулятор подходит для достаточно инерционных приборов например мощных электродвигателей, нагревателей, паяльников и т.д (регулировать обороты паяльника такой регулятор не будет но его температуру очень даже будет). 
И на последок некоторое количество ссылок по которым можно приобрести детали:
50штук таймеров 555 можно закупить перейдя по ссылке http://ali.pub/v5x9t (за 85р. на момент написания данного описания).
Опторонов 10шт. для переменного тока можно закупить по ссылке http://ali.pub/7gyq8
Симисторов 10шт. по ссылке http://ali.pub/ayhqv

Последнюю схему можно переделать для регулировки мощности какой либо другой нагрузки, например нагревателей:
Рисунок 5 - Регулировка мощности


КАРТА БЛОГА (содержание)

суббота, 21 ноября 2015 г.

Как сделать твердотельное реле.

Твердотельные реле более долговечные, быстродействующие и бесшумные чем обычные контактные электромагнитные реле т.к. не имеют движущихся частей. Однако у них есть и недостатки например большее сопротивление в открытом состоянии и меньшее в закрытом (при не изношенных контактах контактных реле), ограничение минимального коммутируемого напряжения а также большинство твердотельных реле предназначено либо для коммутации переменного тока либо для постоянного, есть универсальные (контактные реле почти всегда универсальные (твердотельные для переменного тока также имеют ограничение по частоте коммутируемого тока)) в данной статье рассмотрим реле для переменного тока на симисторе. Для того чтобы сделать такое реле нужно соединить детали обозначенные на схеме так как они соединены на этой схеме:
Рисунок 1 - Твердотельное реле


В данном реле используется симистор BT139-800E предельный ток которого 16А следовательно максимальная мощность нагрузки (прибора) не должна быть больше 220*16=3520Вт т.е. примерно 3.5кВт. Можно использовать любой другой подходящий симистор. Включается реле подачей на вход тока достаточного для зажигания инфракрасного светодиода на столько чтобы оптосимистор оптрона сработал (на практике хватает 15мА (см. видео ниже)). Для управления симистором используется специальный симисторный оптрон MOC3041. Процесс изготовления платы смотрите на видео ниже, процесс припаивания деталей показан не до конца т.к. долго и были ошибки (для избежания неприятных последствий рекомендуется проверять сборку перед включением устройства и устранить ошибки если они есть):


КАРТА БЛОГА (содержание)

воскресенье, 4 октября 2015 г.

Стабилизатор напряжения на LM317.

LM317 - это недорогая микросхема стабилизатор напряжения со встроенной защитой от короткого замыкания на выходе и от перегрева, на LM317 может быть изготовлен простой в сборке линейный стабилизатор постоянного напряжения которое м.б. регулируемым. Такие микросхемы бывают в разных корпусах например в ТО-220 или в ТО-92. Если корпус ТО-92 то последние две буквы названия будут LZ т.е. так: LM317LZ, цоколёвки этой микросхемы в разных корпусах различаются поэтому нужно быть внимательнее, также существуют такие микросхемы в smd корпусах. Заказать LM317LZ оптом небольшой партией можно по ссылке: LM317LZ (10шт.), LM317T по ссылке: LM317T (10шт.). Рассмотрим схему стабилизатора:
Рисунок 1 - Стабилизатор постоянного напряжения на микросхеме LM317LZ

Данный стабилизатор помимо микросхемы содержит ещё 4 детали, резистором R2 регулируется напряжение на выходе стабилизатора. Для простоты сборки можно воспользоваться схемой:
Рисунок 2 - Стабилизатор постоянного напряжения на микросхеме LM317LZ

Все стабилизаторы постоянного напряжения делятся на 2 типа это:
1) линейные (как например в нашем случае т.е. на LM317),
2) импульсные (с большими КПД и для более мощных нагрузок).
Принцип работы линейных (не всех) стабилизаторов можно понять из рисунка:
Рисунок 3 - Принцип работы линейного стабилизатора

Из рисунка 3 видно то что такой стабилизатор представляет собой делитель нижним плечом которого является нагрузка а верхним сама микросхема. Напряжение на входе меняется и микросхема изменяет своё сопротивление так чтобы на выходе напряжение было неизменным. Такие стабилизаторы обладают низким КПД т.к. часть энергии теряется на микросхеме. Импульсные стабилизаторы тоже представляют собой делитель только у них верхнее (или нижнее) плечо может либо иметь очень низкое сопротивление (открытый ключ) либо очень высокое (закрытый ключ), чередованием таких состояний создаётся ШИМ с высокой частотой а на нагрузке напряжение сглаживается конденсатором (и/или ток сглаживается дросселем), таким образом создаётся высокое КПД но из за высокой частоты ШИМа импульсные стабилизаторы создают электромагнитные помехи. Существуют также линейные стабилизаторы в которых элемент осуществляющий стабилизацию ставиться параллельно нагрузке - в таких случаях этим элементом обычно является стабилитрон и для того чтобы осуществлялась стабилизация на это параллельное соединение подаётся ток от источника тока, источник тока делается путём установки последовательно с источником напряжения резистора с большим сопротивлением, если напряжение подавать на такой стабилизатор непосредственно то стабилизации не будет а стабилитрон скорее всего перегорит.

Выходное напряжение можно рассчитать по формуле:
Где для LM317 (а также для LM217, LM117):

Также для расчёта можно воспользоваться программой:
Требуемое напряжение на выходе UOUT=В
Сопротивление резистора R1=Ом (рекомендуеся оставить 240 Ом)

Сопротивление резистора R2=Ом
Сопротивление резистора R2 из ряда E24=Ом

КАРТА БЛОГА (содержание)

понедельник, 21 сентября 2015 г.

Машинка на радиоуправлении своими руками.

Наиболее просто реализовать радиоуправление самодельной машинкой, при этом делая что либо самостоятельно, можно используя радиомодули NRF24L01+ (можно заказать по ссылке), плату Ардуино например Arduino UNO (купить по ссылке) (или любую другую Ардуино или подобную плату). Также понадобятся драйверы для управления двигателями, можно использовать например L293D если двигатели потребляют ток до 600мА, сами двигатели, батарейки и некоторые дополнительные элементы. В рулевой системе машинки можно установить такой же линейный актуатор с шаговым двигателем которые используются в дисководах. Механика рулевой системы должна быть такой чтобы не было необходимости в большой силе двигателя для того чтобы осуществить поворот. Если поворот осуществляется достаточно легко то можно сделать полношаговое управление двигателем с использованием одной фазы на каждом шаге, если при всех стараниях не получилось сделать достаточно легко поворачивающиеся передние колёса то для решения проблемы поворота можно сделать полношаговое управление с использованием двух фаз на каждом шаге и немного увеличить напряжение питания при этом увеличиться момент и потребление тока в следствии чего батарейки будут быстрее разряжаться но зато рулевая система будет более надёжной. Для движения вперёд и назад можно использовать любой подходящий и достаточно мощный коллекторный электродвигатель постоянного тока в котором реверс осуществляется сменой полярности подаваемого на него напряжения. У большинства таких двигателей обороты слишком большие и момент слишком мал для того чтобы можно было использовать прямую передачу на колёса без редуктора (например надев колесо на вал двигателя). Редуктор можно использовать готовый или изготовить самостоятельно. Если редуктор изготавливается самостоятельно но необходимо уделить достаточно внимания его изготовлению и по возможности избежать фрикционных и ремённых передач а делать только с шестерёнками, если этого не получилось то ремённые или фрикционные передачи необходимо делать очень качественно. При изготовлении механических частей машинки для скрепления частей можно использовать цианоакрилатный клей (например клей (можно заказать по ссылке) ) т.к. он достаточно прочно держит любые поверхности и быстро твердеет (такие клея твердеют не от высыхания а от контакта с влажными поверхностями (полимеризацию вызывает щелочная среда)). Простота изготовления электроники позволяет сосредоточиться на механике но давайте всё же рассмотрим схему приёмника:
Рисунок 1 - Приёмник

Радиомодуль NRF24L01+ взаимодействует с платой Arduino через интерфейс SPI. Питание 3.3В на радиомодуль идёт с платы Arduino (в плате есть стабилизатор напряжения). На саму плату Ардуино подаётся 9В от 6ти пальчиковых батареек соединённых последовательно. Это питание следует подавать через специальный разъём (понятно из рисунка 1). На плате есть стабилизатор на 5В. Между выводом GND и +3.3В радиомодуляNRF24L01+ стоит конденсатор для сглаживания пульсаций напряжения которые могут появляться например при работе двигателей. Драйверы запитываются непосредственно от батареек, один из драйверов целиком используется для управления шаговым двигателем, другой для управления коллекторным, светодиодными фонарями и пьезодинамиком. Пьезодинамик можно поставить на тот же полумост драйвера что и фонари т.к. он издаёт звуки только от переменного напряжения. Скетч в Ардуино загружается при отключенном питании. Давайте рассмотрим скетч:

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);

const uint64_t pipe = 0xF0F0F0F0E1LL;

char data = 'z';
char data_turning = 's';
//20 binary 00010100
//24 binary 00011000
//40 binary 00101000
//36 binary 00100100
unsigned char arr[4]={20,24,40,36};
unsigned char counter = 0;
unsigned char out_condit = 0;
unsigned char out_going = 0;
void stepper_rotate()
{
             if (data_turning == 'l')
             {
               counter++;
               if(counter3)counter=0;
               out_condit = arr[counter];
             }
             else if (data_turning == 'r')
             {
                if(counter==0)
                {
                    out_condit = arr[0];
                    counter=3;
                }
                else
                {
                    out_condit = arr[counter];
                    counter--;
                }
             }
             else if(data_turning == 's')
             {
             out_condit = 0;
             }
}
void bebep()
{
      for(int i=0;i5000;i++)  
     {
        digitalWrite(8, HIGH);
        delayMicroseconds(100);
        digitalWrite(8, LOW);
        delayMicroseconds(100);
      }
}
void setup(void)
{
  radio.begin();
  radio.setRetries(15,15);
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
}

void loop(void)
{
  if ( radio.available() )
  {
    radio.read( &data, sizeof(char) );
    switch(data)
    {
      //мотор
      case 'a':
        out_going = 128;
      break;
      case 'b':
        out_going = 64;
      break;
      case 'c':
        out_going = 0;
      break;
      //фары
      case 'd':
        digitalWrite(8, HIGH);
      break;
      case 'e':
        digitalWrite(8, LOW);
      break;
      //гудок
      case 'f':
        bebep();
      break;
      //руль
      case 'r':
        data_turning = 'r';
      break;
      case 'l':
        data_turning = 'l';
      break;
      case 's':
        data_turning = 's';
      break;
    }
  }
    //руль
    stepper_rotate();
    PORTD &= 195;//binary 11000011
    PORTD |= out_condit;
    //мотор
    PORTD &= 63;//binary 00111111
    PORTD |= out_going;
 
    delay(12);
}

Это скетч для приёмника, в первых трёх строчках этого скетча подключаются заголовочные файлы для простой реализации связи по SPI и использования радиомодуля NRF24L01+. Следующая строка - это создание экземпляра класса "RF24", первым параметром в конструктор этого класса передаётся номер пина Ардуино который следует соединить с CE радиомодуля а вторым параметром - номер пина который следует соединить с CSN радиомодуля. Следующая строка - это адрес канала, он должен быть одинаковым у приёмника и передатчика. Далее идёт инициализация переменных. В переменную "data" записывается принятый по радио символ. В переменную "data_turning" записывается символ который определяет будет ли вращаться ротор шагового двигателя рулевой системы и если да то в какую сторону. Далее идёт массив состояний порта для управления шаговым двигателем. Переменная "counter" вспомогательная для функции управления шаговым двигателем. Дальше идёт функция управления шаговым двигателем "stepper_rotate()" после неё идёт функция создания гудка "bebep()". В функции "setap" происходит инициализация радиомодуля и выводов Ардуино. В функции "loop" принимается символ и в соответствии с принятым символом совершаются определённые действия.
Передатчик можно изготовить на любом Ардуино. Рассмотрим схему передатчика:
Рисунок 2 - Передатчик

У каждого Arduino есть выводы SPI но обычно на плате они не подписаны, выяснить где эти выводы находятся можно из документации на конкретное Arduino. На рисунке 2 показан джойстик, джойстик обычно можно представить в виде набора кнопок. Если соответствующая кнопка нажата то на соответствующем выводе Arduino появиться низкое напряжение (логический ноль), если кнопка не нажата то на выводе будет высокое напряжение (логическая единица) т.к. этот вывод соединён с +5В через резистор с сопротивлением 10кОм (можно использовать резистор с другим близким к 10кОм сопротивлением) эти +5В берутся с вывода Ардуино. Ардуино можно питать одной батарейкой "Крона" на 9В, это питание также подаётся на Arduino через специальный разъём. Скетч также загружается при отключенном питании. Скетч для передатчика:


#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);

const uint64_t pipe = 0xF0F0F0F0E1LL;
char data='a';

boolean but_forward_before;
boolean but_forward;
boolean but_back_before;
boolean but_back;
boolean but_left_before;
boolean but_left;
boolean but_right_before;
boolean but_right;
boolean but_fire_before;
boolean but_fire;

void sendData()
{
     radio.openWritingPipe(pipe);
     radio.startListening();
     radio.write( &data, sizeof(char) );
     delay(20);
}

void setup(void)
{
  //Serial.begin(57600);
  radio.begin();
  radio.setRetries(15,15);
  radio.openWritingPipe(pipe);
  radio.startListening();
  //установки для кнопок
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
  pinMode(4, INPUT);
  digitalWrite(4, HIGH);
  pinMode(5, INPUT);
  digitalWrite(5, HIGH);
  pinMode(6, INPUT);
  digitalWrite(6, HIGH);
}

void loop(void)
{
   but_forward = digitalRead(2);
   but_back = digitalRead(3);
   but_left = digitalRead(4);
   but_right = digitalRead(5);
   but_fire = digitalRead(6);
 
   if(but_forward_before && !but_forward)
   {
     data = 'a';
     sendData();
   }
   else if(but_back_before && !but_back)
   {
     data = 'b';
     sendData();
   }
   else if((!but_forward_before && but_forward) || (!but_back_before && but_back))
   {
     data = 'c';
     sendData();
   }
   if(but_left_before && !but_left)
   {
     data = 'l';
     sendData();
   }
   else if(but_right_before && !but_right)
   {
     data = 'r';
     sendData();
   }
   else if((!but_left_before && but_left) || (!but_right_before && but_right))
   {
     data = 's';
     sendData();
   }
   if(but_fire_before && !but_fire)
   {
     data = 'f';
     sendData();
   }
 
   but_forward_before = but_forward;
   but_back_before = but_back;
   but_left_before = but_left;
   but_right_before = but_right;
   but_fire_before = but_fire;
   delay(80);
}

Первые 6 строчек аналогичны тем что в скетче для приёмника, далее идут переменные которые используются для хранения текущих и предыдущих состояний кнопок джойстика. Функция "sendData()" отсылает символ который записан в переменной "data". В функции "setup" происходит инициализация радиомодуля и настройка необходимых выводов. В функции "loop" происходит отправка символа для движения вперёд если кнопка "вперёд" переходит из не нажатого состояния в нажатое, если тоже самое происходит в кнопкой "назад" то отсылается символ для движения машинки назад, если кнопка "вперёд" переходит из нажатого состояния в ненажатое или кнопка "назад" переходит из нажатого состояния в не нажатое то отправляется символ для остановки машинки, аналогично и для рулевой системы, есть ещё символ для гудка и он отправляется если кнопка "гудок" переходит из не нажатого состояния в нажатое. В общем скетчи достаточно простые, скачать их можно по ссылке: https://yadi.sk/d/K0HfKwcojCuaX.
Корпус лучше сделать из картона т.к. он не мешает прохождению радиосигнала, к тому же его можно красиво раскрасить:
Процесс сборки (неполный и ускоренный для экономии времени) машинки с некоторыми комментариями а также демонстрацию работы можно увидеть на видео:

КАРТА БЛОГА (содержание)

четверг, 6 августа 2015 г.

Простое управление приборами с компьютера.

Имея плату Arduino (можно заказать по этой ссылке http://ali.pub/1v22bh), компьютер, некоторые детали, инструменты любой желающий сможет организовать простое управление бытовыми приборами с этого компьютера. Множество приборов используемых в быту имеют множество функций, например большинство современных телевизоров могут показывать некоторое количество разных каналов, у вентилятора м.б. некоторое количество разных режимов работы и т.д. Для того чтобы сделать такое сложное управление как например переключение каналов или режимов работы, помимо перечисленного выше понадобятся дополнительные знания, детали и инструменты но сделать простое включение и выключение под силу каждому кто это перечисленное имеет. Arduino связывается с компьютером через USB порт, передачу информации с компьютера на Arduino можно осуществлять через среду разработки для Arduino (называется Arduino IDE) которую можно скачать с страницы на официальном сайте Arduino. Существует множество разнообразных модулей для взаимодействия Arduino с внешним миром, например специальный модуль с блоком реле для коммутации нагрузок, при использовании таких модулей работа сильно упрощается, здесь же мы рассмотрим самостоятельное изготовление модуля с одним реле для включение/выключения бытовых приборов, при необходимости можно изготовить более одного такого модуля и использовать их с одним Arduino тем самым сделав возможным простое управление множеством бытовых приборов. Arduino (любое) имеет некоторое количество выводов общего назначения которые обозначаются, на плате, просто цифрами или цифрами с волнистым знаком "~". Подключив Arduino к компьютеру и записав в него (в Ардуино) специальный скетч (программа для Arduino) можно с этого компьютера через программу "Arduino IDE" управлять этими выводами делая на них высокое напряжение (примерно +5В (HIGH)) или низкое (примерно 0В (LOW)). Также на Arduino есть вывод "GND" (на плате так и обозначен). Если на одном из выводов общего назначения высокое напряжение то подключив что либо проводящее ток между этим выводом и выводом "GND" через то что подключено потечёт электрический ток и величина этого тока будет зависеть от сопротивления этого предмета и рассчитать её можно по закону Ома, т.е. чем меньше сопротивление том больше ток, но если сопротивление будет слишком низким то через Arduino потечёт слишком большой ток и оно перегорит. Максимальный ток который может выдать вывод общего назначения Arduino может быть разным в зависимости от используемого в нём микроконтроллера но обычно это 40мА = 0.04А - этого может быть недостаточно для того чтобы включить реле которое будет включать прибор (приборы) поэтому для усиления тока необходимо использовать дополнительный элемент например биполярный транзистор. Биполярный транзистор имеет три вывода: эмиттер, коллектор, база. Максимальный ток транзистора также ограничен как и у Ардуино и обычно он больше, например у популярного КТ315 максимальный ток равен 100мА = 0.1А. Биполярные транзисторы бывают двух типов n-p-n и p-n-p использовать можно оба типа но по разному и далее рассмотрим использование транзистора КТ315 тип которого n-p-n. Для того чтобы транзистор усилил ток из Ардуино необходимо соединить его базу с выводом Ардуино ЧЕРЕЗ РЕЗИСТОР сопротивлением 1кОм (на резисторе м.б. написано 1к), эмиттер этого транзистора соединить с "GND" Arduino и минусом питания или "GND" источника питания напряжение которого равно напряжению обмотки имеющегося реле (допустим 12В) один из выводов обмотки реле соединить с коллектором транзистора другой с плюсом источника питания (+12В допустим) и ещё одной не влияющей на усиление но ОЧЕНЬ важной деталью является диод который нужно соединить анодом с коллектором и катодом с плюсом источника питания (+12В). Если диод импортный то на скорее всего на его корпусе будет светлая полоса - она указывает на катод, другой вывод диода это анод. Оставшиеся выводы реле - это выводы его контактов, если их два и они не замкнуты то при подаче достаточного тока на обмотку реле эти контакты замкнуться, их нужно соединить последовательно с прибором и это последовательное соединение можно втыкать в розетку, тогда при замыкании контактов на прибор поступит 220В и он включиться. Описанное выше можно изобразить на картинке:
Рисунок 1 - Управление прибором с компьютера

Это нестандартная схема для лучшего понимания, обычно используют схемы такие:
Рисунок 2 - Управление прибором с компьютера 

Хотя в этой схеме тоже присутствует нестандартное обозначение платы Ардуино. На рисунке обозначено Arduino UNO (можно заказать по этой ссылке http://ali.pub/1v22bh) но можно использовать и любое другое. Соединения можно делать например на макетной плате и проводами или пайкой. После того как всё правильно соединено и проверено можно подключить Ардуино по USB к компьютеру и загрузить в неё скетч:

char pc_code=0;

void setup()
{
pinMode(2, OUTPUT);
Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    pc_code = Serial.read();
    if(pc_code=='a')
    {
      digitalWrite(2, HIGH);
    }
    else if(pc_code=='b')
    {
      digitalWrite(2, LOW);
    }
  }
}

О том как правильно настроить Ардуино и загрузить в неё скетч уже описано на странице "Простое управление шаговым двигателем с компьютера через ардуино". Далее для включения прибора необходимо на Ардуино отослать символ "a" для выключения символ "b". Для того чтобы отослать символ на ардуино можно, в среде Arduino IDE, войти по вкладке Инструменты-Монитор последовательного порта и в появившемся окне в верхнем текстовом поле вписывать символы и отсылать нажатием кнопки "отправить" символ придёт на ардуино и для данного случая если отослать символ "a" то прибор включиться, если "b" то соответственно выключиться. Если Ардуино не принимает символы то нужно в правом нижнем углу окна монитора последовательного порта установить такую же скорость какая прописана в скетче т.е. 9600 бод. Для того чтобы включать 2 прибора можно немного изменить скетч:

char pc_code=0;

void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    pc_code = Serial.read();
    if(pc_code=='a')
    {
      digitalWrite(2, HIGH);
    }
    else if(pc_code=='b')
    {
      digitalWrite(2, LOW);
    }
    else if(pc_code=='c')
    {
      digitalWrite(3, HIGH);
    }
    else if(pc_code=='d')
    {
      digitalWrite(3, LOW);
    }
  }
}

Второй модуль с реле надо аналогично подключать к выводу 3 Ардуино а для его включения посылать "c" для выключения "d". Аналогично можно изменить скетч для управления большим количеством реле также можно через одно реле подключать параллельно несколько приборов но ток потребляемый всеми приборами не должен превышать максимальный ток контактов реле. Процесс сборки, демонстрацию работы и некоторые дополнительные рекомендации можно увидеть на видео:
Часть 2

Часть 3

Доработанная программа для управления приборами  UniversalRelay 2.
Часть 4 (создание программы)

Последняя часть



Итоговая версия программы : https://yadi.sk/d/1rN2Oghv3aLmh2

КАРТА БЛОГА (содержание)

понедельник, 3 августа 2015 г.

Контроллер шагового двигателя.

Контроллер для непосредственного управления шаговым двигателем является наиболее удобным устройством для использования с такими двигателями в случаях когда не требуется сложное программное управление. Если стоит задача изготовить такой контроллер то перед разработчиком возникает ряд трудностей, например изготовление интерфейса для удобного использования данного контроллера, решить эту задачу можно разными способами. Один из способов это использование аналогового устройства ввода (потенциометра, энкодера и т.д.) для регулировки скорости и кнопок для запуска, реверса и остановки. Такой способ хорош в случаях когда в данном контроллере планируется использовать микроконтроллер со встроенным АЦП, имеется возможность подключения недорогого энкодера или др. Также можно использовать семисегментный индикатор для отображения скорости и кнопки для всего управления контроллером. Ещё одной проблемой является организация управления самим двигателем. При всей кажущейся простоте данной задачи всё же могут возникнуть проблемы с недостаточной производительностью или памятью микроконтроллера, например в случае если необходим микрошаговый режим управления двигателем и большие обороты то не каждый микроконтроллер сможет с этим справиться, но полушаговый режим с отображением на семисегментный индикатор - задача посильная даже для микроконтроллера например PIC16F84. Рассмотрим схему:

Рисунок 1 - Контроллер шагового двигателя

Если например необходимо 4 вывода общего назначения задействовать как входы (4 для кнопок и 2 для датчиков крайнего положения) и с учётом того что для управления двигателем нужно 4 провода то на вывод на индикатор останется только два вывода микроконтроллера. Решить проблему можно например использованием дополнительной микросхемы двоичного счётчика например 4024, в таком случае один вывод микроконтроллера можно соединить с выводом RESET счётчика а другой вывод микроконтроллера соединить с выводом CLOCK счётчика тогда подав импульс сначала на RESET потом пачку импульсов количество которых равно коду для высвечивания на индикаторе нужной цифры можно высветить на индикаторе нужную цифру. У счётчика имеется 7 выводов для отображения цифры а у индикатора семь выводов для отображения цифры и один для отображения точки. Для отображения точки можно оставшийся вывод микроконтроллера соединить с выводом для отображения точки на индикаторе а выходные выводы счётчика соединить входными выводами индикатора так как будет удобнее для разводки платы по тому что составить коды для цифр по схеме будет проще чем мучиться со сложной разводкой. В ходе проверки было выяснено что выход RA4/TOCKI микроконтроллера PIC16F84 является выходом с открытым стоком т.е. он может только просаживать на землю но не подтягивать к питанию поэтому для решения этой проблемы был установлен резистор R24. Все проблемы на этапе разработки решить всё же не удалось т.к. семисегментный индикатор светит достаточно тускло но в общем и целом контроллер работоспособен.


Демонстрация работы на видео:

Программа для микроконтроллера писалась в среде MikroC, скачать проект можно по ссылке: https://yadi.sk/d/XPxB278qiF4uz.

КАРТА БЛОГА (содержание)

воскресенье, 12 июля 2015 г.

Дальномер на Arduino

Изготовить дальномер можно имея плату Arduino UNO (можно заказать по этой ссылке http://ali.pub/1v22bh) (или любое другое Arduino), датчик HC-SR04 (можно заказать по этой ссылке) (ультразвуковой датчик расстояния), провода и компьютер с USB портом для подключения Arduino, записи в него скетча и вывода на монитор расстояния.
Схема подключения:
Рисунок 1 - Ультразвуковой дальномер на ардуино

Соединять датчик с Ардуино можно любым доступным способом так чтобы образовались токопроводящие пути от вывода Vcc датчика до вывода 5V Ардуино, от Trig датчика до 12 вывода Ардуино, от Echo датчика до 11 вывода Ардуино и от Gnd датчика до GND Ардуино. Вместо выводов 11 и 12 можно использовать любые другие выводы общего назначения но для использования примера NewPing нужно использовать именно 11 и 12 и соединить так как показано на рисунке 1.

Для использования HC-SR04 также понадобиться библиотека NewPing в которой имеется пример скетча для измерения расстояния с использованием датчика HC-SR04. После скачивания библиотеки её необходимо разархивировать и поместить в папку "libraries" которая находится в папке "arduino-nightly" (в которой находиться среда разработки Arduino). После того как NewPing перемещена её можно открыть и там будет папка с примерами "examples" в этой папке будет пример "NewPingExample" открыв этот пример и загрузив скетч в Arduino получаем готовый ультразвуковой дальномер. Если загрузка скетча прошла успешно то увидеть результаты измерения датчика можно открыв вкладку "Инструменты" и выбрав "Монитор последовательного порта" или нажав сочетание клавиш Ctrl+Shift+M.
Если выводятся непонятные символы то в левом нижнем углу открывшегося окна монитора последовательного порта нужно открыть окно и в выпадающем списке выбрать скорость ту что прописана в скетче т.е. 115200 бод.
Если расстояние от датчика до какого либо предмета (в направлении от лицевой стороны этого датчика где находятся две цилиндрические штуки) больше 200 см то в окне будет выводиться 0 или ещё какая нибудь ерунда. Датчик может мерить расстояние до 400 см. При желании скетч можно переделать и определять большее расстояние.

КАРТА БЛОГА (содержание)

суббота, 4 июля 2015 г.

Радиоуправляемая машинка своими руками.

Изготовление электроники радиоуправляемой машинки можно значительно упростить если использовать микросхемы радиотрансиверы. Одной из таких микросхем является MRF49XA работающая с небольшим количеством обвязки (кварцевый резонатор и несколько конденсаторов). Данная микросхема может работать с радиоволнами с частотой 915МГц, при такой частоте можно использовать небольшую антенну без согласования что тоже упрощает изготовление электроники. Т.к. множество элементов для приёма, передачи и других функций содержится в одной микросхеме в SMD корпусе то систему радиоуправления можно сделать очень небольшой что хорошо подходит для небольших радиоуправляемых моделей. Для взаимодействия с MRF49XA можно использовать микроконтроллер. Обмен информацией между MRF49XA и микроконтроллером осуществляется через интерфейс SPI и некоторое количество дополнительных линий. Т.к. по SPI осуществляется синхронная передача то частота передачи может сильно меняться, быть небольшой и это не будет мешать передаче данных. Передача по SPI просто реализуется программно поэтому можно использовать микроконтроллеры без аппаратного SPI например ATtiny2313. Схема передатчика м.б. например такой:
Рисунок 1 - Передатчик

Конденсаторы C2 и C3 необходимо как можно ближе расположить к микросхеме DD2, конденсатор C3 нужен для нормальной инициализации радиотрансивера MRF49XA в момент подачи питания. Кварцевый резонатор ZQ1 д.б. на 10 МГц (в крайнем случае м.б. на 9 или 11). Петлевая антенна (в виде прямоугольника) вытравливается на плате точно по размерам из документации Antenna Selection Guide for the Si4020 and Si4320 ISM Band FSK Transmitter/Receiver Chipset (страница 8 рисунок (Fig) 2.1 (на момент написания статьи)). Схема приёмника м.б. например такой:
Рисунок 2 - Приёмник

Антенна, кварцевый резонатор и конденсаторы д.б. такими же как и в передатчике и располагаться также. Для усиления сигналов с микроконтроллера и управления двигателями может использоваться драйвер например L293D. С таким приёмником можно например сделать машинку с двумя двигателями один из которых будет крутить колёса с правой стороны а другой с левой, тогда поворот будет осуществляться тогда когда колёса крутятся в разные стороны или колёса с одной стороны крутятся а с другой стоят. Можно сделать машинку с двигателем двигающим её вперёд/назад и рулевой системой для поворотов. Для рулевой системы для поворотов можно использовать миниатюрный актуатор с шаговым двигателем для дисководов. Для управления таким двигателем можно сделать отдельное небольшое устройство:
Рисунок 3 - Контроллер шагового двигателя с драйвером.

Для того чтобы крутить шаговый двигатель в одну сторону подаётся низкое напряжение на input1 для того чтобы крутить в другую низкое напряжение подаётся на input2. соединить устройства можно например так:
Рисунок 4 - Пример соединения

Проекты с исходными кодами для приёмника, передатчика и контроллера шагового двигателя находятся по ссылке: https://yadi.sk/d/bTpG8B2xhfcBi. ATtiny2313 можно программировать прямо в плате через программатор stk200 и среду WinAVR, для PIC16F84 лучше сделать панельку в которую он будет вставляться после программирования JDM программатором (или другим) и программу IC-prog (или другую).
Тест драйв, рекомендации по изготовлению и некоторые другие смотрите в видео:

Ссылки с полезной информацией на используемые сайты:
Возня с MRF49XAmicrochip MRF49XA.

Заказать микросхемы MRF49XA 10шт.(меньше не нашёл), attiny2313 корпус SOP20 (большой smd с 20ю выводами) 5шт, l293d sop20 5шт.

КАРТА БЛОГА (содержание)

воскресенье, 14 июня 2015 г.

Датчик скрытой проводки.

Для поиска скрытой проводки может быть применено простое в изготовлении устройство на одной микросхеме содержащей в себе хотя бы 2 элемента "НЕ" (или любых других элементов которыми можно заменить "НЕ" например "2И-НЕ", "3И-НЕ", "2ИЛИ-НЕ" и т.д.), датчик срабатывает при поднесении резистора к проводке и чем ближе к ней этот резистор тем громче шумит пьезодинамик. Схема устройства приведена на рисунке:
Рисунок 1 - Датчик скрытой проводки

Микросхема CD4049 (первые буквы м.б. любые) достаточно распространённая, её можно приобрести в местных магазинах радиодеталей или заказать не дорого. Пьезодинамик любой маломощный обычно они дешёвые, резистор сопротивлением 2.7МОм тоже не дорогая деталь. Питание на микросхему подаётся от батарейки "Крона" на 9В но можно и другое. В настройке устройство не нуждается и после правильной сборки работает сразу же. Принцип действия устройства основан на чувствительности входа КМОП микросхемы к наводкам напряжения. Пъезодинамик подключён между выходами двух элементов "НЕ" работают в противофазе. Выход каждого элемента "НЕ" КМОП микросхемы является полумостом на полевых транзисторах поэтому пьезодинамик подключён к полному мосту -это повышает громкость звука издаваемого пьезодинамиком. Излучает пьезодинамик при поднесении резистора к проводке с частотой сети 50 Гц.
Самодельное устройство по сумме стоимости всех деталей выходит меньше 100р. (меньше 2$ на момент написания данной статьи). Готовые изготовленные подобные устройства стоять примерно 1000р. но в основном дороже и в редких случаях меньше (на момент написания данной статьи).

КАРТА БЛОГА (содержание)

воскресенье, 7 июня 2015 г.

Почему шаговые двигатели потребляют большой ток?

Многие любители собирающие устройства с шаговыми двигателями сталкиваются с такой проблемой шаговых двигателей как большое потребление тока, проявляется эта проблема в нагреве драйвера используемого для управления двигателем, часто винят в это проблеме драйвер (обычно L298) и пытаются найти ему замену. В данной статье мы выясним почему драйвер нагревается и как решить данную проблему. Если сравнивать шаговый двигатель с коллекторным (который тоже часто используется например в серводвигателях) то у коллекторных такой проблемы нет до тех пор пока нагрузка на их валу не станет больше предельно допустимой, разница между двумя этими типами двигателей заключается в том что у коллекторных двигателей переключение тока между обмотками осуществляется автоматически внутри самого двигателя а у шаговых переключение осуществляется внешним устройством т.е. драйвером который управляется контроллером. Это приводит к тому что при работе шагового двигателя возникают длительные промежутки времени когда ротор не вращается а ток идёт через обмотку. В эти промежутки времени ток через обмотку ограничивается только активным сопротивлением этой обмотки поэтому сопротивление обмоток шагового двигателя д.б. таким чтобы ток протекающий через обмотку был меньше предельно допустимого тока для используемого драйвера:
Предельный ток драйвера можно узнать из документации на него, ток обмотки шагового двигателя можно узнать из документации на этот шаговый двигатель или рассчитать по закону Ома из напряжения данного двигателя и сопротивления обмотки которое можно найти в документации или измерить омметром или мультиметром. Но драйвер и обмотки всё равно будут нагреваться поэтому на драйвер необходимо ставить большой радиатор. Также для уменьшения нагрева необходимо не делать слишком длинные импульсы напряжения на обмотках. В коллекторных двигателях проблемы с перегревом не появляются потому что прохождению тока через его обмотки препятствуют ЭДС самоиндукции обмоток и ЭДС возникающая при вращении ротора. Т.к. ротор всё время (пока подано питание) крутиться в коллекторных двигателях то и ток всё время ограничивается. Принцип работы шагового двигателя наглядно иллюстрируется на простом примере:
Рисунок 1 - Принцип работы шагового двигателя и ограничение тока в обмотке

Чем больше активное сопротивление обмоток шагового двигателя тем меньше будет ток протекающий через обмотку во время когда ротор неподвижен но при этом, отчасти из за ЭДС (самоиндукции обмоток и наводимой магнитным полем вращающегося ротора)(т.к. приходится увеличивать число витков) которые препятствуют прохождению тока, максимальная скорость вращения ротора будет тем меньше чем больше это активное сопротивление.
Если драйвер подходит для данного двигателя по току то проблему перегрева драйвера можно решить изменив способ управления шаговым двигателем, например можно подавать на обмотки импульсы напряжения определённой длительности такой чтобы ротор успевал повернуться на нужный угол но не более, далее если необходимо чтобы в момент когда ротор не вращается он удерживался магнитным полем в таком положении то можно подавать на обмотку импульсы напряжения со скважностью достаточной для удержания и такой чтобы перегрев не был слишком большим. При использовании современных способов управления шаговым двигателем (например Arduino) этого можно добиться экспериментально или же можно попытаться рассчитать длительности импульсов.



КАРТА БЛОГА (содержание)

пятница, 1 мая 2015 г.

Простое управление шаговым двигателем с компьютера через ардуино.

Используя плату ардуино (можно заказать по этой ссылке http://ali.pub/1v22bh) можно создать устройство для связи драйвера шагового двигателя с компьютером через USB порт. Причём это устройство в сборке будет достаточно простое для того чтобы его смог собрать любой не только радиолюбитель но и даже любой умеющий работать руками человек (при наличии готового драйвера и источника питания).

Если используется Arduino UNO R3 то его можно подключить к компьютеру через переходник для подключения принтера. Если в этом Arduino используется микросхема CH340G то на компьютер необходимо установить драйвер для этой микросхемы. После подключения ардуино надо зайти в диспетчер устройств (в windows7 - правой кнопкой мыши по компьютер(мой компьютер) - свойства - диспетчер устройств) потом кликнуть по появившемуся неизвестному устройству, выбрать - установить драйвер, выбрать ранее скачанный драйвер и установить. Среду Arduino IDE для закачивания в Arduino скетчей и взаимодействия с Arduino можно бесплатно скачать из интернета. После установки драйвера (если это было необходимо т.к. для большинства Arduino драйвер скачивается вместе со средой Arduino IDE) среду необходимо настроить для этого во вкладке инструменты-порт выбирается порт который появился после подключения ардуино, установки драйвера в диспетчере устройств а также во вкладке инструменты-плата выбрать название используемого ардуино (например если используется ардуино уно то выбирается Arduino Uno). После настройки можно писать скетчи и загружать их нажатием кнопки "Вгрузить" (если среда на русском) если в коде есть ошибка то среда сообщит об этом в нижнем поле. Если на компьютере установлен антивирус Avast то, перед загрузкой скетча, его необходимо отключить на некоторое время (в windows7 -правой кнопкой мыши на значке avast-управление экранами avast!-отключить на 10 минут-в появившемся окне нажать "да"). Если всё таки аваст добрался до ардуино в момент загрузки и удалил файл objcopy то его надо будет достать и снова поставить на то место откуда он исчез, среда об этом напомнит при следующей попытке загрузки. Скетчи пишуться на языке C++ (или C или С подобном языке) и обычно состоят из двух функций "setup" (для кода который выполняется в начале один раз где обычно происходит инициализация портов и всего прочего), "loop" (что то вроде основного цикла (или основной цикл и есть) который повторяется постоянно после выполнения функции "setup"), инициализации переменных и возможно заголовочных файлов.
Рассмотрим один из возможных скетчей для управления шаговым двигателем с компьютера:

int d = 8;
int c = 9;
int b = 10;
int a = 11;
int delay_for_speed = 1000;
int message_for_motor = 0;
int condition_rotate = 0;
void setup()
{
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0) 
  {
    message_for_motor = Serial.read();
    Serial.println(message_for_motor);

      if(message_for_motor == 'l')
      {
        condition_rotate = 1;
      }
      else if(message_for_motor == 'r')
      {
        condition_rotate = 2;
      }
      else if(message_for_motor == 's')
      {
         condition_rotate = 0;
      }
      else if(message_for_motor == '1')
      {
        delay_for_speed=1000;
      }
      else if(message_for_motor == '2')
      {
        delay_for_speed=800;
      }
      else if(message_for_motor == '3')
      {
        delay_for_speed=400;
      }
      else if(message_for_motor == '4')
      {
        delay_for_speed=200;
      }
      else if(message_for_motor == '5')
      {
        delay_for_speed=100;
      }
      else if(message_for_motor == '6')
      {
        delay_for_speed=50;
      }
      else if(message_for_motor == '7')
      {
        delay_for_speed=20;
      }
      else if(message_for_motor == '8')
      {
        delay_for_speed=10;
      }
      else if(message_for_motor == '9')
      {
        delay_for_speed=5;
      }
  }
  
  if(condition_rotate == 0)
  {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    delay(delay_for_speed);
  }
  else if(condition_rotate == 1)
  {
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
  }
  else if(condition_rotate == 2)
  {
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
  }
}

Первые 7 строчек это инициализации переменных. Переменные a,b,c,d -это переменные соответствующие пинам 11,10,9,8 (соответственно). С этими пинами соединяются входы драйвера шагового двигателя выходы соединяются с обмотками шагового двигателя. Обмотки должны быть соединены правильно иначе ротор двигателя не будет крутиться. Пин 11 д.б. через драйвер управлять (подавать либо не нулевое напряжение либо нулевое) первым выводом первой обмотки, пин10 управлять вторым выводом первой обмотки, пин9 - первым выводом второй обмотки, пин8 - вторым выводом второй обмотки. Далее в коде следует функция "setup" в которой данные пины конфигурируются как выходы и устанавливается скорость приемопередатчика. Потом следует функция "loop" в которой при приёме символа 
if (Serial.available() > 0) 

выполняется запись этого символа

 message_for_motor = Serial.read();

 и далее в зависимости от того какой это символ либо устанавливается состояния вращения

       if(message_for_motor == 'l')//принят символ l (эл)
      {
        condition_rotate = 1; //остановка
      }
      else if(message_for_motor == 'r') 
      {
        condition_rotate = 2; //вращение в одну сторону
      }
      else if(message_for_motor == 's')
      {
         condition_rotate = 0;  //вращение в другую сторону
      }

либо устанавливается задержка соответствующая какой либо скорости вращения ротора:

      else if(message_for_motor == '1')
      {
        delay_for_speed=1000;
      }
      else if(message_for_motor == '2')
      {
        delay_for_speed=800;
      }
      else if(message_for_motor == '3')
      {
        delay_for_speed=400;
      }
      else if(message_for_motor == '4')
      {
        delay_for_speed=200;
      }
      else if(message_for_motor == '5')
      {
        delay_for_speed=100;
      }
      else if(message_for_motor == '6')
      {
        delay_for_speed=50;
      }
      else if(message_for_motor == '7')
      {
        delay_for_speed=20;
      }
      else if(message_for_motor == '8')
      {
        delay_for_speed=10;
      }
      else if(message_for_motor == '9')
      {
        delay_for_speed=5;
      }

После чего, в зависимости от состояния вращения в переменной condition_rotate , выполняется либо остановка либо вращение в одну сторону либо в другую

if(condition_rotate == 0) //остановка
  {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    delay(delay_for_speed);
  }
  else if(condition_rotate == 1) //вращение в одну сторону
  {
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
  }
  else if(condition_rotate == 2) //вращение в другую сторону
  {
    digitalWrite(d, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(d, LOW);
      delay(delay_for_speed);
    
    digitalWrite(b, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(b, LOW);
      delay(delay_for_speed);
    
    digitalWrite(c, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(c, LOW);
      delay(delay_for_speed);
    
    digitalWrite(a, HIGH);
    delay(delay_for_speed);
    
      digitalWrite(a, LOW);
      delay(delay_for_speed);
  }

Для того чтобы отослать сообщение на ардуино можно, в среде, войти по вкладке Инструменты-Монитор последовательного порта и в появившемся окне в верхнем текстовом поле вписывать символы и отсылать нажатием кнопки "отправить" символ придёт на ардуино и для данного случая если отослать символ l то ротор будет вращаться в одну сторону, если символ r то в другую, если цифру от 1 до 9 то будет изменена скорость вращения. Код можно изменять как угодно на своё усмотрение для конкретных задач управления двигателем, можно даже написать свою программу для отсылания символов в ардуино с компьютера. Но при этом важно помнить что для некоторых драйверов (например таких) необходимо правильное управление иначе они выходят из строя и при этом могут вывести что нибудь ещё например источник, поэтому очень важно позаботиться о правильном управлении и правильном подключении двигателя к драйверу и драйвера к ардуино.


КАРТА БЛОГА (содержание)