шаблоны сайт визитка joomla
Скачать шаблоны Joomla 3.5 бесплатно
Вы находитесь здесь:Главная»Программирование роботов»Показать содержимое по тегу: Программирование роботов - Толтек Плюс - Учебный центр в г.Стерлитамак

Светодиодная матрица на базе MAX7219

Вторник, 27 сентября 2016 11:58

Часто в проектах по робототехнике приходится использовать светодиоды. Иногда проще использовать светодиодные матрицы. В этом примере мы рассмотрим светодиодную матрицу 8 на 8, на которой будем  выводить изображения глаз и сердца.  Для удобства подключения используем модуль матричного дисплея Max7219 и библиотеку LedControl.

Для сборки побребуется:

Ардуино Уно

Модуль матричного дисплея MAX7219

Соединительные провода

Схема подключения:

Circuito Matriz 8x8 Max7219

Пример №1 программного кода:

/* на дисплей выводится сердце*/

#include <LedControl.h>
LedControl lc = LedControl(4, 6, 5, 8); // контакты: DIN,CLK,CS,
char incomingByte;
byte love[] =
{
B00001100,
B00011110,
B00111110,
B01111100,
B01111100,
B00111110,
B00011110,
B00001100,
};
void OutGlazaLove()
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0, i, love[i]);
}
}
void setup() {
lc.shutdown(0, false); // Включаем дисплеи
lc.setIntensity(0, 5); // Установка яркости
lc.clearDisplay(0); // Очищаем дисплей
OutGlazaLove();
}
void loop() {

}


max7219 schema1

Рассмотрим пример последовательного  подключения двух модулей матричного дисплея Max7219

Пример №2 программного кода:

/* на дисплей выводится сердце,  мелкий зрачок, большие глаза в зависимости от того, какую клавишу нажмет пользователь. Чтобы ввести  данные, вам потребуется открыть монитор последовательного порта*/

#include <LedControl.h>
LedControl lc = LedControl(7, 4, 5, 8); // контакты: DIN,CLK,CS,
char incomingByte;
byte glaza[] =
{
B00000000,
B00000000,
B00011000,
B00111100,
B00111100,
B00011000,
B00000000,
B00000000
};
byte glazaBig[] =
{
B00000000,
B00011000,
B00111100,
B01100110,
B01100110,
B00111100,
B00011000,
B00000000
};
byte love[] =
{
B00001100,
B00011110,
B00111110,
B01111100,
B01111100,
B00111110,
B00011110,
B00001100,
};
void OutGlaza()
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0, i, glaza[i]);
lc.setRow(1, i, glaza[i]);
}
}
void OutGlazaBig()
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0, i, glazaBig[i]);
lc.setRow(1, i, glazaBig[i]);
}
}
void OutGlazaLove()
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0, i, love[i]);
lc.setRow(1, i, love[i]);
}
}
void setup() {
lc.shutdown(0, false);
lc.shutdown(1, false);
lc.setIntensity(0, 5);
lc.setIntensity(1, 5);
lc.clearDisplay(0);
lc.clearDisplay(1);
Serial.begin(9600);
while (!Serial) ;
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == '1') {
OutGlaza();
}
if (incomingByte == '2') {
OutGlazaBig();
}
if (incomingByte == '3') {
OutGlazaLove();
}
}
}


Широтно-импульсная модуляция (ШИМ)

Рано или поздно нам надоест, что светодиод всегда светит ярко или моторы крутятся с постоянной скоростью. Но на помощь приходят ШИМ-порты. Широтно-Импульсная модуляция, или ШИМ, это операция получения изменяющегося аналогового значения посредством цифровых устройств. Другими словами, устройства используются для получения прямоугольных импульсов - сигнала, который постоянно переключается между максимальным и минимальным значениями.   Данный сигнал моделирует напряжение между максимальным значением (5 В) и минимальным (0 В), изменяя при этом длительность времени включения 5 В относительно включения 0 В. Длительность включения максимального значения называется шириной импульса. Для получения различных аналоговых величин изменяется ширина импульса. При достаточно быстрой смене периодов включения-выключения можно подавать постоянный сигнал между 0 и 5 В на светодиод, тем самым управляя яркостью его свечения.

На графике зеленые линии отмечают постоянные временные периоды. Длительность периода обратно пропорциональна частоте ШИМ. Т.е. если частота ШИМ составляет 500 Гц, то зеленые линии будут отмечать интервалы длительностью в 2 миллисекунды каждый. Вызов функции analogWrite() с масштабом 0 – 255 означает, что значение analogWrite(255) будет соответствовать 100% рабочему циклу (постоянное включение 5 В), а значение analogWrite(127) – 50% рабочему циклу. Обратите внимание на то, что ШИМ имеют только пниы: 3, 5, 6, 9, 10, 11.

Широтно-импульсная модуляция ШИМ PWM

Приведу пример изменения яркости светодиода c помощью потенционометра. Подключим светодиод к 9 пину через резистор 220Ом и потенционометр к 0 аналоговому выходу.

схема новая

Теперь осталось только всё запрограммировать. Есть два варианта это сделать. Можно полученные значения с потенционометра разделить на 4 и отправить их на светодиод, или умножить полученные значения с потенционометра на 255, а потом разделить на 1023. Второй способ будет более точным. Вот сам программный код:

#define LedPin 9
#define PotPin 0

void setup() {
    pinMode (LedPin, OUTPUT);

void loop() {
    int PotVal = analogRead(Pot_Pin);
    analogWrite(LedPin, (PotVal*255/1023));
    delay(20);
}


Сдвиговый регистр 74HC595

Понедельник, 04 июля 2016 12:17

Подключение сдвигового регистра, или как увеличить количество пинов на Arduino.

Рано или поздно, когда мы будем создавать новый проект, у нас может не хватить пинов на Arduino. Что же делать в этом случае? Неужели придется покупать еще один микроконтроллер, думать о синхронизации двух устройств? Конечно нет. Существует решение проблемы недостатка выводов — выходной сдвиговый регистр, например, микросхема 74HC595.

74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходе.

микросхема

Другими словами этот регистр позволяет контролировать 8 выходов, используя всего несколько выходов на самом контроллере. При этом несколько таких регистров можно объединять последовательно для увеличения количества пинов, но не занимая новых пинов Arduino.

К минусам использования сдвигового регистра стоит отнести невозможность использования широтно-импульсной модуляции (ШИМ), потому что выходы регистра могут иметь только логические значения HIGH (1) и LOW (0).

Распиновка входов/выходов регистра

 распиновка микросхемы

№ Пина Обозначение Функция
1-7, 15 Q1-Q7, Q0 Цифровые выводы регистра
8 GND Земля
9 Q7′ Выход для подключения регистров каскадом
10 MR Сброс значений регистра (при подаче сигнала LOW)
11 SH_CP Вход тактовых импульсов
12 ST_CP Синхронизация выходов
13 OE Переключение выходов из высокоомного состояния в рабочий режим (при подаче сигнала LOW) и обратно (при подаче сигнала HIGH)
14 DS Вход последовательных данных
16 Vcc Питание +5V

В исходном состоянии выводы регистра находятся в высокоомном состоянии. Это значит, что другие элементы могут изменять напряжение на них, не влияя на работоспособность и логику микросхемы. Это может быть полезно, если одними и теми же элементами планируется управлять при помощи разных регистров — когда активен один (сигнал LOW на входе OE), следует перевести второй в высокоомное состояние (сигнал HIGH на входе OE). Если регистр всего один, можно смело подключать OE к земле. Также к земле подключается выход GND.

Для нормального функционирования регистра при подключении также следует подключить вход MR к рельсе питания. Туда же подключаем Vcc.

схема подключения

Пины 1-7 соединены с анодами (длинными ножками) светодиодов (зеленые провода), начиная со 2-го светодиода

Пин 8 соединен с землей (синий провод)

Пин 9 ни с чем не соединен

Пин 10 соединен с +5 V (красный провод)

Пин 11 соединен с 4-м пином Arduino (черный провод)

Пин 12 соединен с 3-м пином Arduino (еще один черный провод). Также пин 12 соединен с землей через конденсатор 0.1 мкФ (желтый провод)

Пин 13 соединен с землей (синий провод)

Пин 14 соединен с 2-м пином Arduino (черный провод)

Пин 15 соединен с анодом (длинная ножка) первого светодиода (зеленый провод)

Пин 16 соединен +5 V (красный провод)

Программный код

В качестве примера будем управлять восемью светодиодами. Проверьте правильность подключения элементов и загрузите в Arduino следующий скетч:

 //Пин SH_CP
int SH_CP = 4;
//Пин ST_CP
int ST_CP = 3;
//Пин DS
int DS = 2;

void setup() {
    // Настраиваем выходы SH_CP, ST_CP, DS
    pinMode(SH_CP, OUTPUT);
    pinMode(ST_CP, OUTPUT);
    pinMode(DS, OUTPUT);
}

void loop() {
    for (int i = 0; i < 256; i++) {
        // Инициализируем начало приема данных
        digitalWrite(ST_CP, LOW);
        // Последовательная передача данных на пин DS
        shiftOut(DS, SH_CP, MSBFIRST, i);
        // Инициализируем окончание передачи данных.
        // Регистр подаст напряжение на указанные выходы
        digitalWrite(ST_CP, HIGH);
        // Задержка 0.5 секунды
        delay(500);
    }
}

Рассмотрим пример подробнее. Вас должна заинтересовать функция shiftOut — именно она управляет передачей данных в регистр. У этой функции всего четыре параметра. Первые два — пин, по которому передаются данные (подключенный ко входу DS) и пин тактовых импульсов (подключенный ко входу SH_CP). Третий параметр определяет параметр передачи битов в регистр: MSBFIRST — прямой порядок, начиная со старшего (первого) бита; MSBLAST — обратный порядок, начиная с младшего (последнего бита). И, наконец, четвертый параметр — непосредственно значение, которое должно быть передано в регистр. В данном случае мы передаем значение от 0 до 255 (2 в степени 8 — вы же не забыли что регистр 8-ми битный?). С практической точки зрения, когда нужно активировать определенные выходы, можно использовать битовые представления чисел, например:

// Загорится первый светодиод
shiftOut(DS, SH_CP, MSBFIRST, 0b10000000);
// Загорятся 2, 4, 6, 8 светодиоды
shiftOut(DS, SH_CP, MSBFIRST, 0b01010101);
// Загорится первый светодиод - порядок передачи битов обратный
shiftOut(DS, SH_CP, MSBLAST, 0b00000001);

Итак, нам удалось разобраться с одним сдвиговым регистром. Добавим ещё второй сдвиговый регистр — вот новая схема подключения. Обратите внимание, что изменений не так много — просто два регистра соединены между собой по пинам Q7′ — DS. Второй конденсатор подключать не нужно.

схема подключения 2

Подключение первого регистра не изменилось, за исключением того, что пин 9 соединен с пином 14 второго регистра (оранжевый провод). Подключение второго регистра полностью идентично подключению первого регистра (за исключением отсутствия конденсатора и уже упомянутого пина 14).

Загрузим скетч для последовательного зажигания всех 16 светодиодов:

 //Пин SH_CP
int SH_CP = 4;
//Пин ST_CP
int ST_CP = 3;
//Пин DS
int DS = 2;

void setup() {
    // Настраиваем выходы SH_CP, ST_CP, DS
    pinMode(SH_CP, OUTPUT);
    pinMode(ST_CP, OUTPUT);
    pinMode(DS, OUTPUT);
}

void loop() {
    // Цикл обхода 16 светодиодов
    for (int i = 0; i < 16; i++) {

        // Запись в регистр

        registerWrite(i, HIGH);

        // Задержка 0.5 с.

        delay(500);

        // Отключение предыдущего светодиода

        if (i > 0) {
            registerWrite(i - 1, LOW);
        }
        // Отключение последнего светодиода
        // ("предыдущий" для первого"
        else {
            registerWrite(15, LOW);
        }
    }
}

// Метод для отсылки данных в регистры
void registerWrite(int num, int state) {
    // Для хранения 16 битов используется unsigned int
    unsigned int bitsToSend = 0;
    // 0b000000000000000
    // Инициализируем начало приема данных
    digitalWrite(ST_CP, LOW);

    // Устанавливаем 1 в соответствующий бит
    bitWrite(bitsToSend, num, state);

    // 16 бит необходимо разделить на два байта:
    // И записать каждый байт в соответствующий регистр
    byte register1 = highByte(bitsToSend);
    byte register2 = lowByte(bitsToSend);

    // Последовательная передача данных на пин DS
    shiftOut(DS, SH_CP, MSBFIRST, register2);
    shiftOut(DS, SH_CP, MSBFIRST, register1);

    // Инициализируем окончание передачи данных.
    // Регистры подадут напряжение на указанные выходы
    digitalWrite(ST_CP, HIGH);
}

Обратите внимание на функции, которые сильно облегчат работу со сдвиговыми регистрами: bitWrite пишет указанный бит в заданную позицию числа, а highByte и lowByte берут соответственно старший (левые 8 бит) и младший (правые 8 бит) байты из переданного числа.

Итак, у нас получилось подключить 16 светодиодов, используя всего 3 пина Arduino.


Летний технокласс

Суббота, 18 июня 2016 23:30

Летние каникулы – прекрасное время для того, чтобы узнать что-то новое, провести время на свежем воздухе, познакомиться с людьми, с которыми у вас похожие интересы. Для ребят, переходящих в 5-11 классы и интересующихся программированием, теорией алгоритмов, математикой, робототехникой, НОЦ "Промышленная робототехника и медицинская физика" организует ежегодную летнюю школу в Стерлитамаке.


Подключение библиотеки в Arduino

Понедельник, 27 апреля 2015 00:53

 Библиотека в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).

В некоторых языках программирования (например, в Python) то же, что "модуль", в некоторых — несколько модулей. С точки зрения операционной системы (ОС) и прикладного ПО, библиотеки разделяются на динамические и статические.

Термин «библиотека подпрограмм», по всей видимости, одними из первых упомянули Уилкс М., Уиллер Д., Гилл С. в качестве одной из форм организации вычислений на компьютере. Исходя из изложенного в их книге, под библиотекой понимался набор «коротких, заранее заготовленных программ для отдельных, часто встречающихся (стандартных) вычислительных операций»


Как устанавливать библиотеки в Arduino - для Windows

Платформа Arduino при подключении многих устройств требует и подключение библиотек. Например,бимоду для работы с TFT дисплеями вам понадобится не только дисплей, но и библиотека UTFT для успешной работы с дисплеем.

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

Например, в библиотеке для работы с дисплеями LiquidCrystal, есть 10 примеров, каждый из которых демонстрирует определенную работу с дисплеем.

Например, понадобилось  подключить дисплей  TFT01-22SP на чипе ILI9341. В среде разработки есть базовая библиотека для работы с  TFT дисплеями, но она мало функциональна и работает не со всеми дисплеями, а библиотека UTFT, которую мы хотим установить, более функциональна и удобна.

Нужно скачать библиотеку и разархивировать ее.

Потом - перейти в папку где установлена Arduino IDE , к примеру  -  путь  C:\Program Files\Arduino , и открыть папку libraries. Тогда станут видны все библиотеки в Arduino IDE.

Далее - скопировать только что скаченную и разархивированную библиотеку UTFT в корень и открыть для проверки.

Видим что все нормально, закрываем Arduino IDE и все открытые окна программы.

Дальше необходимо вновь запустить Arduino IDE,  и - наша библиотека успешно установлена.


 

 Как устанавливать библиотеки в Arduino - для Linux (Ubuntu)

 Для начала необходимо скачать файл с библиотекой в формате zip. Сохраняем архив в удобном месте. Далее - распаковывем (Extract) его в папку Sketchbook/Libraries.  При необходимости нужно будет дать библиотеке понятное имя без лишних символов. Перезапускаем IDE и открываем какой-нибудь пример с нашей библиотекой. Если компилляция пройдет успешно, то библиотека установлена правильно.

'xxxx' does not name a type - наиболее распространенная ошибка, которая возникает, когда компилятор не может найти библиотеку. Это может быть в результате того, что: библиотека не установлена, неправильное расположение папки, неправильное наименование папки, неправильное наименование библиотеки, зависимости библиотеки, не перезапущена среда Arduino IDE.


 

 Подключение библиотек

 Для того, чтобы подключить библиотеку, откроем Arduino IDE. Далее - идем на вкладку "Скетч" - "Импортировать библиотеку" - и выбираем из открывшегося списка то, что нам нужно. В итоге - импортированная библиотека для работы с дисплеями будет выглядеть так в самом программном коде:

#include <LiquidCrystal.h>

 


Команда Толтеки учебного центра Толтек Плюс заняла 4-ое место в Республиканском турнире по Робототехнике!


Программирование роботов

Среда, 14 января 2015 23:26

В ходе курса Ваш ребенок узнает об основах программирования, научится программировать  микроконтроллеры, сможет самостоятельно проектировать роботизированные устройства. В конце курса Ваш ребенок создаст  свой финальный проект - робота. Под руководством опытного педагога знакомство с микроконтроллером Ардуино пройдет увлекательно!


Новости о нас

Расписание занятий для каждой сформированной группы по робототехнике на 2017-2018 учебный год. Подробнее
Учебный год начался, и у нас очередная радостная новость для вас, педагоги! В этом году... Подробнее
Наши учащиеся выступили на августовской конференции педагогов! Подробнее
Хочешь учиться в Толтеке по выгодной цене? Приводи друзей и получай большие скидки!... Подробнее
19 августа в ТРЦ Сити Молл с блеском прошел РобоКвест! Героями квеста стали более сотни... Подробнее

Наши партнеры

 TZOyoOCZ8y0 logotip novy SF BashGU  utv logo  CityMoll  VolnoeDelo