Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Скажите спасибо всем любезным водителям

Компоненты и расходные материалы

Arduino MKR1000
× 1
Bluetooth-модем SparkFun - BlueSMiRF Silver
× 1
4-канальный двунаправленный логический преобразователь уровня Adafruit, безопасный для I2C - BSS138
× 1
Гибкая матрица Adafruit DotStar Matrix 8x32 - 256 пикселей RGB LED
× 1
Набор 4-контактных разъемов JST SM от Adafruit и кабелей для розеток
× 1
цилиндрический соединитель постоянного тока 2,1 мм
× 1
Адаптер питания переменного тока 5 В, 4 А
× 1
Позиция мужского заголовка 4 (0,1 ")
× 1
Макет (общий)
× 1
Блок проекта
Выберите достаточно большой, чтобы вместить все содержимое плюс высоту Bluetooth.
× 1
Фанера из балтийской березы размером 1/4 "x 4,5" x 15 "
× 1
Лента для деревообработки, 1 "x 50 '
× 1

Необходимые инструменты и машины

Паяльник (общий)
Пистолет для горячего клея (общий)
Биты лесника
Drill
Наждачная бумага
Зернистость 120, чтобы сбить острые края.

Приложения и онлайн-сервисы

IDE Arduino
Виртуальный щит для Arduino
Adafruit DotStar

Об этом проекте

Все время, пока я веду машину, я хотел иметь возможность более конструктивно общаться со случайными водителями вокруг меня. Мне казалось, что вспышка света, взмах руки, жест, предполагающий нечто большее, чем просто взмах руки, гудок или нажатие на педаль тормоза, в конечном итоге превратились в очень грубые механизмы общения. / P>

Вдохновением для этого послужил фильм о Джеймсе Бонде, где в начальной сцене у него был текст, который отображался в заднем окне его «Остина Мартина». Я думал, что действительно могу сказать (а не просто выразить волнистыми руками) водителю в другом автомобиле, о чем я думал.

Вот демонстрация скамейки:

И демонстрация квази-живого действия:

Вот концептуальный набросок:

У этого проекта была дополнительная проблема, потому что MKR1000 - это предварительная версия платы, и для нее нет официальной документации. Для Hackster есть очень хорошая отправная точка:

https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a

Итак, на первом этапе проекта:

Говорите MKR1000

Мне посчастливилось попасть на форум, спонсируемый http://arduino.cc, у которого был частный форум для нас, владельцев советов по выпуску. После солидной субботы мне удалось запрограммировать плату и заставить все компоненты работать.

Моя текущая установка включает почасовую сборку Arduino IDE версии 1.6.9. Если вы похожи на меня, то использование «почасовых» сборок в проекте вызывает у вас как минимум «дискомфорт».

После установки IDE я загрузил драйверы для платы с помощью менеджера IDE Board. Я также загрузил следующие библиотеки с помощью диспетчера библиотек IDE:Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson и Windows Virtual Shields для Arduino.

Когда эта плата будет официально выпущена, процесс будет намного проще. Так что я не буду здесь подробно останавливаться. В конце статьи есть ссылка на проект, который поможет вам в этом.

Правило №1 сборки электроники: Никогда не выпускайте волшебный дым из схемы!

MKR100 - это плата на базе 3v3. Не имея всей документации, которую я хотел бы, я не знал, устойчивы ли они к 5 вольт. Мало того, что некоторые компоненты действительно хотят иметь 5 вольт для установления правильной логики 1 и 0.

Это вызвало необходимость в 4-канальном двунаправленном сдвиге уровня от Adafruit. И bluetooth-карта, и особенно матрица DotStar действительно любят полные 5 вольт. Так что будьте осторожны при подключении этих вещей.

Убедитесь, что компоненты работают

Прежде чем беспокоиться о том, чтобы все работало вместе, я хочу убедиться, что все компоненты работают.

Я начал с матрицы Adafruit 8x32 DotStar <вставить ссылку>. Я обнаружил, что мои связи были немного ненадежными. Чтобы это не было проблемой, я использовал несколько штырей, которые у меня были, и просто припаял их.

С прочно прикрепленными штифтами жатки. Я направил данные и тактовый сигнал на контакты SPI, помеченные как SDA и SCL на MKR1000.

С прочно прикрепленными штифтами жатки. Я направил данные и тактовый сигнал на контакты SPI, помеченные как SDA и SCL на MKR1000.

Я загрузил пример скетча «Файл> Примеры> Adafruit DotStarMatric> matrixtest» в среду IDE. Скорректировал DATAPIN на 11 и CLOCKPIN на 12 в коде. Создал и развернул решение. После небольшого количества опций для матрицы я получил рабочий дисплей.

Следующим шагом было заставить Virtual Shield работать через адаптер Bluetooth. Это было действительно просто. Я выполнил инструкции, указанные в репозитории github https://github.com/ms-iot/virtual-shields-arduino. Единственное изменение, которое мне пришлось сделать, это контакты TX и RX. Это контакты 14 и 13, как отмечено на моей плате.

Я хотел бы отметить, что в предыдущих воплощениях мне приходилось отключать контакты TX / RX для загрузки новых эскизов. Я рад сообщить, что это больше не так.

Просмотрите код

Теперь, когда все работает, я займусь кодом, специфичным для этого проекта.

Чтобы получить доступ ко всем функциям, вам необходимо включить следующее:

  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include   

Первые 5 включений должны быть достаточно пояснительными.

VirtualShield.h содержит базовые функции для связи через адаптер Bluetooth. Это необходимо независимо от того, к каким из датчиков вы хотите получить доступ.

Файл Text.h получает ваш лучший текст, то есть обработку строк.

Graphics.h, Recognition.h и Colors.h содержат функции, необходимые для доступа к виртуальному экрану и включения распознавания голоса. Хотя это еще не все, я буду кодировать голосовые функции в будущем.

Далее в списке важных строк кода инициализация матрицы DotStar и инициализация объекта Shield:

  матрица Adafruit_DotStarMatrix =Adafruit_DotStarMatrix (32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_GB); Цвет (0, 255, 0), matrix.Color (0, 0, 255), matrix.Color (255, 0, 255), matrix.Color (255, 0, 106), matrix.Color (255, 255, 255)}; VirtualShield щит; Графический экран =Графика (щит); Распознавание речи =Распознавание (щит);  

Первая строка сообщает библиотеке DotStar размер и расположение матрицы. Для получения информации о различных параметрах см. Пример matrixtest или файл Adafruit_DotStarMatrix.h.

Цвета для библиотеки DotStar.

Последние 3 строки активируют щит и инициализируют объекты для работы с датчиками в телефоне.

Далее, как и все скетчи Arduino, нам нужно обработать метод setup ()

  пустая настройка () {matrix.begin (); matrix.setTextWrap (ложь); matrix.setBrightness (40); matrix.setTextColor (цвета [0]); DisplayText («Инициализация ...», 4, 10); // настраиваем события виртуального щита:shield.setOnRefresh (refresh); Speech.setOnEvent (onSpeech); screen.setOnEvent (screenEvent); // начинаем коммуникацию щита (также вызывает refresh ()). shield.begin (); // предполагается скорость Bluetooth 115200 бод DisplayText ("Инициализация ... завершена", 3, 10);}  

Строки «матрицы» говорят сами за себя, и, поскольку эти строки выполняются, это дает мне возможность отправлять некоторые информационные сообщения в матрицу.

Строки «щита» теперь устанавливают методы обратного вызова. Эти методы будут вызываться по мере необходимости при возникновении событий.

Теперь о самом сложном методе всего эскиза

  void loop () {// checkSensors () проверяет наличие возвращаемых событий и обрабатывает их (вызывая обратные вызовы). Это метод single loop () VirtualShield. Shield.checkSensors ();}  

Ага, вы поняли. Мы постоянно проверяем, сработал ли какой-либо из датчиков и какие события необходимо устранить.

Хорошо, теперь давайте действительно обработаем некоторые события. Первый - это метод refresh (). Он будет вызываться, когда произойдет ряд различных событий. Единственное событие, которое нас сейчас волнует, - это подключение bluetooth. Нам нужно событие, чтобы мы могли перерисовать экран так, как он должен выглядеть.

  void refresh (ShieldEvent * shieldEvent) {// поместите сюда свой код обновления // это запускается всякий раз, когда подключается Bluetooth, когда выполняется Shield.begin () или в приложении нажимается кнопка обновления:screen.clear (ARGB (123,86,204)); screen.drawAt (0,0, ""); thanksId =screen.addButton (10, 50, «. Спасибо.»); welcomeId =screen.addButton (10, 100, «. Добро пожаловать.»); turnLeftId =screen.addButton (10, 150, «. Влево.»); stoppingId =screen.addButton (175, 50, «. Остановка.»); startId =screen.addButton (175, 100, «. Запуск.»); turnRightId =screen.addButton (175, 150, «. Вправо.»); backoffId =screen.addButton (10, 225, «. Отказаться.»); Calling911Id =screen.addButton (10, 290, ". Звонок в службу 911.");}  

Этот метод очищает экран со светло-фиолетовым фоном и перемещает различные кнопки на экран. Обратите внимание на интервал между словами. Это текущее ограничение функциональности виртуального щита, так как я действительно хотел сосредоточить все вокруг, чтобы они выглядели красиво.

Так что же происходит, когда я нажимаю одну из этих кнопок? Событие запускается, и оно обрабатывается в следующем фрагменте кода.

  void screenEvent (ShieldEvent * shieldEvent) {if (screen.isPressed (thanksId)) {DisplayText ("Спасибо", 5, 100); } if (screen.isPressed (welcomeId)) {DisplayText ("Добро пожаловать", 2, 100); } if (screen.isPressed (backoffId)) {DisplayText ("Пожалуйста, отступите", 4, 100); } если (screen.isPressed (stoppingId)) {DisplayText ("... остановка ...", 0, 100); } если (screen.isPressed (startId)) {DisplayText ("... начало ...", 1, 100); } if (screen.isPressed (turnLeftId)) {DisplayText («Поворот ВЛЕВО», 3, 100); } if (screen.isPressed (turnRightId)) {DisplayText ("Поворачивая вправо", 3, 100); } если (screen.isPressed (Calling911Id)) {DisplayText ("Звонок в службу 911", 0, 100); }}  

Приходит событие, код проверяет, какая кнопка нажата, и мы вызываем метод DisplayText с информацией, которую нужно показать.

И напоследок как текст попадает в матрицу? Это сделает за вас метод DisplayText.

  void DisplayText (String message, int colorIndex, int currDelay) {int x =matrix.width (); int maxX =-1 * (message.length () * 5 + message.length ()); matrix.setTextColor (цвета [colorIndex]); в то время как (x> maxX) {matrix.fillScreen (0); matrix.setCursor (x, 0); matrix.print (сообщение); --Икс; matrix.show (); задержка (currDelay); }}  

Этот метод определяет, насколько широка эта строка на самом деле. Нам нужно знать, чтобы убедиться, что строка полностью прокручена и скрыта из поля зрения. Буквы имеют ширину 5 + 1 для промежутка между буквами.

Постройте корпус

Сборка была довольно простой. Я нашел коробку приличных размеров, которая была больше, чем площадь основания матрицы. Взял кусок балтийской березы размером 1/4 дюйма, который был больше, чем мне нужно, и отрезала его по размеру.

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

Да, я сказал «сверлить», а не «сверлить». В последний раз, когда я «сверлял» отверстия в пластике, у меня были действительно неудовлетворительные результаты. На этот раз я использовал насадки Forestner . . У меня есть их фотография ниже. Обратите внимание на то, что край предназначен для резки, а в центре есть скребок, чтобы вычерпывать ненужную древесину. Делает гораздо более красивую «дырку». А теперь переходите к «скучным» действиям, и вы, вероятно, захотите просверлить отверстия для подвески.

Возьмите кусок наждачной бумаги зернистостью 120 и слегка отшлифуйте весь кусок. Убедитесь, что края доски включают все только что проделанные отверстия. Обязательно протрите доску, чтобы на ней не осталось опилок и других «мелочей».

Пришло время заняться пластиковой коробкой.

Просверлите два отверстия на обоих концах коробки. Это разъем питания и подключение к матрице. Пока не сверлите дополнительное отверстие в матрице.

Теперь прикрепите пару полос двустороннего скотча к задней части коробки и прикрепите коробку к фанере. Поскольку это лента с возможностью изменения положения, я очень хотел, чтобы она приклеилась навсегда. Я положил сверху несколько тяжелых книг и оставил их на сутки. Почему 24 часа? В инструкциях к магнитной ленте сказано не делать этого. Для меня это было достаточно веской причиной.

Время для этой последней дыры. Теперь у вас должно быть точное положение для отверстия для подключения вспомогательного источника питания. Выдержите это, наслаждайтесь своей «точной» работой.

Положите ум в коробку

Кажется, макетная плата как раз подходила по размеру для коробки, но я хотел иметь возможность подключать / отключать USB-разъем от MKR1000. Так что пришлось сделать макет короче.

Хорошо, после травмы отклейте заднюю часть макета и приклейте ее. Обязательно избегайте отверстия для подключения вспомогательного источника питания.

Прикрепите матрицу к передней части фанеры, продев соединения через отверстия. Закрепите матрицу горячим клеем.

Давайте поговорим о власти

Несмотря на то, что у меня яркость установлена ​​на 40%, максимальный ток, если я освещу все 256 пикселей, составляет около 7,5 ампер. Намного больше, чем может предоставить MKR1000. К счастью для меня, ни один дисплей не статичен, и я не освещаю почти всю матрицу. На помощь приходит подключение вспомогательного питания. Подаю до 4А. Я полагаю, поскольку он не устойчив и не статичен, источник питания должен быть хорошим.

У меня также была запасная бородавка, конец которой я использовал для подачи питания на MKR1000 при включении в автомобиле.

Я думал о том, чтобы встроить в проект преобразователь мощности, который будет использовать автомобильную мощность 12 В и подавать 5 В в проект. После долгих размышлений было лучше во всех отношениях приобрести адаптер переменного тока на 5 В 4 А за 5 долларов и использовать уже имеющийся у меня преобразователь переменного тока. Когда дело доходит до этого, обычно лучше просто.

Подвешивание вывески

Я планировал использовать «растягивающиеся шнуры с мячом» и несколько присосок, чтобы прикрепить его к заднему лобовому стеклу. Скажем так, у меня еще есть дела в этом районе.

Код

Код "Скажи спасибо"
https://github.com/pulcher/mkr1000_challenge

Схема

MKR1000 - это всего лишь микро, поскольку настоящий MKR1000 еще не выпущен.

Производственный процесс

  1. UnifiedWater v1
  2. Мобильный ящик для голосования
  3. Arduino101 / tinyTILE BLE:подходящие солнцезащитные очки
  4. Whac-A-Mole (Button Edition)
  5. Современный музыкальный автомат
  6. Arduino Apple Watch
  7. Самодельный Arduino, всеполосный приемник Si4730 (LW, MW, SW, FM)
  8. Все об отделке печатных плат, объяснение
  9. EDM Spark Erosion:что это такое?
  10. Описание фланцевых подшипников во всех их разновидностях