ЦАП 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 самостоятельно сохранять значения данных и восстанавливать их при включении питания.
- 1 Класс DacGpioProviderBase
- 1.1 DacGpioProviderBase(Pin[])
- 1.2 setPercentValue(Pin, Number)
- 1.3 setPercentValue(GpioPinAnalogOutput, Number)
- 1.4 setValue(Pin, Number)
- 1.5 shutdown()
- 1.6 setShutdownValue(Number, Pin … )
- 1.7 getShutdownValue(Pin)
- 1.8 setShutdownValue(Number, GpioPinAnalogOutput …)
- 1.9 getShutdownValue(GpioPinAnalogOutput)
- 2 Класс MCP4725GpioProvider
- 3 Класс MCP4725Pin
- 4 Схема подключения ЦАП MCP4725 к Orange Pi
- 5 Примеры программ с ЦАП MCP4725 на Pi4J
- 6 Материалы
- 7 Похожие записи
Класс DacGpioProviderBase
Этот базовый поставщик GPIO определяет требуемые интерфейсы и реализует базовую функциональность для микросхем расширения ЦАП (цифро-аналоговых) как родные выводы Pi4J GPIO.
DacGpioProviderBase(Pin[])
Конструктор по умолчанию.
1 |
public DacGpioProviderBase(Pin[] pins) |
Параметры
pins — совокупность всех выводов GPIO, используемых с реализацией этого поставщика ЦАП.
Возвращает
новый экземпляр DacGpioProviderBase
setPercentValue(Pin, Number)
Устанавливает текущее значение в процентах от доступного диапазона вместо необработанного значения.
1 |
public void setPercentValue(Pin pin, Number percent) |
Параметры
pin — вывод GPIO.
percent — процентное значение от 0 до 100.
setPercentValue(GpioPinAnalogOutput, Number)
Устанавливает текущее аналоговое значение в процентах от доступного диапазона вместо необработанного значения (масштабированное число в диапазоне значений АЦП).
1 |
public void setPercentValue(GpioPinAnalogOutput pin, Number percent) |
Параметры
pin — вывод GPIO.
percent — процентное значение от 0 до 100.
setValue(Pin, Number)
Устанавливает аналоговое выходное значение (необработанное значение) на выходной контакт ЦАП.
1 |
public void setValue(Pin pin, Number value) |
Параметры
pin — номер пина ЦАП.
value — необработанное значение для отправки на ЦАП.
shutdown()
Этот метод используется платформой для отключения экземпляра ЦАП. Этот метод также закроет шину I2C для подключенного ЦАП.
1 |
public void shutdown() |
setShutdownValue(Number, Pin … )
Устанавливает значение отключения, которое ЦАП должен применять к данному выводу GPIO, когда экземпляр класса уничтожается.
1 |
public void setShutdownValue(Number value, Pin ... pin) |
Параметры
value — значение отключения, применяемое к данному выводу (-ам).
pin — вывод аналогового выхода (один или несколько выводов).
getShutdownValue(Pin)
Возвращает значение отключения, которое ЦАП должен применять к указанному выводу GPIO при уничтожении класса.
1 |
public Number getShutdownValue(Pin pin) |
Параметры
pin — аналоговый выход.
Возвращает
значение отключения, применяемое к данному выводу.
setShutdownValue(Number, GpioPinAnalogOutput …)
Устанавливает значение отключения, которое ЦАП должен применять к данному выводу GPIO, когда экземпляр класса уничтожается.
1 |
public void setShutdownValue(Number value, GpioPinAnalogOutput ... pin) |
Параметры
value — значение отключения, применяемое к данному выводу (-ам).
pin — вывод аналогового выхода (один или несколько выводов).
getShutdownValue(GpioPinAnalogOutput)
Возвращает значение отключения, которое ЦАП должен применять к указанному выводу GPIO при уничтожении класса.
1 |
public Number getShutdownValue(GpioPinAnalogOutput pin) |
Параметры
pin — аналоговый выход.
Возвращает
значение отключения, применяемое к данному выводу.
Класс MCP4725GpioProvider
Этот GPIO провайдер расширяет абстрактный класс DacGpioProviderBase и реализует интерфейс DacGpioProvider, для работы с пином MCP4725, как с родным пином Pi4J.
MCP4725GpioProvider(int, int)
Это конструктор по умолчанию.
1 |
public MCP4725GpioProvider(int busNumber, int address) throws UnsupportedBusNumberException, IOException |
Параметры
busNumber — номер шины.
address — I2C адрес устройства.
Возвращает
новый экземпляр MCP4725GpioProvider
Бросает
UnsupportedBusNumberException — если данный номер шины не поддерживается базовой системой.
IOException — если сообщение с шиной I2C не работает.
MCP4725GpioProvider(I2CBus, int)
Это альтернативный конструктор, который можно использовать для создания экземпляра MCP4725.
1 |
public MCP4725GpioProvider(I2CBus bus, int address) throws IOException |
Параметры
busNumber — I2C шина.
address — I2C адрес устройства.
Возвращает
новый экземпляр MCP4725GpioProvider
Бросает
IOException — если сообщение с шиной I2C не работает.
setValue(Pin, double)
Устанавливает аналоговое выходное значение на выходной контакт на ЦАП.
1 |
public void setValue(Pin pin, double value) |
Параметры
pin — номер пина ЦАП.
value — необработанное значение для отправки на ЦАП. (Между: 0..4095).
getName()
Получает имя экземпляра поставщика ЦАП.
1 |
public String getName() |
Возвращает
имя экземпляра поставщика ЦАП.
shutdown()
Этот метод используется платформой для отключения экземпляра ЦАП MCP4725. Этот метод также закроет шину I2C для подключенного MCP4725.
1 |
public void shutdown() |
getMinSupportedValue()
Возвращает минимальное поддерживаемое аналоговое значение ЦАП.
1 |
public double getMinSupportedValue() |
Возвращает
минимальное поддерживаемое аналоговое значение.
getMaxSupportedValue()
Возвращает максимальное поддерживаемое аналоговое значение для реализации ЦАП. (Например, максимальное значение 10-разрядного АЦП составляет 1023, а максимальное значение 12-разрядного АЦП — 4095.
1 |
public double getMaxSupportedValue() |
Возвращает
максимальное поддерживаемое аналоговое значение.
Класс MCP4725Pin
Этот провайдер GPIO реализует 12-разрядный цифро-аналоговый преобразователь MCP4725 в качестве собственных выводов GPIO Pi4J. MCP4725 подключен через I2C к Raspberry Pi и имеет 1 аналоговый выход GPIO.
createAnalogOutputPin(int, String)
Создаёт и возвращает новый экземпляр класса PinImpl
, для работы с аналоговым выводом MCP4725.
1 |
private static Pin createAnalogOutputPin(int address, String name) |
Параметры
address — номер вывода.
name — имя пина.
Возвращает
новый экземпляр класса PinImpl
.
Схема подключения ЦАП MCP4725 к Orange Pi
MCP4725 можно подключить на любой доступный I2C порт.
Примеры программ с ЦАП MCP4725 на Pi4J
Генерация прямоугольной волны/Меандр
Приведённая ниже программа генерирует прямоугольную волну (Меандр), а для проверки использовал цифровой осциллограф DSO138. Для отправки данных на чип использовалась функция setValue()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
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"); } } |
Проверяем код:
- создаём java файл и вставляем код:
1nano MCP4725SquareWave.java - компилируем файл:
1javac -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SquareWave.java - запускаем программу:
1sudo java -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SquareWave
Результат
Генерация синусоиды
Данный пример кода генерирует синусоиду, на выход модуля подключил DSO138. Для отправки данных использовалась функция setPercentValue()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
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"); } } |
Проверяем код:
- создаём java файл и вставляем код:
1nano MCP4725SinusWave.java - компилируем файл:
1javac -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SinusWave.java - запускаем программу:
1sudo java -classpath .:classes:/opt/pi4j/lib/'*' MCP4725SinusWave
Результат
Материалы
Установка Pi4J на Raspberry Pi и Orange Pi, Banana Pi
The Pi4J Project
MCP4725 — Datasheet 22039d.pdf
MCP4725 — Цифро-аналоговый преобразователь (ЦАП)