81
Программирование микроконтроллеров для управления роботами

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

Embed Size (px)

Citation preview

Page 1: Чипы, платы, роботы

Программирование микроконтроллеров для управления роботами

Page 2: Чипы, платы, роботы

Микропроцессоры и архитектуры

Page 3: Чипы, платы, роботы

Настольные системы (компьютеры, ноутбуки)

● Архитектуры: x86, x86_64● Производители чипов: Intel, AMD● Операционные системы: настольные

дистрибутивы Linux, Mac OS X, Windows XXX● Устройства: стационарные компьютеры,

ноутбуки, серверы

Page 4: Чипы, платы, роботы

Хай-энд мобильные чипы (планшеты и смартфоны)

● Архитектуры: ARM, MIPS, Intel с X86 тоже что-то пробует

● Операционные системы: Google Android, iOS, мобильная Windows, Windows 10

● Устройства: планшеты, смартфоны; гибридные ноутбуки, серверы с низким энергопотреблением

Page 5: Чипы, платы, роботы

Мид-энд чипы — хорошая производительность, низкое потребление энергии

(роутеры)

● Архитектуры: MIPS, ARM● Операционные системы: Linux + окружение

BusyBox● Устройства: роутеры, встраиваемые

системы, где нужен Линукс, но не нужна топовая графика или типа того

Page 6: Чипы, платы, роботы

Микроконтроллеры(стиральные машины)

● Архитектуры: AVR, MIPS, ARM● Производители: Atmel ATmega8 (AVR), Microchip

PIC32 (MIPS), STMicroelectronics STM32 (ARM)● Операционные системы: специализированная

прошивка без ОС, RTOS'ы● Устройства: счетчики, стиральные машины,

бытовая техника, другие встраиваемые системы, не требовательные к ресурсам

Page 7: Чипы, платы, роботы

Из отечественного

● Эльбрус: своя архитектура и свое производство (тянут десктоп с Linux, военное применение)

● Байкал: лицензия ядра мид-энд MIPS, производство в Азии (высокопроизводительные встраиваемые системы — станки с ЧПУ, планируют массовый рынок)

Page 8: Чипы, платы, роботы

Платы для разработки

Page 9: Чипы, платы, роботы

Raspberry Pi (протухший хай-энд ARM, тянет Linux, Android со скрипом)

Page 10: Чипы, платы, роботы

Raspberry Pi 2(хай-энд ARM посвежее, тянет Android и Windows 10)

Page 11: Чипы, платы, роботы

Black SWIFT/Unwired One(мид-энд MIPS)

Page 12: Чипы, платы, роботы

Arduino(микроконтроллер ATmega8 AVR)

Page 13: Чипы, платы, роботы

Клоны Arduino(тысячи их)

Page 14: Чипы, платы, роботы

и так далее

Page 15: Чипы, платы, роботы

Сделать плату

Page 16: Чипы, платы, роботы

Дома

● ЛУТ (лазерно-утюжная технология)● Фототравление● Фрезерование● Принтеры, печатающие проводящей краской

Page 17: Чипы, платы, роботы

Фрезерование

Page 18: Чипы, платы, роботы

Лазерный принтер+утюг

Page 19: Чипы, платы, роботы

Принтер с проводящими чернилами

Page 20: Чипы, платы, роботы

На заказ

● Высокая точность, тонкие дорожки, многослойные платы, большой тираж

● Автоматический монтаж компонент (специальный корпус SMD)

● Резонит (Зеленоград), КБ Связь инжиниринг (Дубна), Виптех (Нижний Новгород)

● Китай (с текущим курсом уже не так выгодно)

Page 21: Чипы, платы, роботы

Сделать чип

Page 22: Чипы, платы, роботы

Языки описания аппаратного обеспечения HDL (Verilog/VHDL)

● на заказ: Дизайн на HDL → завод в Азии → чип ASIC (специализированная микросхема)

● дома: Дизайн на HDL → ПЛИС● MIPSfpga: исходники промышленного чипа

PIC32MZ для запуска на ПЛИС● opencores.org● Есть линия в Зеленограде

Page 23: Чипы, платы, роботы

практика

Page 24: Чипы, платы, роботы

Плата ChipKIT WF32● $70 (~5000руб) на digilentinc.com, microchipdirect.com● Совместима на программном уровне с платформой

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

Page 25: Чипы, платы, роботы

Порты (ножки или пины) ввода-вывода

● Осуществляют связь между программой и внешним миром

● Пронумерованы от 0 до 41 (на WF32)● Каждый порт может работать в режиме ввода или вывода

● Цифровой режим: для порта определено два значения 1 (HIGH - плюс) и 0 (LOW - минус)

● В режиме вывода программа записывает в указанный порт единицу 1 и на порт подаётся напряжение плюс, при записи 0 подаётся минус (земля/ground/GND)

Page 26: Чипы, платы, роботы

Среда разработки MPIDE● chipkit.net/started/install-chipkit-software/● Свободное программное обеспечение● Работает на Linux, Mac и Windows● Предварительно необходимо установить

платформу Java: java.oracle.com

Драйвер платы:● в Linux уже всё есть, хотя может потребоваться

дать права на доступ к устройству /dev/ttyUSBX● в Windows 7: драйвер в архиве с MPIDE● в Windows 8: при подключении платы разрешить

искать в интернете

Page 27: Чипы, платы, роботы

Запускаем среду разработки MPIDE

Меню Tools > Board > chipKIT > chipKIT WF32

Page 28: Чипы, платы, роботы

Светодиод (LED) и беспаячная макетная плата (breadboard)

Page 29: Чипы, платы, роботы

Настройка перед стартом: void setup(), установка режима порта pinMode()

Page 30: Чипы, платы, роботы

Бесконечный цикл void loop(), запись значений в порт digitalWrite()

Page 31: Чипы, платы, роботы

Загрузка прошивки на плату: наверху вторая слева кнопка Upload

Page 32: Чипы, платы, роботы

То горит, то не горит

Page 33: Чипы, платы, роботы

Моторчик с коллекторным двигателем

Без редуктора будет крутиться, но машинка не поедет

Моторчик с редуктором крутится медленнее, но тянет

больше нагрузки

Page 34: Чипы, платы, роботы

Управление мотором: микросхема-драйвер-усилитель L293D

Page 35: Чипы, платы, роботы

Микросхема-усилитель L293D

● GND — земля (и заодно теплоотвод)● Vs — питание двигателей: 4,5-36В● Vss — питание микросхемы: 5В● ENABLE1/2 — включить/выключить

левую/правую половину● INPUT1/2/3/4 — слабый сигнал от платы● OUTPUT1/2/3/4 — усиленный сигнал на мотор

(от источника Vs)

Page 36: Чипы, платы, роботы

Управление мотором

Page 37: Чипы, платы, роботы

Взад-вперёд

Page 38: Чипы, платы, роботы

Сервомоторчики: ● Угол поворота 0 — 180 градусов● 3 провода: питание 5В (+), земля (GND/-),

управляющий сигнал

Page 39: Чипы, платы, роботы

Управление серво-моторчиком:библиотека Servo.h

Page 40: Чипы, платы, роботы

Повернулись-зафиксировались

Page 41: Чипы, платы, роботы

Разные датчики

на ardunn.ru

Page 42: Чипы, платы, роботы

Сенсор звука: всего 3 ножки

● GND — земля● +5V — питание 5В● OUT — значение сенсора: 0 - звук есть,

1 - звука нет

Page 43: Чипы, платы, роботы

Реагируем на звук: setup

Page 44: Чипы, платы, роботы

Реагируем на звук: loop

Page 45: Чипы, платы, роботы

Хлопаем в ладоши

Page 46: Чипы, платы, роботы

Немного прокатимся

Page 47: Чипы, платы, роботы
Page 48: Чипы, платы, роботы

Константы для ножек

Page 49: Чипы, платы, роботы

Левый мотор: вперёд, назад,

стоп

Page 50: Чипы, платы, роботы

Правый мотор: вперёд, назад,

стоп

Page 51: Чипы, платы, роботы

Все ножки в режим

вывода

Page 52: Чипы, платы, роботы

2 секунды вперёд, 2 секунды

разворачиваемся, ждём секунду;

и так вечно бесконечно

Page 53: Чипы, платы, роботы

Выключаем штекер от батареек, перемычку J15 переводим из положения EXT в UART

Page 54: Чипы, платы, роботы

Подключаем плату через USB к компьютеру, прошиваем из MPIDE

Page 55: Чипы, платы, роботы

ВАЖНО: не подключайте плату через USB к компьютеру, если к

плате подключено внешнее питание — в лучшем случае

лишитесь платы, в худшем — и платы, и пары портов USB на

компьютере

Page 56: Чипы, платы, роботы

Отключаем USB, возвращаем J15 из UART в EXT, подключаем батарейки

Page 57: Чипы, платы, роботы

Учимся программироватьс Роботом Машинкой

Page 58: Чипы, платы, роботы

Задача — ехать по черной линии: ехать прямо по прямой линии и

поворачивать на поворотах

Page 59: Чипы, платы, роботы

Датчик линии

● У датчика всего три провода: питание Vcc (5В), земля GDN и сигнал OUT

● OUT=HIGH (т.е. логическая единица), если поднести его к поверхности черного цвета, OUT=LOW (т.е. логический ноль), если поднести его к поверхности любого другого цвета.

Page 60: Чипы, платы, роботы
Page 61: Чипы, платы, роботы

Трасса без перекрестков, без маркеров, без пересечений: просто замкнутая линия

Page 62: Чипы, платы, роботы

Робот умеет

● Ехать вперед● Ехать назад● Останавливаться● Поворачивать налево● Поворачивать направо● Определять наличие линии на левом датчике● Определять наличие линии на правом датчике

Page 63: Чипы, платы, роботы

Алгоритм словами

● Если ни левый, ни правый датчик не видят линии (линия между датчиками), едем вперёд.

● Иначе (линия есть под левым или под правым датчиком или сразу под обоими) проверяем, есть ли линия под правым датчиком.

● Если линия есть под правым датчиком, поворачиваем направо.

● Иначе (значит линия под левым датчиком) поворачиваем налево.

● Повторяем всё сначала

Page 64: Чипы, платы, роботы

Алгоритм в виде блок-схемы

Page 65: Чипы, платы, роботы

Блок-схема → код на С++

Page 66: Чипы, платы, роботы

Блоки действий

команда вперёд

mleft_forward();

mright_forward();

команда назад

mleft_backward();

mright_backward();

Page 67: Чипы, платы, роботы

Блоки действий

команда налево

mleft_backward();

mright_forward();

команда направо

mleft_forward();

mright_backward();

Page 68: Чипы, платы, роботы

Блоки действий

команда стоп

mleft_stop();

mright_stop();

Page 69: Чипы, платы, роботы

Блоки с условиями

if( условие ) {

// действия, если условие выполнено (ветка "да")

...

} else {

// действия, если условие не выполнено (ветка "нет")

...

}

Page 70: Чипы, платы, роботы

Операторы сравнения — булевы выражения для блоков 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, ПРАВДА,

иначе ЛОЖЬ

Page 71: Чипы, платы, роботы

Сложные условия из нескольких простых

● a && b (логическое И): если a ПРАВДА И b ПРАВДА, ПРАВДА, иначе ЛОЖЬ

● a || b (логическое ИЛИ): если a ПРАВДА ИЛИ b ПРАВДА, ПРАВДА, иначе ЛОЖЬ

● !a (логическое НЕ): если a ЛОЖЬ, ПРАВДА, иначе ЛОЖЬ

Page 72: Чипы, платы, роботы

Выражения для блоков условий

ПРАВДА, если левый датчик видит линию

( digitalRead(LINE_SENSOR_L) == 1 )

ПРАВДА, если левый датчик не видит линию

( digitalRead(LINE_SENSOR_L) == 0 )

ПРАВДА, если правый датчик видит линию

( digitalRead(LINE_SENSOR_R) == 1 )

ПРАВДА, если правый датчик не видит линию

( digitalRead(LINE_SENSOR_R) == 0 )

Page 73: Чипы, платы, роботы

Прошивка для машинки

Page 74: Чипы, платы, роботы

/**

* Сенсор линии: сенсор подключен к входной ножке и

* подает на нее сигнал:

* 1, если сенсор обнаружил линию (черный цвет),

* 0, если сенсор линию не видит (белый цвет).

*/

#define LINE_SENSOR_L 27

#define LINE_SENSOR_R 28

Page 75: Чипы, платы, роботы

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

Page 76: Чипы, платы, роботы

// пин сенсора в режим ввода

pinMode(LINE_SENSOR_L, INPUT);

pinMode(LINE_SENSOR_R, INPUT);

// остановить моторы при старте

mleft_stop();

mright_stop();

}

Page 77: Чипы, платы, роботы

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

Page 78: Чипы, платы, роботы

} else {

// линия есть хотябы на одном из датчиков

Serial.println("linia na odnom is datchikov");

Page 79: Чипы, платы, роботы

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

Page 80: Чипы, платы, роботы

} else {

// линии нет под правым датчиком, значит она под левым датчиком

Serial.println("leviy datchik -> povorot nalevo");

// ненадолго остановимся, чтобы собраться с мыслями (для отладки)

mleft_stop();

mright_stop();

delay(1000);

// повернуть налево

mleft_backward();

mright_forward();

// поворачиваемся 400 миллисекунд, время получено эмпирически

delay(400);

}

}

}

Page 81: Чипы, платы, роботы

1i7.livejournal.com

Антон Моисеев