По результатам поиска в Google - Arduino в Украине не нашлось! Пусть этот блог будет началом!!!

пятница, 22 января 2010 г.

Кофеварка - The End!

      Вчера (21.01.2010) закончил проект модернизации кофеварки Saeco Aroma и сегодня решил дописать рассказ об этом проекте. Ниже пойдут фотографии с комментариями и может как нибудь засниму видео... на веб камеру ноута.
После изготовления корпуса блока управления (монтирование в него экрана и кнопок) стало видно как туда поместить Arduino mini и плату с "обвязкой портов"...

       Никакая общая плата туда естественно не влазила. Кроме того из-за торчащего кварца даже крышка полностью не закрывалась. Поэтому я решил все делать на "соплях" МГТФ 0,05. Это мой любимый провод... не горит, не рвется, не ломается, легко зачищается и паяется... Правда редко продается.



Для соединения с  Arduino mini я использовал штырьковый разъем (не знаю как он там называется) и наклеил на него двухсторонним скотчем бумажную памятку с назначением портов, выводы же, как можно сильнее загнул в бок чтобы уменьшить высоту.
    Не забыл впаять и разъем для програмирования Arduino mini, чтобы потом не доставать ее туда-сюда...
 
  Когда МГТФ закончился в ход пошел шлейф в итоге все внутри корпуса.

     С прошивкой Arduino mini возникли небольшие сложности т.к. я нашел описание прошивки через плату Arduino Diecimila а у меня Duemilanove, но там все еще проще... просто соединяешь TX, RX, GND, +5v, RES с соответствующими выводами на плате Duemilanove (не забыв вынуть саму микросхему) и все получилось... Скажу сразу Arduino mini более тормознутая...



     На плате обвязки - пару резисторов, подстроечный резистор для ЛСД, кнопка эмулятор датчика температуры и светодиод для проверки подачи напряжения на насос кофеварки (для проверки работоспособности блока без кофеварки). Вроде про эту коробочку все... но туда еще потом пришлось залезть...
Спустя какое-то время я купил корпус и необходимые детали для исполнительного блока.

Корпус помещался в нишу кофеварки справа от наклейки, за проводом. Провода будут заходить в отверстие вместе с проводом питания.

Что у нас внутри? блок питания от Nokia по всему видно не аутентичный или изначальна хреновая разработка... напряжение на выходе 7-8 вольт... а пишут 5... поэтому в схему плавно влился L7805CV (стабилизатор напряжения на 5в) и пара конденсаторов 0.225 мкФ, он выглядывает из-за реле которое управляется драйвером ULN 2003A еще там схема понижения напряжения с 220в до 5в... и оптопара - (оптотранзистор 4N25). Предыдущий выбор MOC 3061 - не подошел... и доставил много хлопот т.к. он (оптосимистор с переходом через 0 как и без перехода через 0 - купленный позже) открывается, а потом не закрывается ожидая другую полярность напряжения или спад до 0.... чего у нас нет... замена его на оптотранзистор принесла еще два резистора.
Схема:

И кроме того дала вместо HIGH на выходе -  LOW.... вот тут пришлось не только менять программу, но и перекидывать резистор на входе Arduino с " - " на " + ".
Раз уж я коснулся программы, то она претерпела изменения!  Теперь она не зависит от времени протекания воды, а только от датчика температуры, как я изначально и хотел (горячая течет, не горячая не течет)!

// include the library code:
#include


// constants won't change. They're used here to

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
const int buttonPin = 6; // set the number of the select pushbutton pin
const int button2Pin = 8; // set the number of the pushbutton-temp pin
const int button3Pin = 9; // set the number of the START pushbutton
const int ledPin = 7; // set the number of the led-pump pin

// variables will change:
int val = 0;// variable for reading the select pushbutton status
int buttonState;// variable to hold the select pushbutton state
int val2 = 1; //variable for reading pushbutton-temp status
int button2State;// variable to hold the pushbutton-temp state
int button2State2 = 0;// variable to hold the pushbutton-temp continuously  (triger)
int start = 0; //variable for reading START pushbutton status
int button3State;// variable to hold the START pushbutton state
int button3State2;// variable to hold the START pushbutton state continuously
int buttonPresses = 0;// how many times the select pushbutton has been pressed (# of programm)
int water = 0; //portions of water per cup

void setup() {

  pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input
  pinMode(button2Pin, INPUT); // initialize the pushbutton-temp pin as an input
  pinMode(button3Pin, INPUT); // initialize the start pushbutton pin as an input
  pinMode(ledPin, OUTPUT); // initialize the ledPin - pump pin as an output

  lcd.begin(16, 2);// set up the LCD's number of rows and columns:
      lcd.setCursor(5, 0);  // set the cursor to (column, line)
      lcd.print("Privet"); // print "Privet"
      delay (500);
      lcd.setCursor(3, 1);
      lcd.print("Vyberi cofe");
      delay (500);

}

void loop() {
 
  val = digitalRead(buttonPin);    // read input value and store it in val
        delay (50);
        if (val != buttonState) // If the button state has changed...
            {if (val == HIGH) {buttonPresses++;} // check if the button is now pressed
             if (buttonPresses == 6){buttonPresses = 0;}
             button3State2=0; // reseting button3State2 to avoid starting flowing water without selected program
            // selecting program, printing name of program (tipe of cup), seting amount of water, printing amount of water 
             if (buttonPresses == 0) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("1 small"); lcd.setCursor(4, 1); water = 1; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 1) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("2 big"); lcd.setCursor(4, 1); water = 6; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 2) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("1 big"); lcd.setCursor(4, 1); water = 3; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 3) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("2 middle"); lcd.setCursor(4, 1); water = 4; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 4) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("1 middle"); lcd.setCursor(4, 1); water = 2; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 5) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("2 small"); lcd.setCursor(4, 1); water = 2; lcd.print("water - "); lcd.print(water);}
     
       }
  buttonState = val;

  val2 = digitalRead(button2Pin); // reading temp sensor of cofffe machine (220v) if lamp lights temp is ok!
         delay (50);

  button2State = val2;

  start = digitalRead(button3Pin);
          delay (50);
          if (start != button3State){if (start == HIGH) {if (water>0){button3State2=HIGH;}}}
  button3State = start;
   // cheks  if temp-ok? if progr selected?,, if start button was pressed?, opens water, turnes on triger  
  if (val2<1){if (water>0){if (button3State2>0){digitalWrite(ledPin, HIGH); button2State2=1;}}}
  // cheks  if temp- NOT ok? cheks triger (is pump working&)? close water, decreases number of water, print the rest of water or end message
  if (val2>0){if (button2State2>0){digitalWrite(ledPin, LOW);
                                   button2State2=0; water--; lcd.setCursor(4, 1); lcd.print("water - "); lcd.print(water);
                                  if (water==0) {lcd.clear(); lcd.setCursor(1, 0); lcd.print("Coffe GOTOV!!!");}}}
}

 
Далее подсоединение всего вместе

Для этого (чтобы не портить кофеварку) я сделал клеммы - переходники и припаял к ним МГТФ 0,5. Все вышло красиво и надежно!



в общем все выглядит теперь так и второй день используется!!!

 







среда, 6 января 2010 г.

Кофеварка 9 - Ураа!!! Заработало!!!

        Двигаясь по намеченному плану собрал схему понижения напряжения с 220в до 5 в. Первое что нужно заметить это то, что у меня получилась полярность на выходе не как в схеме, а наоборот (я негде не мог найти маркировки импортного аналога стабилитрона КС156А - C5V6PH поэтому попробовал поставить его наоборот, но тогда напряжение было 1в... так что оставил все как есть... может дело было и не в нем...)! И второе - напряжение было не 5 в а 4 с чем-то, но для оптопары (МОС 3061) это не проблема. Драйвер реле тоже не подвел. Хотя я долго не мог понять где подключить "+", оказывается к выводу "COM".
В целом схема заработала.
       Паять я сразу начал на монтажной плате, так что (как всегда) осталось отпилить и найти корпус под все это добро вместе с блоком питания. Это позволит вести к блоку управления всего 4 провода "+", "-", "один от оптопары", "один к драйверу реле" т.к. питание у схем общее.
Кстати! Нужно будет подобрать резистор для установки контрастности LCD, т.к. напряжение питания немного изменится.



 

 Теперь к главному! Пройдя шаг 1, 3 я не выдержал и сразу перешел  шагу 7! Собрал все в кучу и подключил к кофеварке! Кофеварка сначала сопротивлялась. Там такая путаница проводов, что только опытным путем удалось правильно подключиться.
Все работает!!!



А это все компоненты кроме БП вместе.



Теперь пора доделать макетную плату для Arduio mini и заняться прошивкой.



вторник, 5 января 2010 г.

Кофеварка 8 - От обратного!

Осознав ошибочность моего предыдущего подхода я решил сначала приобрести корпус и все крупные детали и потом уже спаивать все вместе. Выбрал корпус, кнопки, купил все необходимые на первый взгляд детали (т.к. по моему творческому методу... может резко что-то понадобится или наоборот, как карта ляжет). На радио рынок я пришел с четкими размерами! Но купил тот который мне сразу понравился.... и в него естественно кое-что не влазит! и это кое-что - Arduino mini!!! Зато все остальное после пыток ножом, бокорезами, раскаленными гвоздями, раскаленными лезвиями, точильным камнем и моими руками  - влазит неплохо!!!
Вид изнутри. Между кнопок должна лежать Arduino mini, но с учетом разъема она не влазит :(! Придется что-то придумывать! (обожаю творчество!)


А вот вид уже почти готового изделия. Правда внутрь будет уходить еще шлейф на 6 проводов (питание, датчик температуры, и на помпу), а так вроде все. Мне нравится! Не плохо для первого раза!




Завтра (и в дальнейшем) на повестке дня:
  1. Сборка схемы понижения напряжения с 220в до 5в.
  2. Небольшая доработка программы (кое-что с цифрами и попытаюсь добавить звуковые эффекты на пьезоизлучателе).
  3. Добавление в уже собранную схему драйвера реле и проверка работоспособности.
  4. Попытки вставить Arduino mini в корпус.
  5. Размещение в корпусе оставшихся компонентов.
  6. Прошивка Arduino mini.
  7. Сборка всего до кучи и испытание с кофеваркой! (будет видео).
  8. Калибровка (к-во воды, время задержки между подачами и т.д.).
  9. Декор (если получится...)
  10. Перевод всего на Английский язык и размещение на любимых сайтах!
P.S. Еще одно семейное фото!

Кофеварка 7 - Arduino mini...

Вчера весь день занимался "творчеством" решил собрать плату для Arduino mini. Сначала я эту плату собирался использовать в проекте, но какого-то конкретного плана или чертежа не делал, а паял так... как получится. И вот что получилось:
LCD,  Arduino mini,  и, собсно, плата...








 В качестве платы использовал стандартную заготовку купленную на радиорынке.








Конечно... когда ажиотаж пайки прошел.... стало ясно, что "это" не влезет не в какой корпус.
Поэтому я решил оставить эту плату как  макетную. Тем более что там есть три входа с необходимыми деталями и выход с лампочкой. Для проверки Arduino mini после прошивки - подойдет!
 








Не имея технического образования... и привычки что-то чертить и рисовать я всегда пользовался навесным монтажом и прикидывал на глаз.... творческий подход так сказать...
Хочу научиться разводить платы на компе и делать печатные. Но это наверное уже в следующем проекте.

воскресенье, 3 января 2010 г.

Кофеварка 6 - Технические наброски...

  1. Для питания схемы буду использовать блок питания Nokia AC-3E (естественно не новый, но вполне рабочий). 350мА должно хватить для Arduino и одного или двух реле. Фото без корпуса


2.  Помпу буду включать через реле 5в/220в  (WJ 107 -1c-05VDC)  и драйвер реле ULN 2003 (что бы не нагружать Arduino).  На фото 12в вариант реле. (После написания этого поста я попробовал подключить Arduino напрямую к реле. Реле работает нормально! Но после каждого срабатывания на LCD появляются какие-то страшные глюки...., значит на прямую все-таки нельзя! )



3.  Для подачи сигнала с датчика температуры (лампочки на 220в) на вход микроконтроллера использую схему и оптопару или реле (еще не подобрал...)



4.  Блок понижения напряжения расположу внутри кофеварки хорошенько заизолировав. К Arduino будет выходить только провода от оптопары.

Кофеварка 5

Программа - готова!
// include the library code:
#include


// constants won't change. They're used here to

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
const int buttonPin = 6; // set the number of the select pushbutton pin
const int button2Pin = 8; // set the number of the pushbutton-temp pin
const int button3Pin = 9; // set the number of the START pushbutton
const int ledPin = 7; // set the number of the led-pump pin

// variables will change:
int val = 0;// variable for reading the select pushbutton status
int buttonState;// variable to hold the select pushbutton state
int val2 = 0; //variable for reading pushbutton-temp status
int button2State;// variable to hold the pushbutton-temp state
int start = 0; //variable for reading START pushbutton status
int button3State;// variable to hold the START pushbutton state
int button3State2;// variable to hold the START pushbutton state continuously

int buttonPresses = 0;// how many times the select pushbutton has been pressed (# of programm)
int water = 0; //portions of water per cup


void setup() {

  pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input
  pinMode(button2Pin, INPUT); // initialize the pushbutton-temp pin as an input
  pinMode(button3Pin, INPUT); // initialize the start pushbutton pin as an input
  pinMode(ledPin, OUTPUT); // initialize the ledPin-nasos pin as an output

  lcd.begin(16, 2);// set up the LCD's number of rows and columns:
      lcd.setCursor(5, 0);  // set the cursor to (column, line)
      lcd.print("Privet"); // print "Privet" "Vyberi cofe"
      delay (1000);
      lcd.setCursor(3, 1);
      lcd.print("Vyberi cofe");
      delay (1000);

}




void loop() {
 
  val = digitalRead(buttonPin);    // read input value and store it in val
        delay (50);
        if (val != buttonState) // If the button state has changed...
            {if (val == HIGH) {buttonPresses++;} // check if the button is now pressed
             if (buttonPresses == 6){buttonPresses = 0;}
             button3State2=0; // reseting button3State2 to avoid starting flowing water without selected program
            // selecting program, printing name of program (tipe of cup), seting amount of water, printing amount of water  
             if (buttonPresses == 0) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("1 small"); lcd.setCursor(4, 1); water = 2; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 1) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("2 big"); lcd.setCursor(4, 1); water = 12; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 2) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("1 big"); lcd.setCursor(4, 1); water = 6; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 3) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("2 middle"); lcd.setCursor(4, 1); water = 8; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 4) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("1 middle"); lcd.setCursor(4, 1); water = 4; lcd.print("water - "); lcd.print(water);}
             if (buttonPresses == 5) {lcd.clear(); lcd.setCursor(5, 0); lcd.print("2 small"); lcd.setCursor(4, 1); water = 4; lcd.print("water - "); lcd.print(water);}
      
       }
  buttonState = val;

  val2 = digitalRead(button2Pin); // reading temp sensor of cofffe machine (220v) if lamp lights temp is ok!
         delay (50);
         button2State = val2;

  start = digitalRead(button3Pin);
          delay (50);
          if (start != button3State){if (start == HIGH) {if (water>0)
              {button3State2=HIGH;}}}
  button3State = start;
// cheks if progr selected?, if temp-ok?, if start button was pressed?, opens water, delays 10 sec (water flows less then 10 sec), close water, decreases number of water, print the rest of water or end message   
if (water>0){if (val2>0){if (button3State2>0){digitalWrite(ledPin, HIGH); delay(10000); digitalWrite(ledPin, LOW); water--; lcd.setCursor(4, 1); lcd.print("water - "); lcd.print(water); if (water==0) {lcd.clear(); lcd.setCursor(1, 0); lcd.print("Coffe GOTOV!!!");}}}}
             
}


Комментарии по английски для иностранных читателей, потом переведу и весь текст