Вчера укомплектовал свою платформу базовым оборудованием, закрепил все - можно переходить к написанию софта управления.
Вот тут описание на скорую руку
Интересны идеи выбора направления движения - все чем можно пока пользоваться 4 сонара, по одному на сторону.
На той неделе тоже закончил аналогичную игрушку, правда, базу взял от сломанной китайской машинки на радио управлении - один мотор на заднем приводе (вперед, назад), второй на переднем (поворачивает ось вправо, влево).
Изначально прототип делал на Arduino Duemilanove + вот такой моторшилд
http://www.ladyada.net/make/mshield/ . Ультразвуковых сенсоров всего два, спереди и сзади. Были проблемы с питанием (скорее всего из за ШИМ в 74HCT595N на моторшилде) , да и показалось все слишком громоздко.
Окончательный вариант собрал на L293D (достал из моторшилда) и MSP430G2452 (достал из комплекта TI LaunchPad MSP 430). Запитал от 4х пальчиковых аккумуляторов, для которых был контейнер в базе от машинки, через LT1084-3,3 для MSP430G2452 и LT1084ADJ (LD,TF) для сенсоров (сперва была идея запитать от 12 вольтовой аккумы).
Отдельно вывел на разъем TEST, RST и GND для программирования контроллера, чтобы каждый раз не переставлять его LaunchPad board. Программировал в Energia IDE поэтому по синтаксису почти 100% совместим с Arduino.
Для иллюминации подключил светодиоды для индикации переднего и заднего хода.
Алгоритм движения простой, приведу только его. Остальные функции для определения расстояния и переключения направления движения очевидны.
const int minDistance = 30; // минимальное расстояние до препятствия в сантиметрах
long distanceFront = 0;
long distanceBack = 0;
boolean oldDir = true; // вперед = true, назад = false
void setup() {
drive(); // едем сразу вперед
}
void loop() {
distanceFront = // тут надо получить расстояние (в сантиметрах) с переднего сенсора
distanceBack = // тут надо получить расстояние (в сантиметрах) с заднего сенсора
if (distanceFront < minDistance && distanceBack < minDistance) {
if (distanceFront > distanceBack) {
driveTurn(); // вперед с поворотом вправо
} else
{
reverseTurn(); // назад с поворотом влево
}
} else
{
if (oldDir) {
if (distanceFront < minDistance) {
reverseTurn(); // назад с поворотом влево
} else
{
drive(); // вперед
}
} else
{
if (distanceBack > minDistance) {
reverseTurn(); // назад с поворотом влево
} else
{
drive(); // вперед
}
}
}
delay(200);
}