digital write в готовый рабочий код. Куда? готов зарядить сто рублеблей на телефон кто поможет

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

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

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

собственно код

enum PinAssignments {
 encoderPinA = 2,
 encoderPinB = 3,
 clearButton = 8
};

volatile unsigned int encoderPos = 0;
unsigned int lastReportedPos = 1;

boolean A_set = false;
boolean B_set = false;

void setup() {

 pinMode(encoderPinA, INPUT);
 pinMode(encoderPinB, INPUT);
 pinMode(clearButton, INPUT);
 digitalWrite(clearButton, HIGH);

// encoder pin on interrupt 0 (pin 2)
 attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
 attachInterrupt(1, doEncoderB, CHANGE);

 Serial.begin(9600);
}

void loop(){
 if (lastReportedPos != encoderPos) {
   Serial.print("Index:");
   Serial.print(encoderPos, DEC);
   Serial.println();
   lastReportedPos = encoderPos;
 }
 if (digitalRead(clearButton) == LOW)  {
   encoderPos = 0;
 }
}

// Interrupt on A changing state
void doEncoderA(){
 // Test transition
 A_set = digitalRead(encoderPinA) == HIGH;

 // and adjust counter + if A leads B
 encoderPos += (A_set != B_set) ? +1 : -1;
}

// Interrupt on B changing state
void doEncoderB(){
 // Test transition
 B_set = digitalRead(encoderPinB) == HIGH;

 // and adjust counter + if B follows A
 encoderPos += (A_set == B_set) ? +1 : -1;
}
 

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

думаю нужно использовать  if\else для doencoder  ноне силен в синтаксисе

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

третий день мучаюсь помогите крыша едет

ptr
Offline
Зарегистрирован: 28.05.2016

Я пытался понять, что такое диджей вертолет, какое отношение он имеет к диджей вертушке с ардуиной, откуда потом взялся энкодер и что вообще этот энкодер должен делать. Но мне это не удалось (

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

оптический датчик читающий колесо

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

становится  энкодером уже в коде

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

похож на те что в принтерах на вывод два контакта на питание плюс 5м и земля

ptr
Offline
Зарегистрирован: 28.05.2016
void loop(){
 if (lastReportedPos != encoderPos) {
   Serial.print("Index:");
   Serial.print(encoderPos, DEC);
   Serial.println();

   Serial.write((A_set == B_set) ? 0 : 0xB0);

   lastReportedPos = encoderPos;
 }
 if (digitalRead(clearButton) == LOW)  {
   encoderPos = 0;
 }
}

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

сек ща проверю

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

два раза послал данные по монитору midi-ox и ошибка ? f[ lf bcgjkmpet. serial2midi converter ghbkj;tybt

ptr
Offline
Зарегистрирован: 28.05.2016

Так убрать надо было остальной вывод по последовательному порту:
 

void loop(){
 if (lastReportedPos != encoderPos) {
   Serial.write((A_set == B_set) ? 0 : 0xB0);
   lastReportedPos = encoderPos;
 }
 if (digitalRead(clearButton) == LOW)  {
   encoderPos = 0;
}

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

так же хотел сказать что использую serial2midi converter и виртуальные миди порты c по проблем нет.  сфоткать железо подробно или не имеет смысла?

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

пробуем

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

теперь независимо от поворота шлет бесконечно 0xB0 с ошибками порта

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

можно мне вашу версию кода целиком с заменой в моем

ptr
Offline
Зарегистрирован: 28.05.2016

void loop(){
 if (lastReportedPos != encoderPos) {
   Serial.write((lastReportedPos>encoderPos) ? 0 : 0xB0);
   lastReportedPos = encoderPos;
 }
 if (digitalRead(clearButton) == LOW)  {
   encoderPos = 0;
}

Может слишком часто прерывания идут? Попробуйте так.

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

ну же ребята кому сотку на телефон?))))

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

да очень часто

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

пробую

ptr
Offline
Зарегистрирован: 28.05.2016
enum PinAssignments {
 encoderPinA = 2,
 encoderPinB = 3,
 clearButton = 8
};

volatile unsigned int encoderPos = 0;
unsigned int lastReportedPos = 1;

boolean A_set = false;
boolean B_set = false;

void setup() {

 pinMode(encoderPinA, INPUT);
 pinMode(encoderPinB, INPUT);
 pinMode(clearButton, INPUT);
 digitalWrite(clearButton, HIGH);

// encoder pin on interrupt 0 (pin 2)
 attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
 attachInterrupt(1, doEncoderB, CHANGE);

 Serial.begin(9600);
}

void loop(){
 if (lastReportedPos != encoderPos) {
   Serial.write((lastReportedPos>encoderPos) ? 0 : 0xB0);
   lastReportedPos = encoderPos;
 }
 if (digitalRead(clearButton) == LOW)  {
   encoderPos = 0;
 }
}

// Interrupt on A changing state
void doEncoderA(){
 // Test transition
 A_set = digitalRead(encoderPinA) == HIGH;

 // and adjust counter + if A leads B
 encoderPos += (A_set != B_set) ? +1 : -1;
}

// Interrupt on B changing state
void doEncoderB(){
 // Test transition
 B_set = digitalRead(encoderPinB) == HIGH;

 // and adjust counter + if B follows A
 encoderPos += (A_set == B_set) ? +1 : -1;
}

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

все ок но шлет с задерками в 5 7 10 секунд а мне нужен поток

ptr
Offline
Зарегистрирован: 28.05.2016
enum PinAssignments {
 encoderPinA = 2,
 encoderPinB = 3,
 clearButton = 8
};

volatile unsigned int encoderPos = 0;
unsigned int lastReportedPos = 1;

boolean A_set = false;
boolean B_set = false;

void setup() {

 pinMode(encoderPinA, INPUT);
 pinMode(encoderPinB, INPUT);
 pinMode(clearButton, INPUT);
 digitalWrite(clearButton, HIGH);

// encoder pin on interrupt 0 (pin 2)
 attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
 attachInterrupt(1, doEncoderB, CHANGE);

 Serial.begin(9600);
}

void loop(){
 static unsigned char direction;

 if (lastReportedPos != encoderPos) {
   direction=(lastReportedPos>encoderPos) ? 0 : 0xB0;
   lastReportedPos = encoderPos;
 }
 Serial.write(direction);
 if (digitalRead(clearButton) == LOW)  {
   encoderPos = 0;
 }
}

// Interrupt on A changing state
void doEncoderA(){
 // Test transition
 A_set = digitalRead(encoderPinA) == HIGH;

 // and adjust counter + if A leads B
 encoderPos += (A_set != B_set) ? +1 : -1;
}

// Interrupt on B changing state
void doEncoderB(){
 // Test transition
 B_set = digitalRead(encoderPinB) == HIGH;

 // and adjust counter + if B follows A
 encoderPos += (A_set == B_set) ? +1 : -1;
}

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

и кстати в обе стороны шлет 0xBO а мне же нужно право (или лево неважно) 0x00где в коде регулировать скорость посыла

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

РЕБЯТА ПОМОГИТЕ!!!!

ptr
Offline
Зарегистрирован: 28.05.2016

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

Если же мой код выдает в порт только 0xB0, то значит, что encoderPos всегда возрастает и никогда не убывает, а значит проблема в обработчиках прерываний.
 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

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

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

и разубеется ни 0xB0 ни 0x00 он не слал

ptr
Offline
Зарегистрирован: 28.05.2016

acidtrax13 пишет:

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

Чего тысячи? Значение при каких-то условиях убывало?

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

в одну сторону больше в другую меньше (ардуино монитор)

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

Index:65479
Index:65494
Index:65511
Index:65530
Index:15
Index:32
Index:50
Index:68
Index:87

  в одну и другую

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

ну это середина

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

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

Serial.write(0xB0)

и

Serial.write(0x00)

или так не делается?

 

 

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

хотя судя по всему там переписывать надо это же index

ptr
Offline
Зарегистрирован: 28.05.2016

acidtrax13 пишет:

Index:65479
Index:65494
Index:65511
Index:65530
Index:15
Index:32
Index:50
Index:68
Index:87

  в одну и другую

Вижу только возрастание. Просто при прибавлении единицы к unsigned int со значением 65535 получится 0. Оно больше не бывает, чем 65535

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

4000 по индекс за оборот , мне впринципе такая и нужна скорость

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

но и так же уменьшается на 4000 в обратку

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

Index:65530 доходишь крутиш в обратку и оноуменьшается

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

могу на видео заснять блин

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

нельзя с doEncoderA и doEncoderB снять данные?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

совсем не то

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

помогите ребята!! я знаю вы можете!

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

оптический сенсор, два контакта на вывод один дожен слать Serial.write(0xB0) второй Serial.write(0x00) только не одновременнот помоему это очень просто

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

acidtrax13 пишет:

оптический сенсор, два контакта на вывод один дожен слать Serial.write(0xB0) второй Serial.write(0x00) только не одновременнот помоему это очень просто

когда ты овладеешь русским языком - нам будет просто понять тебя.

а, пока - плети лапти, удмурт.

acidtrax13
acidtrax13 аватар
Offline
Зарегистрирован: 08.09.2016

это форум взаимопомощи или чего простите

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

На этом форуме принято писать по-русски.