Вращающаяся платформа с регулируемой RGB подсветкой и с управлением по Bluetooth

Платформа предназначена для демонстрации кукол. Регулируется скорость и направление вращения. 

Также регулируется подсветка платформы. Есть несколько режимов подсветки:

  •  выключена, 
  •  постоянный цвет и яркость,
  •  постоянный цвет и меняющаяся яркость,   
  •  все цвета по кругу (красный, зеленый, синий, желтый, пурпурный, голубой, белый) и постоянная яркость,
  •  все цвета и меняющаяся яркость,

Бюджетный вариант по компонентам. Сама платформа напечатана на 3d-принтере

Используемые компоненты:

  • Arduino Nano — 1 шт
  • Шаговый двигатель 28BYJ-48 с драйвером на микросхеме ULN2003 — 1 шт
  • Bluetooth-модуль HC-05 — 1 шт
  • Светодиодная лента RGB — 10-12 светодиодов
  • Транзистор TIP120 — 3 шт
  • Резистор 1 кОм — 3 шт
  • RGB-светодиод — 1 шт
  • Резистор 220 Ом — 3 шт
  • Буззер — 1 шт
  • Кнопка с колпачком — 3 шт
  • Резистор 10 кОм — 3 шт
  • Понижающий DC-DC преобразователь  LM2596S — 1 шт
  • Блок питания 12В 2А

Схема соединений

Настройка параметров движения и подсветки с помощью мобильного приложения, либо с помощью трех кнопок. Средняя кнопка — выбор режима настройки (при это RGB-светодиод горит определенным цветом): 

цвет RGB-светодиода Режим Кнопка1 Кнопка3 Подпрограмма
0 не горит остановить платформу и выключить подсветку остановить платформу выключить подсветку doButtons0()
1 красный установка направление движения мотора вращение по часовой вращение против часовой doButtons1()
2 зеленый

установка скорость движения мотора
от speedMotorMin до speedMotorMax с шагом speedMotorStep

уменьшение скорости
   
увеличение скорости doButtons2()
3 синий установка максимальной яркости RGB-лента 
от brightRGBMin до brightRGBMmax с шагом brightRGBStep
 
уменьшение яркости увеличение яркости doButtons3()
4 желтый установка цвета RGB-лента предыдущий следующий doButtons4()
5 фиолетовый выбор длительности смены цвета RGB-ленты   длительность нажатия кнопки doButtons5()
6 голубой выбор режима освещения RGB-лента 
0 — не горит ,
1 — пост. цвет и яркость,
2 — пост. цвет и меняющаяся яркость 0 —> max ,  
3 — все цвета и постоянная яркость,
4 — все цвета и меняющаяся яркость 0 —> max,
предыдущий режим следующий режим doButtons6()
7 белый сохранение текущих параметров в EEPROM
получение настроек из EEPROM
получение настроек из EEPROM сохранение текущих параметров в EEPROM doButtons7()

Код на Arduino для определения нажатия кнопки или получения команды по bluetooth

 void loop() {    // данные по bluetooth    if (stringComplete) {     //Serial.println(inputString);     if(parseHC05()) {        //Serial.println("ok");        setParam(inHC05data[0],inHC05data[1]);     }     else {        //Serial.println("no");     }      //      inputString = "";     stringComplete = false;   }    // проверка нажатия-отжатия кнопки    int but=getButton();    if(but>0) {       //Serial.println(but);        switch(resSettings) {          case 0:               doButtons0(but);             break;          case 1:               doButtons1(but);             break;          case 2:               doButtons2(but);             break;          case 3:               doButtons3(but);             break;          case 4:               doButtons4(but);             break;          case 5:               doButtons5(but);             break;          case 6:               doButtons6(but);             break;          case 7:               doButtons7(but);             break;          default:             break;       }    }    motor.runSpeed();    // освещение RGB-лента    RGB(platform.numLight); }

За воспроизведение освещения отвечает функция RGB

  struct PLATFORM {   int dir;   // направление движения мотора (-1, 0, 1)   int speedMotor;   // скорость движения мотора   int numLight;   // номер режима освещения   // 0 - выкл,   // 1 - пост. цвет и яркость,    // 2 - пост. цвет и меняющаяся яркость,   // 3 - все цвета и постоянная яркость,    // 4 - все цвета и меняющаяся яркость,   int color;   // цвет   int bright;   // яркость   //unsigned long pause;  // скорость изменения яркости   unsigned int pause;  // скорость изменения яркости   int currentColor;   // текущий цвет   int currentBright;   // текущая яркость   int dirCurrentBright; // текущее направление изменения яркости };  PLATFORM platform={-1,200,4,2,200,1000,2,10,1};  // RGB-лента void RGB(int res) {   switch(res) {      case 0:      // выключить RGB         setLedsLight(0,0,0);         break;      case 1:     // один цвет на постоянной яркости         setLedsLight(min(ledsSettings[platform.color][0],platform.bright),                      min(ledsSettings[platform.color][1],platform.bright),                      min(ledsSettings[platform.color][2],platform.bright));         break;      case 2:     //          setLedsLight(min(ledsSettings[platform.color][0],platform.currentBright),                      min(ledsSettings[platform.color][1],platform.currentBright),                      min(ledsSettings[platform.color][2],platform.currentBright));         if(millis()-millisChangeRGB >= platform.pause/platform.bright) {             platform.currentBright=platform.currentBright+platform.dirCurrentBright;             if(platform.currentBright>platform.bright) {                platform.dirCurrentBright=-1;                platform.currentBright=platform.bright;             }             else if(platform.currentBright<0) {                platform.dirCurrentBright=1;                platform.currentBright=0;             }                          millisChangeRGB=millis();                   }         break;      case 3:          setLedsLight(min(ledsSettings[platform.currentColor][0],platform.bright),                      min(ledsSettings[platform.currentColor][1],platform.bright),                      min(ledsSettings[platform.currentColor][2],platform.bright));         if(millis()-millisChangeRGB >= platform.pause) {             platform.currentColor=max(1,(platform.currentColor+1)%8);             millisChangeRGB=millis();                   }          break;      case 4:          setLedsLight(min(ledsSettings[platform.currentColor][0],platform.currentBright),                      min(ledsSettings[platform.currentColor][1],platform.currentBright),                      min(ledsSettings[platform.currentColor][2],platform.currentBright));         if(millis()-millisChangeRGB >= platform.pause/platform.bright) {             platform.currentBright=platform.currentBright+platform.dirCurrentBright;             if(platform.currentBright>platform.bright) {                platform.dirCurrentBright=-1;                platform.currentBright=platform.bright;             }             else if(platform.currentBright<0) {                platform.dirCurrentBright=1;                platform.currentBright=0;                platform.currentColor=max(1,(platform.currentColor+1)%8);             }                          millisChangeRGB=millis();                   }          break;      default:          break;   } }
   

Полный скетч можно скачать по ссылке ниже

Вид приложения на Android (написано в программе app2inventor)

Stl файлы для печати корпуса созданы в программе Tinkercad.

И фото устройства

 

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino Arduino Nano 3.0 1
Шаговый двигатель 28BYJ-48 1
Драйвер на микросхеме ULN2003 1
Bluetooth-модуль HC-05 1
Биполярный транзистор TIP120 3
Резистор 220 Ом 3
Резистор 1 кОм 3
Светодиод RGB 1
Кнопка 3
Резистор 10 кОм 3
Буззер 1
Светодиодная лента RGB 1
Понижающий DC-DC преобразователь   LM2596S 1
Блок питания 12В 2А 1