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

DIY 2D гоночный симулятор движения на Arduino Nano и сервоприводах SG90

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

Arduino Nano R3 × 1
Микросервопривод SG90 × 2

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

Паяльник

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

Arduino IDE

О проекте

SimTools — универсальное ПО для симуляторов движения, способное управлять множеством аппаратных интерфейсов, включая Arduino. Эта связка использована в проекте, показанном в видео. Аппаратная часть состоит только из Arduino Nano и двух дешевых микросервоприводов SG90. Нужно просто загрузить приведенный ниже код.

Игровые данные через SimTools передаются по последовательному порту на Arduino. Arduino активирует сервоприводы, которые двигают платформу симулятора соответствующим образом. Это макет двухосевого симулятора. Для полноценного симулятора нужны драйверы двигателей и крупные сервоприводы.

DIY 2D гоночный симулятор движения на Arduino Nano и сервоприводах SG90

Много примеров таких DIY-симуляторов, чертежей и советов на сайте xsimulator.net. Процедура настройки SimTools описана в видео, также можно скачать PDF-руководство: SimTools User Manual v2.4.

DIY 2D гоночный симулятор движения на Arduino Nano и сервоприводах SG90

SimTools работает в «Demo» режиме до регистрации лицензии. Плагин для Live for Speed полностью работоспособен для тестов в демо-режиме. (Демо Live for Speed тоже подходит для тестирования SimTools.) Больше информации и скачивание Live for Speed: lfs.net/downloads.

Скачать SimTools: xsimulator.net.

Код

Скетч для Arduino (C/C++)

//********************************************************************************************
// RC Model Servo
// Original code By EAOROBBIE (Robert Lindsay)
// Completely mangled by aarondc
// For free use for Sim Tool Motion Software
//********************************************************************************************
#include <Servo.h>
//#define DEBUG 1 // раскомментируйте для отладки (Serial.print)
const int kActuatorCount = 2; // количество актуаторов (осей)
// Буквы-идентификаторы, которые SimTools шлет для каждого актуатора
// Порядок букв определяет порядок остальных констант kPins и kActuatorScale
const char kActuatorName[kActuatorCount] = { 'R', 'L' };
const int kPins[kActuatorCount] = {4, 5}; // пины подключения актуаторов
const int kActuatorScale[kActuatorCount][2] = {
  { 0, 179 },  // Масштаб правого актуатора
  { 179, 0 }   // Масштаб левого актуатора (инвертирован)
};
const char kEOL = '~'; // Разделитель конца строки для значений актуаторов
const int kMaxCharCount = 3; // страховка

Servo actuatorSet[kActuatorCount];
int actuatorPosition[kActuatorCount] = {90, 90}; // текущие позиции, старт = 90
int currentActuator; // текущий актуатор, читаемый из Serial
int valueCharCount = 0; // счетчик символов значения

enum TPortState { psReadActuator, psReadValue };
TPortState currentState = psReadActuator;

void setup() {
  for (int i = 0; i < kActuatorCount; i++) actuatorSet[i].attach(kPins[i]);
  for (int i = 0; i < kActuatorCount; i++) updateActuator(i);
  Serial.begin(9600);
}

void loop() {
  // основной цикл пуст, работа в serialEvent()
}

void serialEvent() {
  char tmpChar;
  int tmpValue;
  while (Serial.available()) {
    if (currentState == psReadActuator) {
      tmpChar = Serial.read();
      #ifdef DEBUG
      Serial.print("read in "); Serial.println(tmpChar);
      #endif
      for (int i = 0; i < kActuatorCount; i++) {
        if (tmpChar == kActuatorName[i]) {
          #ifdef DEBUG
          Serial.print("which is actuator "); Serial.println(i);
          #endif
          currentActuator = i;
          currentState = psReadValue;
          actuatorPosition[currentActuator] = 0;
          valueCharCount = 0;
          break;
        }
      }
    }
    if (currentState == psReadValue) {
      while ((valueCharCount < kMaxCharCount) && Serial.available()) {
        tmpValue = Serial.read();
        if (tmpValue != kEOL) {
          tmpValue = tmpValue - 48; // ASCII to digit
          if ((tmpValue < 0) || (tmpValue > 9)) tmpValue = 0;
          actuatorPosition[currentActuator] = actuatorPosition[currentActuator] * 10 + tmpValue;
          valueCharCount++;
        } else break;
      }
      if (tmpValue == kEOL || valueCharCount == kMaxCharCount) {
        #ifdef DEBUG
        Serial.print("read in "); Serial.println(actuatorPosition[currentActuator]);
        #endif
        // Масштабирование 0-255 -> 0-179 согласно настройкам
        actuatorPosition[currentActuator] = map(actuatorPosition[currentActuator], 0, 255,
          kActuatorScale[currentActuator][0], kActuatorScale[currentActuator][1]);
        #ifdef DEBUG
        Serial.print("scaled to "); Serial.println(actuatorPosition[currentActuator]);
        #endif
        updateActuator(currentActuator);
        currentState = psReadActuator;
      }
    }
  }
}

void updateActuator(int thisActuator) {
  actuatorSet[thisActuator].write(actuatorPosition[thisActuator]);
}

Схемы

DIY 2D гоночный симулятор движения на Arduino Nano и сервоприводах SG90

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

  1. Построение DIY инфракрасного датчика движения для Raspberry Pi — пошаговое руководство
  2. Сделай свой LUMAZOID: DIY Arduino музыкальный визуализатор
  3. Умный вольтметр на Arduino и смартфоне — простое DIY-проект
  4. Сборка DIY VR-скейтборда на Arduino, Google Cardboard и Bluetooth
  5. Умный водяной пистолет с датчиком движения на Arduino Nano
  6. DIY Arduino Radionics EMR Treatment Device — радионическое устройство
  7. Создание портативного RFID-замка на Arduino — пошаговое руководство
  8. Самодельный 3-осевой станок с ЧПУ (VMC): постройте точную фрезерную машину
  9. Бесконтактный ИК-термометр на Arduino Nano и GY-906 (MLX90614)
  10. Самодельные педали руля для авиасимулятора: пошаговое руководство