Added C++ examples for IOExpander

pull/144/head
ZodiusInfuser 2021-05-13 14:35:11 +01:00 zatwierdzone przez Phil Howard
rodzic ef256e1173
commit 2f3c6fc878
9 zmienionych plików z 203 dodań i 35 usunięć

Wyświetl plik

@ -1,5 +1,6 @@
add_subdirectory(breakout_dotmatrix)
add_subdirectory(breakout_encoder)
add_subdirectory(breakout_ioexpander)
add_subdirectory(breakout_ltr559)
add_subdirectory(breakout_colourlcd160x80)
add_subdirectory(breakout_roundlcd)

Wyświetl plik

@ -1,12 +1,3 @@
set(OUTPUT_NAME ioexpander_demo)
add_executable(
${OUTPUT_NAME}
demo.cpp
)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_ioexpander)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})
add_subdirectory(adc)
add_subdirectory(button)
add_subdirectory(servo)

Wyświetl plik

@ -0,0 +1,16 @@
set(OUTPUT_NAME ioexpander_adc)
add_executable(
${OUTPUT_NAME}
adc.cpp
)
# enable usb output, disable uart output
pico_enable_stdio_usb(${OUTPUT_NAME} 1)
pico_enable_stdio_uart(${OUTPUT_NAME} 0)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_ioexpander)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})

Wyświetl plik

@ -0,0 +1,42 @@
#include "pico/stdlib.h"
#include <stdio.h>
#include "breakout_ioexpander.hpp"
using namespace pimoroni;
static const uint8_t IOE_ADC_PIN = 10;
BreakoutIOExpander ioe(0x18);
bool toggle = false;
int main() {
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
stdio_init_all();
if(ioe.init()) {
printf("IOExpander found...\n");
// ioe.set_adc_vref(5.0f); //Uncomment this if running the IOExpander off a 5V supply
ioe.set_mode(IOE_ADC_PIN, IOExpander::PIN_ADC);
while(true) {
gpio_put(PICO_DEFAULT_LED_PIN, toggle);
toggle = !toggle;
float voltage = ioe.input_as_voltage(IOE_ADC_PIN);
printf("Voltage: %f\n", voltage);
sleep_ms(20);
}
}
else {
printf("IOExpander not found :'(\n");
gpio_put(PICO_DEFAULT_LED_PIN, true);
}
return 0;
}

Wyświetl plik

@ -0,0 +1,16 @@
set(OUTPUT_NAME ioexpander_button)
add_executable(
${OUTPUT_NAME}
button.cpp
)
# enable usb output, disable uart output
pico_enable_stdio_usb(${OUTPUT_NAME} 1)
pico_enable_stdio_uart(${OUTPUT_NAME} 0)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_ioexpander)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})

Wyświetl plik

@ -0,0 +1,49 @@
#include "pico/stdlib.h"
#include <stdio.h>
#include "breakout_ioexpander.hpp"
using namespace pimoroni;
//Connect a button between this pin and ground
static const uint8_t IOE_BUTTON_PIN = 14;
BreakoutIOExpander ioe(0x18);
bool last_state = true;
int main() {
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
stdio_init_all();
if(ioe.init()) {
printf("IOExpander found...\n");
ioe.set_mode(IOE_BUTTON_PIN, IOExpander::PIN_IN_PULL_UP);
while(true) {
bool state = ioe.input(IOE_BUTTON_PIN);
if(state != last_state) {
if(state) {
printf("Button has been released\n");
gpio_put(PICO_DEFAULT_LED_PIN, false);
}
else {
printf("Button has been pressed\n");
gpio_put(PICO_DEFAULT_LED_PIN, true);
}
last_state = state;
}
sleep_ms(20);
}
}
else {
printf("IOExpander not found :'(\n");
gpio_put(PICO_DEFAULT_LED_PIN, true);
}
return 0;
}

Wyświetl plik

@ -1,23 +0,0 @@
#include "pico/stdlib.h"
#include "breakout_ioexpander.hpp"
using namespace pimoroni;
BreakoutIOExpander ioe;
int main() {
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
ioe.init();
while(true) {
gpio_put(PICO_DEFAULT_LED_PIN, true);
sleep_ms(1000);
gpio_put(PICO_DEFAULT_LED_PIN, false);
sleep_ms(1000);
}
return 0;
}

Wyświetl plik

@ -0,0 +1,16 @@
set(OUTPUT_NAME ioexpander_servo)
add_executable(
${OUTPUT_NAME}
servo.cpp
)
# enable usb output, disable uart output
pico_enable_stdio_usb(${OUTPUT_NAME} 1)
pico_enable_stdio_uart(${OUTPUT_NAME} 0)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_ioexpander)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})

Wyświetl plik

@ -0,0 +1,60 @@
#include "pico/stdlib.h"
#include <stdio.h>
#include <math.h>
#include "breakout_ioexpander.hpp"
using namespace pimoroni;
static const uint8_t IOE_SERVO_PIN = 1;
// Settings to produce a 50Hz output from the 24MHz clock.
// 24,000,000 Hz / 8 = 3,000,000 Hz
// 3,000,000 Hz / 60,000 Period = 50 Hz
static const uint8_t DIVIDER = 8;
static const uint16_t PERIOD = 60000;
static constexpr float CYCLE_TIME = 5.0f;
static constexpr float SERVO_RANGE = 1000.0f; // Between 1000 and 2000us (1-2ms)
BreakoutIOExpander ioe(0x18);
bool toggle = false;
int main() {
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
stdio_init_all();
if(ioe.init()) {
printf("IOExpander found...\n");
ioe.set_pwm_period(PERIOD);
ioe.set_pwm_control(DIVIDER);
ioe.set_mode(IOE_SERVO_PIN, IOExpander::PIN_PWM);
while(true) {
gpio_put(PICO_DEFAULT_LED_PIN, toggle);
toggle = !toggle;
absolute_time_t at = get_absolute_time();
float t = to_us_since_boot(at) / 1000000.0f;
float s = sinf((t * M_PI * 2.0f) / CYCLE_TIME) / 2.0f;
float servo_us = 1500.0f + (s * SERVO_RANGE);
float duty_per_microsecond = (float)PERIOD / (float)(20 * 1000); // Default is 3 LSB per microsecond
uint16_t duty_cycle = (uint16_t)(roundf(servo_us * duty_per_microsecond));
printf("Cycle Time: %.2f, Pulse: %.1fus, Duty Cycle: %d\n", fmodf(t, CYCLE_TIME), servo_us, duty_cycle);
ioe.output(IOE_SERVO_PIN, duty_cycle);
sleep_ms(20);
}
}
else {
printf("IOExpander not found :'(\n");
gpio_put(PICO_DEFAULT_LED_PIN, true);
}
return 0;
}