пятница, 27 августа 2010 г.

Arduino mini-FAQ. Теория и практика

Решил выделить все в некий сборничек для быстрого старта интересующихся данной темой. Речь, в большинстве случаев, пойдет об аналогах и клонах запатентованной торговой марки Arduino.


ЛИТЕРАТУРА
  1. Знакомство с Arduino
  2. Brian W. Evans: Arduino programming notebook - Перевод книги Arduino programming notebook
  3. AVR для детей и домохозяе... Потрошим Arduino (Di Halt)
  4. bionic_arduino_class1-4_russian.pdf
Плагины и редакторы
  1. Arduino IDE plugin for Visual Studio
  2. ArduinoEclipsePlugin
  3. http://arduinomania.com
  4. Полноценный редактор CodeBlocks Arduino IDE
  5. Онлайн-симулятор Ардуино 
ПРИМЕРЫ НЕСТАНДАРТНЫХ ПРИМЕНЕНИЙ ПЛАТФОРМЫ 
  1. Работа с DDS (синтезатором прямого синтеза частоты) AD9850 на базе модуля HC-SR08
  2. Работа с Буратиной по блютуз с планшета и нетбука 
  3. Система управления доступом на базе iButton+NFC/RFID ридера из нано-буратины
  4. Голосовой модуль беспроводного управления ардуиной
  5. Голосовой контроль-оффлайн на Arduino. Библиотека Uspeech
  6. Бюджетный Voice Recognition Module For Arduino 
  7. Контроллер крышки унитаза
  8. Энцефалограф на базе Arduino
  9. Подключение PS/2 клавиатуры к Arduino
  10. Arduino управляет кукольным театром
  11. Модуль голосового управления EasyVR
  12. Строим гусеничного Bluetooth-робота с камерой
  13. Фотосенсор на Arduino 
  14. Подключение монетоприемника к Arduino 
  15. Вольтамперметр на Arduino-мини
  16. Arduino для вашей домашней плантации
  17. Гитарный тюнер на Arduino
  18. Arduino + CNC (непромышленные), EFL 3 axis
  19. Умный Дом на базе Arduino (статья старая, но принципы все те же)
  20. Псевдо-тепловизор (из г... и палок) ИК-термометра, фотика, RGB-светодиодов и буратины
  21. Частотомер 
  22. Satellite tracker 
  23. Контроль радиостанции 
  24. Измеритель мощности и КСВ-метр 
  25. Визуализация водопада 
  26. Автоматический антенный тюнер 
  27. Осциллограф 
  28. RTTY генератор 
  29. Коллекция ссылок на проекты с использованием платформы Arduino (около 15 000, по сути ретвиты сторонних авторов)


ХОЧУ САМ СОБРАТЬ, КАК?
  1. Проект Буратино
  2. The Shrimp
  3. Японский вариант ардуины
НЕ ХОЧУ ПАЯТЬ, ГДЕ ПРИОБРЕСТИ ГОТОВОЕ, КРОМЕ КИТАЯ c Ali/E-bay? (Интернет-магазины)
  1. http://www.odduino.com
  2. http://arduino.net.ua
  3. http://arduino.shopium.ua
  4. http://www.kosmodrom.com.ua/prodlist.php?name=maketpcb&page=0
Arduino не только AVR, а еще и ARM и STM32 )
  1. Maple и Maple-mini. Arduino-подобная среда (используется Wiring) под 32-х разрядные МК на базе STM32F103 
  2. Arduino Yun. Интеграция Arduino с ОС Linux от RS Components в конструктиве Arduino Leonardo c дополнительным чипом (SoC) Atheros AR9331 с прошитым OpenWRT
  3. ArduIMU - Arduino Based IMU & AHRS 
  4. Industruino - Arduino совместимый промышленный ПЛК industrial-класса



ЛОМАЕМ СТЕРЕОТИПЫ

Последнее время довольно часто можно встретить высказывания вроде: "это же игрушка", "недостаточная мощность", "недостаточная скорость", "несерьезный контроллер", "глючит", "голые провода". Извините, народ, вы программисты/инженеры или дитятки малые с руками из задницы, неспособные открыть техническую документацию и отличить МК AVR от МК AVR на промышленных платах и провести качественный монтаж? Не нравятся голые провода, ставь клеммники, термоусадку, шилды. Глючит? То ваша голова глючит. Покажите ваш монтаж, отсутствие экранировки, правильного заземления и код, сразу вся глючность проявится. Или вы считаете, что на другом МК дерьмовый монтаж, отсутствие блокировочных емкостей и знаний элементарной схемотехники себя не проявит? Ошибаетесь. А хочется вычислительной мощности, есть на ARM-ах выше или берите кубибоарды а-ля Расперри на второй малинке (почему не первой? Тупо мощнее первой и дешевле). Или со своей косностью хотите заставить биолога или гитариста, физиолога-специалиста по внутреннему уху штудировать AСM? Им это не нужно, смысл всей этой затеи - низкий порог вхождения. Или боитесь конкуренции? И правильно. Хреновый из вас тру-программист, если кодите только ради кодинга, не понимая техпроцесса, т.е. смежную дисциплину под которую идет разработка. А биолог, физиолог понимает )

Теперь к баранам - о извечной "тормознутости" проекта при разработке в родной среде Arduino IDE. Таки да, она имеет место быть, макросы, среда исполнения и упрощение синтаксиса дают о себе знать. А что вы хотите, решение ориентировано на массовое использование, где для управления сервой и мигнуть светодиодиками скорости не нужны. Но вам никто не запрещает использовать нативно Си прямо в этой среде. Например, вместо функции DigitalRead(), отнимающей, о-ужас, целых 2 миллисекунды можно сразу написать if (PINA == B00000001) {... и ускориться до 19 мкс. Аналогично с analogWrite(), которая стандартным макаром дает PWM максимум = 480-490 Гц при 16 МГц. Чего делать? Убиться об стенку. Шучу. Пишем прямо в родной среде:
    void setup()
    {
    TCCR1B = TCCR1B & 0b11111000 | 0x02;
    TCCR2B = TCCR2B & 0b11111000 | 0x02;



О чудо, частота PWM уже 4 кГц. И уж точно никто не запрещает прямо в родной среде Arduino IDE писать на ASM:
    ldi r16,(1<<CS00) ;
    out TCCR0B,r16
Типичные вопросы новичков по эксплуатации

1. Правильно-ли я понимаю, что для работы на другом компе где не установлена среда разработки(IDE) Arduino, а следовательно и соответствующие дрова, устройство и программа не будет работать? Ибо без дров среда просто не будет видеть дуину и не сможет ее прошить.

- Нет. Связи между установкой драйверов и установкой самой среды нет. Это независимо. Потому как для того, чтобы написать скетч или библиотеку драйверы не нужны. Среде они нужны только лишь для того, чтобы опять же - через консоль сторонняя утилита прошивальщик AVRDude могла работать с бутлоадером МК. Никто не обязуется при написании прошивки сразу же ее и заливать.

2. Т.е нужно дополнительно таскать и ставить дрова? А зачем, если среда их включает?

- Первые клоны дуины делались с использованием FTDI конверторов, потом появились подделки самих FTDI, потом появились профилик (PL-23xx) и CH340/CH341. Причем одни и те же модели буратин могут быть с конверторами разных производителей. Cейчас этих конверторов куча и стандартный навесок в IDE не обязан содержать их на все случаи жизни, это нерационально, занимает место и глупо. Так что да, для конкретно вашего устройства нужно таскать с собой драйвер или завести оффсайт техподдержки и прикладывать просто ссылку для их скачивания. В виде наклейки на плате, так поступают многие производители, даже промышленные.

3. Если да, то где именно нужно искать дрова, какой набор файлов нужно таскать, и есть ли стандартные средства для установки дров?

- Читаем название чипа, либо смотрим VID/PID в диспетчере устройств и по ситуации. Драйверы на оффсайте производителя вестимо.

4. И есть ли способ, чтобы программа сама отлавливала и узнавала номер COM-порта и подключалось к нему?

- Да, есть. Поскольку в случае буратин речь идет о виртуальном последовательном порту поверх USB, то такое подключение имеет в списке устройств уникальное имя (в случае FTDI его можно даже изменить на какое угодно). Любое устройство на шине USB имеет ряд характеристик-полей, эти поля и включают Name/Serial/VID/PID. Тогда делая энумерацию устройств можно идентифицировать по имени, Serial и VID/PID. Если нам известно уникальное имя устройства, то имея список устройств на шине сопоставить этому имени номер порта как два пальца. Исходники devcon, которая основана на SetupAPI, кстати, открыты и доступны у мелкософта.


Тут нужно понимать, что если искать устройство просто по имени, то таких устройств может быть подключено на USB шину несколько и тогда очень важна уникальность frendly-name. CH340 например ее не дает. Но, если такой конвертор подключен один и видится как USB Serial A например и т.п., то его вполне можно отличить от других портов с другим именем и определить номер его COM-порта без использования VID/PID.

Найти программно номер назначенного ОС данному девайсу по имени и наоборот можно несколькими способами:
  • через реестр (может быть заблокирован политиками безопасности, иметь поврежденную ветку)
  • WMI (служба может быть элементарно отключена у пользователя)
  • SetupAPI (подробнее MSDN и функция SetupDiOpenDeviceInterfaceRegKey).
Последний реализован в моей либе 'GetNumCom.DLL':


5. Как бы найти именно свое устройство и не перепутать его с другим каким-нибудь, и при этом автоматически, чтобы пользователь не заморачивался с выбором вручную?

- Кроме варианта выше - можно тупо перебирать доступные порты (просто по CreateFile пытаемся открыть) и пытаться принять в течении заданного таймаута (пусть 1 секунда) некий уникальный пакет с порта (скажем $AA55), которое должно посылать ваше устройство в Serial. Замечу, что этот метод не требует никаких трех способов выше, нет необходимости лазить в систему и работать будет всегда, когда драйвер уже установлен. Касательно драйвера, его тоже можно установить средствами вашей программы, которая будет идти к вашему устройству на базе, пусть буратины.

6. Но ведь тупо перебирать порты - изначально кривое решение и, согласитесь, читать с чужого устройства байты - плохая идея?

- Скажите это разработчикам сотен тысяч промышленных и бытовых решений поиска устройств на шине RS-485 Modbus/Profibus/CAN/... и в сети. Самый простой пример SNMP. Да, там тупо по циклу перебираются адреса и отсылаются или принимаются посылки для обнаружения  Это не кривое решение, это пожалуй единственное из самых простых и дубовых (не в смысле тупых, глупых, а в смысле железно непробиваемых) решений, обладающее гарантированностью. К тому же эти посылки позволят и обнаружить отвалившееся устройство. Задаем перебор от 1 до 128 (Windows OS имеет ограничение на количество последовательных портов) и пробуем открыть. Это занимает мизерное время. А вот ожидать посылку - да.

Однако

1. Если вдруг мы уже нашли устройство, цикл можно оборвать, а с высокой вероятностью виртуальный порт будет в первой десятке, если пользователь не загадил уже виртуальными драйверами систему.
2. Перебирать можно методом наименьших квадратов.
3. Цикл ожидания уникальной посылки можно сократить, подняв скорость выдачи с буратины, скажем до 115200.

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

- А вы гарантируете, что программа будет запущена у пользователя до включения устройства? Ведь в режиме 24х7 устройство однозначно будет подключено постоянно. Так что обнаружить вновь подключенное устройство будет невозможно, ибо оно уже подключено (нет события подключения). Среди прочего, про реализацию поиска подключенных (и отключенных) реальных и виртуальных устройств на шине через SetupAPI выше упоминалось и работает под любыми Windows OS )))





Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.