Чайная церемония на Ардуино (акриловый манипулятор - конструктор из Китая)

Тема в разделе "Глядите, что я сделал", создана пользователем issaom, 30 янв 2017.

  1. issaom

    issaom Гуру

    Собрал на базе Ардуино девайс для заварки чая :D



    Кому интересно код:

    Код (C++):
    #include <Servo.h>
    Servo myservo1;
    Servo myservo2;
    Servo myservo3;
    Servo myservo4;

    int val1 = 42;
    int val2 = 90;
    int val3 = 50;
    int val4 = 111;

    //кнопка приготовления чая на пине 4
    int buttonPin = 4;

    void setup()
    {
      myservo1.attach(11);
      myservo2.attach(10);
      myservo3.attach(9);
      myservo4.attach(6);

      // активируем подтягивающий резистор на пине кнопки
      pinMode(buttonPin, INPUT_PULLUP);
      // индикатор приготовления чая
      pinMode(5, OUTPUT);

      myservo1.write(val1);
      myservo2.write(val2);
      myservo3.write(val3);
      myservo4.write(val4);

    }

    //функция перемещающая манипулятор в заданную точку
    void manipulator(int val1_new, int val2_new, int val3_new, int val4_new, int speedm)
    {
      int val1_route = 0; //захват направление
      int val2_route = 0; //верх/низ направление
      int val3_route = 0; //вперед назад направление
      int val4_route = 0; //поворот направление

      if (val1 < val1_new) val1_route = 1;
      if (val1 > val1_new) val1_route = -1;

      if (val2 < val2_new) val2_route = 1;
      if (val2 > val2_new) val2_route = -1;

      if (val3 < val3_new) val3_route = 1;
      if (val3 > val3_new) val3_route = -1;

      if (val4 < val4_new) val4_route = 1;
      if (val4 > val4_new) val4_route = -1;

      //синхронизируем переданные значения с текущими
      while (val1 != val1_new || val2 != val2_new || val3 != val3_new || val4 != val4_new)

      {

        val1 = val1 + val1_route;
        myservo1.write(val1);
        if (val1 == val1_new) val1_route = 0;

        val2 = val2 + val2_route;
        myservo2.write(val2);
        if (val2 == val2_new) val2_route = 0;

        val3 = val3 + val3_route;
        myservo3.write(val3);
        if (val3 == val3_new) val3_route = 0;

        val4 = val4 + val4_route;
        myservo4.write(val4);
        if (val4 == val4_new) val4_route = 0;

        delay(speedm);
      }

    }

    void loop()
    {

      if (digitalRead(buttonPin) == LOW) {    //готовим чай если кнопка нажата!!!

        digitalWrite(5, HIGH);

        manipulator(42, 90, 50, 111, 50);   // сервы на исходную !!!

        manipulator(70, 165, 26, 111, 50);  // идем за чайным пакетом !!!

        manipulator(70, 163, 46, 111, 50);  // идем за чайным пакетом !!!

        manipulator(30, 163, 46, 111, 50);  // идем за чайным пакетом !!!

        manipulator(30, 178, 44, 111, 50);  // идем за чайным пакетом !!!

        manipulator(30, 178, 44, 58, 50);   // идем за чайным пакетом !!!

        for (int i = 0; i <= 7; i++) {

          manipulator(30, 118, 62, 58, 50); // макаем пакет

          delay(250);

          manipulator(30, 162, 50, 58, 50); // макаем пакет

        }

        manipulator(30, 179, 24, 58, 50);   // уносим пакет

        manipulator(30, 179, 24, 162, 50);  // уносим пакет

        manipulator(30, 104, 61, 162, 50);  // уносим пакет

        manipulator(65, 50, 61, 162, 50);   // бросаем пакет

        manipulator(42, 90, 50, 111, 50);   // сервы на исходную !!!

        manipulator(75, 78, 88, 123, 50);   // первый кусок !!!

        manipulator(45, 78, 88, 123, 50);   // первый кусок !!!

        manipulator(45, 78, 55, 123, 50);   // первый кусок !!!

        manipulator(45, 78, 55, 85, 50);    // первый кусок !!!

        manipulator(45, 124, 48, 85, 50);   // первый кусок !!!

        manipulator(45, 127, 56, 59, 50);   // первый кусок !!!

        manipulator(60, 127, 56, 59, 50);   // первый кусок !!!

        manipulator(42, 90, 50, 111, 50);   // сервы на исходную !!!

        manipulator(75, 79, 90, 106, 50);   // второй кусок !!!

        manipulator(45, 79, 90, 106, 50);   // второй кусок !!!

        manipulator(45, 79, 55, 106, 50);   // второй кусок !!!

        manipulator(45, 78, 55, 85, 50);    // второй кусок !!!

        manipulator(45, 124, 48, 85, 50);   // второй кусок !!!

        manipulator(45, 127, 56, 59, 50);   // второй кусок !!!

        manipulator(60, 127, 56, 59, 50);   // второй кусок !!!

        manipulator(60, 127, 45, 59, 50);   // идем за ложкой !!!

        manipulator(60, 127, 25, 59, 50);   // идем за ложкой !!!

        manipulator(65, 127, 25, 139, 50);  // идем за ложкой !!!

        manipulator(65, 130, 61, 139, 50);  // идем за ложкой !!!

        manipulator(35, 130, 61, 139, 50);  // идем за ложкой !!!

        manipulator(35, 180, 61, 139, 50);  // идем за ложкой !!!

        manipulator(35, 180, 20, 139, 50);  // идем за ложкой !!!

        manipulator(35, 180, 20, 60, 50);   // идем за ложкой !!!

        manipulator(35, 180, 35, 60, 50);   // идем за ложкой !!!

        for (int j = 0; j <= 10; j++) {

          manipulator(38, 127, 50, 59, 20); // перемешиваем !!!

          manipulator(38, 127, 47, 59, 20); // перемешиваем !!!!

          manipulator(38, 127, 57, 51, 20); // перемешиваем !!!

          manipulator(38, 127, 68, 54, 20); // перемешиваем !!!

          manipulator(38, 127, 75, 61, 20); // перемешиваем !!!

          manipulator(38, 127, 71, 67, 20); // перемешиваем !!!

          manipulator(38, 127, 61, 71, 20); // перемешиваем !!!

          manipulator(38, 127, 50, 71, 20); // перемешиваем !!!

          manipulator(38, 127, 44, 66, 20); // перемешиваем !!!

          manipulator(38, 127, 50, 59, 20); // перемешиваем !!!

          }



        manipulator(38, 170, 65, 59, 50);   // уносим ложку !!!

        manipulator(38, 179, 18, 59, 50);   // уносим ложку !!!

        manipulator(38, 179, 18, 139, 50);  // уносим ложку !!!

        manipulator(38, 179, 57, 139, 50);  // уносим ложку !!!

        manipulator(38, 179, 54, 139, 50);  // уносим ложку !!!

        manipulator(38, 179, 58, 137, 50);  // уносим ложку !!!

        manipulator(50, 179, 58, 137, 250); // уносим ложку !!!

        manipulator(50, 179, 27, 137, 50);  // сервы на исходную !!!

        manipulator(50, 120, 27, 137, 50);  // сервы на исходную !!!

        manipulator(42, 90, 50, 111, 50);   // сервы на исходную !!!

        digitalWrite(5, LOW);
      }

    }
     
    Igor68, ostrov, Aivaredze и 5 другим нравится это.
  2. Flyfisherman

    Flyfisherman Нерд

    Прикольно:) я бы еще добавил термодатчик под то место куда ставится чашка, тогда он сам бы начал работать как только в чашку налили кипятка. Можно еще дополнительно предусмотреть, автоподачу пакетиков чая и сахара, предусмотреть возможность заваривания с сахаром и без сахара, я думаю чайный автомат еще не закончен и требует доработок.
     
    NikitOS и issaom нравится это.
  3. issaom

    issaom Гуру

    Ну это больше видео про манипулятор чем про автомат для приготовления чая - было интересно посмотреть сможет ли он справится с достаточно нетривиальной задачей - ну и в коде поупражняться.... (тупо перекладывать кубики с места на место слишком банально).... Хотя если расширить полочки можно положить разных видов чая и пожалуй даже отсек под "печеньки" сделать.... ну и на родной плате PIN-ов свободных побольше распаять под кнопки выбора )))
    з.ы. на сайте производителя выложены чертежи всех деталей - по идее можно отдать их на резку оргстекла и запилить такую штуку самостоятельно - мне понравилось что конструкция легкая и не громоздкая а значит легко водрузить на то что ездит ))) - в далекой перспективе может быть перечертить её под более мощные сервы и собрать с нуля....
     
  4. dmitron1036

    dmitron1036 Гик

    1) Потенциометрами - только управлять можно?
    Или записывать? т.е. потенциометром накрутил - на экране значение угла посмотрел.
    2) Про рывки - это недоработка кода или смазать силиконом надо?
     
  5. issaom

    issaom Гуру

    1). Для работы с потенциометрами нужно заливать другой код - с ними удобно делать настройку
    установил с их помощью манипулятор в точку А выдал углы в com порт - записал, потом установил в точку B записал углы - именно так я и прописывал действия для своей функции. т.е. весь порядок действий выполнил руками с помощью резюков а потом забил в программу.
    2) - хлипковаты сервы для такой конструкции слишком большой момент инерции поэтому когда нагрузка за счет рычага получается большая, сервы в некоторых точках начинает тилипать
     
  6. alp69

    alp69 Форумчанин

    И еще одну лапу для отжимания пакетика :D
     
    Igor68, NO_NAME и NikitOS нравится это.
  7. amber_34

    amber_34 Нуб

    Идея для воплощения:
    Чайная машина, которая будет по графику или смс доводить воду до нужной температуры, потом сервопривод будет опускать в воду сашет с завакой и выдержитвать ее в зависимости от вида чая, и после этого удалять сашет.
    Утром я встаю в 6.00 и к этому времени меня уже будет ждать заваренный , но не сильно горячий чай.
     
  8. NikitOS

    NikitOS aka BAR__MEN Администратор

    прикольно ;)
     
  9. NikitOS

    NikitOS aka BAR__MEN Администратор

    согласен)