помогите разобраться пожалуйста .(считать и сэмулировать испульсы)

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Есть фото датчик на голове принтера. на нём в спокойном состоянии 3 вольта . когда он видит лист бумаги  напряжение опускается до 0 вольт . Голова делает определённую последовательность движений исследуя ширину листа. Как считать их и скормить Arduino чтобы она воиспроизводила их по нажатию кнопки  ?. Готов за помощь сказать спасибо материально. Правда хочется разобраться . Занимаюсь  ремонтом Электроники в програмировании полный ноль.

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

есть ли там вообще импульсы... м/б там просто 0 или 1 - есть лист, нет листа...

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Да ,там и есть только 0 и 1 . Там по умолчанию постоянно висит 1. Я смотрел осцилом , думал посчитать время самому. Но очень  геморно. Попробывал считать в serial. Читается но вот тут я затупил. Мне как то нужно вычислить длину. Можно же просто постоянно слать единицу и в нужный момент нули. Там есть алгоритм голова проходит по краю листа , двигает его вперед назад. Поэтому думал записать всё в serial порт и потом скормить arduino.

gena
Offline
Зарегистрирован: 04.11.2012

  Вероятно "мозги" принтера находят один край листа по перепаду уровней от датчика. Затем шаговый двигатель перемещает головку до обнаружения следующего перепада уровней. Количество шагов двигателя и даёт искомый размер бумаги.  

Встречаются принтеры, где применяется прозрачная лента натянутая вдоль оси по которой перемещается головка.На ленте нанесены штрихи, а на каретке головки есть фотодатчики. Возможно с них можно снять информацию.

Alexjustas
Offline
Зарегистрирован: 29.05.2013

пишу алгоритм . пошла печать . замкнулся концевик листа подачи. мотор докрутил лист  до глаза , глаз поймал его появилось 0 на глазу . дальше голова идет в право проверяя ширину листа доходит до угла поймала 1 опять идет в начало . отодвигает лист назад ловит 1 пододвигает обратно 0 и пошел печатать. К моторам даже и привязоваться не хочется . Я просто хочу скормить мозгам последовательность 0  и 1 с помощью ардуино. 

toc
Offline
Зарегистрирован: 09.02.2013

Alexjustas, зачем ардуина принтеру? Принтер неисправен? Опишите большую задачу.

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Делаю сувенирный , планшетный принтер  для печати на любых материалах. хоть на текстиле , хоть на пластике  .  пока датчик не поймает лист  печатать не будет. вот нужно его обмануть.

leshak
Offline
Зарегистрирован: 29.09.2011

Alexjustas пишет:

 Я просто хочу скормить мозгам последовательность 0  и 1 с помощью ардуино. 

digitalWrite

delay

А вообще - не очень понятно что именно вызывает у вас проблему (если предположить, что вы разобрались с базовыми ардуино примерами, типа "мигаем диодом", "читаем кнопки" и т.п.)

 

leshak
Offline
Зарегистрирован: 29.09.2011
#define BTN 2 // кнопка подключена от пина к земле
#define OUT 3 // выдывать имульсы будем на D3 
#define LED 13 // встроенный светодиод, будем использовать его для индикации ошибки

unsigned long pulses[]={100,200,300};  // длина импульсов в миллисекундах
unsigned long pauses[]={500,600,700}; // паузы между импульсами


// вычисляем сколько у нас импульсов, и сколько пауз
#define TOTAL_PULSES (sizeof(pulses)/sizeof(unsigned long))
#define TOTAL_PAUSES (sizeof(pauses)/sizeof(unsigned long))



void setup(){
  
  digitalWrite(2,HIGH); // включаем внутренюю подтяжку на кнопке

  // настраивыаем выходы  
  pinMode(LED,OUTPUT);
  pinMode(OUT,OUTPUT); 
  
  digitalWrite(OUT,HIGH); // по умолчанию на выходе 1-ница
  
  // проверяем что количество пульсов и пауз у нас совпадает
  if(TOTAL_PULSES!=TOTAL_PAUSES){ // если нет, то
    digitalWrite(LED,HIGH); // зажигаем ошибку
    while(true){}; // останавливаем скетч
  }
  

}

void loop(){
  if(!digitalRead(BTN)){ // если кнопка нажата
    for(byte i=0;i<TOTAL_PULSES;i++){ // выдаем TOTAL_PULSES импульсов
      
      // ипмульс
      digitalWrite(OUTPUT,LOW); 
      delay(pulses[i]);
      
      // пауза
      digitalWrite(OUTPUT,HIGH); 
      delay(pauses[i]);      
      
      
    }
  }
}

 

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Спасибо , осталось считать последовательность .

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, у вас же вроде осцилограф был. Можно им считать.

Можно, все-таки, пойти в раздел програмирования Программирование и попытатся там найти что-то подходящие

Например pulseIn или millis

digitalRead вы уже знакомы.

Ну и, что-бы выводить, ознакомится с Serial

 

leshak
Offline
Зарегистрирован: 29.09.2011
#define DATA 2 // вход, который будем читать

bool prevState; // предыдущие состояние вход
unsigned long changeTime;// кода менялось состояния

void setup(){
  Serial.begin(57600); // в мониторе нужно такую же скорость выставить
  
  // digitalWrite(DATA,HIGH); // если нужно - включаем подтяжку внутренюю
}

void loop(){
  bool state=digitalRead(DATA);
  
  if(state!=prevState){ // состояние изменилось
     unsigned long tm=millis(); // прочитали время
     unsigned long diff=tm-changeTime; // вычисялем сколько времени прошло с прошлой поменки

     // выводим что на что поменялос
     Serial.print(prevState);
     Serial.print("----->");
     Serial.print(state);
     
     // выводим сколько времени продержалось прошлое состояние
     Serial.print("  :");
     Serial.println( diff);
     
     changeTime=tm;// запомнили когда у нас произошла смена состояний
     prevState=state; // запомнили новое состояние, теперь оно стало "прошлым"
     
  }
  
}

 

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Сегодня обязательно попробую . Я написал скетч с serial  и Millis. Но не успел протестировать. Подсказали на roboforum.   Если всё получится буду должен. Очень Вам благодарен за помощь.

Alexjustas
Offline
Зарегистрирован: 29.05.2013
01 #define BTN 2 // кнопка подключена от пина к земле
02 #define OUT 3 // выдывать имульсы будем на D3
03 #define LED 13 // встроенный светодиод, будем использовать его для индикации ошибки
04  
05 unsigned long pulses[]={100,200,300};  // длина импульсов в миллисекундах
06 unsigned long pauses[]={500,600,700}; // паузы между импульсами
07  
08  
09 // вычисляем сколько у нас импульсов, и сколько пауз
10 #define TOTAL_PULSES (sizeof(pulses)/sizeof(unsigned long))
11 #define TOTAL_PAUSES (sizeof(pauses)/sizeof(unsigned long))
12  
13  
14  
15 void setup(){
16   
17   digitalWrite(2,HIGH); // включаем внутренюю подтяжку на кнопке
18  
19   // настраивыаем выходы 
20   pinMode(LED,OUTPUT);
21   pinMode(OUT,OUTPUT);
22   
23   digitalWrite(OUT,HIGH); // по умолчанию на выходе 1-ница
24   
25   // проверяем что количество пульсов и пауз у нас совпадает
26   if(TOTAL_PULSES!=TOTAL_PAUSES){ // если нет, то
27     digitalWrite(LED,HIGH); // зажигаем ошибку
28     while(true){}; // останавливаем скетч
29   }
30   
31  
32 }
33  
34 void loop(){
35   if(!digitalRead(BTN)){ // если кнопка нажата
36     for(byte i=0;i<TOTAL_PULSES;i++){ // выдаем TOTAL_PULSES импульсов
37       
38       // ипмульс
39       digitalWrite(OUTPUT,LOW);
40       delay(pulses[i]);
41       
42       // пауза
43       digitalWrite(OUTPUT,HIGH);
44       delay(pauses[i]);     
45       
46       
47     }
48   }
49 }

импульсы не идут ( 

[/quote]

Alexjustas
Offline
Зарегистрирован: 29.05.2013
int ledPin = 13;                 // светодиод подключен на порт 13
 
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливается режим порта - выход
}
 
void loop()
{
  digitalWrite(ledPin, HIGH);   // включаем светодиод
  delay(150);                  // ожидаем секунду
  digitalWrite(ledPin, LOW);    // выключаем светодиод
  delay(300);                  // ожидаем секунду
digitalWrite(ledPin, HIGH);   // включаем светодиод
  delay(50);                  // ожидаем секунду
  digitalWrite(ledPin, LOW);    // выключаем светодиод
  delay(50);                  // ожидаем секундуdigitalWrite(ledPin, HIGH);   // включаем светодиод
 digitalWrite(ledPin, HIGH);    // выключаем светодиод
  delay(300);                  // ожидаем секундуdigitalWrite(ledPin, HIGH);   // включаем светодиод
  digitalWrite(ledPin, LOW);    // выключаем светодиод
  delay(250);                  // ожидаем секунду
  digitalWrite(ledPin, HIGH);
  delay(300);
  digitalWrite(ledPin, LOW);
  delay(1000);
  digitalWrite(ledPin, HIGH);
  delay(250);
digitalWrite(ledPin, LOW);    // выключаем светодиод
  delay(50);                  // ожидаем секунду
  digitalWrite(ledPin, HIGH);
  delay(50);
  digitalWrite(ledPin, LOW);
  delay(1050);
  digitalWrite(ledPin, HIGH);
  delay(50);
digitalWrite(ledPin, LOW);
  delay(50);
  digitalWrite(ledPin, HIGH);
  delay(200);
digitalWrite(ledPin, LOW);    // выключаем светодиод
  delay(50);                  // ожидаем секунду
  digitalWrite(ledPin, HIGH);
  delay(50);
  digitalWrite(ledPin, LOW);
  delay(1200);
  
 написал пока так . моргает 
leshak
Offline
Зарегистрирован: 29.09.2011

Alexjustas пишет:

 

импульсы не идут ( 

 

1. А где вы их ждете? Почему вы решили что "не идут"? Опишите как вы это проверяли.
2. Выкинте из моего примера " if(!digitalRead(BTN)){ // если кнопка нажата"  , что-бы было как в вашем примере, без кнопки. Может у вас с кнопкой проблема? если после этого "пойдут", то тогда уже с кнопкой разбиратся.

leshak
Offline
Зарегистрирован: 29.09.2011

И прикрепленную тему прочитайте Вставка программного кода в тему/комментарий

leshak
Offline
Зарегистрирован: 29.09.2011

Нашел очепятку (OUTPUT вместо OUT).

Попробуйте вот это:

#define BTN 2 // кнопка подключена от пина к земле
#define OUT 3 // выдывать имульсы будем на D3 
#define LED 13 // встроенный светодиод, будем использовать его для индикации ошибки

unsigned long pulses[]={100,200,300};  // длина импульсов в миллисекундах
unsigned long pauses[]={500,600,700}; // паузы между импульсами


// вычисляем сколько у нас импульсов, и сколько пауз
#define TOTAL_PULSES (sizeof(pulses)/sizeof(unsigned long))
#define TOTAL_PAUSES (sizeof(pauses)/sizeof(unsigned long))



void setup(){
  
  digitalWrite(2,HIGH); // включаем внутренюю подтяжку на кнопке

  // настраивыаем выходы  
  pinMode(LED,OUTPUT);
  pinMode(OUT,OUTPUT); 
  
  digitalWrite(OUT,HIGH); // по умолчанию на выходе 1-ница
  
  // проверяем что количество пульсов и пауз у нас совпадает
  if(TOTAL_PULSES!=TOTAL_PAUSES){ // если нет, то
    digitalWrite(LED,HIGH); // зажигаем ошибку
    while(true){}; // останавливаем скетч
  }
  

}

void loop(){
  if(!digitalRead(BTN)){ // если кнопка нажата
    for(byte i=0;i<TOTAL_PULSES;i++){ // выдаем TOTAL_PULSES импульсов
      
      // ипмульс
      digitalWrite(OUT,LOW); 
      delay(pulses[i]);
      
      // пауза
      digitalWrite(OUT,HIGH); 
      delay(pauses[i]);      
      
      
    }
  }
}


 

Alexjustas
Offline
Зарегистрирован: 29.05.2013

unsigned long pulses[]={300,50,250,1000,50,1050,50,50,1200};  // длина импульсов в миллисекундах
                    
unsigned long pauses[]={50,300,300,250,50,50,200,50,1}; // паузы между импульсами

// вычисляем сколько у нас импульсов, и сколько пауз
#define TOTAL_PULSES (sizeof(pulses)/sizeof(unsigned long))
#define TOTAL_PAUSES (sizeof(pauses)/sizeof(unsigned long))



void setup(){
  
  digitalWrite(2,HIGH); // включаем внутренюю подтяжку на кнопке

  // настраивыаем выходы  
  pinMode(LED,OUTPUT);
  pinMode(OUT,OUTPUT); 
  
  digitalWrite(OUT,HIGH); // по умолчанию на выходе 1-ница
  
  // проверяем что количество пульсов и пауз у нас совпадает
  if(TOTAL_PULSES!=TOTAL_PAUSES){ // если нет, то
    digitalWrite(LED,HIGH); // зажигаем ошибку
    while(true){}; // останавливаем скетч
  }
  

}

void loop(){
  if(!digitalRead(BTN)){ // если кнопка нажата
    for(byte i=0;i<TOTAL_PULSES;i++){ // выдаем TOTAL_PULSES импульсов
      
      // ипмульс
      digitalWrite(OUT,LOW); 
      delay(pulses[i]);
      
      // пауза
      digitalWrite(OUT,HIGH); 
      delay(pauses[i]);      
      
      
    }
  }
}

Большое Вам Человеческое спасибо . Респект Вам и Уважуха.  Импульсы побежали. Я сейчас мучаюсь с проблемой , у датчика много Паразитных иппульсов, а мне нужны только глобальные . Осцилографом смотреть можно но считать очень не удобно . наверное придется  собирать лог анализатор на atmega. 

leshak
Offline
Зарегистрирован: 29.09.2011

Alexjustas пишет:

 наверное придется  собирать лог анализатор на atmega. 

Ну так скетч #11 это же и есть самый тупой вариант "логического анализатора" :)

Можно сделать что-то типа такого, обернуть все что loop() в такое:

 

loop(){

   if(millis()-lastChangeTime>500){
      // код из оригинального скетча
   }
}

Тогда, после смены состоянию, на 500 милисекунд, скетч перестанет слушать импульсы. Станет глухим. Соотвествено все импульсы короче полуcекунды - уйдут в трубу.

Или еще проще.

Добавте, delay() внутрь if-

     changeTime=tm;// запомнили когда у нас произошла смена состояний
     prevState=state; // запомнили новое состояние, теперь оно стало "прошлым"
     delay(500);
}

Выйдет тот же эффект - 500 милесекунд на все забить болт :)

 

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Спасибо , попробую !

Alexjustas
Offline
Зарегистрирован: 29.05.2013

Вот с осцилографа . 

Kislorof
Offline
Зарегистрирован: 30.10.2012

Самый простой вариант - отключить датчки. В каретке возле ПГ откручиваем маленький винтик, достаем из датчика шлейф , радуемся.

Ну и вобще это обсосано на printmod.ru

Alexjustas
Offline
Зарегистрирован: 29.05.2013

К сожалению , не всё так просто . R230 так никогда так не заработает . Printmod читаю постоянно . Буквально вчера, всё победил. Зато теперь могу переделать практически любой принтер. И спасибо этому Форуму за помощь . особенно  leshak.( скиньте мне вашу почту пожалуйста, я обещал Вам благодарность за помощь)

Kislorof
Offline
Зарегистрирован: 30.10.2012

Энкодер ПГ желательно слушать через прерывание, как и основной. Плюс через делитель слушать движок каретки. Когда на двигатель идет сигнал, а на энкодер нет - это ноль (именно так принтер его и определяет, упираясь в капу)
Дальше все просто - отслеживаем по сигналам положение и, когда надо - эмулируем бумагу.