Как подключить энкодер к частотному преобразователю. схема

Rotary Encoder Arduino Code Explaination:

To keep track of the rotary encoder we are going to do something that will look really weird, so bear with me.

The encoder has 2 digital pins that are either HIGH (1) or LOW (0) right? If we treat the pins as binary, we read them as 00, 01, 10, or 11. The sequence the encoder outputs while spinning clockwise is 00, 01, 11, 10 repeat.

So if you have a reading of 01, the next reading can either be 00 or 11 depending on the direction the knob is turned. So by adding the previous encoded value to the beginning of the current encoded value; we get 1 of 8 possible numbers (0001, 0010, 0100, 0111, 1000, 1011, 1110 & 1101) 1101, 0100, 0010 & 1011 all mean cockwise movement. 1110, 0111, 0001 & 1000 are all counter-clockwise.

So now we can say this: (sum is last reading + current reading)

Схема проекта

Схема энкодера для двигателя на Arduino и PID контроллере представлена на следующем рисунке.

Принцип работы схемы достаточно прост. Двигатель N20 с экнкодером имеет 6 контактов, контакты M1, M2 используются для подачи питания на двигатель (он у нас очень маленький, работающий от 3.3V). Контакты VCC и GND используются для питания цепи энкодера. Для питания энкодера необходимо подавать напряжение +5V, иначе цепь энкодера не будет корректно работать. Контакты PIN_A и PIN_B двигателя непосредственно подключены к энкодеру. Измеряя состояние этих контактов, мы легко можем определить число оборотов двигателя в минуту (RPM). Наш двигатель N20 имеет 15RPM и передаточное число 1:2098, что означает, что ось двигателя должна совершить 2098 оборотов для того чтобы вспомогательный вал (на выходе коробки передач) совершил один оборот. Контакты PIN_A и PIN_B двигателя подключены к контактам 9 и 10 платы Arduino – они оба имеют возможность формирования ШИМ (широтно-импульсная модуляция) сигналов. Эти контакты должны обязательно иметь возможность формирования ШИМ сигналов, иначе код программы работать не будет. PID контроллер управляет двигателем при помощи ШИМ.

Также наша схема содержит драйвер двигателя в виде H-моста. Драйвер двигателя у нас имеет такую схему, что с помощью него мы можем управлять двигателем с использованием всего 2-х контактов платы Arduino. Также он защищает двигатель от ложных срабатываний.

Монтаж и подключение датчиков поворота

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

Важно прочно закрепить корпус датчика при монтаже

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

Варианты подключения

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

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

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

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

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

Энкодер: Примеры применения

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

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

Как подключаются энкодеры

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

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

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

Монтаж энкодеров

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

Существуют энкодеры с полым валом, которые надеваются непосредственно на измеряемый вал и там фиксируются. Там даже нет такого понятия, как несоосность. Их гораздо проще монтировать, и они надежнее в эксплуатации. Чтобы энкодер при этом не прокручивался, используется лишь металлический поводок. На фото ниже показан энкодер с полым валом (обозначен В21.1), надетый на вал редуктора:

Производители энкодеров

Среди российских производителей энкодеров мне известен лишь только Питерский СКБ ИС, который производит энкодеры марки ЛИР. К сожалению, российского промышленного оборудования сейчас почти не производится, и ЛИРы применяются лишь в военном и лабораторном оборудовании.

По этой причине автор имеет дело только с энкодерами зарубежного производства. Производителей энкодеров много – их производят почти все производители полупроводниковых датчиков. Чаще всего встречаюсь с энкодерами Autonics – как и в случае с датчиками, в России представлен большой ассортимент. Другие известные производители энкодеров – немецкий Sick, японский Omron, и несколько китайских брендов.

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

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

Измерение скорости полотна

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

При помощи системы «энкодер+контроллер» можно вычислить мгновенную скорость, а также погонную длину произведенной продукции:

Общие плюсы и минусы

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

Преимущества:

  1. Доступная цена.
  2. Простой монтаж и использование.
  3. Высокая точность измерений.
  4. Универсальность — возможность применения на широком спектре приборов и оборудования.
  5. Возможность определить направление вращения объекта.

Недостатки:

  1. Возможные ошибки в измерениях, если выбран прибор неправильного типа или нарушена технология установки.
  2. Схема подключения зависит от типа и сферы применения.
  3. В некоторых видах энкодеров нужно постоянно преобразовывать код Грея.
  4. Ограниченная разрешающая способность. Чтобы повысить точность измерений, нужно добавлять дополнительные каналы.

Принцип работы энкодера

Как обеспечивается работа устройства лучше всего видно, если заглянуть «внутрь». Рассмотрим типовую и самую распространенную схему построения преобразователя – оптоэлектронную с подшипниковым узлом. На рисунке ниже представлен оптический многооборотный абсолютный датчик с цельным валом.

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

  1. – вал энкодера
  2. – фланец (на данном рисунке представлен зажимной тип)
  3. – фотоприемник инфракрасного (ИК) света
  4. – оптический диск с растрами (метками, если инкрементный) или кодовыми дорожками (если абсолютный)
  5. – ИК осветитель (LED) с линзой на плате
  6. – механический редуктор с зубчатыми колесами (многооборотный модуль)
  7. – плата обработки сигнала с выходными формирователями и конверторами интерфейса.

Элементы 1, 2, 4 формируют оптико-механический подшипниковый узел. Оптический диск (лимб) 4 может быть стеклянным, металлическим, пластиковым. В зависимости от производителя бывают конструкции, где элементы 3 и 5 поменяны местами. Механический редуктор 6 встречается только у многооборотных абсолютных преобразователей.

На рисунке выше показана работа энкодера:

  1. ИК свет от источника 5 проходит через кодовый диск 4, и попадает на приемник (фото матрицу) 3
  2. Фотоприёмник имеет нанесенную на чувствительном элементе или расположенную над ним маску (индикаторную пластину), которая также имеет «окошки», как на вращающемся диске
  3. Из-за поочередного перекрытия и открытия окошек маски в процессе вращения вала датчика, проходящий свет имеет аналоговую структуру. Нет света -> нарастает -> максимум света -> убывает -> нет света
  4. Это регистрирует фото сенсор
  5. Далее аналоговый сигнал с приемника преобразуется платой обработки 7 в необходимые для дальнейшей передачи информации импульсы.

Подключение поворотного энкодера с Ардуино

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

Для этого понадобятся:

  • любое устройство Ардуино, например, Arduino UNO, Arduino Mega, Arduino Leonardo, Arduino 101, Arduino Due;
  • любой энкодер Ардуино.

Обзор поворотного энкодера

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

Пины, и что они означают:

  • CLK: выход A (цифровой);
  • DT: выход B (цифровой);
  • SW: нажатие кнопки (цифровой);
  • + : VCC-напряжение питания;
  • GND: заземление.

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

Данное устройство определяет угловое положение вращающегося вала с помощью серии прямоугольных импульсов. Он по существу имеет равномерно расположенные контактные зоны, соединенные с общим узлом, а также два дополнительных контакта, называемых A и B, которые находятся на 90 градусов вне фазы. Когда вал вращается вручную, контакты A и B синхронизируются с общим контактом и генерируют импульс. Подсчитав количество импульсов любого из этих выходов, можно определить положение вращения.

Чтобы определить направление и проверить, вращается ли штифт по часовой стрелке или против часовой стрелки, нужно сделать следующее:

  • Если вращающийся вал движется по часовой стрелке, то сигнал A опережает B. В одни и те же моменты времени, A и B будут находиться на противоположных частях прямоугольной волновой функции.
  • Если вал движется против часовой стрелки, то сигнал B опережает A.

Подключение

Если говорить в общем, то CLK, DT и SW, должны быть подключены к цифровым выводам на Ардуино, + должен быть подключен к 5V, а GND заземлен.

Пошаговая инструкция подключения проводов энкодера к Ардуино:

  1. CLK: подключите конец провода к пину CLK на поворотном энкодере, затем к любому цифровому выводу на Arduino (оранжевый провод).
  2. DT: подключите конец провода к пину DT, затем к любому цифровому контакту на Arduino (желтый провод).
  3. SW: подключите конец провода к пину SW, далее к любому цифровому контакту на Arduino (голубой провод).
  4. + : подключите провод к пину +, затем к контакту +5V на Arduino (красный провод).
  5. GND: подключите конец провода к пину GND на энкодер с контактом GND на Arduino. (Черный провод).

Как кодировать

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

Что понадобится:

  • датчик поворотного энкодера;
  • Ардуино;
  • пьезодатчик;
  • провода.

Вот сам код:

Описание кода

Итак, сначала нужно определить контакты, к которым подключен кодер, и назначить некоторые переменные, необходимые для работы программы. В разделе «Настройки» нужно определить два контакта в качестве входных данных, и запустить последовательную связь для печати результатов на последовательном мониторе. Также нужно прочитать начальное значение вывода A, затем поместить это значение в переменную aLastState.

Далее в разделе цикла снова изменить вывод A, но теперь поместить значение в переменную aState. Таким образом, если повернуть вал и сгенерировать импульс, эти два значения будут отличаться. Сразу после этого, используя второй параметр «if», определить направление вращения. Если выходное состояние B отличается от A, счетчик будет увеличен на единицу, в противном случае он будет уменьшен. В конце, после вывода результатов на мониторе, нужно обновить переменную aLastState с помощью переменной aState.

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

Упрощенный пример

Следующий пример кода продемонстрирует, как считывает сигналы Arduino на датчике энкодера. Он просто обновляет счетчик (encoder0Pos) каждый раз, когда энкодер поворачивается на один шаг, а параметры вращения отправляются на порт ПК.

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

Код Ардуино с использованием прерываний

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

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

Широко распространенным решением является использование прерывания. С прерыванием вам не нужно постоянно опрашивать конкретное событие. Это освобождает Ардуино для выполнения какой-то другой работы, не пропуская событие.

Подключение энкодера к Ардуино с учетом прерывания

Поскольку большинство Ардуино (включая Ардуино UNO) имеют только два внешних прерывания, мы можем отслеживать только изменения в сигналах DT и CLK. Вот почему мы удалили соединение вывода SW с предыдущей схемы подключения.

Итак, теперь схема подключения выглядит так:

Некоторые платы (например, Ардуино Mega 2560) имеют больше внешних прерываний. Если у вас есть что-то из этого, вы можете оставить соединение для вывода SW и расширить рисунок ниже, чтобы использовать код и для кнопки.

Код Ардуино

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

// Входы поворотного энкодера
#define CLK 2
#define DT 3

int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";

void setup() {
  
  // Устанавливаем контакты энкодера как входы
  pinMode(CLK,INPUT);
  pinMode(DT,INPUT);

  // Настройка последовательного монитора
  Serial.begin(9600);

  // Считываем начальное состояние CLK
  lastStateCLK = digitalRead(CLK);
  
  // Вызов updateEncoder () при обнаружении любого изменения максимума/минимума при прерывании 0 (вывод 2) или прерывании 1 (вывод 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);
}

void loop() {
  //Здесь какой-либо полезный код
}

void updateEncoder(){
  // Считываем текущее состояние CLK
  currentStateCLK = digitalRead(CLK);

  // Если последнее и текущее состояние CLK различаются, то произошел импульс.
  // Реагируем только на одно изменение состояния, чтобы избежать двойного счета
  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

    // Если состояние DT отличается от состояния CLK, то
    // энкодер вращается против часовой стрелки, поэтому уменьшаем
    if (digitalRead(DT) != currentStateCLK) {
      counter --;
      currentDir ="CCW";
    } else {
      // Энкодер вращается по часовой стрелке, поэтому увеличиваем
      counter ++;
      currentDir ="CW";
    }

    Serial.print("Direction: ");
    Serial.print(currentDir);
    Serial.print(" | Counter: ");
    Serial.println(counter);
  }

  // Запоминаем последнее состояние CLK
  lastStateCLK = currentStateCLK;
}

Обратите внимание, что основной цикл этой программы loop() остается пустым, поэтому Ардуино ничего не делает. Между тем, эта программа отслеживает изменение значения на цифровом выводе 2 (соответствует прерыванию 0) и цифровом выводе 3 (соответствует прерыванию 1)

Другими словами, программа ищет изменение напряжения с HIGH на LOW или с LOW на HIGH, которое происходит при повороте ручки

Между тем, эта программа отслеживает изменение значения на цифровом выводе 2 (соответствует прерыванию 0) и цифровом выводе 3 (соответствует прерыванию 1). Другими словами, программа ищет изменение напряжения с HIGH на LOW или с LOW на HIGH, которое происходит при повороте ручки.

Когда это происходит, вызывается функция updateEncoder() (часто называемая подпрограммой обслуживания прерывания или просто ISR ). Код в этой функции выполняется, а затем программа возвращается к исполнению основного кода с момента прерывания.

За все это отвечают две строки в коде. Эта функция attachInterrupt() которая сообщает Ардуино, какой вывод следует контролировать, какой ISR выполнять, если прерывание срабатывает, и какой тип триггера следует искать.

Программирование энкодера

Современные энкодеры внутри себя имеют микроконтроллер (процессор) все данные энкодера передаются по цифровому последовательному интерфейсу, наиболее распространённый RS485. В процессоре энкодера хранятся данные о двигателе, в котором этот датчик установлен (ток, напряжение, инерция, угол смещения ротора, индуктивности и естественно тип двигателя с серийным номером).

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

Механические

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

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

Сигналы и выходы инкрементального энкодера

Импульсы на выходе энкодера – один канал

Период Т – величина, обратная частоте, а про частоту мы говорили выше. Уровень “Н” – это напряжение, почти равное напряжению питания (обычно 5, 12, или 24 В). Уровень “L” – около нуля.

Что может рассказать нам такой энкодер? Только о скорости и погонных метрах. Например, его можно применять для определения частоты вращения двигателя, или длины материала после нажатия кнопки “Сброс”. Неплохо, но хочется большего!

Если будет два выхода, импульсы на которых (оптическим способом) сдвинуты на четверть периода, мы сможем узнать направление вращения:

Импульсы каналов А и В с фазовым сдвигом

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

Если сдвиг фаз положительный (фаза В отстает), можно условиться о прямом вращении. Если отрицательный (фаза В опережает фазу А на четверть), значит, вращение в обратном направлении. Два этих сигнала с одной частотой и фазой ±90° подаются на триггер, выход которого однозначно указывает о направлении вращения.

Со скоростью, расстоянием и направлением разобрались, а что делать, если нужно узнать угол поворота? Для этого вводится сигнал “Z” (Zero) – опорный импульс, который также называют нуль-меткой или референсной меткой:

Выходы энкодера А, В с нулевой меткой Z

Импульс “Z” имеет длительность Т (бывает и другая длительность – T/2, или 2Т) и проскакивает 1 раз за оборот вала энкодера. Иными словами, длительность нулевой метки может быть в тысячи раз короче периода вращения вала энкодера.

В современных датчиках каждая фаза (канал) обычно имеет ещё один, противофазный выход.

С теорией заканчиваем, плавно переходим к практике.

Что такое энкодер?

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

  • скорость вращения,
  • расстояние (длину),
  • направление вращения,
  • угловое положение по отношению к нулевой метке.

Энкодер является самым распространенным «измерительным инструментом» в современном промышленном оборудовании. Фактически энкодер является датчиком обратной связи, на выходе которого цифровой сигнал меняется в зависимости от его вращения или от угла его поворота. Этот сигнал обрабатывается в счетчике или контроллере, который выдает команды на устройство индикации или привод.

Этикетка инкрементного энкодера Sick, установленного на валу двигателя постоянного тока. Основной параметр – 1024 импульса на оборот

Энкодеру найдено множество применений, учитывая возможности последующей обработки его сигнала. Например – измерение погонной длины какого-либо материала, измерение угла открытия/закрытия задвижки, точное позиционирование деталей при перемещении и обработке. Конкретные примеры будут ниже.

Энкодеры, о которых идёт речь в статье,  в некоторых источниках называются датчиками углового перемещения, датчиками угла поворота, и даже “N-кодером”.

Счет

Проанализировав состояние энкодера при вращении влево и вправо, составляем таблицу:

Его начальное положение 1-1. При повороте вправо произошел щелчок, единица стала логическим нулем. Новое значение this State vfd равно 01. Согласно команды данный результат суммируется со значением переменной Position.

Из-за того, что произошел дребезг, позиция стала 11, после перерасчета порядковый номер стал 7. После того, как дребезг закончился, нужно фиксировать новое положение 01 и к предыдущему нулю добавляется единица. При повороте энкодера произошел один щелчок, и значение переменной Position стало единицей.

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

В некоторых энкодерах имеет применение кнопка панели. При ее нажатии и отпускании тоже будет дребезг контактов, нужно применить библиотеку Bounce. Функции этой библиотеки нужны для задания pin, к которому будет подключена кнопка, задач времени задержки в миллисекундах. Если произошло нажатие на кнопку, то функция мощности (кВт) возвращает векторное значение true, если нет, то false vfd.

Example Program

File > Examples > Encoder > TwoKnobs

/* Encoder Library - TwoKnobs Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>

// Change these pin 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 knobLeft(5, 6);
Encoder knobRight(7, 8);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  Serial.println("TwoKnobs Encoder Test:");
}

long positionLeft  = -999;
long positionRight = -999;

void loop() {
  long newLeft, newRight;
  newLeft = knobLeft.read();
  newRight = knobRight.read();
  if (newLeft != positionLeft || newRight != positionRight) {
    Serial.print("Left = ");
    Serial.print(newLeft);
    Serial.print(", Right = ");
    Serial.print(newRight);
    Serial.println();
    positionLeft = newLeft;
    positionRight = newRight;
  }
  // if a character is sent from the serial monitor,
  // reset both back to zero.
  if (Serial.available()) {
    Serial.read();
    Serial.println("Reset both knobs to zero");
    knobLeft.write(0);
    knobRight.write(0);
  }
}