Вопрос по коду.

DeNick
DeNick аватар
Offline
Зарегистрирован: 11.08.2016

Приветствую всех! На просторах интернета,я нашёл простенький скетч для шагового двигателя. Моей задачей было - изучить как оно работает.По сути всё просто,почти всё понял,но в коде есть объявления массива вот : 

int lookup[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

А далее есть вот такой код: 

void setOutput(int out) {
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

Собственно сам вопрос. Что означают эти биты (B01000, B01100 и тд)? И как это работает? Документацию к bitRead я прочитал,но всё же,суть я не совсем уловил.

P.S в программирование пока нуб.

Скетч к ШД:

int motorPin1 = 8; 
int motorPin2 = 9; 
int motorPin3 = 10;
int motorPin4 = 11; 
int motorSpeed = 1200;
int count = 0;
int countsperrev = 512;
int lookup[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
//////////////////////////////////////////////////////////////////////////////

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
//Serial.begin(9600);
}

void loop(){
  if(count < countsperrev )
    clockwise();
  else if (count == countsperrev * 2)
    count = 0;
  else
    anticlockwise();
    count++;
}

void anticlockwise() {
  for(int i = 0; i < 8; i++) {
    setOutput(i);
    delayMicroseconds(motorSpeed);
}
}

void clockwise() {
  for(int i = 7; i >= 0; i--) {
    setOutput(i); 
    delayMicroseconds(motorSpeed);
}
}

void setOutput(int out) {
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

Если тему создал не там,прошу прощения,буду благодарен если перенесут.

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

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

А в функции setOutput подается HIGH или LOW на пины (обмотки) в зависимости от того 1 или 0 в указанном бите текущего байта.

DeNick
DeNick аватар
Offline
Зарегистрирован: 11.08.2016

Nosferatu пишет:

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

А в функции setOutput подается HIGH или LOW на пины (обмотки) в зависимости от того 1 или 0 в указанном бите текущего байта.

Спасибо! Вроде начал понимать. Но вот что обозначают 0,1,2,3 и т.д цифры на концах этого кода? bitRead(lookup[out], 0)). Я так понимаю,что это последовательность выполнения или же нет? И могу ли я щаписать вместо них что либо другое? И ещё. Получается в этом когде берется допустим первые данные из массива B01000 c bitRead с 0 на конце и он их обрабатывает а дальше что? Он берет следующий и так до конца и потом выполняется второй bitRead,но со знаком 1 на конце? Может не понятно задал вопрос,но всё же :)

Araris
Offline
Зарегистрирован: 09.11.2012

DeNick пишет:

Но вот что обозначают 0,1,2,3 и т.д цифры на концах этого кода? bitRead(lookup[out], 0)).

Найти и прочитать описание функции bitRead() затрудняет ?

Пожалуйста : http://arduino.ua/ru/prog/BitRead

DeNick
DeNick аватар
Offline
Зарегистрирован: 11.08.2016

Araris пишет:

DeNick пишет:

Но вот что обозначают 0,1,2,3 и т.д цифры на концах этого кода? bitRead(lookup[out], 0)).

Найти и прочитать описание функции bitRead() затрудняет ?

Пожалуйста : http://arduino.ua/ru/prog/BitRead

Уже читал,писал про это выше. Сейчас ещё раз перечитал,уже стало понятней,спасибо.