3. Настольные системы
(компьютеры, ноутбуки)
● Архитектуры: x86, x86_64
● Производители чипов: Intel, AMD
● Операционные системы: настольные
дистрибутивы Linux, Mac OS X, Windows XXX
● Устройства: стационарные компьютеры,
ноутбуки, серверы
4. Хай-энд мобильные чипы
(планшеты и смартфоны)
● Архитектуры: ARM, MIPS, Intel с X86 тоже
что-то пробует
● Операционные системы: Google Android,
iOS, мобильная Windows, Windows 10
● Устройства: планшеты, смартфоны;
гибридные ноутбуки, серверы с низким
энергопотреблением
5. Мид-энд чипы — хорошая производительность,
низкое потребление энергии
(роутеры)
● Архитектуры: MIPS, ARM
● Операционные системы: Linux + окружение
BusyBox
● Устройства: роутеры, встраиваемые
системы, где нужен Линукс, но не нужна
топовая графика или типа того
6. Микроконтроллеры
(стиральные машины)
● Архитектуры: AVR, MIPS, ARM
● Производители: Atmel ATmega8 (AVR), Microchip
PIC32 (MIPS), STMicroelectronics STM32 (ARM)
● Операционные системы: специализированная
прошивка без ОС, RTOS'ы
● Устройства: счетчики, стиральные машины,
бытовая техника, другие встраиваемые
системы, не требовательные к ресурсам
7. Из отечественного
● Эльбрус: своя архитектура и свое
производство (тянут десктоп с Linux,
военное применение)
● Байкал: лицензия ядра мид-энд MIPS,
производство в Азии
(высокопроизводительные встраиваемые
системы — станки с ЧПУ, планируют
массовый рынок)
20. На заказ
● Высокая точность, тонкие дорожки,
многослойные платы, большой тираж
● Автоматический монтаж компонент
(специальный корпус SMD)
● Резонит (Зеленоград), КБ Связь инжиниринг
(Дубна), Виптех (Нижний Новгород)
● Китай (с текущим курсом уже не так выгодно)
22. Языки описания аппаратного
обеспечения HDL (Verilog/VHDL)
● на заказ: Дизайн на HDL → завод в Азии →
чип ASIC (специализированная микросхема)
● дома: Дизайн на HDL → ПЛИС
● MIPSfpga: исходники промышленного чипа
PIC32MZ для запуска на ПЛИС
● opencores.org
● Есть линия в Зеленограде
24. Плата ChipKIT WF32
● $70 (~5000руб) на digilentinc.com, microchipdirect.com
● Совместима на программном уровне с платформой
Arduino
● Программирование на языке Си/С++
● WiFi, режимы USB хоста и USB-устройства, SD-карта
● Контроллер PIC32MX 80МГц
● 512Кб ПЗУ флеш, 128Кб ОЗУ
25. Порты (ножки или пины) ввода-вывода
● Осуществляют связь между программой и внешним
миром
● Пронумерованы от 0 до 41 (на WF32)
● Каждый порт может работать в режиме ввода или
вывода
● Цифровой режим: для порта определено два
значения 1 (HIGH - плюс) и 0 (LOW - минус)
● В режиме вывода программа записывает в указанный
порт единицу 1 и на порт подаётся напряжение плюс,
при записи 0 подаётся минус (земля/ground/GND)
26. Среда разработки MPIDE
● chipkit.net/started/install-chipkit-software/
● Свободное программное обеспечение
● Работает на Linux, Mac и Windows
● Предварительно необходимо установить
платформу Java: java.oracle.com
Драйвер платы:
● в Linux уже всё есть, хотя может потребоваться
дать права на доступ к устройству /dev/ttyUSBX
● в Windows 7: драйвер в архиве с MPIDE
● в Windows 8: при подключении платы разрешить
искать в интернете
33. Моторчик с коллекторным
двигателем
Без редуктора будет крутиться,
но машинка не поедет
Моторчик с редуктором
крутится медленнее, но тянет
больше нагрузки
55. ВАЖНО: не подключайте плату
через USB к компьютеру, если к
плате подключено внешнее
питание — в лучшем случае
лишитесь платы, в худшем — и
платы, и пары портов USB на
компьютере
58. Задача — ехать по черной линии:
ехать прямо по прямой линии и
поворачивать на поворотах
59. Датчик линии
● У датчика всего три провода: питание Vcc
(5В), земля GDN и сигнал OUT
● OUT=HIGH (т.е. логическая единица), если
поднести его к поверхности черного цвета,
OUT=LOW (т.е. логический ноль), если
поднести его к поверхности любого другого
цвета.
62. Робот умеет
● Ехать вперед
● Ехать назад
● Останавливаться
● Поворачивать налево
● Поворачивать направо
● Определять наличие линии на левом датчике
● Определять наличие линии на правом датчике
63. Алгоритм словами
● Если ни левый, ни правый датчик не видят линии
(линия между датчиками), едем вперёд.
● Иначе (линия есть под левым или под правым
датчиком или сразу под обоими) проверяем, есть ли
линия под правым датчиком.
● Если линия есть под правым датчиком, поворачиваем
направо.
● Иначе (значит линия под левым датчиком)
поворачиваем налево.
● Повторяем всё сначала
69. Блоки с условиями
if( условие ) {
// действия, если условие выполнено (ветка "да")
...
} else {
// действия, если условие не выполнено (ветка "нет")
...
}
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, ПРАВДА,
иначе ЛОЖЬ
71. Сложные условия из нескольких
простых
● a && b (логическое И): если a ПРАВДА И b
ПРАВДА, ПРАВДА, иначе ЛОЖЬ
● a || b (логическое ИЛИ): если a ПРАВДА ИЛИ
b ПРАВДА, ПРАВДА, иначе ЛОЖЬ
● !a (логическое НЕ): если a ЛОЖЬ, ПРАВДА,
иначе ЛОЖЬ
72. Выражения для блоков условий
ПРАВДА, если левый датчик видит линию
( digitalRead(LINE_SENSOR_L) == 1 )
ПРАВДА, если левый датчик не видит линию
( digitalRead(LINE_SENSOR_L) == 0 )
ПРАВДА, если правый датчик видит линию
( digitalRead(LINE_SENSOR_R) == 1 )
ПРАВДА, если правый датчик не видит линию
( digitalRead(LINE_SENSOR_R) == 0 )
74. /**
* Сенсор линии: сенсор подключен к входной ножке и
* подает на нее сигнал:
* 1, если сенсор обнаружил линию (черный цвет),
* 0, если сенсор линию не видит (белый цвет).
*/
#define LINE_SENSOR_L 27
#define LINE_SENSOR_R 28
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);
76. // пин сенсора в режим ввода
pinMode(LINE_SENSOR_L, INPUT);
pinMode(LINE_SENSOR_R, INPUT);
// остановить моторы при старте
mleft_stop();
mright_stop();
}
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();
78. } else {
// линия есть хотябы на одном из датчиков
Serial.println("linia na odnom is datchikov");
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);
80. } else {
// линии нет под правым датчиком, значит она под левым датчиком
Serial.println("leviy datchik -> povorot nalevo");
// ненадолго остановимся, чтобы собраться с мыслями (для отладки)
mleft_stop();
mright_stop();
delay(1000);
// повернуть налево
mleft_backward();
mright_forward();
// поворачиваемся 400 миллисекунд, время получено эмпирически
delay(400);
}
}
}