Работа с оптопарой.
- Войдите на сайт для отправки комментариев
Разобрал струйный принтер, в нем перемещением каретки управляет оптопара, которая стоит на каретке и перемецается вдоль прозрачной ленты, на которую нанесены непрозрачные вертикальные полоски, решил я эту оптопару подключить к ардуино и поуправлять перемещением каретки. Т.к. напряжение на этой оптопаре крошечное, решил использовать analogRead и уже потом сравнивать значения и считать эти вертикальные черточки, но столкнулся с проблемой. Если быстро переместить каретку, то скетч насчитывает всего ~100 импульсов на оптопаре, а если перемещать медленно, то при прохождении такого же пути кареткой насчитывается ~1000 импульсов. В чем проблема, analogRead слишком медленно работает? Он не успевает снять значение входного напряжения несколько тысяч раз за секунду?
Решил проблему, поднял скорость serial порта до 250000 и стало норм.
И какое значение последовательный порт имеет к перемещению каретки?
Или Вы пытались выводить данные в порт прямо во время измерений?
Чтение аналогового сигнала по моим оценкам примернео 110 мкс. Т.е. 9 раз за мс прочитать можно.
И какое значение последовательный порт имеет к перемещению каретки?
ну не успевал он протолкнуть на скорости 9600 всю и инфу :)
А читать глазами успеваем?
А читать глазами успеваем?
ток если пальцем по строякам водить. но потом экран мыть приходиться.
А мыть руки не пробовали?
на прерываниях наверно еще больше бы поймал
Фууу... Троли противныыыеее...
Или Вы пытались выводить данные в порт прямо во время измерений?
Да, что не правильно. Сейчас сделал иначе.
А вывод занимает много времени, analogRead выполняется с промежутками на выводы и во время вывода в потр не обраьатывает сигнал с оптопары. Вот каретки и уезжает дальше чем надо.
Вот видео как это все работает https://yadi.sk/i/Wft74dvBhfz7c , но в данном виде оно не пригодно для лазерной резки т.к. моторчик слишком резко включается и по энерции проскакивает больше, чем 100 шагов, которые заданы на кнопку 2. Надо более тихиходный мотор ставить.
Ищите раму от старых принтеров.
Там стоят обычные шаговики.
И вообше если вы желаете резать точно- часто на моторе стоит прозрачный диск с рисками
или на раме натянута прозрачная лента с рисками.
Это возможность для вас читать импульсы движения мотора (подвижной части.)
Но управлять по этому "энкодеру" не так просто получится. Как бы ПИД не потребовался...
А на оптопаре напряжение не крошечное. С неё можно снять напряжение почти равное пробивному напряжению транзистора. Подвесив нужный резистор.
И считать сигнал импульсной оптопары аналоговым - это извращение
Ищите раму от старых принтеров.
Там стоят обычные шаговики.
Это насколько старые принтеры? Матричные?
Кстати да, надо попробовать шим управление двигателем.
Матричные- там 100 % шаговики.
Да и струйники первые тоже шагали.
Сканеры вроде все на слабеньком шаговике.
А какую НЕМУ найти и к вашей шестерне пристоить нельзя?
А если ваш.....
Не знаю как плавно стронуть с места под нагрузкой и не дать ему разогнаться ....
На выход оптрона 10 кОм повесили к питанию?
DigitalRead пробовали?
Можно как-нибудь организовать шим управление DC двигателем без delay?
У меня если вставить delay в цикл loop, начинаются пропуски меток оптопарой и каретка проходит путь в несколько раз больше.
Жирным в коде выделил "ШИМ", просто analogWrite, это же не шим, как говорят во многих видео, это установка определенного напряжения на выводе всего лишь.
/*
AnalogReadSerial
Reads an analog input on pin 0, prints the result to the serial monitor
This example code is in the public domain.
*/
#define FASTADC 1
// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
#include <Wire.h>
#include <HMC5883L.h> // для компаса
#include <IRremote.h>
int Data;
int i;
int n;
int lasti;
int a;
int b;
int c;
int RECEIVE_PIN = 2;
IRrecv irrecv(RECEIVE_PIN);
decode_results results;
void setup() {
#if FASTADC
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
Wire.begin();
Serial.begin(250000);
irrecv.enableIRIn(); // Start the receiver
Serial.println(11111, DEC);
pinMode(14, OUTPUT);
a=0;
}
void loop() {
Data = analogRead(4);
if(Data<280)
i=0;
if(Data>295)
i=1;
if(lasti!=i) {
n=n+1;
lasti=i;
if (n>=a) {
analogWrite(14, 0);
Serial.println(n, DEC);
}
else {
analogWrite(14, 150);
delay(1);
analogWrite(14, 0);
delay(1);
analogWrite(14, 150);
}
}
//delay(100);
if (irrecv.decode(&results)) {
Serial.println(results.value);
if (results.value==553536955) {
Serial.println(n, DEC);
n=0;
irrecv.resume();// Receive the next value
analogWrite(14, 150);
}
if (results.value==2534850111) {
Serial.println(n, DEC);
n=0;
a=10;
irrecv.resume();// Receive the next value
analogWrite(14, 150);
}
if (results.value==1033561079) {
Serial.println(n, DEC);
n=0;
a=100;
irrecv.resume();// Receive the next value
analogWrite(14, 150);
}
if (results.value==1635910171) {
Serial.println(n, DEC);
n=0;
a=1000;
Serial.println(a, DEC);
irrecv.resume();// Receive the next value
analogWrite(14, 150);
}
else {
irrecv.resume();// Receive the next value
}
}
}
И да, analogRead для оптопар не правильно, согласен, но в принтере hp стоят какие-то странные оптопары, если она открыта, то analogRead возвращает всего лишь 300, а если закрыта, то 260. Как такую крошечную разницу привести к логическим 0 и 1? Схема будет сложная очень.
смотря как питать оптопару
да и компараторы никто не отменял
Ну это все равно не решит мою проблему, ну будет digitalRead вместо analogRead, все равно будет пропкускать метки при движении мотора во время delay
А, разобрался, надо делать analogWrite на ЦИФРОВОЙ выход, тогда он работает как шим. Только вот мой транзистор этого не оценил и сгорел.
Жирным в коде выделил "ШИМ", просто analogWrite, это же не шим, как говорят во многих видео, это установка определенного напряжения на выводе всего лишь.
Ой.....
Сейчас работает отлично, только мощному полевеку из матплаты очень неприятно.
Жирным в коде выделил "ШИМ", просто analogWrite, это же не шим, как говорят во многих видео, это установка определенного напряжения на выводе всего лишь.
Не знаю, кто и где такое говорит, но analogWrite это и есть ШИМ. Вот, хоть справку почитайте - AnalogWrite. А циферками от 0 до 255 меняется скважность от 0% до 100%. К тому же, хардварный ШИМ можно вывести не на все ппины, а только на определенные (например для UNO, Nano и др. - 3, 5, 6, 9, 10, и 11).
Для установки "определенного напряжения на выводе" без ШИМ нужен ЦАП, а его нет.
Сейчас работает отлично, только мощному полевеку из матплаты очень неприятно.
Как полевик подключали? Что за полевик, открывается логическим уровнем?
K3639, логическим, да.
Если из-за медленного переключения греется ( ёмкость затвора 2400 пФ) попрбуйте что-то простое типа:
http://www.eetimes.com/author.asp?doc_id=1279277