Технический форум по робототехнике.
Revenger » 25 авг 2015, 17:24
Вся эта техника и вылилась в итоге для контроля прутка, почитай посты ранее. Синхронизация именно для этого. Чуть притормозил мотор экструдера - протяжка тут же "среагировала" и замедлилась, по этому никаких утолщений быть не должно. Впрочем как и утончений. Если синнхронизация тебе не нужна, то включай любой мотор на намотчик и мотай готовый, но у меня не выходит стабильного диаметра.
По мотору... куда мотор? У меня на протяжке нема17, а на намотчике обычный коллекторник. Если на протяжку, то шаговик проще стабилизировать мне кажется на небольших оборотах.
alfamosk » 25 авг 2015, 17:33
ну, чет не могу представить как это будет работать) в смысле без утолщений

там же нить все таки не в одном сантиметре будет еще жидкой т.е. она ведь может утоньшиться в другом месте а не у сопла?
по мотору да, на намотчик) есть еще моторчик от дрели на 18v если память не изменяет.
а так есть моторы от принтеров, просто было около 5-6 штук на разборке, разобрал их, вытащил все что можно)
не очень пойму какие детальки еще нужны
1) arduino любой. если нано то + 3.3V 5V MB102 для макетки + модуль юсб CP2102
2) TB6560 драйвер. а какой нибудь другой подойдет?
3) макетка с проводами.
4) мотор, в вашем случае нема 17.
Revenger » 25 авг 2015, 18:42
По драйверу не скажу. Мне что посоветовали в начале темы, то я и взял ))
Есть еще м-шилды к ардуине для шаговиков и коллекторных, но это я точно не скажу.
На "нано" вроде есть усб-разъём, там конвертер ТТЛ вроде не нужен. Но тоже уверять не буду, я тут "доцент".
Мотор можно и из принтера шаговый. У меня сейчас дербан Эпсона Р220, там на протяжке бумаги шаговик, только нужно смотреть напряжение. Есть и на 24 (ТВ6560 лучше от 24В работает говорят) и на 48В. Я просто всё от 12В стараюсь запитать, чтобы минимум обвеса и трансформаторов. Потребуется - есть и на 24В транс, но большущий.
alfamosk » 25 авг 2015, 20:49
вот что из моторов есть)
- Вложения
-

Revenger » 26 авг 2015, 02:20
Ну.. как минимум три верхние (правее) вроде шаговые. Смотри напряжение и если что в путь ))
п.с. Что-то по свечению светодиода я не понял на макетке с оптодатчиком... Поставил рядом на пробу светодиод с резистором 300Ом, так он вообще не горит. А почему тогда тот, что с 1кОм светится еле еле? Я думал, что уменьшив сопротивление яркость увеличится ))
RootAdmin » 26 авг 2015, 11:50
Не надо играться с номиналом резистора. Нам светодиод нужен только для того, чтоб определить выводы. Рекомендую резистор на 200 припаять прямо на плату, порезав дорожку. А светодиод - уберем, его резистор увеличим килоом до 4,7 или 10. Сейчас напишу процедурку для обработки оптодатчика.
Добавлено спустя 10 минут:
Ну и резистор фотодиода можно тоже на платку. Сейчас определю номинал.
Revenger » 26 авг 2015, 14:39
Может спросить в магазине что-то подобное смд резистору (чтобы на плату влепить)? Правда я такие и паять не пробовал то.. Хотя спрошу, может их и нет у нас в продаже. Деревня блин..
Добавлено спустя 1 час 36 минут 2 секунды:
купил смд 200Ом и 4,7кОм... это ппц какие они маленькие. Попробую чтонить запаять ))
RootAdmin » 26 авг 2015, 15:26
Да смысла нет. Нам место экономить не надо, разве что эстетичней.
Так, тестовая версия с экраном и кнопками экрана:
- Код: Выделить всё • Развернуть
/*
Управление шаговиком (драйвер степ-дир) переменным резистором
теперь с кнопками! :)
А на этот раз - с экраном и резистивными кнопками.
v 0.3 */
/*
Вывод Назначение
0 UART
1 UART
2
3
4
5 Dir_pin
6 Step_pin
7 LCD RS
8 LCD RW
9 LCD E
10 LCD DB4
11 LCD DB5
12 LCD DB6
13 LCD DB7
A0 Резистор
A1
A2
A3
A4
A5
A6
A7 Кнопки
*/
#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
#define lcd_RS_pin 7
#define lcd_RW_pin 8
#define lcd_E_pin 9
#define lcd_DB4_pin 10
#define lcd_DB5_pin 11
#define lcd_DB6_pin 12
#define lcd_DB7_pin 13
// RS, RW, E, DB4, DB5, DB6, DB7
LiquidCrystal lcd(lcd_RS_pin, lcd_RW_pin, lcd_E_pin, lcd_DB4_pin, lcd_DB5_pin, lcd_DB6_pin, lcd_DB7_pin);
#define Step_pin 6 //вывод Arduino для ноги STEP контроллера
#define Dir_pin 5 //вывод Arduino для ноги DIR контроллера
#define Resistor_pin A0 //вывод Arduino резистора 0-5вольт
//********** Кнопки:
#define btnRIGHT 1 //Определяем кнопки
#define btnUP 2
#define btnDOWN 3
#define btnLEFT 4
#define btnSELECT 5
#define btnNONE 0
#define btnDEFtime 30 //Значение для антидребезга - клавиша удерживаемая столько времени в миллисекундах считается нажатой.
#define btnPAUSEtime 400 //Значение в миллисекундах паузы между повторами
int lcd_key = btnNONE; //Для хранения полученного значеник кнопки
byte keyTemp = btnNONE; //Переменная для хранения временного состояния кнопок
byte keyCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
unsigned long BtnTime; //Хранит время начала нажатия кнопок
byte btnCONTpress; //Переменная взводится после первого срабатывания клавиши и определяет автоповтор
byte btnTemp=btnNONE; //Для хранения номера ранее нажатой кнопки
#define ButtonPin A7 //Сюда подключены кнопки
//************
byte ControlMode = 0; //Переменная определяет режим управления. 0 - резистор. 1 - кнопки.
//Переменная для значения таймера
volatile unsigned char timerLoadValue;
//Переменная для количества холостых циклов таймера
volatile unsigned char FullTimer;
volatile unsigned char FullTimerCount; //внутренный счетчик таймера
//значение минимальной частоты
#define LowFreq 2
//значение МАКСИмальной частоты
#define HighFreq 100
//Переменная для шага чаcтоты на едниницу изменения АЦП
float FreqStep;
int OutFreq = LowFreq; //Переменная для хранения установленной частоты
//Переменная для текущего значения резистора
int sensorValue = 0;
//Переменная для Старого значения резистора
int OLDsensorValue = 0;
void setup() {
// Конфигурим вывод Step_pin как выход
pinMode(Step_pin,OUTPUT);
// Конфигурим вывод Dir_pin как выход
pinMode(Dir_pin,OUTPUT);
// Конфигурим вывод Dir_pin как вход
pinMode(Resistor_pin,INPUT);
lcd.begin(16,2); //Инициализируем экран
//Установим на выходах 0
digitalWrite(Step_pin, LOW);
digitalWrite(Dir_pin, LOW);
// Посчитаем "шаг" изменения частоты на единицу изменения резистора
FreqStep=(float)(HighFreq-LowFreq)/1024;
//Запускает последовательный порт
Serial.begin(9600);
//Сообщение о запуске программы
Serial.println("Program started");
Serial.print("FreqStep=");
Serial.println(FreqStep);
//Запускает таймер и получает загружаемое значение таймера.
//Параметр - желаемая частота в герцах.
timerLoadValue=SetupTimer2(50);
//Установки Таймер2: Делитель частоты /8, режим 0
//Частота = 16MHz/256 = 62500 герц или
//Делитель /256 дает нам хороший рабочий диапазон
//так что сейчас мы просто жестко запрограммируем это.
TCCR2A = 0;
//TCCR2B = 1<<CS22 | 0<<CS21 | 0<<CS20; //это на 256
TCCR2B = 4;
//Подключение прерывания по переполнению Timer2
TIMSK2 = 1<<TOIE2;
//Выводит загружаемое значение таймера
Serial.print("Timer2 Load:");
Serial.println(timerLoadValue,HEX);
lcd.setCursor(0, 0); //устанавливаем курсор
lcd.print("Stepper control"); //выводим на него строку
lcd.setCursor(0, 1); //устанавливаем курсор
lcd.print("R B "); //выводим на него строку
lcd.setCursor(0, 1); //устанавливаем курсор
lcd.cursor(); //Включим курсор
lcd.blink(); //Пусть мигает
delay(100);
}
void loop() {
lcd_key=read_LCD_buttons(); //прочитаем нажатую кнопку
if (lcd_key) //Нажата какая-то кнопка
{
Serial.print("Button=");
Serial.println(lcd_key,DEC);
if (btnRIGHT==lcd_key) //нажата кнопка ВПРАВО
{
lcd.setCursor(4, 1);
ControlMode = 1;
}
if (btnLEFT==lcd_key) //нажата кнопка ВЛЕВО
{
lcd.setCursor(0, 1);
ControlMode = 0;
}
}
if (ControlMode) //Если режим "кнопки"
{
if (btnUP==lcd_key) //Если нажата кнопка "Больше"
{OutFreq+=1;}
if (btnDOWN==lcd_key) //Если нажата кнопка "Меньше"
{OutFreq-=1;}
if (lcd_key) //Если вообще что-то нажато
{
lcd.setCursor(5, 1);
lcd.print(" "); //чистим вывод
lcd.setCursor(5, 1);
lcd.print(OutFreq); //выводим Частоту
lcd.setCursor(4, 1);
SetupTimer2(OutFreq);
}
}
else //Если режим резистор (светодиод выключен)
{
//Тут будем читать занчение
sensorValue=analogRead(Resistor_pin);
//Сравним значение со старым, если отличается - пересчитаем установку таймера
if (sensorValue!= OLDsensorValue)
{ //Serial.println("ReCall"); //debug
OLDsensorValue=sensorValue;
OutFreq = LowFreq+FreqStep*sensorValue; //Вычислим новое значение частоты
lcd.setCursor(1, 1);
lcd.print(" "); //Чистим вывод
lcd.setCursor(1, 1);
lcd.print(OutFreq); //выводим Частоту
lcd.setCursor(0, 1);
SetupTimer2(OutFreq);
}
}
/*
Serial.print("sensor=");
Serial.println(sensorValue,DEC);
Serial.print("FullTimerCount");
Serial.println(FullTimerCount);
Serial.print("FullTimer");
Serial.println(FullTimer,DEC);
Serial.print("timer=");
Serial.println(timerLoadValue,DEC);
Serial.print("ButtPressed=");
Serial.println(ButtPressed,DEC);
Serial.print("OutFreq=");
Serial.println(OutFreq,DEC);
Serial.println("***");
Serial.println("");
*/
delay (1);
}
//Timer2 указатель вектора прерывания по переполнению
//Собственно говоря частота будет в два раза ниже.
ISR(TIMER2_OVF_vect)
{
if (FullTimerCount>1)
{FullTimerCount--;}
else
{if (FullTimerCount==1) //предпоследний цикл
{
TCNT2+=timerLoadValue;
FullTimerCount=0;
}
{if (FullTimerCount==0) // Срабатывание
{
FullTimerCount=FullTimer;
//Переключение IO-вывода в другое состояние.
digitalWrite(Step_pin,!digitalRead(Step_pin));
//Перезагрузка таймера и коррекция по задержке
if (FullTimer)
{TCNT2=1;} //Если холостые циклы есть - максимальное значение
else
{TCNT2+=timerLoadValue;}
}
}
}
}
#define TIMER_CLOCK_FREQ 62500.0
//15625 for /1024
//2MHz for /8 prescale from 16MHz
//Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency){
//Подсчет начального значения таймера
//Слегка усложним, добавив холостые просчеты
int ticks = TIMER_CLOCK_FREQ/timeoutFrequency;
FullTimer=ticks/256; //Вычисляем количество ПОЛНЫХ циклов таймера
timerLoadValue=(int)(257.0-(ticks-(256*FullTimer)+0.5)); //Вычисляем количество доплнительных тиков таймера
//257 на самом деле должно быть 256, но я получил лучшие результаты с 257.
//загружает таймер для первого цикла
if (FullTimer)
{TCNT2=1;} //Если холостые циклы есть - максимальное значение
else
{TCNT2=timerLoadValue;}
}
// *****************************
//Чтение кнопок с антидребезгом
// read the buttons
int read_LCD_buttons()
{
int adc_key_in = analogRead(ButtonPin); // Получаем напряжение с АЦП
byte btnTempTemp = btnNONE; //Переменная для хранения свежесчитанного внутри функции
//digitalWrite (LED_pin,0); //debug
//lcd.setCursor(5, 0); //debug
//lcd.print(adc_key_in); //debug
//delay (400); //debug
//Тут используем millis() для отслеживания нажатия кнопки
// Запоминиаем в переменной BtnTime ВРЕМЯ НАЧАЛА нажатия
// Запоминаем в переменной btnTemp нажатия
// Дефиним время антидребезга #define
if (adc_key_in > 950) //Ничего не нажато
{
//BtnTime=0; //Скидываем время нажатия
btnCONTpress=0;
return btnNONE; // We make ths the 1st option for speed reasons since it will be the most likely result
}
else //что-то нажато
{
if (adc_key_in < 790) { btnTempTemp=btnSELECT; } //Определяем в переменную ТЕКУЩУЮ нажатую кнопку.
if (adc_key_in < 555) { btnTempTemp=btnLEFT; }
if (adc_key_in < 380) { btnTempTemp=btnDOWN; }
if (adc_key_in < 195) { btnTempTemp=btnUP; }
if (adc_key_in < 50) { btnTempTemp=btnRIGHT; }
//А тут проверим, совпадает ли с btnTemp (была ли нажата ранее)
/* lcd.setCursor(0, 0); //debug
lcd.print(btnTempTemp); //debug
lcd.setCursor(2, 0); //debug
lcd.print(btnTemp); //debug
lcd.setCursor(1, 1); //debug
lcd.print(millis()); //debug
lcd.setCursor(12, 1); //debug
digitalWrite (LED_pin,1); //debug
delay (100);
lcd.print(" "); //debug
lcd.setCursor(12, 1); //debug
lcd.print(adc_key_in); //debug
*/
if (btnTempTemp==btnTemp) //Кнопка уже БЫЛА нажата
{
if (btnCONTpress) //Повторные установки клавиши
{
if ((millis()-BtnTime) > btnPAUSEtime)
{
BtnTime=millis(); // Ставим стартово время для автоповтора
return btnTemp;
}
}
else //Первая установка клавиши
{
if ((millis()-BtnTime) > btnDEFtime)
{
btnCONTpress=1;
BtnTime=millis(); // Ставим стартово время для автоповтора
return btnTemp;
}
}
}
else //Раньше было другое состояние
{
// digitalWrite (LED_pin,1); //debug
// delay (100);
btnCONTpress=0;
BtnTime=millis(); //Устанавливаем ТЕКУЩЕЕ время в переменную BtnTime
btnTemp=btnTempTemp; //устанавливаем кнопку во временную переменную.
}
}
return btnNONE; // Если ничего не сработало, то ничего не возвращаем
}
//***********************************
Все должно быть интуитивно понятно.

Влево-вправо для выбора режима
вверх-вниз - для изменения. Резистор пока оставил.
Энкодер готов?
PS Исправил код чуть-чуть для эстетики.
Добавлено спустя 12 минут 44 секунды:Да не надо SMD.
Так, теперь важный вопрос - скоростью экструдера будем управлять/стабилизировать или только контролировать и подстраивать под нее протяжку?
Добавлено спустя 7 минут 7 секунд:Блин, я в код забыл обработку оптодатчика дописать. Если успею - то сегодня сделаю.
Добавлено спустя 1 минуту 50 секунд:Главное на этом этапе правильно подключить экран.

Revenger » 26 авг 2015, 15:32
Экран и всё остальное попробую чуть позже, вытащил ардуинку из корпуса, собираю на макетке. Оптодатчик с резистором 200Ом готов (получилось СМД влепить

). 4,7 пока не впаивал, т.к. не определённость пока в номинале.
Контроль как мне видится в определении оборотов экструдера и подгонки под это скорость протяжки. Как минимум. Если еще через какое-то меню можно будет управлять скоростью - только плюс! Просто я думаю, что задав переменником на шимконтроллере скорость его вращения, подогнав под это скорость протяжки, ардуино остаётся только "зависнуть" в паре и поддерживать синхронно скорость. Увеличивать обороты экструдера программно разве получится?
Это как я вижу. Что выйдет в реальности пока не могу даже представить. )
RootAdmin » 26 авг 2015, 16:56
Получится-получится. Мы можем с помощью всего пары транзисторов (дохлая материнка есть? Ну или купить за 100 рублей) организовать тот же шим-контроллер. С программным управлением скоростью.
Так, у нас немного разные оптосенсоры, мультиметр есть? типа

- мультиметр 838
Надо попробовать впаять 4.7 КОм (светодиод убираем) и померить напряжение между землей и точкой соединения фотодиода с резистором.
При закрытом датчике должно быть больше 4 вольт, при открытом - меньше 2.
Revenger » 26 авг 2015, 17:13
Транзисторы есть ИРФ (брал для флокатора мощные) и есть материнки и БП.
Есть точно такой мультиметр.
Чичас впаяю и проверю.
Добавлено спустя 12 минут 53 секунды:У меня получается 3,2 и 2,2 соответственно.
Добавил на макетке ещё 4,7 и напряжение поднялось на 1В и так и так, т.е. 4,8 и 3,8В.
Последний раз редактировалось
Revenger 26 авг 2015, 18:15, всего редактировалось 1 раз.
RootAdmin » 26 авг 2015, 18:13
Значит надо попробовать килоом 15.
Revenger » 26 авг 2015, 18:15
ща 5 сек. 4,7 уже добавлял... выше написал.
Получилось с 15кОм (плюс к тем 4,7)
Вышло 4,7 и 0,8 (+-)
RootAdmin » 26 авг 2015, 18:26
Это то что нужно. Слишком большой резистор - чувствительность к помехам, а так в самый раз.
Завтра постараюсь выкроить время и написать измерение скорости. В чем выводить предпочтительней? Обороты в секунду, в минуту? Время оборота?
Revenger » 26 авг 2015, 18:36
Да я не знаю.. наверное в минуту. Экструдер то крутится не очень быстро вроде.
п.с. а резистор получается можно 20кОм или все же нужно 19,7? Хочу перепаять смд. Уж очень симпатиШно смотрится прямо на платке. Хотя может просто когда ардуину собирать в общий узел, там этот 15кОм воткнуть да и не забивать голову...