Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Чипы, платы, роботы

Anton
September 01, 2016

Чипы, платы, роботы

Программирование микроконтроллеров для управления роботами
https://1i7.livejournal.com/

Anton

September 01, 2016
Tweet

More Decks by Anton

Other Decks in Education

Transcript

  1. • Единственная (законнорожденная) дочь поэта Джорджа Гордона Байрона • Сделала

    подробное описание аналитической машины Бэббиджа со своими комментариями • Ввела в употребление термины «цикл» и «рабочая ячейка»
  2. • Привела алгоритм вычислений чисел Бернулли на аналитической машине •

    Алгоритм признан первой в мире программой, а Ада — первым программистом • 10 декабря — день программиста
  3. • Криптономикон, Нил Стивенсон • Ю-571 (2000, Мэтью Макконехи) •

    Энигма (2001) • Игра в имитацию (2014, Бенедикт Камбербэтч)
  4. Настольные системы (компьютеры, ноутбуки) • Архитектуры: x86, x86_64 • Производители

    чипов: Intel, AMD • Операционные системы: настольные дистрибутивы Linux, Mac OS X, Windows XXX • Устройства: стационарные компьютеры, ноутбуки, серверы
  5. Хай-энд мобильные чипы (планшеты и смартфоны) • Архитектуры: ARM, MIPS,

    Intel с X86 тоже что-то пробует • Операционные системы: Google Android, iOS, мобильная Windows, Windows 10 • Устройства: планшеты, смартфоны; гибридные ноутбуки, серверы с низким энергопотреблением
  6. Мид-энд чипы — хорошая производительность, низкое потребление энергии (роутеры) •

    Архитектуры: MIPS, ARM • Операционные системы: Linux + окружение BusyBox • Устройства: роутеры, встраиваемые системы, где нужен Линукс, но не нужна топовая графика или типа того
  7. Микроконтроллеры (стиральные машины) • Архитектуры: AVR, MIPS, ARM • Производители:

    Atmel ATmega8 (AVR), Microchip PIC32 (MIPS), STMicroelectronics STM32 (ARM) • Операционные системы: специализированная прошивка без ОС, RTOS'ы • Устройства: счетчики, стиральные машины, бытовая техника, другие встраиваемые системы, не требовательные к ресурсам
  8. Из отечественного • Эльбрус: своя архитектура и свое производство (тянут

    десктоп с Linux, военное применение) • Байкал: лицензия ядра мид-энд MIPS, производство в Азии (высокопроизводительные встраиваемые системы — станки с ЧПУ, планируют массовый рынок)
  9. На заказ • Высокая точность, тонкие дорожки, многослойные платы, большой

    тираж • Автоматический монтаж компонент (специальный корпус SMD) • Резонит (Зеленоград), КБ Связь инжиниринг (Дубна), Виптех (Нижний Новгород) • Китай (с текущим курсом уже не так выгодно)
  10. Языки описания аппаратного обеспечения HDL (Verilog/VHDL) • на заказ: Дизайн

    на HDL → завод в Азии → чип ASIC (специализированная микросхема) • дома: Дизайн на HDL → ПЛИС • MIPSfpga: исходники промышленного чипа PIC32MZ для запуска на ПЛИС • opencores.org • Есть линия в Зеленограде
  11. Плата ChipKIT WF32 • $70 (~5000руб) на digilentinc.com, microchipdirect.com •

    Совместима на программном уровне с платформой Arduino • Программирование на языке Си/С++ • WiFi, режимы USB хоста и USB-устройства, SD-карта • Контроллер PIC32MX 80МГц • 512Кб ПЗУ флеш, 128Кб ОЗУ
  12. Порты (ножки или пины) ввода-вывода • Осуществляют связь между программой

    и внешним миром • Пронумерованы от 0 до 41 (на WF32) • Каждый порт может работать в режиме ввода или вывода • Цифровой режим: для порта определено два значения 1 (HIGH - плюс) и 0 (LOW - минус) • В режиме вывода программа записывает в указанный порт единицу 1 и на порт подаётся напряжение плюс, при записи 0 подаётся минус (земля/ground/GND)
  13. Среда разработки MPIDE • chipkit.net/started/install-chipkit-software/ • Свободное программное обеспечение •

    Работает на Linux, Mac и Windows • Предварительно необходимо установить платформу Java: java.oracle.com Драйвер платы: • в Linux уже всё есть, хотя может потребоваться дать права на доступ к устройству /dev/ttyUSBX • в Windows 7: драйвер в архиве с MPIDE • в Windows 8: при подключении платы разрешить искать в интернете
  14. Моторчик с коллекторным двигателем Без редуктора будет крутиться, но машинка

    не поедет Моторчик с редуктором крутится медленнее, но тянет больше нагрузки
  15. Микросхема-усилитель L293D • GND — земля (и заодно теплоотвод) •

    Vs — питание двигателей: 4,5-36В • Vss — питание микросхемы: 5В • ENABLE1/2 — включить/выключить левую/правую половину • INPUT1/2/3/4 — слабый сигнал от платы • OUTPUT1/2/3/4 — усиленный сигнал на мотор (от источника Vs)
  16. Сервомоторчики: • Угол поворота 0 — 180 градусов • 3

    провода: питание 5В (+), земля (GND/-), управляющий сигнал
  17. Сенсор звука: всего 3 ножки • GND — земля •

    +5V — питание 5В • OUT — значение сенсора: 0 - звук есть, 1 - звука нет
  18. ВАЖНО: не подключайте плату через USB к компьютеру, если к

    плате подключено внешнее питание — в лучшем случае лишитесь платы, в худшем — и платы, и пары портов USB на компьютере
  19. Задача — ехать по черной линии: ехать прямо по прямой

    линии и поворачивать на поворотах
  20. Датчик линии • У датчика всего три провода: питание Vcc

    (5В), земля GDN и сигнал OUT • OUT=HIGH (т.е. логическая единица), если поднести его к поверхности черного цвета, OUT=LOW (т.е. логический ноль), если поднести его к поверхности любого другого цвета.
  21. Робот умеет • Ехать вперед • Ехать назад • Останавливаться

    • Поворачивать налево • Поворачивать направо • Определять наличие линии на левом датчике • Определять наличие линии на правом датчике
  22. Алгоритм словами • Если ни левый, ни правый датчик не

    видят линии (линия между датчиками), едем вперёд. • Иначе (линия есть под левым или под правым датчиком или сразу под обоими) проверяем, есть ли линия под правым датчиком. • Если линия есть под правым датчиком, поворачиваем направо. • Иначе (значит линия под левым датчиком) поворачиваем налево. • Повторяем всё сначала
  23. Блоки с условиями if( условие ) { // действия, если

    условие выполнено (ветка "да") ... } else { // действия, если условие не выполнено (ветка "нет") ... }
  24. Операторы сравнения — булевы выражения для блоков if • a

    == b : если a равно b, ПРАВДА, иначе ЛОЖЬ • a != b : если a не равно b, ПРАВДА, иначе ЛОЖЬ • a < b : если a меньше b, ПРАВДА, иначе ЛОЖЬ • a > b : если a больше b, ПРАВДА, иначе ЛОЖЬ • a <= b : если a меньше или равно b, ПРАВДА, иначе ЛОЖЬ • a >= b : если a больше или равно b, ПРАВДА, иначе ЛОЖЬ
  25. Сложные условия из нескольких простых • a && b (логическое

    И): если a ПРАВДА И b ПРАВДА, ПРАВДА, иначе ЛОЖЬ • a || b (логическое ИЛИ): если a ПРАВДА ИЛИ b ПРАВДА, ПРАВДА, иначе ЛОЖЬ • !a (логическое НЕ): если a ЛОЖЬ, ПРАВДА, иначе ЛОЖЬ
  26. Выражения для блоков условий ПРАВДА, если левый датчик видит линию

    ( digitalRead(LINE_SENSOR_L) == 1 ) ПРАВДА, если левый датчик не видит линию ( digitalRead(LINE_SENSOR_L) == 0 ) ПРАВДА, если правый датчик видит линию ( digitalRead(LINE_SENSOR_R) == 1 ) ПРАВДА, если правый датчик не видит линию ( digitalRead(LINE_SENSOR_R) == 0 )
  27. /** * Сенсор линии: сенсор подключен к входной ножке и

    * подает на нее сигнал: * 1, если сенсор обнаружил линию (черный цвет), * 0, если сенсор линию не видит (белый цвет). */ #define LINE_SENSOR_L 27 #define LINE_SENSOR_R 28
  28. void setup() { Serial.begin(9600); Serial.println("Start Robot Car - the line

    follower!"); pinMode(MOTOR_LEFT_1, OUTPUT); pinMode(MOTOR_LEFT_2, OUTPUT); pinMode(MOTOR_LEFT_EN, OUTPUT); pinMode(MOTOR_RIGHT_1, OUTPUT); pinMode(MOTOR_RIGHT_2, OUTPUT); pinMode(MOTOR_RIGHT_EN, OUTPUT);
  29. // пин сенсора в режим ввода pinMode(LINE_SENSOR_L, INPUT); pinMode(LINE_SENSOR_R, INPUT);

    // остановить моторы при старте mleft_stop(); mright_stop(); }
  30. void loop() { if( digitalRead(LINE_SENSOR_L) == 0 && digitalRead(LINE_SENSOR_R) ==

    0 ) { //Serial.println("Proverka linii: linii net na 2x datchikah"); // линии нет на обоих датчиках // едем вперед mleft_forward(); mright_forward();
  31. } else { // линия есть хотябы на одном из

    датчиков Serial.println("linia na odnom is datchikov");
  32. if( digitalRead(LINE_SENSOR_R) == 1 ) { // линия под правым

    датчиком Serial.println("praviy datchik -> povorot napravo"); // ненадолго остановимся, чтобы собраться с мыслями (для отладки) mleft_stop(); mright_stop(); delay(1000); // поворачиваем направо mleft_forward(); mright_backward(); // поворачиваемся 400 миллисекунд, время получено эмпирически delay(400);
  33. } else { // линии нет под правым датчиком, значит

    она под левым датчиком Serial.println("leviy datchik -> povorot nalevo"); // ненадолго остановимся, чтобы собраться с мыслями (для отладки) mleft_stop(); mright_stop(); delay(1000); // повернуть налево mleft_backward(); mright_forward(); // поворачиваемся 400 миллисекунд, время получено эмпирически delay(400); } } }