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

Своими руками: Автомат для конфет на Arduino — умный снек-диспенсер

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

Arduino UNO1 шт.
Сервопривод 180° (стандартный)1 шт.
LCD 16x2 с I2C-модулем (синий/белый)1 шт.
Тактильная кнопка 12мм2 шт. (по 1 для «мало» и «много»)
PHPoC Shield для Arduino (Ethernet/WiFi)1 шт. (опционально, для расширения)
ИК-датчик препятствия (FC-51 или аналогичный)1 шт. (детект стакана)
Кнопка питания (вкл/выкл)1 шт.
Макетная плата и перемычки1 набор

Инструменты

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

О проекте

Простой автомат для выдачи конфет: пользователь нажимает кнопку «Мало» или «Много», ставит стакан под ИК-датчик — сервопривод поворачивается, сыплет конфеты. Проект вдохновлён работой gatoninja236, но упрощён (без Google Assistant).

Этапы создания

  1. Сборка и тестирование электроники на макетке
  2. Написание и отладка кода
  3. Изготовление корпуса и механики (картон + акрил)
  4. Монтаж электроники в корпус
  5. Тестирование и эксплуатация

Механическая часть: Корпус и дозатор

Размеры деталей (картон/акрил)

Вырезы под компоненты

Механика дозатора выполнена ступенчато — конфеты не высыпаются сразу, а дозируются поворотом сервы.

Монтаж электроники

Arduino и макетная плата закреплены акриловыми стойками одна за другой — экономия места. LCD и кнопки спереди, серва и ИК-датчик в зоне дозатора, кнопка питания сзади.

Код (Candy Dispenser.ino)

//------БИБЛИОТЕКИ------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

//------НАСТРОЙКИ------
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C может быть 0x3F
Servo myservo;
int pos = 90;                // стартовая позиция сервы
int buttonCLK = 7;           // кнопка «По часовой» (Мало)
int buttonAntiCLK = 6;       // кнопка «Против часовой» (Много)
const int avoidPin = 5;      // ИК-датчик стакана
int set = 0;                 // режим: 1=мало, 2=много

void setup() {
  lcd.begin();
  lcd.clear();
  myservo.attach(9);
  pinMode(buttonCLK, INPUT);
  pinMode(buttonAntiCLK, INPUT);
  pinMode(avoidPin, INPUT);
  Serial.begin(9600);
  lcd.backlight();
  lcd.setCursor(3,0); lcd.print("Welcome to");
  lcd.setCursor(3,1); lcd.print("Candy Land");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0); lcd.print("How much candy?");
  lcd.setCursor(0,1); lcd.print("A Little A Lot");
  delay(5000);
}

void loop() {
  // Кнопка «Мало»
  if (digitalRead(buttonCLK) == HIGH) {
    lcd.clear(); lcd.print("Please Place Cup"); delay(2000); lcd.clear();
    set = 1;
  }
  // Кнопка «Много»
  if (digitalRead(buttonAntiCLK) == HIGH) {
    lcd.clear(); lcd.print("Please Place Cup"); delay(2000); lcd.clear();
    set = 2;
  }
  // Ожидание стакана и выдача
  if (set == 1) IRCLK();
  if (set == 2) IRAntiCLK();
}

void TurnClockwise() { // Выдача «Мало»
  Serial.println("Candy 1 Being Dispensed");
  CandyText1();
  for (pos = 90; pos < 180; pos += 1) {
    myservo.write(pos); delay(15);
  }
  if (pos == 180) { delay(2000); ThankYouText(); }
}

void TurnAntiClockwise() { // Выдача «Много»
  Serial.println("Candy 2 Being Dispensed");
  CandyText2();
  for (pos = 90; pos < 180; pos += 1) {
    myservo.write(pos); delay(20);
  }
  if (pos == 180) { delay(3000); ThankYouText(); }
}

void IRCLK() { // Детект стакана для режима «Мало»
  delay(1000);
  boolean avoidVal = digitalRead(avoidPin);
  lcd.setCursor(0,0); lcd.print("Detecting Cup...");
  if (avoidVal == LOW) { // LOW = объект обнаружен
    lcd.clear(); lcd.print("Cup Placed"); delay(2000);
    TurnClockwise();
  }
}

void IRAntiCLK() { // Детект стакана для режима «Много»
  delay(1000);
  boolean avoidVal = digitalRead(avoidPin);
  lcd.setCursor(0,0); lcd.print("Detecting Cup...");
  if (avoidVal == LOW) {
    lcd.clear(); lcd.print("Cup Placed"); delay(2000);
    TurnAntiClockwise();
  }
}

void CandyText1() { lcd.clear(); lcd.setCursor(4,0); lcd.print("Pouring"); lcd.setCursor(1,1); lcd.print("Little Candy"); }
void CandyText2() { lcd.clear(); lcd.setCursor(4,0); lcd.print("Pouring"); lcd.setCursor(3,1); lcd.print("Lot Candy"); }

void ThankYouText() {
  lcd.clear(); lcd.setCursor(5,0); lcd.print("Thank");
  lcd.setCursor(6,1); lcd.print("You"); delay(15);
  software_Reset(); // перезапуск программы
}

void software_Reset() { asm volatile ("jmp 0"); }

Схема подключения

Следуйте цветовой разводке на фото схемы. Важные моменты:

Своими руками: Автомат для конфет на Arduino — умный снек-диспенсер
Схема подключения (цветовая разводка)

Приятного снекинга!

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

  1. Кенди-кейн: история, производство и сладкая наука о классическом рождественском угощении
  2. Конфетное кукурузное зернышко: от традиции к современному производству
  3. Жавбрейкер: история, ингредиенты и ремесло классической твёрдой конфеты
  4. Сахарная вата: от классического угощения к современным производственным технологиям
  5. Сладкая наука жевательных конфет: от истории к современному производству
  6. M&M's: от изобретения к современному производству
  7. Панель переключателей и LED для Microsoft Flight Simulator 2020 на Arduino
  8. Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
  9. FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
  10. DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора