Непонятки с энкодером

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SLOM пишет:

 поймите в данном случае мне не нужна удочка, мне нужна рыбка.

Тогда ВЫам в раздел "Ищу исполнителя".

Цитата:

на то она и ардуина, на то и есть такие форумы где люди делятся готовыми скетчами. чтобы простым обывателям, вроде меня, было проще сделать ту или иную поделку. 

Вы много чем полезным на этом форуме поделились?

Тогда откуда Вам знать, зачем существуют "такие форумы"?

Честное слово, уже достали новички, которые имеют наглость указывать старожилам, зачем нужен форум!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLOM пишет:

мне не нужна удочка, мне нужна рыбка.

Тогда в рыбный магазин.

SLOM пишет:

на то и есть такие форумы где люди делятся готовыми скетчами. 

Удачи в поиске таких людей. Я к ним не отношусь, к сожалению.

 

 

SLOM
Offline
Зарегистрирован: 06.11.2014

andriano

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

Многим полезным я не делился, но когда то, когда вы еще не были зарегистрированы на форуме, я обсуждал здесь другой проект и там делился "СВОИМ" кодом. я не программист поэтому мой код был сборной солянкой множества чужих кодов, но все же возможно кому то он был полезен.  вот ссылка на мой проект на другом форуме http://roboforum.ru/forum10/topic14711.html (это не реклама другого ресурса) 

насчет сторожил и новичков, смотрим дату своей регистрации а потом моей... 

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

ЕвгенийП

повторюсь не ищу исполнителя, не ищу тех кто бесплатно будет тратить на меня время. 

ищу тех кто как и я страдал похожей фигней и добился нужных результатов и готов ими поделиться. для этого собственно такие форумы и нужны. делиться знаниями, а не умничать... вот освой для начала это, а потом то, и может быть с годами тебя постигнит просветление. давайте не уподобатся тебетским монахам :) 

 

vvadim
Offline
Зарегистрирован: 23.05.2012

SLOM пишет:

ищу тех кто как и я страдал похожей фигней и добился нужных результатов и готов ими поделиться. для этого собственно такие форумы и нужны. делиться знаниями, а не умничать... вот освой для начала это, а потом то, и может быть с годами тебя постигнит просветление. давайте не уподобатся тебетским монахам :) 

 

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

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

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

SLOM пишет:
давайте не уподобатся тебетским монахам :) 

А собственно почему?

Тебе пытались помочь "удочкой", но тебе нужна рыба, тебе пожелали удачи, ну и всё, расслабься. Зачем ты пытаешься всем доказать, что они неправы?

Тебе кто-то что-то должен?

SLOM
Offline
Зарегистрирован: 06.11.2014

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

предполагаю что код на самом деле очень прост. по сути есть библиотека опрашивающая энкодер и есть скетч управления мотором. 

а вот как связать пока не знаю. если вы тоже не знаете, зачем пишете? 

если знаете как это сделать но не хотите, зачем злорадствовать? к чему флудить? 

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

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

в каждом по нескольку энкодеров. 

1. ленточный на движении печатающей головки. 

2. радиальный на вращении вала подачи бумаги. 

3. если есть сканер то радиальный на вращении привода сканера. 

4. несколько оптических прерывателей (открытие крышки и тд... 

 

SLOM
Offline
Зарегистрирован: 06.11.2014

найти рабочий пример так и не удалось, чтото не компилит, тото неработает.

но удалось немного разобратся самому. 

убрал все лишнее и оставил минимум. 

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability

Encoder myEnc(2, 3);
//   avoid using pins with LEDs attached


 
// wired connections
#define HG7881_B_IA 5 // D10 --> Motor B Input A --> MOTOR B +
#define HG7881_B_IB 6 // D11 --> Motor B Input B --> MOTOR B -
 
// functional connections
#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed
#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction
 
// the actual values for "fast" and "slow" depend on the motor
#define PWM_SLOW 100  // arbitrary slow speed PWM duty cycle
#define PWM_FAST 200 // arbitrary fast speed PWM duty cycle
#define DIR_DELAY 1000 // brief delay for abrupt motor changes
 
void setup()
{
 
  pinMode( MOTOR_B_DIR, OUTPUT );
  pinMode( MOTOR_B_PWM, OUTPUT );
  digitalWrite( MOTOR_B_DIR, LOW );
  digitalWrite( MOTOR_B_PWM, LOW );
Serial.begin(9600);
  Serial.println("Basic Encoder Test:");

 
}

  long oldPosition  = -999;

 
void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
       
       
      digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
        analogWrite( MOTOR_B_DIR, 255-PWM_FAST ); // PWM speed = fast  

 }
        if (newPosition >= 20000) {
    oldPosition = newPosition;
    Serial.println(newPosition);
       
       
       digitalWrite( MOTOR_B_DIR, LOW );
        digitalWrite( MOTOR_B_PWM, LOW );

        
  }
}

правда работает пока несовсем так как нужно. 

при включении мотор начинает быстро крутить вал с энкодером. числовые значения при этом бегут очень быстро и неточно: 

203Basic Encoder Test:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
36
72
114
177
245
315
388
462
537
616
697
778
859
940
1020
1117
1215
1314
1413

поэтому сделал так if (newPosition >= 20000) {      и когда это значение превышено мотор не останавливается а начинает медлено крутиться. или в другой версии кода останавливался примерно на 1 сек и потом медленно крутился. 

а когда я захотел добавить обратный ход 


      digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast  

 

мотор стал крутить туда сюда, не туда не сюда :) 

я так предпологаю что наверно идет какойто цикл и мотор то крутит вперед то назад. попробую добавить задержки. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Желаете поговорить об этом коде? Или Вам по-прежнему нужна только рыба? Если второе, то я прохожу мимо, если первое, могу поговорить.

kalapanga
Offline
Зарегистрирован: 23.10.2016

SLOM пишет:

при включении мотор начинает быстро крутить вал с энкодером. числовые значения при этом бегут очень быстро и неточно:

А что Вы имеете ввиду говоря "неточно"? По-моему, вполне нормальные значения. Сначала мотор разгоняется, а последние пять из приведённых значений отличаются на сотню достаточно точно - скорость установилась.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Видимо он считает, что у него каждый тик энкодера в монитор выводится

SLOM
Offline
Зарегистрирован: 06.11.2014

в общем сделал такое: 


#include <Encoder.h>

Encoder myEnc(2, 3);

#define HG7881_B_IA 5 // D10 --> Motor B Input A --> MOTOR B +
#define HG7881_B_IB 6 // D11 --> Motor B Input B --> MOTOR B -
 
// functional connections
#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed
#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction
 
#define PWM_SLOW 100  // arbitrary slow speed PWM duty cycle
#define PWM_FAST 200 // arbitrary fast speed PWM duty cycle
#define DIR_DELAY 1000 // brief delay for abrupt motor changes
 
void setup()
{
  pinMode( MOTOR_B_DIR, OUTPUT );
  pinMode( MOTOR_B_PWM, OUTPUT );
  digitalWrite( MOTOR_B_DIR, LOW );
  digitalWrite( MOTOR_B_PWM, LOW );
Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
}
  long oldPosition  = -999;
void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);

        digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
        analogWrite( MOTOR_B_DIR, 255-PWM_FAST ); // PWM speed = fast  
 }
        if (newPosition >= 20000) {
    
        digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast 
     
        delay(1000); // Задержка
        }
     
}

работает так, при включении мотор сразу крутит в одну сторону, по достижению или превышению числа 20 000 с энкодера. резко начинает крутить в другую сторону. по времени задержки ( delay(1000); // Задержка) если задержку неуказать то мотор попадает в мертвую петлю и начинает дергать туда сюда. 

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

в общем я думал сделать такой код: 


#include <Encoder.h>

Encoder myEnc(2, 3);

#define HG7881_B_IA 5 // D10 --> Motor B Input A --> MOTOR B +
#define HG7881_B_IB 6 // D11 --> Motor B Input B --> MOTOR B -
 
// functional connections
#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed
#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction
 
#define PWM_SLOW 100  // arbitrary slow speed PWM duty cycle
#define PWM_FAST 200 // arbitrary fast speed PWM duty cycle
#define DIR_DELAY 1000 // brief delay for abrupt motor changes
 
void setup()
{
 
  pinMode( MOTOR_B_DIR, OUTPUT );
  pinMode( MOTOR_B_PWM, OUTPUT );
  digitalWrite( MOTOR_B_DIR, LOW );
  digitalWrite( MOTOR_B_PWM, LOW );
Serial.begin(9600);
  Serial.println("Basic Encoder Test:");

 
}

  long oldPosition  = -999;

 
void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);


        digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
        analogWrite( MOTOR_B_DIR, 255-PWM_FAST ); // PWM speed = fast  

 }
        if (newPosition >= 20000) {
    

        digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast 
 }
 
        if (newPosition <= 10) {
       digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
        analogWrite( MOTOR_B_DIR, 255-PWM_FAST ); // PWM speed = fast  
  }      
  
}
   

я предполагал такую работу:  включили, крутим мотор до значения >=20 000, потом крутим в обратку до значения <=10 потом снова крутим в обратку и тд.... 

но при включении он крутит в одну сторону а потом достигнув 20000 начинает дрожать как и в первом скетче если убрать задержку. 

что я делаю неправильно? поидее оператор if  должен работать как я задумал? 

SLOM
Offline
Зарегистрирован: 06.11.2014

Kakmyc пишет:
Видимо он считает, что у него каждый тик энкодера в монитор выводится

 

да я думал что в монитор порта должны все значения с точностью до еденицы выводися. 

но потом понял что это зависит от скорости порта. при 9600 успевают выйти значения ерез 100, при скорости выше получалось через 3 еденицы. на 250 000 и на 1000 000бод тоже самое. видимо дальше предел ардуино или вобщем не суть важно. 

 

пока пытаюсь понять как добится движения мотора от старта до 20 000 и обратно до старта и так далее.... 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вот у Вас определены пины. Один для направления вращения, другой для скорости вращения (строки 9, 10). А используете Вы их наоборот (строки 32, 33). Это первый скетч сообщения #61. Приведите как-то в соответствие. И направление у Вас нигде не меняется - везде в скетче direction forward. Вы здесь скетч-то не тот что заливаете в ардуино приводите что ли, а зачем?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLOM пишет:

что я делаю неправильно?

Неправильно Вы делаете, когда считаете, что Вам не нужно ничего изучать, а нужна только рыба.

SLOM пишет:

поидее оператор if  должен работать как я задумал? 

Он тупой и в идеях не сечёт. Он не муеет читать Ваши мысли, а потому работает не так, как Вы задумали, а в точности так, как Вы написали.

А написали Вы вот так (это Ваш первый скетч, только без задержки, читайте мои комментарии):

void loop() {
  long newPosition = myEnc.read();
  //
  // Если позиция хоть как-то поменялась (в любую сторону), то 
  // пох на всё остальное - врубаем всегда в одну и ту же сторону
  //
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
    digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
    analogWrite( MOTOR_B_DIR, 255 - PWM_FAST ); // PWM speed = fast
  }
  //
  // А вот если она при этом >= 20000, то тут же
  // врубаем в другую сторону
  //
  if (newPosition >= 20000) {
    digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
    analogWrite( MOTOR_B_PWM, 255 - PWM_FAST ); // PWM speed = fast
   }
}

Т.е. сначала Вы крутите в одну сторону пока не доберётесь до 20000. А вот когда доберётесь, Вы начинаете: 

1. Включить в одну стророну (строки 9-12)
2. тут же, "ой блин!" - включить в другую сторону (строки 19-20)
3. потом снова вызывается loop и мы переходим к п. №1 и так бесконечно

Понятно? Она у Вас доходит до 20000 и начинает дёргаться на месте туда-сюда потому, что так зпрограммирована.

Вот как-то так.

Про второй скетч надо объяснять? 

 

SLOM
Offline
Зарегистрирован: 06.11.2014

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

тоесть у меня получается так:  включились, начали крутить мотор, дошли до значения 20000 включили реверс и сразу же опять прыгнули на пункт крутить мотор вперед... снова натркнулись на значение 20 000 т.к далеко не ушли и снова.... 

и начинается дерганье 

19956
20058
20169
20214
20197
20124
20027
19921
19815
19764
19772
19836
19925
20030
20143
20190
20174
20103
20007
19903

если ставить задержку то мотор крутит пока она действует. а надо чтоб крутил не пока задержка а пока не выполнится условие: <=10 но оно почемуто игнорируется и сразу включается ход вперед. 

ЕвгенийП

спасибо за пояснения по коду, но эту часть я уже худо бедно понял, собственно сам ее составлял. 

я немогу понять другое. во втором коде:

if (newPosition >= 20000) {
44     
45  
46         digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
47         analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast
48  }
49  
50         if (newPosition <= 10) {
51        digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
52         analogWrite( MOTOR_B_DIR, 255-PWM_FAST ); // PWM speed = fast 
53   }     
54   
55 }

почему после включения реверса ардуина не ждет когда выполнится условие if (newPosition <= 10) {

а сразу врубает вперед... ? 

ведь поидее когда я включил реверс 

if (newPosition >= 20000) {
44     
45  
46         digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
47         analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast

 

48  }

мотор должен крутить назад до тех пор пока не дойдет до условия 

if (newPosition <= 10) {

и тогда начнет крутить вперед, а он сразу вперед, там его ждет значение 20 000, потом назад на пару значений и снова вперед... 

sadman41
Offline
Зарегистрирован: 19.10.2016

строки 39 и 40 пытались перенести в setup()?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SLOM пишет:

эту часть я уже худо бедно понял, собственно сам ее составлял. 

Судя по дальнейшему Вашему тексту, Вы ничего не поняли. Читайте моё описание второго скетча, сравнивайте с первым и постарайтесь, наконец, понять.

SLOM пишет:

я немогу понять другое. во втором коде:

почему после включения реверса ардуина не ждет когда выполнится условие if (newPosition <= 10) { а сразу врубает вперед... ? 

Это не другое - это ровно тоже самое, что и в первом коде. Вы тащите это непонимание того, что делаете с завидным упорством.

SLOM пишет:

ведь поидее

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

Поэтому, сейчас делаем так: выбрасываем все "по идее" нахрен и тупо двигаем пальцем по коду и смотрим что же делается.

Поехали, вот Ваш второй скетч из поста №61

void loop() {
	long newPosition = myEnc.read();
	//
	//	Если что-то поменялос, то врубаем "вперёд"
	//
	if (newPosition != oldPosition) {
		oldPosition = newPosition;
		Serial.println(newPosition);
		digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
		analogWrite( MOTOR_B_DIR, 255 - PWM_FAST ); // PWM speed = fast
	}
	//
	//	Если newPosition >= 20000, то врубаем "назад"
	//
	if (newPosition >= 20000) {
		digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
		analogWrite( MOTOR_B_PWM, 255 - PWM_FAST ); // PWM speed = fast
	}
	//
	//	Если newPosition <= 10, то врубаем "вперёд"
	//
	if (newPosition <= 10) {
		digitalWrite( MOTOR_B_PWM, HIGH ); // direction = forward
		analogWrite( MOTOR_B_DIR, 255 - PWM_FAST ); // PWM speed = fast
	}
}

Ведите пальцем по строкам!!!!

Идём сначала (энкодер на нуле) и чуть-чуть увеличился.

1. В строке 6 проверяем, "что-то поменялось"? Да! Отлично, врубаем "вперёд".
2. В строке 15 проверяем "newPosition >= 20000"? Если пока ещё нет, ничего не делаем
3. В строке 22 проверяем "newPosition <= 10"? Поначалу будет "да" и мы будем включать "вперёд", хотя оно и так уже включено, потом, по мере роста newPosition, станет "нет" и мы ничего не будем делать.
4. далее следует новый вызов loop и всё повторяется

Так будет продолжаться пока не разгонится до 20000 и условие в п.2 не станет истинным. Когда оно станет истинным, продолжение будет таким

1. В строке 6 проверяем, "что-то поменялось"? Да! Отлично, врубаем "вперёд".
2. В строке 15 проверяем "newPosition >= 20000"? ДА! Отлично, врубаем "назад".
3. В строке 22 проверяем "newPosition <= 10"? Нет! Ничего не делаем.
4. далее следует новый вызов loop и всё повторяется

Вы видите, что она у Вас опять начинает "елозить" взад-вперёд, как и в первом скетче?

И вообще, Вы не понимаете очень просто вещи. В строках 6-10 написано (читаем внимательно и стараемся понять!!!): ЕСЛИ ПОЛОЖЕНИЕ ЭНКОДЕРА ИЗМЕНИЛОСЬ (пох насколько и пох в какую сторону!!!), ТО ВРУБАЕМ "ВПЕРЁД".

Вот Вы врубаете это вперёд при каждом вызове функции loop, при ЛЮБОМ изменении - куда бы Ваш мотор не дёрнулся, Вы тут же врубаете "вперёд". А потом (без всякой паузы), если newPosition >= 20000, то врубаете "назад"! Так и мучаете этот мотор. Это если без "идей", а так, как у Вас написано.

Если Вам нужно как-то по-другому, то и пишите по-другому!

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Это походу клиника...

SLOM
Offline
Зарегистрирован: 06.11.2014

sadman41 пишет:

строки 39 и 40 пытались перенести в setup()?

спасибо! реально помогли, заработало как надо! 

крутит вначале вперед до 20 000 и более а потом назад до 10 и менее. по факту в порту скачут такие значения 

0
1
2
3
4
5
.......
19850
19960
20071
20179
20222
20203
20145
20051
19947
19835
19719
19601
19483
........
111
30
-34
-116
-157
-149
-106
-32
39
101
181
....

 

скетч получился вот такой: 

// скетч для управления коллекторным мотором по средствам оптического энкодера. связка мотор-энкодер взяты от неработающего струйного принтера canon. 
// смысл скетча в том, что при включении, мотор крутит вперед до нужного значения, достигнув его мотор крутит в обратную сторону до следующего значения и так в бесконечном цикле.  
#include <Encoder.h> // подключаем библиотеку энкодера.

Encoder myEnc(2, 3);// подключаем контакты энкодера, А и Б обьязательно на 2 и 3й пин ардуино, там у нее стоят прерыватели, на других пинах работать небудет! 

#define HG7881_B_IA 5 // устанавливаем пины мотора
#define HG7881_B_IB 6 // устанавливаем пины мотора
 
// functional connections
#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed
#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction
 
#define PWM_SLOW 100  // arbitrary slow speed PWM duty cycle
#define PWM_FAST 200 // arbitrary fast speed PWM duty cycle
#define DIR_DELAY 1000 // brief delay for abrupt motor changes
 
void setup()
{
  pinMode( MOTOR_B_DIR, OUTPUT );
  pinMode( MOTOR_B_PWM, OUTPUT );
  digitalWrite( MOTOR_B_DIR, LOW );
  digitalWrite( MOTOR_B_PWM, LOW );
  Serial.begin(9600); 
  Serial.println("Basic Encoder Test:");

 digitalWrite( MOTOR_B_PWM, HIGH ); // при включении сразу крутим мотором вперед
 analogWrite( MOTOR_B_DIR, 255-PWM_FAST ); // при включении сразу крутим мотором вперед
 }

long oldPosition  = -999;
void loop() {
  long newPosition = myEnc.read(); // считываем позицию энкодера
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition); // выводим позицию энкодера в монитор порта, на большой скорости мотора данные могут проскакивать сотнями, для более коректного отображения можно увеличить Serial.begin(9600);
 }
        if (newPosition >= 20000) { // указываем после какого значения пускаем двигатель в обратную сторону. 
    
   digitalWrite( MOTOR_B_DIR, HIGH ); //крутим мотор в обратную сторону
   analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); //крутим мотор в обратную сторону

        }
 
    if (newPosition <= 10) { // указываем после какого значения двигатель вновь начинает крутить вперед
    
   digitalWrite( MOTOR_B_PWM, HIGH ); // крутим мотор вперед
   analogWrite( MOTOR_B_DIR, 255-PWM_FAST );  // крутим мотор вперед  
        
        }
}

теперь буду перепаивать с тестовой крутилки на каретку сканера и там уже настраивать по реальным цифрам с энкодера. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Kakmyc пишет:
Это походу клиника...
Доктор прописал строки переставить, оно и заработало. Слава доктору!

SLOM
Offline
Зарегистрирован: 06.11.2014

если кому интересно вот что получилось сделать 

https://youtu.be/qZaXbaYbZW4

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не совсем понятно, что тут энкодер делает (всю ветку не читал) - такое впечатление, что достаточно было двух концевиков.

SLOM
Offline
Зарегистрирован: 06.11.2014

sadman41

да так и есть, достаточно было 2х концевиков. но хотелось заарканить именно энкодер. понять как он работает, как его подключать(сжег 2 штуки)

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

спасибо вам за подсказку без нравоучений. 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

SLOM пишет:

спасибо вам за подсказку без нравоучений. 

Ну, вообще-то я собирался.

А по конструкции если...  Я бы еще попробовал какой-нибудь датчик приближения примастрячить, чтобы вжикалка начинала гонять туда-сюда только когда руку подносишь/прикладываешь. И приёмник на 433мгц, по сигналу которого будет загораться Опознан/Неопознан. А передатчик в карман...

SLOM
Offline
Зарегистрирован: 06.11.2014

sadman41 пишет:

А по конструкции если...  Я бы еще попробовал какой-нибудь датчик приближения примастрячить, чтобы вжикалка начинала гонять туда-сюда только когда руку подносишь/прикладываешь. И приёмник на 433мгц, по сигналу которого будет загораться Опознан/Неопознан. А передатчик в карман...

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

https://www.youtube.com/watch?v=7VYOLfOAPxw

на видео начальная версия с уз датчиком. но потом заменил на пульт. 

 

хочу применить пульт и адресную ленту, но вот неуверин потянит ли 1 ардуина нана все это на себе? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Коробочка припадошная, конечно. Для нее, наверное, нужен допплер. Он, пишут, через стенки даже чует людей.

Ардуина-то потянет, вытянет ли "производитель"...

SLOM
Offline
Зарегистрирован: 06.11.2014

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

шкатулка выглядит теперь так

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

При императивном построении программы да, а при декларативном нет. Но второй метод сложен для новичков.

SLOM
Offline
Зарегистрирован: 06.11.2014

qwone а можно поподробней? 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

https://youtu.be/41BIak_joT8?t=591 Где=то так. или delay против millis .Конечно в грубом понимании.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

вопрос энкодер крутит  в одну сторону, код такой, подключен 2 провода AB подтяжки на +5в 10ком C к GND

резисторы внешние, при вращении в любую сторону отображается только вращение >>>>>> вправо, если вращать влево пишет >>>>> пробовал различные скетчи этот хотя бы заработал в одну сторону.   

/*
** Энкодер
** Код изменён для вывода числа, а не изменения яркости
*/
#include <LiquidCrystal.h>

// символьный дисплей HD44780 16x2
// RS, EN, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);


int brightness = 0;       // яркость LED, начинаем с половины
int fadeAmount = 1;        // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 5;       // pin 12
const int pin_B = 6;       // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
unsigned char encoder_B_prev=0;
void lcdUpdate(){
  lcd.clear();
  lcd.print(brightness);
} 
 
 
void setup()  {
  // declare pin 9 to be an output:
 // pinMode(9, OUTPUT);         // устанавливаем pin 9 как выход
  Serial.begin (115200);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  digitalWrite(pin_A, HIGH);
  digitalWrite(pin_B, HIGH);
  currentTime = millis();
  loopTime = currentTime; 
  lcd.begin(16, 2);
  lcdUpdate();
} 
 
void loop()  {
  currentTime = millis();
  if(currentTime >= (loopTime + 1)){ // проверяем каждые 5мс (200 Гц)
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){
    Serial.print(">");}     // если состояние изменилось с положительного к нулю
    if((!encoder_B) && (encoder_B_prev)){Serial.print("<");}         
        
         
      
     
    }   
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла 
     
    //analogWrite(9, brightness);   // устанавливаем яркость на 9 ножку
    

    
    loopTime = currentTime;
  }                       

 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

добавил внизу кода  encoder_B_prev = encoder_B;  стал различать направления, выдает <> вправо >< влево, каким образом заставить его писать вправо > влево < ? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MYFRIEND пишет:

вопрос энкодер крутит  

Можно повнятнее, кто кого крутит?

DIVGENY
Offline
Зарегистрирован: 23.08.2016

MYFRIEND пишет:

добавил внизу кода  encoder_B_prev = encoder_B;  стал различать направления, выдает <> вправо >< влево, каким образом заставить его писать вправо > влево < ? 

вместо энкодера поставить две тактовых кнопки - сто % получишь, чего пожелал...

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

DIVGENY пишет:

MYFRIEND пишет:

добавил внизу кода  encoder_B_prev = encoder_B;  стал различать направления, выдает <> вправо >< влево, каким образом заставить его писать вправо > влево < ? 

вместо энкодера поставить две тактовых кнопки - сто % получишь, чего пожелал...

код выше рабочий, на основе <> и >< дельфи парсит легко и как 2 кнопки энкодер определяется, сообщение <> кнопка 1, сообщение >< кнопка два, спасибо большое за советы!  

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

MYFRIEND пишет:

 спасибо большое за советы!  

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