Главная » Радиоуправление
Призовой фонд
на июнь 2023 г.
1. 1000 руб
Сайт Паяльник
2. 100 руб.
3. 50 руб.

Робот партнёр в танце

В основе устройства платформа с двумя ведущими колёсами диаметром 140 мм, и одним свободно подвешенным колесом диаметром 40 мм. За счёт такой компоновки , платформа обладает высокой манёвренностью. Т.е. возможно движение в любом направлении и разворот на месте. В центре тяжести платформы установлен высокий штырь (высота от пола 1000 мм) . На конце штыря находится голова робота, в которой расположен микроконтроллер , и датчик звука (в минимальной комплектации). На высоте 850 мм поперёк штыря, шарнирно закреплены руки робота. Ниже, примерно на высоте 450 мм установлен УЗ датчик расстояния. Платформа приводится в движение двигателями с редуктором, от стеклоподъёмников автомобиля ВАЗ. Каждое колесо приводится своим двигателем. Рядом с двигателями расположена силовая плата с драйверами и стабилизатором напряжения. Отдельно установлены 4 реле для включения и реверсирования двигателей. Аккумулятор 12 вольт установлен в нижней части платформы и служит ещё и  противовесом.

Работает аппарат следующим образом:  Услышав громкую музыку, робот выходит из спящего режима, и если музыка не стихает, проверяется наличие партнёра в помещении. Если партнёр находится, робот приближается к нему на заданное расстояние и начинает танцевать. Так же отслеживается ритм музыки, чем чаще ритм, тем интенсивнее движения.. Так же можно меняя расстояние до робота, заставлять его приближаться или удаляться от партнёра.   Корректируя открытый код программы, можно менять порядок, ритм и скорость движений, расстояние обнаружения партнёра, а так же расстояние до партнёра.
Если музыка прекращается, робот остановится, и перейдёт в спящий режим. Это минимальный набор функций, которые будут рассмотрены в данной статье.

Итак, сначала, изготовим саму платформу-основание робота :

Колёса можно применить от газонокосилки, или от детской коляски (как у меня). Каждое колесо установлено в подшипнике, а ось колеса с осью редуктора соединяется муфтой. Можно , например, применить отрезки сварочного шланга, стянутого винтовыми хомутами. Свободновращающиеся колёса, можно взять от игрушек. Ось вращения этих колёс перпендикулярна оси качения, и смещена на 15-20 мм от неё. Основа конструкции, стальные пластины толщиной 1,5 мм, согнутые в нужных местах под прямым углом, и соединённые между собой вытяжными заклёпками или винтами с гайками. Штырь (тонкостенная труба, диаметром 22 мм) приварен к верхней пластине. Та часть пластины, на которой установлены свободновращающиеся колёса, имеет упругую деформацию по отношению к той части, на которой установлены ведущие колёса. Это позволяет сглаживать (амортизировать) резкие движения робота.

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

 Левый и правый электродвигатели управляются электромагнитными реле с переключающими группами контактов. Удобно использовать автомобильные реле вместе с панельками  (5 контактов).  Но можно применить и другие реле на  12 вольт с переключаемым контактом, монтируемые на плату.  Главное, чтобы их контакты с запасом выдерживали ток двигателя (10А достаточно).- Каждое из реле  Rel1—Rel4, управляется своим транзистором VT1—VT4. Параметры транзисторов не критичны, главное, чтобы их мощность и коэффициент усиления, были бы достаточны для надёжного срабатывания выбранных реле. Диоды VD1—VD4, подключенные параллельно обмоткам реле, служат для защиты транзистора от тока самоиндукции, который возникает в обмотке в момент отключения реле, и может пробить транзистор. Для этой же цели служит диод VD5, который защищает полевой транзистор. Этот диод должен быть «быстрый» и достаточно мощный, например КД213. Параметры других диодов  не критичны. Бывает, что в панельках для автомобильных реле, диоды уже установлены. В таком случае, следует соблюсти полярность при подключении панельки. В случае монтажа реле на печатную плату, дорожки к переключающим контактам реле должны быть достаточной толщины, чтобы без нагрева выдерживать ток двигателей. Провода, в цепи питания двигателей нужно применять сечением 1,5 кв мм. В цепи питания электродвигателей установлен мощный полевой транзистор (MOSFET), управляющий сигналом ШИМ с микроконтроллера. Изменяя параметры ШИМ сигнала, в разных точках программы, будем регулировать обороты двигателей.  Полевой транзистор устанавливается на небольшой радиатор. Затвор полевого транзистора и базы транзисторов  VT1—VT4, к соответствующим ножкам микроконтроллера, подключены через резисторы. Для получения напряжения 5 вольт, необходимого для питания микроконтроллера, служит интегральный стабилизатор , установленный на небольшом радиаторе.   Для  питания, робота, можно использовать АКБ от источника бесперебойного питания, напряжением 12 вольт ёмкостью не менее 7 а/ч. Подойдёт так же мотоциклетный аккумулятор, не меньшей ёмкости.  Детали монтируются на печатной плате (У меня применена монтажная плата), размеры которой определяются применёнными реле. Как уже говорилось выше, на плате следует зарезервировать место для установки дополнительных  компонентов. Резисторы могут быть установлены непосредственно на плате микроконтроллера, либо каждый из них разделить (например:  3 кОм на плате контроллера и 1, 5 кОм на силовой плате). Нужно отметить, что мощность двигателей для данной платформы, позволяет разгоняться до скоростей, при которых происходит опрокидывание, поэтому следует устанавливать мощность не более 30% от максимальной .

Для управления роботом, применим   микроконтроллер ATMEGA8. Плата микроконтроллера в моём варианте имеет размеры 110х55 мм. Кроме панельки на 28 ног, на плате установлены резисторы, для связи с силовой платой, блокировочные конденсаторы в цепи питания, два керамических 0,1 мкФ и два электролитических 47,0 мкФ.   Так же,  между VCC и AVCC включён дроссель,  диоды, подключённые к входу INT1 (5 вывод), и пара контрольных светодиодов, каждый со своим резистором. Эти элементы в данном проекте не используются, но могут понадобиться в дальнейшем. Можно использовать макетную плату, если нет желания изготовлять её самостоятельно. Разводку плат не привожу, т. к. платы простые, содержат мало деталей и не трудно расположить,  детали на платах,  самостоятельно.  Для крепления  плат и датчиков, использованы монтажные стойки от старых компьютеров.

Начертим схему платы микропроцессора:

Для тестирования и настройки программы, удобно воспользоваться  симулятором Proteus.  В качестве индикаторов работы моторов, в Proteus удобно применить светодиоды разного цвета, например: (левый вперёд—зелёный, левый назад—красный, правый вперёд—жёлтый, правый назад—синий).

Теперь напишем код:  Программу будем создавать на языке С в среде Atmel Studio 6.2 . Это бесплатная и весьма удобная программа для работы с МК семейства  avr, к которому и относится, выбранный нами микроконтроллер ATMEGA8 .

Запустим программу, выберем наш микроконтроллер, установим тактовую частоту 8 мГц и подключим необходимые библиотеки:

#include <avr/io.h>

#define F_CPU 8000000UL //частота 8 мгц

#include <util/delay.h> //задержки

#include <avr/interrupt.h>//файл библиотеки прерываний

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

Начнём с того, что создадим функцию предварительной установки портов микроконтроллера, и назовём её preset.

void preset () // функция предварительной настройки портов

{

   DDRD=0x00; // порт настроен на вход

   PORTD=0x00; // подтягивающие резисторы отключены, для корректной работы датчиков

   DDRC=0b1011111; // порт настроен на выход кроме PC5

   PORTC=0x00; // на выводах порта лог 0

   DDRB=0xFF; // порт настроен на выход

   PORTB=0x00; // на выводах порта лог 0

}

 

  Для обнаружения «партнёра» и поддержания необходимой дистанции, будем применять ультразвуковой датчик  расстояния HC-SR04. Подробно описывать принцип его работы я здесь не стану, так как это многократно разжёвано в статьях на разных сайтах. Скажу лишь, что кроме выводов питания, у этого датчика ещё есть вход (trig) и выход (echo).  Если подать на вход короткий (10—20 мкс) импульс, то  на выходе вместо изначального низкого уровня, появится высокий уровень. Одновременно с этим, датчик пошлёт перед собой ультразвуковой импульс. После того, как импульс, отразившись от какого либо предмета вернётся назад, уровень на выходе датчика, сменится с высокого на низкий. Таким образом, время в течение которого на выходе присутствует высокий уровень ,  будет пропорционально расстоянию от датчика до предмета перед  датчиком. Для подсчёта миллисекунд, нам потребуется таймер. В нашем микроконтроллере есть 3 таймера: T0, T1 ,T2. Таймеры  T0, T2 8-битные, а таймер  T1, 16-битный. Его и будем использовать.  . Если разделить полученный результат в миллисекундах, на коэффициент 58, получим расстояние, выраженное в сантиметрах. Для запуска и остановки таймера, мы воспользуемся внешним прерыванием. В нашем микроконтроллере есть два входа для внешних прерываний:  INT0 и  INT1 Для работы с ультразвуковым датчиком задействуем прерывание INT0 .

Алгоритм работы будет такой:

  1. Стартуем преобразование (посылаем стартовый импульс 20 мкс) на вход (trig)
  2. Смотрим, что на выходе (echo)
  3. Если на выходе (echo) 1, обнуляем таймер
  4. Если на выходе (echo) 0, высчитываем значения таймера
  5. Форматируем значение  (делим на 58) и записываем в нужную переменную
  6. Отдыхаем 0,1 секунды и заново  (пункт 1)

В общем, нам нужно, что бы  робот «знал», какое расстояние перед находящимся впереди предметом (партнёром).

Так как предполагается участие ультразвукового датчика  почти во всех режимах работы робота, создадим для этого необходимые условия:

Для начала создадим два псевдонима START и STOP.

#define START 0

#define STOP 1

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

volatile unsigned int distance = 0x00;

volatile unsigned char status = START;

Первая нужна для сохранения количества микросекунд, а вторая как раз для определения состояния датчика. Далее настраиваем таймер Т1

 Настройка таймера на 1 МГц (Значит, один тик равен одной микросекунде) 

   TCCR1A = 0x00;// таймер считает до конца

   TCCR1B |= (1 << CS11);//делитель на 8 , из 8 мгц получаем 1 мгц

   TCNT1H = 0x00;

   TCNT1L = 0x00;

 GICR |= (1<<INT0); //разрешаем внешнее прерывание на INT0

   MCUCR |= (0<<ISC01)|(1<<ISC00);// Настройка внешнего прерывания по любому изменению ( переход с низкого на высокий уровень и наоборот)

   sei();// Разрешаем глобальные прерывания

Теперь  напишем тело обработчика внешнего прерывания. Варианта прерывания два, (переход с низкого на высокий уровень, и переход с высокого на низкий). Поэтому в теле обработчика, напишем условный оператор выбора между ними (if):

ISR(INT0_vect) // Обработчик прерывания по изменению на ножке INT0

{

   if(PIND & (1 << PIND2)) // Если пришла единица ? сбрасываeм таймер и ставим состояние старта преобразования

   {

   TCNT1 = 0x00;

   status = START;

   }

   else // Если пришел ноль, значит звук вернулся. Записываем количества микросекунд и выставляем состояние на конец преобразования

   {

   distance = TCNT1;

   status = STOP;

   }

}

Работает это так:  Изначально  мы настроили таймер на тиканье раз в 1мкс. То есть каждый раз, когда пройдет 1 мкс, таймер приплюсует к регистру TCNT1 единицу. Он это будет делать бесконечно. Так как данный регистр 16 битный, то он,  досчитав до 65535 перейдёт в ноль и начнёт считать  заново. Что происходит дальше?  Как только на ножке (echo) появляется 1, МК (микроконтроллер) прекращает обрабатывать основную программу и начинает  обрабатывать прерывание. Если на выходе  (echo) единица, значит, датчик послал импульс,  и нужно обнулить таймер, так как там сейчас случайное число. После выставляем состояние в START. Теперь основная программа знает, в каком состоянии датчик. Проделав эту операцию МК возвращается  к работе с основной программой. А тем временем пока звук  идёт до препятствия и обратно, тикает таймер увеличивая свое значение на единицу раз в 1 мкс. Как только звук пришел на приемник, на ножке (echo)  появляется ноль. Но это тоже событие для внешнего прерывания.  МК снова прекращает обработку основной программы и начинает обрабатывать прерывание. Там снова смотрит, что на ноге Echo, а там ноль.  Значит,  нужно сохранить значение регистра  счетчика,  и поставить состояние в STOP. Теперь основная программа знает, что у нас есть свежие данные по расстоянию.   

if(status) // Проверяем состояние. Если состояние Конец, то вычислив значение, запишем в переменную

{

int n=0;

n=distance/58;

status = START; // Выставляем состояние на Старт для следующего преобразования

_delay_ms(100); // Задержка

   { блок команд }

}

Для посылки стартового импульса выберем ножку МК. Пускай это будет PB0 (14 нога МК).

PORTB |= (1 << 0); // Подаём 1 (высокий потенциал) на выбранный пин.

_delay_us(20);   // ждём 20 микросекунд

PORTB &= ~(1 << 0); // сбрасываем в 0

Создадим функцию, в которой робот будет анализировать расстояние до партнёра, и поддерживать заданную дистанцию. Назовём её sonic1 и запишем в её теле код программы:

void sonic1 ()

{

PORTB |= (1 << 0); // Взводим тригер

_delay_us(20);   // подав на него единицу,

PORTB &= ~(1 << 0); // а потом подождав 20 мкс сбрасываем

PORTC=0x00; // стоп

_delay_ms(100);



if(status) // Проверяем состояние. Если состояние Конец, то вычислив значение, запишем в переменную

{

int n=0;

n=distance/58;

status = START; // Выставляем состояние на Старт для следующего преобразования

_delay_ms(100); // Задержка

if ((n<150)&&(n>=60)) // если расстояние меньше 150 см но больше или равно 60 см

{

OCR2=50;//установка скважности

PORTC=0b0010100; // левый вперёд правый вперёд

_delay_ms(500);

PORTC=0x00; // стоп

_delay_ms(100);

}

else

{

PORTC=0x00; // стоп

_delay_ms(100);

}

if (n<40) // если расстояние меньше 40 см

{

OCR2=50;//установка скважности

PORTC=0b0001010; // левый назад правый назад

_delay_ms(500);

PORTC=0x00; // стоп

_delay_ms(100);

}

else

{

PORTC=0x00; // стоп

_delay_ms(100);

}

if ((n<60)&&(n>=40)) // если расстояние больше 60 см, но меньше или равно 40 см

{

tango(); // исполняется танец

}

}

Создадим ещё одну функцию и назовём её tango: В этой функции будет выполняться простейший «танец». Каждое движение выполняется 400 мс (можно установить другое значение). Техническая пауза, необходима, что бы исключить одновременное срабатывание обоих реле, что приведёт к короткому замыканию. Кроме того, улучшает восприятие «танца». Делать техническую паузу менее 20 мс в данном проекте нельзя. В цикле for, назначим количество повторяемых движений.

void tango ()

{

 OCR2=50;//установка скважности

 int i;

 for (i=1; i<=3;i++)

 {

PORTC=0b0000100; // левый вперёд

 _delay_ms(400);

PORTC &= ~(1<<2); // левый стоп

_delay_ms(100); // техническая пауза

PORTC=0b0000010; // левый назад

 _delay_ms(400);

 PORTC &= ~(1<<1); // левый стоп

_delay_ms(100); // техническая пауза PORTC=0b0010000;// правый вперёд

 _delay_ms(400);

 PORTC &= ~(1<<4); // правый стоп

 _delay_ms(100); // техническая пауза PORTC=0b0001000;// правый назад   _delay_ms(400);

 PORTC &= ~(1<<3); // правый стоп _delay_ms(100); // техническая пауза  }

}

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

TCCR2=0b01101110;//установка параметров таймера ШИМ

 OCR2=10;//установка скважности (значения  от 0 до 256) чем больше значение, тем больше скорость

Сигнал ШИМ снимаем с вывода PB3 микроконтроллера.

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

 

У датчика имеются три вывода: Это общий GND,  +5 вольт UCC,  и OUT, на котором в отсутствии звука, присутствует высокий потенциал (около 5 вольт). При появлении громкого звука, на выходе устройства появляется низкий потенциал.

Этот вывод подключим к порту PD5 микроконтроллера. На схеме в протеусе, вместо датчика звука, установим кнопку, нажимая на которую, мы будем имитировать наличие музыки.

 Для обработки звука, я взял код обработки нажатия кнопки с подавлением «дребезга», и поставил этот код в начале бесконечного цикла программы. Т.е. пока не будет нажата «кнопка « (пока не появится звук), программа не выполняется. Как только «кнопка» будет нажата, начнутся выполняться функции, записанные ниже. Так как при наличии музыки, звуки повторяются, программа постоянно перезапускается.

if (!(PIND & (1<<PIND5)) && in == 1 )// Если PD5 стал равен нулю и значение in при этом = 1, то мы поймали замыкание  {

in = 0;  // 1. Стало быть уровень входного сигнала стал равен нулю

_delay_ms(20);  // 2. Задержка 20мс. Выжидаем - когда закончится дребезг контактов

TCCR2=0b01101110;//установка параметров таймера ШИМ

OCR2=10;//установка скважности

sonic1();

}

if (PIND & (1 << PIND5) && in == 0)  /* Если PD5 стал равен единице и in = 0,

то мы поймали на входе размыкание кнопки, т. е. перепад из 0 в 1 */

{

in = 1;  // В этот момент уровень входного сигнала стал равен нулю

_delay_ms(20);  /* Задержка 20мс - опять ждём окончания дребезга,

больше ничего в момент размыкания кнопки делать не будем */

}

 

Как видно, функция   sonic(); запустится при нажатой "кнопке", т. е. при срабатывании датчика звука, а дальше, в зависимости от расстояния до партнёра (или до препятствия), робот будет стоять на месте, двигаться или вперёд, или назад , или будет танцевать. 

Полностью программа выглядит так:

/*
 * rob_late.c
 *
 * Created: 19.03.2023 11:39:59
 *  Author: may21
 */ 


#include <avr/io.h>


#include <avr/io.h>
#define F_CPU 8000000UL //частота 8 мгц
#include <util/delay.h> // задержки
#include <avr/interrupt.h>//файл библиотеки прерываний 


void preset () // функция предварительной настройки портов
{
	DDRD=0x00; // порт настроен на вход
	PORTD=0x00; // подтягивающие резисторы отключены для корректной работы датчиков
	DDRC=0b1011111; //  порт настроен на выход кроме PC5
	PORTC=0x00; // на выводах порта лог 0
	DDRB=0xFF; //  порт настроен на выход
	PORTB=0x00;  // на выводах порта лог 0
}
#define START 0 //псевдоним
#define STOP 1  //псевдоним

volatile unsigned int distance = 12180; //глобальные переменные.
volatile unsigned char status = START;


ISR(INT0_vect) // Обработчик прерывания по изменению на ножке INT0
{
	if(PIND & (1 << PIND2)) // Если пришла единица сбрасывам таймер и ставим состояние старта преобразования
	{
		TCNT1 = 0x00;
		status = START;
	}
	else // Если пришел ноль, значит звук вернулся. Записываем количества микросекунд и выставляем состояние на конец преобразования
	{
		distance = TCNT1;
		status = STOP;
	}
}

void tango ()
{
	  OCR2=50;//установка скважности
	  int i;
	  for (i=1; i<=3;i++)
	  {
	PORTC=0b0000100;  // левый вперёд
	  _delay_ms(400);
	 PORTC &= ~(1<<2); // левый стоп
	 _delay_ms(100); // техническая пауза
	PORTC=0b0000010; // левый назад
	  _delay_ms(400);
	  PORTC &= ~(1<<1); // левый стоп
	 _delay_ms(100); // техническая пауза 
	PORTC=0b0010000;// правый вперёд
	  _delay_ms(400);
	  PORTC &= ~(1<<4); // правый стоп
	  _delay_ms(100); // техническая пауза 
	PORTC=0b0001000;// правый назад 
	   _delay_ms(400);
	  PORTC &= ~(1<<3); // правый стоп 
	 _delay_ms(100); // техническая пауза  
	}
}

void sonic1 ()
{
	PORTB |= (1 << 0);  // Взводим тригер
	_delay_us(20);           // подав на него единицу,
	PORTB &= ~(1 << 0); // а потом подождав 20 мкс сбрасываем
	PORTC=0x00; // стоп
	_delay_ms(100);

	if(status) // Проверяем состояние. Если состояние Конец, то вычислив значение, запишем в переменную
	{
		int n=0;
		n=distance/58;
			status = START; // Выставляем состояние на Старт для следующего преобразования
			_delay_ms(100); // Задержка
		if ((n<150)&&(n>=60))// Если расстояние меньше 150 см но больше или равно 60 см
		{
			OCR2=50;//установка скважности
			PORTC=0b0010100; // левый вперёд  правый вперёд
			_delay_ms(500);
			PORTC=0x00; // стоп
			_delay_ms(100);
		}	
		else
		{
			PORTC=0x00; // стоп
			_delay_ms(100);
		}
		if (n<40)// Если расстояние меньше 40 см
		{
			OCR2=50;//установка скважности
			PORTC=0b0001010; // левый назад  правый назад
			_delay_ms(500);
			PORTC=0x00; // стоп
			_delay_ms(100);
		}
		else
		{
			PORTC=0x00; // стоп
			_delay_ms(100);
			
		}
		if ((n<60)&&(n>=40))// Если расстояние меньше 60 см но больше или равно 40 см
		{
			 tango();
		}
		
	}
}

int main(void)
{
	preset();
	
	// Настройка таймера на 1 МГц (Значит один тик равен одной микросекунде)
	TCCR1A = 0x00;// таймер считает до конца
	TCCR1B |= (1 << CS11);//делитель на 8
	TCNT1H = 0x00;
	TCNT1L = 0x00;
	
	  GICR |= (1<<INT0); //разрешаем внешнее прерывание на int0
	//  GICR |= (1<<INT1); //разрешаем внешнее прерывание на int1  
	  MCUCR |= (0<<ISC01)|(1<<ISC00);//|(1<<ISC11)|(0<<ISC10);// Настройка INTO по любому изменению, INT1 по спаду
	sei();// Разрешаем глобальные прерывания
	char in = 1;   // Объявляем переменную in и записываем в неё число 1
    while(1)
	{

		if (!(PIND & (1<<PIND5)) && in == 1 )//  Если PD5 стал равен нулю и значение in при этом = 1, то мы поймали замыкание  
		{
			in = 0;    // 1. Стало быть уровень входного сигнала стал равен нулю

			_delay_ms(20);    // 2. Задержка 20мс. Выжидаем - когда закончится дребезг контактов
		 TCCR2=0b01101110;//установка параметров таймера ШИМ
		 OCR2=10;//установка скважности
		 sonic1();
		// mig();		
		}

		if (PIND & (1 << PIND5) && in == 0)    /* Если PD5 стал равен единице и in = 0,
	то мы поймали на входе размыкание кнопки, т. е. перепад из 0 в 1 */
		{
		in = 1;    // В этот момент уровень входного сигнала стал равен нулю
		_delay_ms(20);    /* Задержка 20мс - опять ждём окончания дребезга,
		больше ничего в момент размыкания кнопки делать не будем */
		}
		}
	
		}

Если написанная  программа компилируется без ошибок, прошьём микропроцессор. Удобно воспользоваться USB программатором и программой avrdudeprog33.  Фьюзы нужно настроить на работу от внутреннего генератора на 8 МГц. (CKSEL установить  0100, по умолчанию была настройка на 1 МГц 0001). Больше ничего не трогаем!

Файлы в архиве.

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МК МК AVR 8-бит
ATmega8
1 Поиск в магазине ОтронВ блокнот
MOSFET-транзистор
AUIRF3205
1 VT5Поиск в магазине ОтронВ блокнот
Биполярный транзистор
SS8050
4 VT1-VT4Поиск в магазине ОтронВ блокнот
VD1-VD4 Выпрямительный диод
1N4007
4 Поиск в магазине ОтронВ блокнот
VD5 Диод
КД213А
1 Поиск в магазине ОтронВ блокнот
Линейный регулятор
TL780-05
1 Поиск в магазине ОтронВ блокнот
R1-R5 Резистор
1.5 кОм
6 Поиск в магазине ОтронВ блокнот
Резистор
3 кОм
4 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор100 мкф 16 в3 Поиск в магазине ОтронВ блокнот
Конденсатор0.1 мкф3 Поиск в магазине ОтронВ блокнот
rel1-rel4 Реле12 в с переключающим контактом 10 а4 Поиск в магазине ОтронВ блокнот
УЗ датчик расстоянияHC-SR041 Поиск в магазине ОтронВ блокнот
Датчик звука1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.9 Проголосовало: 1 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
ДядяВован #
Прикольный девайс! Полагаю, не малых трудов стоило изготовить. Автору респект!
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Набор 4WD Kit Bluetooth
Набор 4WD Kit Bluetooth
Discovery V8 ELM327 OBD II — адаптер с поддержкой CAN
вверх