помогите разобраться пожалуйста .(считать и сэмулировать испульсы)
- Войдите на сайт для отправки комментариев
Пнд, 03/06/2013 - 00:39
Есть фото датчик на голове принтера. на нём в спокойном состоянии 3 вольта . когда он видит лист бумаги напряжение опускается до 0 вольт . Голова делает определённую последовательность движений исследуя ширину листа. Как считать их и скормить Arduino чтобы она воиспроизводила их по нажатию кнопки ?. Готов за помощь сказать спасибо материально. Правда хочется разобраться . Занимаюсь ремонтом Электроники в програмировании полный ноль.
есть ли там вообще импульсы... м/б там просто 0 или 1 - есть лист, нет листа...
Да ,там и есть только 0 и 1 . Там по умолчанию постоянно висит 1. Я смотрел осцилом , думал посчитать время самому. Но очень геморно. Попробывал считать в serial. Читается но вот тут я затупил. Мне как то нужно вычислить длину. Можно же просто постоянно слать единицу и в нужный момент нули. Там есть алгоритм голова проходит по краю листа , двигает его вперед назад. Поэтому думал записать всё в serial порт и потом скормить arduino.
Вероятно "мозги" принтера находят один край листа по перепаду уровней от датчика. Затем шаговый двигатель перемещает головку до обнаружения следующего перепада уровней. Количество шагов двигателя и даёт искомый размер бумаги.
Встречаются принтеры, где применяется прозрачная лента натянутая вдоль оси по которой перемещается головка.На ленте нанесены штрихи, а на каретке головки есть фотодатчики. Возможно с них можно снять информацию.
пишу алгоритм . пошла печать . замкнулся концевик листа подачи. мотор докрутил лист до глаза , глаз поймал его появилось 0 на глазу . дальше голова идет в право проверяя ширину листа доходит до угла поймала 1 опять идет в начало . отодвигает лист назад ловит 1 пододвигает обратно 0 и пошел печатать. К моторам даже и привязоваться не хочется . Я просто хочу скормить мозгам последовательность 0 и 1 с помощью ардуино.
Alexjustas, зачем ардуина принтеру? Принтер неисправен? Опишите большую задачу.
Делаю сувенирный , планшетный принтер для печати на любых материалах. хоть на текстиле , хоть на пластике . пока датчик не поймает лист печатать не будет. вот нужно его обмануть.
Я просто хочу скормить мозгам последовательность 0 и 1 с помощью ардуино.
digitalWrite
delay
А вообще - не очень понятно что именно вызывает у вас проблему (если предположить, что вы разобрались с базовыми ардуино примерами, типа "мигаем диодом", "читаем кнопки" и т.п.)
#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]); } } }Спасибо , осталось считать последовательность .
Ну, у вас же вроде осцилограф был. Можно им считать.
Можно, все-таки, пойти в раздел програмирования Программирование и попытатся там найти что-то подходящие
Например pulseIn или millis
C digitalRead вы уже знакомы.
Ну и, что-бы выводить, ознакомится с Serial
#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; // запомнили новое состояние, теперь оно стало "прошлым" } }Сегодня обязательно попробую . Я написал скетч с serial и Millis. Но не успел протестировать. Подсказали на roboforum. Если всё получится буду должен. Очень Вам благодарен за помощь.
01#define BTN 2 // кнопка подключена от пина к земле02#define OUT 3 // выдывать имульсы будем на D303#define LED 13 // встроенный светодиод, будем использовать его для индикации ошибки0405unsignedlongpulses[]={100,200,300};// длина импульсов в миллисекундах06unsignedlongpauses[]={500,600,700};// паузы между импульсами070809// вычисляем сколько у нас импульсов, и сколько пауз10#define TOTAL_PULSES (sizeof(pulses)/sizeof(unsigned long))11#define TOTAL_PAUSES (sizeof(pauses)/sizeof(unsigned long))12131415voidsetup(){1617digitalWrite(2,HIGH);// включаем внутренюю подтяжку на кнопке1819// настраивыаем выходы20pinMode(LED,OUTPUT);21pinMode(OUT,OUTPUT);2223digitalWrite(OUT,HIGH);// по умолчанию на выходе 1-ница2425// проверяем что количество пульсов и пауз у нас совпадает26if(TOTAL_PULSES!=TOTAL_PAUSES){// если нет, то27digitalWrite(LED,HIGH);// зажигаем ошибку28while(true){};// останавливаем скетч29}303132}3334voidloop(){35if(!digitalRead(BTN)){// если кнопка нажата36for(bytei=0;i<TOTAL_PULSES;i++){// выдаем TOTAL_PULSES импульсов3738// ипмульс39digitalWrite(OUTPUT,LOW);40delay(pulses[i]);4142// пауза43digitalWrite(OUTPUT,HIGH);44delay(pauses[i]);454647}48}49}импульсы не идут (
[/quote]
импульсы не идут (
1. А где вы их ждете? Почему вы решили что "не идут"? Опишите как вы это проверяли.
2. Выкинте из моего примера "
if(!digitalRead(BTN)){// если кнопка нажата" ,что-бы было как в вашем примере, без кнопки. Может у вас с кнопкой проблема? если после этого "пойдут", то тогда уже с кнопкой разбиратся.И прикрепленную тему прочитайте Вставка программного кода в тему/комментарий
Нашел очепятку (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]); } } }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.
наверное придется собирать лог анализатор на atmega.Ну так скетч #11 это же и есть самый тупой вариант "логического анализатора" :)
Можно сделать что-то типа такого, обернуть все что loop() в такое:
loop(){ if(millis()-lastChangeTime>500){ // код из оригинального скетча } }Тогда, после смены состоянию, на 500 милисекунд, скетч перестанет слушать импульсы. Станет глухим. Соотвествено все импульсы короче полуcекунды - уйдут в трубу.
Или еще проще.
Добавте, delay() внутрь if-
changeTime=tm;// запомнили когда у нас произошла смена состояний prevState=state; // запомнили новое состояние, теперь оно стало "прошлым" delay(500); }Выйдет тот же эффект - 500 милесекунд на все забить болт :)
Спасибо , попробую !
Самый простой вариант - отключить датчки. В каретке возле ПГ откручиваем маленький винтик, достаем из датчика шлейф , радуемся.
Ну и вобще это обсосано на printmod.ru
К сожалению , не всё так просто . R230 так никогда так не заработает . Printmod читаю постоянно . Буквально вчера, всё победил. Зато теперь могу переделать практически любой принтер. И спасибо этому Форуму за помощь . особенно leshak.( скиньте мне вашу почту пожалуйста, я обещал Вам благодарность за помощь)
Энкодер ПГ желательно слушать через прерывание, как и основной. Плюс через делитель слушать движок каретки. Когда на двигатель идет сигнал, а на энкодер нет - это ноль (именно так принтер его и определяет, упираясь в капу)
Дальше все просто - отслеживаем по сигналам положение и, когда надо - эмулируем бумагу.