В данную часть сериала входит краткое описание автоматизированной системы проектирования электроники Fritzing, модуль управления биполярными шаговыми двигателями на двух микросхемах L298 и программное обеспечение для него, программа управления камерой Casio QV-4000.
Две микросхемы можно соединить проводами на макетной плате, и не вычерчивая предварительно принципиальную и монтажную схемы. Но если на одной макетной плате планируется собрать несколько модулей и особенно если в дальнейшем проект планируется повторять, то наличие читаемой внятной схемы становится крайне желательным. Основная задача технической документации - это дать возможность воспроизвести устройство, руководствуясь ей. Этой задачи служит и стандартизация документации. Документ, составленный строго в соответствии с ГОСТами, позволяет собрать устройство через много лет и даже в том случае, когда этим занимаются люди, не работавшие ранее с данным типом устройств. Однако этот метод не всегда является самым наглядным и удобным в случае, когда информация предназначена для тех, кто в теме. Можно провести аналогию между академическим языком и техническим жаргоном. Устройства на базе конструктора Arduino оперируют более крупными блоками, чем отдельная микросхема, и при сборке часто бывает полезнее знать номер на плате, а не не соответствующий номер ножки микросхемы. Проект Fritzing - это попытка создать автоматизированную систему проектирования электроники, заточенную именно под различные конструкторы на базе микроконтролеров. Программа позволяет расположить элементы на макетных платах нескольких типов, вычертить принципиальную схему и развести дорожки по двухслойной печатной плате. Проект стартовал в 2008 году. Текущая версия программы 0.7.10b(eta) опубликована 16 октября 2012 года под лицензией GNU GPL v3. С сайта проекта можно скачать исходный код и версии для Windows, Mac OS X 10.5, Linux (64-bit), Linux (32-bit).
Для многих элементов можно менять такие параметры, как количество ножек и способ монтажа. Для сопротивлений можно задать номинал, причем в режиме просмотра будет показана правильная маркировка цветными кольцами.
Есть возможность автоматической и ручной трассировки. В меню доступен ряд специфических элементов, применяемых исключительно при проектировке печатной платы.
В программе есть и простенький редактор для создания собственных элементов или модернизации уже имеющихся. При создании собственных элементов предлагается брать за основу элемент Mystery Part. В этом элементе можно изменять число контактов. Для редактирования изображений нужен внешний редактор для файлов в формате SVG.
L298 представляет из себя четыре полумоста, объединённые по-два сигналами разрешения работы. Популярное описание принципов работы этой микросхемы можно найти здесь. Чтобы полностью использовать потенциальные возможности микросхемы, придется задействовать 6 цифровых выходов и два аналоговых входа платы микроконтроллера. Это очень расточительно, и обычно используются дополнительные логические микросхемы и связь через последовательный порт с микроконтроллером. Но выбранная мной для этой установки плата Seeeduino Mega имеет избыточное для этой задачи количество портов, да и все возможности L298 я использовать не планировал, поэтому пошел по пути максимального упрощения схемы и минимизации числа используемых деталей. Поскольку у микросхемы есть запас по току для моих двигателей, то мерить его я не собираюсь и замыкаю ножки SENA и SENB не через сопротивление, а прямо на землю. Естественно, аналоговые входы в этом случае тоже не используются. Используемая мной батарея питания не потянет одновременную работу двух двигателей, поэтому входы IN1-IN4 обеих микросхем подключаются параллельно. Я собираюсь использовать одновременно обе обмотки двигателя, поэтому соединяю входы разрешения работы (ENABLE), обозначенные на схеме как ENA и ENB. Таким образом, для управления двумя двигателями будет задействовано 6 цифровых выходов. Два для выбора двигателя и 4 для управления. Т.е. можно было бы обойтись и Freeduino Nano v5. Но с точки зрения простоты реализации у Seeeduino Mega есть несколько плюсов: три дополнительных аппаратных последовательных порта, что позволяет легко реализовать одновременную работу по связи с компьютером, связи по Bluetooth и управление камерой Casio. Кроме того, есть переключатель напряжения логики в режим 3 В, что позволяет упростить схему подключения модуля Bluetooth.
Ниже приведены фотографии получившейся установки.
А так выглядит наглядное описание установки, подготовленное программой Fritzing.
А так программа Fritzing позволяет подготовить принципиальную схему в классическом виде.
И, наконец, печатная плата. Схема приведена исключительно для демонстрации возможностей программы Fritzing. Я ее не проверял и не использовал.
Целиком проект, подготовленный в Fritzing, можно скачать здесь.
Програмирование осуществлялось в среде Arduino IDE 1.0.1. Новая версия отличается наличием русского интерфейса и заменой расширения файлов проекта с «pde» на «ino». Изменения также коснулись библиотек и синтаксиса некоторых команд, поэтому старые проекты, возможно, придется править. С Java Runtime Environment или Java Development Kit версии 1.7 Arduino IDE 1.0.1 у меня работала крайне криво. Некоторые важные пункты меню типа «Сервис/Плата» были недоступны. С версией 1.6 все работает прекрасно.
Для поворота двигателя на один шаг используется следующая простая подпрограмма:
void Faza() {
byte fazaA[] = {HIGH, HIGH, LOW, LOW};
byte fazaB[] = {LOW, LOW, HIGH, HIGH};
byte fazaC[] = {LOW, HIGH, HIGH, LOW};
byte fazaD[] = {HIGH, LOW, LOW, HIGH};
int faz;
if (enable == enable1)
{
faz1 = faz1 + napr;
if (faz1 > 3)
{faz1 = 0;}
else if (faz1 < 0)
{faz1 = 3;}
faz = faz1;
}
else
{
faz2 = faz2 + napr;
if (faz2 > 3)
{faz2 = 0;}
else if (faz2 < 0)
{faz2 = 3;}
faz = faz2;
}
digitalWrite(enable, HIGH);
digitalWrite(inp1, fazaA[faz]);
digitalWrite(inp2, fazaB[faz]);
digitalWrite(inp3, fazaC[faz]);
digitalWrite(inp4, fazaD[faz]);
delay(dt1);
digitalWrite(enable, LOW);
}
Подпрограмма поворота по часовой стрелке на заданный угол будет выглядеть так:
void fq(byte flag, byte numOfValues)//Поворот по часовой стрелке в
{
int fq = meetAndroid.getInt();
mstepxd = 35*fq/9;
napr = 1;
enable = enable1;
for (int i=0; i <= mstepxd; i++)
{
mstepx = mstepx + napr;
Faza();
}
SendUgolG();//Передаем данные об горизонтальном угле телефону }
где переменная fq - полученный от телефона угол поворота, а переменная enable определяет, какой двигатель используется.
Как видно из приведенного снимка экрана, на всю программу было задействовано около 10% доступной памяти. Всю программу можно скачать здесь. Управление через Bluetooth полностью аналогично описанному в статье Управление съемкой с помощью телефона. Для работы программы необходима библиотека MeetAndroid версии от 8 декабря 2011 года, причем в файле MeetAndroid.cpp надо заменить Serial на Serial1. В программе сохранен модуль управления камерой Sony NEX по ИК каналу. Сигнал о спуске затвора подается одновременно на все подключенные камеры.
Управляющие команды взяты с сайта www.dicasoft.de. Собственно программный код предельно прост. Отправляем два однобайтных кода: один для начала операции, другой для завершения. Без кода завершения камера будет не готова к приему следующей команды. В случае управления изменением фокусного расстояния интервал между командами определяет величину изменения фокусного расстояния.
Подпрограмма спуска затвора:
void Zatvor()
{
digitalWrite(13, HIGH);//Индикация паузы светодиодом на плате
delay(wp);// Пауза перед спуском затвора
digitalWrite(13, LOW);
byte inByte = 66;
Serial2.write(inByte);
delay(15);
inByte = 98;
Serial2.write(inByte);
digitalWrite(13, HIGH);
delay(wzat); // Время нажатия кнопки затвора
digitalWrite(13, LOW);
}
Подпрограмма увеличения фокусного расстояния:
void fz(byte flag, byte numOfValues)//Зум T
{
int fw = meetAndroid.getInt(); digitalWrite(13, HIGH); byte inByte = 68; Serial2.write(inByte); delay(fw); inByte = 100; Serial2.write(inByte); digitalWrite(13, LOW); }
Подпрограмма уменьшения фокусного расстояния:
void fw(byte flag, byte numOfValues)//Зум W
{
int fw = meetAndroid.getInt(); digitalWrite(13, HIGH); byte inByte = 67; Serial2.write(inByte); delay(fw); inByte = 99; Serial2.write(inByte); digitalWrite(13, LOW); }
В следующих сериях будут рассмотрены управляющие программы для телефона.