Купил зарядку для ума в виде популярного конструктора arduino и понял одну простую вещь: не все там так гладко, как хочется. Одна покупка тянет за собой другую и так далее и далее, пока сам себе не стукнешь по рукам и не скажешь хватит. Поэтому, чтобы сэкономить вам время, нервы и финансы хочу поделиться опытом сборки простейшей машинки, которая будет объезжать препятствия.
Что нам понадобится:
1. Шасси для робота, я взял это =9,50$
2. Драйвер двигателя, например L9110s=1,22$
3. Датчик, который будет определять препятствие, я остановился на самом популярном и дешевом варианте дальномере HC-SR04=0,94$
Однако, никто не мешает воспользоваться более дорогими аналогами или чем-то подобным
4. Крепление датчика,синий, не самый лучший, но жизнеспособный вариант. =1,08$
В качестве аналогов: прозрачный, еще существует неуловимый желтый, наиболее прошаренный, но ссылку так и не нашел. Кто будет искать на вид он похож на синий, но имеет нормальные отверстия под винт м3 и 4 шурупа для крепления дальномера.
5. Плата arduino, которая будет обрабатывать данные с датчика и выдавать решение, куда ехать дальше. Остановился на UNO, как на самой удобной для моделирования на «лету» =5.88$
Эта плата выбрана из-за возможности заменить микроконтроллер в случае фатальной неудачи, так что можно купить версию в два раза дешевле
вышеперечисленное мне понадобится позже и не раз, не обязательно так разгоняться
Парочка фото на закуску
Провода и терминалы
Стойки, болты, гайки, шайбы
Сборка
Переходим к самому интересному — к созданию Франкенштейна!
Первым делом сверлим в синем кронштейне отверстие под болт м3, потому как иного варианта крепления я не нашел
на термоклей сажаем дальномер.
Собираем шасси и крепим наш датчик. Чтобы он располагался как можно ниже, пришлось закрепить его не сразу на шасси, а с помощью стойки опустить на несколько сантиметров вниз. Нижний край кронштейна получился на одном уровне с моторами.
Крепим драйвер двигателя, подключаем моторы.
Приспосабливаем повербанк вместо батарейного отсека. Для этого делаем два отверстия под винты м3 для крепления на шасси, припаиваем два проводка "+" и "-" к USB на плате и выводим провода через еще одно просверленное отверстие. К сожалению у меня не было под руками подходящего выключателя, так что эту функцию будет выполнять отключение проводков от ардуины. Далее крепим это дело на шасси.
Ставим ардуину, подключаем провода
Удобно, что заряжается аккумулятор через повербанк.
Вставляем аккумулятор прошиваем (воспользовался средой atmel studio 6), переворачиваем, чтобы не убежала, и тестируем, что получилось.
На первый взгляд все норм, если появляется препятствие машинка отворачивает в сторону, проверяет наличие препятствия и в случае повторного обнаружения поворачивает в другую сторону. Что получилось на практике: препятствия обнаруживает на ура, поворачивает неплохо, опытным путем поставил нужные задержки, но практически не способна ехать по прямой из-за заднего направляющего колеса. Скорее всего это мне попался такой «тугой» вариант, но из-за этого машинка всегда едет по диагонали, мелочь, а неприятно.
Подведем итоги
Для начала, тем, кто решит делать что-то подобное, стоит обратить внимание на шасси с четырьмя моторами. Такой шаг, в теории, исключит вероятность движения по дуге, но может добавить головной боли при подборе драйвера двигателя. Но не спешите ломать голову, можно оставить этот, все должно отлично работать, по токам проходит впритык — два мотора на канал. А вот однобаночного повербанка не хватит точно. На мой взгляд это уже повод рискнуть. Так же придется покупать шайбы, т.к. при креплении к пластмассе могут быть неприятные вещи. Еще было бы отлично разделить питание ардуины и моторов, либо воспользоваться стабилизатором, на худой конец впаять конденсатор большой емкости, но это для истинных ценителей, у меня работает и так. На практике я уложился в цену примерно 2000 руб, можно было и дешевле, но это была моя зарядка для ума и первый опыт в программировании (для чего собственно все и затевалось), особо экономить не стал. Появится время прикручу радиоуправление и выключатель.
P.S. Проблему движения по дуге решала замена моторов, спасибо за совет. При покупке шасси не спешите подтверждать, сначала испытайте его в деле. Больше косяков нет, все работает.
мой первый обзор ^_^
Вот похожий обзор на готовый набор для сборки, а не с злостный хэндмэйд со сверлением, пайкой и термоклеем.
Планирую купить+29Добавить в избранноеОбзор понравился+32
+60
у продавца нет характеристик. На вскидку при 5В 300-400 мА кушают. Комплектация шасси в ссылке на продавца, при желании можете поинтересоваться подробно.
Речь о скетче, и в основном всегда, кто выкладывает свои изобретения в массы, прикладывает и скетч с целью ознакомления. Хотя если проект коммерческий, то можете не выкладывать код, дело ваше.
Насчёт v.2.0 — это вряд ли, поскольку я занят другим проектом, где не задействовано ничего из комплектующих из вашего обзора, кроме самой Ардуино.
я писал на С++ под atmel studio 6.2, не претендую на оригинальньсть, если кто заметил косяки — подскажите. Остановка и задержка после нее нужны, чтобы дать мотору остановиться перед возможным вращением в обратную сторону.
//состояние измерения
#define START 0 //запуск
#define MEAS 1 //в процессе
#define END 2 //окончено
unsigned int i;
volatile int status=0;
volatile unsigned int timer;
unsigned int sm=0,sm1=0,sm2=0;
void preset()
{
DDRD = 0b11111000;
PORTD = 0x00;
//настройка внешнего прерывния INT0 на срабатывание по обоим фронтам
MCUCR |= (0<<ISC01)|(1<<ISC00);
//разрешаем внешнее прерывание INT0
GICR |= (1<<INT0);
//настройка таймера 1
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //предделитель 8
}
void start()
{
status = START;
//генерируем импульс >10 мкс на входе trig
PORTD |= _BV(PD3);
_delay_us( 15 );
PORTD &= ~_BV(PD3);
}
//обработка прерывания INT0
ISR (INT0_vect)
{
//проверяем уровень сигнала PD2(ECHO)
if( PIND & _BV(2))
{ //PD2=1 передний фронт — сбрасываем в 0 таймер
TCNT1 = 0;
status = MEAS;
}
else
{ //PD2=0 задний фронт — конец измерения, запоминаем значение таймера
timer = TCNT1;
status = END;
_delay_ms( 50 );
}
}
void ostanovka()
{
PORTD &= ~_BV(PD4); // установить «0» на линии 0 порта
PORTD &= ~_BV(PD5); // установить «0» на линии 1 порта
PORTD &= ~_BV(PD6); // установить «0» на линии 2 порта
PORTD &= ~_BV(PD7); // установить «0» на линии 3 порта
}
void forward()
{
PORTD |= _BV(PD5); // установить «1» на линии 0 порта
PORTD &= ~_BV(PD4); // установить «0» на линии 1 порта
PORTD |= _BV(PD7); // установить «1» на линии 2 порта
PORTD &= ~_BV(PD6); // установить «0» на линии 3 порта
}
void back()
{
PORTD &= ~_BV(PD5); // установить «0» на линии 0 порта
PORTD |= _BV(PD4); // установить «1» на линии 1 порта
PORTD &= ~_BV(PD7); // установить «0» на линии 2 порта
PORTD |= _BV(PD6); // установить «1» на линии 3 порта
}
void left()
{
PORTD &= ~_BV(PC5); // установить «0» на линии 2 порта
PORTD |= _BV(PC4); // установить «1» на линии 3 порта
}
void right()
{
PORTD &= ~_BV(PD7); // установить «0» на линии 0
PORTD |= _BV(PC6); // установить «1» на линии 1
}
void izmerenie()
{
start();
while (status != END) //ожидание конца измерения
{ }
}
Биения стандарт для такого шасси, материал прозрачный пластик, сверху защитная пленка, она и похожа на картон. При желании можно отклеить, но не захотел лишних царапин. Хотя для понта потом отклею.
А шасси действительно не фонтан, приехало с некомплектом винтов, пришлось докупать, хоть продавец и выслал недостающее, после сборки выяснилось, что оно еще и ездит по дуге… В общем накололся с шасси, но для первого блина потянет.
после сборки выяснилось, что оно еще и ездит по дуге…
Ездит по дуге скорее всего из-за неодинаковой частоты вращения моторов. Даже при одинаковом поданном напряжении, один из моторчиков более тугой и вращается медленнее. Можно попробовать поиграться с ШИМ и откалибровать движение, подав на один из моторов чуть больше энергии.
Совсем не факт. Можно попробовать перевернуть один из моторчиков, вероятно что в реверсе у него скорость выше из за расположения коллекторного узла. Можно попробовать отрегулировать тайминг (положение коллектора относительно статора с магнитами).
Вы оказались правы, проблема была в моторах и их креплении. Не поленился сходил к ардуино любителю, взял два мотора и заменил, все норм стало ездить. Спасибо за наводку. Ну и содрал защитную пленку, завтра вечерком сделаю видео.
практически не способна ехать по прямой из-за заднего направляющего колеса. Скорее всего это мне попался такой «тугой» вариант, но из-за этого машинка всегда едет по диагонали, мелочь, а неприятно.
Для прямолинейности движение можно попробовать зафиксировать заднее шасси (как в самолете перед взлетом).
А повороты осуществлять с дополнительным вращением второго колеса в обратном направлении, если конечно это легко реализовать.
Люди добрыя! Кто в теме, поделитесь ссылкой на какое-нить дешовое гусеничное шасси или набор типа «tracks&wheels» (гусли+катки)? Нравится такое от Tamia, но очень уж жаба душит (пока, во всяком случае...). Спасибо.
Спасибо, лежит комплект примерно такой же, но я хочу поставить на шасси Raspberry Pi, вебкамеру и управление всем этим по WiFi. А просто машинка ездящая мимо препятствий, это как-то менее интересно.
Сейчас увлекся МК. Пока написал ПО, сейчас заказываю железо. Быдут универсальное удаленное управление газовой колонкой с поддержанием температуры на сервомоторчиках.
Следующим планирую все таки начать ардуино. Какую взять для первых потех? Сейчас осваиваю мегу8.
Для, так скажем, научно-исследовательских и опытно-конструкторских работ, однозначно лучше купить UNO, как у автора, либо (если не планируется использовать ардуину как программатор для голых МК) как автор советует, удешевлённый вариант UNO с запаянным МК в мелком корпусе. В первом случае готовые изделия можно делать более профессионально, на голых микроконтроллерах, запрограммированных в Ардуинке. А во втором случае в готовые изделия можно встраивать мелкие платы Arduino Pro-Mini (или -Micro, если уж совсем необходимо подключаться по USB).
Ясно. Значит просто UNO и к нему на всякий тех же атмег… Хм… Палка о двух концах ) Но смысл ясен. Прошить 1 микруху для меня не остсавит труда, есть тритон рядом. В там раскладе может не тратится на ардуинки, а просто меги? Я вот к чему. Удобна ли ардуинка или чистую мегу если скажем как я сейчас использую в создании умного дома (не буду озадачиваться соединения с сетью и прочим, просто конкретные отдельне устройства)?
Удобство штука субъективная. Многим Ардуино удобны большим сообществом и кучей готовых проектов и скетчей. А кто-то плюётся, мол Ардуино (и её язык «Процесинг», и сама идея) только для Дома Пионеров, а настоящие мужики должны программировать голые АТМеги и только на православном AVR-ассемблере. Кто-то и вообще AVR-контроллеры не признаёт, мол STM32(ARM) в разы лохмаче при доступных ценниках. Лично я пока в начальной стадии (использую в поделках готовые платы pro-mini, пишу на процессинге в Arduino-IDE, до AVR-ассемблера ещё не дорос, пока ещё средств Ардуино хватает. ;)
Тогда значит и рваться не буду. Сейчас уже отдал в сбор проект по управлению газовой колонкой на меге8. Начал управление электрической дверью на минивэне на меге16 и знакомый попросил сделать программируемым режимы работы домофона, правда пока не решил на чем, но скорее тини13 хватит. А пишу на С++, хотел на С, но я очень уж привык после Delphi к ОО языкам и С мне уже не хватало в некоторых конструкциях.
Прошить 1 микруху для меня не остсавит труда, есть тритон рядом.
Там цимус не просто в прошивке, а в том, что можно вставить в кровать атмегу (многие, как в приведённой мной ссылке, продают отдельные АТМеги с уже зашитым загрузчиком Arduino UNO, т.е. эти микрухи изначально предназначены для втыкания в UNO, хотя никто не мешает их и на программаторе шить, но тогда, наверное, можно их и подешевле найти совсем пустые) и залить в неё и отладить скетч, после чего готовую АТМегу с готовым ПО вытащить из кровати и вчалить в схему целевого девайса. «Дас ист фюр потребляйтер удобствунг.» ;) Вся идеология Ардуино направлена на максимальное облегчение труда разработчика… Если для вас это детский сад и вы предпочитаете C++ и программаторы — ваше дело и ваше право. По сути это чуть более продвинутый уровень, чем Ардуино, со своими плюсами и минусами.
Скажем так, в ту плату, которую я купил, атмега8 в дип корпусе становится на ура, все выводы совпадают с атмегой32. Эта машинка в настоящий момент ездит именно на атмега8, плюс в том, что вставив в отладочную плату микроконтроллер, вы получите обвязку по питанию, кварц и выводы для подсоединения датчиков/моторов. В итоге получим некоторое удобство для черновой сборки и проверки на работоспособность готового продукта, возможно еще и сэкономим время. Дальше можно смело разводить плату (как вариант экономим место на разъеме под программатор/отладочный интерфейс) и отдавать на производство или травить самому.
Для меня платформа ардуино стала именно базой для обучения, дальше буду пытаться разводить платы. В качестве дополнения советую обратить внимание на датчики под ардуино, ничего запредельного в них нет, все микросхемы можно найти на том же алиэкспрессе, схемы в интернете. Следовательно, после покупки готовых модулей и отладки программы, всегда можно сделать и собрать свой компактный вариант. (если есть опыт монтажа смд компонентов, qfp корпус уже не каждый запояет) Вопрос в желании и удобстве, каждому свое.
Подскажите люди добрые. Кто покупал? Или может кто подскажет на ссылочку к колесам пластиковым, я так понимаю для енкодера. А то мне пришли с узким посадочным местом, не налазеет)))
Из похожего набора, как у любезного автора данной статьи.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Можете добавить в обзор код проекта?
Насчёт v.2.0 — это вряд ли, поскольку я занят другим проектом, где не задействовано ничего из комплектующих из вашего обзора, кроме самой Ардуино.
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
//состояние измерения
#define START 0 //запуск
#define MEAS 1 //в процессе
#define END 2 //окончено
unsigned int i;
volatile int status=0;
volatile unsigned int timer;
unsigned int sm=0,sm1=0,sm2=0;
void preset()
{
DDRD = 0b11111000;
PORTD = 0x00;
//настройка внешнего прерывния INT0 на срабатывание по обоим фронтам
MCUCR |= (0<<ISC01)|(1<<ISC00);
//разрешаем внешнее прерывание INT0
GICR |= (1<<INT0);
//настройка таймера 1
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //предделитель 8
}
void start()
{
status = START;
//генерируем импульс >10 мкс на входе trig
PORTD |= _BV(PD3);
_delay_us( 15 );
PORTD &= ~_BV(PD3);
}
//обработка прерывания INT0
ISR (INT0_vect)
{
//проверяем уровень сигнала PD2(ECHO)
if( PIND & _BV(2))
{ //PD2=1 передний фронт — сбрасываем в 0 таймер
TCNT1 = 0;
status = MEAS;
}
else
{ //PD2=0 задний фронт — конец измерения, запоминаем значение таймера
timer = TCNT1;
status = END;
_delay_ms( 50 );
}
}
void ostanovka()
{
PORTD &= ~_BV(PD4); // установить «0» на линии 0 порта
PORTD &= ~_BV(PD5); // установить «0» на линии 1 порта
PORTD &= ~_BV(PD6); // установить «0» на линии 2 порта
PORTD &= ~_BV(PD7); // установить «0» на линии 3 порта
}
void forward()
{
PORTD |= _BV(PD5); // установить «1» на линии 0 порта
PORTD &= ~_BV(PD4); // установить «0» на линии 1 порта
PORTD |= _BV(PD7); // установить «1» на линии 2 порта
PORTD &= ~_BV(PD6); // установить «0» на линии 3 порта
}
void back()
{
PORTD &= ~_BV(PD5); // установить «0» на линии 0 порта
PORTD |= _BV(PD4); // установить «1» на линии 1 порта
PORTD &= ~_BV(PD7); // установить «0» на линии 2 порта
PORTD |= _BV(PD6); // установить «1» на линии 3 порта
}
void left()
{
PORTD &= ~_BV(PC5); // установить «0» на линии 2 порта
PORTD |= _BV(PC4); // установить «1» на линии 3 порта
}
void right()
{
PORTD &= ~_BV(PD7); // установить «0» на линии 0
PORTD |= _BV(PC6); // установить «1» на линии 1
}
void izmerenie()
{
start();
while (status != END) //ожидание конца измерения
{ }
}
int main(void)
{
preset();
forward();
while(1)
{
sei();
izmerenie();
if (timer<1680)
{
ostanovka();
_delay_ms(500);
left();
_delay_ms(300);
ostanovka();
_delay_ms(500);
izmerenie();
if (timer>1680)
{
forward();
}
else
{
ostanovka();
_delay_ms(100);
right();
_delay_ms(600);
ostanovka();
_delay_ms(500);
izmerenie();
}
}
else
{
forward();
}
}
}
А шасси действительно не фонтан, приехало с некомплектом винтов, пришлось докупать, хоть продавец и выслал недостающее, после сборки выяснилось, что оно еще и ездит по дуге… В общем накололся с шасси, но для первого блина потянет.
А повороты осуществлять с дополнительным вращением второго колеса в обратном направлении, если конечно это легко реализовать.
banggood.com/4Pcs-DIY-Car-Model-TT-Motor-Encoder-Wheel-p-979886.html
Следующим планирую все таки начать ардуино. Какую взять для первых потех? Сейчас осваиваю мегу8.
Для меня платформа ардуино стала именно базой для обучения, дальше буду пытаться разводить платы. В качестве дополнения советую обратить внимание на датчики под ардуино, ничего запредельного в них нет, все микросхемы можно найти на том же алиэкспрессе, схемы в интернете. Следовательно, после покупки готовых модулей и отладки программы, всегда можно сделать и собрать свой компактный вариант. (если есть опыт монтажа смд компонентов, qfp корпус уже не каждый запояет) Вопрос в желании и удобстве, каждому свое.
Из похожего набора, как у любезного автора данной статьи.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.