Быстрее секунды: роботы продолжают улучшать время сборки кубика Рубика
Первая попытка собрать кубик Рубика интуитивно, без использования уже разработанных и хорошо описанных методов, натыкается на бессильное поражение. После ознакомления с соответвующими инструкциями задача решается, хотя повторение алгоритмов требует минуты.
Но какое минимальное время нужно, чтобы привести каждую из граней случайно перемешанного кубика к одному цвету? Люди достигли пяти секунд. А машины недавно стали быстрее секунды. Речь идёт о уже описанном роботе Джея Флэтлэнда и ещё более быстром новом претенденте на мировой рекорд Sub1.
Итак, задача состоит в том, чтобы получить случайно перемешанный кубик 3×3×3, ознакомиться с его конфигурацией и вращением привести каждую из граней к одному цвету. Делать это не нужно вслепую или в темноте, движения никак не ограничены. Нужна лишь скорость.
Допустимые модели кубиков, порядок перемешивания и прочие детали регулируются регистрирующей результат организацией. Одно остаётся неизменным: максимальное оптимальное число ходов никогда не может быть больше 20. Это так называемое число Бога.
Сейчас рекорд среди людей принадлежит американскому подростку Лукасу Эттеру. Он поставил его осенью 2015 года, решив головоломку за 4,9 секунды. Рекорд зарегистрирован World Cube Association, организацией, которая регулирует соревнования по кубику Рубика. Результат является постепенным улучшением последних десятков лет. К примеру, в 1982 году рекордом было время в 19 секунд.
Текущий лучший результат среди людей.
Достижение подобных результатов требует тренировок и полного автоматизма движений. Почему бы решать задачу машинами, а не неуклюжими пальцами? Подобно людям, роботы плавно улучшают результаты, пусть и куда быстрее.
К примеру, в 2011 году CubeStormer 2 был в состоянии управиться за немногим более 5 секунд. В 2014 году CubeStormer 3 приводил каждую грань кубика к одному цвету за 3,253 секунды. Какое-то время в «Книге рекордов Гиннеса» был записан роборезультат в 2,39 секунды.
Но несколько дней назад его сменило время в 0,900 секунды.
Рекордсменом стал робот двух разработчиков программного обеспечения Джея Флэтлэнда и Пола Роуза из города Олейта в штате Канзас.
В январе авторы выложили на YouTube видеоролик с устройством, которое было в состоянии решить головоломку за 1,1 секунды.
Робот представляет из себя набор относительно общедоступных электронных компонентов и программного обеспечения. Это реализация двухфазного алгоритма Коцембы, 4 веб-камеры и 6 шаговых двигателей.
После снятия барьеров четыре USB-камеры регистрируют конфигурацию кубика. Данные приходят на обычный персональный компьютер под управлением операционной системы семейства Linux. Прикладная программа вычисляет состояние кубика, получает решение от реализации алгоритма Коцембы и управляет процессом движения.
Роуз переписал Java-образец на С++ и сделал программу быстрее. Шаговые двигатели опираются на каркас, созданный с помощью 3D-принтера. Драйверы двигателей DRV8255 управляются микросхемой Arduino. На их концах расположены маленькие напечатанные ножки, с помощью которых производится контакт с головоломкой.
Сам кубик незначительно модифицирован: в центральном сегменте каждой из граней просверлены 4 крошечных отверстия, куда и входят эти ножки на концах осей двигателей. Можно поспорить, что в конструкцию головоломки внесены изменения. Но результат регистрирует «Книга рекордов Гиннеса» по собственным критериям, в которые входят и требования WCA.
Прошлые роботы-рекордсмены тоже использовали незначительно изменённые кубики, которые не нарушали подраздел 3h, определяющий допустимые модификации.
5 февраля робот Флэтлэнда и Роуза собрал перемешанный программой TNoodle кубик за 0,900 секунды и 18 ходов в присутствии представителей «Книги рекордов Гиннеса».
Заметны изменения в алгоритмах решения — в более ранних демонстрациях результат находился в районе 1,1 секунды.
Как пишет Флэтлэнд, ему удавалось достичь результата чуть больше 0,8 и даже 0,7 секунд, но из трёх отложенных судьёй попыток лучшим стал 0,9.
Ускоренная съёмка рекорда показывает быстроту движений. Оригинальная видеозапись с нормальной скоростью находится до ката. Тем не менее, этот рекорд скоро может быть побит. В некотором роде он уже побит: создатель Sub1 Альберт Бир утверждает, что ему первому в мире удалось зайти под секунду. 23 января 2016 года в Мюнхене в магазине Cubikon был продемонстрирован результат в 0,887 секунды. Это время получилось с третьей попытки. Первая дала 1,043 секунды, вторая закончилась неверным решением из-за бликов на кубике. Типичное время находится в районе 0,9—1,0 секунды. Рекордный результат официально зарегистрирован не был. О конструкции известно мало. Как видно, скоростной 57-мм кубик ZhanChi стандарта WCA удерживает стальная конструкция, а не пластиковая из 3D-принтера. Бир специально научился варить для своего проекта. В качестве контроллеров двигателей используются платы Toshiba TB6560.
Новый претендент на рекорд — Sub1.
Флэтлэнд высоко оценил работу Бира. Автору действующего рекорда понравился дизайн конструкции, опрятная укладка кабелей и освещение. Флэтлэнд даже заявил, что Sub1 может быть лучше его образца, и с помощью подобного робота можно достичь результатов в районе полусекунды.
0,887 секунд решения в обычной скорости и в пять раз медленнее.
Новый рекорд Sub1 ещё нужно зарегистрировать. Соревнование нельзя описать как битву. Текущие рекордсмены уже вдоволь наигрались со своим проектом и хотели бы сменить его на что-нибудь другое, к примеру, создание роликов для YouTube. Флэтлэнд даже дружески предложил Биру свои советы и помощь.
Источник: https://habr.com/post/390555/
Светодиодный куб 4x4x4 на Arduino
В проекте предложена конструкция светодиодного куба (LED cube) 4x4x4 стоимостью около 15 долларов.
В кубе использовано 64 зеленых светодиода, которые формируют 4 слоя и 16 колонок. Управление кубом реализуется на базе Arduino. Приведен пример программы для Arduino Uno, в которой реализовано управление каждым отдельным светодиодом из всего массива.
Необходимые детали для проекта
- 64 светодиода
- 4 резистора на 100 Ом
- Коннекторы для распайки
- Проводники
- Макетная плата для распайки
- Коробка
- Источник питания на 9 В
- Arduino Uno
Инструменты, которые могут вам пригодиться, приведены на фото ниже.
Можете воспользоваться эскизом, который приведен здесь. Распечатайте его и наклейте на картонную коробку. При печати проверьте, чтобы был выставлен фактический размер и горизонтальная ориентация. Карандашом сделайте отверстия в узловых точках. Проверьте, хорошо ли садятся светодиоды в подготовленные отверстия.
Собираем светодиодный куб
Возьмите 64 светодиода и проверьте их работоспособность, подключив каждый к пальчиковой батарейке. Это, конечно, скучная процедура, но она необходима. Иначе из-за одного нерабочего светодиода впоследствии может быть куча проблем.
Установите 16 светодиодов в отверстия в соответствии со стрелками на распечатке. Красные стрелки соответствуют плюсу (анод), синие – минусу (катод). Все аноды соедините между собой. После этого переверните коробку и вытолкните светодиоды.
Выталкивайте аккуратно, чтобы не повредить собранный слой. Все. Первый слой готов. Аналогичным образом формируем еще три слоя. После соединяем четыре получившихся слоя с помощью свободных катодов. Советую соединять контакты начиная с центра и перемещаясь к периферии.
Светодиодный куб начинает принимать необходимые очертания!
Установка светодиодного куба
Сделайте разметку на макетной плате с помощью маркера. Учтите, что размеченный прямоугольник должен быть немного меньше коробки, на которой будет установлен ваш куб.
После разметки сделайте небольшой паз вдоль линии будущей грани и аккуратно отломайте ребра макетной платы. Сделайте 20 отверстий на верхней части вашей коробки для куба.
Можно разметить места для сверления по соответсвующим отверстиям макетной платы.
Подключаем светодиодный куб
Сначала разделите вашу рейку коннекторов на три части таким образом, чтобы они подошли к цифровым и аналоговым пинам Arduino Uno. Зачистите и установите на вашей маетной плате в коробке 16 проводов для цифровых входов (рядов). 4 провода от аналоговых входов подключите с использованием резисторов на 100 Ом.
Теперь переходите к подключению концов проводов к трем рейкам коннекторов. Подключение реализовано таким образом, что есть возможность управлять светодиодами вдоль трех осей. Колонки соответсвуют осям X и Y. Плюс к этому, благодаря четырем слоям мы получаем координату Z.
Если вы посмотрите вниз с угла светодиодного куба, первый квадрант будет соответствовать обозначению (1, 1). Таким образом, каждый светодиод может быть инициализирован по подобной же методике. Давайте рассмотрим пример. Посмотрите на рисунок выше и найдите светодиод A(1,4).
“A” означает, что это один и первых слоев, а “(1,4)” соответсвтует координатам X=1, Y=4.
Схема подключения
Ряды/колонки
[(x,y)-Пин]
(1,1)-13
(1,2)-12
(1,3)-11
(1,4)-10
(2,1)-9
(2,2)-8
(2,3)-7
(2,4)-6
(3,1)-5
(3-2)-4
(3-3)-3
(3,4)-2
(4,1)-1
(4,2)-0
(4,3)-A5
(4,4)-A4
Слои
[Пины для слоев]
a-A0
b-A1
c-A2
d-A3
Подключаем источник питания для Arduino
Для питания платы можно использовать отдельный адаптер на 9 вольт, 1 ампер. Можно использовать переходник для батарейки типа крона и питать от нее. В любом случае, вам понадобится сделать еще одно отверстие для провода питания. Когда будете делать отверстие, предусмотрите его размер немного большим, чем сам коннектор.
В общем то все, что вам после этого останется – загрузить скетч на Arduino и наслаждаться результатом:
Программа для светодиодного куба под Arduino
Ваш куб готов!
Видео собранного светодиодного куба 4x4x4
Источник: http://arduino-diy.com/arduino-svetodiodnyy-kub-4x4x4
LED Cube 8x8x8 на Arduino с RTC
Введение
LED Кубы появились уже давно, есть множество примеров их изготовления. На просторах интернета можно найти различные, начиная от 3х3х3 одноцветных, заканчивая большими объемными 3D LED экранами.
Наиболее оптимальный размер с которого можно начать освоение их построения и программирования для начинающих это 8х8х8 (512 светодиодов), кубы меньших величин, не столь явно показывают световые эффекты, а кубы начиная уже с 16х16х16, довольно сложны в изготовлении начинающим.
В этой статье я хочу поведать создание LED Куба, размером 8х8х8, с использованием в качестве управляющего микроконтроллера, платы Arduino Pro Mini. Данная модель куба, может работать в двух режимах: световых эффектов и режим часов. Это стало возможным, благодаря интеграции в схему модуля RTC.
Принцип действия
Управление световым кубом из 512 светодиодов осуществляется посредством MOSFET-транзисторов, 64 транзистора отвечают за подачу положительного напряжения на столбцы, и 8 транзисторов за подачу отрицательного напряжения на слои.
Ток (соответственно яркость) светодиода регулируется по средством 64 резисторов (R011-R641) стоящих после выхода транзисторов на столбцах.
Открытие и закрытие транзисторов осуществляется при помощи сдвиговых регистров, которые в свою очередь управляются по двум линиям (отдельно столбцы и слои) платой Arduino.
Вся конструкция куба разделена на части:
- Схема №1 или главная плата, на которой установлен сам микроконтроллер (плата Arduino), RTC модуль, SD модуль, сдвиговый регистр и MOSFET-транзисторов, отвечающие за слои;
- Схема №2 или плата контактов, которая отвечает за крепления самого куба и открытия подачи положительного напряжения на столбцы;
- Схема №3 или пульт, отвечает за кнопочные команды устройству;
- Блок питания 5V (15A в данной конструкции применён такой, но поддержка такого тока не обязательна, всё зависит от тока светодиодов, смотрите ниже расчёт);
- Сам Куб 8х8х8 из 512 светодиодов.
Блок питания подбирается из учёта питания светодиодов, так как одновременно возможно свечение только одного слоя, то есть это 64 светодиода. Если принять ток одного светодиода равным 30мА, то получаем: 30мА*64=1920мА, то есть будет достаточно 3А блока питания, для питания всей конструкции.
Схемотехника
И так, главная плата, представляет собой в основном коммутационный характер, сопряжение всех модулей и управление слоями. Для наглядности, разделим на две части: коммутационная и управление слоями.
Схема №1, главная управляющая плата:
Коммутационная часть, осуществляет ввод основного питания на устройство (J6). Для прошивки платы Arduino Pro Mini, служит модуль USB to TTL, который подключается через J6-1, контакты J6-J1 и J6-J2, служат для подключения питания на плату Arduino от модуля (данное питание необходимо для прошивки, если не используется блок питания).
Разъем J4, служит для подключения SD карты, а J5 для подключения модуля RTC. Плата Arduino Pro Mini, подключается через, группу разъемов J1 (1-1, 1-3, 1-4). Группы разъемов J2 и J3, служат для подключения сигнальных линий для управления платами контроля питания столбцов (Схема 2), и подачи питания. Группа разъемов J7, служит для подключения клавиатуры (Схема 3).
И наконец группа J8, отвечает за подключение второй части Схемы 1 (управление слоями):
Вторая часть Схемы 1, предельно проста: сдвиговый регистр, дает команды MOSFET-транзисторам ( 1-открыть транзистор, 0-закрыть), сдвиговый регистр, получает через линию данных команды от первой части Схемы 1.
Рассмотрим, Схему 2, она разделена на две одинаковые части, для контроля по 32 столбца каждая. Так как они абсолютно идентичны, рассмотрим только одну:
Так же как и в предыдущей схеме, сдвиговый регистр даёт команды (которые получает через линию данных от платы Arduino Pro Mini), MOSFET-транзисторам (за исключением теперь, 0-открывает транзистор, а 1-закрывает).
Так же тут присутствуют на выходе с транзистора, резисторы по 250 Ом, они служат для контроля тока светодиода, и могут быть заменены на номинал более подходящий для не совсем яркого свечения (в зависимости от используемых светодиодов).
И завершающая, Схема 3, плата кнопок, где всё предельно просто:
Платы Схема 1 и Схема 2:
Проверка каждого слоя перед их спайкой:
Прошивка платы Arduino Pro Mini (sketch)
Скетч занимает более 500 строк, он будет приложен в конце статьи, а здесь постараюсь коротко его описать.
Есть две основные функции управления сдвиговыми регистрами (“column” – заполнение столбцов и “layer_column” – выбор слоя и вызов функции “column”), обе они реализованы через функцию shiftOut. Это самый легкий способ управления регистрами, но возможно не самый быстрый.
Следом идет основная функция закрашивания всего куба “cube”, смысл функции заключается в том, что она последовательно и по циклу (цикл получается само собой) закрашивает каждый слой куба.
В веду такой реализации происходит мерцание куба, оно ели заметное из-за быстрого микропроцессора.
Существует два режима работы куба: “Демонстрация световых эффектов” и “Отображение времени”. Смена осуществляется при помощи кнопки “Mode”. При первом режиме, происходит последовательное считывание с SD карты данных, далее передача выше указанным функциям.
Второй режим реализован гораздо сложнее, так как все данные этого режима вшиты в микропроцессор (этим и объясняется количество строк кода).
Если коротко, то данные с RTC модуля считываются и исходя из этого, опять же, выше указанным функциям отправляются соответствующие битовые переменные, для отображения на светодиодах.
Так же реализована возможность настройки часов, при помощи кнопок управления, для этого достаточно в режиме часов нажать кнопку “Setup”, далее при помощи кнопки “Change” менять режим (часы, минуты, дни и т.д.) и настраивать при помощи кнопок “Up” и “Down”. В конце нажав на кнопку “Reset”, можно сохранить настройки.
Расположение кнопок, согласно Схемы 3:
Программа создания световых эффектов (C++ Builder 6)
Чтобы создание эффектов сделать упрощенным и функциональным, а так же просмотреть заранее спроецированные эффекты, перед их записью на SD, было решено написать программу на C++, с использованием Open GL.
Исходный код для Borland C++ Builder 6, приложен к статье.
Заключение
Постарался изложить информацию касательно схемы реализации проекта, его электрической части. Программная часть проекта довольно большая и всё можно найти в исходных файлах. Если будут вопросы – пишите, обсудим.
Сам проект задумывался, для небольшой практики, работы с микроконтроллерами, в ходе реализации было выяснено:
- Электрическая часть, не представляет сложности в реализации;
- Спайка куба, освещена во многих других статьях, по этому я не останавливался на этом, но спаять могу сказать довольно не простое занятие (т.е. больше 1000 точек припоя);
- Внедрение RTC модуля, не оправдало мои ожидания, так как показ времени не совсем разборчив, это можно наблюдать на видео, единственное если сделать белый матовый корпус, тогда цифры хорошо отличимы.
Скачать список элементов (PDF)
Прикрепленные файлы:
- PROGRAMM_Cube_8x8x8.zip (4108 Кб)
- Cube_sketch_8x8x8.zip (4 Кб)
Источник: http://cxem.net/arduino/arduino210.php
Мучения с LED cube 4x4x4 (Arduino+74HC595)
Здравствуйте, дорогие читатели!
Наконец-то у меня есть, что вам рассказать и показать. Надеюсь, рассказ будет интересен не только мне.
Я расскажу о своём опыте работы с Ardiuno UNO и даже покажу, что у меня в итоге получилось. Если вам ещё не надоело подобное — добро пожаловать под кат.
ВступлениеЯ — учитель физики, информатики и астрономии в обычной средней школе. Успел поработать сисадмином-эникейщиком и с компами немного дружу, немного умею работать с сайтами, чуть-чуть понимаю php и MySQL. Но в программировании я чуть больше, чем нуль. Это должно немного уменьшить ваш гнев от чтения написанной мною программы, которую я чуть дальше покажу.
Весной 2014 года на областной конференции познакомился с LEGO WeDo и электронаборами ООО «ЛАРТ-М». Очень мне это дело понравилось, но всё это было не у меня.
Так получилось, что в начале учебного года мне предложили вести кружок робототехники с LEGO Mindstorms NXT. Даже отсутствие опыта работы с этими наборами не смутило директора областного дома детства и юношества. Пока, кажется, все мной довольны.
Я втянулся, мне стала нравится робототехника, но цены на Lego просто убивали. Тогда мне попалась вот эта статья.
Я связался с фирмой, занимающейся поставкой этих наборов к нам и мы договорились о пробной покупке одного набора и дальнейшем сотрудничестве на ниве внедрения этого дела в школы.
После получения этого набора в свои цепкие ручки, я начал пробовать и материться… Про проблемы, связанные с этим набором расскажу отдельно, если будет интересно. Главное не это.
Сначала я, конечно же, попробовал подключить датчики/кнопочки/диодики. Всё работало и сверкало. С одной поделкой я даже выступил на очередной областной конференции и «сорвал банк».
А там всего-то было 2 фоторезистора, 2 светодиода, 1 динамик, 1 кнопка, 3 зеркала, 1 потенциометр (кнопок больше не было на тот момент) и 1 лазерная указка.
Из этого получился небольшой дом, который делал следующее: 1) зажигать светодиод над входной дверью, когда на улице темно; 2) играть простенькую мелодию, когда нажимают кнопку звонка у двери; 3) зажигать светодиод в «комнате охраны», когда кто-то звонит в дверь (вдруг охранник в наушниках музыку слушает);
4) при выкручивании потенциометра на максимум (надо будет заменить второй кнопкой, благо теперь она есть) включалась сигнализация — внутренний фоторезистор начинал реагировать на прерывание лазерного луча от указки, через систему зеркал направляемую на него «с улицы». При пересечении луча в «комнате охраны» раздавалась сирена и загорался светодиод.
Страшный домик
После знакомства с этим наборомя начал активно читать про Arduino и, в конце концов, заказал на Aliexpress набор с Arduino UNO (точнее, китайским аналогом с диким именем) и кучкой всяких деталек. И тут Остапа понесло (с)…
Вот чем вы занимались на новогодних каникулах? Отдыхали, верно? Я большую часть каникул провозился с ардуинкой.
Сначала собрал кубик из 27 светодиодов (кажется, по вот этой инструкции). Скетч не выкладываю, т.к. надо его полностью переписывать, с учётом новых знаний. Но первоначально он работал вот так:
Этого мне показалось мало, да и я поверил в свои силы. Поэтому решил собрать такой же кубик, но уже из 64 светодиодов. Дурное дело — не хитрое, особенно когда работать не надо. Сначала собрал кубик, используя несколько похожих инструкций (вроде этой и этой). Получилось вот так (скетч):
Управлять таким кубиком было довольно просто. Проблема была в том, что все 20 имеющихся в моей Arduino UNO выходов оказались заняты светодиодами, а хотелось ещё подключить каких-нибудь датчиков и прочих прелестей.
В результате некоторого количества убитых нервов и благодаря помощи хороших людей удалось переподключить мой кубик к ардуинке с помощью двух сдвиговых регистров 74HC595 (инструкция). За время написания программы удалось чуть лучше разобраться в языке, хотя некоторые вещи в моей программе до сих пор кажутся мне магией.
Собственно, управлять кубиком стало немного сложнее, зато удалось подключить двухстрочный дисплей, на который выводится название режима работы кубика и номер этого режима (удобно ковырять программу, видя эту инфу), и кнопку, которая переключает режим работы кубика.
Да, забыл сказать. Жена у меня ведёт информатику в той же школе и, глядя на мои мучения, у неё родилась мысль об элективном курсе для 9 класса (пока всё в виде идеи и черновых набросков) по работе с ардуинкой. Будем надеяться, что из этого что-то получится.
Что ещё хочется сделать1) подключить к кубику микрофон и превратить кубик в светомузыкальную установку. К сожалению, пока не очень получается. Микрофон из комплекта реагирует только если на него дуть (нужен усилитель, но пока нет его). 2) добавить разных эффектов кубику. 3) показать пользу от ардуинке на уроках физики — хочу измерять скорость объекта (2 фоторезистора + 2 лазерных указки), но пока это тоже не очень получается. 4) научиться нормально управлять серводвигателями и сделать, наконец-то, машинку! Пока при подключении двух серводвигателей управлять получается только одним, второй постоянно крутится в одну сторону. 5) научиться управлять ардуинкой по bluetooth. Модуль есть, но пока тоже не очень клеится работа с ним. 6) дождаться прихода с Aliexpress ещё нескольких датчиков/экранов и сделать ещё что-нибудь интересное.
7) заинтересовать учеников и хоть немного их этому всему научить…
Источник: http://www.pvsm.ru/arduino/79522
Термоконтроллер на Arduino
Уважаемые читатели!
Эта статья написана не мной, посему – прошу любить и жаловать: сегодня Vergellan поделится с вами опытом создания умного регулятора вращения вентиляторов, с участием термодатчика, LCD-дисплея и, конечно же, Arduino.
Несколько месяцев назад я прочел ряд статей об Arduino и весьма заинтересовался данным девайсом, а вскоре решил приобрести. Надо отметить, что я далек от микроэлектроники, поэтому плата расположила к себе прежде всего относительной простотой в освоении.
Набаловавшись с LED-ами и «Hello world»-ами, захотелось сделать что-нибудь практичное, заодно более детально ознакомиться с возможностями Arduino. Памятуя об аномально жарком лете 2010 года, возникла идея собрать регулятор оборотов кулера в зависимости от температуры с выводом всех сопутствующих характеристик на LCD.
Надеюсь, что кому-нибудь данная схема или ее вариации смогут пригодиться, поэтому решил выложить свои наброски.
Для данной схемы нам понадобится:
- Собственно сама плата Arduino или аналог;
- Макетная плата для сборки компонентов схемы;
- Дисплей WH1601A-NGG-CT с подстроечным резистором на 20 кОм или аналогичный;
- Резисторы – 220 Ом, 10 кОм, 4.7 кОм;
- Биполярный транзистор SS8050D или аналогичный ему;
- Цифровой температурный датчик DS18B20;
- Диод 1N4148 или аналог;
- Вентилятор осевой трехпроводной (на 12В), например – компьютерный;
- Разъем гнезда питания 2,1/5,5 мм.
Компьютерный кулер имеет три провода, два из которых – красный (+12V) и черный (GND) используются для питания, а третий (желтый) связан с таходатчиком, построенном на элементе Холла.
К сожалению, 5V с платы нам явно недостаточно, но 6 цифровых выходов Arduino могут работать в режиме ШИМ (они отмечены на самой плате белыми квадратиками, либо буквами PWM), поэтому мы можем регулировать подачу сигнала с платы на реле, которое будет отвечать за изменение напряжения, подаваемого на вентилятор.
Получать информацию об оборотах мы будем с третьего провода от таходатчика, воспользовавшись модифицированным способом, основанным на реализации прерываний, которые у большинства Arduino могут приходить на цифровые pin 2 (прерывание 0) и 3 (прерывание 1). Кстати, у Arduino Mega наличествует еще 4 дополнительных пина с возможностью получения прерываний.
Теперь необходимо расположить цифровой датчик температуры, данные которого мы будем использовать для регулирования напряжения, подаваемого на цифровой выход с ШИМ, а следовательно для «открытия» канала напряжения вентилятора.
Для датчиков фирмы Dallas существует собственная библиотека Arduino – DallasTemperature, которую впоследствии мы и будем подключать в скетче. Библиотеку необходимо распаковать в каталог arduino-0018/libraries/.Осталось последнее – подключить LCD, где у нас будет отображаться вся текущая информация о температуре и скорости вентилятора.
Поскольку я использовал для сборки экран WH1601A, могут иметь место известные проблемы с отображением строк. Для их устранения мы воспользуемся библиотекой LiquidCrystalRus, которую необходимо также распаковать в каталог arduino-0018/libraries/.
//Подключаем библиотеку для термодатчика
#include
//Подключаем библиотеку для LCD
#include #define PowerPin 9 // pin для контроля питания вентилятора
#define HallSensor 2 // pin для датчика оборотов вентилятора (прерывание)
#define TempPin 7 // pin для датчика температуры LiquidCrystalRus lcd(12, 11, 10, 6, 5, 4, 3); //Подключение LCD
DallasTemperature tempSensor; int NbTopsFan, Calc, fadeValue; //целочисленные переменные для расчетов
float temper; //вещественная переменная для хранения температуры typedef struct{ // Вводим новый тип переменных для вентиляторов
char fantype;
unsigned int fandiv;
}fanspec; //Массив переменных нового типа
fanspec fanspace[3]={{0,1},{1,2},{2,8}}; //Переменная, отвечающая за выбор типа датчика вентилятора (1 – униполярный датчик Холла, 2 –биполярный датчик Холла)
char fan = 2; //Эта функция у нас будет вызываться при каждом прерывании
void rpm () {
NbTopsFan++;
} // Функция расчета подаваемого напряжения на цифровой pin с ШИМ
void temp () {
fadeValue = min(int(temper*7),255); // Умножаем температуру на коэффициент,
// берем от произведения целое число
} // Т.к. максимальное значение ШИМ составляет 255, то подавать больше не имеет смысла – берем минимум из двух void setup()
{
tempSensor.begin(TempPin); //Запускаем температурный датчик
lcd.begin(16, 2); //Задаем характеристики LCD
lcd.setDRAMModel(LCD_DRAM_WH1601); //И тип дисплея
pinMode(HallSensor, INPUT); // Настраиваем pin на получение прерываний
attachInterrupt(0, rpm, RISING); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала
} void loop ()
{
temper = tempSensor.getTemperature(); // Получаем температуру
temp(); // Высчитываем подаваемое напряжение на ШИМ
analogWrite(PowerPin, fadeValue); // Подаем его
NbTopsFan = 0; // Обнуляем переменную, содержащую обороты
delay (1000); //Ждем 1 секунду
Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора
lcd.print (Calc, DEC); //Выводим рассчитанную величину в десятичном виде
lcd.print (” rpm – “); lcd.print(temper); //Выводим температуру
lcd.home(); }
У меня финальная схемка выглядит так (часть компонентов перенес с макетки на дополнительную плату, т.к. планирую сделать уже готовый регулятор в нормальном корпусе):
В завершение хотел бы выразить огромную благодарность Илье Данилову (idanilov) за «привитый» интерес к Arduino и за помощь в освоении данной платформы.
UPD: Последняя версия LiquidCrystalRus доступна на github.
Источник: http://mk90.blogspot.com/2010/08/arduino.html