Raspberry Pi и Pi4J. Урок 10. Работа с Цифро-аналоговым преобразователем/ЦАП MCP4725

ЦАП MCP4725 — это 12-разрядный цифро-аналоговый преобразователь управляемый через I2C. Так как мини компьютеры Raspberry Pi, Banana Pi, Orange Pi, Nano Pi, Odroid и т.п. имеют встроенного ЦАП, MCP4725 может быть использован, чтобы получить точный аналоговый сигнал.

В Pi4J есть библиотека для работы с ЦАП MCP4725 по I2C/TWI из Java на Raspberry Pi, Banana Pi, Orange Pi, Nano Pi и Odroid. Все классы и интерфейсы находятся в пакете com.pi4j.gpio.extension.mcp.*;.

Пока не все возможности ЦАП MCP4725 реализованы, нет возможности записывать данные в EEPROM — эта функция позволяет ЦАП MCP4725 самостоятельно сохранять значения данных и восстанавливать их при включении питания.

Класс DacGpioProviderBase

Этот базовый поставщик GPIO определяет требуемые интерфейсы и реализует базовую функциональность для микросхем расширения ЦАП (цифро-аналоговых) как родные выводы Pi4J GPIO.

DacGpioProviderBase(Pin[])

Конструктор по умолчанию.

public DacGpioProviderBase(Pin[] pins)

Параметры
pins — совокупность всех выводов GPIO, используемых с реализацией этого поставщика ЦАП.
Возвращает
новый экземпляр DacGpioProviderBase

setPercentValue(Pin, Number)

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

public void setPercentValue(Pin pin, Number percent)

Параметры
pin — вывод GPIO.
percent — процентное значение от 0 до 100.

setPercentValue(GpioPinAnalogOutput, Number)

Устанавливает текущее аналоговое значение в процентах от доступного диапазона вместо необработанного значения (масштабированное число в диапазоне значений АЦП).

public void setPercentValue(GpioPinAnalogOutput pin, Number percent)

Параметры
pin — вывод GPIO.
percent — процентное значение от 0 до 100.

setValue(Pin, Number)

Устанавливает аналоговое выходное значение (необработанное значение) на выходной контакт ЦАП.

public void setValue(Pin pin, Number value)

Параметры
pin — номер пина ЦАП.
value — необработанное значение для отправки на ЦАП.

shutdown()

Этот метод используется платформой для отключения экземпляра ЦАП. Этот метод также закроет шину I2C для подключенного ЦАП.

public void shutdown()

setShutdownValue(Number, Pin … )

Устанавливает значение отключения, которое ЦАП должен применять к данному выводу GPIO, когда экземпляр класса уничтожается.

public void setShutdownValue(Number value, Pin ... pin)

Параметры
value — значение отключения, применяемое к данному выводу (-ам).
pin — вывод аналогового выхода (один или несколько выводов).

getShutdownValue(Pin)

Возвращает значение отключения, которое ЦАП должен применять к указанному выводу GPIO при уничтожении класса.

public Number getShutdownValue(Pin pin)

Параметры
pin — аналоговый выход.
Возвращает
значение отключения, применяемое к данному выводу.

setShutdownValue(Number, GpioPinAnalogOutput …)

Устанавливает значение отключения, которое ЦАП должен применять к данному выводу GPIO, когда экземпляр класса уничтожается.

public void setShutdownValue(Number value, GpioPinAnalogOutput ... pin)

Параметры
value — значение отключения, применяемое к данному выводу (-ам).
pin — вывод аналогового выхода (один или несколько выводов).

getShutdownValue(GpioPinAnalogOutput)

Возвращает значение отключения, которое ЦАП должен применять к указанному выводу GPIO при уничтожении класса.

public Number getShutdownValue(GpioPinAnalogOutput pin)

Параметры
pin — аналоговый выход.
Возвращает
значение отключения, применяемое к данному выводу.

Класс MCP4725GpioProvider

Этот GPIO провайдер расширяет абстрактный класс DacGpioProviderBase и реализует интерфейс DacGpioProvider, для работы с пином MCP4725, как с родным пином Pi4J.

MCP4725GpioProvider(int, int)

Это конструктор по умолчанию.

public MCP4725GpioProvider(int busNumber, int address) throws UnsupportedBusNumberException, IOException

Параметры
busNumber — номер шины.
address — I2C адрес устройства.
Возвращает
новый экземпляр MCP4725GpioProvider
Бросает
UnsupportedBusNumberException — если данный номер шины не поддерживается базовой системой.
IOException — если сообщение с шиной I2C не работает.

MCP4725GpioProvider(I2CBus, int)

Это альтернативный конструктор, который можно использовать для создания экземпляра MCP4725.

public MCP4725GpioProvider(I2CBus bus, int address) throws IOException

Параметры
busNumber — I2C шина.
address — I2C адрес устройства.
Возвращает
новый экземпляр MCP4725GpioProvider
Бросает
IOException — если сообщение с шиной I2C не работает.

setValue(Pin, double)

Устанавливает аналоговое выходное значение на выходной контакт на ЦАП.

public void setValue(Pin pin, double value)

Параметры
pin — номер пина ЦАП.
value — необработанное значение для отправки на ЦАП. (Между: 0..4095).

getName()

Получает имя экземпляра поставщика ЦАП.

public String getName()

Возвращает
имя экземпляра поставщика ЦАП.

shutdown()

Этот метод используется платформой для отключения экземпляра ЦАП MCP4725. Этот метод также закроет шину I2C для подключенного MCP4725.

public void shutdown()

getMinSupportedValue()

Возвращает минимальное поддерживаемое аналоговое значение ЦАП.

public double getMinSupportedValue()

Возвращает
минимальное поддерживаемое аналоговое значение.

getMaxSupportedValue()

Возвращает максимальное поддерживаемое аналоговое значение для реализации ЦАП. (Например, максимальное значение 10-разрядного АЦП составляет 1023, а максимальное значение 12-разрядного АЦП — 4095.

public double getMaxSupportedValue()

Возвращает
максимальное поддерживаемое аналоговое значение.

Класс MCP4725Pin

Этот провайдер GPIO реализует 12-разрядный цифро-аналоговый преобразователь MCP4725 в качестве собственных выводов GPIO Pi4J. MCP4725 подключен через I2C к Raspberry Pi и имеет 1 аналоговый выход GPIO.

createAnalogOutputPin(int, String)

Создаёт и возвращает новый экземпляр класса PinImpl, для работы с аналоговым выводом MCP4725.

private static Pin createAnalogOutputPin(int address, String name)

Параметры
address — номер вывода.
name — имя пина.
Возвращает
новый экземпляр класса PinImpl.

Схема подключения ЦАП MCP4725 к Orange Pi

MCP4725 можно подключить на любой доступный I2C порт.

Схема подключения ЦАП MCP4725 к Orange Pi

Примеры программ с ЦАП MCP4725 на Pi4J

Генерация прямоугольной волны/Меандр

Приведённая ниже программа генерирует прямоугольную волну (Меандр), а для проверки использовал цифровой осциллограф DSO138. Для отправки данных на чип использовалась функция setValue().

import com.pi4j.gpio.extension.base.DacGpioProvider;
import com.pi4j.gpio.extension.mcp.MCP4725GpioProvider;
import com.pi4j.gpio.extension.mcp.MCP4725Pin;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinAnalogOutput;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.util.Console;

public class MCP4725SquareWave {

  public static void main(String args[]) throws Exception {
    System.out.println("<--Pi4J--> MCP4725 DAC Example ... started.");
    final Console console = new Console();
    console.promptForExit();
    /*
     * создаем gpio контроллер
     */
    GpioController gpio = GpioFactory.getInstance();

    /*
     * создаем пользовательский provider GPIO MCP4725
     */
    final DacGpioProvider provider = new MCP4725GpioProvider(I2CBus.BUS_0, MCP4725GpioProvider.MCP4725_ADDRESS_1);

    /*
     * создаём аналоговый выходной пин от MCP4725
     */
    final GpioPinAnalogOutput output = gpio.provisionAnalogOutputPin(provider, MCP4725Pin.OUTPUT);

    /*
     * устанавливаем начальное значение (значение запуска) для выходного вывода
     */
    output.setValue(0);

    /*
     * устанавливаем значение выключения для выходного вывода
     */
    provider.setShutdownValue(MCP4725GpioProvider.MAX_VALUE, output);

    new Thread() {
      @Override
      public void run() {
        /*
         * генерируем прямоугольную волну на выходе
         */
        while (console.isRunning()) {
          output.setValue(provider.getMaxSupportedValue());
          mySleep(1);
          output.setValue(provider.getMinSupportedValue());
          mySleep(1);
        }

      }

      private void mySleep(long milis) {
        try {
          sleep(milis);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }.start();

    console.waitForExit();
    /*
     * останавливаем все действия / потоки GPIO, отключая контроллер GPIO (этот
     * метод принудительно завершает работу всех потоков мониторинга GPIO и
     * запланированных задач)
     */
    gpio.shutdown();

    System.out.println("Exiting MCP4725GpioExample");
  }
}

Проверяем код:

  1. создаём java файл и вставляем код:
    nano MCP4725SquareWave.java
  2. компилируем файл:
    javac -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SquareWave.java
  3. запускаем программу:
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SquareWave

Результат

Подключение ЦАП MCP4725 к Orange Pi - Генерация прямоугольной волны (Меандр, Pi4J)

Генерация синусоиды

Данный пример кода генерирует синусоиду, на выход модуля подключил DSO138. Для отправки данных использовалась функция setPercentValue().

import com.pi4j.gpio.extension.base.DacGpioProvider;
import com.pi4j.gpio.extension.mcp.MCP4725GpioProvider;
import com.pi4j.gpio.extension.mcp.MCP4725Pin;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinAnalogOutput;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.util.Console;

public class MCP4725SinusWave {

  public static void main(String args[]) throws Exception {
    System.out.println("<--Pi4J--> MCP4725 DAC Example ... started.");
    final Console console = new Console();
    console.promptForExit();
    /*
     * создаем gpio контроллер
     */
    final GpioController gpio = GpioFactory.getInstance();

    /*
     * создаем пользовательский provider GPIO MCP4725
     */
    final DacGpioProvider provider = new MCP4725GpioProvider(I2CBus.BUS_0, MCP4725GpioProvider.MCP4725_ADDRESS_1);

    /*
     * создаём аналоговый выходной пин от MCP4725
     */
    final GpioPinAnalogOutput pinAnalogOutput = gpio.provisionAnalogOutputPin(provider, MCP4725Pin.OUTPUT);

    /*
     * устанавливаем начальное значение (значение запуска) для выходного вывода
     */
    pinAnalogOutput.setValue(0);

    /*
     * устанавливаем значение выключения для выходного вывода
     */
    provider.setShutdownValue(MCP4725GpioProvider.MIN_VALUE, pinAnalogOutput);

    new Thread() {
      @Override
      public void run() {
        /*
         * генерируем синусоиду на выходе
         */
        for (int i = 0; i < 360 && console.isRunning(); i++) {
          double y = Math.sin(Math.toRadians(i));
          y = (y / 2 + 0.5) * 100;

          /*
           * задаём процентное значение вместо необработанного значения (мы
           * должны использовать вспомогательный метод внутри поставщика, а не
           * непосредственно на экземпляре вывода)
           */
          provider.setPercentValue(pinAnalogOutput, y);

          /*
           * повторяем
           */
          if (i == 359) {
            i = 0;
          }
        }
      }
    }.start();

    console.waitForExit();

    /*
     * останавливаем все действия / потоки GPIO, отключая контроллер GPIO (этот
     * метод принудительно завершает работу всех потоков мониторинга GPIO и
     * запланированных задач)
     */
    gpio.shutdown();

    System.out.println("Exiting MCP4725GpioExample");
  }
}

Проверяем код:

  1. создаём java файл и вставляем код:
    nano MCP4725SinusWave.java
  2. компилируем файл:
    javac -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SinusWave.java
  3. запускаем программу:
    sudo java -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SinusWave

Результат

Подключение ЦАП MCP4725 к Orange Pi - Генерация синусоиды (Pi4J)

Материалы

Установка Pi4J на Raspberry Pi и Orange Pi, Banana Pi
The Pi4J Project
MCP4725 — Datasheet 22039d.pdf
MCP4725 — Цифро-аналоговый преобразователь (ЦАП)

Похожие записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *