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

Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000

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

Инструменты

Программное обеспечение

О проекте

Хотел общаться с водителями понятнее, чем мигание фарами или жестами. Вдохновился Джеймсом Бондом: текст на заднем стекле. Устройство крепится на заднее стекло, управляется с телефона по Bluetooth — можно показать «Спасибо», «Пропускаю», «Поворот налево» и т.д.

Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000
Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000

Особенности MKR1000

Плата 3.3В, не 5В-толерантна. Для DotStar-матрицы и Bluetooth нужен 5В — обязателен логический преобразователь уровня (Logic Level Converter).

Проверка компонентов

  1. DotStar Matrix — подключаем Data/Clock к SPI (пины 11/12 на MKR1000), пример matrixtest.
  2. Virtual Shield + Bluetooth — по инструкции GitHub. TX/RX на пинах 14/13.
Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000

Разбор кода

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

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_DotStarMatrix.h>
#include <Adafruit_DotStar.h>
#include <ArduinoJson.h>
#include <VirtualShield.h>
#include <Text.h>
#include <Graphics.h>
#include <Recognition.h>
#include <Colors.h>

Инициализация матрицы и шилда

Adafruit_DotStarMatrix matrix = Adafruit_DotStarMatrix(
  32, 8, DATAPIN, CLOCKPIN,
  DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG,
  DOTSTAR_GBR
);

const uint16_t colors[] = {
  matrix.Color(255,0,0), matrix.Color(0,255,0), matrix.Color(0,0,255),
  matrix.Color(255,0,255), matrix.Color(255,0,106), matrix.Color(255,255,255)
};

VirtualShield shield;
Graphics screen = Graphics(shield);
Recognition speech = Recognition(shield);

Setup

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(40);
  matrix.setTextColor(colors[0]);
  DisplayText("Initializing...", 4, 10);

  shield.setOnRefresh(refresh);
  speech.setOnEvent(onSpeech);
  screen.setOnEvent(screenEvent);
  shield.begin(); // 115200 baud
  DisplayText("Initializing...finished", 3, 10);
}

Главный цикл

void loop() {
  shield.checkSensors(); // обработка событий Bluetooth
}

Обработка обновления экрана (кнопки)

void refresh(ShieldEvent* shieldEvent) {
  screen.clear(ARGB(123,86,204));
  thanksId    = screen.addButton(10, 50,  ". Thank you .");
  welcomeId   = screen.addButton(10, 100, ". Welcome .");
  turnLeftId  = screen.addButton(10, 150, ". Left .");
  stoppingId  = screen.addButton(175, 50, ". Stopping .");
  startingId  = screen.addButton(175, 100,". Starting .");
  turnRightId = screen.addButton(175, 150,". Right .");
  backoffId   = screen.addButton(10, 225, ". Back Off .");
  calling911Id= screen.addButton(10, 290, ". Calling 911 .");
}

Обработка нажатий кнопок

void screenEvent(ShieldEvent* shieldEvent) {
  if(screen.isPressed(thanksId))    DisplayText("Thank You", 5, 100);
  if(screen.isPressed(welcomeId))   DisplayText("You're welcome", 2, 100);
  if(screen.isPressed(backoffId))   DisplayText("Please back off", 4, 100);
  if(screen.isPressed(stoppingId))  DisplayText("...stopping...", 0, 100);
  if(screen.isPressed(startingId))  DisplayText("...starting...", 1, 100);
  if(screen.isPressed(turnLeftId))  DisplayText("Turning LEFT", 3, 100);
  if(screen.isPressed(turnRightId)) DisplayText("Turning RIGHT", 3, 100);
  if(screen.isPressed(calling911Id))DisplayText("Calling 911", 0, 100);
}

Вывод бегущей строки на матрицу

void DisplayText(String message, int colorIndex, int currDelay) {
  int x = matrix.width();
  int maxX = -1 * (message.length() * 6); // 5px буква + 1px пробел
  matrix.setTextColor(colors[colorIndex]);
  while(x > maxX) {
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(message);
    --x;
    matrix.show();
    delay(currDelay);
  }
}

Сборка корпуса

Корпус из фанеры с вырезами под матрицу и разъёмы. Отверстия сверлятся фрезерными коронками (Forstner) для чистоты. Макетная плата укорочена для доступа к USB. Матрица клеится термоклеем. Питание: 5V 4A на матрицу через auxiliarный разъём, MKR1000 — от отдельного 5V адаптера через DC-DC или прямо от USB.

Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000
Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000

Монтаж в автомобиле

Планировались вентильные чашки и резинки — требует доработки.

Код

Полный скетч: GitHub

Схемы

Благодарим вежливых водителей: LED-табло для автомобиля на Arduino MKR1000

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

  1. UnifiedWater v1: полный набор датчиков качества воды на Arduino MKR GSM
  2. Переносная система голосования с GSM-связью
  3. Умные очки для знакомств на Arduino 101 и tinyTILE BLE
  4. DIY аркадная игра Whac-A-Mole (кнопочная версия) — проект на Arduino
  5. Модерн-джукебокс: Raspberry Pi + Arduino, LED-визиализация музыки, 3D-корпус
  6. DIY Arduino Smartwatch: самодельные умные часы в стиле Apple Watch
  7. DIY полнодиапазонная Arduino-радиоприемник на Si4730 (ДВ, СВ, КВ, УКВ) — бюджетная пошаговая сборка
  8. Покрытия печатных плат: типы, применение и лучшие практики
  9. Электроэрозия (ЭЭО): технология, методы и применение
  10. Подробное руководство по фланцевым подшипникам: Типы, особенности и применение