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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Anton Anton
September 01, 2016

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

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

Avatar for Anton

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); } } }